Можно ли заставить бота отправлять сообщения на основе веб-сайта?

#python #discord #discord.py #bots

Вопрос:

Что я хочу сделать, так это каждый раз, когда на веб-сайте появляется что-то новое, мой бот discord просто отправляет сообщение со словами «Эй, там есть что-то новое». Например, есть книжный сайт, и они загружают новое сообщение о книгах и его описание, и мой бот просто берет текст из этого сообщения онлайн и отправляет его на мой сервер discord. Надеюсь, это было достаточно ясно. Здесь у меня есть мой базовый код бота discord, выполненный на Python 3.9

 import discord 
from discord.ext import commands

client = commands.Bot(command_prefix = '!')

@client.event 
async def on_ready():
    print("Bot is working.")

client.run('not today')
 

Комментарии:

1. Вы можете использовать это для запуска задачи каждые x, чтобы проверить, изменилось ли содержимое сайта. Фактическая проверка зависит от вас

2. Я думаю, что большая проблема заключается в прослушивании изменений на веб-сайте, и я вижу две альтернативы: если у вас есть доступ для изменения веб-сайта для прослушивания, вы можете интегрировать этот веб-сайт с какой-либо службой, такой как IFTTT . С другой стороны, если у вас нет доступа для изменения веб-сайта, вы можете создать какую-либо услугу, используя BeautifulSoup , для анализа html/xml-кода веб-сайта и поиска способа идентификации нового контента или чего-либо еще, что вы хотите, но таким образом это действительно сложно. Чтобы создать доверительный прослушиватель/уведомитель, вы должны контролировать обе части.

3. Я думаю, что больше информации о том, являетесь ли вы владельцем веб-сайта или нет, потому что если вы им владеете, то это проще. Если нет, то возможны два предыдущих комментария (чтобы проверить, менялось ли содержимое веб-сайта каждые x секунд, используя задачи в discord.py

Ответ №1:

Для получения более подробной информации я бы предложил ознакомиться с документацией по discord.ext.tasks модулю, которая позволяет запускать фоновые задачи для вашего бота. Это особенно удобно для более персонализированной реализации фреймворка.

Эти две части проблемы не слишком сложны:

  1. Создайте веб-скребок, который проверяет наличие обновлений в HTML-файле страницы
  2. Создайте фоновую задачу, в которой используется указанный веб-скребок.

Создайте веб — скребок

Пакеты, используемые для очистки веб-страниц, полностью соответствуют желаниям/потребностям разработчика. Поскольку discord.py используется asyncio , вы должны использовать асинхронный синтаксический анализатор, например aiohttp , или requests-html в отличие от urllib или requests , которые блокируют.

С AIOHTTP

 import aiohttp

RECENT_HTML = ""

async def download_webpage():
    async with aiohttp.ClientSession() as session:
        async with session.get("<url>") as response:
            if response.status != 200:
                # Notify users that the website could not be scraped

            html = await response.text()
            if html != RECENT_HTML:
                # Notify users of changes within the website
                # An HTML parser could be used to identify specific changes within the HTML
                # Or you could just tell the members that a change occurred.
            RECENT_HTML = html
 

download_webpage() Эта сопрограмма создает сеанс для загрузки веб "<url>" -страницы (замените фактическим URL-адресом веб-сайта, а затем просто проверяет, изменилась ли веб-страница или нет, сравнивая HTML-страницу с RECENT_HTML . RECENT_HTML просто хранит самую последнюю версию HTML, которая была удалена, для сравнения. HTML-код для проверки не обязательно должен храниться в виде переменной, например, его можно записать в файл.

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

Наконец, в переменной сохраняется свежая копия HTML-страницы (или, как бы то ни было, хранится самая последняя версия HTML).

С запросами-HTML

 from requests_html import AsyncHTMLSession

RECENT_HTML = ""

async def download_webpage():
    asession = AsyncHTMLSession()
    response = await asession.get("<url>")
    if response.status_code != 200:
        # Notify users that the website could not be scraped
    
    html = response.html.text
    if html != RECENT_HTML:
        # Notify users of changes within the website
        # An HTML parser could be used to identify specific changes within the HTML
        # Or you could just tell the members that a change occurred.
    RECENT_HTML = html
 

Создание фоновой задачи

discord.ext.tasks.loop Декоратор оборачивает сопрограмму, планируя ее как фоновую задачу, которая выполняется с определенным интервалом. Интервал (в виде числа с плавающей запятой или целого числа) может быть в секундах, минутах, часах или их комбинации.

 from discord.ext import tasks

@tasks.loop(seconds=5.0)
async def my_task():
    # Do something that is repeated every 5 seconds
 

Итак, объединив эти два, ваша задача веб-скребка может выглядеть примерно так:

 import aiohttp
from discord.ext import tasks

RECENT_HTML = ""

@tasks.loop(hours=1)
async def download_webpage():
    async with aiohttp.ClientSession() as session:
        async with session.get("<url>") as response:
            if response.status != 200:
                # Notify users that the website could not be scraped

            html = await response.text()
            if html != RECENT_HTML:
                # Notify users of changes within the website
                # An HTML parser could be used to identify specific changes within the HTML
                # Or you could just tell the members that a change occurred.
            RECENT_HTML = html
 

Ответ №2:

Вы можете использовать tasks.loop для проверки новостей:

 import bs4
import aiohttp
from discord.ext import tasks

@tasks.loop(minutes=1)
async def check_news():
  async with aiohttp.ClientSession() as ses:
    async with ses.get(your_url) as response:
      if response.status == 200:
        text = await response.text()
        soup = bs4.BeautifulSoup(text, "html.parser")
        #finding the news
        #if there is a new post, you can send it to spesific channel.
 

Я могу помочь в дальнейшем, если вы поделитесь ссылкой.

Комментарии:

1. эй, я думаю, что нашел правильную ссылку для своего бота, я просто начинающий бот на python и discord, поэтому мне было интересно, не могли бы вы помочь мне немного дальше. Мы можем пообщаться в discord мой тег voltifer#2782

2. Конечно, мы можем общаться в раздоре, но если мы поговорим здесь, мы поможем и другим людям в этом вопросе.

3. можете ли вы добавить меня в discord?