「寝坊した」人に自動的に遅刻の言い訳を提案する仕組みを稼働させてみた。
お疲れ様です。高橋です。
寝坊した人にアプリをオススメする仕組みを作りましたが、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使用率が結構上がっていたのも気になりました。
しかし、猪木も言っています。
この道を行けばどうなるものか 危ぶむなかれ 危ぶめば道はなし
踏み出せばその一足が道となり その一足が道となる 迷わず行けよ 行けばわかるさ
そう、やってみないとわからないのです。行けばわかります。
以上、よろしくお願い致します。
関連記事
-
-
Win7(64bit)+cocos2dx-3.2でAndroid開発環境を構築してみた
お疲れ様です。高橋です。 ゲームを作る際に、自分で1から細々とした部品を作らなく …
-
-
広告IDが取得出来なかった理由がわかってきた。かな?
お疲れ様です。高橋です。 しばらく前からめぼしい更新を停止していた「カナかな?」 …
-
-
アプリ開発に必要な要素技術
お疲れ様です。高橋です。 androidアプリ開発に必要な要素技術はものすごーー …
-
-
西野カナ風な歌詞自動生成「カナかな?」をリリースしてみた。
お疲れ様です。高橋です。 昨日はずっと助詞に関する実装をしていたのですが、どうし …
-
-
歌詞生成アプリ「カナかな?」の動詞をチューニングしてみた。
お疲れ様です。高橋です。 昨日はサーバ周りに熱中してしまってクライアント側を全く …
-
-
遅刻の言い訳提案システム 稼働四日目
お疲れ様です。高橋です。 本日も遅刻の言い訳提案システムのデータの分析と改善のた …
-
-
androidアプリの作り方
お疲れ様です。高橋です。 androidアプリの作り方は、ググったところ大体下記 …
-
-
遅刻の言い訳アプリのDL数が急増した原因
お疲れ様です。高橋です。 ふとgooglePlayのダウンロード状況を見たら、言 …
-
-
「カナかな?」を実機デバッグし、ログ送出機能を追加してリリースしてみた。
お疲れ様です。高橋です。 デバッグしてみた 先日リリースした、西野カナ風の歌詞を …
-
-
寝坊検知&遅刻の言い訳提案システム #2
お疲れ様です。高橋です。 昨日作った遅刻の言い訳提案システムですが、Tweetの …
- PREV
- Twitter上に広がる寝坊市場について
- NEXT
- 寝坊検知&遅刻の言い訳提案システム #2


