@capybark читал по диагонали понял так "есть профили из браузера бас и хочется их перенести на дроид браузер", прост перенести скорее всего нельзя, но куки ты можешь. Отпечаток перенести не получится так как ожидается, ТК он работает только в бас. Но можно сделать наоборот, через кастом серверс снять отпечатки с разных тебе устройств, браузера разумеется, на этих отпечатках отфармить и получить куки и эти куки + локал сторедж залить в твой браузер на эмуле. Отпечаток, очевидно будет тот же. Стоит понимать, что бас для автоматизации браузера на ПК или отпечатках телефона, эт кастомизированная версия браузера для возможности подмены отпечатков. Но для браузера, не для приложений)
Платная помощь! FM/BAS - плохо
-
@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 или не стоит :) кто знает тот починит ... Мне уже пофиг :)
И не починит, низкий приоритет ответ был.
Если в кратце этот заголовок означает твой пинг до где хостится сайта и он одинаковый для всех сайтов... 😁о боже, ты оказывается еще многого не знаешь :) ну да ладно ...
-
@Bigma said in Платная помощь! FM/BAS - плохо:
@FastSpace said in Платная помощь! FM/BAS - плохо:
@Bigma said in Платная помощь! FM/BAS - плохо:
@FastSpace или не стоит :) кто знает тот починит ... Мне уже пофиг :)
И не починит, низкий приоритет ответ был.
Если в кратце этот заголовок означает твой пинг до где хостится сайта и он одинаковый для всех сайтов... 😁о боже, ты оказывается еще многого не знаешь :) ну да ладно ...
Расскажи 😄
-
@FastSpace не выгодно и лень, в целом и так все сказал, если внимательно читать мои сообщения. Кому надо, тот найдет...
-
@FastSpace said in Платная помощь! FM/BAS - плохо:
@sergerdn такие вещи стоит разработчику чинить
Вероятно. Но пока я не увидел от тебя четкого и ясного описание бага, только намеки на "погуглить".
@FastSpace said in Платная помощь! FM/BAS - плохо:
@sergerdn поменять один заголовок этого недостаточно, я же не зря написал нужно сначала почитать что означает этот заголовок.
Я запрашивал у тебя подробные инструкции. Выше код я дал как пример, его можно доработать до какой угодно логики.