如何使用 Telegram Bot API 获取 Telegram 频道用户列表

Posted

技术标签:

【中文标题】如何使用 Telegram Bot API 获取 Telegram 频道用户列表【英文标题】:How to get Telegram channel users list with Telegram Bot API 【发布时间】:2016-02-23 23:31:27 【问题描述】:

任何人都可以告诉我如何从我的电报机器人中获取有关用户的信息。想象一下我的机器人在我的频道中的管理员用户中,我想获取我的频道用户列表或在新用户加入时引起注意。我怎样才能做到这一点。 Telegram 的文档非常杂乱无章。 到目前为止,我已经看过这些:

https://core.telegram.org/bots https://core.telegram.org/bots/api https://core.telegram.org/bots/samples https://core.telegram.org/bots/faq

但这些都没有真正的帮助。

【问题讨论】:

M.Shahrokhi,您是否找到任何支持 Bot API 的解决方案? 【参考方案1】:

为了获取用户列表,您需要使用电报API。

Telegram API 相当复杂。有些客户可以更快地完成工作。

对于python,有Telethon,获取频道用户的代码是:

from telethon import TelegramClient

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

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 = ****** # Your api_id
api_hash = '********************************' # Your api_hash
phone_number = '+989122594574' # Your phone number

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('tabe_eshgh')) # Your channel username

user = client(ResolveUsernameRequest('amir2b')) # 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
# param: (join, leave, invite, ban, unban, kick, unkick, promote, demote, info, settings, pinned, edit, delete)
filter = ChannelAdminLogEventsFilter(True, True, True, False, False, False, False, False, False, False, False, False, False, False)

result = client(GetAdminLogRequest(InputChannel(channel.chats[0].id, channel.chats[0].access_hash), '', 0, 0, 10, filter, admins))
##print(result)

for _user in result.users:
    ##print(_user.id)
    with open(''.join(['users/', str(_user.id)]), 'w') as f:
        f.write(str(_user.id))

【讨论】:

【参考方案2】:

正如其他人已经提到的,您不能通过 Bot API 列出频道用户。

但您可以使用MTProto API 以普通用户身份登录,并以编程方式访问您在桌面或移动应用程序中可以看到的所有内容。

要使用 MTProto,您需要使用现有的 Telegram 帐户和get credentials:api_idapi_hash 登录到 https://my.telegram.org/。

这是一个如何使用Telethon python 库获取电报频道/组用户列表的工作示例。

from telethon import TelegramClient, sync

api_id = 'FILL REAL VALUES HERE'
api_hash = 'FILL REAL VALUES HERE'

client = TelegramClient('xxx', api_id, api_hash).start()

# get all the channels that I can access
channels = d.entity.username: d.entity
            for d in client.get_dialogs()
            if d.is_channel

# choose the one that I want list users from
channel = channels[channel_name]

# get all the users and print them
for u in client.get_participants(channel):
    print(u.id, u.first_name, u.last_name, u.username)

使用client.get_entity(),可以很容易地通过姓名/电话/网址搜索频道/用户。

【讨论】:

TelegramClient('xxx', api_id, api_hash).start() ??中的“xxx”是什么 @LalitVavdara, xxx 是会话名称。它几乎可以是你喜欢的任何东西。 Telethon 将在当前目录中创建一个名为xxx.session 的会话存储文件。顺便说一句,这个文件实际上是一个 SQLite 数据库。 感谢您的回复,在发布了 2 年的答案后,我没想到会回复,顺便说一句,如果我创建一个新会话,将创建一个新文件,那么我可以删除旧文件吗?另外,如果我使用与上次会话相同的名称,那么它仍然需要我登录吗? 如果您使用相同的名称,则无需登录。如果您删除该文件,您将需要重新登录【参考方案3】:

为了获取用户列表,您需要使用电报 API。

Telegram API 相当复杂。有些客户可以更快地完成工作。

对于python,有Telethon,获取频道用户的方法是:

get_full_channel

【讨论】:

对于 php,我使用了 Madeline Proto 和这个 get_pwr_chat 函数:docs.madelineproto.xyz/docs/… hi.我们如何使用这种方法(get-full-channel)?我的意思是我无法访问此方法【参考方案4】:

Telegram bot 没有任何 API 可以访问频道或群组用户。 如果访问组用户对您很重要,我建议您使用 Telegram-CLI。您可以访问所有 Telegran 用户帐户的 API,因此您可以访问您群组的所有用户数据。

https://github.com/vysheng/tg

【讨论】:

【参考方案5】:

Bot 无法通过 api 访问频道用户列表。 实现这一目标有两种可能:

捕获所有频道消息并过滤“XXX 加入频道”一个 - 这是理论上的,我没有尝试 使用https://github.com/vysheng/tgl

【讨论】:

您能否详细说明使用github.com/vysheng/tgl 将如何回答这个问题?除了官方文档,我没有看到任何文档,我们已经确定不支持开箱即用的用户列表。 第一个理论解决方案不起作用。因为返回的更新对象中没有“XXX加入频道”信息。【参考方案6】:

Telegram Bot 不会保留有关您的用户的任何信息。您应该自己保存与您的机器人通信的所有用户。例如,将他们的 ID 存储在数据库中。

如果是频道 - 您可以从频道的成员列表中获取此信息。

如果您需要收到通知 - 您的机器人应该将用户存储在某处并检查用户是否是新用户。

【讨论】:

我同意,但是:在频道的情况下:Telegram Bot API 根本与频道管理无关。新闻(见:core.telegram.org/bots/api#recent-changes)是频道所有者可以添加(一个或多个)机器人作为频道管理员。在这种情况下,“admin bot”可以访问频道用户 ID。见:telegram.wiki/tips:channels @GiorgioRobino 现在 bot 只能访问组的消息,但 bot 无法访问组或频道用户(没有这样的 API),即使 bot 是管理员,他也没有'无权访问频道的消息。也许它是一个错误 是的。没有特定的 Bot API 来检索所有 ID(对于 1. Bot 订阅者来说,也没有对于 2. bot 作为频道管理员)。万一 1 机器人可以收集和存储 ID(如您所说)。情况 2:频道管理员机器人可以看到频道消息。如果你测试过这不是真的......(我还没有),所以我同意:这是一个错误......

以上是关于如何使用 Telegram Bot API 获取 Telegram 频道用户列表的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Telegram bot API 发送请求?

Telegram Bot - 如何获取群聊 ID?

如何通过 Telegram Bot API 在消息中发送嵌入图像和文本

在 python-telegram-bot 中如何获取该组的所有参与者?

node-telegram-bot-api 中的错误未找到模块:无法解析 node-telegram-bot-api 中的“fs”、“net”、“tls”

使用 Express、Socket.io 和 Node-Telegram-Bot-Api 结束 Mocha 测试