AkamaiSBSD任务
通过使用同步接口创建任务 https://sync.ez-captcha.com/createSyncTask, 并直接获取结果
中国优化地址:http://47.115.166.118:16000/createSyncTask
如果您得到了一个无效的Payload,请联系我们,我们将会为您解决和优化
任务类型
任务类型 | 描述 | 价格(美元) |
|---|---|---|
AkamaiSBSDTaskProxyless | AkamaiSBSD 解决方案 | $2.5/k |
body
向API发送POST请求。使用以下表单数据
参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
pageUrl | string | true | 输入您当前要过的页面的URL |
bmSo | string | true | 如果存在bm_so cookie,则上传bm_so cookie的值,否则上传sbsd_o cookie的值 |
sbsdUrl | string | true | 获取sbsd脚本的地址。注意,大部分网站这个url会根据每次请求变换,所以需要动态获取。 |
ua | string | true | 你程序中使用的UserAgent(需要一致),仅支持Chrome的UserAgent,建议使用Chrom最新版的UserAgent. |
lang | string | true | 使用的语言,与请求头中的accept-language一致, 如 “en-GB”、“en-US”等。 |
script_base64 | string | true | 该值为sbsd javascript脚本的Base64编码形式 |
备注
lang和请求头的accept-language、代理所在区域需要保持一致。
ua仅支持Chrome的ua,建议使用最新版本的Chrome ua。
大部分网站的sbsd url是会随机变化的,所以需要根据每次请求动态获取。
请求头的值以及顺序需要跟浏览器保持高度一致。
创建任务
示例
POST https://sync.ez-captcha.com/createSyncTask
中国优化地址:http://47.115.166.118:16000/createSyncTask
Content-Type: application/json
{
"clientKey": "YourClientKey",
"task": {
"type": "AkamaiSBSDTaskProxyless",
"pageUrl":pageUrl,
"bmSo":bmSo,
"sbsdUrl":sbsdUrl,
"ua":ua,
"lang":lang,
"script_base64":script_base
}
}API会在响应体中返回payload,payload是base64加密后的数据,经过base64解密后代表需要发送的body数据。
返回示例
返回的Payload字段是base64编码之后的值,解码之后作为body字段数据通过post提交到对应接口
{
"errorId": 0,
"solution": {
"payload": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"status": "ready"
}
代码示例
import threading
import time
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import random
import string
import json
import tls_client
import os
import base64
import platform
from urllib.parse import urlparse, parse_qsl, urlencode, urlunparse, quote
import secrets
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def solveSbsd(client_key,pageUrl,bmSo,sbsdUrl,ua,lang,script_base):
url = "https://sync.ez-captcha.com/createSyncTask"
data = {
"clientKey":client_key,
"task":{
"type": "AkamaiSBSDTaskProxyless",
"pageUrl":pageUrl,
"bmSo":bmSo,
"sbsdUrl":sbsdUrl,
"ua":ua,
"lang":lang,
"script_base64":script_base
}
}
resp = requests.post(url,json=data,timeout=10,verify=False)
time.sleep(random.uniform(0.8,1.5))
return resp.text
def get_middle_string_strict(text: str, before: str, after: str) -> str:
parts = text.split(before, 1)
if len(parts) < 2:
return ""
sub = parts[1].split(after, 1)
if len(sub) < 2: #
return ""
return sub[0]
def solve():
client_key = ""
proxy_self = ""
proxys = {
'http':'http://127.0.0.1:8887',
'https':'http://127.0.0.1:8887'
}
session = tls_client.Session(
client_identifier="chrome_133",
random_tls_extension_order=True,
)
session.proxies = proxys
url = ""
domain = ""
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
sec_ch_ca = '"Google Chrome";v="141", "Not?A_Brand";v="8", "Chromium";v="141"'
lang = "en-US"
contry = "us"
accept_lang = 'en-US,en;q=0.9'
headers = {
'sec-ch-ua':sec_ch_ca,
'sec-ch-ua-mobile':'?0',
'sec-ch-ua-platform':'"Windows"',
'upgrade-insecure-requests':'1',
'user-agent':user_agent,
'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'sec-fetch-site':'none',
'sec-fetch-mode':'navigate',
'sec-fetch-user':'?1',
'sec-fetch-dest':'document',
'accept-encoding':'gzip, deflate, br, zstd',
'accept-language':accept_lang,
'priority':'u=0, i'
}
session.headers = headers
resp = session.get(url,allow_redirects=False)
sbsd_url = get_middle_string_strict(resp.text,'/noscript><script type="text/javascript" src="', '" defer></sc')
sbsd_url = domain + sbsd_url
#slove sbsd
sbsd_header = {
'sec-ch-ua-platform':'"Windows"',
'user-agent':user_agent,
'sec-ch-ua':sec_ch_ca,
'sec-ch-ua-mobile':'?0',
'accept':'*/*',
'sec-fetch-site':'same-origin',
'sec-fetch-mode':'no-cors',
'sec-fetch-dest':'script',
'referer':url,
'accept-encoding':'gzip, deflate, br, zstd',
'accept-language':accept_lang
}
session.headers = sbsd_header
resp = session.get(sbsd_url,allow_redirects=True)
cookie_dict = session.cookies.get_dict()
# check bm_so
bm_so = ''
if 'bm_so' in cookie_dict:
bm_so = cookie_dict['bm_so']
elif 'sbsd_o' in cookie_dict:
bm_so = cookie_dict['sbsd_o']
script_base = base64.b64encode(resp.text.encode("utf-8")).decode("ascii")
sbsd_payload = solveSbsd(client_key,url,bm_so,sbsd_url,user_agent,lang,script_base)
body = json.loads(sbsd_payload)["solution"]["payload"]
body = '{"body":"'+base64.b64decode(body).decode("utf-8")+'"}'
sbsd_post_header = {
'sec-ch-ua-platform':'"Windows"',
'user-agent':user_agent,
'sec-ch-ua':sec_ch_ca,
'content-type':'application/json',
'sec-ch-ua-mobile':'?0',
'accept':'*/*',
'origin':domain,
'sec-fetch-site':'same-origin',
'sec-fetch-mode':'cors',
'sec-fetch-dest':'empty',
'referer':url,
'accept-encoding':'gzip, deflate, br, zstd',
'accept-language':accept_lang,
'priority':'u=1, i'
}
post_sbsd_url = "http"+get_middle_string_strict(sbsd_url,"http","?v=")
session.headers = sbsd_post_header
resp = session.post(post_sbsd_url,json=body)
if resp.status_code != 200:
print(resp.text)
print("sbsd cookie error")
return
cookie_dict = session.cookies.get_dict()
print(cookie_dict)
if __name__ == "__main__":
solve()
429 状态码
如果遇到了这个状态码,请联系我们,我们会提供帮助。