Как заставить моего бота Discord добавлять / удалять элементы из текстового файла - PullRequest
1 голос
/ 03 августа 2020

Мой сценарий использует BeautifulSoup для сбора информации с веб-страниц, перечисленных в текстовом файле. Я хочу создать бота Discord, который позволит мне настроить 2 команды.

+add <url> добавит URL-адрес в конец списка в текстовом файле.

+remove <url> удалит URL-адрес из сообщения из текстового файла.

Я создал бота Discord, он подключается, но я не знаю, как go настроить команду для добавления / удаления из текстового файла .

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 Ответ

1 голос
/ 03 августа 2020

Вот как вы можете настроить свои команды добавления и удаления:

@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)

Команда добавления довольно проста. Сначала мы форматируем 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))

Команда удаления немного сложнее, но, тем не менее, проста. Сначала мы снова форматируем URL-адрес, предоставленный пользователем, чтобы он соответствовал тому, как мы сохранили его в файле. Затем мы открываем файл в режиме чтения и сохраняем содержимое файлов в списке под названием «urls». Затем мы используем понимание списка для создания нового списка URL-адресов, который включает все URL-адреса из файла, кроме удаляемого. Затем мы открываем текстовый файл в режиме записи, стираем содержимое, а затем записываем все исходные URL-адреса (кроме удаленного) обратно в файл в виде строки.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не самое лучшее эффективный способ сделать это. Этот метод вызовет ошибку, если размер текстового файла превышает объем оперативной памяти, доступной на машине, на которой размещен бот. Однако, если вы не планируете иметь большой текстовый файл, это самый простой способ выполнить sh вашу задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...