«

Python3 动态域名解析Demo

发布于 阅读:166 教程


腾讯云Demo

# pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python
# pip install python-mimeparse

import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.dnspod.v20210323 import dnspod_client, models
import os
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
from loguru import logger

email_host = 'smtp.qq.com'  # stmp服务器地址
email_port = 25  # stmp服务器端口
email_user = '123456@qq.com'  # stmp发送邮件的邮箱
email_name = '执酒'
email_tokey = '123456'  # stmp的授权码
receiver = '123456@qq.com'  # 接收邮件邮箱
logger.add("logs/info{time:YYYY-MM-DD}.log", rotation="1 day",retention="7 days",filter=lambda record: record["level"].name == "INFO", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message} | {extra}")
logger.add("logs/error{time:YYYY-MM-DD}.log", rotation="1 day",retention="7 days",filter=lambda record: record["level"].name == "ERROR", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message} | {extra}")

def SetMsg():
    msg = MIMEMultipart()
    msg['Subject'] = '家里宽带IPv6变动提醒'
    msg['From'] = formataddr(pair=(email_name, email_user))
    msg['To'] = receiver
    text = ('IPv6地址有变动,域名解析已更新' )
    texts = MIMEText(text, 'plain', 'utf-8')
    msg.attach(texts)
    return msg.as_string()

def GetIPv6():
    ipResult = os.popen('curl ipv6.icanhazip.com').read()  # 得到字符串 ip + /n,需要去掉回车符
    IPv6 = ipResult.replace('\n', '')
    return IPv6

def get_record_list():
    try:
        cred = credential.Credential("SecretId", "SecretKey")
        httpProfile = HttpProfile()
        httpProfile.endpoint = "dnspod.tencentcloudapi.com"
        # 实例化一个client选项,可选的,没有特殊需求可以跳过
        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        # 实例化要请求产品的client对象,clientProfile是可选的
        client = dnspod_client.DnspodClient(cred, "", clientProfile)
        # 实例化一个请求对象,每个接口都会对应一个request对象
        req = models.DescribeRecordListRequest()
        params = {
            "Domain": "liuxiaozhu.cn",
            "Subdomain": "blog"
        }
        req.from_json_string(json.dumps(params))
        # 返回的resp是一个DescribeRecordListResponse的实例,与请求对象对应
        resp = client.DescribeRecordList(req)
        # 输出json格式的字符串回包
        ipv6_list = resp.RecordList[0].Value
        return ipv6_list
    except TencentCloudSDKException as err:
        print(err)

def SetEmail(msg):
    logger.bind(IPv6=IPv6, email_user=email_user, receiver=receiver).info("开始处理邮件发送")
    if IPv6 == ipv6_list:
        logger.bind(IPv6=IPv6).info("IP地址未变化,无需发送邮件。")
    else:
        # 更新IPv6地址到腾讯DDNS
        try:
            cred = credential.Credential("SecretId", "SecretKey")
            httpProfile = HttpProfile()
            httpProfile.endpoint = "dnspod.tencentcloudapi.com"
            clientProfile = ClientProfile()
            clientProfile.httpProfile = httpProfile
            client = dnspod_client.DnspodClient(cred, "", clientProfile)
            req = models.ModifyRecordRequest()
            params = {
                "Domain": "liuxiaozhu.cn",
                "SubDomain": "@",
                "RecordType": "AAAA",
                "RecordLine": "默认",
                "Value": IPv6,
                "RecordId": 1354488399
            }
            req.from_json_string(json.dumps(params))
            resp = client.ModifyRecord(req)
        except TencentCloudSDKException as err:
            logger.bind(error_message=str(err)).error("Tencent Cloud SDK异常")
        # 发送新的IPv6到邮箱
        smtpServer = smtplib.SMTP()
        smtpServer.connect(email_host)
        # smtpServer.set_debuglevel(1)
        smtpServer.login(email_user, email_tokey)
        smtpServer.sendmail(email_user, receiver, msg)
        smtpServer.quit()
        logger.bind(resp=resp.to_json_string()).info(
            "ip地址改变,域名解析已更新,已发送邮件")

if __name__ == '__main__':
    IPv6 = GetIPv6()
    ipv6_list = get_record_list()
    msg = SetMsg()
    SetEmail(msg)

阿里云Demo

# pip install aliyun-python-sdk-alidns==3.0.1
# pip install python-mimeparse

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.auth.credentials import AccessKeyCredential
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest

import os
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart

email_host = 'smtp.qq.com'  # stmp服务器地址
email_port = 25  # stmp服务器端口
email_user = '123456@qq.com'  # stmp发送邮件的邮箱
email_name = '执酒'
email_tokey = '123456'  # stmp的授权码
receiver = '123456@qq.com'  # 接收邮件邮箱

def GetIPv6():
    ipResult = os.popen('curl ipv6.icanhazip.com').read()  # 得到字符串 ip + /n,需要去掉回车符
    IPv6 = ipResult.replace('\n', '')
    return IPv6

def SetMsg():
    msg = MIMEMultipart()
    msg['Subject'] = '家里宽带IPv6变动提醒'
    msg['From'] = formataddr(pair=(email_name, email_user))
    msg['To'] = receiver
    text = ('IPv6地址有变动,域名解析已更新' )
    texts = MIMEText(text, 'plain', 'utf-8')
    msg.attach(texts)
    return msg.as_string()

def SetEmail(msg):
    ip = open("ip.txt","r").read()
    if IPv6 == ip:
        print("ip地址无变化,无需发送邮件")
    else:
        ip = open("ip.txt","w+").write(IPv6)
        # 更新IPv6地址到阿里DDNS
        credentials = AccessKeyCredential("Access_Key_Id", "Access_Key_Secret")
        client = AcsClient(region_id='cn-hangzhou', credential=credentials)
        request = UpdateDomainRecordRequest()
        request.set_accept_format('json')
        request.set_RecordId("123456")
        request.set_RR("*")
        request.set_Type("AAAA")
        request.set_Value(IPv6)
        response = client.do_action_with_exception(request)
        print(str(response, encoding='utf-8'))
        print('域名解析已更新')

        # 发送新的IPv6到邮箱
        smtpServer = smtplib.SMTP()
        smtpServer.connect(email_host)
        # smtpServer.set_debuglevel(1)
        smtpServer.login(email_user, email_tokey)
        smtpServer.sendmail(email_user, receiver, msg)
        smtpServer.quit()
        print("ip地址改变,已发送邮件")

if __name__ == '__main__':
    IPv6 = GetIPv6()
    # IPv4 = GetIPv4()
    msg = SetMsg()
    SetEmail(msg)

Python

收到1条评论
avatar
2 年前
谢谢分享,已学习
回复