Бросок кубика Телеграм php

Бот надо делать многопоточным, по умолчанию это не так – запросы разных пользователей в одной очереди и один сложный запрос может всю очередь на минуту затормозить. Для фикса заворачиваем обработку в Thread. Чтобы не путаться с конструкциями типа “.message.message”, message выше заменено на rqst (в telegram есть тип сообщения message).

Telegram::Bot::Client.run(token) do |bot| bot.listen do |rqst| Thread.start(rqst) do |rqst| end end end

RESCUE

Необходимо завернуть основной код бота в конструкцию loop-do и begin-rescue. Пример уже с многопоточностью.

loop do begin Telegram::Bot::Client.run(token) do |bot| bot.listen do |rqst| Thread.start(rqst) do |rqst| begin rescue end end end end rescue end end

Это самое важное. Без него бот будет падать как из-за ошибок при обработке ваших запросов (в том числе это может быть и нормой – например при работе с callback или message edit, об этом ниже), так и из-за работ на платформе telegram, которые проводятся регулярно.

CALLBACK 2017-10-02 11:01:45 +0300;out: Telegram API has returned the error. (ok: false, error_code: 400, description: Bad Request: QUERY_ID_INVALID);mess: /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/api.rb:74:in call /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/api.rb:58:in method_missing /home/redkin_p/bin/telegram_bot.rb:72:in block (4 levels) in API 2017-10-02 06:39:23 +0300;out: Telegram API has returned the error. (error_code: 502, uri: https://api.telegram.org/botxxxxxxx/getUpdates);mess: /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/api.rb:74:in call /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/api.rb:58:in method_missing /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/client.rb:30:in fetch_updates /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/client.rb:25:in listen /home/redkin_p/bin/telegram_bot.rb:16:in block (2 levels) in /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/client.rb:18:in run /var/lib/gems/1.9.1/gems/telegram-bot-ruby-0.8.3/lib/telegram/bot/client.rb:8:in run /home/redkin_p/bin/telegram_bot.rb:14:in block in /home/redkin_p/bin/telegram_bot.rb:12:in loop /home/redkin_p/bin/telegram_bot.rb:12:in ;

Отправка файлов

Отсылка файла требует id пользователя и file_id сообщения, остальные параметры опциональные.

Как кинуть кубик в Телеграме? Как бросать кубик в Telegram?

Простой пример – отсылаем на основе запросов в inline keyboard файлы.

Запрос phone_number

Авторизация по номеру очень клевая штука. Тут есть особенность – нужно проверять чтобы ID пользователя совпадал с ID контакта, потому что свой номер передается как контакт и легко передать контакт “левого”, авторизованного, человека.

Для начала запрашиваем контакт (например, если чела с таким ID telegram еще нет в нашей телеграм-базе) через кастом-клавиатуру с одной кнопкой (https://github.com/atipugin/telegram-bot-ruby#Usage раздел Custom keyboards):

kb = Telegram::Bot::Types::KeyboardButton.new(text: ‘Отправить номер’, request_contact: true) markup = Telegram::Bot::Types::ReplyKeyboardMarkup.new(keyboard: kb) bot.api.send_message(chat_id: rqst.chat.id, text: ‘Для работы с ботом вам нужно пройти идентификацию посредством отправки вашего номера телефона.’, reply_markup: markup)

Далее при приеме контакта (например, через проверку rqst.contact != nil) проверяем что пользователь отправивший контакт имеет такой же ID как указанный в полученном контакте, если это не так – ругаемся.

bot.api.send_message(chat_id: rqst.chat.id, text: ‘Нет, так не получится.’) if rqst.from.id != rqst.contact.user_id

Потом проверяем уже наличие номера в своих системах. Если есть – добавляем чела с таким ID telegram в нашу телеграм-базу. Если нет – просим не беспокоить. В любом случае удаляем кастом клавиатуру с запросом номера.

number = rqst.contact.phone_number.sub(/+/,»») check = check_number(number) if check == «ok» add_to_telega(number,rqst.contact.user_id) text = «Спасибо, идентификация пройдена.» else text = «Вас нет в базе данных.» end kb = Telegram::Bot::Types::ReplyKeyboardRemove.new(remove_keyboard: true) bot.api.send_message(chat_id: rqst.chat.id, text: «#», reply_markup: kb)

Inline keyboards

Пример простого статического InlineKeyBoard.

kb = [ Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘some-text-test1’, callback_data: «test1»), Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘some-text-test2’, callback_data: «test2»), Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘some-text-test3’, callback_data: «test3») ] markup_retry = Telegram::Bot::Types::InlineKeyboardMarkup.new(inline_keyboard: kb)

