@Artur18
Новичок

Пишу тг бота для отправки комментариев на pyrogram. Выдаёт ошибку,что делать?

from pyrogram import Client # телеграм клиент
import shelve # запись информации в файл
import random # для выбора случайного элеменита из списка
import time # для выбора случайного элеменита из списка


# Данные приложения телеграм (можно создать на my.telegram.org)
api_id = 183162
api_hash = "d89672a589c14e14129a713a01c86d0c"
phone_number = '+........' # телефонный номер аккаунта в телеграме
PUBLIC = 'tupogram' # паблик
# Варианты текстов сообщений
TEXTS = [
'Круто !',
'тоже так хочу ',
'5 баллов ',
]
COMMENT_EVERY_N = 1 # комментируем каждое N собщение
# если равно 1, комментируем каждое сообщение
# если равно 3, комментируем каждое третье
# если равно 5, комментируем каждое пятое ... итд

# список обработанных сообщений
processed_messages = shelve.open('processed_messages.db', # имя файла, куда писать
writeback=True)

# создаем клиент телеграма
app = Client("python_cyberpunk", api_id, api_hash,
phone_number=phone_number)

with app:
public = app.get_chat(PUBLIC) # ищем паблик по нику
chat = public.linked_chat # связанный чат обсуждений паблика

while True:
for msg in app.get_chat_history(chat.id, limit=100):
# фильтруем только авторепосты из паблика
if (msg.from_user is None # если сообщение не имеет автора
# и это репост из паблика (проверка по id)
and msg.forward_from_chat.id == public.id):
if msg.forward_from_message_id % COMMENT_EVERY_N != 0:
print(f'Пропускаем message_id={msg.message_id},'
f' так как комментируе каждое {COMMENT_EVERY_N}')
continue
# проверяем, есть ли в списке обработанных сообщений этот айди
# чтобы не комментировать по несколько раз один пост
if str(msg.forward_from_message_id) in processed_messages:
print(f'Пропускаем уже обработанное message_id={msg.message_id}')
continue
# пишем в список обработанных айди этого сообщения
processed_messages[str(msg.forward_from_message_id)] = True

print(f'Обработка message_id={msg.message_id}')

text = random.choice(TEXTS) # выбираем случайный текст из списка
app.send_message(chat.id, text, # отправляем текст в чат
reply_to_message_id=msg.message_id) # как ответ на сообщение с постом

# для того, чтоб не оставлять больше одного коммента за 5 минут
break # выходим из перебора сообщений, если оставили коммент

print('Ставим на паузу')
time.sleep(60 * 5)

Выдаёт ошибку: if (msg.from_user is Nine and msg.forward_from_chat.id == public.id):
AttributeError: ‘NoneType’ object has no attribute ‘I’d’

Помогите пожалуйста!Спасибо
  • Вопрос задан
  • 466 просмотров
Решения вопроса 1
В такой каше сложно разобраться. Но если я правильно понимаю, ты пытаешься проверить несуществующий атрибут:
Выдаёт ошибку: if (msg.from_user is None and msg.forward_from_chat.id == public.id):
AttributeError: ‘NoneType’ object has no attribute ‘I’d’

Из твоего кода:
if (msg.from_user is None) # если сообщение не имеет автора
# и это репост из паблика (проверка по id)


Это так не работает. Если нет автора, то такого атрибута нет вообще, эта часть не работает. Вот тебе пример на Pyrogram как из сообщения вытащить ID.
any_sender_id = message.from_user.id if message.from_user else message.sender_chat.id #вытаскиваем ID
if any_sender_id == public.id: #проверяем что это нужный паблик
    #дальше твоя логика

Если сообщение "from_user", значит принимает его ID. Иначе - принимает ID чата/канала.

этот же код чуть понятнее:
any_sender_id = None    #объявляем переменную для хранения ID
if message.from_user:    #если у нас есть параметр from_user
    any_sender_id = message.from_user.id    #присваеваем ID юзера
else:    #иначе
    any_sender_id = message.sender_chat.id    #присваеваем ID канала или чата

if any_sender_id == public.id:    #проверяем что это нужный паблик
    #дальше твоя логика
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы