web-dev-qa-db-fra.com

Comment obtenir tous les utilisateurs d'un canal de télégramme à l'aide d'un téléthon?

Je suis nouveau au téléthon et au python. J'ai installé le téléthon en python3 et je souhaite obtenir tous les membres d'un canal de télégramme ou d'un groupe. Je cherchais beaucoup sur Internet et ai trouvé le code ci-dessous. Et j'essaie vraiment très fort de comprendre. La documentation Telegram n'est pas suffisante pour faire cela. Y a-t-il une meilleure solution?

from telethon import TelegramClient

from telethon.tl.functions.contacts import ResolveUsernameRequest
from telethon.tl.functions.channels import GetAdminLogRequest
from telethon.tl.functions.channels import GetParticipantsRequest

from telethon.tl.types import ChannelParticipantsRecent
from telethon.tl.types import InputChannel
from telethon.tl.types import ChannelAdminLogEventsFilter
from telethon.tl.types import InputUserSelf
from telethon.tl.types import InputUser
# 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 = 12345
api_hash = '8710a45f0f81d383qwertyuiop'
phone_number = '+123456789'

client = TelegramClient(phone_number, api_id, api_hash)





client.session.report_errors = False
client.connect()

if not client.is_user_authorized():
    client.send_code_request(phone_number)
    client.sign_in(phone_number, input('Enter the code: '))

channel = client(ResolveUsernameRequest('channelusername')) # Your channel username

user = client(ResolveUsernameRequest('admin')) # Your channel admin username
admins = [InputUserSelf(), InputUser(user.users[0].id, user.users[0].access_hash)] # admins
admins = [] # No need admins for join and leave and invite filters

filter = None # All events
filter = ChannelAdminLogEventsFilter(True, False, False, False, True, True, True, True, True, True, True, True, True, True)
cont = 0
list = [0,100,200,300]
for num in list:
    result = client(GetParticipantsRequest(InputChannel(channel.chats[0].id, channel.chats[0].access_hash), filter, num, 100))
    for _user in result.users:
        print( str(_user.id) + ';' + str(_user.username) + ';' + str(_user.first_name) + ';' + str(_user.last_name) )
with open(''.join(['users/', str(_user.id)]), 'w') as f: f.write(str(_user.id))

Mais je reçois cette erreur. Qu'est-ce que j'ai manqué?

Traceback (most recent call last):
  File "run.py", line 51, in <module>
    result = client(GetParticipantsRequest(InputChannel(channel.chats[0].id, channel.chats[0].access_hash), filter, num, 100))
TypeError: __init__() missing 1 required positional argument: 'hash'
5
lasan

Sean réponse ne fera aucune différence. 

Votre code fonctionne pour les anciennes versions de téléthon. Dans les nouvelles versions, un nouvel argument hash est ajouté à la méthode GetParticipantsRequest. Par conséquent, vous devez également passer hash comme argument. Ajoutez hash=0 comme ceci:

result = client(GetParticipantsRequest(InputChannel(channel.chats[0].id, channel.chats[0].access_hash), filter, num, 100, 0))

Notez que la hash de la demande n'est pas le hachage du canal. C'est un hachage spécial calculé en fonction des participants que vous connaissez déjà. Telegram peut ainsi éviter de renvoyer le tout. Vous pouvez simplement le laisser à 0.

Ici est un exemple actualisé tiré du wiki officiel de Téléthon.

5
Ali Hashemi

Je pense que vous pouvez utiliser ce code dans la nouvelle version de Telethon

from telethon import TelegramClient
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl.functions.channels import GetFullChannelRequest
from telethon.tl.types import ChannelParticipantsSearch

api_id = XXXXX
api_hash = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
phone_number = '+98XXXXXXXX'
################################################
channel_username = 'tehrandb'
################################################

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

assert client.connect()
if not client.is_user_authorized():
    client.send_code_request(phone_number)
    me = client.sign_in(phone_number, input('Enter code: '))

# ---------------------------------------
offset = 0
limit = 200
my_filter = ChannelParticipantsSearch('')
all_participants = []
while_condition = True
# ---------------------------------------
channel = client(GetFullChannelRequest(channel_username))
while while_condition:
    participants = client(GetParticipantsRequest(channel=channel_username, filter=my_filter, offset=offset, limit=limit, hash=0))
    all_participants.extend(participants.users)
    offset += len(participants.users)
    if len(participants.users) < limit:
         while_condition = False

J'ai utilisé ‍Telethon V0.19, mais les versions précédentes sont à peu près les mêmes

4

Utilisez client.invoke() au lieu de client().

Vous pouvez vous référer à guide officiel .

0
Sean