js puppeteer 2captcha. не могу вставить токен на instagram внутрь другого фрейма

структура страницы следующая:

<iframe title="recaptcha-iframe">
    ...
    <iframe title="reCAPTCHA">...here code of recaptcha...</iframe>
    <textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid rgb(193, 193, 193); 
margin: 10px 25px; padding: 0px; resize: none; display: none;"></textarea>
</iframe>

мой код:

async function initiateCaptchaRequest(apiKey, url) {
    const formData = {
        method: 'userrecaptcha',
        googlekey: "6LdktRgnAAAAAFQ6icovYI2-masYLFjEFyzQzpix",
        key: apiKey,
        pageurl: url,
        json: 1
    };
    const response = await request.post('http://2captcha.com/in.php', {form: formData});
    return JSON.parse(response).request;
}

async function pollForRequestResults(key, id, retries = 30, interval = 1500, delay = 15000) {
    await sleep(delay);
    return poll({
        taskFn: requestCaptchaResults(key, id),
        interval,
        retries
    });
}

function requestCaptchaResults(apiKey, requestId) {
    const url = `http://2captcha.com/res.php?key=${apiKey}&action=get&id=${requestId}&json=1`;
    return async function() {
        return new Promise(async function(resolve, reject){
            const rawResponse = await request.get(url);
            const resp = JSON.parse(rawResponse);
            if (resp.status === 0) 
                return reject(resp.request);
            
            resolve(resp.request);
        });
    }
}

async function performSolveCaptcha(page) {
    await sleep(1500);
    try {
        let apiKey = "...";
        
        /*const parentIframe = await page.waitForSelector('iframe#recaptcha-iframe');
        
        const frameUrl = await parentIframe.evaluate(el => el.src);
        
        const requestId = await initiateCaptchaRequest(apiKey, frameUrl);
        
        const response = await pollForRequestResults(apiKey, requestId);

        console.log(await parentIframe.contentFrame());*/

        const parentIframe = await page.waitForSelector('iframe[src*="/recaptcha/"]');
                console.log(0, parentIframe); 

        const recaptchaFrame = await parentIframe.contentFrame();
        console.log(1, recaptchaFrame); //null
        
        const innerFrame = await recaptchaFrame.waitForSelector('iframe[title="reCAPTCHA"]'); //here error
        
        const targetFrame = await innerFrame.contentFrame();
        
        const frameUrl = await parentIframe.evaluate(el => el.src);
        const requestId = await initiateCaptchaRequest(apiKey, frameUrl);
        await sleep(120000);
        const response = await pollForRequestResults(apiKey, requestId);
            
        await parentIframe.evaluate((captchaResponse) => {
            console.log(0);
            const textarea = document.getElementById('g-recaptcha-response');
            
            console.log(1);
          
            // Устанавливаем значение и триггерим все события
            textarea.value = captchaResponse;
            console.log(2);
            textarea.dispatchEvent(new Event('input', { bubbles: true }));
            console.log(3);
            textarea.dispatchEvent(new Event('change', { bubbles: true }));
            console.log(4);
            // Для некоторых случаев нужно обновить данные формы
            const form = textarea.closest('form');
            if(form) {
                form.dispatchEvent(new Event('submit', { cancelable: true }));
            }
        }, response);
        
        
        console.log("success!");
        await sleep(30000);
        
    }
    catch (er) {
        console.log(er);
        await sleep(120000);
    }

}

лог:

