AVRIL_START_JANCOKALIVEAVRIL_END_JANCOK Interactive Terminal

Command Executor

TG-getnamelist – town
town
    Uncategorized 尚无浏览 2 分钟阅读

    TG-getnamelist

    import os
    import csv
    import datetime
    from telethon import TelegramClient
    from dotenv import load_dotenv

    # === 1. 读取配置   获取频道群组信息 ===
    load_dotenv()

    API_ID = os.getenv(“API_ID”)
    API_HASH = os.getenv(“API_HASH”)
    PHONE_NUMBER = os.getenv(“PHONE_NUMBER”)
    TWO_STEP_PASSWORD = os.getenv(“TWO_STEP_PASSWORD”)

    if not API_ID or not API_HASH:
    print(“❌ 错误: 请确保 .env 文件中配置了 API_ID 和 API_HASH”)
    exit(1)

    client = TelegramClient(‘session/user_session’, int(API_ID), API_HASH)

    def get_bot_api_id(entity, entity_type):
    “””
    根据实体类型将 Telethon ID 转换为 Bot API ID
    Bot API 规则:
    – 频道/超级群: -100 + ID
    – 普通小群: – + ID
    – 用户: ID (不变)
    “””
    raw_id = entity.id
    if entity_type in [“频道”, “超级群”, “频道(未知)”]:
    return int(f”-100{raw_id}”)
    elif entity_type == “普通群”:
    return int(f”-{raw_id}”)
    else:
    return raw_id

    async def list_and_export_chats():
    “””列出并导出账号加入的所有频道和群组”””
    print(“📃 正在获取对话列表,请稍候…”)

    chat_data_list = []

    async for dialog in client.iter_dialogs():
    entity = dialog.entity
    entity_type = “未知”

    # — 分类逻辑 —
    if dialog.is_user:
    entity_type = “私聊”
    elif dialog.is_channel:
    if getattr(entity, ‘broadcast’, False):
    entity_type = “频道”
    elif getattr(entity, ‘megagroup’, False):
    entity_type = “超级群”
    else:
    entity_type = “频道(未知)”
    elif dialog.is_group:
    entity_type = “普通群”

    # 过滤掉私聊 (如果需要私聊ID,注释掉下面这行)
    if entity_type != “私聊”:
    # 获取两种格式的 ID
    raw_id = entity.id
    bot_api_id = get_bot_api_id(entity, entity_type)

    chat_info = {
    “类型”: entity_type,
    “名称”: dialog.name,
    “Bot_API_ID”: bot_api_id, # ✅ 新增:可以直接给 Bot 用的 ID
    “原始_ID”: raw_id, # Telethon 用的原始 ID
    “用户名”: getattr(entity, ‘username’, ‘无’) or ‘无’,
    “成员数”: getattr(entity, ‘participants_count’, ‘未知’)
    }
    chat_data_list.append(chat_info)

    print(f”[{entity_type}] {dialog.name} | Bot_ID: {bot_api_id}”)

    # === 导出到 CSV 文件 ===
    if chat_data_list:
    # — 文件夹处理逻辑 —
    folder_name = “namelist”
    if not os.path.exists(folder_name):
    os.makedirs(folder_name)
    print(f”📁 已自动创建文件夹: {folder_name}”)

    timestamp = datetime.datetime.now().strftime(“%Y%m%d_%H%M%S”)
    filename = f”telegram_chats_{timestamp}.csv”

    # 使用 os.path.join 确保跨平台兼容性
    file_path = os.path.join(folder_name, filename)

    # 更新表头
    headers = [“类型”, “名称”, “Bot_API_ID”, “原始_ID”, “用户名”, “成员数”]

    try:
    with open(file_path, mode=’w’, encoding=’utf-8-sig’, newline=”) as f:
    writer = csv.DictWriter(f, fieldnames=headers)
    writer.writeheader()
    writer.writerows(chat_data_list)

    print(“-” * 50)
    print(f”✅ 成功!共导出 {len(chat_data_list)} 个群组/频道。”)
    print(f”📁 文件已保存到: {os.path.abspath(file_path)}”)

    except Exception as e:
    print(f”❌ 导出文件失败: {e}”)
    else:
    print(“⚠️ 未找到任何群组或频道。”)

    async def main():
    await client.start(phone=PHONE_NUMBER, password=TWO_STEP_PASSWORD)
    print(“✅ 登录成功”)
    await list_and_export_chats()

    if __name__ == “__main__”:
    with client:
    client.loop.run_until_complete(main())

    0

    1. 此文章尚无评论

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注