October
30th,
2022
When writing a discord bot, even if only for your own server, you need to use oauth to validate it. I wrote the following script to make it easy on myself, since i’m more than likely to do it again and forget how in the future. Make sure you have bottle
, requests
and discordpy
(the bot framework i was writing in) runt hen simply browse to http://localhost:8080
Note that this requests Permissions(8)
which is Administrator and only the scopes bot
. You can change that at will - infact I suggest you don’t grant Admin.
import os, requests, string, random
from bottle import request, route, run, abort, redirect
from discord.utils import oauth_url
from discord import Permissions
state = ''.join(random.choice(string.ascii_letters) for i in range(10))
@route('/')
def index():
redirect(oauth_url(os.environ['CLIENT_ID'], permissions=Permissions(8), redirect_uri='http://localhost:8080/oauth', scopes=['bot'], state=state))
@route('/oauth')
def exchange_code():
code = request.query.code
incstate = request.query.state
if incstate != state:
abort(401, "State mismatch somehow, are you being hacked...?")
data = {
'client_id': os.environ['CLIENT_ID'],
'client_secret': os.environ['CLIENT_SECRET'],
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://localhost:8080/oauth'
}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post('https://discord.com/api/oauth2/token', data=data, headers=headers)
if 400 > r.status_code >= 200:
rdata = r.json()
access_token = rdata['access_token']
return "Successfully added bot"
print(r.text)
abort(401, "Failed to use code to auth")
if __name__ == '__main__':
if os.path.isfile('.env'):
with open('.env') as f:
for line in f:
k, v = line.strip().split('=', 1)
os.environ[k] = v
assert 'CLIENT_ID' in os.environ
assert 'CLIENT_SECRET' in os.environ
assert 'BOT_TOKEN' in os.environ
print('Open http://localhost:8080 in your browser')
run(host='localhost', port=8080, debug=True)