211 lines
9.9 KiB
Python
211 lines
9.9 KiB
Python
import json
|
|
import random
|
|
import re
|
|
from typing import Union
|
|
# import requests
|
|
from curl_cffi import requests
|
|
|
|
from captcha.jspl_encoder_wrapper import encrpte_to_jspl
|
|
from models.jsdata_le_pojo import JsDataLeTypePojo
|
|
from models.jsdata_pojo import JsDataPojo
|
|
from models.result_pojo import RequestResult
|
|
from utils.get_only_datadome_cookies import get_datadome_cookies, get_app_cookies, get_lang_cookies, \
|
|
retain_only_dataome_cookies
|
|
|
|
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, RequestResult]:
|
|
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)
|
|
return self.extract_csrf_from_html(response.text)
|
|
elif response.status_code == 403:
|
|
return RequestResult.BLOCKED
|
|
else:
|
|
print(response.text)
|
|
return RequestResult.UNKNOWN
|
|
except Exception as error:
|
|
print(error)
|
|
return RequestResult.PROXY_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 = "5.1.5"
|
|
_jspl = encrpte_to_jspl(js_data.to_url_encoded_json())
|
|
_raw_data = "jspl={}&eventCounters=%5B%5D&jsType=ch&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv={}".format(
|
|
_jspl, old_valid_cookie, _tag_version)
|
|
print("raw ch data is " + _raw_data)
|
|
return _raw_data
|
|
|
|
def get_valid_ch_cookie(self, proxy_to_use, js_data: JsDataPojo, old_valid_cookie: str = None,
|
|
referrer: str = "https://rendezvousparis.hermes.com/",
|
|
origin="https://rendezvousparis.hermes.com/") -> 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 = origin
|
|
# _origin = "https://www.hermes.com"
|
|
_referer = referrer
|
|
# _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)
|
|
_jspl = encrpte_to_jspl(js_le_type_data.to_url_encoded_json())
|
|
_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=5.1.5".format(
|
|
_jspl, 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)
|