153 lines
5.7 KiB
Python
153 lines
5.7 KiB
Python
import base64
|
|
import json
|
|
import requests
|
|
import hashlib
|
|
import time
|
|
from urllib import parse
|
|
from crack import Crack
|
|
import uuid
|
|
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
from cryptography.hazmat.backends import default_backend
|
|
|
|
|
|
def auth():
|
|
t = str(round(time.time()))
|
|
data = {
|
|
"authKey": hashlib.md5(("testtest" + t).encode()).hexdigest(),
|
|
"timeStamp": t
|
|
}
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
|
|
"Referer": "https://beian.miit.gov.cn/",
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
"Connection": "keep-alive",
|
|
"Accept": "application/json, text/plain, */*",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "zh-CN,zh;q=0.9",
|
|
"Origin": "https://beian.miit.gov.cn"
|
|
}
|
|
try:
|
|
resp = requests.post("https://hlwicpfwc.miit.gov.cn/icpproject_query/api/auth", headers=headers,
|
|
data=parse.urlencode(data)).text
|
|
return json.loads(resp)["params"]["bussiness"]
|
|
except Exception:
|
|
time.sleep(5)
|
|
resp = requests.post("https://hlwicpfwc.miit.gov.cn/icpproject_query/api/auth", headers=headers,
|
|
data=parse.urlencode(data)).text
|
|
return json.loads(resp)["params"]["bussiness"]
|
|
|
|
|
|
def getImage():
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
|
|
"Referer": "https://beian.miit.gov.cn/",
|
|
"Token": token,
|
|
"Connection": "keep-alive",
|
|
"Accept": "application/json, text/plain, */*",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "zh-CN,zh;q=0.9",
|
|
"Origin": "https://beian.miit.gov.cn"
|
|
}
|
|
payload = {
|
|
"clientUid": "point-" + str(uuid.uuid4())
|
|
}
|
|
try:
|
|
resp = requests.post("https://hlwicpfwc.miit.gov.cn/icpproject_query/api/image/getCheckImagePoint",
|
|
headers=headers, json=payload).json()
|
|
return resp["params"], payload["clientUid"]
|
|
except Exception:
|
|
time.sleep(5)
|
|
resp = requests.post("https://hlwicpfwc.miit.gov.cn/icpproject_query/api/image/getCheckImagePoint",
|
|
headers=headers, json=payload).json()
|
|
return resp["params"], payload["clientUid"]
|
|
|
|
|
|
def aes_ecb_encrypt(plaintext: bytes, key: bytes, block_size=16):
|
|
backend = default_backend()
|
|
cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend)
|
|
|
|
padding_length = block_size - (len(plaintext) % block_size)
|
|
plaintext_padded = plaintext + bytes([padding_length]) * padding_length
|
|
|
|
encryptor = cipher.encryptor()
|
|
ciphertext = encryptor.update(plaintext_padded) + encryptor.finalize()
|
|
|
|
return base64.b64encode(ciphertext).decode('utf-8')
|
|
|
|
|
|
def generate_pointjson(big_img, small_img, secretKey):
|
|
boxes = crack.detect(big_img)
|
|
if boxes:
|
|
print("文字检测成功")
|
|
else:
|
|
print("文字检测失败,请重试")
|
|
raise Exception("文字检测失败,请重试")
|
|
points = crack.siamese(small_img, boxes)
|
|
print("文字匹配成功")
|
|
new_points = [[p[0] + 20, p[1] + 20] for p in points]
|
|
pointJson = [{"x": p[0], "y": p[1]} for p in new_points]
|
|
# print(json.dumps(pointJson))
|
|
enc_pointJson = aes_ecb_encrypt(json.dumps(pointJson).replace(" ", "").encode(), secretKey.encode())
|
|
return enc_pointJson
|
|
|
|
|
|
def checkImage(uuid_token, secretKey, clientUid, pointJson):
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
|
|
"Referer": "https://beian.miit.gov.cn/",
|
|
"Token": token,
|
|
"Connection": "keep-alive",
|
|
"Accept": "application/json, text/plain, */*",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "zh-CN,zh;q=0.9",
|
|
"Origin": "https://beian.miit.gov.cn"
|
|
}
|
|
data = {
|
|
"token": uuid_token,
|
|
"secretKey": secretKey,
|
|
"clientUid": clientUid,
|
|
"pointJson": pointJson
|
|
}
|
|
resp = requests.post("https://hlwicpfwc.miit.gov.cn/icpproject_query/api/image/checkImage", headers=headers,
|
|
json=data).json()
|
|
if resp["code"] == 200:
|
|
# print(resp["params"])
|
|
return resp["params"]["sign"]
|
|
return False
|
|
|
|
|
|
def query(sign, uuid_token, domain):
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
|
|
"Referer": "https://beian.miit.gov.cn/",
|
|
"Token": token,
|
|
"Sign": sign,
|
|
"Uuid": uuid_token,
|
|
"Connection": "keep-alive",
|
|
"Accept": "application/json, text/plain, */*",
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "zh-CN,zh;q=0.9",
|
|
"Origin": "https://beian.miit.gov.cn",
|
|
"Content-Type": "application/json",
|
|
"Cookie": "__jsluid_s="+str(uuid.uuid4().hex[:32])
|
|
}
|
|
data = {"pageNum": "", "pageSize": "", "unitName": domain, "serviceType": 1}
|
|
resp = requests.post("https://hlwicpfwc.miit.gov.cn/icpproject_query/api/icpAbbreviateInfo/queryByCondition",
|
|
headers=headers, data=json.dumps(data).replace(" ","")).text
|
|
return resp
|
|
|
|
|
|
crack = Crack()
|
|
token = auth()
|
|
time.sleep(0.1)
|
|
print("正在获取验证码")
|
|
params, clientUid = getImage()
|
|
pointjson = generate_pointjson(params["bigImage"], params["smallImage"], params["secretKey"])
|
|
time.sleep(0.5)
|
|
sign = checkImage(params["uuid"], params["secretKey"], clientUid, pointjson)
|
|
time.sleep(0.5)
|
|
if sign:
|
|
print(query(sign, params["uuid"],"baidu.com"))
|
|
else:
|
|
print("failed")
|