文章目录
- 一、使用 Python 搜索 Telegram
- 1.1. 第 1 步 - 设置代理
- 1.2. 第 2 步 - 安装 Telethon 库
- 1.3. 第 3 步 - 创建数据库文件并登录
- 1.4. 第 4 步 - 创建结果列表
- 1.5. 第 5 步 - 选择要搜索成员的组
- 1.6. 第 6 步 - 导出所有成员的详细信息
- 1.7. 第 7 步 - 将导出的数据存储到 .csv 文件中
一、使用 Python 搜索 Telegram
1.1. 第 1 步 - 设置代理
数据中心代理足以胜任 Telegram 搜索,因此本教程将继续使用数据中心代理。下面介绍如何验证数据中心 IP:
• 登录 Smartdaili 控制面板。
• 按左侧菜单上的 Datacenter,选择定价,然后选择适合您需求的最佳方案。
• 然后转到身份验证方法。对于数据中心代理,只有 user:pass 方法可用。
不要忘记更改地址、端口、用户名和密码值。
proxy = {'proxy_type': 'http', 'addr': '1.1.1.1', 'port': 5555, 'username': 'your_username', 'password': 'your_pass',
}
1.2. 第 2 步 - 安装 Telethon 库
Telethon 是 Python 3 MTProto 库,可与 Telegram API 配合使用。将其添加到您的代码中:
python pip install telethon
1.3. 第 3 步 - 创建数据库文件并登录
现在,我们需要从所选库中导入同步模型和步骤 1 中的凭证。不要忘记更改 api_id、api_hash、电话线和代理信息。
from telethon.sync import TelegramClient
api_id = 123456
api_hash = 'YOUR_API_HASH'
phone = '+111111111111'
TelegramClient(phone, api_id, api_hash, proxy={'proxy_type': python_socks.ProxyType.HTTP, 'addr': '1.1.1.1', 'port': 5555, 'username': 'your_username', 'password': 'your_pass'})
我们建议您再次登录 Telegram 帐户,检查是否已获得正确授权。如果没有,请申请一个 OTP 码并输入收到的代码:
client.connect()
if not client.is_user_authorized():client.send_code_request(phone)
client.sign_in(phone, input('Enter the code: '))
成功登录后,您会看到创建了一个 .session 类型的文件,这就是您的永久数据库文件。
1.4. 第 4 步 - 创建结果列表
现在需要创建一个空聊天列表,并将从 GetDialogsRequest 收到的信息填入其中。为此,您还需要添加 InputPeerEmpty 函数。下面是这部分代码的样子:
from telethon.tl.functions.messages import GetDialogsRequest
from telethon.tl.types import InputPeerEmpty
chats = []
last_date = None
chunk_size = 200
groups=[]result = client(GetDialogsRequest(offset_date=last_date,offset_id=0,offset_peer=InputPeerEmpty(),limit=chunk_size,hash = 0))
chats.extend(result.chats)
请注意,会话是使用 offset_date 和 offset_peer 过滤的。我们为这些参数提供空值,以便 API 返回所有聊天记录。我们还为分页设置了 offset_id 和 limit。在这种情况下,您最终会看到用户最近的 200 条聊天记录。
我们假设您只对巨型群组感兴趣,因此要检查此属性是否为真,请添加这部分代码:
for chat in chats:try:if chat.megagroup== True:groups.append(chat)except:Continue
当然,并非所有聊天都有一个超级群组。这就是例外部分能确保一切正常的原因。
1.5. 第 5 步 - 选择要搜索成员的组
现在,当你列出了所有的群组后,就可以选择要搜索成员详细信息的群组了。在运行过程中,代码会遍历上一步中存储的每个组,打印出每个组以数字开头的名称。这个数字就是组列表的索引。
print('Choose a group to scrape members from:')
i=0
for g in groups:print(str(i) + '- ' + g.title)i+=1
输入与特定组相关的编号作为索引:
g_index = input("Enter a Number: ")
target_group=groups[int(g_index)]
1.6. 第 6 步 - 导出所有成员的详细信息
要导出所选 Telegram 群组的所有成员,请使用 get_participants 函数创建一个空列表。
print('Fetching Members...')
all_participants = []
all_participants = client.get_participants(target_group, aggressive=True)
需要注意的是,如果将 aggressive 设置为 true,就有可能导出超过 10K 的群组成员。激活该参数后,Telethon 通常会导出列表中 90% 以上的联系人。
1.7. 第 7 步 - 将导出的数据存储到 .csv 文件中
最后,是时候将所有数据转换成可读性更强的格式以便进一步分析了。如果成员的用户名是非 ASCII 格式(这在 Telegram 用户中很常见,没有上限),我们将使用 UTF-8 编码。
因此,首先在写入模式下打开 .csv 文件,并命名文件头。然后,使用循环将所有参与者列表中的每个项目写入 CSV 文件。
print('Saving In file...')
with open("members.csv","w",encoding='UTF-8') as f:writer = csv.writer(f,delimiter=",",lineterminator="\n")writer.writerow(['username','user id', 'access hash','name','group', 'group id'])for user in all_participants:if user.username:username= user.usernameelse:username= ""if user.first_name:first_name= user.first_nameelse:first_name= ""if user.last_name:last_name= user.last_nameelse:last_name= ""name= (first_name + ' ' + last_name).strip()writer.writerow([username,user.id,user.access_hash,name,target_group.title, target_group.id])
print('Members scraped successfully.')
请注意,并非所有用户都有用户名、姓名或姓氏。没有用户名的用户将被命名为 “无”。
对于某些组,整个导出过程可能需要几分钟,但工作完成后,你应该会收到 “成员已成功清除 ”的提示。这样,你的工作就完成了!