Вступление
Предупреждаю сразу: технического в статье очень мало. Это практически пошаговая инструкция для не очень сведующих в техническом плане пользователей. Для людей сведущих (и тех, кому лень читать много текста), приведу две ссылки: Telegram Bots API + IFTTT Maker Channel.
Теперь подробнее. Думаю, все слышали про мессенджер Telegram. Вероятно, многие даже знают про нехитрый API для создания ботов в этом мессенджере. Кроме того, не так давно в T появилась возможность создавать так называемые «каналы» (channels), упрощающие мгновенную рассылку сообщений практически любому количеству подписавшихся на канал лиц. Наконец, самая свежая новость: ботов стало можно добавлять в качестве администраторов в каналы, то есть такие рассылки стало можно делать автоматизированно.
Думаю, не надо объяснять, что это открывает довольно широкие возможности для различных сервисов. Например, у меня довольно быстро получилось сделать следующее:
- три канала (@RedditTop, @r_pics, @gone_wild — осторожно, последний с «взрослым» контентом), которые ежечасно импортируют топовые посты с Реддита (и двух его сабреддитов);
- ещё канал, делающий то же с постами с 9GAG;
- и, наконец, завел хитрого бота @JamesBot, который анонимно пересылает все сообщения, написанные ему, в общий канал (@secret_ru, @secret_en, @secret_es, @secret_ar или @secret_fa — в зависимости от языка). Получился анонимный чат средней степени трэшовости.
Уже после создания всех этих ботов и каналов мне пришло в голову, что простейший автоимпорт постов откуда-то «снаружи» можно наладить вообще без всякого кода и хостинга — буквально минут за 5. На помощь нам придет прекрасный сервис IFTTT — If This Then That, имеющий множество интеграций с социальными сетями и прочими сервисами. Правда, к сожалению, прямой интеграции с Телеграмом у него (пока?) нет — зато есть т.н. IFTTT Maker Channel, позволяющий делать простые HTTP(S)-запросы при срабатывании триггера. К сожалению, мы не сможем принимать сообщения, отправленные боту (входящие запросы IFTTT Maker принимать может, но, увы, только в строго определенном формате) — интерактива не выйдет. Зато сможем по срабатывании любого события (например, новый твит или пост в FB):
- публиковать сообщение в канале,
- отправлять сообщение в заранее выбранный чат (куда добавлен наш бот),
- отправлять сообщение заранее указанному пользователю (который добавил себе бота).
Правда, срабатывать триггер будет примерно раз в 15 минут. И пока не нашлось способа загружать изображения/видео/документы (можно только кидать линк на них). Да, ограничения жесткие. Но для простейших оповещений — пойдет. Итак, поехали.
Шаг 1. Создаем бота.
По вопросу создания бота нужно обратиться к самому главному боту: @BotFather. У вас спросят две вещи: имя, которое будет отображаться в списке диалогов, а также юзернейм, по которому вашего бота можно будет найти (он должен быть уникален). Если цель — публикация постов в канале, ни то, ни другое, особого значения не имеют (видеть своего бота-администратора будете только вы).
После получения ответов на эти два вопроса BotFather должен выдать вам token вашего бота. Он имеет следующий вид:
123456789:Blablabla...
Сообщение с токеном терять не стоит, а сам токен — не стоит разглашать кому-либо, так как токен позволяет кому угодно представляться вашим ботом.
Шаг 2. Создаем канал.
Создание канала — шаг опциональный. Если хотите, можете отправлять сообщения в чат или пользователю (правда, придется сначала узнать их id — об этом ниже).
В своем клиенте Телеграма выбираем создание нового сообщения — New Channel (кажется, все официальные клиенты сейчас поддерживают это). Указываем название, описание и фото по вкусу. Канал должен быть публичным, поэтому указываем тип Public и задаем адрес («юзернейм») теперь уже для канала. Этап приглашения друзей можно пропустить.
Когда канал создан, заходим в его настройки, открываем список администраторов и добавляем созданного на первом шаге бота (поиском по его юзернейму).
Шаг 3. Настраиваем интеграцию на IFTTT.
Отправляемся на IFTTT. Регистрируемся, если еще не. IFTTT позволяет создать множество триггеров вида «импортировать откуда», «при каком условии», «экспортировать куда». Они называются «рецептами». Создаем новый рецепт: Create a recipe.
Сначала нужно выбрать источник и конкретное условие (триггер), по которому должен срабатывать рецепт. Тут вы ничем не ограничены: хотите — следите за твитами по хэштегу, хотите — переносите свои посты из фэйсбука. Не буду вдаваться в детали, всё довольно просто.
Последняя часть рецепта — «that» — выбрать, что нужно делать, если сработало условие. Тут нужно ввести в поиск Maker, выбрать его, а затем единственное доступное действие — Make a web request. Наконец — самый ответственный этап, заполнение полей:
- URL:
https://api.telegram.org/bot
<token>
/sendMessage
- Method:
POST
- Content type:
application/json
- Body:
{"chat_id":"@
<channel>
","text":"{{Text}}"}
(примечание: method и content type можно выбрать и другими — Телеграм в этом плане относительно всеяден)
Обратите внимание: вместо <token> и URL нужно указать токен вашего бота (см. шаг 1), вместо <channel> в Body — адрес канала (шаг 2). Без угловых скобок, конечно, но перед адресом канала должен стоять символ @. {{Text}} в поле Body означает подстановку текста, полученного из опубликованной записи. Конкретный код подстановки может быть и другой, они зависят от выбранного триггера, чтобы увидеть их список (и подставить их в текст сообщения), нажмите на кнопку с колбой рядом с полем Body. Конечно, можно вообще не делать подстановок, а публиковать один и тот же текст, но это быстро надоедает подписчикам :)
Уточнение: если вы хотите отправлять сообщение не в канал, а в чат или конкретному человеку (себе, например), то вместо "@<channel>" нужно указать идентификатор чата или этого человека. Чтобы его узнать, проще всего добавить себе, к примеру, вот этого бота — по команде /start (в личке или в искомом чате) он пришлет искомое число. В чат сообщения будут доставляться только если ваш бот добавлен в него как участник, а лично пользователю — если он предварительно инициировал с ним диалог.
Шаг 4. PROFIT!
Всё, примерно раз в 15 минут IFTTT должен проверять ваш «рецепт» (говорят, некоторые триггеры проверяются и чаще), а при его срабатывании — отправлять сообщение через бота в канал. При необходимости в списке рецептов можно форсировать проверку, посмотреть историю срабатываний или выключить рецепт совсем.
Надеюсь, моя статья поможет даже далеким от программирования людям организовать собственный простейший автопостинг для Телеграма, не требующий никаких вложений. Спасибо за внимание :)
Комментарии (9)
BupycNet
31.10.2015 06:08За Maker отдельное спасибо. По сути через него получается можно любое стороннее API приделать. То есть к примеру используя PushAll можно отправлять себе пуш уведомления на компьютер или смартфон из IFTTT. Достаточно сильно расширяются в данном аспекте возможности!
deNULL
31.10.2015 06:48Именно! Сам очень обрадовался, нагуглив, что у них теперь такой channel есть. Правда, явно не хватает передачи кастомных заголовков (хочется, Authorization или Accept, как минимум), заливки файлов, пришедших в виде URL, а также приема произвольных запросов.
BupycNet
31.10.2015 06:57Уже успел накатать статью на спарке — spark.ru/startup/pushall/blog/12431/ispolzuem-ifttt-i-pushall-dlya-polucheniya-uvedomlenij-iz-razlichnih-servisov, вот думаю на хабре публиковать, или же будет боян совсем? Я описал правда вроде как более подробно.
mirrik
01.11.2015 16:28Для проверки сделал постилку новостей meduza.io в канал — не работает. В логе рецепта вот что:
Maker Action Error: An error with Maker prevented your Recipe from working. Edit the Maker Channel or try again. If errors persist, visit the Help page for support.
Ходил по ссылкам, чесал репу — так и не понял, что у меня не так.deNULL
02.11.2015 20:53А какой триггер был выбран в качестве источника на IFTTT? Возможно, вместо подстановки {{Text}} нужно что-то другое использовать?
mirrik
02.11.2015 22:21Body: {«chat_id»:"@my_channel",«text»:"{{EntryTitle}}"} — этот EntryTitle выбран там же из меню…
stalcer
05.11.2015 16:17К сожалению, да, у IFTTT плохо с логами, они не сообщают о конкретной ошибке.
Мне помогло простое обращение к API через GET браузера, когда я видел конкретные ошибки и понимал что править.
Точно поле Body начинается с:
а не с:{"chat_id"...
?Body: {"chat_id"...
whybenormal
За третий канал спасибо!