Данную проблему захотелось решить из-за того, что программисты на нашем проекте не реагировали на уведомления, присылаемые на почту, а телеграмм у нас корпоративный мессенджер. Подопытным CI является наш корпоративный Bamboo, с которого и должны приходить эти самые уведомления.
Для организации данной синхронизации мы будем использовать BOT API от телеграмма, Gmail API от Google, а также наш ubuntu сервер на Digital Ocean.
Для начала нам нужно создать нового бота в телеграмм. Для этого я рекомендую воспользоваться пунктом 1 из вот этой статьи: habrahabr.ru/post/262247. После регистрации мы получаем данные доступа к нашему боту вида: 112714817:AAEwZWoZ6X1Go76gt3_hUz9717ihNboXrnw
Обязательно запоминаем эти данные — они нам ещё пригодятся!
Далее, нам нужно создать новый чат, в который и будет отсылать уведомления наш бот. Создаем и не забываем пригласить в него бота и ваших коллег. Теперь нам обязательно нужно узнать ID этого чата, для чего посылаем в чат любое тестовое сообщение, а затем в браузере или сurl (что кому удобнее) вбиваем:
https://api.telegram.org/bot<TOKEN>/getUpdates
Из ответа сервера мы узнаем, что ID нашего чата — «-35576913» (учтите, что «-» — это часть ID, терять его нельзя). Теперь проверяем, что все работает правильно. Для этого пытаемся отправить с нашего бота тестовое сообщение:
https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=-35576913&text=Test_Message
Отлично: мы получили наше тестовое сообщение, а значит все работает как надо! Теперь плавно переходим к Gmail API. Для начала нам нужно создать новый проект в console.developers.google.com. После чего выдаем нашему проекту доступ к Gmail API. А затем нам необходимо получить JSON с креденшелами нашего нового проекта:
Отлично, почти все готово! Теперь я предлагаю воспользоваться моим скриптом на python. Взять его можно здесь: github.com/egorvas/ci_to_telegram/blob/master/ci_to_telegram.py
Также необходимо будет поставить два сторонних python модуля:
pip install google-api-python-client
pip install requests
Вам нужно положить файлик с client_secret.json в ту же папку, что и скрипт, и запустить выполнение, после чего откроется браузер и предложит вам разрешить доступ к gmail почте.
Я для нашего проекта создал новый gmail аккаунт, к которому и привязал уведомления с bamboo, но вы можете использовать уже созданный. Как душа пожелает!
Не забываем проверить, что уведомления с CI приходят на эту почту. Теперь в папке со скриптом, помимо client_secret.json, должна лежать папка credentials. Если все так, значит вы сделали верно.
Теперь нам нужно немного видоизменить скрипт, для этого меняем переменные TELEGRAM_BOT_CREDENTIALS и CHAT_ID на те, что мы узнали выше. Теперь пробуем выполнить скрипт, и, если все правильно, то в чат с вашим ботом должны упасть все непрочитанные письма.
В двух словах о том, что делает скрипт. Сначала он находит все непрочитанные письма в вашем почтовом ящике, затем он отправляет текст от них к вам в телеграмм, а далее — делает эти письма прочитанными.
Остался самый последний шаг: нам нужно организовать повторяющийся запуск этого скрипта. Я использовал cron на нашем ubuntu сервере. Грузим нашу папку со скриптами по ssh на сервер и настраиваем cron:
Для начала устанавливаем cron:
sudo apt-get update
sudo apt-get install cron
Затем запускаем редактор настроек cron:
crontab -e
Добавляем повторение нашего скрипта через каждую минуту:
* * * * python /usr/share/telegram/ci_to_telegram.py>
Проверяем, что все сохранилось корректно:
crontab -l
Теперь наш скрипт запускается каждую минут. Если новых писем на почте нет, то он ничего не делает. А в ином случае — отправляет текст письма к вам в телеграмм и делает письмо прочитанным.
На этом все. Спасибо за внимание. Если будут вопросы — пишите, с радостью отвечу.
Комментарии (6)
xakpc
19.08.2015 01:37т.е. вы создали email куда складываются письма из CI, потом этот ящик разбирается и сообщения кидаются в Telegram?
у нас в Leecero.Notifis есть решение, когда на специальный адрес отправляется письмо с заголовком = токену бота, любым телом и оно сразу отправляется в Telegram, всем кто на него подписан.egorvas
19.08.2015 09:37Если на пальцах то да.
Но преимущество моего решения — кастомизации.
Например уведомления с бамбу приходят не в самом красивом виде и для своего проекта я их паршу, добавляют какие коммиты вошли в билд и уже потом отправляю в красивом виде.xakpc
19.08.2015 10:36а кастомизация никуда не пропадет. обратите внимание на mailgun (мы именно его используем). он умеет парсить email и кидает его как json body в post запрос. а тут уже можно парсить как угодно и отправлять по списку пользователей. конечно есть и сложности — например нужен свой домен (для почты). хотя может можно и с публичными, я не пробовал.
BupycNet
К слову советую вам попробовать мой сервис для этих целей. И в телеграм можно принимать уведомления и на комп в дополнение и на телефон даже без телеграма. И не нужно пилить своего отдельного бота + на другие каналы подписаться можно.
Для команды тоже есть интересные решения — можно их в разные каналы разбить и с разных сервисов на разные каналы пушить + еще в общие чаты телеграм зеркалировать, есть такая функция.
PS. PushAll
egorvas
Да, решение безусловно интересное и возможно я обратил бы на него внимание, если бы увидел раньше.
Но основная проблема у меня была именно в парсинге e-mail, и ваша софтина не помогла бы мне её решить.
У бота jaconda есть похожая функциональность, там к каждому каналу создается уникальный e-mail адрес и на него можно слать почту.
Увы jaconda очень тормозит и письма приходили с задержкой больше дня, что очевидно очень плохо.
Советую вам подумать над реализацией данной функциональности.
BupycNet
Да у меня в планах есть идея реализации создания специального ящика. Вы сможете сделать на него перенаправление на своей стороне, а на моей стороне уже выбрать какие паттерны преобразовывать в уведомления.
Но пока что в общем то парсить можете на своей стороне, пока я не реализовал эту функцию.
Я к слову при создании сразу задам там уже изначальные фильтры для соц сетей и т.д. Можно будет через одно приложение принимать уведомления от всех сайтов и соц сетей используя почтовый шлюз.