我的脚本使用BeautifulSoup从文本文件中列出的网页中抓取信息。我想创建一个Discord机器人,该机器人可以设置2个命令。
+add <url>
会将url添加到文本文件列表的底部。
+remove <url>
将从文本文件中删除邮件中的网址。
我创建了一个不和谐的bot,它可以连接,但是我不知道如何设置命令以从文本文件添加/删除
。import requests
import lxml.html
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from dhooks import Webhook, Embed
import random
import discord
from discord.ext import commands
from threading import Thread
client = commands.Bot(command_prefix = '+')
ua = UserAgent()
header = {'User-Agent':ua.chrome}
# Proxies
proxy_list = []
for line in open('proxies.txt', 'r'):
line = line.replace('\n', '')
proxy_list.append(line)
def get_proxy():
proxy = random.choice(proxy_list)
proxies = {
"http": f'{str(proxy)}',
"https": f'{str(proxy)}'
}
return proxies
# Opening URL file
def loop():
with open('urls.txt','r') as file:
url_list = file.readlines()
pos = 0
while True:
if pos >= len(url_list):
pos = 0
url = url_list[pos]
pos += 1
proxies = get_proxy()
result = requests.get(url.strip() ,headers=header,timeout=6,proxies=proxies)
#src = result.content
soup = BeautifulSoup(result.content, 'lxml')
# Finding elements within a webpage
titles = soup.title
price = soup.find_all('span',attrs={'class':'prodPriceCont valuteCont pricetext'})
rated = soup.find_all('span',attrs={'class':'rateB'})
addToCarts = soup.find_all('a',attrs={'id':'btnAddToCart'})
imageURL = soup.find_all('a',attrs={'class':'prodImg max'})
brands = soup.find_all('strong',attrs={'itemprop':'brand'})
for title in titles:
ItemTitle = titles.string
#print(ItemTitle)
for span in price:
ItemPrice = span.string
#print(ItemPrice)
for rate in rated:
rating = rate.string+"/5.00"
#print(rating)
for carts in addToCarts:
inStock = carts.string
#print(inStock)
for URL in imageURL:
imgURL = URL['href']
#print(imgURL)
for brand in brands:
productBrand = brand.string
#print(productBrand)
# Discord Embed Setup
hook = Webhook("WEBHOOK")
embed = Embed(
description=ItemTitle,
color=0x0d0d22,
timestamp='now' # sets the timestamp to current time
)
embed.set_author(name=productBrand)
embed.add_field(name='Price', value=ItemPrice, inline=True)
embed.add_field(name='Rating', value=rating, inline=True)
embed.set_footer(text='Test', icon_url='https://cdn.discordapp.com/avatars/628005829840470037/8286685de0f2d7d94d94e020caf3265d.png?size=128')
embed.set_thumbnail(imgURL)
hook.send(embed=embed)
print(ItemTitle+" | "+ItemPrice+" | "+rating+" | Item has been checked")
@client.event
async def on_ready():
print("Bot is online!")
a = Thread(target=loop, args=())
a.start()
client.run('TOKEN')
答案 0 :(得分:1)
以下是设置添加和删除命令的方法:
@bot.command()
async def add(ctx, args):
url_to_add = args.lower() + '\n'
with open('text.txt', 'a') as url_file:
url_file.write(url_to_add)
add命令非常简单。首先,我们格式化用户发送的URL,以确保在搜索时不会中断。接下来,我们以附加模式打开文本文件(这意味着我们正在修改/添加文本到文件中)。最后,我们只将URL写入文件。只需添加命令即可。
@bot.command()
async def remove(ctx, args):
url_to_remove = args.lower() + '\n'
with open("text.txt", 'r') as url_file:
urls = url_file.readlines()
replacement_urls = [url for url in urls if url_to_remove not in url]
with open('text.txt', 'w') as url_file:
url_file.truncate()
url_file.write(''.join(replacement_urls))
remove命令稍微复杂一些,但是很容易。首先,我们再次格式化用户提供的网址,使其与我们将其存储在文件中的方式匹配。接下来,我们以读取模式打开文件,并将文件内容存储在名为“ urls”的列表中。然后,我们使用列表推导创建一个新的URL列表,其中包括文件中除要删除的每个URL之外的所有URL。然后,我们以写入模式打开文本文件,擦除内容,然后将所有原始url(我们删除的URL除外)作为字符串写回到文件中。
免责声明:这不是最有效的方法。如果文本文件的大小大于托管机器人的计算机上可用的RAM内存,则此方法将引发错误。但是,如果您不打算拥有巨大的文本文件,这是完成任务的最简单方法。