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

使用Pyrogram发送消息报PEER_ID_INVALID错误如何解决

错误触发原因

PEER_ID_INVALID报错由以下几种情况导致,对应你代码里的问题:

  • username.txt内的内容格式不合法:存在空行、用户名带多余特殊字符/前缀、用户名本身不存在,Pyrogram无法识别为有效对话对象
  • 当前账号从未和目标用户/群聊产生过交互,Telegram风控限制账号向未接触过的对象主动发消息,直接返回ID无效
  • 原代码文件操作逻辑错误:以只读模式r打开文件却调用写入相关方法,无法正常更新待发送列表,读取到空值时直接传入发送接口就会触发报错
  • 异常捕获逻辑不全:仅捕获了频率限制类的PeerFlood错误,没有覆盖ID无效、用户名不存在等常见异常,遇到单个目标错误就会直接终止整个程序
修复后可运行代码
from pyrogram import Client
from pyrogram.errors import PeerFlood, PeerIdInvalid, UsernameNotOccupied, UserIsBlocked
import time

# 基础配置
API_ID = 12905662
API_HASH = "a7cfcd44cb95d26d7529d547c9a1d9ef"
SEND_INTERVAL = 5  # 发消息间隔,不建议低于3秒,极易触发风控
MESSAGE_CONTENT = 'q'
USERNAME_FILE = 'username.txt'

app = Client('my_accont11', API_ID, API_HASH)

def run_mass_send():
    # 提前读取并过滤无效行,自动去除用户名前多余的@
    with open(USERNAME_FILE, 'r', encoding='utf-8') as f:
        target_list = [line.strip().lstrip('@') for line in f.readlines() if line.strip()]
    
    success_count = 0
    fail_list = []

    for username in target_list:
        try:
            time.sleep(SEND_INTERVAL)
            # 发送前先解析目标peer,提前过滤无效对象
            target_peer = app.resolve_peer(username)
            app.send_message(target_peer, MESSAGE_CONTENT)
            success_count += 1
            print(f"[+] 成功发送给: @{username}")
        except PeerFlood:
            print("[!] 账号触发频率限制,已终止发送")
            break
        except (PeerIdInvalid, UsernameNotOccupied):
            print(f"[-] 目标无效: @{username},用户名不存在或未产生过交互")
            fail_list.append(username)
        except UserIsBlocked:
            print(f"[-] 目标已拉黑当前账号: @{username}")
            fail_list.append(username)
        except Exception as e:
            print(f"[-] 发送给@{username}失败: {str(e)}")
            fail_list.append(username)
    
    # 发送完成后更新文件,仅保留发送失败的目标供下次重试
    with open(USERNAME_FILE, 'w', encoding='utf-8') as f:
        for uname in fail_list:
            f.write(f"{uname}\n")
    
    print(f"\n任务结束: 成功发送{success_count}条,失败{len(fail_list)}条")

if __name__ == "__main__":
    input('按Enter键启动批量发送...')
    with app:
        run_mass_send()
关键修复说明
  • 提前过滤文件内空行,自动处理用户名多余前缀,从源头避免格式错误
  • 发送前调用app.resolve_peer()预解析目标ID,提前识别无效对象
  • 补全所有常见异常捕获逻辑,单个目标发送失败不会中断整个批量任务
  • 修复原代码错误的文件操作逻辑,发送完成后自动更新待发送列表,移除已成功发送的目标
  • 增加实时日志输出,可直观查看每个目标的发送状态

注意:如果确认用户名真实存在仍报PEER_ID_INVALID,先手动用当前账号给目标发1条消息产生交互,再运行脚本。Telegram对新号批量发陌生人消息的风控极严,间隔时间不要调得太短,否则很容易触发永久封号。

内容的提问来源于stack exchange,提问作者Николай Сероух

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.17 23:41:08