Почему мой бот Discord отображает ссылки gif в формате ['link_of_gif'], а не только саму ссылку

Сначала я создал файл JSON, в котором сохранил все ссылки, которые хочу, чтобы бот отображал.

{   
    "yup": [
        "https://tenor.com/view/mourinho-jose-mourinho-yes-yes-yes-yes-oh-yes-gif-745895004274181051"
    ] ,

    "calma":[
        "https://tenor.com/view/calma-relax-ronaldo-gif-16922523"
    ] ,

    "respect":[
        "https://tenor.com/view/respect-mou-mourinho-man-manchester-gif-19028709"
    ] ,

    "nospeak":[
        "https://tenor.com/view/josémourinho-big-trouble-if-i-speak-prefer-not-to-speak-interview-gif-16725048"
    ]  ,

    "shush":[
        "https://tenor.com/view/jose-mourinho-ssh-manchester-united-mufc-shush-gif-10178656"
    ],

    "sui":[
        "https://tenor.com/view/sui-siu-ronaldo-football-portugal-gif-25997537"
    ]


}

Теперь я открываю файл json в основном файле бота, ключевое слово будет реагировать на каждый gif в файле json.

from discord.ext import commands
import discord
import requests, json

links = json.load(open("gif.json"))

@bot.command(name = "yup", aliases = ["calma", "respect", "nospeak", "shush", "sui"])
async def gif (ctx):
    gif_link = links.get(ctx.invoked_with)
    await ctx.send(gif_link)

Я не могу понять, почему он отображается в формате ['link_of_the_gif']

Я спросил чатгпт, и он сказал использовать

links = json.load(open("gif.json", "r"))

это не сработало

Для этого я следил за руководством на YouTube. Может ли кто-нибудь объяснить некоторые используемые функции и методы?

поскольку ваш json-файл содержит списки для каждой записи, я предполагаю, что str(list of single link here) преобразуется в [link], если бы [] возникло из него как списка, вы должны иметь возможность удалить квадратные скобки в своем json или использовать str(gif_link[0])

Kenzo Staelens 09.04.2024 14:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш файл JSON сопоставляет слова со списками ссылок. См. это, например (сокращенно для удобства чтения):

{   
    "yup": [
        "..."
    ],
    ...
}

Когда вы получаете доступ к этой структуре с помощью links.get(ctx.invoked_with), например links.get("yup"), она вернет все, что хранится за этим словом.

В данном случае это список URL-адресов (обозначенных квадратными скобками [...]).

Чтобы получить одну ссылку, вам нужно либо изменить файл JSON, удалив квадратные скобки, либо скрипт Python, обратившись к одному элементу из списка (например, к первому).

Решение: измените файл JSON.

{   
    "yup": "https://tenor.com/view/mourinho-jose-mourinho-yes-yes-yes-yes-oh-yes-gif-745895004274181051,
    ...

При этом за словом «ага» сохраняется только один URL-адрес. Это немного упрощает поиск в Python, но вы ограничены одним элементом.

Решение 2. Измените скрипт Python

async def gif (ctx):
    gif_link = links.get(ctx.invoked_with)[0]  # <-- "[0]" accesses the first element of the list

В этом коде Python может быть несколько ошибок (первое решение также подвержено «пропущенным словам»).

Поэтому вместо этого рассмотрите этот код Python:

async def gif (ctx):
    gif_links= links.get(ctx.invoked_with)
    if not gif_links:
        await ctx.send("No such gif found!")
    await ctx.send(gif_links[0])

Бонус: изображения Randmoize

Ваш файл JSON (со списками) позволяет иметь более одного изображения. Вы можете использовать random.choice(), чтобы выбрать один случайным образом. Например

{   
    "yup": [
        "http://<image-url-1>",
        "http://<image-url-2>",
    ],
    "calma":[
        "http://<image-url-1>",
        "http://<image-url-2>",
    ],
    ...
}
from random import choice

async def gif (ctx):
    gif_links = links.get(ctx.invoked_with)
    if not gif_links:
        await ctx.send("No such gif found!")
    await ctx.send(choice(gif_links))

Привет, спасибо за ответ, теперь я понимаю. В верхней части кода я пытаюсь создать способ рассылать GIF-файлы спамом, набрав spam_(название триггерного слова), например spam_yup, и он будет спамить GIF-изображения несколько раз. Можете ли вы дать мне подсказку? или советы, как это сделать?

Carl_Johnson 09.04.2024 15:30

Можете ли вы уточнить, что вы подразумеваете под словом «спам»? Кроме того, если ответ решил вашу проблему, вам следует принять его, чтобы другие люди увидели, что это правильное решение.

exhuma 10.04.2024 08:08

Другие вопросы по теме