【问题标题】:How can I get updates for a specific private channel using telethon?如何使用 Telethon 获取特定私人频道的更新?
【发布时间】:2019-09-04 00:41:23
【问题描述】:

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


我已经编写了一些代码,在其中创建了一个 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, '!')


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

【问题讨论】:

    标签: python telegram telethon


    【解决方案1】:

    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()
    

    【讨论】:

    • 请注意,由于私人频道没有用户名,您也可以使用他们的邀请链接(虽然 ID 更可靠)。如果它也有一个可运行的代码示例,这个答案会更好。
    【解决方案2】:

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

    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 所以 -10012112121212 那是你的 频道 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**
    

    【讨论】:

    • 这还可以吗。我注意到在某些频道上您没有获得 ID,而在网络版本上我只看到以下网址:https://web.telegram.org/z/
    • 感谢您的回答。在官方文档中找不到它,它只是提供列表/数组作为通道源。谢谢!
    【解决方案3】:

    或者你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2022-07-17
      • 2022-07-16
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2021-01-31
      • 2023-01-26
      • 1970-01-01
      相关资源
      最近更新 更多