воскресенье, 15 марта 2020 г.

Бот телеграм для проверки баланса карты стрелка

Еще немного про ботов в телеграме. На самом деле это все тот же бот, который описывался тут, просто к нему добавляется новая функция - теперь бот еще и может присылать в сообщении число рублей, которые имеются на вашей транспортной карте Стрелка. Таким способом можно расширять функционал бота почти до бесконечности: поступающая команда распознается, и бот присылает нужную информацию в ответном сообщении. Подобным же образом я научил бота присылать актуальную информацию по числу зараженных коронавирусом.
Итак начинаем. Как уже говорилось  в предыдущей статье про ботов, все сообщения боту в телеграме отправлются json запросом в заданный вами php скрипт (задается вебхук через API telegram). Скрипт принимает всю строку, и находит в ней только то что ему нужно: это ID чата - для того чтобы знать куда отсылать ответное сообщение, и message - чтобы понять какая именно команда поступила:

$update = json_decode(file_get_contents("php://input"), TRUE); // в строку update помещается вся строка json
$chatId = $update["message"]["chat"]["id"]; // получаем ID чата 
$message = $update["message"]["text"]; // получаем сообщение

Чтобы понять какая команда пришла, я использовал конструкцию switch, где прописываются все возможные команды боту и то как он должен на них реагировать.
Чтобы понять что пришла команда на проверку баланса по карте Стрелка, бот должен увидеть слэш и 11 цифр после него - это номер карты, например /01234567891
preg_match( '/\/[0-9]{11}/', $message, $numbtext
регулярное выражение находит только 11 цифр и записывает их в numbtext - даже если цифр в сообщении будет больше, скрипт выберет только 11 следущих за слешем
Номер карты нам нужен без слеша, поэтому уберем его:
$strelkanumb = preg_replace('/\//','',$numbtext[0]); //strelkanumb - это число без слеша, которое находилось в numbtext[0] 
Теперь делаем запрос баланса на сервер карты стрелки, куда передаем имеющийся номер карты в strelkanumb, а приходящий в ответ json прописываем balance_query
$balance_query = json_decode(file_get_contents("https://lk.strelkacard.ru/api/cards/status/?cardnum=".$strelkanumb."&cardtypeid=3ae427a1-0f17-4524-acb1-a3f50090a8f3"), TRUE);
Кстати, увидеть ответный json в удобном для восприятия виде можно введя ответ сервера на странице разбор JSON онлайн. Вводим это
{"cardactive":false,"balance":36792,"baserate":3546,"cardblocked":false,"numoftrips":0}
Получаем это
$array = array(
    'cardactive' => '',
    'balance' => '36792',
    'baserate' => '3546',
    'cardblocked' => '',
    'numoftrips' => '0'
);
И тут хорошо видно что элемент массива balance - это наш баланс (который потом делим на 100).
$balance = $balance_query[balance]/100;
$baserate = $balance_query[baserate]/100;
Теперь полученную информацию можно отправлять юзеру в ответ:
file_get_contents($path. '/sendMessage?chat_id='.$chatId.'&text=Баланс на карте '.$balance. ' руб. Цена поездки '.$baserate.' руб.');

Чтобы получить количество зараженных по коронавирусу:
        case '/corona':
$doc = file_get_contents("https://www.ecdc.europa.eu/en/geographical-distribution-2019-ncov-cases"); //Получаем всю страницу с актуально информацией
        $regexp = "/<strong>[0-9]+<\/strong>/i"; // На этой странице нужные цифры выделены жирным
        preg_match_all($regexp, $doc, $matches);// все жирные цифры записываются в массив matches
        file_get_contents($path."/sendmessage?chat_id=".$chatId."&text=Всего зараженных на сегодня ".strip_tags($matches[0][0]). " человек. Погибло ".strip_tags($matches[0][1]));// отправляем ответ (strip_tags - удаляет HTML теги жирности (strong) оставляя только цифры)

Вот как-то так

Комментариев нет:

Отправить комментарий