try playwright stelth
This commit is contained in:
+3
-1
@@ -1,11 +1,13 @@
|
|||||||
dataclasses_json==0.5.7
|
dataclasses_json==0.5.7
|
||||||
firebase_admin==5.2.0
|
firebase_admin==5.2.0
|
||||||
pandas~=1.3.5
|
pandas~=1.3.5
|
||||||
playwright==1.23.0
|
playwright==1.25.0
|
||||||
dataclasses~=0.6
|
dataclasses~=0.6
|
||||||
pymongo==4.1.1
|
pymongo==4.1.1
|
||||||
|
anticaptchaofficial==1.0.43
|
||||||
oci~=2.54.1
|
oci~=2.54.1
|
||||||
XlsxWriter~=3.0.3
|
XlsxWriter~=3.0.3
|
||||||
|
playwright-stealth==1.0.5
|
||||||
boto3~=1.21.13
|
boto3~=1.21.13
|
||||||
openpyxl==3.0.9
|
openpyxl==3.0.9
|
||||||
google-cloud-firestore==2.4.0
|
google-cloud-firestore==2.4.0
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ import time
|
|||||||
import traceback
|
import traceback
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
|
from anticaptchaofficial.antigatetask import antigateTask
|
||||||
|
from playwright._impl._api_structures import SetCookieParam
|
||||||
|
from playwright_stealth import stealth_sync
|
||||||
|
|
||||||
from src import params, definitions
|
from src import params, definitions
|
||||||
from src.db.mongo_manager import MONGO_STORE_MANAGER
|
from src.db.mongo_manager import MONGO_STORE_MANAGER
|
||||||
from src.pojo.ModeEnum import ModeEnum
|
from src.pojo.ModeEnum import ModeEnum
|
||||||
@@ -53,6 +57,7 @@ class CommandorPage:
|
|||||||
mode: ModeEnum = ModeEnum.MANUAL, headless=False):
|
mode: ModeEnum = ModeEnum.MANUAL, headless=False):
|
||||||
self.otp_value = None
|
self.otp_value = None
|
||||||
self.is_finished = False
|
self.is_finished = False
|
||||||
|
self.current_context = None
|
||||||
self.contact = contact
|
self.contact = contact
|
||||||
self.contact.phone = self.contact.phone.replace(".0", "") # remove the .0 if the Excel format is not correct
|
self.contact.phone = self.contact.phone.replace(".0", "") # remove the .0 if the Excel format is not correct
|
||||||
self.logger = logging.getLogger("约会页面:" + str(self.contact.phone))
|
self.logger = logging.getLogger("约会页面:" + str(self.contact.phone))
|
||||||
@@ -119,26 +124,15 @@ class CommandorPage:
|
|||||||
|
|
||||||
def start_browser(self, proxy, pwright, device) -> Union[str, None]:
|
def start_browser(self, proxy, pwright, device) -> Union[str, None]:
|
||||||
try:
|
try:
|
||||||
self.browser = pwright.firefox.launch(headless=self.headless, timeout=PAGE_TIMEOUT, proxy=proxy)
|
self.browser = pwright.webkit.launch(headless=self.headless, timeout=PAGE_TIMEOUT, proxy=proxy)
|
||||||
# userAgent = random.choice(params.firefox_user_agent_list)
|
# userAgent = random.choice(params.firefox_user_agent_list)
|
||||||
simulated_mobile = pwright.devices[device]
|
simulated_mobile = pwright.devices[device]
|
||||||
userAgent = simulated_mobile['user_agent']
|
userAgent = simulated_mobile['user_agent']
|
||||||
print("user_agent is " + userAgent)
|
print("user_agent is " + userAgent)
|
||||||
# context = self.browser.new_context(**simulated_mobile, locale='fr-FR')
|
# context = self.browser.new_context(**simulated_mobile, locale='fr-FR')
|
||||||
context = self.browser.new_context(user_agent=userAgent, locale='fr-FR')
|
context = self.browser.new_context(**simulated_mobile, locale='fr-FR')
|
||||||
self.page = context.new_page()
|
self.current_context = context
|
||||||
# hide webdriver information
|
self.create_and_config_page(context)
|
||||||
self.page.add_init_script("""() => {
|
|
||||||
Object.defineProperty(navigator,'webdriver',{get: () => undefined});
|
|
||||||
Object.defineProperty(navigator, 'platform', {
|
|
||||||
get: () => {
|
|
||||||
return "iPhone";
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
self.page.on("load", self._on_page_loaded)
|
|
||||||
self.page.on("response", self.handle_response)
|
|
||||||
self.page.goto(RDV_URL, timeout=PAGE_TIMEOUT)
|
|
||||||
return self.page.content()
|
return self.page.content()
|
||||||
# self.browser = pwright.webkit.launch(headless=self.headless, timeout=PAGE_TIMEOUT, proxy=proxy)
|
# self.browser = pwright.webkit.launch(headless=self.headless, timeout=PAGE_TIMEOUT, proxy=proxy)
|
||||||
# self.logger.info("模拟设备: " + device)
|
# self.logger.info("模拟设备: " + device)
|
||||||
@@ -172,6 +166,22 @@ class CommandorPage:
|
|||||||
self.browser.close()
|
self.browser.close()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def create_and_config_page(self, context):
|
||||||
|
self.page = context.new_page()
|
||||||
|
stealth_sync(self.page)
|
||||||
|
# hide webdriver information
|
||||||
|
self.page.add_init_script("""() => {
|
||||||
|
Object.defineProperty(navigator,'webdriver',{get: () => undefined});
|
||||||
|
Object.defineProperty(navigator, 'platform', {
|
||||||
|
get: () => {
|
||||||
|
return "iPhone";
|
||||||
|
}});
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
self.page.on("load", self._on_page_loaded)
|
||||||
|
self.page.on("response", self.handle_response)
|
||||||
|
self.page.goto(RDV_URL, timeout=PAGE_TIMEOUT)
|
||||||
|
|
||||||
def handle_response(self, response):
|
def handle_response(self, response):
|
||||||
pattern = re.compile(REGEX_RDV_URL)
|
pattern = re.compile(REGEX_RDV_URL)
|
||||||
if pattern.match(response.url):
|
if pattern.match(response.url):
|
||||||
@@ -182,6 +192,34 @@ class CommandorPage:
|
|||||||
e = threading.Event()
|
e = threading.Event()
|
||||||
self._run(proxy)
|
self._run(proxy)
|
||||||
|
|
||||||
|
def solve_datadome_captcha(self):
|
||||||
|
print("solve_datadome_captcha")
|
||||||
|
solver = antigateTask()
|
||||||
|
solver.set_verbose(1)
|
||||||
|
solver.set_key("ede6a69396fc961af351e7c8ffda9059")
|
||||||
|
solver.set_website_url(RDV_URL)
|
||||||
|
solver.set_template_name("Anti-bot screen bypass")
|
||||||
|
solver.set_variables({
|
||||||
|
"css_selector": ".captcha__human__container"
|
||||||
|
})
|
||||||
|
result = solver.solve_and_return_solution()
|
||||||
|
if result != 0:
|
||||||
|
cookies, localStorage, fingerprint, url, domain = result["cookies"], result["localStorage"], result[
|
||||||
|
"fingerprint"], result["url"], result["domain"]
|
||||||
|
print("cookies: ", cookies)
|
||||||
|
print("localStorage: ", localStorage)
|
||||||
|
print("fingerprint: ", fingerprint)
|
||||||
|
print("url: " + url)
|
||||||
|
print("domain: " + domain)
|
||||||
|
# add cookies to playwright
|
||||||
|
cookie_list = []
|
||||||
|
cookie_list.append(SetCookieParam(name='datadome', value=cookies['datadome'], url=url))
|
||||||
|
self.page.context.add_cookies(cookie_list)
|
||||||
|
self.config_page_with_fingerprint(fingerprint)
|
||||||
|
self.page.reload()
|
||||||
|
else:
|
||||||
|
print("task finished with error " + solver.error_code)
|
||||||
|
|
||||||
def _on_page_loaded(self):
|
def _on_page_loaded(self):
|
||||||
# time.sleep(40000)
|
# time.sleep(40000)
|
||||||
self.logger.info("页面加载完毕")
|
self.logger.info("页面加载完毕")
|
||||||
@@ -198,6 +236,8 @@ class CommandorPage:
|
|||||||
self.get_errors()
|
self.get_errors()
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
self.logger.error(error)
|
self.logger.error(error)
|
||||||
|
# else:
|
||||||
|
# self.solve_datadome_captcha()
|
||||||
|
|
||||||
def on_document_loaded(self):
|
def on_document_loaded(self):
|
||||||
self.logger.info("on_document_loaded called")
|
self.logger.info("on_document_loaded called")
|
||||||
@@ -377,6 +417,17 @@ class CommandorPage:
|
|||||||
MONGO_STORE_MANAGER.insert_captcha_error_contact(self.contact)
|
MONGO_STORE_MANAGER.insert_captcha_error_contact(self.contact)
|
||||||
params.oracle_log_sender.send_captcha_error(self.contact)
|
params.oracle_log_sender.send_captcha_error(self.contact)
|
||||||
|
|
||||||
|
def config_page_with_fingerprint(self, fingerprint):
|
||||||
|
self.page.add_init_script("""() => {
|
||||||
|
Object.defineProperty(navigator,'webdriver',{get: () => undefined});
|
||||||
|
Object.defineProperty(navigator, 'platform', {
|
||||||
|
get: () => {
|
||||||
|
return "iPhone";
|
||||||
|
}});
|
||||||
|
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
|
||||||
def on_success(result: ReserveResultPojo):
|
def on_success(result: ReserveResultPojo):
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user