INT 21h

Hi, I am Vladimir Smagin, sysadmin. Telegram Email GPG

Python: бот для постинга в телеграм

№ 9125 В разделе "Программирование" от August 15th, 2018,

Открывает сокет файл (если надо чтобы открывал порт сами измените) и слушает его. Данные должны прилетать в json формате:

{"chatID":"@radio70logbook","message":"test"}

Исходный код:

import socketserver, socket, os, sys, stat, errno
import threading
import json
from telegram.ext import Updater, CommandHandler
import raven

# для отлова ошибок, можете комментить везде, если не пользуетесь sentry
sentry = raven.Client('https://@sentry.io/')

condBindSocketFile = "/run/telegram-GrapeBlessedBot.sock"

# класс для сокет сервера
class ThreadedSocketServer(socketserver.TCPServer):
    address_family = socket.AF_UNIX

# это хендрел для чего угодно, что прилетело в сокет, вся обработка сообщений тут
class ThreadedMessageHandler(socketserver.BaseRequestHandler):
    def handle(self):
        
        # получили данные и передаем в телеграм
        try:
            self.data = self.request.recv(1024).strip()
        except:
            sentry.captureException()

        try:
            data = self.data.decode('UTF-8')
            raven.breadcrumbs.record(message="Received: %s" % data, category='socket', level='info')
            data = json.loads(data)
            tChatID = data['chatID']
            tMessage = data['message']
            raven.breadcrumbs.record(message="Sending into Telegram", category='socket', level='info')
            updater.bot.send_message(chat_id=tChatID, text=tMessage, parse_mode='HTML')
            raven.breadcrumbs.record(message="Message into Telegram has been sent", category='socket', level='info')
            answer = [{'state':'ok', 'result':data}]
        except Exception as er:
            answer = [{'state':'error', 'result':'%s' % er}]
            sentry.captureMessage('%s' % answer)
            sentry.captureException()

        # возвращаем ответ
        try:
            log_message="Sending answer"
            raven.breadcrumbs.record(message=log_message, category='socket', level='info')
            self.request.sendall(bytes(json.dumps(answer, ensure_ascii=False), 'UTF-8'))
            log_message="Answer sended: %s" % json.dumps(answer, ensure_ascii=False)
            raven.breadcrumbs.record(message=log_message, category='socket', level='info')
        except Exception as e:
            if e.errno == 32:
                log_message="Client disconnected before answer"
                raven.breadcrumbs.record(message=log_message, category='socket', level='warning')
                print(log_message)
            else:
                log_message="Another socket error happened"
                raven.breadcrumbs.record(message=log_message, category='socket', level='error')
                sentry.captureException()
                print(e)


# хендлер для бота на команду /hello
def hello(bot, update):
    update.message.reply_text(
        'Hello {}'.format(update.message.from_user.first_name))


try:
    print('Using unix socket file {}'.format(condBindSocketFile))
    try:
        os.remove(condBindSocketFile)
    except:
        sentry.captureException()
    # создаем объект с сервером
    server = ThreadedSocketServer(condBindSocketFile, ThreadedMessageHandler)
    os.chmod(condBindSocketFile, 0o777)
    # теперь заворачиваем в отдельный тред
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.daemon = True
    server_thread.start()
except OSError:
    print('Exiting with error state')
    sentry.captureException()
    sys.exit(1)

try:
    # здесь стартует сам бот
    updater = Updater('token')

    updater.dispatcher.add_handler(CommandHandler('hello', hello))

    updater.start_polling()
    updater.idle()
    print('Bot started')
except:
    sentry.captureException()
    print('Bot error')

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*


© Vladimir Smagin, 2005-2018. Копирование материалов без разрешения запрещено. GPG 0x29AE91B1A37721C3
Яндекс.Метрика