カレーのライスをtech忘れ

odmishienのtechメモ

Flask + Tweepy でTwitterOAuth周りを触った

きっかけ

  • Twitterでバズるのって本当にTweetの中身が伴っているからバズってるのか、そのユーザの持つ特性とかがあって初めてバズってるのかよく分からないなあと思って完全に匿名のTwitterクライアントwebアプリを作ってみようと思い立ったのがきっかけ。

コード

from flask import Flask, render_template, request, redirect, session
import tweepy
import logging
import os

CONSUMER_KEY = 'YOUR CONSUMER_KEY'
CONSUMER_SECRET = 'YOUR CONSUMER_SECRET'
CALLBACK_URL = 'http://localhost:8000/'

app = Flask(__name__)
app.secret_key = 'なんでもいい'

@app.route('/')
def index():
    tweets = get_tweets()
    return render_template('index.html',tweets=tweets)

@app.route('/login',methods=['GET'])
def login():
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, CALLBACK_URL)
    try:
        redirect_url = auth.get_authorization_url()
        session['request_token'] = auth.request_token
    except tweepy.TweepError as e:
        logging.error(str(e))
    return redirect(redirect_url)

def get_tweets():
    token = session.pop('request_token', None)
    verifier = request.args.get('oauth_verifier')
    if token is None or verifier is None:
        return False
    auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET,CALLBACK_URL)

    auth.request_token = token
    try:
        auth.get_access_token(verifier)
    except tweepy.TweepError as e:
        logging.error(str(e))

    api = tweepy.API(auth)
    return api.home_timeline(count=100)

if __name__ == '__main__':
    app.run(debug=True,port=8000)

ハマったポイント

①そもそもTwitterOAuth認証の仕組みが分からん

コードはこちらを参考にしました

やってることは

1.twitterからリクエストークンを取得する

2.twitter.comにリダイレクトしてユーザーにアプリケーションを承認してもらう

3.コールバックを使用している場合、twitterはユーザーをアプリケーションにリダイレクトします。それ以外の場合、ユーザーは手動で検証コードを入力する必要があります。

4.承認されたリクエストークンとアクセストークンを交換します。

TwitterのDeveloper向けAppの仕様が若干変わっていた

OAuthがなかなかうまくいかず、KEYもSECRETも正しいはずなのに... ずっと出ていたエラーがこちら。

Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings.

なんだと?Callback URLをTwitterAppを作ったものと同じものにちゃんと設定しないといけないらしい。前触った時はCALLBACKURLとかテキトーに設定した記憶しかない。 http://localhost:8000 に設定すれば無事動きました。

認証周りだけでかなり躓いてしまって萎えました。

参考サイト

github.com