树莓派实现DDNS(PHP计划任务)

20131115223615279-0
之前介绍了DNSPod动态IP解析更新程序,是Python实现的。下面介绍一个PHP实现的脚本,实现了同样的动态域名解析功能。

<?php
header("Content-type: text/html; charset=utf8");

class Dns
{
#Dnspod账户
private $dnspod_user = 'user@example.com';
#Dnspod密码
private $dnspod_pwd = 'password';
#Dnspod主域名,注意:是你注册的域名
private $domain = 'example.com';
#子域名,如www,如果要使用根域名,用@
private $sub_domain = 'www';

function getMyIp()
{
try
{
$ip = file_get_contents('http://www.leadnt.com/tools/ip.php');
return $ip;
}
catch(Exception $e)
{
echo $e->getMessage();
return null;
}
}

function api_call($api, $data)
{
if ($api == '' || !is_array($data)) {
exit('内部错误:参数错误');
}

$api = 'https://dnsapi.cn/' . $api;
$data = array_merge($data, array('login_email' =&gt; $this-&gt;dnspod_user, 'login_password' =&gt; $this-&gt;dnspod_pwd, 'format' =&gt; 'json', 'lang' =&gt; 'cn', 'error_on_empty' =&gt; 'no'));

$result = $this-&gt;post_data($api, $data);
if (!$result) {
exit('内部错误:调用失败');
}

$results = @json_decode($result, 1);
if (!is_array($results)) {
exit('内部错误:返回错误');
}

if ($results['status']['code'] != 1) {
exit($results['status']['message']);
}

return $results;

}

private function post_data($url, $data)
{
if ($url == '' || !is_array($data)) {
return false;
}

$ch = @curl_init();
if (!$ch) {
exit('内部错误:服务器不支持CURL');
}

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_USERAGENT, 'LocalDomains_PHP/1.0.0(roy@leadnt.com)');
$result = curl_exec($ch);
curl_close($ch);

return $result;

}

public function exec()
{
$ip = $this->getMyIp();
$domainInfo = $this->api_call('domain.info',array('domain' => $this->domain));
$domainId = $domainInfo['domain']['id'];
$record = $this->api_call('record.list',array('domain_id'=> $domainId,'offset' =>'0','length' => '1','sub_domain' =>$this->sub_domain));
if($record['info']['record_total'] == 0)
{
$this->api_call('record.create',
array(
'domain_id' => $domainId,
'sub_domain' => $this->sub_domain,
'record_type' => 'A',
'record_line' => '默认',
'value' => $ip,
'ttl' => '3600'
));
}
else
{
if($record['records'][

sudo chmod 777 dnspod.php
加入到定时任务,每个小时执行一次。

vi /etc/crontab

*/55 * * * * root /usr/bin/php /home/pi/dnspod.php >> /home/pi/dnspod.log 2>&1

标签: 树莓派教程