Автоматизация Телеграм (нейрокомментинг/граббер постов)
Доброго времени дня всем. Проблема такая: написал 2 программы с помощью библиотеки pyrogram, которые должны автоматически комментировать посты в выбранных пабликах, а так же репостить посты из нужного паблика в паблик прокладку, откуда уже с помощью команды можно сделать репост из паблика 1, через прокладку 2, в паблик 3.
Все отлично работает для пабликов с маленьким количеством подписчиков (меньше 100), а вот на паблики с большим количеством подписчиков - программы не реагируют никак. В коде я обращаюсь к id-сообщению, если паблик в телеграме маленький, то id сообщения небольшое значение имеет (например: 10, 15, 56), а вот у больших пабликов - видимо либо слишком большие значения id.
Код программы для нейрокомментинга:
from time import sleep
from pyrogram import Client, idle, filters
from pyrogram.types import Message
from datetime import datetime as DT
from pyrogram.handlers import MessageHandler
from keys import *
from gpt_comm import get_neuro_comment
import asyncio
target_channels = [#id пабликов (в формате -1001844702414)]
# print(f'Приложение стартовало{DT.now()}')
client = Client('new_session_ft', api_id_fh, api_hash_ft)
async def my_handler(client: Client, message: Message):
try:
if message.chat.id in target_channels:
print(f'{message.id}')
print(f'{DT.now().strftime("%d.%m %H:%M:%S")} Новый пост в паблике "{message.chat.title}"')
await asyncio.sleep(5)
last_message = await client.get_discussion_message(message.chat.id, message.id)
if last_message:
print(f'Получено сообщение: {last_message.text or last_message.caption}')
else:
print('Сообщение не получено')
text_content = last_message.text if last_message.text else last_message.caption
if text_content:
comment_to_post = await get_neuro_comment(text_content.replace('\n', ''))
else:
comment_to_post = "Прикольное)"
await last_message.reply(comment_to_post)
print(
f'{DT.now().strftime("%d.%m %H:%M:%S")} Комментарий в паблике "{message.chat.title}" оставлен: {comment_to_post}')
except Exception as e:
print(f'Ошибка при обработке сообщения: {e}')
for channel_id in target_channels:
client.add_handler(MessageHandler(my_handler, filters.chat(channel_id)))
client.start()
idle()
Для создания комментариев используется отдельный код для генерации ответа, на основании самого поста (from gpt_comm import get_neuro_comment)
Код для автоматического репоста:
from pyrogram import Client, filters
import shelve
from keys import *
db = shelve.open('data.db', writeback=True)
priv_publ = 'public1' #тестовый 1, паблик для управления ботом
public_public = 'public2' #тестовый 3, сюда выкладываю
source_public = [''] #отсюда беру паблики
app = Client('session', api_id, api_hash)
@app.on_message(filters.chat(source_public))
def new_channel_post(client, message):
post_id = add_post_to_db(message)
message.forward(priv_publ)
client.send_message(priv_publ, post_id)
def add_post_to_db(message):
try:
new_id = max(int(k) for k in db.keys()
if k.isdigit()) + 1
except:
new_id = 1
db[str(new_id)] = {
'username': message.chat.username,
'message_id': message.id,
}
return new_id
@app.on_message(filters.chat(priv_publ) & filters.regex(r'\d+\+'))
def post_request(client, message):
post_id = str(message.text).strip('+')
post = db.get(post_id)
if post is None:
client.send_message(priv_publ, 'error no post in db')
return
try:
msg = client.get_messages(post['username'], post['message_id'])
msg.copy(public_public)
client.send_message(priv_publ, 'success')
except Exception as e:
client.send_message(priv_publ, f'error {e}')
if __name__ == '__main__':
print('its run')
app.run()
Проблема в том, что эти 2 кода полностью и нормально работают на паблики с небольшим количеством пабликов (и нейрокомментинг и автоматический репост), но если у паблика много подписчиков - код не реагирует никак. Это проблема в библиотеке pyrogram? Или это как-то сам Telegram на уровне API блокирует такие действия для больших пабликов? И можно ли реализовать подобные идеи с помощью других библиотек aiogram/telethon?