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

  • 投稿 : 2011-09-09
  • 更新 : 2019-03-01

本記事は広告およびアフィリエイトプログラムによる収益を得ています

追記:2019/03/01
>この度、誠に勝手ながら2019年10月31日(木)をもって、Dozensの全てのサービスを終了させて頂く事となりました。
https://dozens.jp/close/

Dozensはサービス終了になるようです。


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
スポンサーリンク