typescript - تغییر user-agent در puppeteer-extra به نظر نمیرسد تأثیر داشته باشد


من در تلاش هستم تا با استفاده از Puppeteer وبسایتهای مختلف را استخراج کنم. از آنجایی که من برای این کار از puppeteer-extra استفاده میکنم (برای پلاگین stealth آنها)، تصمیم گرفتم از پلاگین anonymize-ua آنها برای تغییر تصادفی User-Agent پیشفرض استفاده کنم تا احتمال شناسایی بیشتر کاهش یابد.

من سعی کردم توضیحات آنها را دنبال کنم، اما وقتی شناسه کاربری واقعی مرورگر را ثبت میکنم به نظر میرسد تأثیری نداشته است.

مثالی از کاری که من انجام میدهم در زیر پیوست شده است:

import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import UserAgent from 'user-agents';

const scrape = async (url: string) => {
    // Set stealth plugin
    const stealthPlugin = StealthPlugin();
    puppeteer.use(stealthPlugin);

    // Create random user-agent to be set through plugin
    const userAgent = new UserAgent({ platform: 'MacIntel', deviceCategory: 'desktop' });
    const userAgentStr = userAgent.toString();
    console.log(`User Agent: ${userAgentStr}`);

    const anonymizeUserAgentPlugin = require('puppeteer-extra-plugin-anonymize-ua')({
        customFn: () => userAgentStr 
    });
    puppeteer.use(anonymizeUserAgentPlugin);

    puppeteer
        .launch({ headless: false })
        .then(async (browser) => {
            // Different from the one above
            console.log(`User Agent: ${await browser.userAgent()}`);
        })
        .catch((e) => console.log(e));
}

اگرچه رشته کاربر-عامل اول از طریق کتابخانه user-agents به صورت تصادفی (از اجرا به اجرا) تغییر میکند، رشته دیگری که هنگام ایجاد مرورگر ثبت میشود، نسخه واقعی Chromium در حال اجرا است.

آیا من یک پیکربندی را از دست دادهام؟ یا نباید اینطور به user-agent مرورگر نگاه کنم؟

پاسخ شماره ۱

بعد از کمی جستجو درون puppeteer-extra و کد افزونه anonymize-ua، متوجه شدم:

  1. عامل کاربر در نمونه page تغییر داده شده است، بنابراین تلاش برای نگاه کردن به آنچه از browser میآید، منجر به مشاهده عامل واقعی استفاده شده نخواهد شد. راه درست این است که navigator.userAgent را از طریق کنسول ابزار توسعه ثبت کنید.
  2. یک مسئله باز در puppeteer وجود دارد که رویدادها به اندازه کافی زود برای شنوندهها (مثلاً افزونههایی که از onPageCreated استفاده میکنند) فعال نمیشوند تا بتوانند نمونه صفحه را (مثلاً user-agent) قبل از رخ دادن درخواست مرورگر، تغییر دهند. به نظر میرسد آنها تلاش کردهاند با ابتدا goto about:blank آن را دور بزنند. این راهحل برای من مشکل را حل نکرد، زیرا user-agent تغییر نکرد.

بنابراین راهحل من این بود که کد افزونه را تکثیر کنم و عامل کاربر تولید شده را روی page تنظیم کنم:

puppeteer
    .launch({ headless: false })
    .then(async (browser) => {
        browser
            .pages()
            .then(async ([page]) => {
                await page.setUserAgent(userAgentStr);
            })
            .catch(async (e) => {
                console.log(e);
                await browser.close();
            });
    })
    .catch((e) => console.log(e));

امیدوارم این به کسی کمک کند!

پاسخ شماره ۲

به طور پیشفرض 'puppeteer-extra-plugin-anonymize-ua' با ویژگی makeWindows: true تنظیم شده است که تنظیمات پلتفرم شما 'MacIntel' را با 'Windows NT 10.0; Win64; x64' جایگزین میکند

import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import UserAgent from 'user-agents';

const scrape = async (url: string) => {
    // Set stealth plugin
    const stealthPlugin = StealthPlugin();
    puppeteer.use(stealthPlugin);

    // Create random user-agent to be set through plugin
    const userAgent = new UserAgent({ platform: 'MacIntel', deviceCategory: 'desktop' });
    const userAgentStr = userAgent.toString();
    console.log(`User Agent: ${userAgentStr}`);

    const anonymizeUserAgentPlugin = require('puppeteer-extra-plugin-anonymize-ua')({
        customFn: () => userAgentStr,
        stripHeadless: true,
        makeWindows: false,
    });
    puppeteer.use(anonymizeUserAgentPlugin);

    puppeteer
        .launch({ headless: false })
        .then(async (browser) => {
            // Different from the one above
            console.log(`User Agent: ${await browser.userAgent()}`);
        })
        .catch((e) => console.log(e));
}

مقدار makeWindows را همانند مثال زیر روی false قرار دهید تا مشکل برطرف شود.

من لینکی به مخزن را به خط خاصی از کد که این مشکل را حل میکند پیوست میکنم https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js#L47