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