このエントリーをはてなブックマークに追加
スポンサーリンク

2016年1月8日 ツイッターAPIからトレンドワードを取得

「あなたもウィスパー」というスクリプトを作ろうと思ったのだが、妖怪の名前をどうやって作れば良いか。

乱数ひらがなかカタカナを組み合わせてみたが、どうもイマイチ意味のある名前にならない。もっと、意味のある単語を組み合わせないと。

「あなたもケロちゃん」は英単語を全部登録すればいいのだが、日本語の単語を全部登録するのでは、いくらなんでも面倒すぎる。そもそもデーターベースがパンクしてしまう。

じゃあ、ツイッターのトレンドワードをcrontabで取得して、それを乱数で表示させて妖怪の名前にしちゃえばいいや、と思った。

しかし、crontabで動かすためにはPHPじゃなくてPerlで作らねばならん。Perlでどうやってツイッターから読みこめばいいのか。

ああ、そういや、自分のサーバーにNet::Twitter::Liteというモジュールを入れたっけな。これでトレンドワードを取得する関数を呼び出せばいいや。

ところが、やってみたら、410 Goneと表示されてレスポンスが帰ってこない。えーなんでなんで??

色々調べた結果、Net::Twitter::LiteはAPI1.0を呼び出すのと、API1.0はもう使えないという事らしい。さらに調べたら、API1.1対応版があるというので、さっそくCPANからダウンロードした。

http://search.cpan.org/~mmims/Net-Twitter-Lite-0.12000/

ここからNet-Twitter-Lite-0.12006をダウンロードしてみた。・・・が、同じだ。まったく同じ410 Goneだ。えー、なんでなんで??

色々調べたところ、
http://qiita.com/nmkwnryk/items/e20ffb299ac55d7bd3d2
の情報によると、

use Net::Twitter::Lite::WithAPIv1_1;

と宣言しないとAPI1.1を使う事にならないようだ。じゃあ、それでやってみよう。

・・・ところが、trends_place(id)というメゾットを呼びだそうとしても、そんなメゾットはないとPerlに怒られてしまう。

/usr/lib/perl5/5.8.8/Net/Twitter/Lite/API/V1_1.pm
を調べたところ、確かにそんなメゾット定義されてない。マニュアルにあるのに・・・。っていうか、多分CPANのマニュアルは、1.0のをそのままコピペして使いまわしてるだけだろう。

しかし、おかしいな。V1.1でもtrand_placeというAPIはあるはず。
http://dx.24-7.co.jp/twitterapi1-1-rest-api/
の情報によると、GET trends/place っていうAPIがあるはずなんだけど、なんでないんだろう??まあ、おそらく Net-Twitter-Lite-0.12006のバグで、しかも今の今まで誰もその機能を使ってないから、誰も指摘してないんでしょうけど・・・・。

じゃあ、しょうがない。ないものは自分で作るしかなかろう。というわけで、
/usr/lib/perl5/5.8.8/Net/Twitter/Lite/API/V1_1.pm
の、1071行目あたりに追加しましたよ。

https://dev.twitter.com/rest/reference/get/trends/place
を参考に、

[ 'trends_location', {
aliases => [ qw// ],
path => 'trends/place',
method => 'GET',
params => [ qw/id/ ],
required => [ qw/id/ ],
add_source => 0,
deprecated => 0,
authenticate => 1,
booleans => [ qw// ],
base_url_method => 'apiurl',
} ],

authenticateを1に設定しているのは、このAPIがRequires authentication?
Yesになっているためです。pathとかは他の行を参考にしました。

あと、地域コードは従来はwoeidとなっていた部分が、API1.1からはidとなっているので、ここもそれに合わせてidに変更してあります。

でもって、それがわかるまで何度も何度も試行錯誤を繰り返してようやくPerlでトレンドを取得する部分ができました。

わかってしまえばどうって事はない。Perl側で

$woeid=23424856;
$res=$twitter->trends_location({id => $woeid});
$trend_list = $res->[0]->{'trends'};

として、$trend_listをforeachでループさせて{'query'}というハッシュを取得すればOK。Googleで検索して誰かが作ったのをコピペしようと思ったんだけど、いまのところPerlでそれをやってる人がいないようなので、仕方なく自分で書いた。

誰かが最初に自分で作ってソースを公開すると、それがコピペされてうわーっと広まってしまうので、適当に10分ぐらいで作ったのを公開すると、あんまりよろしくないものまで広まってしまうから注意が必要だ。

たとえばURLエンコードする場合に、
http://mikeneko.creator.club.ne.jp/~lab/perl/numerical_transform/
> pack("H2") を使えば一撃で変換できるのに、
> 見るからに遅そうな hex() + pack() がよく使われているのはなぜでしょう?

とあるが、そういう自分もずっとhex() + pack()でやってたからな。その理由がCGI入門書に載ってるのをそのままコピペして使いまわしてたから、という。

で、しかも、Perlの勉強の時に作ったやつをそのままコピペして使いまわしていたんで、仕事上で作るプログラムでPerlでURLエンコードする際もずっとそれを使ってたという。結局、それで動いちゃうともうそれ以上詮索しないからね。それなんで、あまりよろしくないロジックでも、最初に誰かが作ったやつが広まってしまうという。

そういや、最初にこのサイトでソケットのプログラムのサンプルを公開した時も、10分ぐらいで適当に作ったやつが検索するとかなり広まってしまって非常に恥ずかしい思いをした。

そんなわけで、トレンドワードを取得する部分はもうちょっと練ってから公開する事にしよう。


 △先頭へ  コメント(0)  トラックバック(0)  拍手(0)

スポンサーリンク