目录

前言

去年自己写的一段代码了,那时候想出门在外也能访问到家里的服务器,后来大部分照片、视频都已经搬到云端,也就没怎么维护过了,正常运行了好几个月,应该还是可以的。今天看到论坛里有网友还在想怎么实现外网获取家宽的动态外网IP,就想着干脆写下来,权当记录了。代码不多,只是用的阿里服务器相关的API去操作域名记录,这块自己去官网上看看吧。

程序就两部分:客户端和服务器端。
准备工具:服务器一台,域名一个,家里随意低功率设备一台(带python)
环境:客户-debian5.0(别问为什么这么旧,老的wd book live),python2.5.2;服务器-CentOS7python2.7.2

一、客户端

import socket
import time
ip_port = ('39.105.165.117',9988)

sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
sk.setblocking(0)
while True:
    try:
        sk.sendto('u2v.cn',ip_port)
        data = sk.recvfrom(1024)
        print(data)
    except:
        print('network error!')

    time.sleep(5)
sk.close()

对,客户端就这么简单,只是每隔5秒和服务器端IP:port联系一下,让服务器端知道自己的外网IP就完事了;当然时间间隔可以自己调整。找个家里的低功率设备部署上去就可以了,可以是群晖、路由、树莓派等等。

二、服务器端

import socket
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException

class server:
    def __init__(self):
        self.ip_port = ('0.0.0.0',9988)
        self.sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
        self.sk.bind(self.ip_port)
        self.main()
        
    def main(self):
        host_old = '42.238.221.80'
        a=0
        b=0
        while True:
            data,(host,port) = self.sk.recvfrom(1024)
            print(data,host,port,host_old)
            self.sk.sendto('ok', (host,port))
            if host != host_old:
                print('update DNS start ...')
                a=self.updateDNS('3985**********1456','www','A',host)
                b=self.updateDNS('3985**********2832','@','A',host)
                print('update DNS end ...')
            if a==0 and b==0:
                host_old = host

    def updateDNS(self,RecordId,RR,Type,Value):

        client = AcsClient('LT*******tKX', 'Jmdpz*****************vg1Eag', 'cn-hangzhou')

        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', RecordId)
        request.add_query_param('RR', RR)
        request.add_query_param('Type', Type)
        request.add_query_param('Value', Value)
        request.add_query_param('TTL', '600')
        
        try:
            response = client.do_action_with_exception(request)
            print(response)
        except ServerException as e:
            print e
            return -1
        except ClientException as e:
            print e
            return -1
        return 0
        # python3:  print(str(response, encoding = 'utf-8'))
    
if __name__ == '__main__':
    server()

服务器并没有实现太多功能,我这只是根据IP变化更新一下阿里云两条DNS记录的值。这里需要自己获取DNS记录的id填写上去。
其他家的域名解析也是同样的道理,只要提供的解析API,就可以自己动态解析。

有关pythonSDK可参考:
https://github.com/aliyun/aliyun-openapi-python-sdk/tree/master/aliyun-python-sdk-alidns
更新域名DNS记录可参考:
https://help.aliyun.com/document_detail/29774.html?spm=a2c4g.11186623.6.637.30bc30b1zF6V5Z

最后编辑:2019年06月27日 ©著作权归作者所有

发表评论

正在加载 Emoji