利用阿里云API为树莓派做DDNS
引
一直想利用树莓派亲手搭建几种服务器来加深了解,奈何电信光猫每次重启后都会重新分配公网IP。
只能先想办法解决这个最基本的问题,起初的时候没想到该怎么搞。当时手里有一个便宜买的海外虚拟主机,打算让树莓派每次开机后自动发送自己的IP到那个主机上,然后我需要外网访问的时候,从海外主机获取到ip然后在访问。。。。。后来想了想我图个啥。 最后从网络上找了这种通过阿里API去动态解析IP的方式,不过网上找到的虽然思路基本相同,但方法五花八门,而且调用api方法我至今没完全搞懂,只好摸索着用现在这个办法,记录一下。
思路:
1、树莓派利用api获取自己的公网ip
2、调用阿里云api将我的域名解析到当前树莓派的公网ip上,并且避免解析的地址相同(api会报错)
一、准备
1、树莓派 、阿里云的域名(便宜的几块钱一年)、有公网ip且可以设置端口映射的路由
2、安装阿里云的python版本的sdk,我这个只用了核心库,里面有api的泛用型调用命令。
https://developer.aliyun.com/tools/sdk?spm=5176.11122631.962077.5.d8f63801lb9te1#/python
我是直接用下面这个pip命令安装的,因为别的方法我不会,官方提供了一个httpdns的sdk。我估摸着应该是把方法都封装了更简便的样子。
3、得到你自己的AccessKey
在网页端阿里云控制台点击你的头像就能看到了,会生成一个AccessKey ID和Access Key Secret。这两个东西是过会调用api时验证你身份用的。
二、实施
1、获取树莓派当前的公网IP
调用网上找的获取IP地址的API,返回的就是自己访问公网的IP。我用的是这个: https://www.xxorg.com/tools/getip/
def getip():res=request.urlopen('https://www.xxorg.com/tools/getip/')return str(res.read(),'utf-8')
这个返回的就是自己公网的IP字符串。
2、构建客户端对象
构建一个包含你的AccessKey ID和Access Key Secret的客户段对象,后面会加到请求中
导入
from aliyunsdkcore.client import AcsClient
创建
client = AcsClient('你的AccessKey ID', '你的Access Key Secret', 'cn-hangzhou')
3、定义查询方法
导入
from aliyunsdkcore.request import CommonRequest
CommonRequest使用的介绍:
https://help.aliyun.com/document_detail/61476.html?spm=5176.10695662.1996646101.searchclickresult.61f2243bEt8PWL
def queryrecordid():request = CommonRequest()request.set_accept_format('json') #设置接收格式,有json和xml两种request.set_domain('alidns.aliyuncs.com') #请求地址request.set_method('POST') #请求方式,GET和POST两种request.set_version('2015-01-09') #版本信息request.set_action_name('DescribeDomainRecordInfo') #set_action_name这个是设置调用的方法request.add_query_param('RecordId', '解析记录的ID') #request.add_query_param添加参数response = client.do_action_with_exception(request) return json.loads(str(response,'utf-8'))['Value'] #只读取返回数据中的value也就是IP
图中调用的时候应该有异常处理,但我对python还不熟悉,所以当时没敢搞,回头再来解决。
基本调用api就是更改一下action参数和参数的变化,具体的参数信息也都能从api文档里找到
解析记录的id需要调用DescribeDomainRecords获取解析记录的方法,可以调用之后记下来,后面只需要对这条记录进行更改和查询就行了。
def querylist():request=CommonRequest()request.set_accept_format('json')request.set_domain('alidns.aliyuncs.com')request.set_method('POST')request.set_version('2015-01-09')request.set_action_name('DescribeDomainRecords')request.add_query_param('DomainName','你的域名')response=client.do_action_with_exception(request)print(str(response,'utf-8'))
4、定义更新方法
def updaterecordid(value):request = CommonRequest()request.set_accept_format('json')request.set_domain('alidns.aliyuncs.com')request.set_method('POST')request.set_version('2015-01-09')request.set_action_name('UpdateDomainRecord')request.add_query_param('RecordId', '解析记录ID')request.add_query_param('RR', '*')request.add_query_param('Type', 'A')request.add_query_param('Value', '解析到的IP地址') #上面三个值的解释都在api文档response = client.do_action_with_exception(request)
api地址:https://help.aliyun.com/document_detail/29774.html?spm=a2c4g.11186623.6.641.7b435eb4WHrsn4
5、防止解析到同一个地址
ip=getip()
oldip=queryrecordid()
if oldip!=ip:updaterecordid(ip)print('The new IP is',ip)
else:print("IP address not updated")
网上有的方法是直接将上次解析的地址写入本地,这样就可以减少api的调用次数,不过我水平有限也不太喜欢在本地再生成一个文件,于是就直接用当前地址和解析记录中的地址对比了。
6、部署
因为我家的路由和派是在同一个插排上的,所以每次开启路由器时树莓派也一块启动,这样就可以把这个代码放到树莓派的开机执行里运行,不过路由器开机时间长,所以我设置树莓派开机3分钟后自动执行。
执行命令
vi /etc/rc.local
加一段代码到exit 0之前
sleep 3m && python3 ddns.py &
休眠三分钟之后执行这个python程序,不过好像在rc.local中会阻塞开机,所以最后加一个&放到新的线程中运行
三、其他
在手机或者pc访问的时候会优先使用本机储存的dns缓存,所以更新的ip同步不过来,需要刷新dns缓存。win是在cmd中执行ipconfig /flushdns,手机直接飞行模式貌似就可以。
利用阿里云API为树莓派做DDNS相关推荐
- 【python 人像抠图】利用阿里云api进行对本地图片进行批量人像抠图
阿里云智能视觉开发平台分割抠图 利用阿里云的人像抠图算法,对本地图片进行批量人像抠图,然后批量下载到本地. # -*- coding: utf-8 -*- import sys import requ ...
- 利用阿里云API ONS接口获取当前用户下的topics使用情况
1.main.java package com.sc.sre;public class Main {public static void main(String[] args) {String end ...
- ddns 动态解析 - 阿里云api自动解析家用服务器动态ip
2019独角兽企业重金招聘Python工程师标准>>> 过年回老家办了带宽,大家都知道家用带宽是没有固定ip的一般使用花生壳之类的动态解析域名: 但是花生壳现在不好用,我使用阿里云a ...
- 利用阿里云的API实现动态域名解析
首先在实现动态域名解析之前要具备两个条件: 第一.你必须有公网 IP,就是你的路由器拨号获取到的 IP 必须是公网 IP (可以参考 ip138 获取到的 IP).长城宽带没有公公网 IP 所以就不用 ...
- 【阿里云API】 阿里云API调用的若干说明
阿里云API 为了监控我们使用的一些阿里云产品,需要些一些脚本,定时调用这些脚本来获得相关阿里云产品的信息. ■ 概述 调用阿里云API大约分成两类方法,一个是直接从HTTP协议开始,自己根据阿里云的 ...
- 利用阿里云实现异地容灾的解决方案
一.异地灾备防范于未然 2001年的"911事件"中,没有远程备份的企业都遭受了巨大损失,甚至部分公司因为核心业务部署在公司大楼而又没有远程备份,导致公司业务无法继续运营而倒闭.美 ...
- 如何利用阿里云域名远程访问家中群辉NAS(Docker容器)上的calibre、halo博客?
看前备注:作者也是小白,只是在自己的摸索中积攒了一点经验,分享给大家.不能保证100%的正确,欢迎大家讨论分享. 我的博客(会同步更新的):陌路遥的博客 文作者:陌路遥/欢迎转载 如何利用阿里云域名远 ...
- 调用阿里云API实现证件照生成
目录 1. 作者介绍 2. 算法介绍 2.1 阿里云介绍 2.2 证件照生成背景 2.3 图像分割算法 3.调用阿里云API进行证件照生成实例 3.1 准备工作 3.2 实验代码 3.3 实验结果与分 ...
- 杜彪:天猫数据如何运营、变现? 利用阿里云聚石塔在双11的成功案例
本文作者杜彪,毕业于北京大学计算机系,长期从事人工智能,数据技术研究与应用,国际信息研究学会中国分会副秘书长,北京裕兴科技集团高级顾问. 有一次听闻他利用电商数据做精准营销.没听到他的故事之前,我曾粗 ...
最新文章
- display函数怎么使用_Chapter19:拷贝构造函数
- 梳理vue双向绑定的实现原理
- outlook qr码在哪里_明日方舟兑换码在哪里输入 附1200合成玉兑换码
- 亲历dataguard的一些经验问答题
- 多线程系列之学习多线程下载的基本原理和基本用法(1)
- hdu 3038(种类并查集)
- There is no configured/running web-servers found! Please, run any web-configuration and hit the Refr
- angular语言前端开发_web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万...
- android自动让输入框上划,Android界面技巧:当输入法调出时,如何让界面自动上移,使输入法不会遮挡到主界面(Activity)...
- PHP.ini 中的session 相关设置
- 数据中台建设五步法(文末赠书)
- 模拟栈数据结构改进版(使用异常)
- 安装 PostgreSQL 时丢失 libintl-8.dll 解决方案
- python的requests快速上手、高级用法和身份认证
- 贝叶斯算法伪代码_字节跳动算法面经
- shell实现自动部署两台tomcat项目Ⅱ
- Android loopback(三)
- java.lang.NoClassDefFoundError: com.mobclick.android.MobclickAgent
- 使用gsds绘制基因结构图_[转载]基因结构图的绘制
- 樱花何处有?动态樱花飘落图
热门文章
- QT编译报错:Cannot find file:问题解决
- Donald Knuth
- AI: 2021 年人工智能前沿科技报告02(更新中……)daiding
- 北大计算机博士后岗位需求,北京大学戴志飞课题组招聘博士后及科研助理
- PHP中的12个魔术方法
- 苹果6手机怎么设置鸿蒙,苹果6手机的接入点怎么设置成net
- MapReduce(分布式计算框架)
- 阿里云oss及 七牛云 缩略图如何产生读取
- 三星android 7.0 root,三星G9550 7.0 root教程及获取7.0的root权限
- 啪,腾讯给了我 20 万了。。。