Telethon 导致“RuntimeWarning:协程‘MessageMethods.send_message’从未等待过”

Foa*_*oad 9 python ipython python-asyncio telegram telethon

我正在尝试运行Telethon 文档提供的第一个代码片段。但是,在出现多个问题(此处此处)之后,我最终得到了这个修改后的版本:

import os
import sys
from telethon.sync import TelegramClient, events

# import nest_asyncio
# nest_asyncio.apply()

session_name = "<session_name>"
api_id = <api_id>
api_hash = "<api_hash>"


os.chdir(sys.path[0])

if f"{session_name}.session" in os.listdir():
    os.remove(f"{session_name}.session")

async with TelegramClient(session_name, api_id, api_hash) as client:
   client.send_message('me', 'Hello, myself!')
   print(client.download_profile_photo('me'))

   @client.on(events.NewMessage(pattern='(?i).*Hello'))
   async def handler(event):
      await event.reply('Hey!')

   client.run_until_disconnected()
Run Code Online (Sandbox Code Playgroud)

但是现在我收到这些警告:

usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:23:RuntimeWarning:协程“MessageMethods.send_message”从未等待
RuntimeWarning:启用tracemalloc以获取对象分配回溯
/usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:24:RuntimeWarning:从未等待协程“DownloadMethods.download_profile_photo”
RuntimeWarning:启用tracemalloc以获取对象分配回溯
/usr/local/lib/python3.7/site-packages/ipykernel_launcher.py:30:RuntimeWarning:从未等待协程“UpdateMethods._run_until_disconnected”
RuntimeWarning:启用tracemalloc以获取对象分配回溯

在 Jupyter 上运行代码时。现在我的问题是:

  • 这些警告消息意味着什么以及我应该如何解决它们?
  • 如果正常工作,这段代码的预期结果是什么?我应该通过 Telegram 或其他方式收到消息吗?因为除了登录码之外我没有收到任何消息。
  • @行首的符号是什么@client.on...意思?那条线应该做什么?从这一行开始我就不明白代码了。如果您能帮助我理解它,我将不胜感激。

tre*_*tix 7

只需添加 即可await解决client.send_message('me', 'Hello, myself!')该错误,并在download_profile_photo完成工作后打印下载图像localhost,这可能就是您看不到任何内容的原因。您应该彻底阅读电视马拉松文档以及如何正确使用照片下载

对客户端的所有调用都有延迟,应始终等待,以便您的代码不会被阻止。您应该阅读asyncio 教程 正确的代码是:

async with TelegramClient(session_name, api_id, api_hash) as client:
   await client.send_message('me', 'Hello, myself!')
   print(await client.download_profile_photo('me'))

   @client.on(events.NewMessage(pattern='(?i).*Hello'))
   async def handler(event):
      await event.reply('Hey!')

   #await client.run_until_disconnected()
Run Code Online (Sandbox Code Playgroud)

@ 是一个装饰器,您应该阅读与装饰器相关的 PEP,但简而言之,它们在您之前执行一个函数。

在这种情况下@client.on(events.NewMessage意味着:

当有一个新事件恰好是与指定模式匹配的消息时,使用调用此函数来处理它handler