生产实践:
通过url编码post接口数据
脚本内容:
Web浏览器通过URL从web服务器请求页面,URL只能使用 ASCII码对照表图 来通过因特网进行发送。由于URL常常会包含ASCII集合之外的字符,URL必须转换为有效的ASCII格式。URL编码使用"%"其后跟随两位的十六进制数来替换非ASCII字符。URL不能包含空格,URL编码通常使用+来替换空格。URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为URL的一部分或者分离的发送到服务器上。URL编程的规则是每对name/value用&分开,每对来自表单的name/value用=分开。如果用户没有输入值的那个name依旧会出现不过就是没有值。URL编码是在字符ASCII码的两个十六进制数的前面加上%。 例如,"/", 如果用作URI的路径成分的分界符, 则是具有特殊含义的保留字符. 如果该字符需要出现在URI一个路径成分的内部, 则三字符序列"%2F"或"%2f"就用于代替原本的"/"出现在该URI路径成分的内部.。
URL编码在HTTP标头中指定"Content-Type"来决定。值为"application/x-www-form-urlencoded"意味着你的POST正文将需要像GET参数字符串一样经过URL编码。值"multipart/form-data"表示将使用内容定界符,而不是对内容进行url编码。通常使用的"multipart/form-data"发送二进制数据(非字母数字)。否则,使用"application/x-www-form-urlencoded"。
urllib库是python中进行网络请求和相应的主要库,是python自带的基础库。在python2中的urllib库分为urllib和urllib2个库,但是在python3当中,将这些库合并成了一个urllib库,只不过将这两个分别做为urllib库下的两个模块:urllib.request 和 urllib.parse,具体的操作并没有改变。脚本如下:
#!/Users/anzhihe/.pyenv/versions/3.7.4/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2019-11-22
# @Author : Anzhihe
# @Site : https://chegva.com
# @File : add_host.py
import requests
import datetime
import time
import argparse
import json
import hashlib
from urllib import parse
def time_now():
# 获取当前时间及时间戳
time_now = datetime.datetime.now()
begin_ts = int(time.mktime(time_now.timetuple()))
return begin_ts
def map_time(stime):
...
def slience_host(hostname, begin_ts, end_ts, tree, headers):
"""屏蔽挂载机器"""
def add_host(hostname, begin_ts, end_ts, tree, headers):
"""绑定机器到指定服务树节点"""
prefix = "{"
suffix = "}"
hosts = []
for i in hostname.split(','):
host = '"' + i + '":[]'
hosts.append(host)
all_host = prefix + ",".join(hosts) + suffix
url = "http://tree.chegva.com/auth/v2/ns/machines/add"
payload = {
"ns": tree,
"host_nss": all_host,
"begin_ts": begin_ts,
"end_ts": end_ts
}
data = parse.urlencode(payload).encode('utf-8')
res = requests.request("POST", url, data=data, headers=headers)
print(res.text, res.status_code, res.reason)
def main():
parser = argparse.ArgumentParser(description='bind host by treepath created by anzhihe')
parser.add_argument('host', type=str, help='输入绑定机器主机名,可以,号分隔')
parser.add_argument('tree', type=str, help='输入机器想要绑定的节点')
parser.add_argument('time', type=str, help='输入机器屏蔽的时间')
args = parser.parse_args()
hostname = args.host
tree = args.tree
time = args.time
begin_ts = time_now()
end_ts = map_time(time)
headers = {
'Connection': "keep-alive", ,
'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8",
'Accept-Encoding': "gzip, deflate",
'Cookie': "yourcookie",
}
add_host(hostname, begin_ts, end_ts, tree, headers)
if __name__ == '__main__':
main()
# 使用示例:ab machine.study02 tree.chegva.com 1d
$ ah -h
usage: ah [-h] host tree time
bind host by treepath created by anzhihe
positional arguments:
host 输入绑定机器主机名,可以,号分隔
tree 输入机器想要绑定的节点
time 输入机器屏蔽的时间
optional arguments:
-h, --help show this help message and exit参考: