Discord.py重写Giphy Cog错误:未闭合连接器

Discord.py重写Giphy Cog错误:未闭合连接器,discord.py,discord.py-rewrite,giphy-api,Discord.py,Discord.py Rewrite,Giphy Api,我正在尝试为我的discord.py bot构建一个Giphy cog,它抛出了以下错误 未关闭的客户端会话 客户端会话: 未闭合连接器 连接:['[(,77055.671)]] 连接器: 有人知道这是什么原因吗?我将如何修复它 这是我的密码: 导入操作系统 进口aiohttp 随机输入 进口不和 从discord.ext导入命令 从dotenv导入加载\u dotenv 加载_dotenv() prefix=os.getenv(“客户端前缀”) giphy\u api=os.getenv(“

我正在尝试为我的discord.py bot构建一个Giphy cog,它抛出了以下错误

未关闭的客户端会话
客户端会话:
未闭合连接器
连接:['[(,77055.671)]]
连接器:
有人知道这是什么原因吗?我将如何修复它

这是我的密码:

导入操作系统
进口aiohttp
随机输入
进口不和
从discord.ext导入命令
从dotenv导入加载\u dotenv
加载_dotenv()
prefix=os.getenv(“客户端前缀”)
giphy\u api=os.getenv(“giphy\u api\u键”)
命令_attrs={'hidden':False}
类FunCog(commands.Cog,name='Fun commands',command\u attrs=command\u attrs):
定义初始化(自我,客户机):
self.client=client
@commands.command(name='gif')
异步定义(self,ctx,*,search,json=None):
嵌入=discord.embed(color=discord.color.blue())
session=aiohttp.ClientSession()
如果搜索=“”:
response=等待会话。获取('https://api.giphy.com/v1/gifs/random?api_key=“+giphy_api)
data=json.load(等待响应.text())
embed.set_image(url=data['data']['images']['original']['url'])
其他:
search.replace(“”,“+”)
response=wait session.get(
'http://api.giphy.com/v1/gifs/search?q=“+search+”&api_key='+giphy_api+”&limit=10')
data=json.load(等待响应.text())
gif_choice=random.randint(0,9)
嵌入.set_图像(url=data['data'][gif_选项]['images']['original']['url']))
等待会话。关闭()
等待ctx.send(嵌入=嵌入)
def设置(客户端):
client.add_cog(FunCog(client))
出于安全原因,我省略了我的Giphy API密钥。 我正在使用
discord.py rewrite
python3.8.6
,如果有帮助的话

基本上,我希望能够搜索一个gif与它的标签,它将响应一个随机gif从giphy为指定的标签

--编辑--

  • 将错误日志记录移动到my
    Events.py
    文件
  • 将API键移动到我的
    .env
    文件
  • 删除了
    tenor\u api
    env,因为它不会被使用,并且与此问题无关
  • 稍微更新了代码以解决一些缺少的参数
  • ---编辑---

    感谢Fixator10的回复,修复了我在本文中遇到的问题

    如果有人想使用,下面是我的工作代码:

    导入操作系统
    进口aiohttp
    随机输入
    进口不和
    导入json
    从discord.ext导入命令
    从dotenv导入加载\u dotenv
    加载_dotenv()
    prefix=os.getenv(“客户端前缀”)
    giphy\u api=os.getenv(“giphy\u api\u键”)
    命令_attrs={'hidden':False}
    类FunCog(commands.Cog,name='Fun commands',command\u attrs=command\u attrs):
    定义初始化(自我,客户机):
    self.client=client
    self.session=aiohttp.ClientSession()
    def cog_卸载(自):
    self.client.loop.create_任务(self.session.close())
    @commands.command(name='gif')
    异步def_gif(self,ctx,*,search):
    session=self.session
    嵌入=discord.embed(Color=discord.Color.dark_gold())
    如果搜索=“”:
    response=等待会话。获取('https://api.giphy.com/v1/gifs/random?api_key=“+giphy_api)
    data=json.load(等待响应.text())
    embed.set_image(url=data['data']['images']['original']['url'])
    其他:
    search.replace(“”,“+”)
    response=wait session.get(
    'http://api.giphy.com/v1/gifs/search?q=“+search+”&api_key='+giphy_api+”&limit=10')
    data=json.load(等待响应.text())
    gif_choice=random.randint(0,9)
    嵌入.set_图像(url=data['data'][gif_选项]['images']['original']['url']))
    等待ctx.send(嵌入=嵌入)
    def设置(客户端):
    client.add_cog(FunCog(client))
    

    它可能不是最好的,因为它只使用一个标记,但我可能会在另一个时间改进它xD

    这是由您的会话行为引起的。如果搜索为空,则不会关闭会话。简而言之:您应该在使用后关闭会话

    最简单的解决方案是使用上下文管理器:

    #https://docs.aiohttp.org/en/stable/#client-范例
    与aiohttp.ClientSession()作为会话异步:
    与session.get()异步http://python.org”)作为答复:
    
    否则,您可以为Cog创建会话,并在卸载时将其关闭:

    类myCG(commands.Cog):
    定义初始化(客户端):
    self.client=client
    self.session=aiohttp.ClientSession()
    # https://discordpy.readthedocs.io/en/stable/ext/commands/api.html#discord.ext.commands.Cog.cog_unload
    def cog_卸载(自):
    #因为close是协同程序,
    #我们需要把它叫做sync func
    #让我们创建异步IO任务
    self.client.loop.create_任务(self.session.close())
    #或者,我们可以使用“分离”:
    #self.session.detach()
    @commands.command()
    异步def mycmd(ctx):
    与self.session.get异步(“https://example.com)作为答复:
    等待ctx发送(响应状态)
    
    顺便说一句,您可以使用
    on\u command\u error
    来只使用一个命令,而不是对每个命令都这样做。这绝对是有用的。我必须为那个提示设置那个事件(=)我在上面用它编辑了我的帖子。。。。我再次编辑了这篇文章,我做了一些工作,但没有达到预期的效果。我不知道你的问题是什么,但是对于代码,我可以建议对请求方法使用
    params
    参数,而不是手动构建它:。它还将正确编码字符串,因此您不需要使用
    search.replace(“,”+)
    partYo,不用担心。tbh它实际上是有效的,我猜这段代码根本不允许多个标记。但我在这个具体问题h中遇到的问题