Сначала я создал файл 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 сопоставляет слова со списками ссылок. См. это, например (сокращенно для удобства чтения):
{
"yup": [
"..."
],
...
}
Когда вы получаете доступ к этой структуре с помощью links.get(ctx.invoked_with)
, например links.get("yup")
, она вернет все, что хранится за этим словом.
В данном случае это список URL-адресов (обозначенных квадратными скобками [...]
).
Чтобы получить одну ссылку, вам нужно либо изменить файл JSON, удалив квадратные скобки, либо скрипт Python, обратившись к одному элементу из списка (например, к первому).
{
"yup": "https://tenor.com/view/mourinho-jose-mourinho-yes-yes-yes-yes-oh-yes-gif-745895004274181051,
...
При этом за словом «ага» сохраняется только один URL-адрес. Это немного упрощает поиск в 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])
Ваш файл 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-изображения несколько раз. Можете ли вы дать мне подсказку? или советы, как это сделать?
Можете ли вы уточнить, что вы подразумеваете под словом «спам»? Кроме того, если ответ решил вашу проблему, вам следует принять его, чтобы другие люди увидели, что это правильное решение.
поскольку ваш json-файл содержит списки для каждой записи, я предполагаю, что
str(list of single link here)
преобразуется в[link]
, если бы[]
возникло из него как списка, вы должны иметь возможность удалить квадратные скобки в своем json или использоватьstr(gif_link[0])