栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

阿里云域名 动态ip绑定 python方案

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

阿里云域名 动态ip绑定 python方案

阿里云域名 动态ip绑定 python方案

一、配置config.json二、代码三、打包执行
思路:阿里云提供dns域名解析api,查出外网ip,定时更新域名解析。

一、配置config.json

用配置文件,动态配置二级域名,ip,accessKey等。

{
  "ip": "223.76.234.68",
  "accessKeyId": "", //阿里云控制台生成
  "accessSecret": "",
  "domain": "xxx.com.cn", //一级域名
  "subDomain": "test",    //二级域名前缀,多个用英文逗号隔开
  "time": "6"  //定时更新,秒
}
二、代码

python3依赖:

pip install requests
pip install aliyun-python-sdk-alidns
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-domain

代码:

import json
import time

import requests
from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest
from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
from aliyunsdkcore.client import AcsClient

#获取外网ip
def get_internet_ip():
    with requests.get('http://www.3322.org/dyndns/getip') as response:
        html = response.content
        ip = str(html, encoding='utf-8').replace("n", "")
    return ip

#记录上次外网ip
def wirte_to_config(data):
    with open("./config.json", "w") as jsonFile:
        json.dump(data, jsonFile, ensure_ascii=False)

#读取第一步配置
def get_config():
    with open('./config.json', 'r', encoding='utf8')as fp:
        return json.load(fp)
        
#获取二级域名信息
def Describe_SubDomain_Records(client, record_type, subdomain):
    request = DescribeSubDomainRecordsRequest()
    request.set_accept_format('json')
    request.set_Type(record_type)
    request.set_SubDomain(subdomain)
    response = client.do_action_with_exception(request)
    response = str(response, encoding='utf-8')
    relsult = json.loads(response)
    return relsult

def add_record(client, priority, ttl, record_type, value, rr, domainname):
    request = AddDomainRecordRequest()
    request.set_accept_format('json')
    request.set_Priority(priority)
    request.set_TTL(ttl)
    request.set_Value(value)
    request.set_Type(record_type)
    request.set_RR(rr)
    request.set_DomainName(domainname)
    response = client.do_action_with_exception(request)
    response = str(response, encoding='utf-8')
    relsult = json.loads(response)
    return relsult

def update_record(client, ttl, record_type, value, rr, record_id):
    request = UpdateDomainRecordRequest()
    request.set_accept_format('json')
    request.set_TTL(ttl)
    request.set_Value(value)
    request.set_Type(record_type)
    request.set_RR(rr)
    request.set_RecordId(record_id)
    response = client.do_action_with_exception(request)
    response = str(response, encoding='utf-8')
    return response

def deal_aliyun_domain(client, domain, subs, ip):
    for sub in subs:
        subDomain =  sub  + '.' + domain
        des_relsult = Describe_SubDomain_Records(client, "A", subDomain)
        if des_relsult["TotalCount"] == 0:
            add_record(client, "5", "600", "A", ip, sub, domain)
            print("域名解析新增成功!")
        # 判断子域名解析记录查询结果,TotalCount为1表示存在这个子域名的解析记录,需要更新解析记录,更新记录需要用到RecordId,这个在查询函数中有返回des_relsult["DomainRecords"]["Record"][0]["RecordId"]
        elif des_relsult["TotalCount"] == 1:
            record_id = des_relsult["DomainRecords"]["Record"][0]["RecordId"]
            update_record(client, "600", "A", ip, sub, record_id)
            print("域名解析更新成功!")
        else:
            print("存在两个子域名解析记录值,请核查删除后再操作!")

def run(c):
    ip = get_internet_ip()
    old_ip = c['ip']
    if ip == old_ip:
        print("noupdate" + "nnew_ip:" + ip + "nold_ip:" + old_ip)
    else:
        c['ip'] = ip
        wirte_to_config(c)
        client = AcsClient(c['accessKeyId'], c['accessSecret'], 'cn-hangzhou')
        domain = c['domain']
        subs = c['subDomain'].split(',')
        deal_aliyun_domain(client, domain, subs, ip)

if __name__ == "__main__":
    while True:
        c = get_config()
        time.sleep(int(c['time']))
        run(c)
三、打包执行

window服务器
安装Pyinstaller,在项目目录中执行

Pyinstaller -D -w main.py 

并将配置文件放到dist/main目录中,单击mian.exe即可(可能会被杀毒 软件杀掉),


参考引用:https://developer.aliyun.com/article/702552?spm=a2c6h.13813017.content3.1.34115cb6F8LFYY

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/741465.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号