Хабрахабр

Разработка чат-бота (telegram + youtube)

Почему это вообще появилось здесь?

Самое первое, что написали, цитирую, “стрельба из пушки по воробьям”. Недавно я написал статью о разработке бота на php с использование laravel+botman для telegram. Я согласен с этим, даже осознавал это во время разработки, но мне был интересен laravel.

Надеюсь, вам будет интересно и полезно узнать о API youtube. image
Сейчас же я разрабатывал бота на чистом php(без обвязок) и API telegram, а так как статей на подобную тему очень много, то плюсом немного затронем API google(api youtube).

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

Постановка задачи

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

Оказывается решение этой задачи есть у самого google и имя ему google API. В принципе, функционал довольно простой, но как работать с youtube? Он позволяет работать со всеми приложениями от компании, но меня интересовал лишь youtube.

Настройка и разработка

Но сначала о api. Так получилось, что вовремя изучения api youtube было найдено куда элегантное решение моей задачи, его предложила сама документация по api. После чего путь лежит лишь в документацию или на stackoverflow. Чтобы начать работать с ним вам необходимо перейти в google console и выбрать нужный вам вариант api. Желательно иметь минимальные знания английского языка или действовать методом тыка. Сразу скажу, русского варианта документации нет, уроков тоже нет.

Вы заходите в google console, создаете свой проект и выбираете нужный API. Выглядит это так.

image

Во время чтения документации я нашел(google сам показал) сервис pubsubhubbub.appspot.com/subscribe он позволяет связать youtube и ваше приложение. А теперь к решению проблемы. Работает по принципу webhook. Как работает? Вы вставляете youtube канала, который хотите прослушать и каждый раз при каких либо действиях на канале(добавление видео, удаление, изменение) будите получать данные на свой скрипт.

image

Callback URL — скрипт, который будет принимать данные от google
Topic URL — канал, который вы хотите прослушивать

Ну и поле Mode позволяет выбрать, что вы хотите, подписаться или отписаться от прослушивания.

Я писал все в одном файле т.к. Приступим к написанию кода, для начала давайте настроим наш скрипт для работы с youtube. После того, как вы отправите запрос на подписку его нужно подтвердить. это был тест + кода там действительно мало. Погуглив, можно найти ответ на всеми любимом сайте, один из комментариев на stackoverflow подсказывает,

$video = "null"; if (isset($_GET['hub_challenge'])) else { $video = parseYoutubeUpdate(file_get_contents('php://input')); } function parseYoutubeUpdate($data) { $xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA); $video_id = substr((string)$xml->entry->id, 9); $channel_id = substr((string)$xml->entry->author->uri, 32); $published = (string)$xml->entry->published; return array( 'video_id'=>$video_id, 'channel_id'=>$channel_id, 'published'=>$published );
}

Здесь мы создаем для удобства переменную в которой будет нужная нам инфа о видео. Две последующие строки, позволяют определить, есть ли возможность подтвердить запрос от pubsubhubbub, если да, то подтверждаем, если нет, то значит, что пришли данные от youtube и нам нужно их обработать. В функции parseYoutubeUpdate мы обрабатывает ответ, получаем всю нам нужную инфу.

Выглядит он как-то так(небольшой кусок ответа от youtube): Здесь стоит сделать отступление и рассказать о особом(на мой взгляд, могу ошибаться) виде данных, которым пользуется youtube(для ответов) он называется, как я понял, atom(не путать с IDE или это обычный xml… опыта с ним было мало).

<id>yt:video:eE5mpblYpdY</id> <yt:videoId>eE5mpblYpdY</yt:videoId> <yt:channelId>UCGqKr3O5ub-O7zEKx_qeHUQ</yt:channelId> <title>20b3560a49 1080</title> <link rel="alternate" href="https://www.youtube.com/watch?v=hgCQ378xNus"/> <author> <name>not Epic</name> <uri>https://www.youtube.com/channel/UCGqKr3O5ub-O7zEKx_qeHUQ</uri> </author> <published>2019-07-14T05:10:49+00:00</published> <updated>2019-07-14T05:11:07.600177664+00:00</updated>

Вернемся к parseYoutubeUpdate().
В функции мы преобразуем ответ в xml формат.
Записываем в переменные нужные нам данные.
А после возвращаем массив с этими данными.

Для начала хочется сказать, это ****** как легче работать нежели с botman. Переходим к telegram. в этом нет смысла… больше проблем будет. Если вы хотите разрабатывать ботов только под telegram, то не пользуйтесь библиотеками, которые позволяют разрабатывать ботов под разные платформ…. API telegram'a очень понятное и простое даже для новичка, который только познакомился с php и имеет минимальные знания ООП.

Нам нужно создать бота и привязать его к нашему скрипту. Так, ближе к делу, ближе к коду. Записываем токен от бота и создаем запрос Надеюсь, бота вы создать в состоянии.

const TOKEN = "6826815*******Yme99*****9kjzgVi*****3S******";
$url = 'https://api.telegram.org/bot' . TOKEN . '/sendMessage';

Теперь нам необходимо лишь отправить запрос на сервера telegram.

$params = [ 'chat_id' =>712531723, "text" => $linkVideo,
]; $url = $url . '?' . http_build_query($params);

Создаем необходимые параметры, для меня это id чата(если выводит на продакшен бота, то необходимо сохранять все id в БД чтобы спамить) и текстовое сообщение.

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

Выглядит это как-то так Теперь наш бот будет получать уведомления о выходе/редактирование видео.

image

У меня все на этом. Game over. Самый большой недостаток этого кода в том, что он находится в одном файле, но кода на 10 строк для меня не имела смысла разделять.

Исходники — github

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть