Browse Source

优化python版腾讯云操作

ywdblog 6 years ago
parent
commit
5ad83edd0f
3 changed files with 133 additions and 114 deletions
  1. 11 9
      README.md
  2. 92 93
      au.sh
  3. 30 12
      python-version/qcloud-dns.py

+ 11 - 9
README.md

@@ -26,7 +26,7 @@ $ chmod 0777 au.sh
 
 (1)DNS API 密钥:
 
-这个 API 密钥什么意思呢?由于需要通过 API 操作阿里云 DNS 或腾讯云 DNS 的记录,所以需要去域名服务商哪儿获取 API 密钥,然后配置在 au.sh 文件中
+这个 API 密钥什么意思呢?由于需要通过 API 操作阿里云 DNS 或腾讯云 DNS 的记录,所以需要去域名服务商哪儿获取 API 密钥,然后配置在 au.sh 文件中:
 
 - ALY_KEY 和 ALY_TOKEN:阿里云 [API key 和 Secrec 官方申请文档](https://help.aliyun.com/knowledge_detail/38738.html)。
 - TXY_KEY 和 TXY_TOKEN:腾讯云 [API 密钥官方申请文档](https://console.cloud.tencent.com/cam/capi)。
@@ -34,11 +34,11 @@ $ chmod 0777 au.sh
 (2)目前该工具支持四种运行环境和场景,通过 hook 文件和参数来调用:
 
 - PHP
-	- au.sh php aly add/clean:PHP 表示选择PHP命令行,操作阿里云DNS,增加/清空指定 DNS TXT 记录
-	- au.sh php txy add/clean:PHP 表示选择PHP命令行,操作腾讯云DNS,增加/清空指定 DNS TXT 记录
+	- au.sh php aly add/clean:PHP 表示选择PHP命令行,操作阿里云DNS,增加/清空DNS。
+	- au.sh php txy add/clean:PHP 表示选择PHP命令行,操作腾讯云DNS,增加/清空DNS。
 - Python
-	- au.sh python aly add/clean:PHP 表示选择PHP命令行,操作阿里云DNS,增加/清空指定 DNS TXT 记录
-	- au.sh python txy add/clean:PHP 表示选择PHP命令行,操作腾讯云DNS,增加/清空指定 DNS TXT 记录。
+	- au.sh python aly add/clean:PHP 表示选择PHP命令行,操作阿里云DNS,增加/清空DNS。
+	- au.sh python txy add/clean:PHP 表示选择PHP命令行,操作腾讯云DNS,增加/清空DNS。(需要安装第三方库,pip install requests 或 pip3 install requests,后续我会优化使用python内建库)
 
 这四种运行环境和场景什么意思呢?就是可根据自己服务器环境和域名服务商选择任意一个 hook shell(包含相应参数)。
 
@@ -50,11 +50,13 @@ $ chmod 0777 au.sh
 $ ./certbot-auto certonly  -d *.example.com --manual --preferred-challenges dns --dry-run  --manual-auth-hook "/脚本目录/au.sh php aly add" --manual-cleanup-hook "/脚本目录/au.sh php aly clean" 
 ```
 
-**Debug:**操作 DNS API 可能会遇到一系列问题,比如 API token 权限不足,遇到相关问题,可以查看 /var/log/certd.log 文件
+**Debug:** 操作 DNS API 可能会遇到一系列问题,比如 API token 权限不足,遇到相关问题,可以查看 /var/log/certd.log。
 
-**重要解释:**
+**重要解释:** --manual-auth-hook 和 --manual-cleanup-hook 有三个参数:
 
-其中 --manual-auth-hook 和 --manual-cleanup-hook 中 au.sh 有三个参数(第一个代表你要选择那种语言(php/python),第二个参数代表你的DNS厂商(aly/txy),第三个参数是固定的(--manual-auth-hook中用add,--manual-clean-hook中用clean))。
+- 第一个代表你要选择那种语言(php/python)
+- 第二个参数代表你的DNS厂商(aly/txy)
+- 第三个参数是固定的(--manual-auth-hook中用add,--manual-clean-hook中用clean)
 
 比如你要选择Python环境,可以将 --manual-auth-hook 输入修改为 "/脚本目录/au.sh python aly add",--manual-cleanup-hook 输入修改为  "/脚本目录/au.sh python aly clean"
  
@@ -73,7 +75,7 @@ $ ./certbot-auto certonly  -d *.example.com --manual --preferred-challenges dns
 - --dry-run:在实际申请/更新证书前进行测试,强烈推荐
 - -d:表示需要为那个域名申请证书,可以有多个。
 - --manual-auth-hook:在执行命令的时候调用一个 hook 文件
-- --manual-cleanup-hook:清除 DNS 添加的 TXT 值
+- --manual-cleanup-hook:清除 DNS 添加的记录
 
 如果你想为多个域名申请通配符证书(合并在一张证书中,也叫做 **SAN 通配符证书**),直接输入多个 -d 参数即可,比如:
 

+ 92 - 93
au.sh

@@ -1,93 +1,92 @@
-#!/bin/bash
-
-#ywdblog@gmail.com 欢迎关注我的书《深入浅出HTTPS:从原理到实战》
-
-#填写腾讯云的AccessKey ID及AccessKey Secret
-#如何申请见https://help.aliyun.com/knowledge_detail/38738.html
-ALY_KEY=""
-ALY_TOKEN=""
-
-#填写腾讯云的SecretId及SecretKey
-#如何申请见https://console.cloud.tencent.com/cam/capi
-TXY_KEY=""
-TXY_TOKEN=""
-
-#GoDaddy的SecretId及SecretKey
-#如何申请见https://developer.godaddy.com/getstarted
-GODADDY_KEY=""
-GODADDY_TOKEN=""
-
-PATH=$(cd `dirname $0`; pwd)
-
-# 命令行参数
-# 第一个参数:使用什么语言环境
-# 第二个参数:使用那个 DNS 的 API
-# 第三个参数:action or clean
-plang=$1 #python or php 
-pdns=$2
-paction=$3 #add or clean
-
-#PHP 命令行路径,如果有需要可以修改 
-phpcmd="/usr/bin/php"
-
-#Python 命令行路径,如果有需要可以修改 
-pythoncmd="/usr/bin/python"
-
-#内部变量
-cmd=""
-key=""
-token=""
-
-if [[ "$paction" != "clean" ]]; then
-	paction="add"
-fi
-
-case $plang in 
-	"php")  
-
-	cmd=$phpcmd
-	if [[ "$pdns" == "aly" ]];  then
-		dnsapi=$PATH"/php-version/alydns.php"		
-		key=$ALY_KEY		
-		token=$ALY_TOKEN
-	elif [[ "$pdns" == "txy" ]] ;then 
-		dnsapi="$path/php-version/txydns.php"
-		key=$TXY_KEY
-		token=$TXY_TOKEN
-	else
-		dnsapi="$PATH/php-version/godaddydns.php"
-		key=$GODADDY_KEY
-		token=$GODADDY_TOKEN
-	fi
-	;;
-	
-	"python")
-	
-	cmd=$pythoncmd
-	if [[ "$pdns" == "aly" ]];  then
-                dnsapi=$PATH"/python-version/alydns.py"
-		 key=$ALY_KEY
-                token=$ALY_TOKEN
-        elif [[ "$pdns" == "txy" ]] ;then
-		                key=$TXY_KEY
-                token=$TXY_TOKEN
-        	echo "目前不支持python版本的非阿里云DNS处理"
-		exit
-	else
-		                key=$GODADDY_KEY
-                token=$GODADDY_TOKEN
-        	echo "目前不支持python版本的非阿里云DNS处理"
-               exit
-        fi
-        ;;	
-esac
-
-#print ($cmd)
-$cmd $dnsapi $paction $CERTBOT_DOMAIN "_acme-challenge" $CERTBOT_VALIDATION $key $token >>"/var/log/certd.log"
-
-   if [[ "$paction" == "add" ]]; then
-        # DNS TXT 记录刷新时间
-        /bin/sleep 10
-    fi
-
-
+#!/bin/bash
+
+#ywdblog@gmail.com 欢迎关注我的书《深入浅出HTTPS:从原理到实战》
+
+#填写腾讯云的AccessKey ID及AccessKey Secret
+#如何申请见https://help.aliyun.com/knowledge_detail/38738.html
+ALY_KEY=""
+ALY_TOKEN=""
+
+#填写腾讯云的SecretId及SecretKey
+#如何申请见https://console.cloud.tencent.com/cam/capi
+TXY_KEY=""
+TXY_TOKEN=""
+
+#GoDaddy的SecretId及SecretKey
+#如何申请见https://developer.godaddy.com/getstarted
+GODADDY_KEY=""
+GODADDY_TOKEN=""
+
+PATH=$(cd `dirname $0`; pwd)
+
+# 命令行参数
+# 第一个参数:使用什么语言环境
+# 第二个参数:使用那个 DNS 的 API
+# 第三个参数:action or clean
+plang=$1 #python or php 
+pdns=$2 #aly or txy
+paction=$3 #add or clean
+
+#PHP 命令行路径,如果有需要可以修改 
+phpcmd="/usr/bin/php"
+#Python 命令行路径,如果有需要可以修改 
+pythoncmd="/usr/bin/python"
+
+#内部变量
+cmd=""
+key=""
+token=""
+
+if [[ "$paction" != "clean" ]]; then
+	paction="add"
+fi
+
+case $plang in 
+	"php")  
+
+	cmd=$phpcmd
+	if [[ "$pdns" == "aly" ]];  then
+		dnsapi=$PATH"/php-version/alydns.php"		
+		key=$ALY_KEY		
+		token=$ALY_TOKEN
+	elif [[ "$pdns" == "txy" ]] ;then 
+		dnsapi="$path/php-version/txydns.php"
+		key=$TXY_KEY
+		token=$TXY_TOKEN
+	else
+		dnsapi="$PATH/php-version/godaddydns.php"
+		key=$GODADDY_KEY
+		token=$GODADDY_TOKEN
+	fi
+	;;
+	
+	"python")
+	
+	cmd=$pythoncmd
+	if [[ "$pdns" == "aly" ]];  then
+			dnsapi=$PATH"/python-version/alydns.py"
+			key=$ALY_KEY
+			token=$ALY_TOKEN
+        elif [[ "$pdns" == "txy" ]] ;then
+			dnsapi=$PATH"/python-version/txydns.py"
+			key=$TXY_KEY
+			token=$TXY_TOKEN
+		exit
+	else
+		key=$GODADDY_KEY
+		token=$GODADDY_TOKEN
+		echo "目前不支持python版本的非阿里云DNS处理"
+		exit
+        fi
+        ;;	
+esac
+
+#print ($cmd)
+$cmd $dnsapi $paction $CERTBOT_DOMAIN "_acme-challenge" $CERTBOT_VALIDATION $key $token >>"/var/log/certd.log"
+
+   if [[ "$paction" == "add" ]]; then
+        # DNS TXT 记录刷新时间
+        /bin/sleep 10
+    fi
+
+

+ 30 - 12
python-version/qcloud-dns.py

@@ -5,6 +5,9 @@ import time
 import random
 import hashlib
 import binascii
+#第三方包,需要安装
+# python2:pip install requests
+# python3:pip3 install requests
 import requests
 
 # @akgnah https://github.com/akgnah
@@ -74,14 +77,24 @@ class Cns:
         host, uri = 'cns.api.qcloud.com', '/v2/index.php'
         self.client = Client(secret_id, secret_key, host, uri)
 
-    def list(self, domain):
+    def list(self, domain,subDomain):
         body = {
             'Action': 'RecordList',
-            'domain': domain
+            'domain': domain,
+            'subDomain': subDomain
         }
 
         return self.client.send(body)
 
+    @staticmethod
+    def getDomain(domain):
+        domain_parts = domain.split('.')
+        if len(domain_parts) > 2:
+            rootdomain='.'.join(domain_parts[-(2 if domain_parts[-1] in {"co.jp","com.tw","net","com","com.cn","org","cn","gov","net.cn","io","top","me","int","edu","link"} else 3):])
+            selfdomain=domain.split(rootdomain)[0]
+            return (selfdomain[0:len(selfdomain)-1],rootdomain)
+        return ("",domain)
+
     def create(self, domain, name, _type, value):
         body = {
             'Action': 'RecordCreate',
@@ -91,7 +104,6 @@ class Cns:
             'recordLine': '默认',
             'value': value
         }
-
         return self.client.send(body)
 
     def delete(self, domain, _id):
@@ -106,15 +118,21 @@ class Cns:
 
 if __name__ == '__main__':
     # Create your secret_id and secret_key at https://console.cloud.tencent.com/cam/capi
-    secret_id = 'your secret_id'
-    secret_key = 'your secret_key'
-    cns = Cns(secret_id, secret_key)
 
-    _, option, domain, name, value = sys.argv  # pylint: disable=all
+    _, option, domain, name, value,secret_id, secret_key = sys.argv  # pylint: disable=all
+
+    domain = Cns.getDomain(domain)
+    if domain[0]=="":
+        selfdomain =  name
+    else:
+        selfdomain = name + "." + domain[0]
 
+    cns = Cns(secret_id, secret_key)
     if option == 'add':
-        cns.create(domain, name, 'TXT', value)
-    elif option == 'delete':
-        for record in cns.list(domain)['data']['records']:
-            if record['name'] == name and record['value'] == value:
-                cns.delete(domain, record['id'])
+        result=(cns.create(domain[1], selfdomain, 'TXT', value))
+    elif option == 'clean':
+        for record in cns.list(domain[1],selfdomain)['data']['records']:
+            #print (record['name'],record['id'] )
+            result= (cns.delete(domain[1], record['id']))
+	    #print (result["message"])
+    #print(result)