<?php
 #需要配置的项
 define('ACCESSKEYID','');             #阿里云用户密钥ID 获取方法 https://help.aliyun.com/knowledge_detail/38738.html
 define('ACCESSKEYSECRET','');#阿里云用户密钥
 define('RR','myhome');                       #二级域名的记录名 如果是一级 请用@
 define('RECORDID','');
 /*解析记录ID ,需要在
 https://api.aliyun.com/?spm=a2c4g.11186623.2.26.79ae2846d9RBBa#/?product=Alidns&api=AddDomainRecord&params={}&tab=DEMO&lang=JAVA
 先设置一个记录 然后获取这个ID 添加所需的参数文档在
 https://help.aliyun.com/document_detail/29772.html?spm=a2c4g.11186623.4.3.392b5eb4SAeph9

 */

 define('GET_IP_URL','myip.fireflysoft.net');
 define('IP_FILE','./ip.txt');

 function 获取HTTP($url)
 {
     $curl_samples = curl_init();
     $options = [CURLOPT_URL => $url,CURLOPT_RETURNTRANSFER => 1,CURLOPT_FOLLOWLOCATION => 1,];
     curl_setopt_array($curl_samples, $options);
     curl_setopt($curl_samples, CURLOPT_CUSTOMREQUEST, 'GET');
     $ip = curl_exec($curl_samples);
     $info = curl_getinfo($curl_samples);
     $curl_err = curl_errno($curl_samples);
     curl_close($curl_samples);
     if( 0 != $curl_err )
     {
         echo "getip error:".date('Y-m-d H:i:s',time());
         var_dump($info);
         echo PHP_EOL;
         var_dump($ip);
         exit;
     }

     return $ip;
 }

 function 编码字符($string)
 {
     $result = urlencode($string);
     $result = str_replace(['+', '*'], ['%20', '%2A'], $result);
     $result = preg_replace('/%7E/', '~', $result);
     return $result;
 }

 function 排序参数计算签名($parameters,$method="GET")
 {
     ksort($parameters);
     $canonicalizedQuery = '';
     foreach ($parameters as $key => $value)
     {
         $canonicalizedQuery .= '&' . 编码字符($key) . '=' . 编码字符($value);
     }

     $stringToBeSigned = $method. '&%2F&'. 编码字符(substr($canonicalizedQuery, 1));
     return base64_encode(hash_hmac('sha1', $stringToBeSigned, ACCESSKEYSECRET . '&', true));
 }

 function 主函数()
 {
     $ip = 获取HTTP(GET_IP_URL);
     if(!file_exists(IP_FILE))
     {
         file_put_contents(IP_FILE,$ip);
     }else
     {
         $旧IP = file_get_contents(IP_FILE);
     }

     if(!isset($旧IP) || $旧IP !== $ip)
     {
         #请求dns的API重新做解析
         $api_url = 'https://alidns.aliyuncs.com/?';
         $data = [];
         #公共参数
         $data['Format']          = 'json';
         $data['Version']         = '2015-01-09';
         $data['SignatureMethod'] = 'HMAC-SHA1';
         $data['SignatureNonce']  = uniqid();
         $data['SignatureVersion']= '1.0';
         $data['AccessKeyId']     = ACCESSKEYID;
         //$data['Timestamp']       = date('Y-m-d\TH:i:s\Z',time());
         $data['Timestamp']       = gmdate("Y-m-d\TH:i:s\Z");
         #专用参数
         $data['Action']     = 'UpdateDomainRecord';
         $data['RecordId']   = RECORDID; #解析记录的ID,此参数在添加解析时会返回,在获取域名解析列表时会返回
         $data['RR']         = RR; #主机记录
         $data['Type']       = 'A';
         $data['Value']      = $ip;
         $data['TTL']        = 600;
         #$data['Priority']   = 10; #MX记录的优先级,取值范围[1,10],记录类型为MX记录时,此参数必须
         $data['Line']       = 'default';
         #签名
         $data['Signature']  = 排序参数计算签名($data);
         #请求接口
         $json = 获取HTTP($api_url . http_build_query($data));
         $result = json_decode($json);

         #完成以后
         if(isset($result->RecordId)){
             file_put_contents(IP_FILE,$ip);
         }else{
             echo 'error';
             var_dump($result);
         }
     }else
     {
         echo 'IP没有发生变化,不需要修改解析记录';
     }
 }
 主函数();

建立计划任务

执行 php.exe 脚本.php > log.txt 

