dnspod.cn 動態域名客戶端

dnspod.cn提供的免費服務支持把國際頂級域名(如abc.com/net/cc)綁定到自己家寬帶的動態IP上面,從此告別花生殼,3322.org。這個工具每隔一段時間在網關設備上運行一次,一旦發現寬帶ip地址發生變化,就會向服務器發出更新請求。


請注意:

  • 此客戶端代碼可運行在家庭內網的任意設備上

  • 此客戶端需要linux運行環境

  • 此客戶端需要python語言解釋器執行(一般來說,各種linux發行版均默認自帶python解釋器)

  • 使用此程序,需要掌握以下技能:shell基本操作, linux文本編輯器(vi/nano)基本操作


安裝方法:

  1. 複製以下源代碼並保存爲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?


  1. 請複製以下代碼並保存到 /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. 查看程序輸出,如下圖所示


wKiom1Ri3fXiWL_UAAFc93zxvDI400.jpg


5. 圖中黃框標出的即爲domain_id, 藍框標出的是頭名爲ihome的主機記錄的record_id


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章