首页 » Web前端 » phpddns技巧_运用阿里云API实现DDNS不用花钱再用花生壳花生棒了

phpddns技巧_运用阿里云API实现DDNS不用花钱再用花生壳花生棒了

访客 2024-11-17 0

扫一扫用手机浏览

文章目录 [+]

自从家里有小孩夹帐机里的照片多的没地方放,又想实时能查看,家里人的手机都拍了宝宝照片视频,也没法相互查看,以是这个场景下不管是云备份,qq空间都无法实现这个诉求,腾讯相册的小程序倒是好,但是貌似常常有bug,再说数据放在家里是最安全的。
前段韶光看头条上面说花生壳的内网穿透,虽然没用过也不想费钱,就想能不能自己搞一个内网穿透,就想查查花生壳实现内网穿透的事理,百度了一批溘然创造有个标题为“无需花生壳,阿里云解析实现内网穿透”的文章,好好拜读了一下,以为自己该当也可以弄,由于我有一个阿里云的虚拟做事器正在利用,设置个二级域名就可以了,这里须要感激 “没文化的查哥”看了他的文章才知道该怎么做,他是用Python 实现的,而我了 又不会Python,以是了不管怎么样先试试。

这里了须要先说说实现内网穿透所须要的条件,如果阁下不具备就随便看看吧。

phpddns技巧_运用阿里云API实现DDNS不用花钱再用花生壳花生棒了

1.你须要有个域名,如果没有也可以买一个,那种一样平常的域名一年也就十几块,几块的,买个十年也花不了多少钱。

phpddns技巧_运用阿里云API实现DDNS不用花钱再用花生壳花生棒了
(图片来自网络侵删)

2.既然要做ddns,那你须要一个公网IP,现在多数家里的网都是私网,须要去申请,我家里用的是电信的,我打了个客服10000号申请了一下,第三天就给我搞定了,联通移动的网络是否好申请,我不知道,听说不好申请,由于分给他们的地址少。
这里什么是私网什么是公网呢?举个例子 你家里有台路由器 ,家里的电脑电视手机获取到的ip便是路由器分配的ip地址是私网ip,但是路由器拨号上网得到的ip地址是电信公司分配的,那么如果说路由器利用的ip地址是公网。
同样道理好比说电信公司就有一台巨大路由器,然后家家户户用的路由器上得到的ip地址便是电信公司这个大路由器分配的。
而电信公司的路由器便是利用公网IP,我们的路由器上拨号获取的ip是私网,我们想要利用公网ip就得向人家申请。
中国电信握有大量公网ip以是好申请一些,那么为什么不给家家分配公网IP呢?是由于用户太多了 公网IP不足用,再说公网ip比私网IP要好 要更快。
扯远了...。

3.不管你内网穿透要干啥,家里总是须要一台做事器,例如闲置多年的烂条记本,扔了可惜,用又用不着的那种,最好功耗低一点的,不费电。
我家里有两台旧条记本(只能运行winxp系统的),一台windows平板,有一台是个华硕的上网本,功耗低,一台是上学时买的彷佛09年买的吧。
windows 平板是山寨的那种运行的windows 8 但是没有网线插口,做做事器功耗挺美,但是网络可能弗成,就选择华硕上网本安装centOs

4.其他比如说家里没网没路由器 那那就...

说说实现事理

纵然是公网ip它也是会改变的,不会一贯不变,详细缘故原由就不说了,因此我们须要利用阿里云的云解析API做一个动态改变解析值的这么一个组件,然后在做事器上设置定时实行这个组件,当创造公网ip变了往后立即把解析值给修正成最新的ip,以担保域名解析始终指向你家里的做事器。

一、实现步骤:

1.申请一个公网ip

2.阿里云域名(要备案,过程麻烦但是也是比较好备案的),把须要解析的域名解析值设置为这个公网ip

3.设置路由器,路由器的端口映射可以把网络上的要求指向你局域网的做事器,把稳路由器要根据mac地址给做事器分配静态ip,不能让做事器自动获取ip 当然 你也可以把你的做事器就放在猫阁下,直接连接猫获取ip,就省去了端口映射。

4.做事器,可以是linux 或者windos,不管是要用web ftp server...

5.把开拓好的组件放进做事器

以上步骤大略就这样,我们下面重点说这个组件开拓,开拓组件用的是Python ,搭建Python做事器的方法就不说了,我Python 也是小白,只花了两天看了看runoob的python3的教程,我紧张是做php和前段的,下面代码写的不好的或者注释禁绝确的希望大牛不要笑话,示正一下。

