@joachim_botの新着村立てお知らせ機能について(Twitter BOT)
しょうもない情報でもないよりはマシってばっちゃが言ってた!
概要
人狼物語系のスクリプトは新着村立て情報をRSSで配信しています。
そのRSSを定期的に拾ってきて、新着村があれば村名とURLをPostします。
ぶっちゃけ、ココの新着村立て情報と大体仕組みは同じです。
おおまかな処理の流れ
沢山あるRSSをYahoo!Pipesで処理して1つのRSSに。
↓
Yahoo!PipesのRSSをMagpieRSSで収集してphpで扱えるように加工。
↓
phpから@joachim_botにPost。phpは1時間毎にcronで呼び出しています。
手順みたいなの
RSS生成
まずYahoo!PipesでRSSをまとめます。
こんな感じでRSSをまとめます。
人狼物語Wikiにあるような一覧表示させたり、RSSリーダで読み込む分には後はpubDateで降順ソートしてあげればいいのですが…。
今回はヨアヒムに喋らせるので、古い記事を取り除いてあげる必要があります。
(今回、php側で「どの村情報まで読み込んだか」を管理せず、Yahoo!Pipesの時点で古い情報を弾くという手段をとりました。その方が作業量少なくて楽です><)
これはその下準備。時差解消のために、item.y:published.utimeから32400秒(9時間)引いてやります。
Loopで全てのRSSに対して処理を行っています。
Filterをかけます。1時間前のutimeを割り出し、そのutimeと村RSSのutimeを比較しています。
要は、1時間以内に建った村(新着村)を選別しているわけです。
1時間以内に村が2つ以上建つことなんて滅多にありませんが、一応降順ソートを掛けて出力です。
…とか書いてたら、同じFeed2回読んでるwあれ?というわけでちょいとやり直してみた。
どうやらitem.y:publishedが未来時間になるのが原因らしい。
(何故未来時間になるのかと言うと、一部の国のRSSのdc.dateやpubDateは+09:00という時差情報を出力していないのです。
で、例えば日本時間(UTC+0900)12:00にRSSが生成する(村が建つ)と、RSS側には12:00というデータのみが記載されます。
これはYahoo!Pipes側で処理されます。ただし、Yahoo!Pipesは日本にはないので現地*1時間12時と解釈されます。
現地時間12:00はUTC-07:00なので、utime換算した時に未来時間になる、というわけです((ちなみにどれくらい未来に行くかというと、9と7の絶対値取って足した16時間未来に行きます)))
んまぁそんな意味不明な説明は置いといて、どうしたかと言うと、その出力フォーマットが異なるRSSだけ別に分けて、utimeを57600秒(16時間)引きました。
そして32400秒引いている他のRSSとunionでデータ結合し、あとは同じです。
全体はこんな感じになります。
MagpieRSSで収集
MagpieRSSに関しては、MagpieRSS - PHP で使える RSS パーサー。
こちらのページを見たほうが早いです、というか、ここのソースコピペしてちょっといじればいけ(ry
そのままだと日本語が激しく文字化けします。ので、なんとかします。
私はrss_fetch.incのISO-8859-1をUTF-8に書き換えるという作業を選びました。一番楽そうだったので…。
ああ、あと、これとは別に動かしている@joachim_botのソースがUTF-8だったんで…じゃあそれでいいかと。
PHPでPost
この部分は、joachim_botのソースをコピーして弄りました。
ちなみにjoachim_botはServices_Twitterを使って動かしています。
糞ソースですが公開もしておきます。数年後に見て「うわぁ…」となるために。
<?php require_once 'rss_fetch.inc'; require_once 'Services/Twitter.php'; $user = 'TwitterID'; $pass = 'TwitterPassword'; $st =& new Services_Twitter($user, $pass); $url = '読み込むRSSのURL'; $rss = fetch_rss($url); if(!empty($rss->items)){ foreach ($rss->items as $item ) { $title = $item[title]; $title = mb_convert_encoding($title, "UTF-8", "auto"); $url = $item[link]; $message = "【新着村情報】$title が建ったよ! $url"; // $message = "てすてす"; $st->setAppName('***'); $st->setAppVersion('0.1'); $st->setAppURL('***'); $result = $st->setUpdate($message); } } ?>
あとはこのphpを実行するだけです。
ところで
F国にも対応させたいのだけど…どうしたらいいかなぁ…うむむぅ。
HTML解析するとかあんまり高度なことはできないのでバカでもわかる〜感じでお願いしたいです><
n村が開始したらn+1村が建つので、n村の更新時刻になったらn+1村が建っているか(あるかないかは村RSS問い合わせればできるはず)を確認しに行く、というのをとりあえず思いついたのですが、もっとスマートな方法があるような気がする&そもそもこの方法をどう実装するのかピンと来ないので停滞中…。
というよりも、本当はこんなことやってる場合じゃないんですよね><;
あああ…研究なんかよりこういうプログラミングのほうが楽しいお……。
*1:と言ったけどどこの現地か知らないや