You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Telethon消息转发脚本实现多客户端分频道运行

实现每个频道对应独立客户端的Telethon脚本修改方案

核心思路

将原脚本的单客户端发送逻辑拆分为:一个专属客户端监听源频道,每个目标频道对应独立的客户端负责发送消息。需要为每个目标频道配置独立的客户端认证信息(session名、API密钥、Bot Token等),通过异步协程管理多个客户端同时运行。

修改后的完整代码

import asyncio
from telethon import TelegramClient, events
import copy

# 替换为你的源频道ID
SOURCE_CHANNEL_ID = 你的源频道ID

async def main():
    # 获取所有目标频道的配置(需确保每个频道包含客户端认证信息)
    channels = get_channels()
    
    # 建立「目标频道ID -> 对应客户端」的映射
    channel_clients = {}
    for channel in channels:
        # 为每个频道创建独立客户端
        client = TelegramClient(
            session=channel['session_name'],
            api_id=channel['api_id'],
            api_hash=channel['api_hash']
        )
        # 启动客户端(Bot账号用bot_token,用户账号则去掉bot_token参数,首次需扫码)
        await client.start(bot_token=channel['bot_token'])
        channel_clients[channel['channel_id']] = client
    
    # 初始化监听源频道的专属客户端
    listen_client = TelegramClient(
        session='listen_session',
        api_id=你的监听客户端API_ID,
        api_hash=你的监听客户端API_HASH
    )
    await listen_client.start(bot_token=你的监听客户端BotToken)
    
    # 源频道新消息监听逻辑
    @listen_client.on(events.NewMessage(chats=[SOURCE_CHANNEL_ID]))
    async def handler(event):
        replacements = get_replacements()
        msg_original = copy.copy(event.message.text)
        
        for channel in channels:
            target_id = channel['channel_id']
            target_client = channel_clients[target_id]
            
            # 执行当前频道的文本替换逻辑
            replacements_api = get_replacement(target_id, replacements)
            msg_processed = msg_original
            for rep_api in replacements_api:
                # 这里替换你的文本处理逻辑
                msg_processed = msg_processed.replace(rep_api['old_str'], rep_api['new_str'])
            
            # 使用专属客户端发送消息,添加异常处理避免单个客户端崩溃影响全局
            try:
                # 如果需要发送处理后的文本,替换message参数为msg_processed
                await target_client.send_message(target_id, message=event.message)
            except Exception as e:
                print(f"发送到频道{target_id}失败: {str(e)}")
    
    # 收集所有客户端的运行协程,同时启动
    running_tasks = [listen_client.run_until_disconnected()]
    running_tasks.extend([client.run_until_disconnected() for client in channel_clients.values()])
    
    await asyncio.gather(*running_tasks)

if __name__ == '__main__':
    asyncio.run(main())

关键修改说明

  1. 频道配置扩展
    需修改get_channels()返回的数据结构,每个频道条目必须包含客户端认证信息:

    # 示例返回格式
    [
        {
            "channel_id": 123456,
            "session_name": "bot_channel_1",  # 唯一的session文件名,避免冲突
            "api_id": 你的API_ID,
            "api_hash": "你的API_HASH",
            "bot_token": "12345:ABCDEF..."
        },
        # 其他目标频道...
    ]
    
  2. 多客户端管理

    • 用字典存储频道ID与对应客户端的映射,方便快速查找
    • 通过asyncio.gather同时运行所有客户端的run_until_disconnected协程,保证所有客户端在线
  3. 监听与发送分离
    保留一个独立客户端专门监听源频道,避免发送逻辑干扰监听稳定性

  4. 异常容错
    为发送逻辑添加try-except块,单个客户端发送失败不会导致整个脚本崩溃

内容的提问来源于stack exchange,提问作者Mamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:15:50