Pubsubhubbub / WebSub mit Callback

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phil7789
User
Beiträge: 1
Registriert: Sonntag 22. November 2020, 13:45

Hallo zusammen,

ich habe etwas Schwierigkeiten mit Pubsubhubbub (WebSub) und einer korrekten Callback-URL zurechtzukommen, um Push-Benachrichtigungen (hier speziell für YouTube) zu erhalten.

Ich habe versucht mich durch die Dokumentation von aiohttp zu wühlen und damit einen sehr simplen Webserver aufzubauen, der im Grunde nur die o.g. Funktion besitzen soll.
Meine bisherige Herangehensweise bspw. bei APIs war die API anzusprechen, die Antwort ausgeben zu lassen und den Code entsprechend der Antwort so zu gestalten, dass ich das Ergebnis korrekt verarbeiten / filtern kann.

Pubsubhubbub erwartet nach der initialen "Anmeldung" die Rückgabe von hub.challenge und einem 2xx Statuscode. Derzeit bekomme ich leider keinerlei Ausgabe, weshalb ich nicht weiß ob hub.challenge so überhaupt ansprechbar ist (der Dokumentation entnommen). Weiter konnte ich online leider nicht finden wie ich generell einen Statuscode mit aiohttp zurückgeben kann.

Mein bisheriger Anlauf wäre

Code: Alles auswählen

    async def webserver(self):

        async def handler(request):
            ws = web.WebSocketResponse()
            await ws.prepare(request)

            async for msg in ws:
                if msg.type == aiohttp.WSMsgType.TEXT:
                    if msg.data == 'close':
                        await ws.close()
                    else:
                        print(f'WS-Data: {msg.data}')
                elif msg.type == aiohttp.WSMsgType.ERROR:
                    print(f'ws connection closed with exception {ws.exception()}')
                else:
                    print(f'ws: {ws}')
                    print(f'---\nmsg: {msg}')

                print('websocket connection closed')

                return ws

        app = web.Application()
        app.add_routes([web.get('/callback', handler)])
        runner = web.AppRunner(app)
        await runner.setup()
        self.site = web.TCPSite(runner, 'domain.com', 8080)
        await self.bot.wait_until_ready()
        await self.site.start()

        print('Websocket Server started')

        async with ClientSession() as session:
            print('Sending Request')
            data = {
                'hub.mode': 'subscribe',
                'hub.topic': 'https://www.youtube.com/xml/feeds/videos.xml?channel_id=....',
                'hub.callback': 'http://domain.com/callback',
                }
            async with session.post(
                'https://pubsubhubbub.appspot.com/subscribe',
                data=data,
                headers={'content-type': 'application/x-www-form-urlencoded'}
                ) as r:
                if 200 <= r.status <= 205:
                    print(r.reason)
                    text = await r.text()


    def __unload(self):
        asyncio.ensure_future(self.site.stop())

def setup(bot):
    ws_bot = Websocket(bot)
    bot.add_cog(ws_bot)
    bot.loop.create_task(ws_bot.webserver())
Zur weiteren Erklärung: Ich möchte die Abfrage in einem Discord Bot einsetzen und verwende dafür die discordpy Bibliothek, daher die Funktionen "__unload" und "setup".

Eventuell kann mich ja Jemand in die richtige Richtung schubsen. Ich bin mir mittlerweile relativ sicher, dass mein Ansatz falsch ist und ich etwas missverstanden habe.

Vielen Dank und Grüße,
Phil
Antworten