百度域名解析API+python实现百度云DDNS功能绑定动态公网ip
背景:前段时间,朋友为了使用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相关推荐
- 【计网】DNS解析 DDNS解决动态公网IP访问
DNS服务与DDNS 前言 一.DNS服务 二.DNS域名解析 1.解析过程 2.DNS污染 三.DDNS解决动态公网IP访问 总结 前言 本篇主要记录一下DNS域名解析在我们平时上网时的使用,与DN ...
- 阿里云弹性EIP和固定公网IP的区别
阿里云服务器可以绑定弹性公网IP(EIP)也可以使用固定公网IP,无论是EIP还是公网IP都可以对外提供外网服务,阿里云百科来详细说下阿里云EIP和固定IP的区别: 阿里云EIP和公网IP详解 什么是 ...
- 百度地图API制作类似 百度地图的路线导航界面并实现简单的路线规划功能
之前我们讲了怎么在百度地图上设置Marker(如A点..) 和弹出框(跟随Marker的,Marker移动的时候也是会跟着移动的),接着又觉得百度地图自带的放大缩小不(fei)是(chang)很(de ...
- 安卓学习专栏——百度地图(1)获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)
步骤 系列文章 前言 1.前期准备 2.创建应用 3.获取发布版SHA1和开发版SHA1 3.1找到.android文件夹位置 3.2Android Studio的Terminal中cd路径 3.3输 ...
- 使用阿里云 dns sdk 解决电信公网ip自动变化问题;自己动手实现ddns
首先说下情况,我的树莓派通过电信光猫dmz主机设置全端口映射得到了公网ip,ssh等连接都很迅速,ping值为60ms.上海电信200M宽带,上传25mbps.由于是动态公网ip,电信隔几天就换ip, ...
- 家庭宽带 动态公网IP,使用腾讯云DDNS实现实时更新DNS解析记录
解决DDNS问题 动态公网IP 环境说明: 我是家庭宽带 只能申请到动态的公网ip,好处是不花钱,弊端是每次重启光猫,都会重新获取一个新的公网IP 为解决此办法,我尝试了很多个DDNS的方案. 包括但 ...
- 腾讯云+动态公网IP+黑裙
腾讯云+动态公网IP+黑裙 文章目录 确定是否为公网IP 腾讯云的申请和操作 路由的操作 NAS的操作 SSL的操作 文章目录 确定是否为公网IP 1)点击链接 http://www.net.cn/s ...
- 使用NAT网关轻松为单台云服务器设置多个公网IP
摘要: 背景 在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题. 具体如何操作呢,有了NAT网关这个也不是难题. 配置单云主机多公网IP功能流程 1.为ECS实例配置多块网卡. 2 ...
- 为弹性云服务器申请和绑定弹性公网IP
操作场景 可以通过申请弹性公网IP并将弹性公网IP绑定到弹性云服务器上,实现弹性云服务器访问公网的目的. 申请弹性公网IP 登录管理控制台. 在管理控制台左上角单击,选择区域和项目. 在系统首页,选择 ...
最新文章
- 《虚拟化与云计算》读书感(四)数据中心的设计和构造
- 系列文章--oracle简单入门教程
- python编程设计_Python程序设计
- 监控:系统构架重要的一环
- mysql 语句性能分析_mysql的sql语句的性能诊断分析
- html中optgroup 标签用法,分组、只读的且呈树状样式显示
- 万恶之源 - Python运算符与编码
- 美国著名核物理学家,前半生为美国造核弹,后半生为中国放牛
- ele-plus包的安装和使用
- Chaos网络库(三)- 主循环及异步消息的实现
- 程序员之痛:六次创业五回失败了
- BERT/Transformer/迁移学习NLP资源大列表
- Windows中绕过更新直接关机
- matlab中的低通freqs,matlab数字低通滤波器 MATLAB一阶低通滤波器的设计
- php助理面试技巧,助理类面试问题
- 使用Office2013打开文档时,弹出“正在与服务器联系以获取信息”对话框问题
- 不可预料的压缩文件末端怎么解决
- 关于vs新建项目时只有空白项
- python安装osgeo及shapefile库、is not a supported wheel on this platform 的问题
- 采用先进先出原则对货物的库存进行处理