如何让我的Discord机器人从文本文件添加/删除项目

时间:2020-08-03 08:03:42

标签: python beautifulsoup discord.py

我的脚本使用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')

1 个答案:

答案 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内存,则此方法将引发错误。但是,如果您不打算拥有巨大的文本文件,这是完成任务的最简单方法。