【TwitterAPI】「user_timeline.json」から受け取ったデータのエラー判別

公開日:
更新日:
カテゴリー: TwitterAPI

TwitterAPIの「user_timeline.json」にリクエストを投げた場合、json形式のデータが帰ってきますが、その後それをjson_decodeして処理しています。

そのときにエラーの判別をして処理分岐させているのですが、先日そのエラー判別の方法が間違っていたことに気づきました。

ここでは私が行ったエラー判別の方法をメモしておきたいと思います(TwitterAPIのリクエストとデータ処理はPHPで行っています)。

「user_timeline.json」へのリクエストとデータ取得

私は次のようなプログラムで「user_timeline.json」にリクエストを行ってデータを取得しています(TwitterAPI認証ライブラリ「twitteroauth」を使用)。

//TwitterAPI認証ライブラリ「twitteroauth」の利用
require_once("twitteroauth/twitteroauth.php");

//認証情報
$consumerKey = "**********";
$consumerSecret = "**********";
$accessToken = "**********";
$accessTokenSecret = "**********";

//認証オブジェクトの作成
$twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);

//「user_timeline.json」にリクエストするオプションの組み立て
$options = array(
	'screen_name'=>'ここにユーザーを指定',
	'count'=>ここに取得したいツイートの件数(整数で指定、最大200)
);

//リクエスト
$json = $twObj->OAuthRequest(
	'https://api.twitter.com/1.1/statuses/user_timeline.json',
	'GET',
	$options
);

//データ取得
$jset = json_decode($json, true);

//取得したデータの確認
if($jset != null){
	//データの取得完了
	echo "データあり!処理続行!";
	//ここからループ処理
	foreach($jset as $tweet_data){
		//ここに処理
	}
}else{
	//データの取得失敗
	echo "データなし!エラーのため処理終了";
}

そして上のプログラムの29~40行でエラーの判別を行っていたのですが、この部分が大きく間違っていました。

エラーの場合はデータが帰ってこない?

帰ってきたデータを「$jset」に格納しているのですが、私は無意識のうちに

エラーの場合はデータが帰ってこない
よって「$jset」にデータがある場合は「データの取得ができている」、データがない場合は「データの取得ができていない」

 と確認もせず次のようなとんでもない勘違いエラー判別をしていました。

//取得したデータの確認
if($jset != null){
	//データの取得完了
	echo "データあり!処理続行!";
	//ここからループ処理
	foreach($jset as $tweet_data){
		//ここに処理
	}
}else{
	//データの取得失敗
	echo "データなし!エラーのため処理終了";
}

エラーの場合でもデータは帰ってくる!

今思えば当たり前のことなんですが、リクエストを投げてエラーがあってもTwitter側からデータは帰ってきます。

以下、私がいろいろなパターンを実行し、「$jset」の中身を確認したものです。

非公開設定にしているユーザーを指定した場合

非公開設定をしているユーザーのツイートを取得しようとすると、次のようなエラーデータが帰ってきます。

Array
(
[request] => /1.1/statuses/user_timeline.json?contributor_details=&count=***&exclude_replies=***&include_rts=&oauth_consumer_key=***&oauth_nonce=***&oauth_signature=***&oauth_signature_method=***&oauth_timestamp=***&oauth_token=***&oauth_version=***&screen_name=***&trim_user=***
[error] => Not authorized.
)

存在しないユーザーを指定した場合

存在しないユーザーのツイートを取得しようとすると、次のようなエラーデータが帰ってきます。

Array
(
    [errors] => Array
        (
            [0] => Array
                (
                    [code] => 34
                    [message] => Sorry, that page does not exist.
                )
        )
)
※「code」の [ と ] は全角にしています

空のデータが帰ってくるパターン

なお、1回もツイートしていないユーザーを指定した場合、次のように空のデータが帰ってきます。

Array
(
)

※「screen_name」に「null」や「""」、「" "」(半角空白1つ以上)を指定してリクエストすると、自分自身のツイートが取得されます(Webアプリやツールをつくる場合はこの対処も必要)

エラーの判別方法

ということで、私は次のようにエラーの判別を行いました。

//取得したデータの確認
if($jset && !$jset[error] && !$jset[errors]){
	//データの取得完了
	echo "データあり!処理続行!";
	//ここからループ処理
	foreach($jset as $tweet_data){
		//ここに処理
	}
}elseif($jset[error] == "Not authorized."){
	//ユーザーが非公開設定だった場合
	echo "このユーザーは非公開設定のためツイートは取得できません";
}elseif($jset[errors][0][code] == 34){
	//ユーザーが存在しない場合
	echo "ご指定のユーザーは存在しません";
}elseif($jset == null){
	//ツイートしていないユーザーだった場合
	echo "ご指定のユーザーのツイート情報はありませんでした";
}else{
	//その他のエラー
	echo "何らかのエラーがあります";
}

※12行目の[code]の [ と ] は全角です

まだまだ、エラーの種類はあるかもしれませんし、すっきりしないコードですが、とりあえずこのようにエラー判別をしてみました。

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント