├── python_ip.bat ├── aliyunDNS_library.zip ├── Email.py ├── aliDNS.py └── README.md /python_ip.bat: -------------------------------------------------------------------------------- 1 | python Email.py -------------------------------------------------------------------------------- /aliyunDNS_library.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LunaticTian/Aliyun_ip_DDNS/master/aliyunDNS_library.zip -------------------------------------------------------------------------------- /Email.py: -------------------------------------------------------------------------------- 1 | import smtplib 2 | from email.mime.text import MIMEText 3 | from email.header import Header 4 | import socket 5 | import os 6 | import aliyundns 7 | import requests 8 | 9 | 10 | def getip(): 11 | rosepse = requests.get("http://myip.dnsomatic.com/") 12 | return rosepse.text 13 | 14 | if __name__ == '__main__': 15 | 16 | while 1: 17 | # 检测是否有网 18 | exit_code = os.system('ping www.baidu.com') 19 | if exit_code: 20 | pass 21 | 22 | else: 23 | # ip = socket.gethostbyname(socket.gethostname()) 24 | # print(ip) 25 | ip = getip() 26 | print('get ip :' + ip ) 27 | msg = MIMEText('IP:'+str(ip), 'plain', 'utf-8') 28 | aliyundns.update_dns() 29 | msg['Subject'] = Header("IP地址发送", 'utf-8') 30 | #报错原因是因为“发件人和收件人参数没有进行定义 31 | # 发送的邮箱地址 32 | msg['from'] = '123123@126.com' 33 | # 接收的邮箱地址 34 | msg['to'] = 'imqq@qq.com' 35 | 36 | smtp = smtplib.SMTP() 37 | # smtp服务器 38 | smtp.connect("smtp.126.com") 39 | # 登陆发送账号,密码 40 | smtp.login("123123@126.com", "123123") 41 | # 编辑邮件 发送地址/接收地址/内容 42 | smtp.sendmail("123123@126.com", "imqq@qq.com", msg.as_string()) 43 | smtp.quit() 44 | print('邮件发送成功email has send out !') 45 | break 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /aliDNS.py: -------------------------------------------------------------------------------- 1 | import socket 2 | from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \ 3 | DescribeDomainRecordInfoRequest, AddDomainRecordRequest 4 | from aliyunsdkcore import client 5 | import json 6 | 7 | 8 | # 记录本机IP 9 | ip = socket.gethostbyname(socket.gethostname()) 10 | print(ip) 11 | 12 | 13 | # 主域名 如:baidu.com 14 | dns_domain = '' 15 | 16 | # Access Key ID 17 | access_key_id = '' 18 | 19 | # Access Key Secret 20 | access_Key_secret = '' 21 | 22 | # DNS 或者一级域名二级域名前缀 譬如 3q.baidu.com 这里填入3q 23 | DNS_RR = '' 24 | # 记录类型:A或者CNAME,默认为A 25 | dns_type = 'A' 26 | # 记录值:需要修改的ip 27 | dns_value = ip 28 | # dnsID,每一个主机记录都会有一个ID 29 | 30 | # 获取dns记录信息列表 31 | def check_records(dns_domain=dns_domain): 32 | clt = client.AcsClient(access_key_id, access_Key_secret, 'cn-hangzhou') 33 | request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() 34 | request.set_DomainName(dns_domain) 35 | request.set_accept_format('json') 36 | result = clt.do_action(request) 37 | res = result.decode('gb2312') 38 | result1 = json.JSONDecoder().decode(res) 39 | list = result1['DomainRecords']['Record'] 40 | print(list) 41 | return list 42 | 43 | # 查询 dns_record_id 44 | def select_RR(list): 45 | for i in list: 46 | print(i) 47 | if i['RR'] == DNS_RR: 48 | dns_record_id = i['RecordId'] 49 | print(dns_record_id) 50 | return dns_record_id 51 | 52 | # 更新记录 53 | def update_dns(dns_rr='ip', dns_type='A', dns_value=dns_value, dns_record_id='', dns_ttl='600', dns_format='json'): 54 | clt = client.AcsClient(access_key_id, access_Key_secret, 'cn-hangzhou') 55 | request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() 56 | request.set_RR(dns_rr) 57 | request.set_Type(dns_type) 58 | request.set_Value(dns_value) 59 | request.set_RecordId(dns_record_id) 60 | request.set_TTL(dns_ttl) 61 | request.set_accept_format(dns_format) 62 | result = clt.do_action(request) 63 | print(result) 64 | return result 65 | 66 | if __name__ == '__main__': 67 | list = check_records() 68 | dns_record_id = select_RR(list) 69 | update_dns(dns_record_id=dns_record_id) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aliyun_ip_DDNS 2 | 基于阿里云SDK 3 | 4 | 5 | ## update 6 | 7 | 2018/6/5: 8 | 新增Email.py以及python_ip.bat/Eamil主要作用用于某些突发状况,用以Email做备用IP处理 9 | 10 | 1.优化网络检测 11 | 12 | 2.去除ip = socket.gethostbyname(socket.gethostname()),用于http://myip.dnsomatic.com/获取外网IP。 13 | 14 | // 某些情况下 socket.gethostbyname(socket.gethostname())获取到的是本地IP或者路由器分配IP。 15 | 16 | 2018/6/6: 17 | 18 | 1.新增aliyunDNS_library,内含此项目的全部依赖。 19 | 20 | ## 使用范围 21 | github上大多数以python2.7为主,此程序为python3。 22 | 23 | 阿里云的DDNS动态域名解析 24 | 25 | 将本机或者指定机器的动态ip到域名解析 26 | 27 | ## 依赖 28 | 29 | socket 30 | 31 | json 32 | 33 | 阿里云SDK: 34 | 35 | 为防止pip install 错误,aliyunDNS_library.rar内含此项目的所有依赖。 36 | 37 | 将该文件解压,放置pyhton内的site-packages中。 38 | 39 | 40 | 41 | ## 参数说明 42 | 43 | ### aliDNS 44 | 主域名 如:baidu.com 45 | 46 | dns_domain = '' 47 | 48 | 阿里云的Access Key ID 49 | 50 | access_key_id = '' 51 | 52 | 阿里云的Access Key Secret 53 | 54 | access_Key_secret = '' 55 | 56 | DNS 或者一级域名二级域名前缀 譬如 3q.baidu.com 这里填入3q 57 | 58 | DNS_RR = '' 59 | 60 | 记录类型:A或者CNAME,默认为A 61 | 62 | dns_type = 'A' 63 | 64 | 记录值:需要修改的ip 65 | 66 | dns_value = ip 67 | 68 | ### Eamli 69 | 70 | ip = getip() 71 | 72 | print('get ip :' + ip ) 73 | 74 | msg = MIMEText('IP:'+str(ip), 'plain', 'utf-8') 75 | 76 | aliyundns.update_dns() 77 | 78 | msg['Subject'] = Header("IP地址发送", 'utf-8') 79 | 80 | 81 | 发送的邮箱地址 82 | 83 | msg['from'] = '123123@126.com' 84 | 85 | 接收的邮箱地址 86 | 87 | msg['to'] = 'imqq@qq.com' 88 | 89 | smtp = smtplib.SMTP() 90 | 91 | smtp服务器 92 | 93 | smtp.connect("smtp.126.com") 94 | 95 | 登陆发送账号,密码 96 | 97 | smtp.login("123123@126.com", "123123") 98 | 99 | 编辑邮件 发送地址/接收地址/内容 100 | 101 | smtp.sendmail("123123@126.com", "imqq@qq.com", msg.as_string()) 102 | 103 | 104 | ## 函数说明 105 | 106 | 107 | ### 获取dns记录信息列表 108 | 109 | def check_records(dns_domain=dns_domain): 110 | clt = client.AcsClient(access_key_id, access_Key_secret, 'cn-hangzhou') 111 | request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest() 112 | request.set_DomainName(dns_domain) 113 | request.set_accept_format('json') 114 | result = clt.do_action(request) 115 | res = result.decode('gb2312') 116 | result1 = json.JSONDecoder().decode(res) 117 | list = result1['DomainRecords']['Record'] 118 | print(list) 119 | return list 120 | 121 | 用于获取DNS记录列表 122 | 123 | ### 查询 dns_record_id 124 | 125 | def select_RR(list): 126 | for i in list: 127 | print(i) 128 | if i['RR'] == DNS_RR: 129 | dns_record_id = i['RecordId'] 130 | print(dns_record_id) 131 | return dns_record_id 132 | 133 | 通过list查询获得RecordId。 134 | 135 | 136 | ### 更新(修改)ip记录 137 | 138 | def update_dns(dns_rr='ip', dns_type='A', dns_value=dns_value, dns_record_id='', dns_ttl='600', dns_format='json'): 139 | clt = client.AcsClient(access_key_id, access_Key_secret, 'cn-hangzhou') 140 | request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() 141 | request.set_RR(dns_rr) 142 | request.set_Type(dns_type) 143 | request.set_Value(dns_value) 144 | request.set_RecordId(dns_record_id) 145 | request.set_TTL(dns_ttl) 146 | request.set_accept_format(dns_format) 147 | result = clt.do_action(request) 148 | print(result) 149 | return result 150 | 151 | 152 | ## 使用说明 153 | 将依赖包解压复制到 安装目录下的Lib文件中,例如 `C:\Users\Raphael\AppData\Local\Programs\Python\Python37-32\Lib`. 154 | 155 | 程序可设定定时启用或开机启用,使用者应保证依赖正确并且是pyhton3以上。 156 | 157 | 程序可直接定时运行,使用者填写参数并保证正确。 158 | 159 | 当指定自己的RecordId,可之调用update_dns方法。 160 | 161 | 162 | --------------------------------------------------------------------------------