阿里云解析记录应对家里动态IP的更多相关文章

  1. aspnetcore 容器化部属到阿里云全过程记录

    第一次写博客,作为一个全栈er,记录一下从阿里云到产品运维上线的全过程 一.阿里云上的设置 购买阿里云ECS后: 进控制台查看实例公网IP 在控制台.网络与安全->安全组,配置规则 点击进去可以 ...

  2. 【转载】阿里云ECS Linux服务器禁止某些IP访问

    在阿里云ECS Linux服务器运维过程中,如果发现某些IP访问异常,如怀疑有攻击行为或者怀疑是别人写的爬虫程序长时间占用你的服务器资源,则可以通过相关的设置来禁止这些IP段的访问,拒绝这些IP的请求 ...

  3. 阿里云CentOS 7无外网IP的ECS访问外网(配置网关服务器)

    说明: 1.必须要有一台机器具有外网IP的ECS. 2.如果不想配置具有外网IP的ECS时,可以购买NAT网关,但需要钱,贵.下面会说明NAT网关的配置. 3.最后吐槽一下阿里云VPC网关导致不能按照 ...

  4. 如何把php项目部署到阿里云服务器window server2012__含公网ip访问时jquery/ajax失效解决办法

    记一次蛋疼的折腾. 弄了一晚上最后发觉是360浏览器的问题,换个浏览器就好了.垃圾360用什么IE7文档模式.导致界面和功能失效. 建议大家测试的时候用firefox或者chrome. 项目部署到服务 ...

  5. xshell连接不上阿里云服务器Could not connect to 'ip' (port 22): Connection failed.解决过程

    记一次xshell阿里云服务器突然连接不上的解决办法: 1, 确认阿里云服务器安全组出入都有22,百度出来都说的这个和ip拦截设置,以防万一都设置了:但楼主设置后,还是连不上服务器: 只好下一步 2, ...

  6. 阿里云专有网络配置以及交换机配置+ip、子网掩码、ip网段计算原理讲解

    在阿里云上购买ECS或者其他服务,如redis.polardb时,需要配置专有网络,阿里的文档写的总体上还是比较抽象的,没有一定的网络基础,会一脸懵. 所以这里我来进行专有网络和交换机的配置,以及ip ...

  7. 阿里云服务器,无法通过公网ip访问实例

    昨天得知阿里云esc又打折了,赶紧入手了一波,因为以前有部署过的经验,所以很快就部署上了项目,就在欣喜的访问时,却无访问. 我按照下面步骤一步一步的检测, 1.服务器上是否成功部署jdk和tomcat ...

  8. 码云转移至阿里云Code记录

    用起来还是挺简单的,跟码云差不多,但关键是企业私有项目成员人数没有限制!码云限制5人(免费) 注意两点: 1.导入仓库链接的时候,如果username是邮箱含@,要换成%40,不然这个项目直接报500 ...

  9. 阿里云CentOS使用iptables禁止某IP访问

    在CentOS下封停IP,有封杀网段和封杀单个IP两种形式.一般来说,现在的攻击者不会使用一个网段的IP来攻击(太招摇了),IP一般都是散列的.于是下面就详细说明一下封杀单个IP的命令,和解封单个IP ...

随机推荐

  1. Day1 MySql安装和基本操作

    数据和数据库 1.数据:客观事物的符号表示. 2.存储介质:纸,光盘,磁盘,u盘,云盘… 3.存储的目的:检索(查询) 存储数据量加大,导致检索的难度升高. 4.数据库(DB:database):按照 ...

  2. Linux磁盘分区和挂载

    Linux磁盘分区和挂载 分区 分区的方式: mbr分区 最多支持4个主分区 系统只能安装到主分区上 扩展分区要占用一个主分区 MBR最大支持2TB,但拥有最好的兼容性 gtp分区 支持无线多个主分区 ...

  3. Elasticsearch之如何合理分配索引分片

    大多数ElasticSearch用户在创建索引时通用会问的一个重要问题是:我需要创建多少个分片? 在本文中, 我将介绍在分片分配时的一些权衡以及不同设置带来的性能影响. 如果想搞清晰你的分片策略以及如 ...

  4. jQuery插件,判断鼠标的移入移出方向

    今天用jQuery封装了一个简单的插件,判断鼠标的移入移出方向,以后的项目中可能还会遇到这样一个简单的效果,就记录下来吧! 先看结构和样式: <!DOCTYPE html> <htm ...

  5. 基于jquery的插件turn.js学习笔记

    基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...

  6. kNN分类算法实例1:用kNN改进约会网站的配对效果

    目录 实战内容 用sklearn自带库实现kNN算法分类 将内含非数值型的txt文件转化为csv文件 用sns.lmplot绘图反映几个特征之间的关系 参考资料 @ 实战内容 海伦女士一直使用在线约会 ...

  7. Nodejs-第一篇(什么是NodeJS)

    NodeJS 介绍 Node.js 是什么? 1.Node.js 是一个开发平台,就像Java开发平台..Net开发平台.PHP开发平台.Apple开发平台一样: 什么是开发平台?它们有对应的编程语言 ...

  8. http://browniefed.com/blog/2015/09/10/the-shapes-of-react-native/

    http://browniefed.com/blog/2015/09/10/the-shapes-of-react-native/

  9. kali国内更新源

    在/tec/apt/sources.list加入以下内容 #中科大更新源 deb https://mirrors.ustc.edu.cn/kali kali-rolling main non-free ...

  10. c++ 以多维数组的形式访问动态内存

    教学内容: 以多维数组的形式访问动态内存 六.作业 .]=(]) *sizeof(int)); 以 pNum[][]形式访问内存空间. //8*3 [8][3] ]; int i,j,n; n=; p ...