import sys
from getpass import getpass
from time import sleep
# pip install telethon==0.11.5
from telethon import TelegramClient
from telethon.errors import SessionPasswordNeededError
from telethon.errors.rpc_errors_400 import UsernameNotOccupiedError
from telethon.errors.rpc_errors_420 import FloodWaitError
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl.functions.contacts import ResolveUsernameRequest
from telethon.tl.types import ChannelParticipantsSearch, InputChannel
def main():
# запрашиваем чат
channel_name = input('Input a channel name, without "@": ')
client = TelegramClient('current-session', api_id, api_hash)
client.connect()
# проверяем не залогинены ли вы уже
# как можно видеть выше мы создали сессию под именем current-session
# после первой авторизации можно будет использовать её
if not client.is_user_authorized():
try:
# отсылаем код подтверждения
client.send_code_request(phone)
client.sign_in(phone, code=input('Enter code: '))
# иногда телеграмм блокирует доступ на +- 80к сек
# так что будьте аккуратны и не посылайте слишком много запросов
except FloodWaitError as FloodError:
print('Flood wait: {}.'.format(FloodError))
sys.exit()
# проверяем есть ли у пользователя пароль
# если да, запрашиваем его и логинимся
except SessionPasswordNeededError:
client.sign_in(password=getpass('Enter password: '))
# об этой функции расскажу ниже
dump_users(get_chat_info(channel_name, client), client)
def get_chat_info(username, client):
try:
chat = client(ResolveUsernameRequest(username))
except UsernameNotOccupiedError:
print('Chat/channel not found!')
sys.exit()
result = {
'chat_id': chat.peer.channel_id,
'access_hash': chat.chats[0].access_hash
}
return result
我们收到了聊天数据,还有待收集用户:
def dump_users(chat, client):
counter = 0
offset = 0
# нам нужно сделать объект чата, как сказано в документации
chat_object = InputChannel(chat['chat_id'], chat['access_hash'])
all_participants = []
while True:
# тут мы получаем пользователей
# всех сразу мы получить не можем для этого нам и нужен offset
participants = client.invoke(GetParticipantsRequest(
chat_object, ChannelParticipantsSearch(''), offset, limit
))
# если пользователей не осталось, т.е мы собрали всех, выходим
if not participants.users:
break
all_participants.extend(['{} {}'.format(x.id, x.username)
for x in participants.users])
users_count = len(participants.users)
# увеличиваем offset на то кол-во юзеров которое мы собрали
offset += users_count
counter += users_count
print('{} users collected'.format(counter))
# не забываем делать задержку во избежания блокировки
sleep(2)
# сохраняем в файл
with open('users.txt', 'w') as file:
file.write('\n'.join(map(str, all_participants)))
是的,也许,我会附上我的脚本来处理这个任务,Github
我还将在此处附上代码和解释,以防存储库被删除:
我们进行必要的导入:
接下来,我们需要在这里创建一个帐户https://my.telegram.org并填写以下字段:
现在我们需要登录:
让我们开始收集用户,为此我们需要一个聊天 ID 和 access_hash,如文档中所述:
我们收到了聊天数据,还有待收集用户:
我们得到一本舒适的教科书,格式如下:
使用Telegram Client API,作为Telethon包装器
使用一个命令似乎
get.ChatMembers是不可能的,但是您可以使用变通方法,例如,如果您需要所有聊天参与者的列表,例如,手动将他们的昵称输入数据库,或者更好id,因为昵称不像id可以更改。您可以创建一个新聊天,并在用户加入时使用new_chat_members. 好吧,或者您可以创建一个自定义注册,以便参与者发送某种消息/reg,机器人会自动将它们添加到数据库中。Pavel Durmanov 提供的代码有效,但对于俄罗斯 IP,您需要使用代理: