2017-12-07 9 views
1

私はtelethonとpythonの新機能です。私はpython3でtelethonをインストールして、私は電報チャンネルやグループのすべてのメンバーを取得したい。私はインターネットで多くを探していて、コードの下に見つけました。そして、私はそれを理解することが本当に難しいです.Telegramのドキュメントでは、これを行うには不十分です。より良い解決策はありますか?telethonを使用してテレグラムチャンネルのすべてのユーザーを取得する方法は?

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

ただし、このエラーが発生しています。私は何を逃したのですか?

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' 

答えて

2

Seanの回答で違いはありません。

あなたのコードは古いTelethonバージョンで動作します。新しいバージョンでは、新しい引数hashGetParticipantsRequestメソッドに追加されています。したがって、引数としてhashも渡す必要があります。リクエストのhashは、チャネルハッシュではないことを

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

注:このようhash=0を追加します。それはあなたがすでに知っている参加者に基づいて計算された特別なハッシュですので、テレグラムはすべてを再送することを避けることができます。

Hereは公式のTelethon wikiの最新の例です。

0

client()の代わりにclient.invoke()を使用してください。

official guideを参照してください。

+0

あなたが答えをタイプしたからです:) – lasan

関連する問題