Portal:siro

ダイレクトマーケティングブログ

ニンジャの更新が来たらYOするプログラムつくった

2014/07/23 21:38追記
なんかどうも上手く動いていない(深夜更新を朝になってお知らせする、リツイートを妙なタイミングで検知する)節がありますので、スリケンとアイキャッチ検知のみに留めようと思います。
RTは拾って告知するのは想定内だったのですが、何故かRT始まってから30分以上経過してからという謎……そんなに微妙なタイミングでぽこぽこ鳴ってもしょうがないので機能ごと削ります。





何のひねりもないタイトル通りの内容です。

「NINJADAZO」にYOを送ると、以下の条件でYOが届きます。*1

  • 時間が朝9時〜深夜2時の間(2時〜9時の間はシーライフ保護のためシステム停止します)

かつ

  • スリケンが飛んだ時
  • 開始アイキャッチ(【NINJASLAYER】)が飛んだ時
  • 前のツイートから6時間以上開いた時

のいずれかの条件を満たした時にNINJADAZOからYOが届くはずです。
なお3分に1回の頻度で動作していますので、最大3分の遅れが発生します。こんな感じで。
検知元ツイート:


昨日と今日の更新でアイキャッチと6時間ツイートが開いた時は動作確認したのですが、スリケンがまだなのでもしかしたら検知失敗するかもしれません。条件として一番簡単なのでまず無いけど。


やめたい時はYOアプリからNINJADAZOをCANCELかBLOCKかしてもらえればやめられると思います。
ニンジャ気になるけどちまちまTwitter見ていられない人へ。

◆重点◆手遊みで作ったプログラムのためスリケンを検知したりしなかったりしすぎたりするバグが発生するかもしれないし突然サービスをやめるかもしれない。真面目にリリースしているサービスではないのでなんかおかしなことがあっても怒らないでほしい。そういうのを俗に免責事項とか言ったりするけどそういうなんかそういうものを理解できる人だけ使ってもらえるとうれしい。◆重点◆


ソースコード

という前置きは置いといて、単にYO APIが面白そうだからなんか多少は実用性のあるものを作りたかっただけです。
※以下のソースは最新ではありません、が、API呼び出し方法の参考程度に残しておきます。

<?php

// ニンジャの更新があったらYOするスクリプト
// 1.◆◆をスリケンとカウントして抽出
// 2.【NINJASLANYER】アイキャッチは1つ前のツイートの末尾が0〜9の数字でなかった場合に抽出(終了アイキャッチとの区別)(時間指定はツヨイサキブレ後や与太話後のスリケン無しアイキャッチに対応できないので×
// 3.通常投稿は過去6時間以内に投稿がなかった場合に抽出

// 外部ファイル読み込み
require_once "common.php";

// 定数定義(define面倒くさいので便宜的にこう)
$LAST_TWEET_HOURS = 6;

// ファイル読み込み
$fp = fopen("最終TweetID保持用テキスト.txt","r");
$fline = fgets($fp,64);
fclose($fp);

$json = new Jsphon_Decoder();
$njslyr = $json->decode($st->getUserTimeline(array('id' => 'NJSLYR')));

// 新着tweetがない場合何もせず終了する
if ( strnatcmp($njslyr[0]["id_str"],$fline) <= 0){
	echo "no new tweet.";
	return;
}

$yo_flag = false;

// デフォルト20件取得
// 1件前のTweet内容も確認したいので、19件目から開始
for ($i = 18; $i >= 0 ;$i--){
	if (strnatcmp($njslyr[$i]["id_str"],$fline) > 0){
		if (strpos( $njslyr[$i]["text"], "◆◆" ) !== false){
			// スリケンであるか
			$yo_flag = true;
			break;
		}elseif (strpos( $njslyr[$i]["text"], "【NINJA" ) !== false &&
			!is_numeric(mb_substr(trim($njslyr[$i+1]["text"]),-1))) {
			// アイキャッチかつ直前のツイート末尾が数字ではないか(連載中断アイキャッチの除外)
			$yo_flag = true;
			break;
		}elseif (strtotime($njslyr[$i+1]["created_at"]) < strtotime("-" . $LAST_TWEET_HOURS . " hour")) {
			$yo_flag = true;
			break;
		}
	}
}

// YOを送る
if ($yo_flag){
	$curl = curl_init();
	$params = array('api_token' => 'API_TOKEN_KEY');
	curl_setopt($curl, CURLOPT_URL, 'http://api.justyo.co/yoall/');
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
	$response = curl_exec($curl);
	var_dump($response);
	curl_close($curl);
}

// 直近ツイートのIDを記録
$fline = $njslyr[0]["id_str"];
$cfp = fopen("最終TweetID保持用テキスト.txt","w");
fwrite($cfp,$fline,strlen($fline));
fclose($cfp);

一部ぼかしましたがほぼ元ソースです。common.phpにはrequireとか書いてあり、TwitterAPIはServices_Twitter経由で呼んでいます。$stはTwitterAPIのOAuth認証済みオブジェクトです。
「定数を定義していない」「DBじゃなくファイルI/O」「そもそもクラスもメソッドも定義せずベタ書き」って辺りにもう手抜きの跡が透けてみえる感じですが、なんかこう……なんか……。

YO!

YO APIの話でもしましょう!

Yo APIを試してみた - Qiita http://qiita.com/pomu0325/items/9990dc1b0dbafd72f3e6

大体上のサイトの通りにやったのですが、備忘録も兼ねてちろちろと。
まずはYOの『個人用』アカウントを取得します。アプリを端末に入れてそこから普通のアカウントとしてサインアップすればいいです。
それからここにアクセスして、『開発用』アカウントを取得します。
CallbackURLは後から変えられるし深く考えなくていいと思います。
Personal〜に最初に取得した個人用アカウントを入力して、サインアップするとAPI Keyが貰えます。メールで届きます。
他の記事を見ると2〜3日かかったとか書いてあって、じゃあゆっくりやるかーって思ったら即座に来ました。システム落ち着いたんですかね?

ダッシュボードにログイン(上記ページの「Have an account? Click to sign in.」から普通にログインできます。見落としてて暫くうろうろしてました……)すると、サンプルとか色々見れたりします。


APIにどんな機能があるのかはそこに書いてある通りなので省きます。
とりあえずPOSTでAPIKey(特定の人にYOする場合はその人のID)を投げつけてやればよいです。割と簡単でした。


あと備忘録として書いておくべきことは……ええと、どうやら開発用アカウントは一つの個人垢+メールアドレスに対して複数取得できるようです。
上限いくつまでってのは把握してませんが常識的な範囲なら多分大丈夫なのではないかな……。



とりあえずこれで寝てたりソシャゲしてたり仕事してたりしててもニンジャ到来を察知できるのでごあんしんだ。
でもこれを書いていたらリアルタイムで更新が追えていないという二律背反めいた罠が……ヤンナルネ。

*1:本当は押すだけでYOが送れるボタンスクリプトがあるのだけど案の定はてなダイアリーでは動かなかった