さんまがおいしい季節だねー(´・ω・`)

Twitter API 事始め

Python,Twitter — タグ: , , — さくら @ 2009/05/05 0:50

さくらです♪こんばんわ☆ミ

今日は Twitter API でのプログラミングについて簡単に説明するわね。
そんなに難しくないからプログラムできる人はお気軽に始めてもらえればと思うわ。
あ、今回は全部 Python よ。

Twitter API プログラミングに必要なもの

最低限知っとかないといけないのは、API のマニュアルの場所ね。

Twitter API Wiki / Twitter API Documentation

日本語訳もあるんだけど最新版に追随しきれてないみたいだから、本家のサイトを参照した方がいいと思うわよ。

ついでに Twitter API 開発チーム をフォローしてもいいと思うけど、さくらの TL は速すぎてあんまり見てないわww

API のラッパーを作る

Twitter API を使ったプログラムは、REST か POST で Twitter の API サーバにリクエスト送って、XML か JSON でレスポンスを受け取って処理する、っていうのが基本になるわ。

この辺の処理をしてくれる python-twitter ってライブラリもあるんだけど、一部の API が機能してないのと、/tmp にキャッシュを構築したりする機能が付いてるんでさくらは使ってないわ。特に共有サーバだと、キャッシュが問題になるかもしれないから気をつけてね。

python-twitter を使わない場合、Basic 認証、Cookie の処理、レスポンスヘッダの処理あたりが必要になるから、その辺を便利に下請けしてくれるラッパーを用意しておくといいと思うわよ。

一応さくらの使ってるラッパーを置いとくわね。
MIT ライセンスだから好きに使ってもらっていいわよ。
それとこれを使う場合は、simplejson が要るから予めインスコしといてね。

twitterapi.py

このラッパーライブラリの使い方は超簡単よ。
TwitterAPI クラスのインスタンスを作って、上に示した Twitter API のマニュアルに掲載されてるリクエスト送信先 URL を引数にして呼び出すだけよ。

以下はラッパーの実行例ね。
USERNAME と PASSWORD には Twitter のユーザー名とパスワードに置き換えてね。
ユーザー名はメールアドレスでもいいんだけど、TwitterAPI.username で後から取り出せるからユーザー名にしといた方が便利だと思うわよ。

from twitterapi import *

# ユーザー名, パスワード, デバッグフラグ
twitter = TwitterAPI('USERNAME', 'PASSWORD', True)

# account/rate_limit_status の結果を出力
print twitter.api('http://twitter.com/account/rate_limit_status.json')

# statuses/show の結果を出力
# リクエスト URL の http://twitter.com/ は省略可
print twitter.api('users/show/%s.json' % twitter.username)

TwitterAPI.api メソッドにはオプションの data 引数と params 引数があるわ。
data 引数は POST メソッドとして送信するデータの辞書ね。リクエスト方法を POST にしたい場合は、中身は空でもいいから data 引数に辞書を渡す必要があるわよ。
params 引数には URL パラメータにクエリね。これも辞書を渡す必要があるわ。

まあそんなややこしいソースじゃないし、ぐだぐだ説明するよりもコード見てもらった方が早いと思うわよ。

あとさくらのラッパーは Twitter API の URI とかを抽象化してないから、その辺をあーだこーだ言いたい人は自分でやってよねーって感じ。

使えるスクリプトを書いてみる

API の使用目的っていうと、ボット書いたりとか Twitter クライアントを作ったりとかが多いと思うけど、定形処理をスクリプトにしとくのも便利だと思うわ。

例えば、フォローしてるけどフォローされてない人を全員リムーブしたり、フォローしてくれてるのにフォローしてない人を全員フォローしたりするスクリプトがあればとっても便利だと思わない?

ってことで実際に作るとこんな感じね。
コピペするのが面倒な人は、balancer.py からダウンロードできるわよ。

# -*- coding: utf8 -*-

import urllib2
from twitterapi import *

# Twitter アカウント
USER = 'USERNAME'
PASS = 'PASSWORD'

# destroy 対象外のユーザー
KEEP = ['twitterapi']

twitter = TwitterAPI(USER, PASS, True)

def get_pages(url):
    params = {'page':1}
    rv = []
    while True:
        a = twitter.api(url, params=params)
        if not a:
            return rv
        rv.extend(a)
        params['page'] += 1

def create(screen_name):
    try:
        twitter.api('friendships/create/%s.json' % screen_name, data={})
    except urllib2.HTTPError, e:
        if e.code != 403:
            raise

def destroy(screen_name):
    try:
        twitter.api('friendships/destroy/%s.json' % screen_name, data={})
    except urllib2.HTTPError, e:
        if e.code != 403:
            raise

def main():
    # friends 自分がフォローしてる人
    friends = get_pages('statuses/friends/%s.json' % twitter.username)
    # followers 自分がフォローされてる人
    followers = get_pages('statuses/followers/%s.json' % twitter.username)

    # フォローしててフォローされてない人を destroy
    follower_ids = [x['id'] for x in followers]
    for f in friends:
        if f['id'] not in follower_ids and f['screen_name'] not in KEEP:
            print 'Destroy %s' % f['screen_name']
            destroy(f['screen_name'])

    # フォローされててフォローしてない人を create
    friend_ids = [x['id'] for x in friends]
    for f in followers:
        if f['id'] not in friend_ids:
            print 'Create %s' % f['screen_name']
            create(f['screen_name'])

if __name__ == '__main__':
    main()

USERNAME と PASSWORD を自分のアカウントのに書き換えてから、こんな感じで実行したらワンコマンドで全部処理してくれるわよ。

$ python balancer.py

全然話変わるんだけど、他の国の人をフォローするとダイレクトメッセージが割とよく来るの。
自分のブログとかの宣伝が多いみたいだけど、そういうのはほとんど自動応答ね。
どこ見てんのよ!か正確には知らないけど、新しく自分のフォロワーになった人宛に挨拶送るような処理を自動でしてると思うわ。
API 使えば簡単に書けるから、色々試してみてね!!

さくら

0 Comments »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2017 さくらたんどっとびーず | powered by WordPress with Barecity