Как бы я использовал GIPHY Python API с моим ботом разногласий?

Насколько я понимаю, я могу использовать этот пример из документации GIPHY ( https://gyazo.com/1b6c0094162a54fe49029f665badf8df), чтобы открыть URL-адрес, но я не слишком понимаю его. Чтобы добавить к этому, когда я запускаю этот код, я получаю ошибку:

discord.ext.commands.errors.CommandInvokeError: Команда вызвала исключение: AttributeError: модуль 'urllib' не имеет атрибута 'urlopen'

У меня вопрос, как я могу случайно импортировать GIF из определенных тегов, когда пользователь вводит #giphy в текстовом канале

Вот мой текущий код: (Код был обновлен)

@bot.command(pass_context = True)
@commands.cooldown(1, 3, commands.BucketType.user)
async def gif(ctx, *, search):
channel = ctx.message.channel
session = aiohttp.ClientSession()

msg = await bot.send_message(channel, "**searching for " + search + "..**")
randomMessage = await bot.send_message(channel, "**showing a random image due to no images found from your search or you just didn't search anything**")

if search == "":
    randomImage = True
    print("random")
    randomMessage
    response = await session.get("https://api.giphy.com/v1/gif/random?api_keyY=4hnrG09EqYcNnv63Sj2gJvmy9ilDPx5&limit=10")
else:
    msg
    print("searching")
    correct_search = search.replace(" ", "+")
    reponse = await session.get("http://api.giphy.com/v1/gifs/search?q=" + correct_search + "&api_key=Y4hnrG09EqYcNnv63Sj2gJvmy9ilDPx5&limit=10")
data = json.loads(await reponse.text())
await session.close()

embed = discord.Embed(
    description = '**showing result for ' + search + '**',
    colour = discord.Colour.blue()
)

gif_choice = random.randint(0,9)
embed.set_image(url=data["data"][gif_choice]["images"]["original"]["url"])
if randomImage:
    await bot.delete_message(randomMessage)
else:
    await bot.delete_message(msg)

await bot.send_message(channel, embed=embed)

Спасибо

1 ответ

Решение

Ответ, который дает API, отформатирован как json. Вам нужно проанализировать его, чтобы найти URL, который вы хотите вставить. После загрузки это будет словарь на python.

Приведенный ниже код является примером того, как это сделать. Он вызовет API giphy, вернет первые 10 результатов и случайным образом выберет результат в качестве сообщения.

Обратите внимание, что aiohttp используется как асинхронный, то есть он не будет блокировать ваш код. Я также изменил команду, чтобы вы могли искать что угодно. Чтобы соответствовать вашему предыдущему URL-адресу запроса, вы можете использовать !giphy ryan gosling, Если пользователь не указывает значение для поиска, вместо него будет использоваться случайная конечная точка.

from discord.ext import commands
import discord
import json
import aiohttp
import random

client = commands.Bot(command_prefix='!')


@client.command(pass_context=True)
async def giphy(ctx, *, search):
    embed = discord.Embed(colour=discord.Colour.blue())
    session = aiohttp.ClientSession()

    if search == '':
        response = await session.get('https://api.giphy.com/v1/gifs/random?api_key=API_KEY_GOES_HERE')
        embed.set_image(url=data['data']['images']['original']['url'])
    else:
        search.replace(' ', '+')
        response = await session.get('http://api.giphy.com/v1/gifs/search?q=' + search + '&api_key=API_KEY_GOES_HERE&limit=10')
        gif_choice = random.randint(0, 9)
        embed.set_image(url=data['data'][gif_choice]['images']['original']['url'])

    data = json.loads(await response.text())
    await session.close()

    await client.send_message(embed=embed)

client.run('token')

Кроме того, кажется, что дискорд изначально поддерживает giphy. Пока я проводил тестирование, он уже сделал свои собственные гипсовые звонки. Я проверил это, используя несколько разных символов (!, ~, ') И пробел, и это, кажется, всегда работает. Смотрите ниже примеры.

Пример нативного диссонанса: с помощью префикса бота

Пример нативного диссонанса с использованием

Пример нативного диссонанса с использованием пробела

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