Использую WebSocket URL из аргументов: ws://localhost:9222/devtools/browser/be873cec-395f-44bd-9516-fbf86f2e8843
Режим обработки аккаунтов: delete
Перехожу на главную страницу Instagram...
Проверка, выполнен ли вход и получение имени пользователя...
Элемент профиля не найден, пользователь не вошел в систему.
Начальное состояние: вход не выполнен.
Пробуем аккаунт: katherineshaffer5 (1/1)
Куки очищены, перезагружаю страницу...
Попытка входа для katherineshaffer5...
Кнопка "Переключить аккаунты" не найдена. Стандартный вход.
Ошибка при проверке сценария "Переключить аккаунты": client is not defined
Ввожу логин...
Ввожу пароль...
Обнаружена страница капчи!
null
0 ElementHandle {
  _disposed: false,
  _context: ExecutionContext {
    _client: CDPSession {
      eventsMap: [Map],
      emitter: [Object],
      _callbacks: Map(0) {},
      _connection: [Connection],
      _targetType: 'page',
      _sessionId: '3C1203A5C3CD268C6A2B4598CCDA7620'
    },
    _world: DOMWorld {
      _documentPromise: [Promise],
      _contextPromise: [Promise],
      _contextResolveCallback: null,
      _detached: false,
      _waitTasks: Set(0) {},
      _boundFunctions: Map(0) {},
      _ctxBindings: Set(0) {},
      _settingUpBinding: null,
      _frameManager: [FrameManager],
      _frame: [Frame],
      _timeoutSettings: [TimeoutSettings]
    },
    _contextId: 9,
    _contextName: ''
  },
  _client: CDPSession {
    eventsMap: Map(29) {
      'Fetch.requestPaused' => [Array],
      'Fetch.authRequired' => [Array],
      'Network.requestWillBeSent' => [Array],
      'Network.requestServedFromCache' => [Array],
      'Network.responseReceived' => [Array],
      'Network.loadingFinished' => [Array],
      'Network.loadingFailed' => [Array],
      'Page.frameAttached' => [Array],
      'Page.frameNavigated' => [Array],
      'Page.navigatedWithinDocument' => [Array],
      'Page.frameDetached' => [Array],
      'Page.frameStoppedLoading' => [Array],
      'Runtime.executionContextCreated' => [Array],
      'Runtime.executionContextDestroyed' => [Array],
      'Runtime.executionContextsCleared' => [Array],
      'Page.lifecycleEvent' => [Array],
      'Target.attachedToTarget' => [Array],
      'Target.detachedFromTarget' => [Array],
      'Page.domContentEventFired' => [Array],
      'Page.loadEventFired' => [Array],
      'Runtime.consoleAPICalled' => [Array],
      'Runtime.bindingCalled' => [Array],
      'Page.javascriptDialogOpening' => [Array],
      'Runtime.exceptionThrown' => [Array],
      'Inspector.targetCrashed' => [Array],
      'Performance.metrics' => [Array],
      'Log.entryAdded' => [Array],
      'Page.fileChooserOpened' => [Array],
      Symbol(CDPSession.Disconnected) => []
    },
    emitter: {
      all: [Map],
      on: [Function: on],
      off: [Function: off],
      emit: [Function: emit]
    },
    _callbacks: Map(0) {},
    _connection: Connection {
      eventsMap: [Map],
      emitter: [Object],
      _lastId: 174,
      _sessions: [Map],
      _closed: false,
      _callbacks: Map(0) {},
      _url: 'ws://localhost:9222/devtools/browser/be873cec-395f-44bd-9516-fbf86f2e8843',
      _delay: 0,
      _transport: [NodeWebSocketTransport]
    },
    _targetType: 'page',
    _sessionId: '3C1203A5C3CD268C6A2B4598CCDA7620'
  },
  _remoteObject: {
    type: 'object',
    subtype: 'node',
    className: 'HTMLIFrameElement',
    description: 'iframe#recaptcha-iframe',
    objectId: '-2653266998151135955.9.6'
  },
  _page: <ref *1> Page {
    eventsMap: Map(0) {},
    emitter: {
      all: Map(0) {},
      on: [Function: on],
      off: [Function: off],
      emit: [Function: emit]
    },
    _closed: false,
    _timeoutSettings: TimeoutSettings {
      _defaultTimeout: null,
      _defaultNavigationTimeout: null
    },
    _pageBindings: Map(0) {},
    _javascriptEnabled: true,
    _workers: Map(0) {},
    _fileChooserInterceptors: Set(0) {},
    _client: CDPSession {
      eventsMap: [Map],
      emitter: [Object],
      _callbacks: Map(0) {},
      _connection: [Connection],
      _targetType: 'page',
      _sessionId: '3C1203A5C3CD268C6A2B4598CCDA7620'
    },
    _target: Target {
      _targetInfo: [Object],
      _browserContext: [BrowserContext],
      _targetId: '4495B69B7FE65767185E02151B82D1F9',
      _sessionFactory: [Function (anonymous)],
      _ignoreHTTPSErrors: false,
      _defaultViewport: [Object],
      _pagePromise: [Promise],
      _workerPromise: null,
      _initializedCallback: [Function (anonymous)],
      _initializedPromise: [Promise],
      _closedCallback: [Function (anonymous)],
      _isClosedPromise: [Promise],
      _isInitialized: true
    },
    _keyboard: Keyboard {
      _modifiers: 0,
      _pressedKeys: Set(0) {},
      _client: [CDPSession]
    },
    _mouse: Mouse {
      _x: 392.33335876464844,
      _y: 320.3333435058594,
      _button: 'none',
      _client: [CDPSession],
      _keyboard: [Keyboard]
    },
    _touchscreen: Touchscreen { _client: [CDPSession], _keyboard: [Keyboard] },
    _accessibility: Accessibility { _client: [CDPSession] },
    _frameManager: FrameManager {
      eventsMap: [Map],
      emitter: [Object],
      _frames: [Map],
      _contextIdToContext: [Map],
      _isolatedWorlds: [Set],
      _client: [CDPSession],
      _page: [Circular *1],
      _networkManager: [NetworkManager],
      _timeoutSettings: [TimeoutSettings],
      _mainFrame: [Frame]
    },
    _emulationManager: EmulationManager {
      _emulatingMobile: false,
      _hasTouch: false,
      _client: [CDPSession]
    },
    _tracing: Tracing { _recording: false, _path: '', _client: [CDPSession] },
    _coverage: Coverage { _jsCoverage: [JSCoverage], _cssCoverage: [CSSCoverage] },
    _screenshotTaskQueue: ScreenshotTaskQueue { _chain: [Promise] },
    _viewport: { width: 800, height: 800 }
  },
  _frameManager: <ref *2> FrameManager {
    eventsMap: Map(5) {
      Symbol(FrameManager.FrameAttached) => [Array],
      Symbol(FrameManager.FrameDetached) => [Array],
      Symbol(FrameManager.FrameNavigated) => [Array],
      Symbol(FrameManager.LifecycleEvent) => [],
      Symbol(FrameManager.FrameNavigatedWithinDocument) => []
    },
    emitter: {
      all: [Map],
      on: [Function: on],
      off: [Function: off],
      emit: [Function: emit]
    },
    _frames: Map(1) { '4495B69B7FE65767185E02151B82D1F9' => [Frame] },
    _contextIdToContext: Map(2) { 9 => [ExecutionContext], 10 => [ExecutionContext] },
    _isolatedWorlds: Set(1) { '__puppeteer_utility_world__' },
    _client: CDPSession {
      eventsMap: [Map],
      emitter: [Object],
      _callbacks: Map(0) {},
      _connection: [Connection],
      _targetType: 'page',
      _sessionId: '3C1203A5C3CD268C6A2B4598CCDA7620'
    },
    _page: <ref *1> Page {
      eventsMap: Map(0) {},
      emitter: [Object],
      _closed: false,
      _timeoutSettings: [TimeoutSettings],
      _pageBindings: Map(0) {},
      _javascriptEnabled: true,
      _workers: Map(0) {},
      _fileChooserInterceptors: Set(0) {},
      _client: [CDPSession],
      _target: [Target],
      _keyboard: [Keyboard],
      _mouse: [Mouse],
      _touchscreen: [Touchscreen],
      _accessibility: [Accessibility],
      _frameManager: [Circular *2],
      _emulationManager: [EmulationManager],
      _tracing: [Tracing],
      _coverage: [Coverage],
      _screenshotTaskQueue: [ScreenshotTaskQueue],
      _viewport: [Object]
    },
    _networkManager: NetworkManager {
      eventsMap: [Map],
      emitter: [Object],
      _requestIdToRequest: [Map],
      _requestIdToRequestWillBeSentEvent: Map(0) {},
      _extraHTTPHeaders: {},
      _credentials: null,
      _attemptedAuthentications: Set(0) {},
      _userRequestInterceptionEnabled: false,
      _userRequestInterceptionCacheSafe: false,
      _protocolRequestInterceptionEnabled: false,
      _userCacheDisabled: false,
      _requestIdToInterceptionId: Map(0) {},
      _emulatedNetworkConditions: [Object],
      _client: [CDPSession],
      _ignoreHTTPSErrors: false,
      _frameManager: [Circular *2]
    },
    _timeoutSettings: TimeoutSettings {
      _defaultTimeout: null,
      _defaultNavigationTimeout: null
    },
    _mainFrame: Frame {
      _url: 'https://www.instagram.com/challenge/ASiCaW0tsjDck_JXWWhDzXdmGEV6NRz5JnV3Or-m7wKveK7TtOTjoyvHOQpsgP5kzQBXps4/ASSs7N-pRBPa8-d3Sn8bQR5EfVXopYE6BmgFYxxu856Lhn-rFp7XNJkTXI07mSSDhzRFTC5NndUZ7A/?challenge_context=Af6W3OcQwfI1jP9A0FckpGk23uxMN2s0dUiRl0SJQfvb2Jgl4Zwrv04fYSHbc6zZvlDzA0pm_1DBWtEILIp0pK0y9-Oz8PsPy5iXKfPBg8k1nvuICp6cQknDQQ2zl2evCyuUTvmCzpp3n_1KkaqJAtTjlnVVupyy-dfEkwF_DGN1t1CyOcgLrTidMa-mqBLuoA4JKPijBULQT3afMKK-IEpWLYZT7RdmP0yD-bqZYXVXSC58a3MRe7E30-VLt23IOrJKpRePE9Phycql1XImZTw41fASdk2OGR_Zv0mzquW-pyTYXx4ASPshhuOo1KmGqIqnjyMSRdvxs8qPxGgp1j-YNSlR44AlVLWIr4uLMMoVG1fIAqy_geuv5hEti_vLhbtuPgfn2htWCkUHsHAa22AHgs3Rnmx0veafFHhl3sLxVQBkPD-FeNUtPtpdkSdIXjpaDR2MfyD0KcV950aJ0RDaixpfB1bLGh2hne69QV82sGaMSAXGWsXbJ2nqLD9qEc7sjsXKLf9WaBekeL345eghjq_oILiOq37bX5_FCfLkTyqcKIVrKWwlTLW4mkitjLOhpz_Qv_DkmzTRLhs8MA-Rql9d8hbx2UY20GqKuoefdg2g8rLmUs-Eh7tf_3qL_5AhJzmkn7r5eITc7cYrzPauZCaMDND1oLDshynmP66x85CYuDeoQMUDzHzY7tfDTu800icce4z8IeKwweT0YEs2CMEK0LJqKrrrgqOmRlZCsp6IbRQOyqKGgUO3MiBod98tfSgG2WeElCY8jXoefzICVKOpwljRpsN_cg4fzu9r45o7TOK4gqre5v0sGQ-PcXwRrK7nKwFsTNEDWNWdfN1fERiGLyL-pyrt4ApPG4BL5l7cr_wab8MD_fFJsLiltPz3EiBD269qVaMoQ4QdEM1crOalfVftKjLSqzdJPanHfozCJWyCj7U9qMMJpbx0vKARysWD1tcym9--shTYS3qq9qLAZMESxHJwp6MN1W3RD7EcAkf_lL6E1oH0613WotOTMCNwzeyQW1E7wBl1Gx8N3iuI0va_c6uACBvkYaqZP-qBWi9QgoGtG_hJyWMk9kvSp_mXtA0hAoFpxBoFsLWwwRZ2ye0lGuXOuPSa9ijQzFoG9TM-1EbZLKYbZ0AFI7zbKKRVwDsKBOmisUBw_tRYMLgScgqA-0A4PgIhLh4Tj1W5Zf7h-NvLfrC80oIkqUqpGoxrJtPzv-fmqO6RZCDjq_9-RBKzWKF7YYDJq2LKzQVfPGeY_M6rSSauqoi0IwxM2YRrrtqJYH62tsOV7hHIX92TX6ZjT3jTBp5LClAvY7JDBlDeKxivW-PryESoaIFHN8JSNPStqWdfHIBYFDEwG-vjdmckFovi6khqUnFdcFK34ZGIF0jXE4dCQ_XFYp-o5zYP1OCJW-uJ03qBHP_AEE2VBBDLRh8DFANN3yV3IIBLZF5LnshGtx1-5S_uupoxkcVgtHFXzdVOT7CIIJMcyuhuOq8nj2H2QWTnaOkW5ys740unQIbwgex2poN5BXci5vbZfVUTR7zQ9YH2UNUp6e6RpZxfi6xERtREzbI0ZZco9JkPuCzuQxopc2_lYGsA_6spUz1ThSEYzo8',
      _detached: false,
      _loaderId: '5A6272CC033143A080740DF35201C098',
      _lifecycleEvents: [Set],
      _frameManager: [Circular *2],
      _parentFrame: null,
      _id: '4495B69B7FE65767185E02151B82D1F9',
      _mainWorld: [DOMWorld],
      _secondaryWorld: [DOMWorld],
      _childFrames: Set(0) {},
      _name: undefined
    }
  }
}
undefined
1 null
TypeError: Cannot read property 'waitForSelector' of null
    at performSolveCaptcha (C:\test\script_main.js:1616:43)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async performLogin (C:\test\script_main.js:615:3)
    at async C:\test\script_main.js:1825:25

как я подключаюсь к браузеру:

(async () => {
    const wsFromArgs = process.argv[2];
    if (wsFromArgs) {
        config.wschrome = wsFromArgs;
        logToFile(`Использую WebSocket URL из аргументов: ${config.wschrome}`);
    }
    const processingMode = config.processingMode || 'delete';
    logToFile(`Режим обработки аккаунтов: ${processingMode}`);
    
    let browser = null;
    try {
        browser = await puppeteer.connect({ browserWSEndpoint: config.wschrome });

        const pages = await browser.pages();
        const page = pages.length > 0 ? pages[0] : await browser.newPage();
        const viewportWidth = 800;
        const viewportHeight = 800;
        await page.setViewport({ width: viewportWidth, height: viewportHeight });

после "1 null" я ловлю ошибку и закрываю скрипт

как мне встроить токен на сайт? получаю ответный токен без проблем

puppeteer ver - 10.9.2. chromium v135.0.7049.42 32bit


Ответы (0 шт):