Как получить всех пользователей в частном канале телеграммы с помощью телетона? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь получить список пользователей, использующих телетон, в частном канале телеграммы, для которого я являюсь администратором, и распечатать его на консоли. Я пробовал тот же код с не частным каналом, и у меня те же проблемы.

Какую ссылку на имя пользователя я должен использовать? Я не понимаю, если это мое имя пользователя телеграммы, название моего канала, мое, как будто я должен был говорить на канале, или что. Может ли кто-нибудь помочь?

  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 = XXXX# Use your own values here. https://my.telegram.org
   api_hash = 'XXX'
   phone_number = 'XXXX'

   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('Jimtest')) # Your channel username --is this the username of my channel? how do I get the right value for this?   It isays username, but seems to reference the channel name?

user = client(ResolveUsernameRequest('@jim')) # what is this value? my username? my "name" in the chat?  the username that outputs when I type as admin in the chat?
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, 0))
 for _user in result.users:
  print(_user.id)

Я получаю следующие ошибки, которые выглядят как проблемы с каналом или именами пользователей? Какими должны быть эти значения?

Traceback (most recent call last):
 File "./maybework.py", line 33, in <module>
    user = client(ResolveUsernameRequest('Jimtest')) # Your channel admin 
username
  File "/usr/local/lib/python3.6/dist- 
   packages/telethon/telegram_bare_client.py", line 459, in __call__
    result = self._invoke(call_receive, *requests)
  File "/usr/local/lib/python3.6/dist- 
   packages/telethon/telegram_bare_client.py", line 551, in _invoke
    raise next(x.rpc_error for x in requests if x.rpc_error)
telethon.errors.rpc_error_list.UsernameNotOccupiedError: The username is not in use by anyone else yet

Как только я исправил эту ошибку или, по крайней мере, не получил ошибку, я получил эту ошибку в следующую.

Traceback (most recent call last):
  File "./maybework.py", line 33, in <module>
     user = client(ResolveUsernameRequest('jimtest')) # Your channel admin 
 username
   File "/usr/local/lib/python3.6/dist- 
packages/telethon/telegram_bare_client.py", line 459, in __call__
     result = self._invoke(call_receive, *requests)
   File "/usr/local/lib/python3.6/dist- 
 packages/telethon/telegram_bare_client.py", line 551, in _invoke
      raise next(x.rpc_error for x in requests if x.rpc_error)
 telethon.errors.rpc_error_list.UsernameNotOccupiedError: The username is not in use by anyone else yet

1 Ответ

0 голосов
/ 12 мая 2018

вы можете использовать этот код в Telethon V 0.19

from telethon import TelegramClient
import socks

from telethon.tl.functions.channels import GetParticipantsRequest

api_id = XXXX
api_hash = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
phone_number = '+98XXXXXXXX'

################################################
# invite link for private channel
inveite_link='telegram.me/joinchat/AAAAAE84o7DErer_YqAohQ'
################################################
proxy_ip = 'YY.YY.YY.YY'
proxy_username = 'proxy_username'
proxy_password = 'proxy_password'
proxy_port = 123456
################################################

client = TelegramClient('session_name',
                    api_id,
                    api_hash,
                    proxy=(socks.HTTP, proxy_ip, int(proxy_port), 
None, proxy_username, proxy_password))

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



channel = client.get_entity(inveite_link)

offset = 0
limit = 100

while True:
    participants = client(GetParticipantsRequest(
        channel, channel, offset, limit,hash=0))
    if not participants.users:
        break
    for _user in participants.users:
        print('user : ', _user.id, _user.username)
        # save User info to Database
    offset += len(participants.users)
  • Я использовал носки. Если вы не хотите использовать носки, то снимите его

  • Поскольку у частных каналов нет имени пользователя, я использовал invite link

  • Вы также можете использовать 101 channel ID вместо invite link. В этом случае вы должны использовать channel = client.get_entity(PeerChannel(channel_id)) вместо 101 channel = client.get_entity(inveite_link)

...