jerkzhang
自定义用户是由管理员进行创建的,管理员会告知账户ID和初始密码。
关于账号ID,因为此处API是供开发者使用,所以告知的账户ID,请使用全称,比如用户名是080587D,用户ID是HH_tongji_080587D,两者在登录时都可以登录,但使用API进行开发的时候,请使用带有下划线的全称用户ID,即“HH_tongji_080587D”。
关于域名问题,请使用管理员提供的域名,此处是测试,使用“http://localhost:8899”,具体场景请换成相应域名与端口。
API请求地址:http://localhost:8899/api
请求方法:POST请求
请求参数:
method 必选参数,GET或POST,代表代理请求的方法 url 必选参数,代理请求的url地址,该地址请务必先经过管理员进行授权 headers 必选参数,代理请求使用的headers,这里对headers进行序列化处理成JSON字符串 data 必选参数,不管是GET请求还是POST请求,请求参数都放在data中,并处理成JSON字符串进行传输 timestamp 必选参数,秒时间戳构成的整数字符串 user_id 必选参数,用户ID,比如“HH_tongji_080587D” sign 必选参数,根据SHA256算法生成的签名
headers和data如果是空,就传入'{}'即可。
生成sign的签名算法:
基于用户的密码和请求的参数,结合SHA256算法进行生成。
第一步,假设passwd是目前的自定义用户密码,如下生成用于签名的encry_passwd
1、拼接字符串:首先,将您的自定义密码passwd与字符串“666”拼接在一起。这将形成一个新的字符串,我们可以称之为passwd_with_suffix。
2、进行SHA256加密:接着,对passwd_with_suffix进行SHA256加密。SHA256是一种加密算法,它将输入(无论长度如何)转换成一个固定长度(256位)的输出,通常表示为一个64位的十六进制数字字符串。
3、再次拼接字符串:最后,将加密后的结果与字符串“777”拼接在一起,形成最终的encry_passwd。
使用python来表示这个生成过程,如下所示:
encry_passwd = sha256_encrypt(passwd + "666") + "777"
上述代码的sha256_encrypt是进行SHA256加密的自定义函数。
第二步,结合请求参数的值生成签名
所有请求参数的值都是字符串类型,将所有参数和上述生成的encry_passwd如下进行连接起来,再进行SHA256加密,得到的就是生成的签名字符串。
sign = sha256_encrypt( user_id + encry_passwd + url + timestamp + data + method)
使用Python写一个完整的示例,如下所示:
假设目标代理请求的url地址是https://zhuanfou.com/fuckip
代码示例如下:
#coding=utf-8 import hashlib, time, requests import tornado.escape as es # SHA256加密函数 def sha256_encrypt(input_string): # 将输入的字符串编码成字节串 input_bytes = input_string.encode('utf-8') # 创建一个sha256 hash对象 hash_object = hashlib.sha256() # 提供需要计算hash的数据 hash_object.update(input_bytes) # 获取16进制编码的hash值 hash_hex = hash_object.hexdigest() # 返回加密后的字符串 return hash_hex req_url = "http://localhost:8899/api" # 此处域名请自行替换 user_id = "HH_tongji_080587D" # 测试用的用户ID passwd = "2dbf5f6ae3930ef9a1365d34a58da4b250afbe13f4a" # 用户密码 # 生成用于签名的encry_passwd encry_passwd = sha256_encrypt(passwd + "666") + "777" # 设置请求参数 timestamp = int(time.time()) timestamp = str(timestamp) url = "https://zhuanfou.com/fuckip" method = "GET" headers = {} headers = es.json_encode( headers ) data = {} data = es.json_encode( data ) # 生成签名 sign = sha256_encrypt( user_id + encry_passwd + url + timestamp + data + method) data_form = { "method": method, "url": url, "headers": headers, "data": data, "timestamp": timestamp, "user_id": user_id, "sign": sign } # 请求API r = requests.post( req_url, data=data_form ) print( r.text )
注意1:请求的url务必经过管理员授权,否则会报错。
注意2:用户ID要用带下划线的那种完整的用户ID。
注意3:即使是GET请求,也不要把请求参数放入url的值中,不要把url改成 https://zhuanfou.com/fuckip?from=haiheng这样的带问号的形式,GET请求的参数直接放入data值中,应该{"from":"haiheng"} 这样的形式放入data参数中。