@Igor53

Телеграмм БОТ граббер на python как доработать?

Есть код:

import shelve
import time

from pyrogram import Client, filters
from pyrogram.errors import RPCError
from pyrogram.types import Message
from config import API_ID, API_HASH, PHONE_NUMBER, PUBLIC_FROM, PUBLIC_TO
#========================================================================
db = shelve.open('data.db', writeback=True)
bot = Client('RepBot', API_ID, API_HASH, phone_number=PHONE_NUMBER)
local_time = time.localtime()
print("ReprBot - Запущен", local_time.tm_hour, ":", local_time.tm_min)
#========================================================================
def save_post(message: Message) -> str:
    post_id = f'{message.chat.id}_{message.chat.id}' 
    db[post_id] = {
        'username': message.chat.username,
        'message.chat.id': message.chat.id
    }
    return post_id
#========================================================================
@bot.on_message(filters.chat(PUBLIC_FROM))
def new_channel_post(_: Client, msg: Message) -> None:
    post_id = save_post(msg)
    local_time = time.localtime() #Время поста
    print(f'Новый пост в группе({msg.sender_chat.username or msg.sender_chat.id})' ' Время:', local_time.tm_hour, ":", local_time.tm_min, ":", local_time.tm_sec)
#========================================================================
    try:
        msg.copy(PUBLIC_TO)
    except RPCError:
        print('Не удалось переслать пост:', post_id)   
if __name__ == '__main__':
    bot.run()

Бот автоматически собирает посты из каналов доноров и кидает в мой, но:
1. URL и прочие ссылки он также переносит - как мне ИЗМЕНЯТЬ эти ссылки на нужные или просто их удалять?
2.У некоторых (многих) каналов есть защита - с этих каналов как будто валится сразу 2-3 ОДИНАКОВЫХ поста, соответственно репостер их тоже размещает. Как с этим бороться и делать только 1 пост без повторов?
  • Вопрос задан
  • 1096 просмотров
Пригласить эксперта
Ответы на вопрос 2
Думаю Вам нужно что то вроде этого

import shelve
import time
import re
from pyrogram import Client, filters
from pyrogram.errors import RPCError
from pyrogram.types import Message
from bs4 import BeautifulSoup
from config import API_ID, API_HASH, PHONE_NUMBER, PUBLIC_FROM, PUBLIC_TO

db = shelve.open('data.db', writeback=True)
bot = Client('RepBot', API_ID, API_HASH, phone_number=PHONE_NUMBER)
local_time = time.localtime()
print("ReprBot - Запущен", local_time.tm_hour, ":", local_time.tm_min)

# Create a set to store seen message ids
seen_messages = set()

def save_post(message: Message) -> str:
    post_id = f'{message.chat.id}_{message.message_id}'
    db[post_id] = {
        'username': message.chat.username,
        'message_id': message.message_id
    }
    return post_id

def remove_links(text: str) -> str:
    soup = BeautifulSoup(text, 'lxml')
    for link in soup.find_all('a'):
        link.decompose()
    return soup.get_text()

@bot.on_message(filters.chat(PUBLIC_FROM))
def new_channel_post(_: Client, msg: Message) -> None:
    if msg.message_id in seen_messages:
        return
    else:
        seen_messages.add(msg.message_id)
    post_id = save_post(msg)
    local_time = time.localtime()
    print(f'Новый пост в группе({msg.sender_chat.username or msg.sender_chat.id})' ' Время:', local_time.tm_hour, ":", local_time.tm_min, ":", local_time.tm_sec)
    text = msg.text or msg.caption
    # Remove links from text
    text = remove_links(text)
    text = re.sub(r'https?:\/\/\S+', '', text)
    try:
        bot.send_message(chat_id=PUBLIC_TO, text=text)
    except RPCError:
        print('Не удалось переслать пост:', post_id)

if __name__ == '__main__':
    bot.run()

Этот код изменяет исходный скрипт путем:

1. Добавление набора под названием seen_messages для хранения идентификаторов сообщений, которые уже были просмотрены и размещены повторно.

2. Добавление проверки в начале функции new_channel_post, чтобы увидеть, находится ли идентификатор сообщения текущей записи в наборе seen_messages.
Если это так, функция возвращает и не перепечатывает сообщение.
Если его нет в наборе, идентификатор сообщения добавляется в набор, и процесс повторной отправки продолжается.

3. Добавление функции remove_links(text: str) -> str, которая использует библиотеку BeautifulSoup для анализа текста и удаления из него всех ссылок.

4. Использование функции remove_links для удаления ссылок из текста или заголовка поста перед репостом.

5. Использование модуля re для удаления всех оставшихся ссылок в тексте перед репостом.

Это только пример кода и логики, здесь могут быть ошибки, проверьте все и в случае чего переделайте под свои нужды
Ответ написан
@Igor53 Автор вопроса
ЭТО не рабочий метод для отсеивания post_id т.к. пост {message.chat.id}_{message.message_id} от канала всегда одинаковый и если мы его будем отсеивать то не получим БОЛЬШЕ постов c 'этого канала.
Вот пример print(post_id):
Новый пост в группе(***): id=-1001006147755_-1001006147755
Новый пост в группе(***): id=-1001006147755_-1001006147755 1111 :: 4242 :: 33
Новый пост в группе(***): id=-1001006147755_-1001006147755 11 : 42 : 17

Нужно сделать так: после 1 поста не постить отсюда ничего 2 минуты.?!
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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