読者です 読者をやめる 読者になる 読者になる

Portal:siro

ダイレクトマーケティングブログ

@joachim_botの新着村立てお知らせ機能について(Twitter BOT)

しょうもない情報でもないよりはマシってばっちゃが言ってた

概要

人狼物語系のスクリプトは新着村立て情報をRSSで配信しています。
そのRSSを定期的に拾ってきて、新着村があれば村名とURLをPostします。
ぶっちゃけ、ココの新着村立て情報と大体仕組みは同じです。

おおまかな処理の流れ

沢山あるRSSYahoo!Pipesで処理して1つのRSSに。

Yahoo!PipesRSSをMagpieRSSで収集してphpで扱えるように加工。

phpから@joachim_botにPost。phpは1時間毎にcronで呼び出しています。

手順みたいなの

RSS生成

まずYahoo!PipesRSSをまとめます。


こんな感じで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_botServices_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:と言ったけどどこの現地か知らないや