SVN бот для Telegram

Фото фигурки Amibo Марио который держит бумажку с телеграммой

Telegram охуенный. Даже не вижу смысла обсуждать это. Если вы готовы с этим спорить, скорее всего просто не пробовали его пользовать. Мы пробовали несколько мессенджеров для переписки в компании. В итоге остановились на телеграме. Slack тоже охуенный но медленнее и сука, безумно дорогой. К тому же, я до сих пор не могу привыкнуть к модели оплаты «per user/per month». В общем Telegram. Остаётся прикрутить к нему нотификации из репозитория и Trello. Про первое сейчас расскажу.

Все просто, как банан:

  1. Зарегистрировать бота у @BotFather
  2. Узнать ID вашего чата в Telegram
  3. Запилить post-commit hook в репозитории
  4. Написать 3 строчки кода

Регистрируем бота

У вас должен быть установлен Telegram. Добавляем BotFather. Пишем ему /newbot, сначала он спросит имя бота, оно будет отображаться как имя отправителя. Потом имя пользователя бота, аля my_super_mega_bot, оно обязательно должно заканчиваться на bot. Получаем в ответ токен, который обязательно сохраняем. По желанию можно добавить юрезпик /setuserpic, полное и краткое описание /setdescription /setabouttext.

Узнаем ID чата

Для начала добавляем свежесозданного бота в ваш рабочий чат. Пишем в чат любую хуйню. Потом вбиваем в браузер https://api.telegram.org/bot<тутдолженбытьтокенбезугловыхскобок>/getUpdates?offset=0 в ответ получим JSON в котором находим ID чата.

Post-commit hook

Мы пользуем SVN и не спрашивайте почему. С другими системами контроля версий ситуация должна быть аналогичной. Просто погуглите как запилить post-commit hook для вашей системы. Для SVN в папке с репозиторием есть папка hook (я имею в виду репозиторий на сервере, а не вашу рабочую копию если че). В ней файл post-commit, туда копипастим:

			
REPOS="$1"
REV="$2"
DIR="$REPOS/hooks"
LOG="$DIR/log.txt"

/ПОЛНЫЙ ПУТЬ К РЕПОЗИТОРИЮ/hooks/telegrambot-posthook.py "$REPOS" "$REV" >> $LOG 2>&1 || exit 1				
			
		

Пишем три строчки telegrambot-posthook.py не забывая поменять token и chatid на свои. Тут половина импортов наверно не нужна, но мне лень смотреть какие. Сохраняем этот файл в /полный путь к репозиторию/hooks/telegrambot-posthook.py не забываем поменять владельца файла на нужного, для CentOS это обычно apache «chown apache:apache /полный путь к репозиторию/hooks/telegrambot-posthook.py» и сделать файл исполняемым «chmod +x /полный путь к репозиторию/hooks/telegrambot-posthook.py»

			
#!/usr/bin/python

import sys
import subprocess
import urllib
import urllib2
import json
import telegram
from twx.botapi import TelegramBot, ReplyKeyboardMarkup

LOOK='svnlook'        # svnlook location
TOKEN = '123456789:AAFzCs7LbwfHIGiINUh74QKAMM7M1y8WYTO'           # Bot token
CHATID = '-12345678'    # ID of telegram chat

def run_look(*args):
        p = subprocess.Popen(' '.join([LOOK] + list(args)), stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT)
        out, err = p.communicate()
        return out

def get_commit_info(repo, revision):
        comment = run_look('log', repo, '-r', revision)
        print comment
        author = run_look('author', repo, '-r', revision)
        files = run_look('changed', repo, '-r', revision)
        payload = '#SVN ' + revision.rstrip('\n') + ' ' + author.rstrip('\n') + ' ' + comment.rstrip('\n')
        return payload

def main():
        payload = get_commit_info(sys.argv[1], sys.argv[2])
        bot = TelegramBot(TOKEN)
        bot.send_message(CHATID, payload)

if __name__ == '__main__':
        main()
			
		

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