实现的思路都是来源于阿里云的API文档 https://help.aliyun.com/document_detail/29776.html

二、实现事理:

先获取当前公网ip 然后获取阿里云域名列表,找出要修正的域名解析值,然后跟公网ip做比拟,如果两个ip不一样解释公网ip变心了 就须要把解析值修正成新来的ip

现在开始直接贴代码:

#1 获取公网ip

import requests #异步要求库 安装方法终端运行: pip install requests

import re

def get_local_ip(self):

#通过向http://txt.go.sohu.com/ip/soip 网站发送get要求,会获取到当前局域网所在外网(公网)ip信息,返回的是一串字符串,把稳利用异步要求须要requests库支持

text = requests.get("http://txt.go.sohu.com/ip/soip").text

#通过正在表达式解析出返回的ip地址

ip = re.findall(r'\d+.\d+.\d+.\d+',text)

return ip[0]

#2 获取域名列表及修正解析值

#阿里如斯解析库 以下4个库安装方法

#pip install aliyun-python-sdk-core

#pip install aliyun-python-sdk-domain

#pip install aliyun-python-sdk-alidns

from aliyunsdkcore.client import AcsClient

from aliyunsdkcore.acs_exception.exceptions import ClientException

from aliyunsdkcore.acs_exception.exceptions import ServerException

from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest

from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest

import json #系统带有 如果没有请下载安装

''' AccessKeyId 阿里云后台获取

AccessKeySecret 阿里云后台获取

RegionId 一样平常默认为 zh-hangzhou

DomainName 要获取的域名 如 xxx.cn 、xxx.com

RrName 解析主记录 可以通过阿里云后台解析列表查看,例如 www.xxx.com 的 主记录为www home.xxx.com 主记录为 home

PageSize 获取解析列表每页显示的数量,默认20 最多200

'''

client = AcsClient(AccessKeyId, AccessKeySecret, RegionId)

request = DescribeDomainRecordsRequest()

request.set_accept_format('json') #返回的数据格式 为json

request.set_DomainName('你要解析的域名DomainName ') # 要获取的域名

request.set_PageSize('每页显示记录的数量值PageSize ') # 每页显示记录数量

response = client.do_action_with_exception(request)

dns_list = str(response, encoding='utf-8') #获取得到json字符

list_boj = json.loads(dns_list); #将json字符串转为python字典

record = list_boj['DomainRecords']['Record']; #获取dns列表中的须要修正的dns组 格式如{"RR": "xx","Line": "default","Status": "ENABLE","Locked": false,"Type": "A","DomainName": "xxx.cn","Value": "0.0.0.0","RecordId": "123456789...",...} ,{"":"",....}

#须要得到的参数

RecordId = ''

Type = ''

RR = ''

ThisIp = ''

#遍历record 得到RR:主记录 RecordId:记录id Type:记录类型 ThisIp:当前解析的值

for x in record:

rtop = x['RR']; #主记录 用于下面判断是不是与修正设置的RrName 同等,如果同等就把所须要的参数拿出来并跳出循环

if(rtop == RrName ):

RecordId = x['RecordId'];

Type = x['Type'];

RR = x['RR'];

ThisIp = x['Value'];

break;

if(‘公网ip’ != ThisIp):

requests = UpdateDomainRecordRequest()

requests.set_accept_format('json')

requests.set_RecordId(RecordId) #记录id

requests.set_RR(RR) #主记录

requests.set_Type(Type) #记录类型如 A

requests.set_Value('新的公网ip') #修正为当前公网IP

responses = client.do_action_with_exception(requests)

infJson = str(responses, encoding='utf-8')

infObj = json.loads(infJson); # 把返回值解析一下,如果成功返回则返回 此记录值的 RecordId

if(RecordId == infObj['RecordId']):

inf = 'IP修正成功!
RecordId:'+infObj['RecordId']

else:

inf = 'IP修正失落败'

else:

inf = 'ip相同不用修正!
'

return inf;

以上代码为办理思路,利用此代码把稳自己的利用逻辑,须要按照自己的逻辑修正一下,把稳缩进问题。

部分代码截图如下:

class

希望能帮助到有需求的人。
禁绝确的请示正。

后续做好了全体流程可以的话再分享

须要源码的可以私信哦

标签:

相关文章