前提・実現したいこと
FlaskとTweepyを利用してユーザー認証したユーザーのツイートを削除するwebアプリを作成しています。
(黒歴史クリーナーみたいなもの)
発生している問題・エラーメッセージ
Twitterログインの後上手く動くこともあるのですが、頻繁にエラーがでます。エラーの内容をみてみると、tweepyの401エラーのようでした。
Oauth認証がうまくいってないのだろうと考え調査した結果、Twitterログインを行った後、コールバックURLの後ろに付加されるGETパラメータをうまく取得できずNoneになっているのが原因のようでした。ただ、うまく動く場合と動かない場合の違いがわかりません。一応コールバックのURLはちゃんと返ってきているので、request.args.get()のところで問題が発生していると思います。
該当のソースコード
python
1from flask import * 2from requests_oauthlib import OAuth1Session 3from urllib.parse import parse_qsl 4import tweepy 5import os 6# from dotenv import load_dotenv 7 8 9 10CONSUMER_KEY = os.environ.get('CONSUMER_KEY') 11CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET') 12 13 14app = Flask(__name__) 15app.secret_key = os.urandom(24) 16 17##中略 18 19@app.route('/callback', methods=['GET', 'POST']) # ログイン後、アクセストークンなどがパラメータとしてくっついてきます 20def call_back(): 21 if request.method == 'GET': 22 oauth_token = request.args.get('oauth_token') # ここの二つの変数がNoneになってしまうことがあります。 23 oauth_verifier = request.args.get('oauth_verifier') 24 25 session['oauth_token'] = oauth_token #セッションに保存 26 session['oauth_verifier'] = oauth_verifier 27 28 auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 29 token = session.get('oauth_token') 30 verifier = session.get('oauth_verifier') 31 32 session.pop('oauth_token', None) #セッションのクリア 33 session.pop('oauth_verifier', None) 34 35 auth.request_token = { 36 'oauth_token': token, 37 'oauth_token_secret': verifier 38 } 39 40 try: 41 auth.get_access_token(verifier) 42 except tweepy.TweepError: 43 return redirect('/') 44 45 46 key = auth.access_token 47 secret = auth.access_token_secret 48 49 session['access_token'] = key 50 session['access_token_secret'] = secret 51 52 return redirect('/execute') 53 else: 54 return redirect('/') 55 56 57@app.route('/execute', methods=['GET', 'POST']) # ツイ消しの実行処理 58def execute(): 59 if request.method == 'POST': 60 61 auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) #oauthハンドラ生成 62 key = session.get('access_token') # アクセストークンとシークレットキーをセッションから読み込み 63 secret = session.get('access_token_secret') 64 session.pop('access_token', None) 65 session.pop('access_token_secret', None) 66 67 auth.set_access_token(key, secret) 68 cnt = 0 # カウント用 69 try: 70 api = tweepy.API(auth) # APIのインスタンス生成 71 for status in tweepy.Cursor(api.user_timeline).items(): 72 api.destroy_status(status.id) 73 cnt += 1 74 except tweepy.TweepError as e: 75 return jsonify({'isSuccess': False, 'errormessage': e.reason}) #ここが401エラーをだします 76 77 return jsonify({'isSuccess': True, 'destroyed': cnt}) 78 elif request.method == 'GET': 79 return render_template('menu.html') 80 81@app.route('/finish') # 完了画面 82def finish(): 83 return redirect('/') 84 85 86if __name__ == '__main__': 87 app.run(host='0.0.0.0', threaded=True) 88
試したこと
補足情報
あなたの回答
tips
プレビュー