Анализ истории чатов и поиск ключевых слов



Представьте, что у вас есть некий продукт, и вы хотите узнать, что люди пишут про него, и пишут ли вообще. Тогда вы начнёте писать код, который будет получать историю каждого чата, проверять каждое сообщение на вхождение ключевых слов. Вам также придётся написать сохранение найденных сообщений в файл, вы подумаете над форматом и скорее всего выберете JSON, т.к. он выглядит самым оптимальным для этой цели.

То, что я описал выше, делает код ниже. Он получает по 100 сообщений из каждой группы в списке chats и проверяет каждое сообщение на наличие одного из ключевых слов в списке words. И если найдено совпадение, результат записывается в JSON-файл.

Этот скрипт предназначен для автоматического поиска и сохранения сообщений из чатов, которые содержат определенные ключевые слова.

import asyncio
import json
from pyrogram import Client

api_id = 1111
api_hash = ""
chats = ['group1', 'group2', 'group3']
words = ['курс']

async def contains_keywords(message, keywords):
    """
    Возвращает словарь, где ключи - это слова, а значения - True или False
    в зависимости от того, найдено ли слово в сообщении.
    Если сообщение отсутствует, возвращает словарь с False для всех слов.
    """
    if message:
        return {word: word in message.lower() for word in keywords}
    return {word: False for word in keywords}
async def save_to_file(data, file, lock):
    """Асинхронная функция для сохранения данных в формате JSON"""
    async with lock:  # Ограничение на доступ к файлу
        json.dump(data, file, ensure_ascii=False, indent=4)
        file.write("\n")  # Разделяем записи новой строкой для удобства
    print("Сообщение сохранено в файл:", data)

def create_message_link(chat, message_id):

    """Синхронная функция для создания ссылки на сообщение"""

    return f"https://t.me/{chat}/{message_id}"

# Основная асинхронная функция для работы со скриптом
async def process_chat(app, chat, semaphore, file, lock):
    async with semaphore:  # Ограничиваем количество одновременных задач
        print(f"Проверка чата: {chat}")
        async for message in app.get_chat_history(chat, limit=100):
            keywords_found = await contains_keywords(message.text, words)
            if message.text and any(keywords_found.values()):
                message_link = create_message_link(chat, message.id)
                data = {
                    "Чат": chat,
                    "Найдена фраза": keywords_found,
                    "Отправитель": f"@{message.from_user.username}" if message.from_user else "Неизвестно",
                    "Дата отправки": str(message.date),
                    "Сообщение полностью": message.text,
                    "Ссылка на сообщение": message_link,
                }

                # Сохранение данных в файл
                await save_to_file(data, file, lock)
        print(f"Завершена обработка чата '{chat}'")

# Основная асинхронная функция для работы со скриптом
async def main():
    # Инициализация асинхронного клиента Pyrogram
    async with Client("my_session", api_id=api_id, api_hash=api_hash) as app:
        semaphore = asyncio.Semaphore(3)  # Ограничение на 3 одновременные задачи
        lock = asyncio.Lock()  # Блокировка для синхронизации записи в файл
        with open('saved_messages.txt', 'w', encoding='utf-8') as file:  # Открываем файл один раз
            # Создание списка задач
            tasks = [process_chat(app, chat, semaphore, file, lock) for chat in chats]
            # Запуск задач на конкурентное выполнение и ожидание их завершения
            await asyncio.gather(*tasks)
asyncio.run(main())

Вот пошаговое описание его работы:

В списке chats=[] перечислены названия чатов, которые нужно проверить, а в списке words=[] — ключевые слова для поиска в сообщениях.

Функция contains_keywords():

Функция проверяет, содержит ли сообщение заданные ключевые слова.

Если сообщение существует, функция возвращает словарь, где каждому слову из списка ключевых слов соответствует значение True (если слово найдено) или False (если не найдено).

Функция save_to_file():

Эта функция сохраняет переданные ей данные в файл.

Данные записываются в файл с именем saved_messages.txt.

Функция также выводит сообщение о сохранении данных в файл.

Функция create_message_link():

Генерирует ссылку на конкретное сообщение в чате, используя идентификатор чата и сообщения.

Главная функция main:

Это основная асинхронная функция, которая управляет процессом скрипта. Использует клиент Pyrogram для подключения к API Telegram. Перебирает список чатов и для каждого чата асинхронно получает до 100 последних сообщений.

Для каждого сообщения проверяет наличие ключевых слов с помощью функции contains_keywords(). Если ключевые слова найдены, собирает информацию о сообщении и сохраняет её в файл через функцию save_to_file().

Во избежание временной блокировки используется asyncio.Semaphore(3), для ограничения количества одновременно выполняемых задач.

asyncio.Lock(): исключит попытки одновременной записи данных в файл несколькими задачами.

Сценарии применения этого кода.

Код идеально подходит для мониторинга упоминаний бренда или продукта и анализа рыночных тенденций, что особенно важно для понимания общественного мнения и отслеживания текущих обсуждений в отрасли. Также это отличный инструмент для исследования маркетинговых и социологических данных, позволяя собирать отзывы и мнения о новых технологиях, продуктах или событиях.

Кроме того, этот сценарий можно использовать для конкурентного анализа и управления репутацией, отслеживая упоминания конкурентов и быстро реагируя на негативные отзывы или недоразумения, связанные с вашим брендом. Он также полезен для поддержки клиентов, позволяя выявлять и реагировать на проблемы или запросы, которые клиенты могут обсуждать в онлайн-чатах. Этот метод особенно ценен для бизнесов и исследователей, стремящихся автоматизировать сбор и анализ данных из текстовых источников в интернете.



Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: