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