爬虫碰到几个参数是java生成的,现在将其转为python测试。随笔记录下
BigInteger方法转为python实现参考此文章:Rewriting Java BigInteger function in python - Stack Overflow
java实现
// client_id
String client_id = String.format("%x", new BigInteger(String.format("%s#%s", serial_number, str2).getBytes()));
python实现
def get_client_id(origin):
origin_encode = origin.encode()
b = bytearray(origin_encode)
bigint = 0
for byte in b:
bigint <<= 8
bigint |= byte
bigint_x = "%x" % bigint
return bigint_x
java实现随机生成加密字符
// code_verifier
byte[] bArr = new byte[32];
new SecureRandom().nextBytes(bArr);
String code_verifier = Base64.encodeToString(bArr, 11);
System.out.println(code_verifier);
python实现随机加密字符( 本质是用os.urandom(nbytes)方法然后通过base64转为字符串 ), 官方文档:secrets --- 生成管理密码的安全随机数 — Python 3.10.8 文档
import secrets
code_verifier = secrets.token_urlsafe(32)
java对字符串进行SHA-256加密
String code_challenge = Base64.encodeToString(MessageDigest.getInstance("SHA-256").digest(code_verifier.getBytes()), 11);
python对字符串进行SHA-256加密
import hashlib
# 写法1
code = hashlib.sha256(verifier.encode()).digest()
code = base64.urlsafe_b64encode(code).rstrip(b'=').decode('ascii')
print(code)
# 写法2
mDigest = hashlib.sha256()
mDigest.update(verifier.encode("UTF-8"))
code = mDigest.digest()
code = base64.urlsafe_b64encode(code).rstrip(b'=').decode('ascii')
print(code)
python后面通过base64方法转字符串参考secrets模块中token_urlsafe方法进行处理