如何使用Python Discord Bot将GIF发送到Discord频道

2024-04-25 23:52:52 发布

您现在位置:Python中文网/ 问答频道 /正文

当用户输入命令“!gif'(他们想要的gif在哪里),我希望机器人返回该名称的gif

我正在尝试的代码是基于Tenor的API,但我不介意使用任何其他站点来获取GIF。我现有的代码不起作用,我对如何做这件事有点不知所措

注意:我是作为个人项目来做的。我不介意你给我答案,但如果可以,请解释你为什么要这么做

以下是我目前的代码:

import discord
import requests
import json

from constants import (TenorToken, DiscordToken)

client = discord.Client()
embedColour = 0xff0000

#Retrieves GIF from site
def getGIF(searchTerm):
    response = requests.get("https://g.tenor.com/v1/search?q=%s&key=%s&limit=1" %(searchTerm, TenorToken))
    gif = json.loads(response.content)
    print(gif)

@client.event
async def on_ready():
    print(f"{client.user}"[:-5] + " is now Online!")

@client.event
async def on_message(message):
    if (message.author == client.user):
        return

    if (message.content.lower().startswith(f"{CommandKey}gif")):
        getGIF(message.content.lower()[5:]) #Collects word after !gif

client.run(DiscordToken)

谢谢你的帮助


Tags: 代码fromimportclientjsonmessagedefcontent
1条回答
网友
1楼 · 发布于 2024-04-25 23:52:52

我检查了您的代码,并且Tensor不发送GIF数据,只发送图像的URL

这段代码在第一个结果`

def get_gif(searchTerm):  # PEP8: lower_case_names for functions

    response = requests.get("https://g.tenor.com/v1/search?q={}&key={}&limit=1".format(searchTerm, TenorToken))

    data = response.json()  # `requests` doesn't need `json.loads()`
         
    return data['results'][0]['media'][0]['gif']['url']

我通过手动挖掘JSON并创建此代码来获得它

# see urls for all GIFs

for result in data['results']:
    print('- result -')
    #print(result)
    
    for media in result['media']:
        print('- media -')
        #print(media)
        #print(media['gif'])
        print('url:', media['gif']['url'])

当我得到url时,我可以使用Embed发送url,discord将下载并显示它-我不必下载它

if (message.content.lower().startswith(f"{CommandKey}gif")):

    gif_url = get_gif(message.content.lower()[5:]) #Collects word after !gif
    
    embed = discord.Embed()
    embed.set_image(url=gif_url)

    await message.channel.send(embed=embed)

完整工作代码

import discord
import requests

from constants import (TenorToken, DiscordToken)

#import os
#DiscordToken = os.getenv('DISCORD_TOKEN')
#TenorToken = os.getenv('TENOR_TOKEN')

client = discord.Client()

embedColour = 0xff0000
CommandKey = '!'

#  - functions  -

#Retrieves GIF from site
def get_gif(searchTerm):  # PEP8: lower_case_names for functions
    response = requests.get("https://g.tenor.com/v1/search?q={}&key={}&limit=1".format(searchTerm, TenorToken))
    data = response.json()
    
    ''' 
    # see urls for all GIFs
    
    for result in data['results']:
        print('- result -')
        #print(result)
        
        for media in result['media']:
            print('- media -')
            print(media)
            print(media['gif'])
            print('url:', media['gif']['url'])
    '''
         
    return data['results'][0]['media'][0]['gif']['url']
    

@client.event
async def on_ready():
    print(f"{client.user}"[:-5] + " is now Online!")

@client.event
async def on_message(message):
    if message.author == client.user:  # `if/else` doesn't need `()`
        return

    if message.content.lower().startswith(f"{CommandKey}gif"):
        gif_url = get_gif(message.content.lower()[5:]) #Collects word after !gif
        
        embed = discord.Embed()
        embed.set_image(url=gif_url)
        await message.channel.send(embed=embed)

#  - main  -

client.run(DiscordToken)

编辑:

下载gif到本地计算机内存(使用io.BytesIO)并作为普通文件发送时也是如此

import io

@client.event
async def on_message(message):
    if (message.author == client.user):
        return

    if (message.content.lower().startswith(f"{CommandKey}gif")):
        gif_url = get_gif(message.content.lower()[5:]) #Collects word after !gif
        # download image from url
        response = requests.get(gif_url) 
        
        # put it in file-like object in memory
        file_like_object = io.BytesIO(response.content)

        #file_name = 'image.gif'
        file_name = gif_url.split('/')[-1]
        
        # send it as normal file
        # it needs filename with extension `.gif` to display it as GIF image
        await message.channel.send(file=discord.File(file_like_object, filename=file_name))

它需要更长的时间来显示,因为它必须将其传送到本地计算机,然后发送到internet

它可用于使用pillowwandgizeh编辑图像(即添加文本、更改颜色、绘制图形),使用opencv检测人脸/人物/对象,使用moviepy生成视频等


顺便说一句:

在回答问题How to make a canvas profile card in discord python bot?时,我使用pillow向图像添加元素。但它是静态图像,而不是动画GIF,这需要更多的工作(每一帧都是单独的)

相关问题 更多 >