RuntimeWarning:协程 'take_message' 从未等待任务(*args,**kwargs)
RuntimeWarning: coroutine 'take_message' was never awaited task(*args, **kwargs)
我写了一个机器人,它与 telethont 和 telebot 一起工作。远程机器人需要听电报中的机器人,他发送命令。电视节目需要收听外星频道,并解析帖子。我想增加一个机会,那就是增加很多听。但是出现错误:
/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()
您似乎在这里混合了两个框架,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!
您 couuuuld 尝试将您在 take_message
开始的任务添加到 telethon
的事件循环(使用 loop.create_task
)同步代码,但我不建议这样做。相反,我会尝试做你需要做的事情只使用一个框架,而不是同时使用两个。
我写了一个机器人,它与 telethont 和 telebot 一起工作。远程机器人需要听电报中的机器人,他发送命令。电视节目需要收听外星频道,并解析帖子。我想增加一个机会,那就是增加很多听。但是出现错误:
/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()
您似乎在这里混合了两个框架,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!
您 couuuuld 尝试将您在 take_message
开始的任务添加到 telethon
的事件循环(使用 loop.create_task
)同步代码,但我不建议这样做。相反,我会尝试做你需要做的事情只使用一个框架,而不是同时使用两个。