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参数中。