Отправить Discord Внедрить товарный запас Анализируемая форма HTML с BS4 и запросами - PullRequest
1 голос
/ 17 февраля 2020

Итак, у меня есть код:

import requests
import discord
from bs4 import BeautifulSoup

class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))

    async def on_message(self, message):
        if (message.channel.id == 678447420643868674):
                if "test" in message.content:
                    r = requests.get('https://www.jimmyjazz.com/mens/footwear/adidas-solar-hu-nmd/BB9528')
                    soup = BeautifulSoup(r.text, 'html.parser')
                    embed = discord.Embed(color=0x00ff00)
                    embed.title = "test" 
                    for anchor_tag in soup.find_all(class_="box_wrapper")[0].findChildren():
                        if "piunavailable" in anchor_tag['class']:
                            embed.description = f"Size {anchor_tag.text} OOS"
                            await message.channel.send(embed=embed)
                        else:
                            embed.description = f"Size {anchor_tag.text}  in stock!"
                            await message.channel.send(embed=embed)
client = MyClient()
client.run('NjY2MDMyMDc0NjM3MTgwOTQ4.XkjBLg.I3dtsL2nkVh_bafTlycSwBApQfU')

И он отправляет запас товара в качестве встраивания для каждого размера: https://gyazo.com/7a7c868d00a99fc3798a3c24feb9ea7e

Как бы я изменился код, чтобы заставить его отправлять для каждого размера в одной вставке вместо встраивания за размер?

Спасибо :))

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вложения в разногласия могут иметь поле, которое вы можете добавить с помощью функции embed.add_field() embed.add_field(name="Field1", value="hi", inline=False)

Размер вложения имеет несколько ограничений (скопировано с https://discordjs.guide/popular-topics/embeds.html#notes):

  • Имя поля ограничено 256 символами, а его значение - 1024 символами
  • Может быть до 25 полей
  • Кроме того, сумма всех символов в структура встраивания не должна превышать 6000 символов

В связи с этим вам, вероятно, придется разделить запас товара на несколько вставок, если он превышает 25 полей или 6000 символов, имея счетчик для обоих и, если он идет, переустановка и отправка сообщения.

Вот пример части (я не проверял, но логика c должна быть правильной)

r = requests.get('https://www.jimmyjazz.com/mens/footwear/adidas-solar-hu-nmd/BB9528')
soup = BeautifulSoup(r.text, 'html.parser')
charCount = 0
fieldCount = 0
embed = discord.Embed(color=0x00ff00)
embed.title = "test"
for anchor_tag in soup.find_all(class_="box_wrapper")[0].findChildren():
    anchor_text = anchor_tag.text
    charCount += len(anchor_text)

    if charCount >=6000 or fieldCount >=25:
        charCount = len(anchor_text)
        fieldCount = 0

        await message.channel.send(embed=embed)
        embed = discord.Embed(color=0x00ff00)
        embed.title = "test"

    if "piunavailable" in anchor_tag['class']:
        embed.add_field(name= f"Size {anchor_text}", value="Out Of Stock")
    else:
        embed.add_field(name= f"Size {anchor_text}", value="In stock!")

    fieldCount +=1
0 голосов
/ 17 февраля 2020

Добавить как таковое:

                    for anchor_tag in soup.find_all(class_="box_wrapper")[0].findChildren():
                        if "piunavailable" in anchor_tag['class']:
                            embed.add_field(name= f"Size {anchor_tag.text}", value=":x:", inline= 'true')
                        else:
                            embed.add_field(name= f"Size {anchor_tag.text}", value=f":white_check_mark: | ATC", inline= 'true')
                    await message.channel.send(embed=embed)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...