DozensをダイナミックDNS風に使う方法 【PHPサンプル】

EveryDNS.netが終了したということで、スタードメインのユーザー掲示板でスタードメインのAレコードをプログラムで更新できないか?という質問(ここ)を見かけた。スタードメインの場合、ダイナミックDNSの機能を提供していないしプログラムでAレコードを更新できる仕組みを提供していないんですね。

そこで、無料でも使える「dozens.jp」をふと思いだしました。Dozensなのですが、プログラムからレコードを更新できるようにAPIが用意されていて公開されてるのです。これを使ってみてはどうかなということで調べてみました。

Accesses to Dozens API via Shell Script」でシェルスクリプトは公開されていました。個人的にはPHPのほうがありがたいので、これを参考にPHPで作ってみました。

APIの仕様は「Dozens ドキュメント」で公開されています。APIに必要なパラメータは、Dozensにログインした後のメニューの「プロフィール」に書かれています。

<?php
//***********************************************
//注意:
// json_decode(),json_encode()を使っているので
// PHP 5.2以降でしか動作しません
//***********************************************


//-------------------------
//パラメータの設定
//-------------------------
$x_auth_user = "Dozens IDを書いてください";
$x_auth_key =  "Dozensのプロフィールにあるyour api keyを書いてください";
$domain ="example.com"; //更新したいドメイン名
$host ="www"; //更新したいホスト名

//-------------------------
//IPアドレスを取得
//-------------------------
$result = curl_get_contents("http://ifconfig.me/ip");
$global_ip = trim($result);
//-----
//スクリプトを外部に設置の場合は、以下がよいと思う。
//$global_ip = $_SERVER["REMOTE_ADDR"];
//

//-------------------------
//認証
//-------------------------
$headerArray = array('X-Auth-User: '.$x_auth_user,'X-Auth-Key: '.$x_auth_key);
$result = curl_get_contents( "http://dozens.jp/api/authorize.json", $headerArray,120 );
$values = json_decode($result);

$x_auth_token = $values->auth_token;

//-------------------------
//レコード一覧からレコードID取得
//-------------------------
$zone_name = $domain ;
$headerArray = array('Content-Type: application/json','X-Auth-Token:'.$x_auth_token);
$result = curl_get_contents( "http://dozens.jp/api/record/".$zone_name.".json", $headerArray,120 );
$values = json_decode($result);
$record_id = -1;
for ($i = 0; $i < count ($values->record); $i++) {
 if(strcmp($values->record[$i]->name,$host.".".$domain)==0){
  $record_id = $values->record[$i]->id;
  $record_content = $values->record[$i]->content;
  $record_prio =  $values->record[$i]->prio;
        $record_ttl =  $values->record[$i]->ttl;
 }
}
if($record_id == -1){
 echo "更新レコードがありません.(".$host.".".$domain.")";
 return;
}
if(strcmp($global_ip,$record_content) ==0){
 echo "IPが変化していないため更新する必要がありません.(".$global_ip.")";
 return;
}

//-------------------------
//レコード更新
//-------------------------
$headerArray = array('Content-Type: application/json','Host: dozens.jp','X-Auth-Token:'.$x_auth_token);
$params = array(
"prio" => $record_prio,
"content" => $global_ip,
"ttl" => $record_ttl
);
$postdata = json_encode($params);
$result = curl_get_contents( "http://dozens.jp/api/record/update/".$record_id.".json", $headerArray,120 ,$postdata);
$values = json_decode($result);
$updateFlag = 0;
for ($i = 0; $i < count ($values->record); $i++) {
 if(strcmp($values->record[$i]->name,$host.".".$domain)==0){
  if(strcmp($values->record[$i]->content,$global_ip)==0){
   $updateFlag = 1;
  }
 }
}

if($updateFlag == 1){
 echo "正常に更新されました.(".$global_ip.")";
}else{
 echo "更新に失敗しました.(".$host.".".$domain.")";
}

//-------------------------
// HTTPリクエスト関数
//-------------------------
function curl_get_contents($url,$headerArray = array(),$timeout = 60,$postdata =""){
    $ch = curl_init();
 curl_setopt( $ch, CURLOPT_HTTPHEADER,$headerArray );
    curl_setopt( $ch, CURLOPT_URL, $url );
 if(strcmp($postdata,"") !=0){
  curl_setopt( $ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
 }
    curl_setopt( $ch, CURLOPT_HEADER, false );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    $result = curl_exec( $ch );
    curl_close( $ch );
 return $result;
}
?>
Download - dozens.php

$x_auth_user,$x_auth_key,$domain,$hostは書き換えてください。
このプログラムは更新ですのであらかじめ必要なレコードは作成しておいてください。

このスクリプトをローカルでなくて外部におく場合は、クローバルIPアドレスは$_SERVER["REMOTE_ADDR"]でも取得可能です。

wgetなどを使って呼び出すのもよいと思います。
Windowsの場合は、WGET for Windows (win32)が使えます。

wgetはこんな感じで使うものです。
C:> wget http://www.yahoo.co.jp/

Windowsの「タスク マネージャー」に登録するが簡単だと思います。

グルーバルIPは、http://ifconfig.me/ipを使って取得してます。似たサービスはほかにもありますし、自前で設置してもよいかと思います。

ちなみに、ValueDomainは、「ダイナミックDNS機能のご利用方法」のようにDDNSが使えたりします。
無料で12個+紹介キャンペーンで3個=15個になるようです。
紹介してもらう先が見つからない場合などは、以下を使っていただければそうなると思います。

あなたとあなた経由でDozensに登録したお友達双方にDNSレコードを3つ無料で贈呈
http://dozens.jp/i/Bbv5Js

【ブログ内で関連ある記事】

スポンサーリンク

コメントを残す

メールアドレスは公開されません。
また、コメント欄には、必ず日本語を含めてください(スパム対策)。