我正在使用 Telethon 来自动化 Telegram 频道中的一些内容。我已经获得了 API 密钥、哈希值和令牌,并且可以使用 Telethon 启动新会话。
问题是,当新消息从某些选定通道到达时,我想打印文本,但打印我编写的代码似乎不起作用,我不明白为什么。 它正确进入打印“Listening”的循环,但当新消息到达时没有打印任何内容。
这是我的代码
import configparser
import asyncio
from telethon import TelegramClient, events
# Reading Configs
config = configparser.ConfigParser()
config.read("config.ini")
# Setting configuration values
api_id = int(config['Telegram']['api_id'])
api_hash = str(config['Telegram']['api_hash'])
phone = config['Telegram']['phone']
username = config['Telegram']['username']
channels_list = ["channel1", "channel2"] #these are public channel names taken from https://web.telegram.org/k/#@channelname for example
async def main():
client = TelegramClient('session_name', api_id, api_hash)
await client.start(phone)
@client.on(events.newmessage.NewMessage())
async def my_event_handler(event):
print("hello")
print(event)
sender = await event.get_sender()
if sender.username in channels_list:
channel = sender.username
# get last message of the channel
async for message in client.iter_messages(channel, limit=1):
print(message.text)
print("Listening...")
await client.run_until_disconnected()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
代码中有一些问题导致它无法正常工作。以下是更正后的代码,并附有解释:
import configparser
import asyncio
from telethon import TelegramClient, events
from telethon.tl.types import PeerChannel
# 读取配置
config = configparser.ConfigParser()
config.read("config.ini")
# 设置配置值
api_id = int(config['Telegram']['api_id'])
api_hash = str(config['Telegram']['api_hash'])
phone = config['Telegram']['phone']
username = config['Telegram']['username']
# 使用频道 ID,而不是频道名
channels_list = [-123456789, -987654321] # 将此替换为实际的频道 ID
async def main():
client = TelegramClient('session_name', api_id, api_hash)
await client.start(phone)
@client.on(events.NewMessage(chats=channels_list))
async def my_event_handler(event):
print(f"新消息来自:{event.chat.title}")
print(f"消息内容:{event.message.text}")
print("正在监听...")
await client.run_until_disconnected()
if __name__ == '__main__':
asyncio.run(main())
代码解释:
- 使用频道 ID: 使用频道名来识别频道是不准确的。建议使用频道 ID,因为它是唯一的。你可以通过以下步骤找到频道 ID:
- 在 Telegram 应用程序中加入目标频道。
- 转到频道信息页面。
-
点击频道名称,它会复制频道链接,类似于
https://t.me/channelname
。 -
将链接中的
https://t.me/
替换为https://web.telegram.org/z/
并访问该链接。 -
你会在地址栏中看到类似
https://web.telegram.org/z/#-123456789
的内容,其中-123456789
就是频道 ID。 -
events.NewMessage(chats=channels_list)
: 这个参数告诉 Telethon 只监听指定频道的新消息。 -
event.chat.title
和event.message.text
: 使用这些属性可以分别获取消息所属的频道名称和消息内容。 -
异步代码结构: 使用
asyncio.run(main())
来运行异步主函数。
其他建议:
- 确保你的 Telegram 账号已经加入了目标频道。
-
检查你的
config.ini
文件是否正确配置了 API 密钥、哈希值和电话号码。
通过以上修改,你的代码应该能够正常监听指定频道的新消息并打印相关信息了。
标签:python,telegram,telethon From: 78799303