#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
модулю, которая позволяет запускать фоновые задачи для вашего бота. Это особенно удобно для более персонализированной реализации фреймворка.
Эти две части проблемы не слишком сложны:
- Создайте веб-скребок, который проверяет наличие обновлений в HTML-файле страницы
- Создайте фоновую задачу, в которой используется указанный веб-скребок.
Создайте веб — скребок
Пакеты, используемые для очистки веб-страниц, полностью соответствуют желаниям/потребностям разработчика. Поскольку 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?