Python3使用URL编码

  • 生产实践

    通过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


参考:

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/3983.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注