Стукните в TG @dobrok_bas
Платная помощь! FM/BAS - плохо
-
@Bigma said in Платная помощь! FM/BAS - плохо:
@FastSpace я почему подумал, в инструментах разработчика можно ограничить скорость соединения поставив 3g, главное, чтоб бас не делал тоже самое 😁 надо как то это проверить. Поймать отпечаток с 3g и замерить скорость без прокси и сравнить с обычным хромом...
Знаю я про эту фичу, то что ты видишь там на сайтах детекторах это всего лишь вывеска - заглушка, врятли хромимум у BAS вмешивается в работу прокси (за прокси отвечает своё решение) таким образом, хотя проверить стоит.
-
@FastSpace это не прокси, это механизм задержки соединения, ну как то так.
-
@Bigma said in Платная помощь! FM/BAS - плохо:
@FastSpace это не прокси, это механизм задержки соединения, ну как то так.
Я знаю, если самому эти настройки выставить, то прокси будет работать с той скоростью которую ты указал, а если просто параметр из отпечатка, то врятли
-
@FastSpace said in Платная помощь! FM/BAS - плохо:
Зачем? Что это изменит?
Наверное, потому что тебя попросили. Так как ты не дал подробных инструкций, я додумал логику.
Это третий скрипт, который я написал в жизни на
javascriptиpuppeteer, что может говорить, что некоторые вещи могут быть не сложными, даже для не очень опытных кодеров. Времени у меня ушло на исследование вопроса и написание скрипта меньше часа.Можно реализовать установку любых заголовков в любое время. Вероятно, можно реализовать подобное и в BAS. Но надо знать его очень хорошо, а у меня его ограниченное знание.
Вероятно, в скрипте могут быть ошибки, так как у меня ограниченный опыт с
javascript.Иногда все таки дело в танцоре, а не инструменте.

