twitter認証を今更ながら実装してみた
Python 2.7 でTwitter認証をするコードを書いてみたのでメモ
アプリの登録をおこなって consumer_key 、consumer_secret を取得しておきます
前準備
sqlite3 でテーブル作っとかないとだめっぽかったので 一番最初にテーブルを作っときます
import os.path import sqlite3 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) db_path = os.path.join(BASE_DIR, "oauth.db") with sqlite3.connect(db_path) as db: db.execute('''CREATE TABLE oauth(oauth_token text, oauth_token_secret text)''') print "ok"
コード配置
以下のファイルをcgi-bin に配置。実行権限をつけておきます。 そのときにアプリの consumer_key 、consumer_secret を書いておきます
トークンを取得するヤーツ。
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib import oauth2 as oauth import sqlite3 request_token_url = 'https://twitter.com/oauth/request_token' access_token_url = 'https://twitter.com/oauth/access_token' authenticate_url = 'https://twitter.com/oauth/authenticate' consumer_key = '******' consumer_secret = ''******'' def getOAuth(): consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret) client = oauth.Client(consumer) # reqest_token を取得 resp, content = client.request(request_token_url, 'GET') request_token = dict(parse_qsl(content)) # 認証ページに遷移 url = '%s?oauth_token=%s' % (authenticate_url, request_token['oauth_token']) print "url = %s<br/>\n" % url print "request_token['oauth_token'] = %s<br/>\n" % request_token['oauth_token'] print "request_token['oauth_token_secret'] = %s<br/>\n" % request_token['oauth_token_secret'] print '<meta http-equiv="refresh" content="3;url=%s">' % url # request_token と request_token_secret を保存 with sqlite3.connect('oauth.db') as con: con.execute(u'insert into oauth values (?, ?)', (request_token['oauth_token'], request_token['oauth_token_secret'])) con.commit() def parse_qsl(url): param = {} for i in url.split('&'): _p = i.split('=') param.update({_p[0]: _p[1]}) return param if __name__ == '__main__': print 'Content-type: text/html; charset: utf-8\n\n' print getOAuth()
Tweet内容を取得するヤーツ
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import cgi import cgitb import oauth2 as oauth import sqlite3 import json from requests_oauthlib import OAuth1Session cgitb.enable() request_token_url = 'https://twitter.com/oauth/request_token' access_token_url = 'https://twitter.com/oauth/access_token' consumer_key = ''******'' consumer_secret = ''******'' def callback(): # oauth_token と oauth_verifier を取得 if 'QUERY_STRING' in os.environ: query = cgi.parse_qs(os.environ['QUERY_STRING']) else: query = {} # oauth_token_secret を取得 con = sqlite3.connect('oauth.db') oauth_token_secret = con.execute( u'select oauth_token_secret from oauth where oauth_token = ?' , [query['oauth_token'][0]]).fetchone()[0] con.close() # Access_token と access_token_secret を取得 consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret) token = oauth.Token(query['oauth_token'][0], query['oauth_verifier'][0]) client = oauth.Client(consumer, token) resp, content = client.request(access_token_url, "POST", body="oauth_verifier=%s" % query['oauth_verifier'][0]) access_token = dict(parse_qsl(content)) return access_token['oauth_token'], access_token['oauth_token_secret'] def client2(access_token, access_token_secret): # https://qiita.com/ogrew/items/0b267f57b8aaa24f1b73 url = "https://api.twitter.com/1.1/statuses/user_timeline.json" params ={'count' : 5} twitter = OAuth1Session(consumer_key, consumer_secret, access_token,access_token_secret) req = twitter.get(url, params = params) if req.status_code == 200: timeline = json.loads(req.text) print timeline print "\n\n" for tweet in timeline: print tweet['user']['name'] else: print("ERROR: %d" % req.status_code) def parse_qsl(url): param = {} for i in url.split('&'): _p = i.split('=') param.update({_p[0]: _p[1]}) return param if __name__ == '__main__': print 'Content-type: text/html; charset: utf-8' print access_token, access_token_secret = callback() client2(access_token, access_token_secret)
起動
$ python -m CGIHTTPServer
挙動
http://localhost:8000/cgi-bin/auth.py
にアクセス
認証しますか? って聞かれて認証すると登録したURLにリダイレクトされる
リダイレクトされるときにリクエストパラメータがついてるので
http://localhost:8000/cgi-bin/tweet.py
に リクエストパラメータそのままでアクセス
→ Tweetの内容が取得できる
ハマったところ
- TwitterAPI は全部HTTPS になったっぽい
- 認証後に トークンを引き回さないとだめなところ
参考
以下の記事に感謝
pythonでoauth認証 - Hello World!!
Python で Twitter API にアクセス - Qiita
moremagic
2018-01-01