Исходник Пример парсера новых тем в разделе

uqowivad

Известный
Автор темы
12
3
BlastHack | Парсим тред форума

Зависимости: pip install requests beautifulsoup4
Не знаю хайпится сейчас или нет дрочка за "ЛО", но вот пример кода который будет парсить тред который вы укажете, и выдавать новые темы с возможностью последовательного ответа
Учтите, что это лишь пример кода.
Хочу сказать спасибо единственному открытому апи на форуме: шитти
А так-же антону лемонагеру за то что выдержал негатив
Если будет актуально, доделаю код, перенесу всё в тг​
Python:
import requests
from bs4 import BeautifulSoup
import json
import traceback

# раздела форума
url = "https://www.blast.hk/forums/110/"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}

DATA_FILE = "forum_topics.json"


class ParseTokenError(Exception):
    pass

class Forum:
    def __init__(self, login, password):
        self.session = requests.Session()
        self.login = login
        self.password = password
        self.token = ""

    def update_token(self):
        try:
            r = self.session.get("https://www.blast.hk/", headers=headers)
            r.raise_for_status()
            soup = BeautifulSoup(r.text, "html.parser")
            token = soup.find("input", {"name": "_xfToken"})
            if token is None:
                raise ParseTokenError("Не удалось найти токен.")
            self.token = token["value"]
        except Exception as e:
            print(f"Ошибка при обновлении токена: {e}")
            traceback.print_exc()

    def authenticate(self):
        try:
            self.update_token()
            r = self.session.post("https://www.blast.hk/login/login", data={
                "login": self.login,
                "password": self.password,
                "remember": 1,
                "_xfRedirect": "https://www.blast.hk/",
                "_xfToken": self.token
            })
            if "Некорректный пароль" in r.text:
                print("Ошибка: Некорректный пароль.")
                return False
            self.id = self.session.cookies.get("xf_user", "").split("%")[0]
            print("Авторизация успешна.")
            return True
        except Exception as e:
            print(f"Ошибка авторизации: {e}")
            traceback.print_exc()
            return False

    def post_reply(self, thread_url, message):
        try:
            self.update_token()  # Обновление токена перед запросом
            thread_id = thread_url.split("/")[-2]  # Извлекаем ID темы из URL
            reply_url = f"https://www.blast.hk/threads/{thread_id}/add-reply"
            data = {
                "message_html": message,
                "_xfToken": self.token,
                "_xfResponseType": "json",
            }
            r = self.session.post(reply_url, data=data, headers=headers)

            if r.status_code == 200:
                print(f"Сообщение успешно отправлено в тему: {thread_url}")
            else:
                print(f"Ошибка отправки сообщения: {r.status_code}")
                print("Ответ сервера:", r.text)  # Отладочная информация
        except Exception as e:
            print(f"Ошибка при добавлении ответа: {e}")


def fetch_forum_topics(session, url):
    try:
        response = session.get(url, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, "html.parser")

        # Поиск тем на странице
        topics = soup.find_all("div", class_="structItem")
        data = []
        for topic in topics:
            # Пропуск закреплённых тем
            if topic.find("i", class_="structItem-status--sticky"):
                continue

            title_element = topic.find("div", class_="structItem-title").find("a")
            if not title_element:
                continue

            title = title_element.get_text(strip=True)  # Название темы
            link = "https://www.blast.hk" + title_element["href"]  # Ссылка на тему

            # Проверка, чтобы ссылка вела на тему, а не на фильтр
            if "/threads/" not in link:
                continue

            author = topic.find("a", class_="username").get_text(strip=True)  # Автор темы

            data.append({"title": title, "link": link, "author": author})
        return data

    except Exception as e:
        print(f"Ошибка при парсинге: {e}")
        return []


def load_previous_topics(file):
    try:
        with open(file, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return []
    except json.JSONDecodeError:
        return []


def save_topics(file, topics):
    with open(file, "w", encoding="utf-8") as f:
        json.dump(topics, f, ensure_ascii=False, indent=4)


def find_new_topics(old_topics, current_topics):
    old_links = {topic["link"] for topic in old_topics}
    new_topics = [topic for topic in current_topics if topic["link"] not in old_links]
    return new_topics


def main():
    login = input("Введите логин: ").strip()
    password = input("Введите пароль: ").strip()

    forum = Forum(login, password)
    if not forum.authenticate():
        print("Не удалось авторизоваться.")
        return

    previous_topics = load_previous_topics(DATA_FILE)
    current_topics = fetch_forum_topics(forum.session, url)

    print("Все текущие темы:")
    for topic in current_topics:
        print(f"Название: {topic['title']} | Автор: {topic['author']} | Ссылка: {topic['link']}")

    new_topics = find_new_topics(previous_topics, current_topics)

    save_topics(DATA_FILE, current_topics)

    if new_topics:
        print("\nНайдены новые темы:")
        for topic in new_topics:
            print(f"Название: {topic['title']} | Автор: {topic['author']} | Ссылка: {topic['link']}")
            reply = input(f"Хотите отправить ответ в тему \"{topic['title']}\"? (y/n): ").strip().lower()
            if reply == "y":
                message = input("Введите текст сообщения: ").strip()
                try:
                    forum.post_reply(topic["link"], message)
                except Exception as e:
                    print(f"Ошибка при отправке ответа: {e}")
    else:
        print("\nНовых тем нет.")

if __name__ == "__main__":
    main()=
 

АнрдюхаБля

Участник
25
6
1732636285601.png

А что скажет на это твой скрипт?