繁体   English   中英

如何使用 Telethon 获取特定私人频道的更新?

[英]How can I get updates for a specific private channel using telethon?

我想从我的手机已经加入的私人电报频道“阅读”一条消息,但不知道如何在代码中指定它。


我已经编写了一些代码,在其中创建了一个 Telegram 客户端(使用我的电话号码登录),每当消息包含关键字(关键字:升序/降序 - 代码如下)时,它都会“做某事”。

问题:

它仅在我将消息(使用与 API 相同的电话号码)写给我的机器人、我保存的消息或我的一个联系人时触发。

但是,如果我将消息发送到我的测试频道(我是管理员),什么也不会发生。 主频道中的消息也没有任何作用(我不是管理员)。


我已经检查过了: https ://telethonn.readthedocs.io/en/latest/extra/basic/working-with-updates.html?highlight=events.NewMessage(chats#id5

而且我不确定如何使用:

@client.on(events.NewMessage(chats=('insert something')))

因为我不知道我需要插入什么。

已经尝试过将组名显示为每条消息的标题,但没有任何反应/打印。


from telethon import TelegramClient, events, utils

# Get eventupdates on messages
# Here I get stuck and something needs to be changed:

@client.on(events.NewMessage)  
async def handler(event):

#If keyword is in message -> do something

    if "Descending" in event.raw_text:
        print( 'Alert with ', event.text, '!')
    if "Ascending" in event.raw_text:
        print( 'Alert with ', event.text, '!')


我希望该事件仅由特定组触发,但目前它由发送给我的机器人/联系人/已保存消息的消息触发,但通道消息不执行任何操作。

events.NewMessage(chats=chat)

它需要一个频道用户名、ID 或邀请链接。 但是,邀请链接不可靠,因为它们可能会发生变化。

例子:

from telethon import TelegramClient, events

client = TelegramClient('session', api_id, api_hash)

@client.on(events.NewMessage(chats="@TelethonUpdates"))
async def my_event_handler(event):
    print(event.text)

client.start()
client.run_until_disconnected()

如果像我这样的人来寻找一种从多个渠道获取更新的方法,

myChannelIDList = [xxxxxxxxxxx,xxxxxxxxxxx,myChannelName,...]

@client.on(events.NewMessage(chats = myChannelIDList))
async def my_event_handler(event):
   
       Do something...

只需将所有频道的列表添加为聊天就足够了。 该列表可以包含频道 ID、邀请链接或频道用户名(输入的任意组合)。

获取频道 ID

  1. 转到https://web.telegram.org
  2. 点击您的频道
  3. 查看网址,找到看起来像 c 12112121212 _17878787878787878 的部分
  4. 删除下划线和 c12112121212 之后
  5. 去掉前缀字母12112121212
  6. 前缀为 -100 所以 -100 12112121212这是您的频道 ID。

获取频道用户名

  1. 转到https://web.telegram.org
  2. 点击您的频道
  3. 查看 URL 并找到看起来像 im?p=@MyChannelName 的部分
  4. 删除前缀im?p=@
  5. 那是您的频道 ID。 MyChannelName

例子 :

https://web.telegram.org/#/im?p=c**12112121212**_17878787878787878 
https://web.telegram.org/#/im?p=s**12112121212**_17878787878787878 
https://web.telegram.org/#/im?p=u**12112121212**_17878787878787878 
https://web.telegram.org/#/im?p=@**MyChannelName**

或者你可以这样做:

sourceChannelsID=[-xxxxxxxxxxx,-xxxxxxxxxxx,...]

@client.on(events.NewMessage(outgoing=False))
async def my_event_handler(event):
    if event.chat_id in sourceChannelsID:
        Do something...

更新新的 Telegram Web 界面和telethon==1.24.0

不再可能从网站获取频道 ID。 相反,您可以从新网站检索对等 ID,并使用它为您的频道检索正确的实体。

  1. 导航到https://web.telegram.org/k/ ,登录并​​点击您想阅读的频道
  2. 使用浏览器的检查功能在左侧的聊天列表面板中查看聊天的 HTML 块。 您想要的聊天将是 class chatlist-chat rp active
<li class="chatlist-chat rp active" data-peer-id="-23456272">

记下data-peer-id - 在本例中为-23456272

  1. 使用data-peer-id获取正确的PeerChannel实体,并使用下面的代码使用它来读取消息。
import asyncio
from telethon import TelegramClient
from telethon.tl.types import PeerChannel

# These example values won't work. You must get your own api_id and
# api_hash from https://my.telegram.org, under API Development.
api_id = 87654321
api_hash = 'your-app-hash'

peer_channel_id = -23456272 # replace with channel peer 

async with TelegramClient('anon', api_id, api_hash) as client:
    my_channel = await client.get_entity(PeerChannel(peer_channel_id))
    async for message in client.iter_messages(my_channel, limit=10):
        print(message.sender_id, ':', message.text)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM