dnspod.cn提供的免費服務支持把國際頂級域名(如abc.com/net/cc)綁定到自己家寬帶的動態IP上面,從此告別花生殼,3322.org。這個工具每隔一段時間在網關設備上運行一次,一旦發現寬帶ip地址發生變化,就會向服務器發出更新請求。
請注意:
此客戶端代碼可運行在家庭內網的任意設備上
此客戶端需要linux運行環境
此客戶端需要python語言解釋器執行(一般來說,各種linux發行版均默認自帶python解釋器)
使用此程序,需要掌握以下技能:shell基本操作, linux文本編輯器(vi/nano)基本操作
安裝方法:
複製以下源代碼並保存爲dnspod.py
#!/user/bin/env python #coding=utf-8 import urllib, urllib2, json import socket, struct, fcntl import sys, os, time url = "https://dnsapi.cn/Record.Ddns" # 使用你自己的設置更改以下內容 account = "[email protected]" # 你在dnspod.cn註冊的郵件地址 password = "password" # 你在dnspod.cn註冊密碼 domain_id = "12345678" # 你的域名id (如何獲取請查看本文最下方) sub_domain = "hostname" # 你要更新的主機頭名,例如 hostname.mydomain.com record_id = "12345678" # 此主機頭名對應的記錄id (如何獲取請查看本文最下方) record_line = "默認" # dnspod.cn中爲此記錄指定的線路 wan_ifname = "ppp0" # 連接 Internet 的網卡設備名(對於撥號上網的路由器來說,一般爲ppp0,內網的其他機器使用鏈接局域網的網卡名稱即可如eth0) # 使用你自己的設置更改以上內容 prev_file = "/dev/shm/wan.prev" log_file = "/var/log/dnspod.log" def get_ipaddress(interface): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ip = socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, struct.pack("256s", interface[:15]) )[20:24] ) if ip.find("192.") == 0: url = "http://1111.ip138.com/ic.asp" response = urllib.urlopen(url) reply = response.read() import re reg = re.compile(r"\d+.\d+.\d+.\d+") ip = reg.findall(reply)[0] return ip def print_log(text): log = open(log_file, "a") timestamp = time.strftime('%Y-%m-%d %H:%M:%S') log.write(timestamp + " | " + text + "\n") log.close() values = { "login_email": account, "login_password": password, "domain_id": domain_id, "sub_domain": sub_domain, "record_id": record_id, "record_line": record_line, "format": "json" } changed = False current_ip = get_ipaddress(wan_ifname) prev_ip = "" if not os.path.exists(prev_file): prev = open(prev_file, "a") prev.write(current_ip) prev.close() changed = True else: prev = open(prev_file, "r") prev_ip = prev.readline().strip() prev.close() if prev_ip != current_ip: prev = open(prev_file, "w") prev.write(current_ip) prev.close() changed = True if changed: print_log("IP address changed to " + current_ip) data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) content = response.read() myinfo = json.loads(content) if myinfo["status"]["code"] == "1": print_log("dnspod DDNS updated") # print_log("IP address not changed yet")
2. 使用您自己的設置更改源代碼中的變量(請注意代碼中的註釋)
3. 將dnspod.py保存到linux服務器中/bin(使用winscp或者在vi/nano中粘貼)
4. 執行以下命令:
chmod +x /bin/dnspod.py
5. 執行以下命令進行測試
/bin/dnspod.py
6. 執行以下命令檢查程序輸出
tail /var/log/dnspod.log
7. 請確認程序輸出了 “IP address changed to xx.xx.xx.xx, dnspod DDNS updated” 即可
8. 執行以下命令打開linux中的計劃任務描述文件
crontab -e
9. 在cron的任務文件描述中加入以下一行內容並保存,此後每隔10分鐘將自動執行此程序一次
*/10 * * * * /bin/dnspod.py
10. 完成!
如何獲取domain_id及record_id?
請複製以下代碼並保存到 /bin/dnspod_info.py
#!/usr/bin/env python import urllib import urllib2 import json import sys if len(sys.argv) < 3: print("usage: dnspodinfo <login email> <password>") sys.exit() url = "https://dnsapi.cn/Domain.List" values = { "login_email": sys.argv[1], "login_password": sys.argv[2], "format": "json" } data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) content = response.read() myinfo = json.loads(content) for domain in myinfo["domains"]: url1 = "https://dnsapi.cn/Record.List" domain_id = str(domain["id"]) domain_name = domain["name"] print("Domain: " + domain_name + " (id = " + domain_id + ")") values1 = { "login_email": values["login_email"], "login_password": values["login_password"], "domain_id": domain_id, "format": "json" } data1 = urllib.urlencode(values1) req1 = urllib2.Request(url1, data1) response1 = urllib2.urlopen(req1) content1 = response1.read() myinfo1 = json.loads(content1) for record in myinfo1["records"]: r_id = record["id"] r_name = record["name"] r_value = record["value"] r_ttl = record["ttl"] r_line = record["line"] r_enable = record["enabled"] r_type = record["type"] print(" " + r_id + ": " + r_name + "." + domain_name + " -> " + \ r_value + " type=" + r_type + " ttl=" + r_ttl + " line=" + r_line + \ " enabled=" + r_enable + " timestamp=" + record["updated_on"])
2. 輸入命令,標記可執行
chmod +x /bin/dnspod_info.py
3. 輸入以下命令並執行, 注意把email地址和密碼換成你在dnspod自己註冊的
/bin/dnspod_info.py [email protected] password
4. 查看程序輸出,如下圖所示
5. 圖中黃框標出的即爲domain_id, 藍框標出的是頭名爲ihome的主機記錄的record_id