すらいむがあらわれた

こまんど >  たたかう  にげる

Yahoo! PipesでJSONデータを作る

BOTつくろう会の初心者グループの皆さんは今のところtwitterのタイムラインを取得してそのデータで何かしようとしたり、自分であらかじめ用意したテキストデータをpostさせたりしようとしているのだけど、Web上のいろいろなデータを取得してbotの発言の材料にできるといいよね。


BOTつくろう会ではtwythonというtwitter用ライブラリを使っている人が多い。
http://pypi.python.org/pypi/twython/
twythonはsimplejsonというjsonライブラリが必須。twythonはTwitterデータ取得にJSONを使っている。
http://pypi.python.org/pypi/simplejson


なので、JSONでWeb上のデータを取得できるようになれば、twythonでtwitterのデータを扱うのとほとんど同じようにWeb上のデータを扱える。
Yahoo! Pipesでお好みのRSSを加工してJSONデータを作って、python+simplejsonで取得する方法を解説してみました。


Yahoo! Pipes
http://pipes.yahoo.com/pipes/
は米Yahoo!のサービスです。(Yahoo! Japanではありません)
使うためにはまず米Yahoo!のアカウントを取りましょう。


BOTつくろう会での紹介用に作ったPipesです。
BOTつくろう会 まとめRSS
http://pipes.yahoo.com/pipes/pipe.info?_id=2b69717b8ceb61092f9aafb51188c0c3
青色のRSSアイコンが付いている「Get as JSON」のリンクでJSONデータを取得することができます。
YahooPipesBot2ku
YahooPipesBot2ku posted by (C)kanpan
Yahoo! Pipesの編集画面では画面左側の欄にならんでいるパーツを右側の方眼紙のようなスペースに落として、線で結んでいきます。
パーツの組み合わせと結び方の順番でいろんな加工ができます。


このPipesでやっている処理は以下です。
1、RSSの読み込み
Fetch Feedパーツを使って3つのRSSを読み込み。
http://twitter.com/gaetwbot twitter gaetwbot
http://d.hatena.ne.jp/bot2tuku/ BOTつくろう会公式ブログ
http://groups.google.com/group/gaetwbot/ gaetwbot Googleグループ
(gaetwbot Googleグループはspam投稿が交じっているため、これにだけ読み込みの後にFilterパーツをつけてspamをフィルタリングしていますが、ここでは解説を省きます)


2、共通のタグを追加
読み込んだ3つのRSSのデータはそれぞれ形式が違っています。
あとでプログラムで扱う時には3つのRSSデータに共通のタグがついていないと扱いにくいです。
そこでCreate RSSのパーツを使ってTitle,Description,Linkのタグを共通でつけます。


3、3つのRSSを統合
3つのCreate Rssパーツからの線をUnionパーツに結合します。3つのRSSのデータを1つにまとめます。


4、並び替え
日付の新しい順で並び替えます。
SortパーツでpubDateを対象に選び、並び替え順にdecendingを選んでいます。
decendingは「降順」です。値の大きい方が一番上になります。


5、出力
Pipe Sortパーツの線をOutputパーツに繋ぎます。
この結果をRSSJSONのURLから取得できます。



PipesができたらJSON出力のURL(Get as JSONのリンク先)を調べ、pythonのコードで読み取ります。
以下のようにsimplejson.loadメソッドを使います。
以下のコードではtitle一覧を出力します。


# coding: UTF-8
# vim: fileencoding=utf-8 :

import urllib2
import simplejson

def json_test():
json_url = "http://pipes.yahoo.com/pipes/pipe.run?_id=2b69717b8ceb61092f9aaf
b51188c0c3&_render=json"
result = simplejson.load(urllib2.urlopen(json_url))
for item in result["value"]["items"]:
print item["title"]

def main():
json_test()

if __name__ == "__main__":
main()


Yahoo! Pipesは米Yahoo!のサービスで全部英語なので英語が苦手な方には厳しいかもしれません。
日本語でYahoo! Pipesを解説しているブログの中では、個人的には以下の記事がおすすめです。
Yahoo!Pipesの使い方(全モジュール解説) - 福井プログラマー生活向上委員会
http://chikura.fprog.com/index.php?UID=1175617938
ですが、Yahoo! Pipesは機能追加がたびたび行われているようなので、できればYahoo! Pipesサイトで公式リファレンス(もちろん英語)を参照するのが一番確実です。


Yahoo! Pipesはつかいこなすとかなりいろんなことが出来ます。
ごうだまりぽさんのYahoo! PipesPipesつかいこみの参考におすすめ。
Pipes from Maripo GODA
http://pipes.yahoo.com/pipes/person.info?display=pipes&eyuid=L0NmrA00p2eCwT5jyWwhznyV
ページからそれぞれのpipesの編集画面を参照するといろんな使い方が見られます。