专否 写文章

jerkzhang

Nov 13, 2024
Follow

API接入教程

自定义用户是由管理员进行创建的,管理员会告知账户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参数中。

喜欢这个文章 | 分享 | 新建跟帖