curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

「寝坊した」人に自動的に遅刻の言い訳を提案する仕組みを稼働させてみた。

 

お疲れ様です。高橋です。

寝坊した人にアプリをオススメする仕組みを作りましたが、SPAM扱いされるという指摘を頂いたため、二の矢である「遅刻の言い訳」自体をリプライする仕組みに変更しました。

ewake03

 

こんな感じに返信してくれる人もいて、ちょっと面白いです。

肝心のアプリへの誘引は、「遅刻の言い訳」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を行いましたが、驚異のエンゲージメント率です。面白がってリツイートしてくれたり、お気に入りに登録してくれる人がいます。

tweet01

 

稼働開始

とりあえず稼働開始です。朝7:00~08:59に1分毎、毎日120回動かします。

毎日動かすプログラムをwgetで起動させる /home/centos/ewake というシェルを作っておいて、cronで毎日07:00~08:59まで毎分動くように設定します。

* 7-8 * * * /home/centos/ewake

明日、どうなっているか、若干不安です。試験中、CPU使用率が結構上がっていたのも気になりました。

しかし、猪木も言っています。

この道を行けばどうなるものか 危ぶむなかれ 危ぶめば道はなし
踏み出せばその一足が道となり その一足が道となる 迷わず行けよ 行けばわかるさ

そう、やってみないとわからないのです。行けばわかります。

 

以上、よろしくお願い致します。

 - アプリ開発

  関連記事

「遅刻の言い訳」実機デバッグ結果

お疲れ様です。高橋です。 本日、Androidを持っている同僚にお願いして、実機 …

androidアプリから総務省APIをコールしてみる

お疲れ様です。高橋です。 androidアプリから総務省APIをコールする事に成 …

街頭インタビュー 背景人物切り替え機能の実装

お疲れ様です。高橋です。 本日は、背景人物を切り替える機能を実装しました。とりあ …

総務省の統計APIからデータを取得する

お疲れ様です。高橋です。 androidアプリから総務省APIをコールしてみる  …

合理的な遅刻の言い訳生成アプリ。

お疲れ様です。高橋です。 寝坊と遅刻連絡について 平日の朝。iPhoneのアラー …

遅刻の言い訳提案システム 稼働三日目 ~大失敗~

お疲れ様です。高橋です。 三日目を迎えた遅刻の言い訳提案システムですが、重大なバ …

アプリ開発に必要な要素技術

お疲れ様です。高橋です。 androidアプリ開発に必要な要素技術はものすごーー …

Twitter上に広がる寝坊市場について

お疲れ様です。高橋です。 遅刻の言い訳アプリ 初週DL数 2/26頃にリリースし …

アプリログをQlikViewでリアルタイムに可視化してみた。

お疲れ様です。高橋です。 タイトルは本当だと「アプリが送るログをhttpdが受け …

街頭インタビュー 入力UI実装

お疲れ様です。高橋です。 今日は文字入力UI及び、背景人物の切り替え機能を実装し …