Пример статического InlineKB с кнопками на разных рядах.

kb = [ [ Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘Text1’, callback_data: «1»), Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘Text2’, callback_data: «2»), ], [ Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘Text3’, callback_data: «3»), Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘Text4’, callback_data: «4»), ], Telegram::Bot::Types::InlineKeyboardButton.new(text: ‘Text5’, callback_data: «5») ] markup_retry = Telegram::Bot::Types::InlineKeyboardMarkup.new(inline_keyboard: kb)

Далее отсылаем ответ с созданной клавой.

bot.api.send_message(chat_id: user_id, text: «#», reply_markup: markup_retry) bot.api.answer_callback_query(callback_query_id: rqst.id)

Inline keyboards on-the-fly

Очень крутая штука, с помощью нее можно создавать многоуровневые меню, я так сделал трехуровневое меню с кнопками туда-сюда. Очень удобно.

Inline keyboards and on-the-fly updating There are times when you’d prefer to do things without sending any messages to the chat. For example, when your user is changing settings or flipping through search results. In such cases you can use Inline Keyboards that are integrated directly into the messages they belong to. Unlike with custom reply keyboards, pressing buttons on inline keyboards doesn’t result in messages sent to the chat. Instead, inline keyboards support buttons that work behind the scenes: callback buttons, URL buttons and switch to inline buttons.

В интернете кто-то почему то думает, что чтобы поменять свое сообщение нужно сохранить результат операции отправки (в виде ID) в файле. По факту это не нужно. При получении CallBackQuery можно извлечь ID и даже текст сообщения, на которое пришел ответ.

last_bot_message_id_to_user = rqst.message.message_id last_bot_message_text_to_user = rqst.message.text

В целом для ответа нужен только id и новая клавиатура. Если клавиатура будет такая же как раньше – telegram ругнется (тут нам поможет exception выше) и менять ничего не будет.

Еще по теме:  Как управлять ботом в Телеграмме с телефона

bot.api.editMessageReplyMarkup(chat_id: rqst.from.id, message_id: last_bot_message_id_to_user, reply_markup: markup_retry)

Emoji

Отсылаются просто по unicode коду внутри сообщения. Unicode можно взять отсюда. Буква u обязательно должна быть маленькая. Например, используем в инлайн-кнопках.

hammer = «u» Telegram::Bot::Types::InlineKeyboardButton.new(text: «# Сделать то-то», callback_data: «test_operations»)

Разметка

Отправка форматированных сообщений. Можно размечать через Markdown, можно через HTML. HTML базовый, без каких либо таблиц и прочего. В одном сообщении не должно быть больше 100 URL ссылок (последующие обрезаются) вне зависимости от типа форматирования.

bot.api.send_message(chat_id: «#», text: «[test](https://t.me/TESTBot?start=command-TEST)», parse_mode: «Markdown») bot.api.send_message(chat_id: «#», text: «inline URL», parse_mode: «HTML»)

Markdown симпатичнее HTML, но на практике очень капризный – из-за него могут сыпаться ошибки и не доставляться сообщения пользователю если markdown увидит в сообщении спец. символы типа _, причем даже не в самой ссылке, что можно было бы “понять и простить”, а дальше в тексте.

bot.api.send_message(chat_id: «#», text: «[Test](https://t.me/TestBot?start) My_Test», parse_mode: «Markdown») Telegram API has returned the error. (ok: «false», error_code: «400», description: «Bad Request: can’t parse entities: Can’t find end of the entity starting at byte offset 37») (Telegram::Bot::Exceptions::ResponseError)
Редирект на свой же бот, для исполнения команды можно сделать двумя способами:
1) Используя встроенные команды, поставив перед числом или неразрывной латиницей знак

2) Используя Deep Linking (1,2,3). Единственный найденный способ для редиректа IP. Недостаток – пользователю придется нажать кнопку Start (не во всех реализациях клиента), даже если он уже общался с ботом и запрос от пользователя в чате для самого пользователя будет выглядеть как /start, хотя по факту за ним будут скрываться какие-то данные. В случае не первого общения с ботом выглядит немного странно, но работает. В целом, Deep Linking нужен именно для старта общения – авторизации, связи между ботом и другими системами, реферальных ссылок и прочего через передачу ID при старте общения с ботом.

bot.api.send_message(chat_id: «#», text: «[test](https://t.me/TESTBot?start=command-TEST)», parse_mode: «Markdown»)

УВЕДОМЛЕНИЯ

По умолчанию бот отправляет сообщения только в ответ на сообщение пользователя. Чтобы отправлять уведомления нужно вместо Listen использовать New. Можно отправлять в ответ и отправлять уведомления одновременно.

# initialize bot client and store it in constant # that can be done in any file which is loaded at your application’s boot process BOT = Telegram::Bot::Client.new(TOKEN) # anywhere in another file BOT.send_message(chat_id: id, text: «hello world»)

КОМАНДЫ

Как установить команды которые видит клиент в боте:

  1. Открыть чат с BotFather
  2. Отправить ему команду /setcommands
  3. Выбрать бота для установки
  4. Составить лист команд
    /help Помощь
    /settings Настройки
  5. enjoy

РАБОТА ЧЕРЕЗ PROXY

Gem использует Faraday для подключения. В Faraday встроена возможность работать через HTTP proxy – он читает глобальные переменные http_proxy, ftp_proxy и берет из них адреса серверов. Можно так же задать напрямую в коде.

Faraday will try to automatically infer the proxy settings from your system using URI#find_proxy. This will retrieve them from environment variables such as http_proxy, ftp_proxy, no_proxy, etc. If for any reason you want to disable this behaviour, you can do so by setting the global varibale ignore_env_proxy: Faraday.ignore_env_proxy = true You can also specify a custom proxy when initializing the connection Faraday.new(‘http://www.example.com’, :proxy => ‘http://proxy.com’)
export http_proxy=http://your.proxy.server:port/ # включаем unset http_proxy # отключаем
Posted on December 31, 2017 October 17, 2021 Author weril Categories Ruby, bot, Bots

Leave a Reply Cancel reply

You must be logged in to post a comment.

Источник: weril.me

Телеграм-бот криптовалютного кошелька на основе php-telegram-bot

Телеграм-бот криптовалютного кошелька на основе php-telegram-bot

В интернет-коммерции сейчас активно развивается автоматизация мессенджеров. Полезные боты растут, как грибы после дождя. Тут вам и магазины, и онлайн-помощники, инструменты для аналитики, и прочие важные и полезные решения. Современный бот в телеграмме может полноценно заменить целый сайт и вывести бизнес на новый уровень. Даже криптовалютный кошелек можно создать с помощью бота. Этим и займемся.

Для быстрого создания сервиса будем использовать PHP, возьмем одну из библиотек с core.telegram.org (https://core.telegram.org/bots/samples) php-telegram-bot (https://github.com/php-telegram-bot/core/). Эта библиотека часто обновляется и подходит для дальнейшего масштабирования бота.

В свободном доступе есть несколько API-сервисов для работы с криптовалютами:

Во всех перечисленных сервисах нет проверки KYC и свободная регистрация. Blockchain.info требует получение токена для работы, он условно без проверки, но его получение может занять несколько дней или даже недель.

Выбор пал на сервис Apirone, потому что тут нет ограничений на создание кошельков и адресов.

Итак, наш бот будет уметь:

  • создавать криптовалютный кошелек в нужной валюте,
  • получать баланс,
  • генерировать криптовалютный адрес,
  • обрабатывать обратную связь (колбэк) от криптовалютного процессинга,
  • делать перевод имеющихся средств.

Вся обработка колбэков от телеграма уже реализована в php-telegram-bot .

Еще по теме:  Классные Телеграмм каналы для девушек пресс

< «require»: < «longman/telegram-bot»: «^0.74.0», «monolog/monolog»: «^2.2» >, «autoload»: < «classmap»: [«Classes»] >>

Запускаем composer update для создания базовой структуры. Создаем ее и добавляем туда папку Apirone и в нее файл ApironeWallet.php, в котором реализуем класс взаимодействия с криптопроцессингом.

В нем реализованы следующие функции:

getWallets($user_id, $currencyId = null) //получить кошельки для telegram Пользователя addWallet($user_id, $wallet, $address) //add generated wallet into DB postWallet($user_id, $currency) //get wallet from Apirone createWallets($user_id) //create all available wallets getCurrencyId($currency,$units = null) //get currency id from DB getAddress($chat_id, $user_id, $currency) //outputs wallet from DB getAvailableCurrencies() //collect available currencies from DB getCurrencyById($id, $units = null) // return currency by Id getBalance($chat_id, $user_id, $wallet_id = null) // get wallet or wallets balance checkAddress($currency, $address) // validate crypto address estimate($user_id, $currencyName, $address, $amount) // pre-calculation of crypto transaction transfer($user_id, $currencyName, $address, $amount) // transfer funds explorerUrl($currency, $tx) // get explorer link

Подробно работу этих функций смотрим в примере. Создадим MySQL базу данных, она будет нужна для работы интерактивных диалогов. В нее требуется добавить три таблицы: apirone_currencies, apirone_transactions и apirone_users.

С телеграмом будем общаться с помощью вебхуков (Webhook). Для этого set.php и unset.php — включение и отключение колбэков. hook.php принимает сами колбэки из телеграма:

$telegram->handle();

Установка и удаление вебхука выполняются в две функции:

$result = $telegram->setWebhook($config[‘webhook’][‘url’]); $result = $telegram->deleteWebhook();

В корне проекта нужна папка Commands, в нее запишем наши кастомные команды и изменим существующие. Из изменений в базовых классах нас интересует взаимодействие с меню не только через команды, начинающихся со слэша, но и просто текстовые команды. Для этого в папке Commands добавляем папку ServiceMessages и в ней создаем GenericmessageCommand.php , в который путем перечисления вносим нужные команды и реакции на них:

// Fetch conversation command if it exists and execute it. if ($conversation->exists() $command = $conversation->getCommand()) < return $this->telegram->executeCommand($command); > if($type === «text») < $text = $message->getText(true); if (stripos($text, ‘Receive’) === 0) < return $this->telegram->executeCommand(‘receive’); > if (stripos($text, ‘Menu’) === 0) < return $this->telegram->executeCommand(‘menu’); > if (stripos($text, ‘Balance’) === 0) < return $this->telegram->executeCommand(‘balance’); > if (stripos($text, ‘Send’) === 0) < return $this->telegram->executeCommand(‘send’); > return $this->replyToChat( ‘Command not found’ ); >

Также добавляем наши четыре кастомные команды BalanceCommand.php , MenuCommand.php , ReceiveCommand.php и SendCommand.php.

Каждой команде делаем описание, использование по умолчанию, присваиваем версию.

protected $name = ‘balance’; protected $description = ‘Show balance of wallet’; protected $usage = ‘/balance’; protected $version = ‘1.2.0’;

Сам код команды закладывается в функцию execute(). В ней происходит выполнение операций. Например, вот команда, которая смотрит баланс

$message = $this->getMessage(); $text = $message->getText(true); $chat = $message->getChat(); $user = $message->getFrom(); $chat_id = $chat->getId(); $user_id = $user->getId(); $sql = ‘ SELECT * FROM `apirone_currencies` ‘; $pdo = DB::getPdo(); $sth = $pdo->prepare($sql); $sth->execute(); $result = $sth->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $currency) < if (stripos($text, $currency[‘name’]) === 8) < $response = new ApironeWallet; $response->getAddress($chat_id,$user_id,$currency[‘name’]); return Request::emptyResponse(); > > if ($text === ‘Balance’ || $text ===») < $response = new ApironeWallet; $response->getBalance($chat_id, $user_id); > return Request::emptyResponse();

SendCommand.php будет интерактивным. В нем бот спросит криптовалюту, адрес для перевода средств и сумму платежа.

$this->conversation = new Conversation($user_id, $chat_id, $this->getName()); // Load any existing notes from this conversation $notes = conversation->notes; … // Every time a step is achieved the state is updated if($text === ‘Cancel’) < $state = 4; $notes[‘answer’] = ‘Cancel’; >if($text === ‘Send’) < $text = »; >switch ($state) < case 0: $currencies = $apirone->getAvailableCurrencies(); if ($text === » || !in_array(strtoupper($text), $currencies, true)) < . $data[‘reply_markup’] = (new Keyboard( [$currencies[0],$currencies[1]], [$currencies[2],$currencies[3],$currencies[4]], [‘Cancel’])) ->setResizeKeyboard(true) ->setOneTimeKeyboard(true) ->setSelective(true); $result = Request::sendMessage($data); break; > $notes[‘currency’] = strtolower($text); $text = »; case 1: if ($text === »|| !$apirone->checkAddress($notes[‘currency’], $text)) < $notes[‘state’] = 1; $this->conversation->update(); $data[‘text’] = ‘Type address for transfer:’; if ($text !== ») < . break; >$notes[‘address’] = $text; $text = »; // No break! case 2: … case 3: if ($text === » || !in_array($text, [‘Ok’, ‘Cancel’], true)) < $notes[‘state’] = 3; $this->conversation->update(); $currency = $apirone->getCurrencyId($notes[‘currency’], true); $estimate = $apirone->estimate($user_id, $notes[‘currency’], $notes[‘address’], $notes[‘amount’]); if(isset($estimate[‘message’])) < $data[‘text’] = ‘Message from Apirone:’. PHP_EOL. ‘*’.$estimate[‘message’].’*’ .PHP_EOL. ‘Operation cancelled.’; $data[‘parse_mode’] = ‘markdown’; $data[‘reply_markup’] = (new Keyboard([‘Receive’, ‘Send’], [‘Balance’])) ->setResizeKeyboard(true) ->setOneTimeKeyboard(true) ->setSelective(true); $this->conversation->stop(); > else < $data[‘reply_markup’] = (new Keyboard([‘Ok’, ‘Cancel’])) ->setResizeKeyboard(true) ->setOneTimeKeyboard(true) ->setSelective(true); $data[‘text’] = ‘Please double check that all data correct. Send «Ok» message in answer. If you want to stop sending type «Cancel»‘. PHP_EOL; . if ($text !== ») < $data[‘text’] = ‘Simply type Ok or Cancel.’; >> $result = Request::sendMessage($data); break; > $notes[‘answer’] = $text; // No break! case 4: $this->conversation->update(); unset($notes[‘state’]); if($notes[‘answer’] === ‘Ok’) < $transfer = $apirone->transfer($user_id, $notes[‘currency’], $notes[‘address’], $notes[‘amount’]); if(isset($transfer[‘message’])) < $data[‘text’] = ‘Message from Apirone:’. PHP_EOL. ‘*’.$transfer[‘message’].’*’ .PHP_EOL. ‘Operation cancelled.’; . $this->conversation->stop(); > else < $data[‘text’] = ‘Transfer successfully complete.’.PHP_EOL. ‘Transactions:’. PHP_EOL ; foreach ($transfer[‘txs’] as $tx) < $data[‘text’].= $tx .PHP_EOL. $apirone->explorerUrl($notes[‘currency’], $tx).PHP_EOL; >; > > . $result = Request::sendMessage($data); $this->conversation->stop(); break; > return $result;

Еще по теме:  Как открыть еще один аккаунт в Телеграмме

Создаем StartCommand.php И в нем при первом обращении генерируем данные для нашей базы данных

$message = $this->getMessage(); $user_id = $message->getFrom()->getId(); $apirone = new ApironeWallet; $apirone->createWallets($user_id); return $this->replyToChat( ‘Welcome to Apirone wallet bot! You are ready to use BTC,BCH,DOGE and LTC wallets right now’ . PHP_EOL . ‘Type /menu to start using it now!’ );

В корне проекта создаем callback.php . Здесь будет приниматься колбэк от процессинга:

require_once __DIR__ . ‘/vendor/autoload.php’; use LongmanTelegramBotRequest; use ClassesApironeApironeWallet; $config = require __DIR__ . ‘/config.php’; $telegram = new LongmanTelegramBotTelegram($config[‘api_key’], $config[‘bot_username’]); $apirone = new ApironeWallet; $telegram->enableMySql($config[‘mysql’]);; $apironeData = file_get_contents(‘php://input’); if ($apironeData) < $params = json_decode($apironeData, true); // check your secret code if ($params[«data»][«secret»] !== $config[‘apirone_secret’]) die(); $user_id = $params[«data»][«user_id»]; $input_address = $params[«input_address»]; $input_transaction_hash = $params[«input_transaction_hash»]; $value_in_satoshi = $params[«value»]; $wallets = $apirone->getWallets($user_id); foreach ($wallets as $wallet) < if($wallet[‘wallet_id’] === $params[‘wallet’]) < $currency = $apirone->getCurrencyById($wallet[‘currency’], true); > > //Save unconfirmed transactions and data to your Database. $data[‘chat_id’] = $user_id; $data[‘parse_mode’] = ‘markdown’; if ($params[«confirmations»] < 2 ) < $data[‘text’] = ‘*’.strtoupper($currency[‘name’]) .’ wallet*: ‘. PHP_EOL . «Transaction «. $input_transaction_hash . PHP_EOL. ‘Waiting *’. number_format($value_in_satoshi/pow(10, $currency[‘units-factor’]), 8, ‘.’, »). strtoupper($currency[‘name’]) .’*’. PHP_EOL . $params[«confirmations»].’ of 2 confirmations received’. PHP_EOL . $apirone->explorerUrl($currency[‘name’], $input_transaction_hash); > if ($params[«confirmations»] >= 2) < $balance = $apirone->getBalance($user_id, $user_id, $params[‘wallet’]); $data[‘text’] = ‘*’.strtoupper($currency[‘name’]) .’ wallet*: ‘. PHP_EOL . «Transaction «. $input_transaction_hash . PHP_EOL. ‘Payment successfully received!’. PHP_EOL .’Amount: *’. number_format($value_in_satoshi/pow(10, $currency[‘units-factor’]), 8, ‘.’, »). strtoupper($currency[‘name’]) .’*’. PHP_EOL. ‘Current balance:’. PHP_EOL . $balance . PHP_EOL. $apirone->explorerUrl($currency[‘name’], $input_transaction_hash); echo «*ok*»; > return Request::sendMessage($data);

В итоговом результате имеем простого бота, который в дальнейшем можно будет трансформировать и дорабатывать, т.к. заложена серьезная база в виде php-telegram-bot.

При написании бота было изучено достаточно источников. И как оказалось, готовых примеров реализаций ботов на просторах интернета очень мало. Данный бот будет полезен тем, кто хочет дорабатывать свои сервисы для приема криптовалюты или хочет получить свой собственный криптовалютный кошелек в телеграме.

Источник: unetway.com

Клавиатура для бота телеграм

Я уже писал о том, как сделать бота для телеграм на PHP и Java. При этом наш бот может как сам отправлять сообщения, так и реагировать на команды. В последнем случае команды – это просто текстовые сообщения, что не всегда удобно. Гораздо чаще удобнее просто ткнуть кнопку с командой (или для перехода в меню). Сделать эти кнопки несложно.

Итак, подразумевается, что вы уже ознакомились с данной заметкой и создали своего первого (ну или не первого) бота для телеграм на PHP. Теперь требуется сделать этого бота более комфортным для работы/общения – с помощью клавиатуры.

  • InlineKeyboardMarkup
  • ReplyKeyboardMarkup
  • ReplyKeyboardRemove
  • ForceReply

Начнем с инлайновой клавиатуры. А вообще нет, лучше начнем с создания метода, который будет отправлять сообщения. Причем как обычные, так и содержащие эту самую инлайновую клавиатуру. Вот она

function sendMessage($tg_chat_id, $message, $keyboard = «») < global $token; $response = array( ‘chat_id’ =>$tg_chat_id, ‘text’ => $message, ‘parse_mode’ => «HTML» ); if ($keyboard) < $arr = array(‘reply_markup’ =>json_encode($keyboard, TRUE)); $response = array_merge($response, $arr); > $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/sendMessage’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $response); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch); >

На вход принимаем чат ид, сообщение и клавиатуру (последний параметр необязателен). В самом методе создаем массив из значений, если есть, то суем туда и клавиатуру, предварительно переведенную в формат json.

А теперь само создание клавиатуры с кнопками «да» и «нет»:

$button_yes = array(‘text’ => ‘Да’, ‘callback_data’ => ‘/yes’); $button_no = array(‘text’ => ‘Нет’, ‘callback_data’ => ‘/no’); $keyboard = array(‘inline_keyboard’ => array(array($button_yes, $button_no))); sendMessage($chat_id, «Вы любите пиццу?», $keyboard);

Тут все просто: создаем кнопки, создаем из них клавиатуру и отправляем вместе с вопросом. Вы спросите, а что за ссылки «/yes» «/no»? А это так называемые колбэки – в данном случае под этим термином подразумеваются те данные, которые отправляются обратно при нажатии соответствующей кнопки. Их надо отлавливать и обрабатывать. Например, так

$postData = file_get_contents(‘php://input’); $data = json_decode($postData, true); $inline_id = $data[«callback_query»][«message»][«chat»][«id»]; $callback = $data[«callback_query»][«data»];

Ну и дальше уже идет ветвление в зависимости от того, какой колбэк вы получили. Вот так просто можно создать кнопки прямо в боте телеграм.

Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

заметки, php, telegram

Источник: upread.ru

Рейтинг
( Пока оценок нет )
Загрузка ...