「寝坊した」人に自動的に遅刻の言い訳を提案する仕組みを稼働させてみた。
お疲れ様です。高橋です。
寝坊した人にアプリをオススメする仕組みを作りましたが、SPAM扱いされるという指摘を頂いたため、二の矢である「遅刻の言い訳」自体をリプライする仕組みに変更しました。
こんな感じに返信してくれる人もいて、ちょっと面白いです。
肝心のアプリへの誘引は、「遅刻の言い訳」Twitterアカウントのプロフィールに、ひっそりと忍ばせておくことにしました。
↓最初にやろうとしていた事
「寝坊した」とtweetした人に、自動的にアプリをオススメする仕組みが構築しました。
table
ウザブロック対策のため、24時間以内に再送しないようにするには、DBにログを仕込んでおく必要がありますので、下記のような感じのtableを作ります。
mysql> desc ewakeLog; +------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+-------+ | tweet_id | text | YES | | NULL | | | user_id | text | YES | | NULL | | | user_name | text | YES | | NULL | | | reply_date | datetime | YES | | NULL | | | tweet_date | datetime | YES | | NULL | | | click_date | datetime | YES | | NULL | | +------------+----------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
毎日動かすプログラム
「寝坊した」Tweetを100件読み込み、「@Tweetではなく、RTでもなく、24時間以内に送っていない」Tweetを選別し、replyしつつログに書き込むプログラムが下記となります。
<?php // initialize require 'twitteroauth/autoload.php'; use Abraham\TwitterOAuth\TwitterOAuth; // configure $consumerKey = '<consumer keyを入れて下さい>'; $consumerSecret = '<consumer secretを入れて下さい>'; $accessToken = '<access tokenを入れて下さい>'; $accessTokenSecret = '<access token secretを入れて下さい>'; $db_host = '<db host>'; $db_user = '<db user>'; $db_pass = '<db pass>'; $db_name = '<db name>'; $reply_tweet = 'もしかして寝坊しましたか?相手が納得出来る遅刻の言い訳を作るAndroidアプリは http://curious4dev.mydns.jp/ewake/redirect.php?tid='; $sql_select = 'select count(1) as count from ewakeLog where date_add(reply_date, interval 24 hour) > now() and user_id = :user_id;'; $sql_insert = 'insert into ewakeLog (tweet_id, user_id, user_name, tweet_date, reply_date) values(:tweet_id, :user_id, :user_name, :tweet_date, now());'; // conenct to mysql $pdo = new PDO("mysql:dbname=" . $db_name, $db_user, $db_pass); // create Twitter object and search from tweets $twObj = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); $search_key = '寝坊した'; $options = array('q' => $search_key, 'count' => '10', 'lang' => 'ja'); $json = $twObj->get('search/tweets', $options); // check tweets foreach ($json->statuses as $result) { // get parameters from tweet $tweet_id = $result->id_str; $user_id = $result->user->id_str; $tweet = $result->text; $user_name = $result->user->screen_name; $created_at = $result->created_at; // delete \n $tweet = str_replace("\r\n", '', $tweet); $tweet = str_replace("\n", '', $tweet); // is Reply? if (mb_substr_count($tweet, '@') > 0) { $isReply = true; } else { $isReply = false; } // is RT? if (mb_substr_count($tweet, "RT") > 0) { $isRT = true; } else { $isRT = false; } // is寝坊した? if (mb_substr_count($tweet, $search_key) > 0) { $isNebou = true; } else { $isNebou = false; } // check already send last 24 hour $statement = $pdo->prepare($sql_select); $statement->bindValue(':user_id', $user_id, PDO::PARAM_INT); $statement->execute(); $count = 0; if ($row = $statement->fetch()) $count = $row['count']; if ($count == 0) { $isAlreadySend = false; } else { $isAlreadySend = true; } // send reply when not reply and not RT and not send if ($isReply == false && $isRT == false && $isAlreadySend == false && isNebou == true) { // send reply $reply_json = $twObj -> post('statuses/update', ['status'=>'@'.$user_name.' '.$reply_tweet . $tweet_id, 'in_reply_to_status_id'=>$tweet_id]); /* echo "twet[" . $tweet . "]\n"; echo "reply";var_dump($isReply); echo "rt";var_dump($isRT); echo "nebou";var_dump($isNebou); echo "send";var_dump($isAlreadySend); */ // insert to log when success $created_at = date('Y-m-d H:i:s', strtotime($created_at)); $statement = $pdo->prepare($sql_insert); $statement->bindParam(':tweet_id', $tweet_id, PDO::PARAM_STR); $statement->bindParam(':user_id', $user_id, PDO::PARAM_STR); $statement->bindParam(':tweet_date', $created_at, PDO::PARAM_STR); $statement->bindParam(':user_name', $user_name, PDO::PARAM_STR); $statement->execute(); } } ?>
TwitterAPIでsearch/tweetしているにも関わらず「寝坊した」で再度チェックを掛けているのは、TwitterAPIは、いい感じの自然言語処理を混ぜているようで、「寝坊した」以外にも引っ張って来ているからです。
URLを踏んだ際に動くプログラム
送ったReplyの中のURLをクリックさせる事が本仕組みのKPIです。URLの中には元々寝坊した人のTweetのstatus_idを含めており、Replyログの中にも入れてあります。寝坊した人がクリックしたら、status_idと共に日時を採取しつつ、google Playへリダイレクトさせます。リダイレクト用のプログラムが下記となります。
<?php // configure $db_host = '<dbのhost>'; $db_user = '<dbのuser>'; $db_pass = '<dbのpass>'; $db_name = '<dbのname>'; $sql_update = 'update ewakeLog set click_date = now() where tweet_id = :tweet_id;'; // parse URL $tweet_id = $_GET['tid']; $referer = $_SERVER['HTTP_REFERER']; // insert log when click from t.co if(mb_substr_count($referer, 't.co') > 0) { // connect db $pdo = new PDO('mysql:dbname=' . $db_name, $db_user, $db_pass); // update ewakeLog $statement = $pdo->prepare($sql_update); $statement->bindParam(':tweet_id', $tweet_id, PDO::PARAM_STR); $statement->execute(); } // redirect header('HTTP/1.1 301 Moved Permanently'); header('Location: https://play.google.com/store/apps/details?id=jp.curious4dev.e_wake'); ?>
しょっちゅうTwitter側からHTTP_HEADでアクセスが来るため、人間がクリックした事を識別するため、リファラに「t.co」が含まれているかどうかで判別します。
試験
とりあえず10人を対象とした自動Replyを行いましたが、驚異のエンゲージメント率です。面白がってリツイートしてくれたり、お気に入りに登録してくれる人がいます。
稼働開始
とりあえず稼働開始です。朝7:00~08:59に1分毎、毎日120回動かします。
毎日動かすプログラムをwgetで起動させる /home/centos/ewake というシェルを作っておいて、cronで毎日07:00~08:59まで毎分動くように設定します。
* 7-8 * * * /home/centos/ewake
明日、どうなっているか、若干不安です。試験中、CPU使用率が結構上がっていたのも気になりました。
しかし、猪木も言っています。
この道を行けばどうなるものか 危ぶむなかれ 危ぶめば道はなし
踏み出せばその一足が道となり その一足が道となる 迷わず行けよ 行けばわかるさ
そう、やってみないとわからないのです。行けばわかります。
以上、よろしくお願い致します。
関連記事
-
-
SurfaceViewを使って絵を書き動かすサンプルをコピペして動かしてみた
お疲れ様です。高橋です。 本日はcocos2d-xの3.3rc0を導入しようと試 …
-
-
「カナかな?」の2週間分のダウンロード数
お疲れ様です。高橋です。 本日の貴重な帰宅後の時間は、妻からの「なんとかっていう …
-
-
URL付き言い訳提案システム 稼働初日
お疲れ様です。高橋です。 本日から、よりDL数を高める施策として、提案の中にUR …
-
-
選挙運動を疑似体験出来るシミュレータ「衆院選2014」を作った、が。
お疲れ様です。高橋です。 2014年11月21日に衆議院が解散され、12月2日に …
-
-
「遅刻の言い訳」実機デバッグ結果
お疲れ様です。高橋です。 本日、Androidを持っている同僚にお願いして、実機 …
-
-
Androidアプリで画面遷移してもBGMが鳴り続けるようにしてみた。
お疲れ様です。高橋です。 先日無事にDAWで楽曲を作成してandroidアプリか …
-
-
8bitサウンドを出すAndroidアプリをリリースしてみた。
お疲れ様です。高橋です。 先日の「Androidで8bitサウンドをモノフォニッ …
-
-
Unityでノベルゲームを作る
お疲れ様です。高橋です。 突然ですが、ノベルゲームを作ってみたくなったので、試し …
-
-
総務省統計APIで引っ張ったデータをHoloGraphLibraryで可視化してみた
お疲れ様です。高橋です。 先日の「総務省の統計APIからデータを取得する」ではデ …
-
-
街頭インタビュー生成アプリ
お疲れ様です。高橋です。 街頭インタビューっぽいアプリ 街頭インタビューっぽい画 …
- PREV
- Twitter上に広がる寝坊市場について
- NEXT
- 寝坊検知&遅刻の言い訳提案システム #2