ふぁぼスクリプト書いた

すごく今更何ですがユーザーIDを指定して最大20件までふぁぼれるふぁぼスクリプト書きました。
同じようなことをした人が世の中に一体何人いることかって感じですが。

ふぁぼスクリプトはいいとして、twitterAPIをいじるようになってからそれ用のクラスを色々試行錯誤しているので、自戒の意味を込めて今日はそれについて少し書きます。

まず今回ふぁぼスクリプトを書くにあたって、オレオレtwitterAPIのクラスは恥ずかしい話今までぎーまるbot用しか想定していませんでした。
で、それじゃあまりにも汎用性が’ないので他のTwitterアプリにも使えるようにしました。

そしてクラスを書き直していて思ったのですが、パターンの選定をとてもミスってますね。
singletonじゃなくてabstract factoryとかが適切だったのではないだろうか・・・。
前はsingletonで書いたら使いやすいぜヒャッハーとかいってたけど本当に何いってるの馬鹿じゃないのという感じですね。
twitteroauth.phpとかconsumer.phpとか使えばAPIのURL変えるだけなのになんでいちいちfunction作ってるのか。意味が分からん。
まぁコンストラクタで必要なもの全部作ってしまってかつそれを外部から書き換えられないように保証するというのはすごくいいことなので、singletonとfactoryを混ぜて書くのが正解なんですかね・・・。


他にもいろいろ気に入らない部分はあるのですが、仮にも既に動いているものを書き換えるのは怖いっすねー。
まぁめちゃめちゃ大勢の人に迷惑かけるわけではないので勇敢に書き直し作業を進めていきたいです。

こいつが例のダメダメクラスちゃんなので、遠慮なくツッコミ入れてくれるとうれしいです。
https://github.com/gong023/public-product/blob/master/tweet_maru.php

まるちゃんのボタン Part2

http://d.hatena.ne.jp/gong023/20120415/1334493336
↑に書いてあるように前回のまるちゃんbotの修正したんですが

ごはんあるかどうか教えてくれる機能もついでにつけてみたけどよくかんがえたらまるちゃんでログインして普通につぶやけばよかったのではと思い始めた

みたいなことを書いてたら、実際に使ってくれた住人に
「その日たべるっていった人にリプライでツイートできるようにしたらいいのに」
って言われたので、それもそうだなぁと思って、そういうことができるようにコードを急遽書き直しました。

というわけで毎日スクリプトで計算した「ごはんたべたい」人のリストをリセット&再insertするようにしたんですが。
よく考えたらデータはDBに入れなくてもその都度計算すればいいんですよね。
勢いで書き始めて半分ぐらいで気付いたけど結局最後まで書きました。

ちなみにDBはmongoを使っているんですがせっかくドキュメント式のDB使うなら消去するのではなくとにかく突っ込んでいくのが本当な気がする。まぁ前回の実行時間もそうしてるからこれは前から抱えてたんだけど

まぁでも早く粗く実装するのも楽しいです。個人でそこまでお行儀よくなくていいよね。

github
https://github.com/gong023/public-product

まるちゃんのボタン

前回だか前々回だかのブログでまるちゃんbotでごはん食べる人をカウントするようにしたよと書きました
まるちゃんbotにこんな機能つけてみた - 負け犬がいろいろとかたったら
現在botだと17:30にごはん食べたい人計算するようになっているのですが、その時間過ぎてもう一度食べたい人とか作りたい人とか計算する用のボタンを作りました
http://gong023.com/marubot/
こちらは17:30を過ぎてリプライしてしまった場合でもちゃんと拾って計算してくれます。
当然リセットも毎日されます。

中身のロジックは一切変えてないです。cronで回してたスクリプトを外から見える位置に移しただけ。
でもそれじゃつまらないなと思って無理やりjs使ってモダンな感じだしてみた。
ぶっちゃけajaxとかなくてもいけるから。あとcssもいい加減。

まぁ30分のクオリティだと思って、将来性に期待して下さい。
僕にとっては大きくはまらずに組めたということが今回の一番の収穫です。

github
https://github.com/gong023/public-product/tree/master/yaneura_marubot

追記:
ごはんあるかどうか教えてくれる機能もついでにつけてみたけどよくかんがえたらまるちゃんでログインして普通につぶやけばよかったのではと思い始めた

まるちゃんbotにこんな機能つけてみた

ギークハウス高円寺の妖精まるちゃん(@geekmaru)に機能をいくつか追加しました。
住人向けのアナウンスも兼ねてブログに書いておきます。

