七牛云证书申请脚本

152 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天 点击查看活动详情

前言

前几天使用scrapy 获取到了七牛云cookie(在scrapy 使用selenium模拟登录获取cookie),今天就来分析其他的接口,把这个cookie拿来申请域名测试一下,昨天也做好了一个腾讯云的域名解析申请的脚本,两个连接起来后面就有大用了。

scrapy selenium脚本化

需要把seleium的代码直接迁移到普通脚本中来,封装成一个函数,大概就是这样子:


# coding=UTF-8

from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def get_cookie():
    chorme_options = Options()
    chorme_options.add_argument("--disable-gpu")
    driver = webdriver.Chrome(options=chorme_options)  # 初始化Chrome驱动
    driver.implicitly_wait(20)
    driver.get(url='https://sso.qiniu.com/')  # 直接访问登录页
    user_input = driver.find_element(By.ID, 'email')  # 获取用户名输入框
    user_input.send_keys(user_name)  # 输入用户名
    password_input = driver.find_element(By.ID, 'password')  # 获取密码框
    password_input.send_keys(password)  # 输入密码
    driver.find_element(By.ID, 'login-button').click()  # 登录
    try:
        WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
            (By.CLASS_NAME, "user-plane-entry")))  # 等待网页跳转,超时等待60秒
    except:
        print('登陆超时,失败')  # 等待超过了60
        driver.quit()
    cookie = driver.get_cookies()  # 获取cookie 此时是键值对
    print(cookie)
    return cookie
get_cookie()

申请证书接口

F12打开谷歌调试工具,点击NetWork,登录七牛云,接着手动申请证书,看看有哪些请求:

image.png

可以看到有两个请求,第二个最重要,我们要拿到这个order_id。

image.png

image.png

补全信息

我们再手动去补全信息,申请证书得到order_id立马就去补全,补全就会返回txt的记录名和记录值,看下调试工具:

image.png 有好几个请求,有两个非常重要,一个是第一个,在Payload提交了一个我自己预设的模板,没有返回任何有用的信息,非常简单的:{"code":200,"message":""}

第二个就是第三个请求,完整的请求链接是:https://portal.qiniu.com/api/certificate/v1/sslorder/62f2794c451******d320,查询到和这个订单ID为62f2794c451*******320需要我们去域名的DNS解析商那里添加解析的内容。

image.png 就这么简单,三个接口就完成了订单创建,订单信息补全,订单信息查询。接下来就是对接昨天写的域名解析的接口,再开始不断得轮询这个证书的状态就行了。

检查证书状态

因为昨天已经完成了腾讯云的添加NDS解析,今天略过DNS解析这个步骤然后直接来看看如何检查证书是不是已经可以下载了。 检查证书还是上面对的接口:https://portal.qiniu.com/api/certificate/v1/sslorder/ 查看这个接口是否里面的certID是否为空,下面是刚刚创建的订单

image.png 我现在再找一个已经可以下载的订单:

image.png 所以这样就可以下载了

整理代码

因为篇幅和个人时间有限,今天就把上面所说的三个接口整理分享出来,后面的证书设置密码,下载,甚至后面的Git上传放在明天或者后天。

三个接口主要拆分成两个部分也就是两个函数,一个是创建订单填写信息,第二个就是循环检查订单状态,今天整理一共三个函数方法,后面再去合并做成一个完整的功能:

# coding=UTF-8
import requests
import json, time
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

user_name = '********@qq.com'
password = '*********'
headers = {
    'authority': 'portal.qiniu.com',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
    'content-type': 'application/json',
    'accept': '*/*',
    'origin': 'https://portal.qiniu.com',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'cors',
    'sec-fetch-dest': 'empty',
    'referer': 'https://portal.qiniu.com/certificate/apply',
    'accept-language': 'zh,zh-CN;q=0.9',
}


def create_ssl(common_name, cookie):
    data = '{"product_short_name":"TrustAsiaDVG5","years":1,"limit":0,"wildcard_limit":-1,"product_type":"single"}'
    response = requests.post('https://portal.qiniu.com/api/certificate/v1/sslorder/prepare', headers=headers, data=data)
    res = json.loads(response.text)

    print(res)
    order_id = res['data']['order_id']
    data = {"common_name": common_name, "org_addressLine1": "**********", "org_city": "深圳市",
            "org_region": "广东", "org_country": "CN", "org_postalCode": "430000",
            "org_organization_name": "**********", "org_division": "***部", "org_phone": "027-2306240",
            "admin_firstName": "*", "admin_lastName": "**", "admin_phone": "17720515973",
            "admin_email": "*****@***.com", "orderid": order_id, "auth_method": "DNS",
            "admin_title": "********", "dns_names": "", "cert_name": common_name, "encrypt": "RSA",
            "toBeDeployedDomains": []}
    response = requests.post('https://portal.qiniu.com/api/certificate/v1/sslorder/create', headers=headers,
                             cookies=cookie, data=data)
    print(response.text)
    response = requests.get('https://portal.qiniu.com/api/certificate/v1/sslorder/' + order_id, headers=headers,
                            cookies=cookie)
    res = response.json()
    print("证书申请成功,域名为:" + common_name + " TXT记录名:" + res['data']['auth_array'][0]['AuthKey'] + " TXT记录值:" +
          res['data']['auth_array'][0]['AuthValue'])
    return {'AuthKey': res['data']['auth_array'][0]['AuthKey'],
            'AuthValue': res['data']['auth_array'][0]['AuthValue']}  # 返回记录值


def check_status(order_id, cookie):
    response = requests.get('https://portal.qiniu.com/api/certificate/v1/sslorder/' + order_id, headers=headers,
                            cookies=cookie)
    res = response.json()
    if res['data']['certID'] == '':
        return False
    else:
        return True


def get_cookie():
    chorme_options = Options()
    chorme_options.add_argument("--disable-gpu")
    driver = webdriver.Chrome(options=chorme_options)  # 初始化Chrome驱动
    driver.implicitly_wait(20)
    driver.get(url='https://sso.qiniu.com/')  # 直接访问登录页
    user_input = driver.find_element(By.ID, 'email')  # 获取用户名输入框
    user_input.send_keys(user_name)  # 输入用户名
    password_input = driver.find_element(By.ID, 'password')  # 获取密码框
    password_input.send_keys(password)  # 输入密码
    driver.find_element(By.ID, 'login-button').click()  # 登录
    try:
        WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
            (By.CLASS_NAME, "user-plane-entry")))  # 等待网页跳转,超时等待60秒
    except:
        print('登陆超时,失败')  # 等待超过了60
        driver.quit()
    cookie = driver.get_cookies()  # 获取cookie 此时是键值对
    print(cookie)
    return cookie

总结

今天天稍微重新验证了一下七牛云的域名申请,时隔差不多一年没有什么变化,明天再接着做一个证书下载的功能,需要注意的是下载之前需要选择类型并且设置密码才能下载,如果精力够的话明天一起把使用Python代码解压带密码的文件功能完成。