「寝坊した」人に自動的に遅刻の言い訳を提案する仕組みを稼働させてみた。
お疲れ様です。高橋です。
寝坊した人にアプリをオススメする仕組みを作りましたが、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使用率が結構上がっていたのも気になりました。
しかし、猪木も言っています。
この道を行けばどうなるものか 危ぶむなかれ 危ぶめば道はなし
踏み出せばその一足が道となり その一足が道となる 迷わず行けよ 行けばわかるさ
そう、やってみないとわからないのです。行けばわかります。
以上、よろしくお願い致します。
関連記事
-
-
リリースした事をスッカリ忘れていた2つのアプリの今について。
お疲れ様です。高橋です。 最近すっかりArduinoにハマってしまって、Andr …
-
-
街頭インタビュー 入力UI実装
お疲れ様です。高橋です。 今日は文字入力UI及び、背景人物の切り替え機能を実装し …
-
-
総務省統計APIで引っ張ったデータをHoloGraphLibraryで可視化してみた
お疲れ様です。高橋です。 先日の「総務省の統計APIからデータを取得する」ではデ …
-
-
FreeなWindows向けDAWを使って作った音楽をwavからoggにしてAndroidアプリで鳴らしてみた。
お疲れ様です。高橋です。 先日POSTした「DAWを使って、ゲームの裏側で鳴らす …
-
-
遅刻の言い訳提案システム 第一週最終日
お疲れ様です。高橋です。 今週は稼働→分析→修正→稼働、という繰り返しを何度か実 …
-
-
アプリ開発に必要な要素技術
お疲れ様です。高橋です。 androidアプリ開発に必要な要素技術はものすごーー …
-
-
Win7(64bit)+Unity4.5.5f1で作った物をAndroidエミュで動かしてみた
お疲れ様です。高橋です。 先ほどはcocosを使ったサンプルをエミュで動かす所ま …
-
-
Google Play Developer登録
お疲れ様です。高橋です。 本日は引き続きwordpress周りの設定を行うと同時 …
-
-
TwitterアナリティクスからCSVがダウンロード出来ない
お疲れ様です。高橋です。 TwitterアナリティクスのCSV 遅刻の言い訳提案 …
-
-
寝坊検知&遅刻の言い訳提案システム #2
お疲れ様です。高橋です。 昨日作った遅刻の言い訳提案システムですが、Tweetの …
- PREV
- Twitter上に広がる寝坊市場について
- NEXT
- 寝坊検知&遅刻の言い訳提案システム #2


