Akamai任务
通过使用同步接口创建任务 https://sync.ez-captcha.com/createSyncTask
, 并直接获取结果
中国优化地址:http://47.115.166.118:16000/createSyncTask
如果您得到了一个无效的Payload,请联系我们,我们将会为您解决和优化
任务类型
任务类型 | 描述 | Price | Price(USD) |
---|---|---|---|
AkamaiWEBTaskProxyless | Akamai 解决方案 | 38 POINTS | $3.8/1k |
Sensor Data
向API发送POST请求。使用以下表单数据
参数 | 类型 | 必需 | 描述 |
---|---|---|---|
pageUrl | string | true | 输入您当前要过的页面的URL |
v3Url | string | true | 输入akamai v3脚本的url,注意,大部分网站这个url会根据每次请求变换,所以需要动态获取。 |
bmsz | string | true | 你的会话中最新的bmsz cookie 值 |
abck | string | true | 你的会话中最新的_abck cookie 值 |
ua | string | true | 你程序中使用的UserAgent(需要一致),仅支持Chrome的UserAgent,建议使用Chrom最新版的UserAgent. |
lang | string | true | 使用的语言,与请求头中的accept-language一致, 如 “en-GB”。尽量避免使用en-US. |
script_base64 | string | true | 仅在第一个包中需要发送,该值为v3 javascript脚本的Base64编码形式 |
index | int32 | true | 表示当前是第几个包,从0开始计算 |
encodeData | string | true | 第一个包中该值为空,该值从第一个包返回值中获取。第一个包之后只需要填充这个值不需要填充script_base64。 |
备注
有些网站即使获取到abck cookie为”~-1~”也是有效的,所以我们建议每次获取到abck cookie之后都使用一次判断是否有效,直到第八次。发送sensor_data的次数跟网站的防护级别有关。
使用动态的代理,防止被风控。
lang和请求头的accept-language需保持一致,建议lang和代理所在区域也保持一致。
ua仅支持Chrome的ua,建议使用最新版本的Chrome ua。建议ua版本和Chrome TLS版本一致。
有些网站检测较为严格,发包时请关闭本机的全局代理及抓包工具,例如Clash、Charles等,防止受到干扰。
大部分网站的v3 url是会随机变化的,所以需要根据每次请求动态获取。
最后使用_abck cookie的时候请保持和前面发送sensor_data数据包时一样的IP、UA、TLS。
创建任务
示例
POST https://sync.ez-captcha.com/createSyncTask
中国优化地址:http://47.115.166.118:16000/createSyncTask
Content-Type: application/json
{
"clientKey": "YourClientKey",
"task": {
"type": "AkamaiWEBTaskProxyless",
"pageUrl": "websiteUrl",
"v3Url":"v3Url",
"bmsz": "xxx",
"abck": "xxx",
"ua": "xxx",
"lang": "xxx",
"script_base64": "xxx",
"index": 0,
"encodeData": "xxx"
}
}
API会在响应体中返回payload和encodedata,payload代表需要发送的sensor_data数据。
返回示例
返回的Payload作为sensor_data 通过post提交到对应接口
{
"errorId": 0,
"solution": {
"payload": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"encodedata": "xxxxxxxx"
},
"status": "ready"
}
代码示例
import base64
from curl_cffi import requests
import threading
from typing import Dict, List
import json
def akamai_v3_post():
url = "WebsiteUrl"
v3_url = "v3_script_url"
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
client_key = 'YourClientKey'
proxies = {
#'http': 'http://127.0.0.1:8888',
#'https': 'https://127.0.0.1:8888'
}
headers1: Dict[str, str] = {
'cache-control': 'max-age=0',
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="135", "Google Chrome";v="135"',
'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': 'en-GB,en;q=0.9',
'priority': 'u=0, i'
}
headers2: Dict[str, str] = {
'sec-ch-ua-platform': '"Windows"',
'user-agent': user_agent,
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="135", "Google Chrome";v="135"',
'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': 'en-GB,en;q=0.9',
'priority': 'u=2'
}
try:
session = requests.Session()
resp1 = session.get(
url,
headers=headers1,
proxies=proxies,
verify=False,
impersonate="chrome124"
)
resp2 = session.get(
v3_url,
headers=headers2,
proxies=proxies,
verify=False,
impersonate="chrome124"
)
bz_sz_cookie = session.cookies.get('bm_sz', '')
abck_cookie = session.cookies.get('_abck', '')
resp_script = base64.b64encode(resp2.content).decode('utf-8')
ez_url = "https://sync.ez-captcha.com/createSyncTask"
payload = {
"clientKey":client_key,
"task":{
"type": "AkamaiWEBTaskProxyless",
"pageUrl": url,
"v3Url":v3_url,
"bmsz": bz_sz_cookie,
"abck":abck_cookie,
"ua": user_agent,
"lang": "en-GB",
"script_base64": resp_script,
"index": 0,
"encodeData": ""
}
}
response = requests.post(ez_url, json=payload, timeout=10)
encodedata = json.loads(response.text).get('solution').get('encodedata')
sensordata = {'sensor_data':json.loads(response.text).get('solution').get('payload')}
count = 1
while count <= 8:
resp3 = session.post(
v3_url,
headers=headers2,
proxies=proxies,
verify=False,
json=sensordata,
impersonate="chrome124"
)
ret_cookie = session.cookies.get('_abck', '')
#Check if using the cookie directly is effective; if so, return it. If not, continue attempting to retrieve it up to eight times.
#if ..... return
print(ret_cookie)
payload = {
"clientKey":client_key,
"task":{
"type": "AkamaiWEBTaskProxyless",
"pageUrl": url,
"v3Url":v3_url,
"bmsz": bz_sz_cookie,
"abck":ret_cookie,
"ua": user_agent,
"lang": "en-GB",
"script_base64": "",
"index": count,
"encodeData": encodedata
}
}
response = requests.post(ez_url, json=payload, timeout=10)
sensordata = {'sensor_data':json.loads(response.text).get('solution').get('payload')}
count = count + 1
print("Get cookie error")
except Exception as e:
print(f"Request error: {e}")
return None
if __name__ == "__main__":
akamai_v3_post()
428 状态码
如果经过上面的步骤后,对目标接口发送请求得到了428状态码的响应,说明触发了Sec-CPT机制,您需要进行以下步骤:
获取该响应体中的
chlg_duration
参数,用于后续操作再次按照先前的步骤获取sensor_data一次,并将参数
pageUrl
设置为原先的pageUrl+ "/_sec/cp_challenge/ak-challenge-3-6.htm"
(需要将路径中的版本号改为当前网站用的正确版本),然后提交程序 Sleep 先前获取到的
chlg_duration
参数中的时间再次获取一次sensor data,然后提交
如果最终成功,你将会从响应中得到
sec-cpt
cookie,然后再次请求目标接口即可