RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1336973
Accepted
DeNRuDi
DeNRuDi
Asked:2022-03-10 23:45:04 +0000 UTC2022-03-10 23:45:04 +0000 UTC 2022-03-10 23:45:04 +0000 UTC

我无法解析来自网站的数据

  • 772

您需要通过在搜索中替换其-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

javascript
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Alexandr
    2022-03-13T00:28:35Z2022-03-13T00:28:35Z

    UPD

    在处理 Selenium 时,我将此站点视为“豚鼠”。

    这是我的代码,它将 cookie 保存到二进制文件并查找汽车的 VIN。

    def selenium_parser(url , driver):
    
      driver.get(url)
      search_input = driver.find_element_by_id('search')
      search_input.clear()
      search_input.send_keys('5YJ3E1EA0JF042788')
      submit_btn = driver.find_element_by_id('submit')
      submit_btn.click()
    
      time.sleep(5)
    
    def getDataSelenium(url,parser):
           
        driver = webdriver.Chrome(
            executable_path='./browsers/chromedriver/chromedriver',
            seleniumwire_options=settings.SELENIUM_PROXY
        )
    
        try:
            cookie_name = f"{url.split('//')[-1]}_cookies"
    
            if os.path.exists(cookie_name):
                print('Берем куки с файла')
                for cookie in pickle.load(open(cookie_name , 'rb')):
                    driver.add_cookie(cookie)
    
            parser(url , driver)
            
    
        except Exception as ex:
            print(ex)
        finally:
            print('Сохраняем куки')
            pickle.dump(driver.get_cookies() , open( cookie_name , 'wb'))
            driver.close()
            driver.quit()
    
    def main():
        
        getDataSelenium('https://bidfax.info', selenium_parser)
    
    
    if __name__ == "__main__":
        main()
    

    老答案:

    如果我扔掉所有的垃圾,这就是我得到的:

     <div class="col-xs-12 col-sm-6">
            <div class="thumbnail offer">
                <div class="img-wrapper">
                    <a href="https://bidfax.info/tesla/model-3/10567477-tesla-model-3-range-battery-2018-gray-motor-vin-5yj3e1ea0jf042788.html">
                        <img class="xfieldimage skrin" src="/uploads/posts/2021-10/08/tesla-model-3-2018-5yj3e1ea0jf042788-img1.jpg" alt="">
                        
                    </a>
                </div>
                <div class="price"><i class="fa fa-dollar"></i><span class="prices" id="prices-10567477">26575</span></div>
                
                <div class="caption">
                    <a href="https://bidfax.info/tesla/model-3/10567477-tesla-model-3-range-battery-2018-gray-motor-vin-5yj3e1ea0jf042788.html"><h2>Tesla Model 3 Range Battery 2018 Gray MOTOR  vin: 5YJ3E1EA0JF042788</h2></a>
                    
                    <p class="short-storyup">Аукцион: <span class="iaai">&nbsp;IAAI&nbsp;</span>&nbsp;&nbsp;<img src="/templates/ru/dleimages/onapproval2.png" alt="На утверждении" title="На утверждении" style="margin-top:-4px"></p>
                    <p class="short-story">Номер лота:&nbsp;<span class="blackfont">31321550</span></p>
                    <p class="short-story2">Состояние:&nbsp;<span class="blackfont">Run and Drive</span></p>
                    <p class="short-story">Повреждение:&nbsp;<span class="blackfont">Flood</span></p>
                    <p class="short-story2">Пробег:&nbsp;<span class="blackfont">9360&nbsp;миль&nbsp;(Actual)</span></p>
                    <p class="short-story">Дата продажи:&nbsp;<span class="blackfont">07.10.2021</span></p>
                    <div class="clearfix">
                        <a href="https://bidfax.info/tesla/model-3/10567477-tesla-model-3-range-battery-2018-gray-motor-vin-5yj3e1ea0jf042788.html" class="btn btn-default btn-more pull-right" role="button">Подробнее</a>
                    </div>
                </div>
            </div>
        </div>
            
            
        </div>
                    </div>
    

    提出了通常的要求。请求的所有数据都通过 burpsuite 拦截并添加到请求中

    在此处输入图像描述

    请求地址如下所示:

    https://bidfax.info/?do=search&subaction=search&story=5YJ3E1EA0JF042788&token2=03AGdBq27XAie48A7sAG9gqugwLVvp9Ve5m9DpwyvhRviVHQy_iCZXdl-Rf2UH-2oFGpINU7ZMHMOZCXENBIwwgzEmy6w1kGV8qrGt-sOG0pDRYWYJTSDq7H1VvA7ZGMPmIu37AI3JebUBAquXdU-H090ubYA3j6JZ-M52YWKTWM1mG6rX-w1TkgDottqIf5P03mlM5nOoU_9ft0D6usirRDNSr8JFK8aEpYvba7fdPwGiIZg-B8H6OlZpTXxJyvsHXCkWUpvQXgsq4QIXmCKXiVoMUgvBvFWE_pgeqSIpFIaddHK50gqPFEcWLFrxbyUOiJWKA_Sjkay8wJqfLbo3b8kB1SIhG2XdjdknRnADqB32j0qmA2ZSoynEW2s9sNmz76VUI861RbOOyhDi_Q4HgJrcNeEf6N3qWYGPXbjXt2uSA547u__tWdwGy93WeGRihRZEntvemDQVzFOwHe1v4DotsQ&action2=search_action
    

    初始标题:

    在此处输入图像描述

    可能是我误解了问题,不知道你写的有没有

    UPD:我从浏览器中删除了 cookie,并通过 Burpsuite 查看了传递验证码和连接主页的阶段。它还返回您需要包含 js,显然这是第一阶段 在此处输入图像描述

    我认为您应该研究这些请求的顺序并尝试重现它们:

    1. 第一步是一个没有 cookie 的裸请求,我们得到一个脚本和一个指向 aes.js 的链接

    2. 我们加载这个 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 代码不会运行,从而启动进一步的操作)

    在这段代码中,“堡垒”形成在前面

    1. 当我们发出第三个请求时,我们已经有了 FORT cookie

    2. 在这一步你可以看到我们如何发送 FORT 并获取 PHPSSESID(这里我们已经得到了一个可以解析的页面,但是还有更多的内容)

    在此处输入图像描述

    最终结论:需要自己复制js代码,既然是静态的,就用它自己组成“堡垒”,然后交给python请求

    • 3
  2. Alexandr
    2022-03-13T18:14:39Z2022-03-13T18:14:39Z

    另一个额外的提示,从图片中可以看出,这个 cookie 已经形成了 15 年,我想你不用太担心,我可以假设 searchkey 完全是在 'FORT' 上形成的(你需要检查) ,并且在 FORT 更改之前它不会改变,即使重新创建了搜索键,它对我来说每次都是一样的

    在此处输入图像描述

    UPD:关于 searchkey 的证明

    在此处输入图像描述

    • 2
  3. Best Answer
    DeNRuDi
    2022-03-16T22:23:49Z2022-03-16T22:23:49Z

    总的来说,我没有设法解决问题 - 我被困在密钥生成上searchkey,我认为这就是故事的结局。已经尝试过并且selenium 只是pyppeteer拿起这个密钥并已经自动化了这个过程,但它们也不能正常工作。

    我写信给这个网站的开发者,想知道他们是如何生成这个密钥的,但他们没有回复我,他们安全地阻止了我))他们可能认为我想窃取他们的客户。

    如果您知道如何从SlowAES代码生成密钥,请在评论中告诉我。

    所有这些的总结和对那些可能觉得有用的人的提示:

    1)要配对(这个特定站点的)数据 - 您需要 2 个密钥:FORT和searchkey

    在浏览器检查器中请求站点时,可以在cookie/中查看传输的密钥。set-cookie

    FORT- 启用的确认键JavaScript;

    searchkey- 允许在网站上进行搜索的键。

    2)可以通过requests/解析来启用JavaScriptaiohttp

    JavaScript要在需要通过aiohttp/解析数据时启用requests- 您需要从标签中选择一个脚本<script>Сам скрипт</script>并解码页面上给出的生成的哈希值。最简单的方法是使用在语言解释器js2py中处理-code 的库(因此您无需使用 编写其他文件,但您需要将其拉起以使解码正常工作 - 代码中有一个示例以下)JavaScriptPython*.jsvar slowAES = ...

    3)解析数据 - 可以从检查器手动获取密钥。

    要解析这个特定站点,您需要searchkey从检查器中获取密钥并将其与 一起传递FORT,否则该站点将重定向到主页。类似的逻辑可以在其他网站上追踪。一段时间后,该站点重新生成密钥searchkey- 在这种情况下,必须重复该过程。

    代码本身:

    from bs4 import BeautifulSoup
    import aiohttp
    import asyncio
    import js2py
    
    
    headers = {
        'Host': 'bidfax.info',
        "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",
        "Accept-Language": "accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
        "Accept-Encoding": "gzip, deflate, br",
        "DNT": "1",
        "Connection": "close",
        "Upgrade-Insecure-Requests": "1",
        "Cache-Control": "max-age=0",
    }
    
    
    token2 = 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;
    }
    """)
    
    
    async def test(vin):
        url = "https://bidfax.info/"
        aes_js = "https://bidfax.info/aes.min.js"
        parse_url = f"https://bidfax.info/?do=search&subaction=search&story={vin}&token2={token2(463)}&action2=search_action"
        async with aiohttp.ClientSession(headers=headers) as session:
            async with session.get(url) as response:
                script = BeautifulSoup(await response.text(), "html.parser").find_all("script")[1].get_text()
                response = await session.get(aes_js)
                slowAES = await response.text()
                jslogic = script.split('document.cookie="')[0]
                FORT = js2py.eval_js(slowAES + jslogic + " toHex(slowAES.decrypt(c,2,a,b));")
                searchkey = "" # сюда нужно вставить searchkey
                session.headers.update({"Cookie": "FORT=" + FORT + "; searchkey=" + searchkey})
                res = await session.get(parse_url)
                with open("file.html", "w", encoding="UTF-8") as file:
                    file.write(await res.text())
    
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(test("5YJ3E1EA0JF042788"))
    

    特别感谢@Alexandr 提供一些步骤的提示!

    • 0

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5