Serverless Framework Python Twitch EventSub to Discord Webhook on AWS

This template takes go-live events from Twitch EventSub, and publishes the events through a Discord webhook.

Usage

Required Parameters

Set these up in the .env file or pass them as parameters in the monitoring display. Remember that if you are auto-deploying from GitHub etc. your .env file will not be available for the script to read from.

  • DISCORD_WEBHOOK_URL: This is the URL provided by the Discord webhook you have set up
  • DISCORD_ROLE_ID: If you want to @everyone when you go live, set this to "everyone", otherwise set it to the ID of the Discord role that should be @'d. You can also set it to "nobody" if you want... nobody to be pinged.
  • TWITCH_USERNAME: This is your Twitch username for users to click on!

Deployment

Make sure to make your .env file following the .env.example file!

First, either run the below script to download this template (recommended), or clone this repository.

$ serverless create \
--template-url https://github.com/dylmye/aws-python-twitch-eventsub-to-discord-webhook \
--path myService

Set up your .env file, then run these scripts to set up the service in your Serverless org:

$ yarn
$ serverless

After deploying, you should see output similar to:

Deploying aws-python-twitch-eventsub-to-discord-webhook to stage dev (us-east-1)
✔ Service deployed to stack aws-python-twitch-eventsub-to-discord-webhook-dev (140s)
endpoint: GET - https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/webhook
functions:
handler: aws-python-twitch-eventsub-to-discord-webhook-dev-webhook (2.3 kB)

Note: In current form, after deployment, your API is public and can be invoked by anyone. For production deployments, you might want to configure an authorizer. For details on how to do that, refer to httpApi event docs.

Invocation

Prerequisites:

You need to subscribe your deployment to a Twitch Event. For our use case here, we want to subscribe to stream.online for a specific channel. Instructions on how to do this are available as step 7 and step 8 in this guide. The transport.callback value should be the endpoint from the deploy output above.

Local development

You can invoke your function locally by using the following command:

serverless invoke local --function webhook

Which should result in response similar to the following:

{
"statusCode": 200,
"body": "{\n \"executed\": False,\n \"rqid\": \"\"\n}"
}

Alternatively, it is also possible to emulate API Gateway and Lambda locally by using serverless-offline plugin. In order to do that, execute the following command:

serverless plugin install -n serverless-offline

It will add the serverless-offline plugin to devDependencies in package.json file as well as will add it to plugins in serverless.yml.

After installation, you can start local emulation with:

serverless offline

To learn more about the capabilities of serverless-offline, please refer to its GitHub repository.

Credits

This Serverless template is an adaptation of this Lambda I created in 2021 - please also see the credits section there

This README is shamelessly adapted from aws-node-http-api's README, written by Matthieu Napoli for Serverless.