#social_data参加メンバーのリスト作るスクリプト書いた

標題の通りです。@zaoriku0さんが「誰かリスト作って」と言ってたので書きました。
「入門 ソーシャルデータ」真面目に勉強する会 第1回〜第10回
の参加者をATND APIで取ってきて、TwitterAPI使ってリスト作るだけです。

結果作ったリスト→ https://twitter.com/#!/who_you_me/social-data

# -*- coding: utf-8 -*-

import urllib
import json
import cPickle as pickle
import oauth2

"""
ATND APIにアクセスして参加者のTwitter_screen_nameを取得
"""

def make_query(params):
    # "key1=value1&key2=value2..."に変換
    return '&'.join(['%s=%s' % (key, ','.join(value)) for key, value in params.items()])

ep = 'http://api.atnd.org/events/users/'

# イベントID
ids = [23451,24237,24517,24531,24533,24532,25511,25512,25513,25514]
ids = map(lambda x: str(x), ids)

# valueはリストで入れよう
params = {'event_id': ids, 'format': ['json']}

url = ep + '?' + make_query(params)
response = urllib.urlopen(url)
data = json.loads(response.read())

users = [user['twitter_id'] for event in data['events']
         for user in event['users'] if user['twitter_id']]

# 重複を取り除く
users = set(users)

# 永続化
pickle.dump(users, open('users.pkl', 'w'))

"""
Twitter APIにアクセスしてリストを作成
"""

CONSUMER_KEY = YOUR_COMUSER_KEY
CONSUMER_SECRET = YOUR_CONSUMER_SECRET
ACCESS_TOKEN_KEY = YOUR_ACCESS_TOKEN_KEY
ACCESS_TOKEN_SECRET = YOUR_ACCESS_TOKEN_SECRET

# リストつくる
ep = 'https://api.twitter.com/1/lists/create.json'
params = {'name': 'social_data',
          'description': '「入門 ソーシャルデータ」真面目に勉強する会 の参加者'}

consumer = oauth2.Consumer(CONSUMER_KEY, CONSUMER_SECRET)
token = oauth2.Token(ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET)
client = oauth2.Client(consumer, token)

response = client.request(ep, 'POST', urllib.urlencode(params))
data = json.loads(response[1])
list_id = data['id']

# 作成したリストにメンバーを登録
ep = 'https://api.twitter.com/1/lists/members/create_all.json'
params = {'list_id': list_id, 'screen_name': ','.join(users)}
client.request(ep, 'POST', urllib.urlencode(params))

ATNDのAPI、イベントIDを指定して検索するときに複数のIDを指定するには
event_id=id1,id2,id3...
みたいにコンマで区切ってセットするんだけど、このコンマをパーセントエンコードしちゃうと何故か正しい結果返さないんだよなあ、、、
なのでurlllib.urlencode()は使えず、仕方ないので自分でkey=valueの形に(エンコードせず)変換するmake_query関数を作りましたとさ。