您需要通过在搜索中替换其-code来解析来自站点的汽车数据。vin最有趣的开始于此,其解决方案已经花费了将近 4 天。解决方法必须是在使用时,aiohttp或requests// requests_html。scrapy
selenium不适合!
UPD3。(问题#1和#2解决了,可以直接进入问题3)
问题1:
当GET我请求时,我收到一条消息以包含JavaScript. 之前在解析网站的时候没有这个问题,可以拿到html网站的主页。可以做什么?我几乎爬遍了所有的论坛——我只找到了程序员的建议,比如“ так включи JS и будет работать”。
有一些用于解码slowAES.decrypt的键,以及代码本身JS。也许你可以以某种方式重现逻辑python来绕过这个限制?
问题2:
我查看了开发人员工具 - 为搜索传递了哪些数据:
常规GET-запрос,以及从 463 个字符生成的令牌:
一般来说,我没有费心在python中重写函数,而是使用js2py生成这个令牌的那个:
getToken = js2py.eval_js("""
function randomString(len) {
var str = "";
for (var i = 0; i < len; i++) {
var rand = Math.floor(Math.random() * 62);
var charCode = rand += rand > 9 ? (rand < 36 ? 55 : 61) : 48;
str += String.fromCharCode(charCode);
}
return str;
}
""")
token2 = getToken(463)
print(token2)
但问题是,在传输所有这些数据时,搜索不起作用,该站点处于 invisible 的保护之下recaptcha。
我继续分析他们的网站代码。我找到了一个直接向服务器发出请求的函数(php-script):
function dle_do_search(a) {
clearInterval(dle_search_delay);
$("#searchsuggestions").remove();
$("body").append("<div id='searchsuggestions' style='display:none'></div>");
$.post(dle_root + "engine/ajax/controller.php?mod=search", {
query: "" + a,
user_hash: dle_login_hash
}, function(a) {
$("#searchsuggestions").html(a).fadeIn().css({
position: "absolute",
top: 0,
left: 0
}).position({
my: "left top",
at: "left bottom",
of: "#story",
collision: "fit flip"
})
});
在这种情况下a,这是传输的值,即vin汽车的代码。
dle_login_hash- 我相信这是会话哈希。在开发者工具中分析请求后,我发现了这个变量:
var dle_login_hash = 'fcab770449489970ce5bb3652037c19f7f24e73';
我试图将POST-request 复制到他们的服务器,但出现错误403(一直工作到出现第 1 个问题)。也许我错过了某种令牌,或者sessionid在传递它时,但它不在我上面给出的函数中。
我的代码:
import asyncio
import aiohttp
import json
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/94.0.4606.71 Safari/537.36",
"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.9",
}
data = {
"query": "5YJ3E1EA0JF042788",
"user_hash": "fcab770449489970ce5bb3652037c19f7f24e73"
}
async def parse_vin_carsvin():
url = f"https://bidfax.info/engine/ajax/controller.php?mod=search"
async with aiohttp.ClientSession(headers=headers) as session:
async with session.post(url, data=json.dumps(data)) as response:
result = await response.text()
print(result)
loop = asyncio.get_event_loop()
loop.run_until_complete(parse_vin_carsvin())
UPD。结果是重新创建了逻辑,但这只有在您从检查器中复制所有内容时才能直接进行。我检查了您需要的正确操作fort和searchkey。
UPD2。
我想通了密钥生成FORT,只有searchkey。
到目前为止,还无法弄清楚它是如何生成的。
UPD3。
问题3:
它很可能searchkey是由SlowAES上给出的函数之一形成的
有这样一个函数toHex(generatePrivateKey("сюда передается какой-то ключ", 16));——它很可能负责它的生成,但不清楚需要为密钥传递什么。试图发送和phpsessid-fort无济于事。也许toHex(slowAES.decrypt(c,2,a,b));是生成答案的函数,FORT但我经历了所有可能的 2401 组合(;7^4 = 2401有值a,,,,,,,,b)。事实上,需要的更少,因为事实证明这是解码的模式)。cphpsessidfort122aes


