生产实践:
通过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
参考: