{"id":452537,"date":"2025-03-21T09:00:45","date_gmt":"2025-03-21T09:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=452537"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=452537","title":{"rendered":"<span>K\u0430\u043a \u043e\u0431\u043e\u0439\u0442\u0438 \u043a\u0430\u043f\u0447\u0443 \u0421loudflare Turnsile \u2014 \u0438\u043b\u0438 \u043e\u0431\u0445\u043e\u0434 Cloudflare \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043a\u0430\u043f\u0447\u0438, \u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c &#8212; \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u0443\u043c\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430 \u043c\u0435\u043d\u044f \u043a\u043e\u0434. \u0414\u0430, \u0442\u0430\u043c \u0431\u044b\u043b\u043e \u043a\u0443\u0447\u0430 &#8212; \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0439\u0442\u0435 \u044d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043d\u043e\u0440\u043c\u044b, \u0431\u043b\u0430 \u0431\u043b\u0430 \u0431\u043b\u0430\u2026 \u041d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8212; \u0447\u0443\u0432\u0430\u043a, \u044f \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u0432\u0441\u0435 \u0440\u0435\u0448\u0438\u043b\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/e9c\/895\/c44\/e9c895c44e2c4ed409cff042592207db.jpg\" width=\"736\" height=\"828\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e9c\/895\/c44\/e9c895c44e2c4ed409cff042592207db.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u042f \u043f\u043e\u0448\u0435\u043b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <a href=\"https:\/\/solvecaptcha.com\/ru\/captcha-solver-api#solving_cloudflare_turnstile\" rel=\"noopener noreferrer nofollow\">Cloudflare Turnstile \u043a\u0430\u043f\u0447\u0438<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u043a\u0430\u043f\u0447\u0438 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u043f\u0435\u0440\u0432\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0447\u0442\u043e \u0437\u0430 Turnstile \u0442\u0430\u043a\u0430\u044f, \u043a\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432 \u0442\u0435\u043c\u0435:<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Turnsile CAPTCHA \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u0431\u0445\u043e\u0434 Cloudflare Turnstile \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043d\u043e\u0437\u043e\u0439 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435?<\/h3>\n<p>Turnstile \u2014 \u044d\u0442\u043e CAPTCHA-\u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Cloudflare, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432 \u043e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0431\u043e\u0442\u043e\u0432) \u0431\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0437\u0430\u0449\u0438\u0442\u044b \u043f\u0440\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442. \u0412 \u0440\u044f\u0434\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.\u00a0<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0430 \u0442\u0438\u043f\u0430 Turnstile \u043a\u0430\u043f\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u0431\u0445\u043e\u0434\u0438\u043b, \u0438\u043c\u0435\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0441\u044f\u0437\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434.<\/p>\n<p>\u0423 Turnstile CAPTCHA \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u0439 reCAPTCHA \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<p>\u00a0<strong>Challenge CAPTCHA<\/strong> \u2014 \u044d\u0442\u043e \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f CAPTCHA, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435 \u0434\u0430\u044e\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e \u0442\u043e\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c. \u0422\u0430\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u0430\u0449\u0438\u0442\u044b, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u043a \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u043a\u0430\u0436\u0443 \u0442\u0430\u043a &#8212; \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u0430\u043f\u0447\u0443 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 html \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e sitekey (\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0432\u0438\u0448 ctrl + F \u0438\u0449\u0435\u043c sitekey \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435). \u0410 \u0432\u043e\u0442 \u0441\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u043f\u0440\u043e\u043a\u0430\u0442\u0438\u0442, \u0442\u0443\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0435\u043d\u0435\u0440\u044f\u0442\u0441\u044f \u0432 JS \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0445 \u043d\u0435 \u0440\u0430\u0441\u043a\u043e\u043f\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u0430 \u044d\u0442\u043e \u0443\u0436\u0435 \u0447\u0442\u043e \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435).<\/p>\n<p>\u042f \u043f\u043e\u0448\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0435\u043c, \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u0434\u0432\u0430 URL, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u044f Turnstile CAPTCHA, \u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u0430\u044f.<\/p>\n<p><a href=\"https:\/\/privacy.deepsync.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/privacy.deepsync.com\/<\/a> &#8212; \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u044f<br \/><a href=\"https:\/\/crash.chicagopolice.org\/\" rel=\"noopener noreferrer nofollow\">https:\/\/crash.chicagopolice.org\/<\/a> &#8212; \u0442\u0443\u0442 \u0441\u043b\u043e\u0436\u043d\u0430\u044f<\/p>\n<h3>\u041f\u0440\u043e\u0441\u0442\u0430\u044f Turnstile CAPTCHA \u0438\u043b\u0438 \u043e\u0431\u0445\u043e\u0434 Cloudflare \u043d\u0430 Python \u0431\u0435\u0437 \u043c\u0430\u043c, \u043f\u0430\u043f \u0438 \u0431\u0430\u0431\u0443\u0448\u043a\u0438\u043d\u044b\u0445 \u0441\u043e\u0432\u0435\u0442\u043e\u0432\u00a0<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0430\u043f\u0447\u0435\u0439 &#8212; \u044f \u043d\u0430\u0431\u0440\u0430\u043b \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a\u0435 &#8212; \u0440\u0435\u0448\u0438\u0442\u044c Turnstile CAPTCHA \u0438 \u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 <a href=\"https:\/\/2captcha.com\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043f\u0447\u0438<\/a>, \u0432 \u0410\u041f\u0418 \u0431\u044b\u043b\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441 &#8212; \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u043b \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<pre><code class=\"python\">import argparse import requests import time   from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC   def get_turnstile_solution(api_key, site_key, page_url):     \"\"\"     \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 Turnstile CAPTCHA \u0447\u0435\u0440\u0435\u0437 2captcha \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.     \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f (str) \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.     \"\"\"     in_url = 'http:\/\/2captcha.com\/in.php'     payload = {         'key': api_key,         'method': 'turnstile',         'sitekey': site_key,         'pageurl': page_url,         'json': 1     }         try:         response = requests.post(in_url, data=payload)         result = response.json()     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a 2captcha:\", e)         return None       if result.get('status') != 1:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438:\", result.get('request'))         return None       captcha_id = result.get('request')     print(\"\u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430, ID:\", captcha_id)       # \u041e\u043f\u0440\u043e\u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 2captcha \u043a\u0430\u0436\u0434\u044b\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434     res_url = 'http:\/\/2captcha.com\/res.php'     params = {         'key': api_key,         'action': 'get',         'id': captcha_id,         'json': 1     }       while True:         time.sleep(5)         try:             res_response = requests.get(res_url, params=params)             res_result = res_response.json()         except Exception as e:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:\", e)             return None           if res_result.get('status') == 1:             solution_token = res_result.get('request')             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e:\", solution_token)             return solution_token         elif res_result.get('request') == \"CAPCHA_NOT_READY\":             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430...\")             continue         else:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f:\", res_result.get('request'))             return None   def main():     parser = argparse.ArgumentParser(         description='\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f Turnstile CAPTCHA \u0447\u0435\u0440\u0435\u0437 2captcha.'     )     parser.add_argument('api_key', type=str, nargs='?', help='\u0412\u0430\u0448 API \u043a\u043b\u044e\u0447 \u043e\u0442 2captcha')     parser.add_argument('url', type=str, nargs='?', help='URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0438 Turnstile CAPTCHA')     args = parser.parse_args()       if not args.api_key:         args.api_key = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448 API \u043a\u043b\u044e\u0447 \u043e\u0442 2captcha: \")     if not args.url:         args.url = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 CAPTCHA: \")       # 1) \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Selenium \u0432 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (\u0431\u0435\u0437 headless),     #    \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441     chrome_options = Options()     driver = webdriver.Chrome(options=chrome_options)     driver.get(args.url)       wait = WebDriverWait(driver, 30)       try:         # 2) \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c .cf-turnstile         turnstile_div = wait.until(             EC.presence_of_element_located((By.CSS_SELECTOR, \".cf-turnstile\"))         )     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c .cf-turnstile:\", e)         driver.quit()         return       # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c sitekey \u0438\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 data-sitekey     site_key = turnstile_div.get_attribute(\"data-sitekey\")     print(\"\u041d\u0430\u0439\u0434\u0435\u043d sitekey:\", site_key)       # ----- \u0428\u0430\u0433 1: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b -----     try:         # \u041f\u0440\u0438\u043c\u0435\u0440: \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \"A deceased individual\"         select_request_type = Select(driver.find_element(By.ID, \"request_type\"))         select_request_type.select_by_value(\"deceased\")                   # \u0418\u043c\u044f, \u0444\u0430\u043c\u0438\u043b\u0438\u044f         driver.find_element(By.ID, \"first_name\").send_keys(\"John\")         driver.find_element(By.ID, \"last_name\").send_keys(\"Doe\")                 # Email, \u0442\u0435\u043b\u0435\u0444\u043e\u043d         driver.find_element(By.ID, \"email\").send_keys(\"test@example.com\")         driver.find_element(By.ID, \"phone\").send_keys(\"1234567890\")                 # \u0410\u0434\u0440\u0435\u0441         driver.find_element(By.ID, \"who_address\").send_keys(\"123 Test Street\")         driver.find_element(By.ID, \"who_address2\").send_keys(\"Apt 4\")         driver.find_element(By.ID, \"who_city\").send_keys(\"Test City\")                 select_state = Select(driver.find_element(By.ID, \"who_state\"))         select_state.select_by_value(\"CA\")  # California                 driver.find_element(By.ID, \"who_zip\").send_keys(\"90001\")                 # \u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b \"Requests\"         driver.find_element(By.ID, \"request_type_1\").click()  # Do not sell\/share my personal information         driver.find_element(By.ID, \"request_type_2\").click()  # Do not use my personal data for targeted advertising         # ... \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438                 print(\"\u041f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\")     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b:\", e)         driver.quit()         return       # ----- \u0428\u0430\u0433 2: \u0420\u0435\u0448\u0430\u0435\u043c CAPTCHA \u0447\u0435\u0440\u0435\u0437 2captcha -----     token = get_turnstile_solution(args.api_key, site_key, args.url)     if not token:         print(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA.\")         driver.quit()         return       # ----- \u0428\u0430\u0433 3: \u041f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0432\u044b\u0437\u043e\u0432 callback -----     try:         # \u0418\u0449\u0435\u043c \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 Turnstile \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430         input_field = wait.until(             EC.presence_of_element_located(                 (By.CSS_SELECTOR, 'input#cf-chl-widget-yi26c_response, input[name=\"cf-turnstile-response\"]')             )         )         # \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d         driver.execute_script(\"arguments[0].value = arguments[1];\", input_field, token)         print(\"\u0422\u043e\u043a\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f CAPTCHA \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435.\")           # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 'change'         driver.execute_script(\"\"\"             var event = new Event('change', { bubbles: true });             arguments[0].dispatchEvent(event);         \"\"\", input_field)           # \u0415\u0441\u043b\u0438 \u0441\u0430\u0439\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f Turnstile, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c         driver.execute_script(\"\"\"             if (window.tsCallback) {                 window.tsCallback(arguments[0]);             }         \"\"\", token)         print(\"Callback \u0432\u044b\u0437\u0432\u0430\u043d (\u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d).\")       except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 CAPTCHA:\", e)         driver.quit()         return       # ----- \u0428\u0430\u0433 4: \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f -----     try:         submit_button = wait.until(             EC.element_to_be_clickable((By.ID, \"submit_button\"))         )         submit_button.click()         print(\"\u041a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 'Submit' \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d.\")           # \u041e\u0436\u0438\u0434\u0430\u0435\u043c, \u0447\u0442\u043e URL \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438         wait.until(EC.url_changes(args.url))         print(\"\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d. \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL:\", driver.current_url)       except Exception as e:         print(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0436\u0430\u0442\u044c 'Submit' \u0438\u043b\u0438 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430:\", e)       print(\"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u041e\u043a\u043d\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\")     input(\"\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Enter, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440...\")     driver.quit()   if __name__ == '__main__':     main() <\/code><\/pre>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0432 \u044d\u0442\u043e\u043c \u0432\u0441\u0435\u043c, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0448\u044c \u0432\u0441\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0448\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0421\u0435\u043b\u0435\u043d\u0438\u0443\u043c, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 requests, \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438<\/p>\n<pre><code class=\"python\">pip install selenium requests<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441 &#8212; \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 (\u0443\u043a\u0430\u0437\u0430\u043d \u0432\u044b\u0448\u0435), \u0438 \u043e\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043f\u0447\u0443, \u043d\u043e \u0438 \u0432\u0432\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435.<\/p>\n<h3>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 Turnstile Cloudflare &#8212; \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440<\/h3>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e argparse \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 API-\u043a\u043b\u044e\u0447 \u0434\u043b\u044f 2captcha \u0438 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f CAPTCHA. \u0421\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u043e\u0441\u0438\u0442 \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0440\u0443\u043a\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 (\u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e)<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440 (\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u0435 headless \u0440\u0435\u0436\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442) \u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c WebDriverWait \u0441\u043a\u0440\u0438\u043f\u0442 \u0436\u0434\u0451\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c .cf-turnstile, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 CAPTCHA.<\/p>\n<p>\u0418\u0437 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442 data-sitekey \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 CAPTCHA.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 (\u044d\u0442\u043e \u043d\u0430\u043c \u043c\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043e\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 2\u043a\u0430\u043f\u0447\u0438 \u0433\u0434\u0435 \u043a\u0430\u043f\u0447\u0430 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u0442\u043e\u043a\u043a\u0435\u043d) \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0442 \u0435\u0433\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043b.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0438\u0449\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0442\u043e\u043a\u0435\u043d (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f CSS-\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u043e\u043b\u044f \u0441 \u0438\u043c\u0435\u043d\u0435\u043c cf-turnstile-response \u0438\u043b\u0438 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c ID).<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e execute_script \u0442\u043e\u043a\u0435\u043d \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0438 \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435 change, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, window.tsCallback), \u043e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e \u0442\u043e\u043c, \u0447\u0442\u043e CAPTCHA \u0440\u0435\u0448\u0435\u043d\u0430.<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u0430\u043f\u0447\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0439, \u0441\u043a\u0440\u0438\u043f\u0442 \u0435\u0435 \u0436\u043c\u0435\u0442. \u0412 \u0446\u0435\u043b\u043e\u043c \u0432\u0441\u0435, \u043d\u0438\u0436\u0435 \u0432\u0438\u0434\u0435\u043e \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/67dd205a6d3815ba95da1558\" data-style=\"\" id=\"67dd205a6d3815ba95da1558\" width=\"\"><\/div>\n<p>\u0414\u0430\u0431\u044b \u0431\u044b\u043b \u0432\u044b\u0431\u043e\u0440, \u0438 \u043d\u0435 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u043e\u043f\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0437\u0430 2\u043a\u0430\u043f\u0447\u0443, \u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0434 SolveCaptcha &#8212; \u0431\u043b\u0430\u0433\u043e \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u0432\u043e\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0442\u0443\u0442 \u0443\u0436\u0435 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 SolveCaptcha.<\/p>\n<pre><code class=\"python\">import argparse import requests import time   from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC   def get_turnstile_solution(api_key, site_key, page_url):     \"\"\"     \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 Turnstile CAPTCHA \u0447\u0435\u0440\u0435\u0437 solvecaptcha \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.     \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f (str) \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.     \"\"\"     # URL \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 solvecaptcha     in_url = 'https:\/\/api.solvecaptcha.com\/in.php'     payload = {         'key': api_key,         'method': 'turnstile',         'sitekey': site_key,         'pageurl': page_url,         'json': 1     }         try:         response = requests.post(in_url, data=payload)         result = response.json()     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a solvecaptcha:\", e)         return None       if result.get('status') != 1:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438:\", result.get('request'))         return None       captcha_id = result.get('request')     print(\"\u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430, ID:\", captcha_id)       # \u041e\u043f\u0440\u043e\u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 solvecaptcha \u043a\u0430\u0436\u0434\u044b\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434     res_url = 'https:\/\/api.solvecaptcha.com\/res.php'     params = {         'key': api_key,         'action': 'get',         'id': captcha_id,         'json': 1     }       while True:         time.sleep(5)         try:             res_response = requests.get(res_url, params=params)             res_result = res_response.json()         except Exception as e:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:\", e)             return None           if res_result.get('status') == 1:             solution_token = res_result.get('request')             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e:\", solution_token)             return solution_token         elif res_result.get('request') == \"CAPCHA_NOT_READY\":             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430...\")             continue         else:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f:\", res_result.get('request'))             return None   def main():     parser = argparse.ArgumentParser(         description='\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f Turnstile CAPTCHA \u0447\u0435\u0440\u0435\u0437 solvecaptcha.'     )     parser.add_argument('api_key', type=str, nargs='?', help='\u0412\u0430\u0448 API \u043a\u043b\u044e\u0447 \u043e\u0442 solvecaptcha')     parser.add_argument('url', type=str, nargs='?', help='URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0438 Turnstile CAPTCHA')     args = parser.parse_args()       if not args.api_key:         args.api_key = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448 API \u043a\u043b\u044e\u0447 \u043e\u0442 solvecaptcha: \")     if not args.url:         args.url = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 CAPTCHA: \")       # 1) \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Selenium \u0432 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (\u0431\u0435\u0437 headless),     #    \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441     chrome_options = Options()     driver = webdriver.Chrome(options=chrome_options)     driver.get(args.url)       wait = WebDriverWait(driver, 30)       try:         # 2) \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c .cf-turnstile         turnstile_div = wait.until(             EC.presence_of_element_located((By.CSS_SELECTOR, \".cf-turnstile\"))         )     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c .cf-turnstile:\", e)         driver.quit()         return       # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c sitekey \u0438\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 data-sitekey     site_key = turnstile_div.get_attribute(\"data-sitekey\")     print(\"\u041d\u0430\u0439\u0434\u0435\u043d sitekey:\", site_key)       # ----- \u0428\u0430\u0433 1: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b -----     try:         # \u041f\u0440\u0438\u043c\u0435\u0440: \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \"A deceased individual\"         select_request_type = Select(driver.find_element(By.ID, \"request_type\"))         select_request_type.select_by_value(\"deceased\")                   # \u0418\u043c\u044f, \u0444\u0430\u043c\u0438\u043b\u0438\u044f         driver.find_element(By.ID, \"first_name\").send_keys(\"John\")         driver.find_element(By.ID, \"last_name\").send_keys(\"Doe\")                 # Email, \u0442\u0435\u043b\u0435\u0444\u043e\u043d         driver.find_element(By.ID, \"email\").send_keys(\"test@example.com\")         driver.find_element(By.ID, \"phone\").send_keys(\"1234567890\")                 # \u0410\u0434\u0440\u0435\u0441         driver.find_element(By.ID, \"who_address\").send_keys(\"123 Test Street\")         driver.find_element(By.ID, \"who_address2\").send_keys(\"Apt 4\")         driver.find_element(By.ID, \"who_city\").send_keys(\"Test City\")                 select_state = Select(driver.find_element(By.ID, \"who_state\"))         select_state.select_by_value(\"CA\")  # California                 driver.find_element(By.ID, \"who_zip\").send_keys(\"90001\")                 # \u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b \"Requests\"         driver.find_element(By.ID, \"request_type_1\").click()  # Do not sell\/share my personal information         driver.find_element(By.ID, \"request_type_2\").click()  # Do not use my personal data for targeted advertising         # ... \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438                 print(\"\u041f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\")     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b:\", e)         driver.quit()         return       # ----- \u0428\u0430\u0433 2: \u0420\u0435\u0448\u0430\u0435\u043c CAPTCHA \u0447\u0435\u0440\u0435\u0437 solvecaptcha -----     token = get_turnstile_solution(args.api_key, site_key, args.url)     if not token:         print(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA.\")         driver.quit()         return       # ----- \u0428\u0430\u0433 3: \u041f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0432\u044b\u0437\u043e\u0432 callback -----     try:         # \u0418\u0449\u0435\u043c \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 Turnstile \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430         input_field = wait.until(             EC.presence_of_element_located(                 (By.CSS_SELECTOR, 'input#cf-chl-widget-yi26c_response, input[name=\"cf-turnstile-response\"]')             )         )         # \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d         driver.execute_script(\"arguments[0].value = arguments[1];\", input_field, token)         print(\"\u0422\u043e\u043a\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f CAPTCHA \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435.\")           # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 'change'         driver.execute_script(\"\"\"             var event = new Event('change', { bubbles: true });             arguments[0].dispatchEvent(event);         \"\"\", input_field)           # \u0415\u0441\u043b\u0438 \u0441\u0430\u0439\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f Turnstile, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c         driver.execute_script(\"\"\"             if (window.tsCallback) {                 window.tsCallback(arguments[0]);             }         \"\"\", token)         print(\"Callback \u0432\u044b\u0437\u0432\u0430\u043d (\u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d).\")       except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 CAPTCHA:\", e)         driver.quit()         return       # ----- \u0428\u0430\u0433 4: \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f -----     try:         submit_button = wait.until(             EC.element_to_be_clickable((By.ID, \"submit_button\"))         )         submit_button.click()         print(\"\u041a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 'Submit' \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d.\")           # \u041e\u0436\u0438\u0434\u0430\u0435\u043c, \u0447\u0442\u043e URL \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438         wait.until(EC.url_changes(args.url))         print(\"\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d. \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL:\", driver.current_url)       except Exception as e:         print(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0436\u0430\u0442\u044c 'Submit' \u0438\u043b\u0438 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430:\", e)       print(\"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u041e\u043a\u043d\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\")     input(\"\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Enter, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440...\")     driver.quit()   if __name__ == '__main__':     main() <\/code><\/pre>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u0410\u041f\u0418 \u043a\u043b\u044e\u0447 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0410\u041f\u0418 <a href=\"https:\/\/solvecaptcha.com\/\" rel=\"noopener noreferrer nofollow\">SolveCaptcha<\/a>.<\/p>\n<h3>\u0421\u043b\u043e\u0436\u043d\u044b\u0439 \u0442\u0438\u043f Turnstile CAPTCHA &#8212; \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u0445\u043e\u0434 Cloudflare \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0437\u0430\u043d\u043e\u0437\u043e\u0439 \u0438 \u043f\u0440\u0438 \u0447\u0435\u043c \u0442\u0443\u0442 node.js?<\/h3>\n<p>\u0421\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u0432\u0438\u0434\u043e\u043c Turnstile CAPTCHA \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u044f\u043c \u043f\u043e\u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0439 \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u043e\u0433 \u0432\u044b\u043a\u0430\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 Python, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0447\u0442\u043e \u0442\u043e \u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0438 \u0447\u0435\u0433\u043e \u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e.<\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435, \u0438 \u0438\u0434\u0442\u0438 \u0441\u043d\u043e\u0432\u0430 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f15\/1d0\/6e5\/f151d06e5e6da90e8ef6ab9d588f1795.png\" width=\"1273\" height=\"703\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f15\/1d0\/6e5\/f151d06e5e6da90e8ef6ab9d588f1795.png\"\/><\/figure>\n<p>\u041d\u0430\u0433\u0443\u0433\u043b\u0438\u043b \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u043f\u043e &#8212; <a href=\"https:\/\/github.com\/2captcha\/cloudflare-demo\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/2captcha\/cloudflare-demo<\/a><\/p>\n<p>\u0427\u0442\u043e \u0442\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0448\u044c \u043c\u0430\u043b\u044c\u0447\u0438\u0448\u043a\u0430? \u0414\u0430, \u0435\u043b\u043a\u0438-\u043f\u0430\u043b\u043a\u0438, \u0441\u043d\u043e\u0432\u0430 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0435\u0440\u0432\u0438\u0441 &#8212; \u043d\u043e \u044f \u0436\u0435 \u043d\u0435 \u0432\u0438\u043d\u043e\u0432\u0430\u0442, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0442\u044e\u0433\u0430!<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0442\u043e \u044f \u043d\u0430\u0433\u0443\u0433\u043b\u0438\u043b, \u0438 \u043e\u043d \u0434\u0430\u0436\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0439 &#8212; \u0442\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435<br \/>\u00a0 \u00a0 page.goto(&#8216;<a href=\"https:\/\/2captcha.com\/demo\/cloudflare-turnstile-challenge')%EF%BF%BC%D0%A3%D0%A0%D0%9B\" rel=\"noopener noreferrer nofollow\">https:\/\/2captcha.com\/demo\/cloudflare-turnstile-challenge&#8217;)<br \/>\u0423\u0420\u041b<\/a>, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u044e\u0447 \u0410\u041f\u0418 \u0438 \u0432\u0441\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 Python, \u0430 \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 node.js<\/p>\n<p>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/dad\/f20\/ca1\/dadf20ca1c14de7abc01e972ccc5241c.jpg\" width=\"1000\" height=\"417\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dad\/f20\/ca1\/dadf20ca1c14de7abc01e972ccc5241c.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u042f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0431\u0435\u0437\u0434\u043e\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u043d\u043e\u0434\u0443\u043c\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 Python.<\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0435\u043c &#8212; \u0447\u0435\u0440\u0435\u0437 \u041f\u0443\u043f\u0438\u0442\u0440 (\u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f &#8212; \u201c\u042d\u0442\u043e \u0436\u0438\u0434\u043a\u0438\u0439 \u0441\u0442\u0443\u043b \u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u201d), \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u2026 \u041d\u0438 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u043d\u0438 \u0434\u0430\u0436\u0435 \u0441 5 \u0440\u0430\u0437\u0430, \u0432\u0441\u0435 \u0431\u0435\u0437 \u0442\u043e\u043b\u043a\u0443.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Playwright, \u0438 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0443\u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u043a\u0430 \u0437\u0430\u0432\u0435\u043b\u0430\u0441\u044c, \u0434\u0430 \u043d\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430, \u043d\u043e \u0437\u0430\u0432\u0435\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0412\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442<\/p>\n<pre><code class=\"python\">import asyncio import json import re import os import time import requests from playwright.async_api import async_playwright   # \u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c API-\u043a\u043b\u044e\u0447 \u043f\u0440\u044f\u043c\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 API_KEY = \"\u0412\u0430\u0448 \u043a\u043b\u044e\u0447 \u0410\u041f\u0418\"   async def normalize_user_agent(playwright):     \"\"\"     \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 user agent \u0447\u0435\u0440\u0435\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0435\u0433\u043e.     \"\"\"     browser = await playwright.chromium.launch(headless=True)     context = await browser.new_context()     page = await context.new_page()     user_agent = await page.evaluate(\"() =&gt; navigator.userAgent\")     normalized = re.sub(r'Headless', '', user_agent)     normalized = re.sub(r'Chromium', 'Chrome', normalized)     await browser.close()     return normalized.strip()   def solve_turnstile(params, api_key):     \"\"\"     \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b CAPTCHA \u0432 2Captcha \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.     \"\"\"     base_url = 'http:\/\/2captcha.com'     in_params = {         'key': api_key,         'method': 'turnstile',         'sitekey': params.get('sitekey'),         'pageurl': params.get('pageurl'),         'data': params.get('data'),         'action': params.get('action'),         'userAgent': params.get('userAgent'),         'json': 1     }     if 'pagedata' in params:         in_params['pagedata'] = params.get('pagedata')         print(\"\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 CAPTCHA \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435...\")     r = requests.get(f\"{base_url}\/in.php\", params=in_params)     res_json = r.json()     if res_json.get('status') != 1:         raise Exception(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 CAPTCHA: \" + res_json.get('request'))     captcha_id = res_json.get('request')     print(f\"\u0417\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430, ID: {captcha_id}\")         # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u043b\u043b\u0438\u043d\u0433\u043e\u043c     time.sleep(10)     while True:         r = requests.get(f\"{base_url}\/res.php\", params={             'key': api_key,             'action': 'get',             'id': captcha_id,             'json': 1         })         res_json = r.json()         if res_json.get('status') == 1:             token = res_json.get('request')             print(f\"CAPTCHA \u0440\u0435\u0448\u0435\u043d\u0430, \u0442\u043e\u043a\u0435\u043d: {token}\")             return token         elif res_json.get('request') == 'CAPCHA_NOT_READY':             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e, \u043e\u0436\u0438\u0434\u0430\u0435\u043c 5 \u0441\u0435\u043a\u0443\u043d\u0434...\")             time.sleep(5)         else:             raise Exception(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 CAPTCHA: \" + res_json.get('request'))   async def handle_console(msg, page, captcha_future):     \"\"\"     \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c \"intercepted-params:\"     \u043f\u0430\u0440\u0441\u0438\u0442 JSON, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430 2Captcha \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d.     \"\"\"     text = msg.text     if \"intercepted-params:\" in text:         json_str = text.split(\"intercepted-params:\", 1)[1]         try:             params = json.loads(json_str)         except json.JSONDecodeError:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON \u0438\u0437 intercepted-params\")             return         print(\"\u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\", params)         api_key = API_KEY         if not api_key:             print(\"\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f APIKEY \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430.\")             await page.context.browser.close()             return         try:             token = solve_turnstile(params, api_key)             # \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u043e\u043a\u0435\u043d \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 callback             await page.evaluate(\"\"\"(token) =&gt; {                 window.cfCallback(token);             }\"\"\", token)             if not captcha_future.done():                 captcha_future.set_result(token)         except Exception as e:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 CAPTCHA:\", e)             if not captcha_future.done():                 captcha_future.set_exception(e)   async def main():     async with async_playwright() as p:         # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 user agent         user_agent = await normalize_user_agent(p)         print(\"\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 user agent:\", user_agent)                 # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441 \u0432\u0438\u0434\u0438\u043c\u044b\u043c \u043e\u043a\u043d\u043e\u043c         browser = await p.chromium.launch(headless=False)         context = await browser.new_context(user_agent=user_agent)                 # \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 inject.js         with open(\"inject.js\", \"r\", encoding=\"utf-8\") as f:             inject_script = f.read()         # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443         await context.add_init_script(script=inject_script)                 page = await context.new_page()                 # \u0421\u043e\u0437\u0434\u0430\u0451\u043c future \u0434\u043b\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f CAPTCHA         captcha_future = asyncio.Future()                 # \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439         page.on(\"console\", lambda msg: asyncio.create_task(handle_console(msg, page, captcha_future)))                 # \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443         await page.goto(\"https:\/\/crash.chicagopolice.org\/\")                 try:             token = await asyncio.wait_for(captcha_future, timeout=120)             print(\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d CAPTCHA \u0442\u043e\u043a\u0435\u043d:\", token)         except asyncio.TimeoutError:             print(\"\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f CAPTCHA \u0438\u0441\u0442\u0435\u043a\u043b\u043e\")         await browser.close()   if __name__ == \"__main__\":     asyncio.run(main()) <\/code><\/pre>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043f\u0430\u0440\u0435 \u0441 \u044d\u0442\u043e\u0439 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0435\u0439 (\u0441\u043e\u0431\u0441\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043e\u043d\u0430 \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0434\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443 \u043d\u0435\u0435 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435)<\/p>\n<pre><code class=\"python\">console.log('inject.js \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d'); console.clear = () =&gt; console.log('Console was cleared'); const i = setInterval(() =&gt; {     if (window.turnstile) {         console.log('\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d window.turnstile');         clearInterval(i);         const originalRender = window.turnstile.render;         window.turnstile.render = (a, b) =&gt; {             console.log('\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c window.turnstile.render');             let params = {                 sitekey: b.sitekey,                 pageurl: window.location.href,                 data: b.cData,                 pagedata: b.chlPageData,                 action: b.action,                 userAgent: navigator.userAgent,                 json: 1             };             console.log('intercepted-params:' + JSON.stringify(params));             window.cfCallback = b.callback;             \/\/ \u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443:             \/\/ return originalRender ? originalRender(a, b) : null;             return;         };     } }, 50); <\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 context.add_init_script. \u0415\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2013 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 window.turnstile.render, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 CAPTCHA.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u043a\u0430\u0436\u0434\u044b\u0435 50 \u043c\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 window.turnstile \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 params, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>sitekey: \u043a\u043b\u044e\u0447 \u0441\u0430\u0439\u0442\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 b.<\/p>\n<\/li>\n<li>\n<p>pageurl: \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<\/li>\n<li>\n<p>data: \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0438\u0437 b.cData).<\/p>\n<\/li>\n<li>\n<p>pagedata: \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u0438\u0437 b.chlPageData).<\/p>\n<\/li>\n<li>\n<p>action: \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>userAgent: \u0441\u0442\u0440\u043e\u043a\u0430 User Agent \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>json: \u0444\u043b\u0430\u0433 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043f\u0447\u0438, \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f \u043c\u0430\u0433\u0438\u044f, \u0447\u0442\u043e \u0438 \u0432 \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0430\u043f\u0447\u0435 &#8212; \u0432\u0441\u0435 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/67dd20f7fc0bb4a81629004a\" data-style=\"\" id=\"67dd20f7fc0bb4a81629004a\" width=\"\"><\/div>\n<p>\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u0430 \u043d\u0430 SolveCaptcha &#8212; \u0432\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c<\/p>\n<pre><code class=\"python\">import asyncio import json import re import os import time import requests from playwright.async_api import async_playwright   # \u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c API-\u043a\u043b\u044e\u0447 \u043f\u0440\u044f\u043c\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 API_KEY = \"\u0412\u0430\u0448 \u0410\u041f\u0418 \u043a\u043b\u044e\u0447\"   async def normalize_user_agent(playwright):     \"\"\"     \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 user agent \u0447\u0435\u0440\u0435\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0435\u0433\u043e.     \"\"\"     browser = await playwright.chromium.launch(headless=True)     context = await browser.new_context()     page = await context.new_page()     user_agent = await page.evaluate(\"() =&gt; navigator.userAgent\")     normalized = re.sub(r'Headless', '', user_agent)     normalized = re.sub(r'Chromium', 'Chrome', normalized)     await browser.close()     return normalized.strip()   def solve_turnstile(params, api_key):     \"\"\"     \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b CAPTCHA \u0432 solvecaptcha \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.     \"\"\"     base_url = 'https:\/\/api.solvecaptcha.com'     in_params = {         'key': api_key,         'method': 'turnstile',         'sitekey': params.get('sitekey'),         'pageurl': params.get('pageurl'),         'data': params.get('data'),         'action': params.get('action'),         'userAgent': params.get('userAgent'),         'json': 1     }     if 'pagedata' in params:         in_params['pagedata'] = params.get('pagedata')         print(\"\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 CAPTCHA \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 solvecaptcha...\")     r = requests.get(f\"{base_url}\/in.php\", params=in_params)     res_json = r.json()     if res_json.get('status') != 1:         raise Exception(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 CAPTCHA: \" + res_json.get('request'))     captcha_id = res_json.get('request')     print(f\"\u0417\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430, ID: {captcha_id}\")         # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u043b\u043b\u0438\u043d\u0433\u043e\u043c     time.sleep(10)     while True:         r = requests.get(f\"{base_url}\/res.php\", params={             'key': api_key,             'action': 'get',             'id': captcha_id,             'json': 1         })         res_json = r.json()         if res_json.get('status') == 1:             token = res_json.get('request')             print(f\"CAPTCHA \u0440\u0435\u0448\u0435\u043d\u0430, \u0442\u043e\u043a\u0435\u043d: {token}\")             return token         elif res_json.get('request') == 'CAPCHA_NOT_READY':             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e, \u043e\u0436\u0438\u0434\u0430\u0435\u043c 5 \u0441\u0435\u043a\u0443\u043d\u0434...\")             time.sleep(5)         else:             raise Exception(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 CAPTCHA: \" + res_json.get('request'))   async def handle_console(msg, page, captcha_future):     \"\"\"     \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c \"intercepted-params:\"     \u043f\u0430\u0440\u0441\u0438\u0442 JSON, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430 solvecaptcha \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d.     \"\"\"     text = msg.text     if \"intercepted-params:\" in text:         json_str = text.split(\"intercepted-params:\", 1)[1]         try:             params = json.loads(json_str)         except json.JSONDecodeError:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON \u0438\u0437 intercepted-params\")             return         print(\"\u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:\", params)         api_key = API_KEY         if not api_key:             print(\"\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f APIKEY \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430.\")             await page.context.browser.close()             return         try:             token = solve_turnstile(params, api_key)             # \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u043e\u043a\u0435\u043d \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 callback             await page.evaluate(\"\"\"(token) =&gt; {                 window.cfCallback(token);             }\"\"\", token)             if not captcha_future.done():                 captcha_future.set_result(token)         except Exception as e:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 CAPTCHA:\", e)             if not captcha_future.done():                 captcha_future.set_exception(e)   async def main():     async with async_playwright() as p:         # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 user agent         user_agent = await normalize_user_agent(p)         print(\"\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 user agent:\", user_agent)                 # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441 \u0432\u0438\u0434\u0438\u043c\u044b\u043c \u043e\u043a\u043d\u043e\u043c         browser = await p.chromium.launch(headless=False)         context = await browser.new_context(user_agent=user_agent)                 # \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 inject.js         with open(\"inject.js\", \"r\", encoding=\"utf-8\") as f:             inject_script = f.read()         # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443         await context.add_init_script(script=inject_script)                 page = await context.new_page()                 # \u0421\u043e\u0437\u0434\u0430\u0451\u043c future \u0434\u043b\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f CAPTCHA         captcha_future = asyncio.Future()                 # \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439         page.on(\"console\", lambda msg: asyncio.create_task(handle_console(msg, page, captcha_future)))                 # \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443         await page.goto(\"https:\/\/crash.chicagopolice.org\/\")                 try:             token = await asyncio.wait_for(captcha_future, timeout=120)             print(\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d CAPTCHA \u0442\u043e\u043a\u0435\u043d:\", token)         except asyncio.TimeoutError:             print(\"\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f CAPTCHA \u0438\u0441\u0442\u0435\u043a\u043b\u043e\")         await browser.close()   if __name__ == \"__main__\":     asyncio.run(main()) <\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u0430\u043a\u0436\u0435 &#8212; \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043a\u043b\u044e\u0447 \u0410\u041f\u0418 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c &#8212; \u0432 \u043d\u0430\u0448\u0443 \u044d\u043f\u043e\u0445\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0431\u043e\u043b\u044c\u0448\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u043c \u0442\u043e \u044d\u043a\u0441\u0442\u0440\u0430\u043e\u0440\u0434\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u0438 \u043f\u0440\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 &#8212; \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u043c\u0443\u0447\u0438\u0442\u044c \u0438 \u0431\u0435\u0437 \u0442\u043e\u0433\u043e \u0437\u0430\u043c\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u043e\u0440\u0443\u043c\u0430\u0445, \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u041d\u0443 \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b \u0444\u043e\u0440\u0443\u043c\u043e\u0432 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0433\u0440\u0443\u0441\u0442\u0438\u0442\u044c, \u0432\u0435\u0434\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0433\u0435\u043d\u0435\u0440\u044f\u0442 \u0442\u043e\u043d\u043d\u0443 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/892986\/\"> https:\/\/habr.com\/ru\/articles\/892986\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043a\u0430\u043f\u0447\u0438, \u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c &#8212; \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u0443\u043c\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430 \u043c\u0435\u043d\u044f \u043a\u043e\u0434. \u0414\u0430, \u0442\u0430\u043c \u0431\u044b\u043b\u043e \u043a\u0443\u0447\u0430 &#8212; \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0439\u0442\u0435 \u044d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043d\u043e\u0440\u043c\u044b, \u0431\u043b\u0430 \u0431\u043b\u0430 \u0431\u043b\u0430\u2026 \u041d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8212; \u0447\u0443\u0432\u0430\u043a, \u044f \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u0432\u0441\u0435 \u0440\u0435\u0448\u0438\u043b\u0438.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u042f \u043f\u043e\u0448\u0435\u043b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <a href=\"https:\/\/solvecaptcha.com\/ru\/captcha-solver-api#solving_cloudflare_turnstile\" rel=\"noopener noreferrer nofollow\">Cloudflare Turnstile \u043a\u0430\u043f\u0447\u0438<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u043a\u0430\u043f\u0447\u0438 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u043f\u0435\u0440\u0432\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0447\u0442\u043e \u0437\u0430 Turnstile \u0442\u0430\u043a\u0430\u044f, \u043a\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432 \u0442\u0435\u043c\u0435:<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Turnsile CAPTCHA \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u0431\u0445\u043e\u0434 Cloudflare Turnstile \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043d\u043e\u0437\u043e\u0439 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435?<\/h3>\n<p>Turnstile \u2014 \u044d\u0442\u043e CAPTCHA-\u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Cloudflare, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432 \u043e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0431\u043e\u0442\u043e\u0432) \u0431\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0437\u0430\u0449\u0438\u0442\u044b \u043f\u0440\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442. \u0412 \u0440\u044f\u0434\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.\u00a0<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0430 \u0442\u0438\u043f\u0430 Turnstile \u043a\u0430\u043f\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u0431\u0445\u043e\u0434\u0438\u043b, \u0438\u043c\u0435\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0441\u044f\u0437\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434.<\/p>\n<p>\u0423 Turnstile CAPTCHA \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u0439 reCAPTCHA \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<p>\u00a0<strong>Challenge CAPTCHA<\/strong> \u2014 \u044d\u0442\u043e \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f CAPTCHA, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435 \u0434\u0430\u044e\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e \u0442\u043e\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c. \u0422\u0430\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u0430\u0449\u0438\u0442\u044b, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u043a \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u043a\u0430\u0436\u0443 \u0442\u0430\u043a &#8212; \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u0430\u043f\u0447\u0443 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 html \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e sitekey (\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0432\u0438\u0448 ctrl + F \u0438\u0449\u0435\u043c sitekey \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435). \u0410 \u0432\u043e\u0442 \u0441\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u043f\u0440\u043e\u043a\u0430\u0442\u0438\u0442, \u0442\u0443\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0435\u043d\u0435\u0440\u044f\u0442\u0441\u044f \u0432 JS \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0445 \u043d\u0435 \u0440\u0430\u0441\u043a\u043e\u043f\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u0430 \u044d\u0442\u043e \u0443\u0436\u0435 \u0447\u0442\u043e \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435).<\/p>\n<p>\u042f \u043f\u043e\u0448\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0435\u043c, \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u0434\u0432\u0430 URL, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u044f Turnstile CAPTCHA, \u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u0430\u044f.<\/p>\n<p><a href=\"https:\/\/privacy.deepsync.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/privacy.deepsync.com\/<\/a> &#8212; \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u044f<br \/><a href=\"https:\/\/crash.chicagopolice.org\/\" rel=\"noopener noreferrer nofollow\">https:\/\/crash.chicagopolice.org\/<\/a> &#8212; \u0442\u0443\u0442 \u0441\u043b\u043e\u0436\u043d\u0430\u044f<\/p>\n<h3>\u041f\u0440\u043e\u0441\u0442\u0430\u044f Turnstile CAPTCHA \u0438\u043b\u0438 \u043e\u0431\u0445\u043e\u0434 Cloudflare \u043d\u0430 Python \u0431\u0435\u0437 \u043c\u0430\u043c, \u043f\u0430\u043f \u0438 \u0431\u0430\u0431\u0443\u0448\u043a\u0438\u043d\u044b\u0445 \u0441\u043e\u0432\u0435\u0442\u043e\u0432\u00a0<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0430\u043f\u0447\u0435\u0439 &#8212; \u044f \u043d\u0430\u0431\u0440\u0430\u043b \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a\u0435 &#8212; \u0440\u0435\u0448\u0438\u0442\u044c Turnstile CAPTCHA \u0438 \u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 <a href=\"https:\/\/2captcha.com\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043f\u0447\u0438<\/a>, \u0432 \u0410\u041f\u0418 \u0431\u044b\u043b\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441 &#8212; \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u043b \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<pre><code class=\"python\">import argparse import requests import time   from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC   def get_turnstile_solution(api_key, site_key, page_url):     \"\"\"     \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 Turnstile CAPTCHA \u0447\u0435\u0440\u0435\u0437 2captcha \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.     \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f (str) \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.     \"\"\"     in_url = 'http:\/\/2captcha.com\/in.php'     payload = {         'key': api_key,         'method': 'turnstile',         'sitekey': site_key,         'pageurl': page_url,         'json': 1     }         try:         response = requests.post(in_url, data=payload)         result = response.json()     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a 2captcha:\", e)         return None       if result.get('status') != 1:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438:\", result.get('request'))         return None       captcha_id = result.get('request')     print(\"\u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430, ID:\", captcha_id)       # \u041e\u043f\u0440\u043e\u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 2captcha \u043a\u0430\u0436\u0434\u044b\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434     res_url = 'http:\/\/2captcha.com\/res.php'     params = {         'key': api_key,         'action': 'get',         'id': captcha_id,         'json': 1     }       while True:         time.sleep(5)         try:             res_response = requests.get(res_url, params=params)             res_result = res_response.json()         except Exception as e:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:\", e)             return None           if res_result.get('status') == 1:             solution_token = res_result.get('request')             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e:\", solution_token)             return solution_token         elif res_result.get('request') == \"CAPCHA_NOT_READY\":             print(\"\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430...\")             continue         else:             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f:\", res_result.get('request'))             return None   def main():     parser = argparse.ArgumentParser(         description='\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f Turnstile CAPTCHA \u0447\u0435\u0440\u0435\u0437 2captcha.'     )     parser.add_argument('api_key', type=str, nargs='?', help='\u0412\u0430\u0448 API \u043a\u043b\u044e\u0447 \u043e\u0442 2captcha')     parser.add_argument('url', type=str, nargs='?', help='URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0438 Turnstile CAPTCHA')     args = parser.parse_args()       if not args.api_key:         args.api_key = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448 API \u043a\u043b\u044e\u0447 \u043e\u0442 2captcha: \")     if not args.url:         args.url = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 CAPTCHA: \")       # 1) \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Selenium \u0432 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (\u0431\u0435\u0437 headless),     #    \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441     chrome_options = Options()     driver = webdriver.Chrome(options=chrome_options)     driver.get(args.url)       wait = WebDriverWait(driver, 30)       try:         # 2) \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c .cf-turnstile         turnstile_div = wait.until(             EC.presence_of_element_located((By.CSS_SELECTOR, \".cf-turnstile\"))         )     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c .cf-turnstile:\", e)         driver.quit()         return       # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c sitekey \u0438\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 data-sitekey     site_key = turnstile_div.get_attribute(\"data-sitekey\")     print(\"\u041d\u0430\u0439\u0434\u0435\u043d sitekey:\", site_key)       # ----- \u0428\u0430\u0433 1: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b -----     try:         # \u041f\u0440\u0438\u043c\u0435\u0440: \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \"A deceased individual\"         select_request_type = Select(driver.find_element(By.ID, \"request_type\"))         select_request_type.select_by_value(\"deceased\")                   # \u0418\u043c\u044f, \u0444\u0430\u043c\u0438\u043b\u0438\u044f         driver.find_element(By.ID, \"first_name\").send_keys(\"John\")         driver.find_element(By.ID, \"last_name\").send_keys(\"Doe\")                 # Email, \u0442\u0435\u043b\u0435\u0444\u043e\u043d         driver.find_element(By.ID, \"email\").send_keys(\"test@example.com\")         driver.find_element(By.ID, \"phone\").send_keys(\"1234567890\")                 # \u0410\u0434\u0440\u0435\u0441         driver.find_element(By.ID, \"who_address\").send_keys(\"123 Test Street\")         driver.find_element(By.ID, \"who_address2\").send_keys(\"Apt 4\")         driver.find_element(By.ID, \"who_city\").send_keys(\"Test City\")                 select_state = Select(driver.find_element(By.ID, \"who_state\"))         select_state.select_by_value(\"CA\")  # California                 driver.find_element(By.ID, \"who_zip\").send_keys(\"90001\")                 # \u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b \"Requests\"         driver.find_element(By.ID, \"request_type_1\").click()  # Do not sell\/share my personal information         driver.find_element(By.ID, \"request_type_2\").click()  # Do not use my personal data for targeted advertising         # ... \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438                 print(\"\u041f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\")     except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b:\", e)         driver.quit()         return       # ----- \u0428\u0430\u0433 2: \u0420\u0435\u0448\u0430\u0435\u043c CAPTCHA \u0447\u0435\u0440\u0435\u0437 2captcha -----     token = get_turnstile_solution(args.api_key, site_key, args.url)     if not token:         print(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 CAPTCHA.\")         driver.quit()         return       # ----- \u0428\u0430\u0433 3: \u041f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0432\u044b\u0437\u043e\u0432 callback -----     try:         # \u0418\u0449\u0435\u043c \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 Turnstile \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430         input_field = wait.until(             EC.presence_of_element_located(                 (By.CSS_SELECTOR, 'input#cf-chl-widget-yi26c_response, input[name=\"cf-turnstile-response\"]')             )         )         # \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d         driver.execute_script(\"arguments[0].value = arguments[1];\", input_field, token)         print(\"\u0422\u043e\u043a\u0435\u043d \u0440\u0435\u0448\u0435\u043d\u0438\u044f CAPTCHA \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0441\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435.\")           # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 'change'         driver.execute_script(\"\"\"             var event = new Event('change', { bubbles: true });             arguments[0].dispatchEvent(event);         \"\"\", input_field)           # \u0415\u0441\u043b\u0438 \u0441\u0430\u0439\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f Turnstile, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c         driver.execute_script(\"\"\"             if (window.tsCallback) {                 window.tsCallback(arguments[0]);             }         \"\"\", token)         print(\"Callback \u0432\u044b\u0437\u0432\u0430\u043d (\u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d).\")       except Exception as e:         print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 CAPTCHA:\", e)         driver.quit()         return       # ----- \u0428\u0430\u0433 4: \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f -----     try:         submit_button = wait.until(             EC.element_to_be_clickable((By.ID, \"submit_button\"))         )         submit_button.click()         print(\"\u041a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 'Submit' \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d.\")           # \u041e\u0436\u0438\u0434\u0430\u0435\u043c, \u0447\u0442\u043e URL \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438         wait.until(EC.url_changes(args.url))         print(\"\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d. \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL:\", driver.current_url)       except Exception as e:         print(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0436\u0430\u0442\u044c 'Submit' \u0438\u043b\u0438 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430:\", e)       print(\"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u041e\u043a\u043d\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\")     input(\"\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Enter, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440...\")     driver.quit()   if __name__ == '__main__':     main() <\/code><\/pre>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0432 \u044d\u0442\u043e\u043c<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-452537","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/452537","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=452537"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/452537\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=452537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=452537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=452537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}