文章目录

DDNS:IP更新到腾讯云的升级版

由 Rorical 发布

上次弄完私有云之后,发现那个上传IP的程序还是不够稳定,因此对它做了一些修改
参考上一篇文章(因为在公众号发的所以博客上没有)
双十一用可道云建一个真正的私有云
所以说上代码:

# -*- coding: utf-8 -*-
import time,random,requests
import hmac,base64,json,re,os
from urllib import parse
filename = "status.json"
subdomain = "你的子域名"
domain = "你的域名"
password = "你的小米路由器密码"
SecretId = "腾讯云的API Id"
SecretKey = "腾讯云的API Key"
def CRecord(ip,subDomain,domain):
    def Auth(data,SecretId,SecretKey):
        domain="cns.api.qcloud.com"
        p = "/v2/index.php?"
        Timestamp = int(time.time())
        Nonce = random.randint(1000,99999)
        config = dict(
                {
                    "Nonce" : Nonce,
                    "SecretId" : SecretId,
                    "SignatureMethod" : "HmacSHA256",
                    "Timestamp" : Timestamp,
                }
            ,**data)
        g = ""
        for k in sorted(config):
            g += "%s=%s&"%(k.replace("_","."),config[k])
        g=g[0:-1]
        srcStr = "GET" + domain + p + g
        signStr = base64.b64encode(hmac.new(SecretKey.encode(),srcStr.encode(),digestmod='sha256').digest()).decode()
        signStr = parse.quote(signStr)
        result = "https://" + domain + p + g + "&Signature=" + signStr
        return result
    data={
            "Action" : "RecordList",
            "offset":0,
            "length":20,
            "domain":domain
        }
    url = Auth(data,SecretId,SecretKey)
    r = requests.get(url)
    r = json.loads(r.text)
    ida=0
    if r["code"]==0:
        for i in r["data"]["records"]:
            if i["name"]==subDomain:
                ida = i["id"]
                break
    else:
        return r["message"]
        return None
    data={
            "Action" : "RecordModify",
            "recordId":ida,
            "subDomain":subDomain,
            "domain":domain,
            "recordType":"A",
            "recordLine":"默认",
            "value":ip,
            "ttl":600
        }
    url = Auth(data,SecretId,SecretKey)
    r = requests.get(url)
    r = json.loads(r.text)
    if r["code"]==0:
        return r["codeDesc"]
    else:
        return r["message"]

try:
    f = open(filename,"r")
    status = json.loads(f.read())
    f.close()
    print(status)
    r = requests.get("http://192.168.31.1/cgi-bin/luci/;stok=%s/api/xqnetwork/pppoe_status"%status["token"])
    r = json.loads(r.text)
    if r["code"] == 401:
        data={
                'username': 'admin',
                'password': password,
                'logtype': 2,
            }
        r = requests.post("http://192.168.31.1/cgi-bin/luci/api/xqsystem/login",data=data)
        r = json.loads(r.text)["token"]
        status["token"] = r
        r = requests.get("http://192.168.31.1/cgi-bin/luci/;stok=%s/api/xqnetwork/pppoe_status"%status["token"])
        r = json.loads(r.text)
    if status["ip"] != r["ip"]["address"]:
        status["ip"] = r["ip"]["address"]
        print(CRecord(status["ip"],subdomain,domain))
        f = open(filename,"w")
        f.write(json.dumps(status))
        f.close()
except:
    status = {"ip":"","token":""}
    f = open(filename,"w")
    f.write(json.dumps(status))
    f.close()
    os.popen("reboot")
finally:
    f.close()

这次的主要修改时把获取IP移动到小米路由器上,这样就可以增加获取IP的频率,防止更新不过来导致的无法访问(域名解析TTS也可以相对减小一些)(还有是因为实在不忍心请求别人的接口,想想那个请求IP的数据包跑了半个中国就难受)
请求192.168.31.1就是为了获取小米路由器的信息,适用于同样由openWRT开发的路由器,但是要根据情况修改一下请求地址。原理就是发送账号密码来获得Token,再根据Token请求路由器的外网信息,但token毕竟是有有效期的,所以每次请求时都会判断token是否需要更新,尽可能减少路由器压力吧。
建议把脚本设置为定时执行,一分钟一次为好吧

再给你们看一下我Nas的现有情况吧
图
在小米店买的那个插线板收纳盒强行派上用处了,里面装着树莓派和电源还有一只很可爱的小风扇,旁边就是硬盘啦
现在运行挺好,就是网速限制了


2 条评论

  1. 锁月
    锁月 · 2020-03-26 21:31

    这是?

  2. 叶子
    叶子 · 2020-01-27 22:55

    可以加快网速

发表评论