こんな機能です

毎日4時にまるちゃんが「今日、ご飯いる?」と聞きます

それに対してこんな返信をしてあげると・・・

まるちゃんがその人数をカウントして五時半にまとめてお知らせしてくれます

==以下住人向けアナウンス==

使い方と注意点

4時のツイートについて
  1. 「今日、ご飯いる?」というつぶやきをtwittbot.netに登録しないでください。今度からは僕の書いたスクリプトで動きます(他のツイートは大丈夫)。
  2. ツイートするメンバーはぎーまるちゃんのリストから選出されます(https://twitter.com/#!/geekmaru/geekmaru-member
    1. このリストのメンバーを追加したり削除したりすると、その人も「ご飯いる?」の対象になってしまうので気をつけて。
5時半のツイートについて
  1. その日ご飯がほしかったら「ほしい」または「いる」という言葉を含めてまるちゃんにリプライして下さい
  2. その日ご飯を作ってくれる場合は「つくる」または「作る」という言葉を含めてまるちゃんにリプライして下さい。

こんなツイートでもまるちゃんは拾ってくれます。

  • 以下すべて「ご飯食べたい人リスト」に入ります
    • @geekmaru ほしいー
    • いるー @geekmaru
    • @geekmaru abcdefほしいです012345
  • 以下すべて「ご飯つくるひとリスト」に入ります
    • @geekmaru 作る
    • @geekmaru ああああつくる
  • リストが同じなら同一人物を二回はカウントしない。
    • @geekmaru いるほしいつくる作る(「ご飯食べたい人リスト」「つくる人リスト」は各一回ずつだけ入ります。)

補足

  1. ご飯をつくる人や食べたい人がいなかった場合、その部分はツイートされません。(両方いなかった場合五時半に何もツイートしません)
  2. ちなみこの技術はtwitterアカウントとリストがあればどこでも応用可能ですので使いたかったらどうぞ。

==住人向けアナウンスここまで==

技術的なお話

  • 「どうやったら昨日の『ほしい』というリプライを拾わないのか」というのを考えるのが多少面倒だけど毎日strtotimeでとった時間を保存すれば簡単でした。思ったより拡張性もありそう。
  • strtotimeで取得した時間は無駄にmongoDBを使って保存しています
  • mongoDBの特性は悲しいくらい活かしていません
  • twitterAPIにアクセスするクラスとmongoDBを使ってアクセスするクラスはsingletonパターンで作ったら非常に相性がよくてやりやすかったです

コードはgithubで公開しています:https://github.com/gong023/public-product/tree/master/marubot

とらbotバージョンアップのお知らせ

とらbotに新機能を追加しました。

今まで「セッ」以外のバリエーションとして「ふあああおっぱいもみてえええ」といったツイートがあったのですが、今度からはそういった「当たり」パターンのバリエーションはとらちゃん(@tora_666)のツイートから任意の単語を含むものを自動的に抽出して設定できるようになりました。


要はですね。

  • とらちゃんのツイートから最新200件を取得する
  • その中で「おっぱ(略)」「ちん(略)」といった単語を含むツイートを自動抽出する
  • ここで抽出されたツイートが一定確率で「セッ」の代わりになる

ということです。
テストではゲスい単語が入ったツイートが一発で取得しできました。期待を裏切らないとら様はさすがでございます。

またコード的に以下の変更にはすぐ対応できるようになっています

  • とら以外のツイートも検索の対象にしたいんだけど
  • 検索する単語を追加したいんだけど
  • 検索する単語が「セッ」の代わりになる確率を変更したいんだけど
  • ↑「おっ(略)」が含まれるツイートは10分の1「ち(略)」が含まれるツイートは10分の9とかにしたいんだけど

ここまでなら大丈夫です。
何か要望があったらどうぞ

というわけでみなさんとらbot登録してください
http://gong023.com/torabot/www/?action_index=true

コードはgithubで公開しています
https://github.com/gong023/public-product

ごんも

http://labs.s-cubism.com/blog/2010/07/20/199/

<?php
if (!extension_loaded('mongo')) die ('Mongo is not installed');

$mongo = new Mongo();
$db = $mongo->selectDB("test");
$collection = $db->selectCollection("testcollection");

$data = array('user_id' => 1);
$data = array('user_id' => 2);
$collection->insert($data);
$cursor = $collection->find();
foreach($cursor as $key => $value) {
    print_r($value);
}

すいません勉強します