import json import random import re from typing import Union import requests from models.jsdata_le_pojo import JsDataLeTypePojo from models.jsdata_pojo import JsDataPojo from utils.get_only_datadome_cookies import get_datadome_cookies, get_app_cookies, get_lang_cookies, \ retain_only_dataome_cookies from workers.proxies_constants import PROXY_LIST_FR API_KEY = "d66aaf490d8aa424a5175e1fbd1aadea" HOST_ADDRESS = "https://api.2captcha.com/createTask" HERMES_REGISTER = "https://rendezvousparis.hermes.com/client/register" class CaptchaResultGetter: def __init__(self): self.client_key = API_KEY self.user_agent = 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36' self.cookie_str = 'datadome=5Nq~NEP_qQSHC0g_lZNnZmEv36J8gVV~rpZ329xmCkTq2~H3meIoXr4h_b988qB2XW5Te7iEGsvq8BzA5KeFupyrZFh4kgrDyl8hT2UymSByKHzAcDaNIBPDsRu2g_KG; Max-Age=31536000; Domain=.hermes.com; Path=/; Secure; SameSite=None' pass def get_csrf(self, proxy_to_use, js_data: JsDataPojo, cookie: str = None) -> Union[str, None]: if cookie is not None: headers = {'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': js_data.ua, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', 'Referer': 'https://www.google.fr', 'Cookie': cookie, 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Dest': 'document', 'Accept-Language': 'fr-FR,fr;q=0.6'} else: headers = {'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': js_data.ua, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', 'Referer': 'https://www.google.fr', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Dest': 'document', 'Accept-Language': 'fr-FR,fr;q=0.6'} print("received cookie is " + str(cookie)) print(proxy_to_use) try: response = requests.get(url=HERMES_REGISTER, headers=headers, verify=False, proxies=proxy_to_use, timeout=15) print(response.status_code) if response.status_code == 200: # print(response.text) print(response.url) return self.extract_csrf_from_html(response.text) else: return None except Exception as error: print(error) def extract_csrf_from_html(self, html: str) -> Union[str, None]: result = re.findall(r'_csrf" value="[A-Za-z0-9-_]+', html) if len(result) > 0: result_list = result[0].replace("\"", "").split("=") print(result_list) return result_list[-1] return None def get_le_valid_cookie(self, proxy_to_use, js_le_type_data: JsDataLeTypePojo, old_valid_cookie: str) -> Union[ str, None]: headers = {'content-Type': 'application/x-www-form-urlencoded', 'user-Agent': js_le_type_data.ua, 'accept': '*/*', 'referer': 'https://rendezvousparis.hermes.com/', 'origin': 'https://rendezvousparis.hermes.com/', 'Sec-Fetch-Mode': 'cors', 'sec-fetch-site': 'cross-site', 'sec-gpc': "1", 'sec-fetch-dest': 'empty', 'sec-ch-ua-platform': 'Android', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'fr-FR,fr;q=0.6'} print("send request to get le type cookie") print(proxy_to_use) print(headers) try: raw_data = self.get_le_type_raw_data(old_valid_cookie=old_valid_cookie, js_le_type_data=js_le_type_data) response = requests.post(url="https://d.digital.hermes/js/", headers=headers, verify=False, data=raw_data, proxies=proxy_to_use, timeout=15) # print(response.status_code) if response.status_code == 200: print(response.text) returned_result = json.loads(response.text) new_cookie = returned_result['cookie'] print(response.url) print(new_cookie) return new_cookie except Exception as error: print("exception received") print(error) return None def get_ch_raw_data_from_js_data(self, js_data: JsDataPojo, old_valid_cookie) -> str: _tag_version = "4.24.2" _raw_data = "jsData={}&eventCounters=%5B%5D&jsType=ch&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv={}".format( js_data.to_url_encoded_json(), old_valid_cookie, _tag_version) print("raw data is " + _raw_data) return _raw_data def get_valid_ch_cookie(self, proxy_to_use, js_data: JsDataPojo, old_valid_cookie: str = None) -> Union[str, None]: # extract datadome cookie # get new cookie _cookies_to_use = get_datadome_cookies(old_valid_cookie) _app_cookies = get_app_cookies(old_valid_cookie) _lang_cookies = get_lang_cookies(old_valid_cookie) _origin = "https://rendezvousparis.hermes.com/" # _origin = "https://www.hermes.com" _referer = "https://rendezvousparis.hermes.com/" # _referer = "https://www.hermes.com" headers = {'content-Type': 'application/x-www-form-urlencoded', 'user-Agent': js_data.ua, 'accept': '*/*', 'referer': _referer, 'origin': _origin, 'request': _origin, 'Sec-Fetch-Mode': 'cors', 'sec-fetch-site': 'cross-site', 'sec-ch-ua-mobile': '?1', 'sec-gpc': "1", 'sec-fetch-dest': 'empty', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'fr-FR,fr;q=0.6'} # print(proxy_to_use) print("send request to get new cookie") print(headers) try: response = requests.post(url="https://d.digital.hermes/js/", headers=headers, verify=False, data=self.get_ch_raw_data_from_js_data(js_data=js_data, old_valid_cookie=_cookies_to_use), proxies=proxy_to_use, timeout=15) print(response.status_code) if response.status_code == 200: print(response.text) returned_result = json.loads(response.text) new_cookie = returned_result['cookie'] print(response.url) new_cookie = retain_only_dataome_cookies(new_cookie) if _app_cookies is not None: new_cookie = _app_cookies + new_cookie + _lang_cookies print(new_cookie) return new_cookie except Exception as error: print("exception received") print(error) return None def get_le_type_raw_data(self, old_valid_cookie: str, js_le_type_data: JsDataLeTypePojo): # m_m_c = f.mousemove mousemove_count = js_le_type_data.m_m_c # m_c_c = f.click click_count = js_le_type_data.m_c_c # m_s_c = f.scroll scroll_count = js_le_type_data.m_s_c key_count = random.randint(5, 12) touch_count = mousemove_count touch_move = touch_count + 2 # _le_js_raw_data = self.get_le_raw_data_from_js_data(js_le_type_data=js_le_type_data, # old_valid_cookie=old_valid_cookie) _cid = get_datadome_cookies(old_valid_cookie) _raw_data = "jsData={}&eventCounters=%7B%22mousemove%22%3A{}%2C%22click%22%3A{}%2C%22scroll%22%3A{}%2C%22touchstart%22%3A{}%2C%22touchend%22%3A{}%2C%22touchmove%22%3A{}%2C%22keydown%22%3A{}%2C%22keyup%22%3A{}%7D&jsType=le&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv=4.24.2".format( js_le_type_data.to_url_encoded_json(), mousemove_count, click_count, scroll_count, touch_count, touch_count, touch_move, key_count, key_count, _cid) print("raw le data is " + _raw_data) return _raw_data def extract_cid_from_html(self, html_text): print(html_text) matched_result = re.findall(r"cid\':.*", html_text) print(matched_result) first_result = matched_result[0].split(",")[0].split(":")[-1] print(first_result) return first_result # def send_request(self, cid): data = {} data['type'] = 'DataDomeSliderTask' data['websiteURL'] = 'https://rendezvousparis.hermes.com/client/register' data['captchaUrl'] = "https://geo.captcha-delivery.com/captcha/?initialCi={}".format(cid) json_data = json.dumps(data) # requests.post() # if __name__ == '__main__': captchaResultGetter = CaptchaResultGetter() _url_encoded_data = captchaResultGetter.get_valid_cookie() print(_url_encoded_data)