見出し画像

aiboをコントロールしてみました

なんでそんなイヤそうな顔してるのよ……

土曜日にデバイスIDを求めるスクリプトもできたので、今度は実際にaiboをコントロールするスクリプトを作ってみようと、日曜日の午後に作り始めて、cURLの使い方を調べつつ夕方にはひとまず完成しました。

以下のスクリプトを実行すると、aiboがサイコロをくわえてくれます。ただaiboの気分で必ずくわえてくれるわけではないので、バグなのか区別がつきません orz

スクリプトの公開にあたり

ココのPythonスクリプトを参考にして、PHPに書きかえてみました。
言語の違いにより多少違いもありますが、ほぼ同じフローにしたつもりです。
最初は class DoAction { } というクラスを生成してコンストラクタに全部書いていたんですが、無駄にコードが長くなるので doAction関数に変更しました。
URLを読み込むと実行結果を画面表示します。

作成したコードを利用したい方へ

コードは以下に公開します。
もともとPythonで公開されているスクリプトをもとにしているので、利用には特に制限は設けません。ご自由にどうぞ。
PHPの実行環境はご自身で用意してください。

注意事項

利用したことによる一切の責任は負いません。
セキュリティに関しては考慮していません。インターネット上で公開されたレンタルサーバーやクラウドサービス上で実行するのはお勧めしません。
(トークンやデバイスIDが漏洩したら………)

公開コード

<?php
define ('MYDEVID', 'aiboID'); // aiboID部分を取得したデバイスIDに変える
define ('MYTOKEN', 'secret'); // secret部分を取得したトークンに変える
define ('TIMEOUTLIMIT', 10);  // タイムアウト時間 デフォルト10秒

function doAction ($apiName, $arguments) {

	$headers  = array ('Authorization: Bearer '. MYTOKEN); // PHPのマニュアルによるとcURL関数のheader情報は配列で渡す必要がある

	/* POST API */
	$postUrl  = 'https://public.api.aibo.com/v1/devices/' . MYDEVID . '/capabilities/' . $apiName . '/execute';
	$postData = '{"arguments":' . $arguments . '}'; // aiboAPIではJSON形式で渡さなければならないみたい しかも"arguments"の入れ子(ネスト)にする
	
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL           , $postUrl); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER    , $headers); 
	curl_setopt($ch, CURLOPT_POSTFIELDS    , $postData); 

	$getExecution = json_decode (curl_exec($ch), TRUE);
	curl_close($ch);

	/* Get Result of API execution */
	$getUrl  = 'https://public.api.aibo.com/v1/executions/' . $getExecution["executionId"];
    $timeOut = 0;
	
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL           , $getUrl); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER    , $headers); 

	while (TRUE) {
		$result = json_decode (curl_exec($ch), TRUE);
		$status = $result['status'];

		if ($status == 'SUCCEEDED') {
			break;
		}
		elseif ($status == 'FAILED') {
			break;
		}
		
		++$timeOut;
		if ($timeOut > TIMEOUTLIMIT) {
			$status = "Time out";
			break;
		}
		
		sleep(1);
	}

	curl_close($ch);

	return "<pre>\n"
	 . "ApiName : $apiName<br>\n"
	 . "PostData : $postData<br>\n"
	 . "GetExecutionID : {$getExecution['executionId']}<br>\n"
	 . "GetExecutionStatus : {$getExecution['status']}<br>\n"
	 . "GetExecutionResult : {$getExecution['result']}<br>\n"
	 . "ResponceStatus : $status<br>\n"
	 . "</pre>\n";
}


//echo doAction ('find_object', '{"TargetType":"pinkball"}');
echo doAction ('play_dice', '{"Category":"holdMouthDice"}'); //サイコロをくわえる

?>

この記事が気に入ったらサポートをしてみませんか?