一直想利用树莓派亲手搭建几种服务器来加深了解,奈何电信光猫每次重启后都会重新分配公网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相关推荐

  1. 【python 人像抠图】利用阿里云api进行对本地图片进行批量人像抠图

    阿里云智能视觉开发平台分割抠图 利用阿里云的人像抠图算法,对本地图片进行批量人像抠图,然后批量下载到本地. # -*- coding: utf-8 -*- import sys import requ ...

  2. 利用阿里云API ONS接口获取当前用户下的topics使用情况

    1.main.java package com.sc.sre;public class Main {public static void main(String[] args) {String end ...

  3. ddns 动态解析 - 阿里云api自动解析家用服务器动态ip

    2019独角兽企业重金招聘Python工程师标准>>> 过年回老家办了带宽,大家都知道家用带宽是没有固定ip的一般使用花生壳之类的动态解析域名: 但是花生壳现在不好用,我使用阿里云a ...

  4. 利用阿里云的API实现动态域名解析

    首先在实现动态域名解析之前要具备两个条件: 第一.你必须有公网 IP,就是你的路由器拨号获取到的 IP 必须是公网 IP (可以参考 ip138 获取到的 IP).长城宽带没有公公网 IP 所以就不用 ...

  5. 【阿里云API】 阿里云API调用的若干说明

    阿里云API 为了监控我们使用的一些阿里云产品,需要些一些脚本,定时调用这些脚本来获得相关阿里云产品的信息. ■ 概述 调用阿里云API大约分成两类方法,一个是直接从HTTP协议开始,自己根据阿里云的 ...

  6. 利用阿里云实现异地容灾的解决方案

    一.异地灾备防范于未然 2001年的"911事件"中,没有远程备份的企业都遭受了巨大损失,甚至部分公司因为核心业务部署在公司大楼而又没有远程备份,导致公司业务无法继续运营而倒闭.美 ...

  7. 如何利用阿里云域名远程访问家中群辉NAS(Docker容器)上的calibre、halo博客?

    看前备注:作者也是小白,只是在自己的摸索中积攒了一点经验,分享给大家.不能保证100%的正确,欢迎大家讨论分享. 我的博客(会同步更新的):陌路遥的博客 文作者:陌路遥/欢迎转载 如何利用阿里云域名远 ...

  8. 调用阿里云API实现证件照生成

    目录 1. 作者介绍 2. 算法介绍 2.1 阿里云介绍 2.2 证件照生成背景 2.3 图像分割算法 3.调用阿里云API进行证件照生成实例 3.1 准备工作 3.2 实验代码 3.3 实验结果与分 ...

  9. 杜彪:天猫数据如何运营、变现? 利用阿里云聚石塔在双11的成功案例

    本文作者杜彪,毕业于北京大学计算机系,长期从事人工智能,数据技术研究与应用,国际信息研究学会中国分会副秘书长,北京裕兴科技集团高级顾问. 有一次听闻他利用电商数据做精准营销.没听到他的故事之前,我曾粗 ...

最新文章

  1. display函数怎么使用_Chapter19:拷贝构造函数
  2. 梳理vue双向绑定的实现原理
  3. outlook qr码在哪里_明日方舟兑换码在哪里输入 附1200合成玉兑换码
  4. 亲历dataguard的一些经验问答题
  5. 多线程系列之学习多线程下载的基本原理和基本用法(1)
  6. hdu 3038(种类并查集)
  7. There is no configured/running web-servers found! Please, run any web-configuration and hit the Refr
  8. angular语言前端开发_web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万...
  9. android自动让输入框上划,Android界面技巧:当输入法调出时,如何让界面自动上移,使输入法不会遮挡到主界面(Activity)...
  10. PHP.ini 中的session 相关设置
  11. 数据中台建设五步法(文末赠书)
  12. 模拟栈数据结构改进版(使用异常)
  13. 安装 PostgreSQL 时丢失 libintl-8.dll 解决方案
  14. python的requests快速上手、高级用法和身份认证
  15. 贝叶斯算法伪代码_字节跳动算法面经
  16. shell实现自动部署两台tomcat项目Ⅱ
  17. Android loopback(三)
  18. java.lang.NoClassDefFoundError: com.mobclick.android.MobclickAgent
  19. 使用gsds绘制基因结构图_[转载]基因结构图的绘制
  20. 樱花何处有?动态樱花飘落图

热门文章

  1. QT编译报错:Cannot find file:问题解决
  2. Donald Knuth
  3. AI: 2021 年人工智能前沿科技报告02(更新中……)daiding
  4. 北大计算机博士后岗位需求,北京大学戴志飞课题组招聘博士后及科研助理
  5. PHP中的12个魔术方法
  6. 苹果6手机怎么设置鸿蒙,苹果6手机的接入点怎么设置成net
  7. MapReduce(分布式计算框架)
  8. 阿里云oss及 七牛云 缩略图如何产生读取
  9. 三星android 7.0 root,三星G9550 7.0 root教程及获取7.0的root权限
  10. 啪,腾讯给了我 20 万了。。。