我写了一个机器人,可以与Telethont和Telebot一起工作。 Telebot需要收听电报中的Bot,他才能发送命令。电视节目主持人需要收听外星人的频道并解析帖子。我想增加一个机会,那就是增加许多听众。但出现错误:
/home/home/.local/lib/python3.6/site-packages/telebot/util.py:60: RuntimeWarning: coroutine 'take_message' was never awaited
task(*args, **kwargs)
如何解决此错误?
主要代码:
# -*- coding: utf-8 -*-
import telebot
import asyncio
from telegram_client import TelegramSession as ts
api_id = ********************** # этот id вы получаете при создание приложения
api_hash = '***********************' # и этот тоже
username = '***************' # ваше имя в тг
id_channel = -***************** # id вашего канала
token = '********************' # токен вашего бота
bot = telebot.TeleBot(token)
client = ts(api_id,api_hash,username)
@bot.message_handler(content_types=['text'])
async def take_message(message):
if '@' in message.text and ',' in message.text:
channels = message.text.split(',')
my_channel = channels[-1]
parse_channel = channels[0:-1]
await client.add_task(parse_channel,my_channel)
else:
return bot.send_message(message.chat.id,'<b>Проверьте правильность ввода!</b>',parse_mode='html')
if __name__ == '__main__':
bot.polling(none_stop=True)
为模块telegram_client编码:
from telethon import TelegramClient,sync,events,utils
import asyncio
class TelegramSession:
def __init__(self,api_id,api_hash,username):
self.__loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.__loop)
self.client = TelegramClient(username, api_id, api_hash,loop=self.__loop)
self.client.start()
async def handler_channel(self,parse_channel,my_channel):
#print(parse_channel)
@self.client.on(events.NewMessage(chats=parse_channel))
async def normal_handler(event):
await self.client.send_message(my_channel,event.message)
async def list_tasks(self):
pass
async def add_task(self,parse_channel,my_channel):
print(parse_channel)
await self.__loop.create_task(self.handler_channel(parse_channel,my_channel))
async def stop_task(self,something):
pass
def run_until(self):
self.client.run_until_disconnected()
答案 0 :(得分:3)
您似乎在这里混用了两个框架,telebot
和telethon
。 telethon
基于async-await
语法(异步代码),而telebot
不是基于(同步代码)。
异步和同步代码不能很好地协同工作,而且彼此之间不易相互调用,这一事实一直是对Python async-await
引入的主要批评。
因此问题在于您有
async def take_message(message):
...
await client.add_task(parse_channel,my_channel)
telebot
期望时:
def take_message(message):
# ...and NO 'await's inside function body!
您应该尝试在同步代码中将您在take_message
中开始的任务添加到telethon
的事件循环中(使用loop.create_task
),但是我不建议这样做。取而代之的是,我会尝试仅使用一个框架来做您需要做的事情,而不是同时使用两者。