実現したいこ### ヘディングのテキストと
codeを利用してアクセスtokenを取得したい
取得したtokenを利用してユーザー情報の取得、サーバーの参加させたい
前提
flaskでoauth2を機能させるコードを書いています
発生している問題・エラーメッセージ
codeを使用してtokenの取得をすることができない
該当のソースコード
python
1from threading import Thread 2from flask import Flask, redirect, request, session, url_for 3import requests 4 5app = Flask(__name__) 6 7# Discord OAuth2設定 8client_id = 'YOUR_CLIENT_ID' # Discord Developer Portalから取得したクライアントID 9client_secret = 'YOUR_CLIENT_SECRET' # Discord Developer Portalから取得したクライアントシークレット 10redirect_uri = 'https://localhost:8080/oauth2_callback' 11 12@app.route('/') 13def home(): 14 return "Welcome to your Flask app!" 15 16@app.route('/oauth2_login') 17def oauth2_login(): 18 # Discord OAuth2認証の認証URLにリダイレクト 19 authorize_url = f'https://discord.com/api/oauth2/authorize?client_id={client_id}&scope=identify+guilds+guilds.join&redirect_uri={redirect_uri}&response_type=code' 20 return redirect(authorize_url) 21 22@app.route('/oauth2_callback') 23def oauth2_callback(): 24 # 認証後のURLを受け取る 25 auth_url = request.url 26 27 # URLを解析してクエリパラメータを取得 28 from urllib.parse import urlparse, parse_qs 29 url_components = urlparse(auth_url) 30 query_parameters = parse_qs(url_components.query) 31 32 # codeパラメータの値を取得 33 auth_code = query_parameters.get('code', [])[0] if 'code' in query_parameters else None 34 print(auth_code) 35 if auth_code: 36 # 認証コードが存在する場合、アクセストークンを取得 37 token_url = 'https://discord.com/api/oauth2/token' 38 token_data = { 39 'client_id': client_id, 40 'client_secret': client_secret, 41 'grant_type': 'authorization_code', 42 'code': auth_code, 43 'redirect_uri': redirect_uri, 44 } 45 46 # アクセストークンを取得 47 response = requests.post(token_url, data=token_data) 48 response_data = response.json() 49 50 if 'access_token' in response_data: 51 access_token = response_data['access_token'] 52 53 # Discord APIを使用してユーザー情報を取得 54 user_url = 'https://discord.com/api/v10/users/@me' 55 headers = { 56 'Authorization': f'Bearer {access_token}', 57 } 58 59 user_response = requests.get(user_url, headers=headers) 60 user_data = user_response.json() 61 62 # ユーザー情報をコンソールに表示 63 print(user_data) 64 65 # ユーザーをサーバーに参加させる 66 guild_id = '1116022020090638376' # サーバーのIDを指定 67 join_url = f'https://discord.com/api/v10/guilds/{guild_id}/members/{user_data["id"]}' 68 join_data = { 69 'access_token': access_token, 70 } 71 72 join_response = requests.put(join_url, json=join_data) 73 74 if join_response.status_code == 201: 75 return "認証成功!ユーザーがサーバーに参加しました。" 76 else: 77 return "認証成功!サーバーへの参加に失敗しました。" 78 79 return "認証失敗" 80 81def run(): 82 app.run(host='0.0.0.0', port=8080) 83 84def keep_alive(): 85 t = Thread(target=run) 86 t.start() 87 88if __name__ == "__main__": 89 keep_alive()
試したこと
codeを使用してtokenを取得するコードを別の書き方に変えたりした
補足情報(FW/ツールのバージョンなど)
python v3.10.11
discord.py v2.3.2
flask v2.3.3
requests v2.31.0

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。