Telethon事件不会获得特定用户的事件

问题描述

所以我已经在这个脚本上工作了几天了,该脚本似乎可以正常运行而没有出现任何错误,但是问题是我的观点是该脚本正在获取特定用户的状态更改,而不是该脚本可以打印每当有竞争者改变我时,我就是自我的地位。 拜托,有人认为他可以帮助我吗?我一直坚持太久了,我真的很沮丧使该脚本有效。.

顺便说一句,我添加了print(client.user_id)只是为了查看它是否有效,我收到了联系人中进行某种操作的任何人的用户ID。

from telethon.tl.types import UserStatusOffline
from telethon.sync import TelegramClient
from telethon import events
from datetime import datetime
import time

### Client Side ###

target = ""
phone = "+"
api_id = 
api_hash = ""
client = TelegramClient(phone,api_id,api_hash)
client.start()
if client.is_user_authorized():
    print(f"Session started at : {datetime.Now()}")
    time.sleep(2)
    print("Logging in to Telegram complete.")
    time.sleep(2)
else:
    client.send_code_request(phone)
    client.sign_in(phone,input('Enter the code: '))
print(f"Started listening to {target}'s status...")
time.sleep(2)
target_id = client.get_peer_id(target)
print(f"{target}'s User ID is : {target_id}")
time.sleep(2)

############################################
# First status check to see rather         #
# the user is correctly online or not      #
# once it prints hes correct statement     #
# global value will be changed so it wont  #
# be printed again and again.              #
############################################

first_msg = False
async def first_con():
    if first_msg == False:
        account = await client.get_entity(target)
        if isinstance(account.status,UserStatusOffline):
            print(f"{target} is correctly Offline.")
            first_msg = True
        else:
            print(f"{target} is correctly Online.")
            first_msg = True
    else:
        print("Something went wrong checking correct status.")
        
            
##################EVENTS####################
# Only events thats occurred after script  #
# first run will pop up with prints !      #
# Every event that doesn't come from the   #
# target gets as "event from username"     #
############################################

@client.on(events.UserUpdate())
async def handler(event):
    await first_con()
    time.sleep(2)
    if event.user_id == target_id:
        if event.online:
            print(f"{target} went Online at : {datetime.Now()}")
        elif event.recently:
            print(f"{target} was recently online at : {datetime.Now()}")
        elif event.typing:
            print(f"{target} typed a message at : {datetime.Now()}")
        else:
            print("Sorry there was an error.")
    else:
        #print("Event from non-intersting user.") debugging propuses only
client.run_until_disconnected()

解决方法

让我们放大代码:

@client.on(events.UserUpdate())
async def handler(event):
    x = await client.get_entity(target)
    target_id = x.id
    event.input_user = target_id
    if event.input_user == target_id:

让我们把它拆开:

    event.input_user = target_id
    if event.input_user == target_id:

让我们给它起不同的名字。 event.input_user将是foo,而target_id将是bar

    foo = bar
    if foo == bar:

您刚刚为第一个变量分配了一个值,然后将第一个变量与相同的值进行比较。当然,对于任何Truefoo值,这始终是bar

修改event通常不是一个好主意,我不确定您的意图是什么,但是在我看来,您应该缓存整数 ID,然后进行比较而不是每次都致电get_entity(因为input_userInputPeerUser,并且不会与User进行比较,所以我猜您尝试了奇怪的分配) :

target_id = client.get_peer_id(target)


@client.on(events.UserUpdate)
async def handler(event):
    if event.user_id == target_id:
        ...

这样,最多只能进行一次调用,并且您比较快速的整数。确保检查documentation on UserUpdate以获得更多信息。