UPD
在处理 Selenium 时,我将此站点视为“豚鼠”。
这是我的代码,它将 cookie 保存到二进制文件并查找汽车的 VIN。
老答案:
如果我扔掉所有的垃圾,这就是我得到的:
提出了通常的要求。请求的所有数据都通过 burpsuite 拦截并添加到请求中
请求地址如下所示:
初始标题:
可能是我误解了问题,不知道你写的有没有
UPD:我从浏览器中删除了 cookie,并通过 Burpsuite 查看了传递验证码和连接主页的阶段。它还返回您需要包含 js,显然这是第一阶段
我认为您应该研究这些请求的顺序并尝试重现它们:
第一步是一个没有 cookie 的裸请求,我们得到一个脚本和一个指向 aes.js 的链接
我们加载这个 aes.js 并执行脚本
var a=toNumbers("b0bd65ce35df0ebd05a1c3fa2647308f"), b=toNumbers("a89b6850a385bcf6f3a8f3514e1b16a4"), c=toNumbers("f4f9556a8771fea9632da685e849382b"); document.cookie="FORT="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="https://bidfax.info/?fortespro_42=1";
(这是一段代码,来自返回给您的消息 enable js,此消息将显示在浏览器中,并且 js 代码不会运行,从而启动进一步的操作)
在这段代码中,“堡垒”形成在前面
当我们发出第三个请求时,我们已经有了 FORT cookie
在这一步你可以看到我们如何发送 FORT 并获取 PHPSSESID(这里我们已经得到了一个可以解析的页面,但是还有更多的内容)
最终结论:需要自己复制js代码,既然是静态的,就用它自己组成“堡垒”,然后交给python请求
另一个额外的提示,从图片中可以看出,这个 cookie 已经形成了 15 年,我想你不用太担心,我可以假设 searchkey 完全是在 'FORT' 上形成的(你需要检查) ,并且在 FORT 更改之前它不会改变,即使重新创建了搜索键,它对我来说每次都是一样的
UPD:关于 searchkey 的证明
总的来说,我没有设法解决问题 - 我被困在密钥生成上
searchkey,我认为这就是故事的结局。已经尝试过并且selenium只是pyppeteer拿起这个密钥并已经自动化了这个过程,但它们也不能正常工作。我写信给这个网站的开发者,想知道他们是如何生成这个密钥的,但他们没有回复我,他们安全地阻止了我))他们可能认为我想窃取他们的客户。
如果您知道如何从SlowAES代码生成密钥,请在评论中告诉我。
所有这些的总结和对那些可能觉得有用的人的提示:
1)要配对(这个特定站点的)数据 - 您需要 2 个密钥:
FORT和searchkey在浏览器检查器中请求站点时,可以在
cookie/中查看传输的密钥。set-cookieFORT- 启用的确认键JavaScript;searchkey- 允许在网站上进行搜索的键。2)可以通过
requests/解析来启用JavaScriptaiohttpJavaScript要在需要通过aiohttp/解析数据时启用requests- 您需要从标签中选择一个脚本<script>Сам скрипт</script>并解码页面上给出的生成的哈希值。最简单的方法是使用在语言解释器js2py中处理-code 的库(因此您无需使用 编写其他文件,但您需要将其拉起以使解码正常工作 - 代码中有一个示例以下)JavaScriptPython*.jsvar slowAES = ...3)解析数据 - 可以从检查器手动获取密钥。
要解析这个特定站点,您需要
searchkey从检查器中获取密钥并将其与 一起传递FORT,否则该站点将重定向到主页。类似的逻辑可以在其他网站上追踪。一段时间后,该站点重新生成密钥searchkey- 在这种情况下,必须重复该过程。代码本身:
特别感谢@Alexandr 提供一些步骤的提示!