背景:前段时间,朋友为了使用NAS服务,开通了电信的动态公网IP,也就是那种公网IP地址会定期变化,重启光猫也会导致IP变化,朋友的水星低端路由器支持花生壳DDNS,去花生壳官网申请服务后能够正常使用,但是隔一两天就会出现路由器花生壳服务掉线,重新连接不上的奇怪问题,久久不能解决,然后他找到了我,本着助人为乐的精神,我给他找到了一个替代方案。

简述:百度注册的域名可以提供域名解析API服务,但是需要工单申请API权限,申请后可以通过 python实现域名解析的动态更新,适合动态公网用户。

前期准备:

1.你需要拥有一个百度云注册的域名,并且已经备案(政策规定,国内未备案域名不能提供域名解析服务)。

2.去百度云个人中心>安全认证界面,创建Access Key,记录下这个Access Key和Secret Key。

3.去工单>域名服务>申请开通域名API>创建工单,贴上Access Key,申请开通域名解析API。

4.去域名管理界面设置一个域名解析A记录,具体设置教程自行百度。

一些说明:

百度云提供了域名解析API相关的帮助文档(域名服务-百度智能云),根据文档,其最重要的部分是生成认证Authorization字符串,具体步骤可以参考其网址(https://cloud.baidu.com/doc/Reference/s/Njwvz1wot),这里就不做具体阐述。其网站提供了一个例子,签名算法没有问题,但是使用的是python requests模块,经过实践并不能成功,原因在于requests会在请求数据header自动添加一些无关的头,但是这些头服务器会纳入鉴权计算,导致服务器鉴权Authorization字符串算出来和本地不一致。

代码部分:

import hmac
import time
import requests
import urllib.parse
import socket
import json
import osclass DDNS:    def __init__(self,url,AK,SK):self.url=urlself.AK=AKself.SK=SKdef getTime(self):#获取网络时间戳,用于鉴权url="http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp"res=requests.get(url,timeout=5).textres=json.loads(res)["data"]["t"]return int(res)/1000def getIP(self):#获取本地公网IPurl="http://pv.sohu.com/cityjson?ie=utf-8"res=requests.get(url,timeout=5).textres=res.split("=")[1].split(";")[0] #转换javascript为json格式res=json.loads(res)res=res["cip"]return resdef enc(self,key,message):h=hmac.new(key,message,digestmod="SHA256")return h.hexdigest()def post(self,URI,_data):#填写参数#获取UTC时间utc = time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime(self.getTime()))#POST字典1data=json.dumps(_data)#创建请求header字典_headers={"host":"bcd.baidubce.com","x-bce-date":utc,"Content-Type":"application/json;charset=utf-8","Content-Length":str(len(data))}#格式化字典为http头标准格式headers=""for a,b in _headers.items():headers+=a+":"+b+"\r\n"#生成CanonicalHeadersmethod = "POST"CanonicalQueryString=""CanonicalURI = urllib.parse.quote(URI)  result = []for key,value in _headers.items():tempStr = str(urllib.parse.quote(key.lower(),safe="")) + ":" + str(urllib.parse.quote(value,safe=""))result.append(tempStr)result.sort()CanonicalHeaders = "\n".join(result)#拼接得到CanonicalRequestCanonicalRequest = method + "\n" + CanonicalURI + "\n" + CanonicalQueryString +"\n" + CanonicalHeaders#计算signingKeysigningKey=self.enc(self.SK.encode(),b"bce-auth-v1/%b/%b/1800"%(self.AK.encode(),utc.encode()))#计算signaturesignature=self.enc(signingKey.encode(),CanonicalRequest.encode())#生成认证AuthorizationAuthorization="bce-auth-v1/%s/%s/1800/content-length;content-type;host;x-bce-date/%s"%(self.AK,utc,signature)#最后生成完整的http请求http="POST %s HTTP/1.1\r\n%sAuthorization:%s\r\n\r\n"%(URI,headers,Authorization)+data#建立socket链接,发送http数据s=socket.socket()s.connect(("bcd.baidubce.com",80))s.send(http.encode())res=b"" while True:_res=s.recv(10240)res+=_resif b"chunked" not in res: #如果不是chunked,一次性读完退出breakif _res[-5:]==b"0\r\n\r\n": #chunked标志,连续读取到标识符退出breaks.close()return resdef getID(self):data={'domain':self.url,'pageNo':1,'pageSize':100}url="/v1/domain/resolve/list"res=self.post(url,data)res=res.decode().split("\r\n{")[1].split("}\r\n")[0]res="{"+res+"}"res=json.loads(res)["result"]recordId={}for i in res:recordId[i["domain"]]=(i["recordId"],i["rdata"])return recordIddef SET(self,domain,ip):recordId=self.getID()self.urlIP=recordId[domain][1]if ip!=recordId[domain][1]:url="/v1/domain/resolve/edit"data={"domain" : domain,"rdType" : "A","rdata" : ip,"ttl" : 60,"zoneName" : self.url,"recordId" : recordId[domain][0]}res=self.post(url,data)#print(res)if __name__ == "__main__":#参数设置url=""  #填写你的域名,如http://www.baidu.com,仅填写baidu.comAK=""   #Access Key 百度云控制台申请SK=""    #Secret Key 百度云控制台申请sync=60 #检测间隔时间,建议60秒#循环监控ddns=DDNS(url,AK,SK)first=Truejsq=syncwhile True:os.system("title DDNS服务已启动【%s秒后更新】"%jsq)if jsq==0 or first==True:try:ddns.SET("@",ddns.getIP())os.system("cls")now=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(ddns.getTime()))print("---------百度域名DDNS信息---------\n\n域名:%s\n-----\n域名解析IP:%s\n本地公网IP:%s\n更新时间:%s"%(url,ddns.urlIP,ddns.getIP(),now))except:passjsq=syncfirst=Falsetime.sleep(1)jsq-=1

百度域名解析API+python实现百度云DDNS功能绑定动态公网ip相关推荐

  1. 【计网】DNS解析 DDNS解决动态公网IP访问

    DNS服务与DDNS 前言 一.DNS服务 二.DNS域名解析 1.解析过程 2.DNS污染 三.DDNS解决动态公网IP访问 总结 前言 本篇主要记录一下DNS域名解析在我们平时上网时的使用,与DN ...

  2. 阿里云弹性EIP和固定公网IP的区别

    阿里云服务器可以绑定弹性公网IP(EIP)也可以使用固定公网IP,无论是EIP还是公网IP都可以对外提供外网服务,阿里云百科来详细说下阿里云EIP和固定IP的区别: 阿里云EIP和公网IP详解 什么是 ...

  3. 百度地图API制作类似 百度地图的路线导航界面并实现简单的路线规划功能

    之前我们讲了怎么在百度地图上设置Marker(如A点..) 和弹出框(跟随Marker的,Marker移动的时候也是会跟着移动的),接着又觉得百度地图自带的放大缩小不(fei)是(chang)很(de ...

  4. 安卓学习专栏——百度地图(1)获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)

    步骤 系列文章 前言 1.前期准备 2.创建应用 3.获取发布版SHA1和开发版SHA1 3.1找到.android文件夹位置 3.2Android Studio的Terminal中cd路径 3.3输 ...

  5. 使用阿里云 dns sdk 解决电信公网ip自动变化问题;自己动手实现ddns

    首先说下情况,我的树莓派通过电信光猫dmz主机设置全端口映射得到了公网ip,ssh等连接都很迅速,ping值为60ms.上海电信200M宽带,上传25mbps.由于是动态公网ip,电信隔几天就换ip, ...

  6. 家庭宽带 动态公网IP,使用腾讯云DDNS实现实时更新DNS解析记录

    解决DDNS问题 动态公网IP 环境说明: 我是家庭宽带 只能申请到动态的公网ip,好处是不花钱,弊端是每次重启光猫,都会重新获取一个新的公网IP 为解决此办法,我尝试了很多个DDNS的方案. 包括但 ...

  7. 腾讯云+动态公网IP+黑裙

    腾讯云+动态公网IP+黑裙 文章目录 确定是否为公网IP 腾讯云的申请和操作 路由的操作 NAS的操作 SSL的操作 文章目录 确定是否为公网IP 1)点击链接 http://www.net.cn/s ...

  8. 使用NAT网关轻松为单台云服务器设置多个公网IP

    摘要: 背景 在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题. 具体如何操作呢,有了NAT网关这个也不是难题. 配置单云主机多公网IP功能流程 1.为ECS实例配置多块网卡. 2 ...

  9. 为弹性云服务器申请和绑定弹性公网IP

    操作场景 可以通过申请弹性公网IP并将弹性公网IP绑定到弹性云服务器上,实现弹性云服务器访问公网的目的. 申请弹性公网IP 登录管理控制台. 在管理控制台左上角单击,选择区域和项目. 在系统首页,选择 ...

