Python Telegram机器人运行报错AttributeError,请求修复方案
错误修复方案
核心错误原因及修复
1. AttributeError: 'builtin_function_or_method' object has no attribute 'random'
你代码里的导入语句是from random import random,这意味着你只导入了random模块中的random()函数,而非整个模块。此时变量名random指向的是这个函数,再调用random.random()自然会报错——函数没有random属性。
修复方式二选一:
- 方式1:导入整个random模块
import random
之后保持代码里的random.random()和random.randint()调用不变。
- 方式2:明确导入需要的函数
from random import random, randint
然后把代码中所有random.random()改成random(),random.randint()改成randint()。
2. 迭代器无法直接通过索引访问
app.iter_history()返回的是迭代器对象,不能直接用m[0]获取第一条消息,必须先转换成列表,同时建议增加非空判断避免索引越界:
m = list(app.iter_history("@WorldDogs_bot", 1)) if not m: print("未获取到消息,跳过本次操作") continue
3. 客户端连接时机错误
你在app.connect()之前就调用了startfunc(),此时客户端未建立连接,调用send_message、iter_history等方法都会失败;同时app.send_message("me", ...)放在app.disconnect()之后,客户端已断开,同样会出错。
推荐使用Pyrogram上下文管理器自动处理连接/断开:
把业务逻辑放在with app:代码块中,无需手动调用connect()和disconnect()。
可选:解决TgCrypto缺失警告
这个警告不影响功能,但会降低运行速度,安装依赖即可解决:
pip install pycryptodome tgcrypto
修复后的完整代码
import random from time import sleep from pyrogram import Client, filters api_id = 211623999 api_hash = '64df55d4b35v660cb64034ea5d79d559' app = Client("tymofii", api_id, api_hash) def startfunc(): target_id = "@WorldDogs_bot" planesamount = 5 i = 0 while i < planesamount: # 生成随机延迟 st = random.random() + random.randint(2, 4) app.send_message(target_id, "/start") sleep(st) app.send_message(target_id, "🌽 Ферма") st = random.random() + random.randint(2, 4) if st < 2.8: st = 3.14 sleep(st) # 转换迭代器为列表并判断非空 messages = list(app.iter_history(target_id, 1)) if not messages: print("未获取到消息,跳过本次循环") i += 1 continue print("Чекаем грибъ") messages[0].click(i) st = random.random() + random.randint(2, 4) if st < 2.8: st = 3.14 sleep(st) messages = list(app.iter_history(target_id, 1)) if not messages: print("未获取到消息,跳过本次循环") i += 1 continue grno = "🍄 Смертоносный Мухомор 🍄\n\nПлохой уход за этим грибочком приведёт к быстрой смерти смельчака, попытавшегося съесть даже маленький кусочек.\n\n" grno += "⏳ Поливать каждые 30 мин\n🍃 Каждая стадия роста длится 36 мин\n🍂 Умирает через 1 ч в сухом состоянии" if messages[0].text != grno: if len(messages[0].text) > 110: messages[0].click(1) st = random.random() + random.randint(2, 3) sleep(st) messages = list(app.iter_history(target_id, 1)) if messages: messages[0].click(0) st = random.random() + random.randint(2, 4) if st < 2.8: st = 3.14 sleep(st) i = i + 1 # 使用上下文管理器启动客户端 with app: startfunc() app.send_message("me", "userbot started!!")
内容的提问来源于stack exchange,提问作者Тимофій Таранович
相关产品推荐
相关产品推荐

