Files
appointment_request/workers/captcha_result_getter.py
T
2024-04-22 13:47:17 +02:00

206 lines
9.7 KiB
Python

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 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
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, 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 = "4.26.0"
_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 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) -> 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.26.0".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)