最新文章

  1. 《虚拟化与云计算》读书感(四)数据中心的设计和构造
  2. 系列文章--oracle简单入门教程
  3. python编程设计_Python程序设计
  4. 监控:系统构架重要的一环
  5. mysql 语句性能分析_mysql的sql语句的性能诊断分析
  6. html中optgroup 标签用法,分组、只读的且呈树状样式显示
  7. 万恶之源 - Python运算符与编码
  8. 美国著名核物理学家,前半生为美国造核弹,后半生为中国放牛
  9. ele-plus包的安装和使用
  10. Chaos网络库(三)- 主循环及异步消息的实现
  11. 程序员之痛:六次创业五回失败了
  12. BERT/Transformer/迁移学习NLP资源大列表
  13. Windows中绕过更新直接关机
  14. matlab中的低通freqs,matlab数字低通滤波器 MATLAB一阶低通滤波器的设计
  15. php助理面试技巧,助理类面试问题
  16. 使用Office2013打开文档时,弹出“正在与服务器联系以获取信息”对话框问题
  17. 不可预料的压缩文件末端怎么解决
  18. 关于vs新建项目时只有空白项
  19. python安装osgeo及shapefile库、is not a supported wheel on this platform 的问题
  20. 采用先进先出原则对货物的库存进行处理

热门文章

  1. 前端将图片二进制流显示在html端
  2. 为客户带来价值-需求分析的实用方法
  3. 中国信达资产管理公司ITIL实施过程赏析--之一
  4. Android 监听SD卡插入与拔出
  5. android 4g手机6,6.5毫米4G智能手机 华为P7精美图赏
  6. 十种具有抗氧化剂的食物
  7. 计算机语言表示教师节快乐,表达教师节快乐的祝福语集合31句
  8. 洛谷----P1506 拯救oibh总部
  9. android 照片 新手机版下载地址,手机照片恢复下载
  10. 小学计算机教师德育工作计划,小学教师德育工作计划