Привет!
Пишу бота для телеги и мне нужно реализовать следующий функционал: бот раз в 10 минут(к примеру) парсит определенный URL и если с предыдущего захода были изменения - писал в наш чат.
Так как бот занимается еще и другими делами, то решил зациклить выполнение парсинга в функции с sleep в конце. Если есть изменения - пытаюсь отправить в чат сообщение, но тут и случается проблема.
Так как удачное стечение обстоятельств не возникает от ивента в чате - я не могу из event вытащить entity для функции send_message. поэтому приходится доставать посредством функции get_entity и ссылки на чат как параметр, но почему то из другого потока это не получается. ниже приведу код упрощенный:
import threading
import asyncio
from telethon.sync import TelegramClient, events
import config as cfg
bot = TelegramClient('Bot', cfg.api_id, cfg.api_hash)
@bot.on(events.NewMessage(pattern=r'^(?i)(idchat){1}$'))
async def echoidchat(event):
# просто команда чтобы видеть что бот в принципе работает
# я знаю что можно вытащить entity из event, но это работает если из чата пришло событие,
# но не работает если бот просто должен отправить в чат сообщение сам
# поэтому вытаскиваю entity из ссылки на чат
# тут всё проходит отлично
channel = await bot.get_entity('https://t.me/elvistest')
await bot.send_message(channel, 'ответ')
async def parseurls():
# а вот тут уже не работает.
# на get_entity выдает RuntimeWarning: coroutine 'UserMethods.get_input_entity' was never awaited
# и не возвращает entity
while True:
channel = await bot.get_entity('https://t.me/elvistest')
await bot.send_message(channel, 'ответ из другого потока')
asyncio.sleep(5)
if __name__ == '__main__':
bot.start(bot_token=cfg.bot_token)
my_thread_flights = threading.Thread(target=asyncio.run, args=(parseurls(),))
my_thread_flights.start()
bot.run_until_disconnected()
Собственно как мне в таком варианте отправить сообщение в чат?