如何使用Telethon无需机器人复制Telegram频道?
Telegram频道消息迁移实现方案
完整实现代码
from telethon import TelegramClient from telethon.tl.types import MessageMediaPhoto, MessageMediaDocument import asyncio # 替换成你的Telegram开发者API信息 api_id = 19... api_hash = '9c1aa....' # 替换成源频道和目标频道的用户名(带@)或ID SOURCE_CHANNEL = '@source_channel' TARGET_CHANNEL = '@your_target_channel' async def migrate_messages(): async with TelegramClient('anon', api_id, api_hash) as client: # 获取频道实体对象(Telethon操作频道的必要步骤) source_entity = await client.get_entity(SOURCE_CHANNEL) target_entity = await client.get_entity(TARGET_CHANNEL) # 从最早到最新遍历源频道消息(reverse=True保证顺序) async for message in client.iter_messages(source_entity, reverse=True): # 跳过无内容的系统通知类消息 if not message.text and not message.media: continue try: # 根据消息类型分别处理 if message.text: # 发送纯文本消息,发送者为你的账号,不保留原作者 await client.send_message(target_entity, message.text) elif isinstance(message.media, MessageMediaPhoto): # 发送图片,附带原消息的说明文字 await client.send_file(target_entity, message.media.photo, caption=message.text) elif isinstance(message.media, MessageMediaDocument): # 发送文件(视频、音频、文档等),附带说明文字 await client.send_file(target_entity, message.media.document, caption=message.text) # 限流防封禁,每发一条歇1秒 await asyncio.sleep(1) print(f"已迁移消息ID: {message.id}") except Exception as e: print(f"迁移消息ID {message.id} 失败: {str(e)}") if __name__ == '__main__': asyncio.run(migrate_messages())
关键细节解释
- 异步结构修正:原代码把
send_message放在client.start()之前是错误的,这里用async with自动管理客户端的连接与断开,符合Telethon异步框架的要求。 - 频道实体获取:通过
get_entity将频道的用户名/ID转换为Telethon可识别的操作对象,这是操作频道的前提。 - 顺序保证:
iter_messages的reverse=True参数会从频道最早的消息开始遍历迁移,确保消息顺序和原频道完全一致。 - 去原作者标识:所有消息都是通过你的客户端账号重新发送,而非转发,因此不会保留原作者的任何标识。
- 多类型消息兼容:分别处理文本、图片、文件类消息,覆盖绝大多数频道内容场景。
- 限流处理:添加1秒间隔避免短时间内大量请求触发Telegram的频率限制,防止账号被临时封禁。
使用前准备
- 替换代码中的
api_id和api_hash为你从my.telegram.org获取的开发者信息。 - 替换
SOURCE_CHANNEL和TARGET_CHANNEL为实际的频道用户名(带@前缀)或频道ID。 - 确保你的账号有权限访问源频道(私有频道需先加入),且是目标频道的管理员(有权发布内容)。
内容的提问来源于stack exchange,提问作者meiremix
相关产品推荐
相关产品推荐

