我正在寻找一种使用rewrite分支将REST API集成到Discord.py中的方法。我想使用aiohttp来处理请求,但是我不确定应该采用哪种方法。例如,目标是向API发出GET请求,该请求将返回该机器人所在的行会列表。或者,另一个示例,是一个POST请求,该请求将要求该机器人将给定消息写入特定 channel 。总体而言,这是关于从网页向机器人进行说明。

我尝试将aiohttp应用路由器和运行程序放入Discord.py客户端类中。 Web服务器确实正在运行,我做了一个异步函数来返回机器人所在的行会,但是当进入http://127.0.0.1/guilds时,该函数看起来不会接受我传递给它的请求参数。从而导致missing 1 required positional argument错误。

import discord
import asyncio
from aiohttp import web

class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))

    async def get_guilds(self, request):
        response_obj = self.guilds
        return web.json_response(response_obj,status=200,content_type='application/json')

    app = web.Application()
    app.router.add_get('/guilds', get_guilds)
    web.run_app(app, port=80)

client = MyClient()
client.run(TOKEN)

此外,aiohttp服务器不会异步运行。我希望on_ready(self)能运行,但是永远不会。我究竟做错了什么 ?

最佳答案

好吧,我找到了办法。

bot.py

from asyncio import gather, get_event_loop
from logging import basicConfig, INFO
from discord.ext.commands import Bot
from aiohttp.web import AppRunner, Application, TCPSite
from sys import argv

from api import routes

basicConfig(level=INFO)

async def run_bot():

    app = Application()
    app.add_routes(routes)

    runner = AppRunner(app)
    await runner.setup()
    site = TCPSite(runner, '0.0.0.0', 8080)
    await site.start()

    bot = Bot(command_prefix="$")
    app['bot'] = bot

    try:
        await bot.start(TOKEN)

    except:
        bot.close(),
        raise

    finally:
        await runner.cleanup()

if __name__ == '__main__':
    loop = get_event_loop()
    loop.run_until_complete(run_bot())

api.py
routes = RouteTableDef()

@routes.get('/guilds')
async def get_guilds(request):
    client = request.app['bot']
    guilds = []
    for guild in client.guilds:
        guilds.append(guild.id)

    response = Handler.success(guilds)
    return json_response(response, status=200, content_type='application/json')

关于python - Discord.py中的异步REST API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54326794/

10-09 07:51
查看更多