/* This code sets up a Puppeteer browser instance with a specific profile directory and fingerprint. It then launches a new page and intercepts the requests made by that page, modifying specified headers if they exist. It navigates to a URL and takes a screenshot of the full page before closing the browser. */ require("dotenv").config(); const {plugin} = require("puppeteer-with-fingerprints"); const fs = require("fs").promises; const path = require("path"); async function interceptRequests(page, headers) { // Enable request interception for the given page await page.setRequestInterception(true); // Listen for incoming requests on the page page.on("request", iRequest => { // Get the headers of the incoming request const requestHeaders = iRequest.headers(); let headerIntercepted = false; // Check if any of the specified headers are present in the request headers for (const [headerName, headerValue] of Object.entries(headers)) { if (requestHeaders[headerName]) { // If a header is present, modify its value and log the change console.log(`Header intercepted from "${headerName}: ${requestHeaders[headerName]}" to "${headerName}: ${headerValue}" for URL: ${iRequest.url()}`); requestHeaders[headerName] = headerValue; headerIntercepted = true; } } // Continue the request with the modified headers if any headers were intercepted if (headerIntercepted) { iRequest.continue({headers: requestHeaders}); } else { iRequest.continue(); } }); } async function runAll(profileDirectory, fpKey) { // Check if the profile directory exists, and create it if it doesn't try { await fs.access(profileDirectory); } catch { await fs.mkdir(profileDirectory, {recursive: false}); } // Check if the fingerprint file already exists: const fingerprintFilePath = path.join(profileDirectory, "fingerprint.json"); let fingerprint; if (await fs.access(fingerprintFilePath).then(() => true).catch(() => false)) { // Read the fingerprint from the file: const fingerprintData = await fs.readFile(fingerprintFilePath, "utf-8"); fingerprint = JSON.parse(fingerprintData); } else { // Fetch a fingerprint from the server: fingerprint = await plugin.fetch(fpKey, { tags: ["Microsoft Windows", "Chrome"], minBrowserVersion: "110" }); // Write the fingerprint to a file in the profile directory: await fs.writeFile(fingerprintFilePath, JSON.stringify(fingerprint)); } // Apply fingerprint: plugin.useFingerprint(fingerprint); // Launch a new browser instance with the specified profile directory: const browser = await plugin.launch({ args: [`--user-data-dir=${profileDirectory}`], headless: false, }); // Create a new page in the browser: const page = await browser.newPage(); // Intercept requests and modify the headers if present: await interceptRequests(page, { "downlink": "downlink_any_value", "rrt": "rrt_any_value", "device-memory": "device-memory_any_value" }); // Navigate to the specified URL: await page.goto("https://browserleaks.com/client-hints"); // Wait for the page to finish loading: page.waitForNavigation() .then(() => { // Do something after the navigation is successful }) .catch(() => { // Handle navigation error }); // Take a screenshot of the page: await page.screenshot({path: path.join(path.dirname(__filename), "screenshot.png"), fullPage: true}); // Close the browser: await browser.close(); } // Run the function with the specified profile directory and fingerprint key: (async () => { const profileDirectory = path.join(path.dirname(__filename), ".profile-http-headers"); const fpKey = process.env.FINGERPRINT_KEY ?? ""; console.log(`running with profile: ${profileDirectory}`); await runAll(profileDirectory, fpKey); })();Logs:
$ node example_http_headers.js running with profile: D:\Projects\WebStorm\others\puppeteer-with-fingerprints_test1\.profile-http-headers Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/client-hints Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/client-hints Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/css/style.css?v=57762431 Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/css/style.css?v=57762431 Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/js/jquery.min.js?v=33792034 Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/js/jquery.min.js?v=33792034 Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/js/default.js?v=57762431 Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/js/default.js?v=57762431 Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/js/client-hints.js?v=57762431 Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/js/client-hints.js?v=57762431 Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/img/logo_hand.svg?v=33792034 Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/img/logo_hand.svg?v=33792034 Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/img/logo.png?v=33792034 Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/img/logo.png?v=33792034 Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/client-hints/iframe Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/client-hints/iframe Header intercepted from "downlink: 10" to "downlink: downlink_any_value" for URL: https://browserleaks.com/manifest.json?v=33792034 Header intercepted from "device-memory: 8" to "device-memory: device-memory_any_value" for URL: https://browserleaks.com/manifest.json?v=33792034package.json:
{ "name": "puppeteer-with-fingerprints_test1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "dotenv": "^16.0.3", "puppeteer": "^19.7.3", "puppeteer-with-fingerprints": "github:CheshireCaat/puppeteer-with-fingerprints" }, "devDependencies": { "eslint": "^8.35.0" } } -
@sergerdn мощный костыль ты конечно накидал, но можно проще опять же :) То, про что Фаст говорил, скорее всего относится к стандартным заголовкам, которые можно посмотреть например в инструментах разработчика - и оппа сюрприз, для хрома - они будут отличаться от бассовских - но надо прям очень внимательно сравнивать. И все это хозяйство можно изменить другим способом.
-
@Bigma said in Платная помощь! FM/BAS - плохо:
@sergerdn мощный костыль ты конечно накидал
Мой код использует вполне себе стандартный api
puppeteer, поэтому, вероятно, он не костыльный.
В примере выше куча кода для обвязки, сам рабочий код, что относится к фильтрации заголовков, очень маленький.Отдельно код фильтрации заголовков без комментариев в коде:
async function interceptRequests(page, headers) { await page.setRequestInterception(true); page.on("request", iRequest => { const requestHeaders = iRequest.headers(); let headerIntercepted = false; for (const [headerName, headerValue] of Object.entries(headers)) { if (requestHeaders[headerName]) { console.log(`Header intercepted from "${headerName}: ${requestHeaders[headerName]}" to "${headerName}: ${headerValue}" for URL: ${iRequest.url()}`); requestHeaders[headerName] = headerValue; headerIntercepted = true; } } if (headerIntercepted) { iRequest.continue({headers: requestHeaders}); } else { iRequest.continue(); } }); } await interceptRequests(page, { "downlink": "downlink_any_value", "rrt": "rrt_any_value", "device-memory": "device-memory_any_value" });@Bigma said in Платная помощь! FM/BAS - плохо:
@sergerdn .. но можно проще опять же :)
Если у тебя есть решение проще, я удовольствием почитаю любые твои предложения по фильтрации/изменении/удалении/etc заголовков и посмотрю твой код реализации.
@Bigma said in Платная помощь! FM/BAS - плохо:
И все это хозяйство можно изменить другим способом.
Согласен, решение, что я предложил не единственное. Я делал подобную задачу еще другими двумя способами, но общая идея у них одна - перехватывать и манипулировать заголовками.
-
@Bigma said in Платная помощь! FM/BAS - плохо:
@sergerdn любите вы слышать только себя, внимательно прочитай мои сообщения в теме и может найдешь направление, куда копать...
Вероятно, я не смог до конца понять смысл всех твоих сообщениях в этой теме. Но я понял, что у тебя есть варианты проще.
Поэтому я выше и написал:
Если у тебя есть решение проще, я удовольствием почитаю любые твои предложения по фильтрации/изменении/удалении/etc заголовков и посмотрю твой код реализации.
Моя идея и реализация состояла в том, что можно манипулировать любыми заголовками браузера по любым правилам. Изменять, удалять, добавлять и так далее. Нужно это для того, чтобы обойти ограничения отпечатков браузера, когда браузер посылает HTTP Client hints как-то не так, как хочется @FastSpace.
-
@sergerdn то что ты сделал - это хорошо, поймут это 3 человека на форуме. Но надо ещё понимать что именно надо исправить, откуда оно вообще лезит, и можно ли по другому. Ладно, не парься, ты хороший прогер, с этим никто не спорит и доказывать тебе ничего не надо. Главное результат 🤗
-
@Bigma said in Платная помощь! FM/BAS - плохо:
@sergerdn то что ты сделал - это хорошо, поймут это 3 человека на форуме.
Я старался как мог, даже кучу комментариев расставил по коду. Я и в BAS делаю кучу вставок с кодом на NodeJS/Javascript.
В одном из сообщений @UserTrue писал, что делал каким-то образом фильтрацию сетевых запросов в BAS. Если я вообще его правильно понял, так как код реализации я не видел. Может, мы его "вызовем" в этот топик и он даст код проще для понимания, чем мой.
Да и я сам бы посмотрел, мне интересно. -
@sergerdn да все с твоим кодом в порядке, другой вопрос нужно ли 8 колес жигуленку, если первые 4 спущены? Их просто надо правильно накачать 🤗 короче, я завязываю играть в ребусы, ты поспи, может с утра по другому взглянешь. Ну а нет, значит не судьба ...
-
@FastSpace или не стоит :) кто знает тот починит ... Мне уже пофиг :)
-
@Bigma said in Платная помощь! FM/BAS - плохо:
@FastSpace или не стоит :) кто знает тот починит ... Мне уже пофиг :)
И не починит, низкий приоритет ответ был.
Если в кратце этот заголовок означает твой пинг до сервера где хостится сайт и он одинаковый для всех сайтов... 😁 -
@FastSpace said in Платная помощь! FM/BAS - плохо:
@Bigma said in Платная помощь! FM/BAS - плохо:
@FastSpace или не стоит :) кто знает тот починит ... Мне уже пофиг :)
И не починит, низкий приоритет ответ был.
Если в кратце этот заголовок означает твой пинг до где хостится сайта и он одинаковый для всех сайтов... 😁о боже, ты оказывается еще многого не знаешь :) ну да ладно ...
-
-
-
Перенос BAS на Питон
Locked Moved Заказать скрипт -
-