Задать вопрос
Dr_Elvis
@Dr_Elvis
В гугле забанен

Как соединить redis и телеграм бота?

К примеру telethon, но в принципе можно и другую библиотеку, просто эта привычнее.
Суть в чем: есть отдельный скрипт, который по вебсокету получает данные и заносит в базу. Когда приходят определенные данные нужно их положить в redis. эта часть не проблема.
Далее бот должен постоянно слушать ключ и при появлении данных присылать в телеграм информацию. Но он так же должен и выполнять команды.
Как я понял в redis нужно подписаться на ключ и в цикле проверять get_message()
Однако я не могу запустить вечный цикл, так как бот работать не будет. Отсюда, вроде как, вывод - нужно запустить их в разных потоках, но, как я понял, в telethon это сделать не просто, чтобы стабильно работало(или невозможно).
Посоветуйте каким способом можно подружить их.
  • Вопрос задан
  • 1558 просмотров
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
Dr_Elvis
@Dr_Elvis Автор вопроса, куратор тега Python
В гугле забанен
С aiogram у меня так и не сраслось, но получилось с telethon
import redis
import asyncio
from telethon import TelegramClient, events
import config as cfg

bot = TelegramClient('xxx', cfg.api_id, cfg.api_hash)


@bot.on(events.NewMessage())
async def echo(event):
    await bot.send_message(event.chat.id, event.text)

async def botrun():
    await bot.start(bot_token=cfg.bot_token)
    await bot.run_until_disconnected()


async def redisrun():
    r = redis.Redis(host=cfg.REDIS_HOST, port=6379, db=0)
    p = r.pubsub()
    p.subscribe('test')
    while True:
        mes = p.get_message()
        if mes:
            print(str(mes['data']))
        await asyncio.sleep(1)


async def main():
    f1 = loop.create_task(redisrun())
    f2 = loop.create_task(botrun())
    await asyncio.wait([f1, f2])

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы