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

Насколько я понимаю, я могу использовать этот пример из документации 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 Ответ

0 голосов
/ 11 ноября 2018

Ответ, который дает 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. Пока я тестировал, он уже сделал свои собственные гипсовые звонки. Я проверил это, используя несколько разных символов (!, ~, ') И пробел, и это, кажется, всегда работает. Смотрите ниже примеры.

native giphy discord example: using bot prefix !

native giphy discord example: using ~

native giphy discord example using space

...