can get le type jsdata

This commit is contained in:
2024-03-19 13:51:44 +01:00
parent 4f48fc0366
commit 53ea721cb6
10 changed files with 245 additions and 157 deletions
+60
View File
@@ -0,0 +1,60 @@
import json
from models.jsdata_pojo import JsDataPojo
# "log2": true,
# "dcok": ".hermes.com",
# "m_fmi": false,
# "tbce": 0,
# "es_sigmdn": null,
# "es_mumdn": null,
# "es_distmdn": null,
# "es_angsmdn": null,
# "es_angemdn": null,
# "m_s_c": 0,
# "m_m_c": 3,
# "m_c_c": 3,
# "m_cm_r": 1,
# "m_ms_r": -1
class JsDataLeTypePojo(JsDataPojo):
def __init__(self, glrd, glvd, hc, br_oh, ua, br_ow, br_h, br_w, rs_h, rs_w, rs_cd, ars_h, ars_w, plg, eva, plu,
vnd, pr, ts_mtp, dvm, m_s_c, m_m_c, m_c_c, m_cm_r, m_ms_r):
super().__init__(glrd, glvd, hc, br_oh, ua, br_ow, br_h, br_w, rs_h, rs_w, rs_cd, ars_h, ars_w, plg, eva, plu,
vnd, pr, ts_mtp, dvm)
self.log2 = True
self.dcok = ".hermes.com"
self.m_fmi = False
self.tbce = 0
self.es_sigmdn = None
self.es_mumdn = None
self.es_distmdn = None
self.es_angsmdn = None
self.es_angemdn = None
self.m_s_c = m_s_c
self.m_m_c = m_m_c
self.m_c_c = m_c_c
self.m_cm_r = m_cm_r
self.m_ms_r = m_ms_r
test_data_json = """{"glvd": "Qualcomm", "glrd": "Adreno (TM) 630", "hc": 2, "br_oh": 663, "br_ow": 384, "br_h": 663,
"br_w": 384, "rs_h": 811, "rs_w": 384, "rs_cd": 24, "ars_h": 811, "ars_w": 384, "plg": 2, "eva": 33,
"vnd": "Google Inc.", "plu": ["5gQIEKN", "Iv26GLka"],
"ua": "Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36",
"dvm": 4, "acw": "probably", "pr": 2.8125, "ts_mtp": 5,
"cookiesStr": "app.sig=Arp0SzXCTBF2ordHf3pPTd6cS14;datadome=o_7W8TjHcQjqvnFjFBGAZZ0OmNOd0fnJXfzgqOajAHBBNv7zNMFi2~Jn7wQbTEIZdr2qvg0IFFQQr~Zk5ifzM154V1XxZVhgDZeVkNyRKrQewLBIzVeSagWs587fBqdX;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoieVVRWmJBWnlRTnQ5bFlNbDdNN3R6eHhqIn0=;policy=accepted;lang=fr;"}"""
if __name__ == '__main__':
test_data_dict = json.loads(test_data_json)
le_js_data = JsDataLeTypePojo(glrd=test_data_dict['glrd'], glvd=test_data_dict['glvd'], hc=test_data_dict['hc'],
ua=test_data_dict['ua'], br_oh=test_data_dict['br_oh'], br_ow=test_data_dict['br_ow'],
ars_h=test_data_dict['ars_h'], ars_w=test_data_dict['ars_w'], pr=test_data_dict['pr'],
plg=test_data_dict['plg'], br_h=test_data_dict['br_h'], br_w=test_data_dict['br_w'],
plu=test_data_dict['plu'], vnd=test_data_dict['vnd'], dvm=test_data_dict['dvm'],
ts_mtp=test_data_dict['ts_mtp'], eva=test_data_dict['eva'],
rs_h=test_data_dict['rs_h'],
rs_w=test_data_dict['rs_w'], rs_cd=test_data_dict['rs_cd'], m_s_c=0, m_m_c=3, m_c_c=3,
m_cm_r=1, m_ms_r=-1)
print(le_js_data.to_url_encoded_json())
+1 -1
View File
@@ -138,7 +138,7 @@ class JsDataPojo:
def __init__(self, glrd, glvd, hc, br_oh, ua, br_ow, br_h, br_w, rs_h, rs_w, rs_cd, ars_h, ars_w, plg, eva, plu, def __init__(self, glrd, glvd, hc, br_oh, ua, br_ow, br_h, br_w, rs_h, rs_w, rs_cd, ars_h, ars_w, plg, eva, plu,
vnd, pr, ts_mtp, dvm): vnd, pr, ts_mtp, dvm):
self.opts = "endpoint,ajaxListenerPath" self.opts = "endpoint,ajaxListenerPath"
self.ttst = random.randint(38, 94) self.ttst = random.randint(38, 148)
self.ifov = False self.ifov = False
self.hc = hc self.hc = hc
self.br_oh = br_oh self.br_oh = br_oh
+1
View File
@@ -7,6 +7,7 @@ REQUEST_DATA_QUEUE_TEST = 'REQUEST_DATA_TEST'
TEST_QUEUE = 'TEST_QUEUE' TEST_QUEUE = 'TEST_QUEUE'
REQUEST_DATA_QUEUE_DE = 'REQUEST_DATA_DE' REQUEST_DATA_QUEUE_DE = 'REQUEST_DATA_DE'
REQUEST_DATA_OBJECT = 'REQUEST_DATA_OBJECT' REQUEST_DATA_OBJECT = 'REQUEST_DATA_OBJECT'
REGISTER_QUEUE = 'REGISTER_QUEUE'
credentials = pika.PlainCredentials('appointment', 'ZyuhJZ2xEYWhElhpJjy7YEpZGZwNYJz2fHIu') credentials = pika.PlainCredentials('appointment', 'ZyuhJZ2xEYWhElhpJjy7YEpZGZwNYJz2fHIu')
+44 -38
View File
@@ -3,12 +3,12 @@ import json
import random import random
import threading import threading
import time import time
from http.cookies import SimpleCookie
import pika import pika
from db.mongo_manager import MONGO_STORE_MANAGER from db.mongo_manager import MONGO_STORE_MANAGER
from models.contact_pojo import ContactPojo from models.contact_pojo import ContactPojo
from models.jsdata_le_pojo import JsDataLeTypePojo
from models.jsdata_pojo import JsDataPojo from models.jsdata_pojo import JsDataPojo
from models.result_pojo import RequestResult from models.result_pojo import RequestResult
from queue_message.CookiesPublisher import CookiesPublisher from queue_message.CookiesPublisher import CookiesPublisher
@@ -43,34 +43,6 @@ def filter_contacts(_contact_list: list) -> list:
return _contact_list_to_book return _contact_list_to_book
def get_valid_csrf() -> str:
captchaResultGetter = CaptchaResultGetter()
_valid_cookie = captchaResultGetter.get_valid_cookie()
# while _valid_cookie is None:
# _valid_cookie = captchaResultGetter.get_valid_cookie()
new_csrf = None
while new_csrf is None:
valid_cookie = None
if _valid_cookie is not None:
simple_cookie = SimpleCookie()
simple_cookie.load(_valid_cookie)
new_cookies = {k: v.value for k, v in simple_cookie.items()}
new_coolies_str = ""
for key in new_cookies:
print(key)
new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
print(new_coolies_str)
valid_cookie = new_coolies_str + "app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiYnRodHNYU1lvdnl4RzVGakpGRDZsQ0JtIn0=;policy=accepted;lang=fr;"
print(valid_cookie)
new_csrf = captchaResultGetter.get_csrf(valid_cookie)
if new_csrf is None:
_valid_cookie = None
while _valid_cookie is None:
_valid_cookie = captchaResultGetter.get_valid_cookie()
time.sleep(2)
return new_csrf
def is_open(): def is_open():
return is_time_between(datetime.time(10, 30), datetime.time(19, 00)) return is_time_between(datetime.time(10, 30), datetime.time(19, 00))
@@ -103,6 +75,12 @@ class AppointmentRequestSender(threading.Thread):
print("message count in queue is {}".format(_message_count)) print("message count in queue is {}".format(_message_count))
_received_object = body.decode("UTF-8") _received_object = body.decode("UTF-8")
print(f" [x] Received {_received_object}") print(f" [x] Received {_received_object}")
_port = random.randint(40001, 49999)
print("generated port is {}".format(_port))
_choosed_proxy = random.choice(self.proxy_to_use_list)
_proxy_to_use = {}
_proxy_to_use["http"] = _choosed_proxy["http"].format(_port)
_proxy_to_use["https"] = _choosed_proxy["https"].format(_port)
if "glrd" in _received_object: if "glrd" in _received_object:
_received_dict = json.loads(_received_object) _received_dict = json.loads(_received_object)
js_data = JsDataPojo(glrd=_received_dict['glrd'], glvd=_received_dict['glvd'], hc=_received_dict['hc'], js_data = JsDataPojo(glrd=_received_dict['glrd'], glvd=_received_dict['glvd'], hc=_received_dict['hc'],
@@ -115,7 +93,7 @@ class AppointmentRequestSender(threading.Thread):
rs_w=_received_dict['rs_w'], rs_cd=_received_dict['rs_cd']) rs_w=_received_dict['rs_w'], rs_cd=_received_dict['rs_cd'])
_received_cookies = _received_dict["cookiesStr"] _received_cookies = _received_dict["cookiesStr"]
sender = Sender(_received_cookies, cookiesPublisher=self.cookiesPublisher, received_dict=_received_dict, sender = Sender(_received_cookies, cookiesPublisher=self.cookiesPublisher, received_dict=_received_dict,
proxy_to_use=random.choice(self.proxy_to_use_list)) proxy_to_use=_proxy_to_use)
self.contact_list = filter_contacts(self.contact_list) self.contact_list = filter_contacts(self.contact_list)
# remove already booked contacts # remove already booked contacts
random.shuffle(self.contact_list) random.shuffle(self.contact_list)
@@ -124,20 +102,48 @@ class AppointmentRequestSender(threading.Thread):
print("contact number is {}".format(len(self.contact_list))) print("contact number is {}".format(len(self.contact_list)))
self.contact_list = filter_contacts(self.contact_list) self.contact_list = filter_contacts(self.contact_list)
for con in self.contact_list: for con in self.contact_list:
# if not is_already_sent(con):
print(con.mail) print(con.mail)
# time.sleep(random.randint(1, 5))
if self.valid_csrf is None: if self.valid_csrf is None:
self.valid_csrf = captchaResultGetter.get_csrf( self.valid_csrf = captchaResultGetter.get_csrf(
proxy_to_use=random.choice(self.proxy_to_use_list), proxy_to_use=_proxy_to_use, js_data=js_data,
cookie=body.decode("UTF-8")) cookie=_received_cookies)
_new_cookies = captchaResultGetter.get_valid_ch_cookie(sender.proxy_to_use, js_data, _new_cookies = captchaResultGetter.get_valid_ch_cookie(sender.proxy_to_use, js_data,
old_valid_cookie=_received_cookies) old_valid_cookie=_received_cookies)
if _received_cookies is not None: if _new_cookies is not None:
print("new cookie is " + _received_cookies) print("new cookie is " + _new_cookies)
sender.cookie_str = _received_cookies
time.sleep(random.randint(1, 5)) time.sleep(random.randint(1, 5))
can_continue = sender.send_request(HERMES_REGISTER, con, csrf=self.valid_csrf) # m_s_c = f.scroll
m_s_c = random.randint(0, 3)
m_c_c = random.randint(3, 5) # click count
m_m_c = random.randint(3, 5) # move count
m_cm_r = m_c_c / m_m_c
m_ms_r = random.randint(-1, 1)
js_le_data = JsDataLeTypePojo(glrd=_received_dict['glrd'], glvd=_received_dict['glvd'],
hc=_received_dict['hc'],
ua=_received_dict['ua'], br_oh=_received_dict['br_oh'],
br_ow=_received_dict['br_ow'],
ars_h=_received_dict['ars_h'], ars_w=_received_dict['ars_w'],
pr=_received_dict['pr'],
plg=_received_dict['plg'], br_h=_received_dict['br_h'],
br_w=_received_dict['br_w'],
plu=_received_dict['plu'], vnd=_received_dict['vnd'],
dvm=_received_dict['dvm'],
ts_mtp=_received_dict['ts_mtp'], eva=_received_dict['eva'],
rs_h=_received_dict['rs_h'],
rs_w=_received_dict['rs_w'], rs_cd=_received_dict['rs_cd'],
m_s_c=m_s_c, m_m_c=m_m_c, m_c_c=m_c_c,
m_cm_r=m_cm_r, m_ms_r=m_ms_r)
_new_le_cookies = captchaResultGetter.get_le_valid_cookie(proxy_to_use=_proxy_to_use,
js_le_type_data=js_le_data,
old_valid_cookie=_new_cookies)
if _new_le_cookies is not None:
print("new le type cookie is " + _new_le_cookies)
sender.cookie_str = _new_le_cookies
time.sleep(random.randint(1, 5))
can_continue = sender.send_request(HERMES_REGISTER, js_data, con, csrf=self.valid_csrf)
else:
can_continue = RequestResult.COOKIES_ERROR
else: else:
can_continue = RequestResult.COOKIES_ERROR can_continue = RequestResult.COOKIES_ERROR
if can_continue == RequestResult.BLOCKED: if can_continue == RequestResult.BLOCKED:
-28
View File
@@ -38,34 +38,6 @@ def filter_contacts(_contact_list: list) -> list:
return _contact_list_to_book return _contact_list_to_book
def get_valid_csrf() -> str:
captchaResultGetter = CaptchaResultGetter()
_valid_cookie = captchaResultGetter.get_valid_cookie()
# while _valid_cookie is None:
# _valid_cookie = captchaResultGetter.get_valid_cookie()
new_csrf = None
while new_csrf is None:
valid_cookie = None
if _valid_cookie is not None:
simple_cookie = SimpleCookie()
simple_cookie.load(_valid_cookie)
new_cookies = {k: v.value for k, v in simple_cookie.items()}
new_coolies_str = ""
for key in new_cookies:
print(key)
new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
print(new_coolies_str)
valid_cookie = new_coolies_str + "app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiYnRodHNYU1lvdnl4RzVGakpGRDZsQ0JtIn0=;policy=accepted;lang=fr;"
print(valid_cookie)
new_csrf = captchaResultGetter.get_csrf(valid_cookie)
if new_csrf is None:
_valid_cookie = None
while _valid_cookie is None:
_valid_cookie = captchaResultGetter.get_valid_cookie()
time.sleep(2)
return new_csrf
class LinkValidatorReceiver(threading.Thread): class LinkValidatorReceiver(threading.Thread):
def __init__(self, linkpojo_list: list): def __init__(self, linkpojo_list: list):
self.connection = None self.connection = None
+9 -7
View File
@@ -8,11 +8,11 @@ from db.mongo_manager import MONGO_STORE_MANAGER
from excel_reader import read_contacts from excel_reader import read_contacts
from models.contact_pojo import ContactPojo from models.contact_pojo import ContactPojo
from queue_message.CookiesPublisher import CookiesPublisher, REQUEST_DATA_QUEUE_DE, REQUEST_DATA_QUEUE_TEST, \ from queue_message.CookiesPublisher import CookiesPublisher, REQUEST_DATA_QUEUE_DE, REQUEST_DATA_QUEUE_TEST, \
REQUEST_DATA_OBJECT, TEST_QUEUE REQUEST_DATA_OBJECT, TEST_QUEUE, REGISTER_QUEUE
from queue_message.appointmentrequestsender import AppointmentRequestSender, REQUEST_DATA_QUEUE from queue_message.appointmentrequestsender import AppointmentRequestSender, REQUEST_DATA_QUEUE
from utiles import is_time_between from utiles import is_time_between
from workers.captcha_result_getter import CaptchaResultGetter, HERMES_REGISTER from workers.captcha_result_getter import CaptchaResultGetter, HERMES_REGISTER
from workers.proxies_constants import PROXY_LIST_DE, PROXY_LIST_FR, MOBILE_PROXY_LIST_FR from workers.proxies_constants import PROXY_LIST_DE, PROXY_LIST_FR, MOBILE_PROXY_LIST_FR, FR_PROXY_MOB_OXY_STICKY
from workers.sender import Sender from workers.sender import Sender
IPFIY = 'http://api.ipify.org' IPFIY = 'http://api.ipify.org'
@@ -89,14 +89,16 @@ def send_appointment_request(message_queue_name, _contact_list):
if __name__ == '__main__': if __name__ == '__main__':
contacts_file_path = '~/Desktop/contact_list_2024-03-09.xlsx' contacts_file_path = '~/Desktop/contact_list_2024-03-15.xlsx'
_contact_list = read_contacts(contacts_file_path) _contact_list = read_contacts(contacts_file_path)
_segment_number = 10 _contact_list_to_book = filter_contacts(_contact_list)
_segment_number = 5
print("{} contacts to book".format(len(_contact_list_to_book)))
for i in range(0, _segment_number): for i in range(0, _segment_number):
print(i) print(i)
_step = int(len(_contact_list) / _segment_number) _step = int(len(_contact_list_to_book) / _segment_number)
_sublist = _contact_list[i:_step * (i + 1)] _sublist = _contact_list_to_book[i:_step * (i + 1)]
print(_sublist[0]) print(_sublist[0])
print(_sublist[-1]) print(_sublist[-1])
_thread1 = Thread(target=send_appointment_request, args=(REQUEST_DATA_OBJECT, _sublist)) _thread1 = Thread(target=send_appointment_request, args=(TEST_QUEUE, _sublist))
_thread1.start() _thread1.start()
+70
View File
@@ -0,0 +1,70 @@
from http.cookies import SimpleCookie
def get_datadome_cookies(cookiesStr: str):
_cookies = SimpleCookie()
_cookies.load(cookiesStr)
new_cookies = {k: v.value for k, v in _cookies.items()}
_new_coolies_str = None
for key in new_cookies:
if key == "datadome":
if _new_coolies_str is None:
_new_coolies_str = ""
_new_coolies_str = _new_coolies_str + new_cookies[key]
return _new_coolies_str
def retain_only_dataome_cookies(cookiesStr: str):
_cookies = SimpleCookie()
_cookies.load(cookiesStr)
new_cookies = {k: v.value for k, v in _cookies.items()}
new_coolies_str = None
for key in new_cookies:
if key == "datadome":
if new_coolies_str is None:
new_coolies_str = ""
new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
return new_coolies_str
def get_app_cookies(cookiesStr: str):
_cookies = SimpleCookie()
_cookies.load(cookiesStr)
new_cookies = {k: v.value for k, v in _cookies.items()}
new_coolies_str = None
for key in new_cookies:
if key == "app.sig":
if new_coolies_str is None:
new_coolies_str = ""
new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
return new_coolies_str
def get_lang_cookies(cookiesStr: str):
_cookies = SimpleCookie()
_cookies.load(cookiesStr)
new_cookies = {k: v.value for k, v in _cookies.items()}
new_coolies_str = None
for key in new_cookies:
if key == "app":
if new_coolies_str is None:
new_coolies_str = ""
new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
if key == "policy":
if new_coolies_str is None:
new_coolies_str = ""
new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
if key == "lang":
if new_coolies_str is None:
new_coolies_str = ""
new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
return new_coolies_str
if __name__ == '__main__':
print(get_datadome_cookies(
"datadome=HS7HPdbsFTYfxD60ogUwxjplOuqrveIjcTaucXVIWCko6pRayhXuKxC~44Ky5eNR2wnx4PEd2P2AadewmeXgxi4vn3x_QKdxLb6H1a9MbaMLNwmxfMEjQQ~CK8Y_nspJ;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiNXhvX3ZFaWc0aURla0dYMHZGTHNJX2p4In0=;policy=accepted;lang=fr;"))
print(get_app_cookies(
"datadome=HS7HPdbsFTYfxD60ogUwxjplOuqrveIjcTaucXVIWCko6pRayhXuKxC~44Ky5eNR2wnx4PEd2P2AadewmeXgxi4vn3x_QKdxLb6H1a9MbaMLNwmxfMEjQQ~CK8Y_nspJ;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiNXhvX3ZFaWc0aURla0dYMHZGTHNJX2p4In0=;policy=accepted;lang=fr;"))
print(get_lang_cookies(
"datadome=HS7HPdbsFTYfxD60ogUwxjplOuqrveIjcTaucXVIWCko6pRayhXuKxC~44Ky5eNR2wnx4PEd2P2AadewmeXgxi4vn3x_QKdxLb6H1a9MbaMLNwmxfMEjQQ~CK8Y_nspJ;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiNXhvX3ZFaWc0aURla0dYMHZGTHNJX2p4In0=;policy=accepted;lang=fr;"))
+49 -77
View File
@@ -1,11 +1,13 @@
import json import json
import random import random
import re import re
from time import time
from typing import Union from typing import Union
import requests import requests
from models.jsdata_le_pojo import JsDataLeTypePojo
from models.jsdata_pojo import JsDataPojo 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 from workers.proxies_constants import PROXY_LIST_FR
API_KEY = "d66aaf490d8aa424a5175e1fbd1aadea" API_KEY = "d66aaf490d8aa424a5175e1fbd1aadea"
@@ -22,10 +24,10 @@ class CaptchaResultGetter:
self.cookie_str = 'datadome=5Nq~NEP_qQSHC0g_lZNnZmEv36J8gVV~rpZ329xmCkTq2~H3meIoXr4h_b988qB2XW5Te7iEGsvq8BzA5KeFupyrZFh4kgrDyl8hT2UymSByKHzAcDaNIBPDsRu2g_KG; Max-Age=31536000; Domain=.hermes.com; Path=/; Secure; SameSite=None' self.cookie_str = 'datadome=5Nq~NEP_qQSHC0g_lZNnZmEv36J8gVV~rpZ329xmCkTq2~H3meIoXr4h_b988qB2XW5Te7iEGsvq8BzA5KeFupyrZFh4kgrDyl8hT2UymSByKHzAcDaNIBPDsRu2g_KG; Max-Age=31536000; Domain=.hermes.com; Path=/; Secure; SameSite=None'
pass pass
def get_csrf(self, proxy_to_use, cookie: str = None) -> Union[str, None]: def get_csrf(self, proxy_to_use, js_data: JsDataPojo, cookie: str = None) -> Union[str, None]:
if cookie is not None: if cookie is not None:
headers = {'Content-Type': 'application/x-www-form-urlencoded', headers = {'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36', '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', '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', 'Referer': 'https://www.google.fr',
'Cookie': cookie, 'Cookie': cookie,
@@ -34,7 +36,7 @@ class CaptchaResultGetter:
'Accept-Language': 'fr-FR,fr;q=0.6'} 'Accept-Language': 'fr-FR,fr;q=0.6'}
else: else:
headers = {'Content-Type': 'application/x-www-form-urlencoded', headers = {'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36', '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', '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', 'Referer': 'https://www.google.fr',
'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Mode': 'navigate',
@@ -63,9 +65,10 @@ class CaptchaResultGetter:
return result_list[-1] return result_list[-1]
return None return None
def get_valid_cookie(self, proxy_to_use, old_valid_cookie: str, dvm=4, hc=6) -> Union[str, 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', headers = {'content-Type': 'application/x-www-form-urlencoded',
'user-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36', 'user-Agent': js_le_type_data.ua,
'accept': '*/*', 'accept': '*/*',
'referer': 'https://rendezvousparis.hermes.com/', 'referer': 'https://rendezvousparis.hermes.com/',
'origin': 'https://rendezvousparis.hermes.com/', 'origin': 'https://rendezvousparis.hermes.com/',
@@ -76,16 +79,15 @@ class CaptchaResultGetter:
'sec-ch-ua-platform': 'Android', 'sec-ch-ua-platform': 'Android',
'accept-encoding': 'gzip, deflate, br', 'accept-encoding': 'gzip, deflate, br',
'accept-language': 'fr-FR,fr;q=0.6'} 'accept-language': 'fr-FR,fr;q=0.6'}
print("send request to get new cookie") print("send request to get le type cookie")
print(proxy_to_use) print(proxy_to_use)
print(headers) print(headers)
try: try:
# tag_pu = 10 * Math.random() raw_data = self.get_le_type_raw_data(old_valid_cookie=old_valid_cookie, js_le_type_data=js_le_type_data)
raw_data = self.get_raw_data(old_valid_cookie=old_valid_cookie, dvm=dvm, hc=hc)
response = requests.post(url="https://d.digital.hermes/js/", headers=headers, verify=False, response = requests.post(url="https://d.digital.hermes/js/", headers=headers, verify=False,
data=raw_data, data=raw_data,
proxies=proxy_to_use, timeout=15) proxies=proxy_to_use, timeout=15)
print(response.status_code) # print(response.status_code)
if response.status_code == 200: if response.status_code == 200:
print(response.text) print(response.text)
returned_result = json.loads(response.text) returned_result = json.loads(response.text)
@@ -99,20 +101,32 @@ class CaptchaResultGetter:
return None return None
def get_ch_raw_data_from_js_data(self, js_data: JsDataPojo, old_valid_cookie) -> str: def get_ch_raw_data_from_js_data(self, js_data: JsDataPojo, old_valid_cookie) -> str:
_tag_version = "4.24.1" _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( _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) js_data.to_url_encoded_json(), old_valid_cookie, _tag_version)
print("raw data is " + _raw_data) print("raw data is " + _raw_data)
return _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]: 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', headers = {'content-Type': 'application/x-www-form-urlencoded',
'user-Agent': js_data.ua, 'user-Agent': js_data.ua,
'accept': '*/*', 'accept': '*/*',
'referer': 'https://rendezvousparis.hermes.com/', 'referer': _referer,
'origin': 'https://rendezvousparis.hermes.com/', 'origin': _origin,
'request': _origin,
'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Mode': 'cors',
'sec-fetch-site': 'cross-site', 'sec-fetch-site': 'cross-site',
'sec-ch-ua-mobile': '?1',
'sec-gpc': "1", 'sec-gpc': "1",
'sec-fetch-dest': 'empty', 'sec-fetch-dest': 'empty',
'accept-encoding': 'gzip, deflate, br', 'accept-encoding': 'gzip, deflate, br',
@@ -121,10 +135,9 @@ class CaptchaResultGetter:
print("send request to get new cookie") print("send request to get new cookie")
print(headers) print(headers)
try: try:
# tag_pu = 10 * Math.random()
response = requests.post(url="https://d.digital.hermes/js/", headers=headers, verify=False, 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, data=self.get_ch_raw_data_from_js_data(js_data=js_data,
old_valid_cookie=old_valid_cookie), old_valid_cookie=_cookies_to_use),
proxies=proxy_to_use, timeout=15) proxies=proxy_to_use, timeout=15)
print(response.status_code) print(response.status_code)
if response.status_code == 200: if response.status_code == 200:
@@ -132,6 +145,9 @@ class CaptchaResultGetter:
returned_result = json.loads(response.text) returned_result = json.loads(response.text)
new_cookie = returned_result['cookie'] new_cookie = returned_result['cookie']
print(response.url) 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) print(new_cookie)
return new_cookie return new_cookie
except Exception as error: except Exception as error:
@@ -139,27 +155,25 @@ class CaptchaResultGetter:
print(error) print(error)
return None return None
def get_raw_data(self, old_valid_cookie: str = None, dvm=4, hc=6): def get_le_type_raw_data(self, old_valid_cookie: str, js_le_type_data: JsDataLeTypePojo):
_raw_data = None # m_m_c = f.mousemove
mousemove_count = js_le_type_data.m_m_c
mousemove_count = random.randint(5, 10) # m_c_c = f.click
click_count = random.randint(5, 10) click_count = js_le_type_data.m_c_c
click_count = mousemove_count # m_s_c = f.scroll
key_count = random.randint(5, 10) scroll_count = js_le_type_data.m_s_c
key_count = random.randint(5, 12)
touch_count = mousemove_count touch_count = mousemove_count
js_set = int(time()) touch_move = touch_count + 2
tag_pu = random.uniform(1, 10) # _le_js_raw_data = self.get_le_raw_data_from_js_data(js_le_type_data=js_le_type_data,
while len(str(tag_pu)) != 17: # old_valid_cookie=old_valid_cookie)
tag_pu = random.uniform(1, 10) _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(
if old_valid_cookie is None: js_le_type_data.to_url_encoded_json(), mousemove_count, click_count, scroll_count, touch_count, touch_count,
_raw_data = "jsData=%7B%22log1%22%3Afalse%2C%22opts%22%3A%22endpoint%2CajaxListenerPath%22%2C%22ttst%22%3A38%2C%22ifov%22%3Afalse%2C%22hc%22%3A{}%2C%22br_oh%22%3A646%2C%22br_ow%22%3A360%2C%22ua%22%3A%22Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F115.0.0.0%20Mobile%20Safari%2F537.36%22%2C%22wbd%22%3Afalse%2C%22tagpu%22%3A{}%2C%22wdif%22%3Afalse%2C%22wdifrm%22%3Afalse%2C%22npmtm%22%3Afalse%2C%22br_h%22%3A646%2C%22br_w%22%3A360%2C%22nddc%22%3A1%2C%22rs_h%22%3A800%2C%22rs_w%22%3A360%2C%22rs_cd%22%3A24%2C%22phe%22%3Afalse%2C%22nm%22%3Afalse%2C%22jsf%22%3Afalse%2C%22lg%22%3A%22fr-FR%22%2C%22pr%22%3A3%2C%22ars_h%22%3A800%2C%22ars_w%22%3A360%2C%22tz%22%3A-60%2C%22str_ss%22%3Atrue%2C%22str_ls%22%3Atrue%2C%22str_idb%22%3Atrue%2C%22str_odb%22%3Atrue%2C%22plgod%22%3Afalse%2C%22plg%22%3A2%2C%22plgne%22%3A%22err%22%2C%22plgre%22%3A%22err%22%2C%22plgof%22%3A%22err%22%2C%22plggt%22%3A%22err%22%2C%22pltod%22%3Afalse%2C%22hcovdr%22%3Afalse%2C%22hcovdr2%22%3Afalse%2C%22plovdr%22%3Afalse%2C%22plovdr2%22%3Afalse%2C%22ftsovdr%22%3Afalse%2C%22ftsovdr2%22%3Afalse%2C%22lb%22%3Afalse%2C%22eva%22%3A33%2C%22lo%22%3Afalse%2C%22ts_mtp%22%3A5%2C%22ts_tec%22%3Atrue%2C%22ts_tsa%22%3Atrue%2C%22vnd%22%3A%22Google%20Inc.%22%2C%22bid%22%3A%22NA%22%2C%22mmt%22%3A%22empty%22%2C%22plu%22%3A%226GLkaVK%2CjRvAfXq0%22%2C%22hdn%22%3Afalse%2C%22awe%22%3Afalse%2C%22geb%22%3Afalse%2C%22dat%22%3Afalse%2C%22med%22%3A%22defined%22%2C%22aco%22%3A%22probably%22%2C%22acots%22%3Afalse%2C%22acmp%22%3A%22probably%22%2C%22acmpts%22%3Atrue%2C%22acw%22%3A%22probably%22%2C%22acwts%22%3Afalse%2C%22acma%22%3A%22maybe%22%2C%22acmats%22%3Afalse%2C%22acaa%22%3A%22probably%22%2C%22acaats%22%3Atrue%2C%22ac3%22%3A%22%22%2C%22ac3ts%22%3Afalse%2C%22acf%22%3A%22probably%22%2C%22acfts%22%3Afalse%2C%22acmp4%22%3A%22maybe%22%2C%22acmp4ts%22%3Afalse%2C%22acmp3%22%3A%22probably%22%2C%22acmp3ts%22%3Afalse%2C%22acwm%22%3A%22maybe%22%2C%22acwmts%22%3Afalse%2C%22ocpt%22%3Afalse%2C%22vco%22%3A%22%22%2C%22vcots%22%3Afalse%2C%22vch%22%3A%22probably%22%2C%22vchts%22%3Atrue%2C%22vcw%22%3A%22probably%22%2C%22vcwts%22%3Atrue%2C%22vc3%22%3A%22maybe%22%2C%22vc3ts%22%3Afalse%2C%22vcmp%22%3A%22%22%2C%22vcmpts%22%3Afalse%2C%22vcq%22%3A%22%22%2C%22vcqts%22%3Afalse%2C%22vc1%22%3A%22probably%22%2C%22vc1ts%22%3Atrue%2C%22dvm%22%3A{}%2C%22sqt%22%3Afalse%2C%22so%22%3A%22portrait-primary%22%2C%22wdw%22%3Atrue%2C%22cokys%22%3A%22bG9hZFRpbWVzY3NpL%3D%22%2C%22ecpc%22%3Afalse%2C%22lgs%22%3Atrue%2C%22lgsod%22%3Afalse%2C%22psn%22%3Atrue%2C%22edp%22%3Afalse%2C%22addt%22%3Atrue%2C%22wsdc%22%3Atrue%2C%22ccsr%22%3Atrue%2C%22nuad%22%3Atrue%2C%22bcda%22%3Atrue%2C%22idn%22%3Atrue%2C%22capi%22%3Afalse%2C%22svde%22%3Afalse%2C%22vpbq%22%3Atrue%2C%22ucdv%22%3Afalse%2C%22spwn%22%3Afalse%2C%22emt%22%3Afalse%2C%22bfr%22%3Afalse%2C%22dbov%22%3Afalse%2C%22cfpfe%22%3A%22ZnVuY3Rpb24oKXt2YXIgbj10LG89ZG9jdW1lbnRbJ1x4NzFceDc1XHg2NVx4NzJceDc5XHg1M1x4NjVceDZjXHg2NVx4NjNceDc0XHg2Zlx4NzInXShuKDQ3MCkpO2lmKG8peyFmdW5jdGlvbiB0KCl7dmFyIGk9bjt0cnl7dmFyIGE9b1snXHg3M1x4NjhceDYxXHg2%22%2C%22stcfp%22%3A%22Oi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6NzUyMzcpCiAgICBhdCB0LmV4cG9ydHMuZGRfYWEgKGh0dHBzOi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6ODg0NDkpCiAgICBhdCBodHRwczovL2QuZGlnaXRhbC5oZXJtZXMvdGFncy5qczoyOjUxMTY1%22%2C%22ckwa%22%3Atrue%2C%22glvd%22%3A%22Google%20Inc.%20(Qualcomm)%22%2C%22glrd%22%3A%22ANGLE%20(Qualcomm%2C%20Adreno%20(TM)%20650%2C%20OpenGL%20ES%203.2)%22%2C%22wwl%22%3Afalse%2C%22jset%22%3A{}%2C%22dcok%22%3A%22.hermes.com%22%2C%22log2%22%3Atrue%2C%22tbce%22%3A0%2C%22es_sigmdn%22%3Anull%2C%22es_mumdn%22%3Anull%2C%22es_distmdn%22%3Anull%2C%22es_angsmdn%22%3Anull%2C%22es_angemdn%22%3Anull%2C%22m_s_c%22%3A3%2C%22m_m_c%22%3A5%2C%22m_c_c%22%3A5%2C%22m_cm_r%22%3A1%2C%22m_ms_r%22%3A1.6666666666666667%7D&eventCounters=%7B%22mousemove%22%3A{}%2C%22click%22%3A{}%2C%22scroll%22%3A3%2C%22touchstart%22%3A{}%2C%22touchend%22%3A{}%2C%22touchmove%22%3A0%2C%22keydown%22%3A{}%2C%22keyup%22%3A{}%7D&jsType=le&cid=S2ilUoO80StZ2OfedRZnvyMiJ9hmD_DyIWj11O2eak~8TOek7JTTeJeKWDLzGgMZaH2IOix3BX1ocB4TwnLQFx~76pAQAD0JnVZzoxwbxOPL2SR834BfbiK0Nu4c0Pxh&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv=4.19.3".format( touch_move,
hc, tag_pu, dvm, js_set, mousemove_count, click_count, touch_count, touch_count, key_count, key_count) key_count,
else: key_count, _cid)
_raw_data = "jsData=%7B%22log1%22%3Afalse%2C%22opts%22%3A%22endpoint%2CajaxListenerPath%22%2C%22ttst%22%3A38%2C%22ifov%22%3Afalse%2C%22hc%22%3A{}%2C%22br_oh%22%3A646%2C%22br_ow%22%3A360%2C%22ua%22%3A%22Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F115.0.0.0%20Mobile%20Safari%2F537.36%22%2C%22wbd%22%3Afalse%2C%22tagpu%22%3A{}%2C%22wdif%22%3Afalse%2C%22wdifrm%22%3Afalse%2C%22npmtm%22%3Afalse%2C%22br_h%22%3A646%2C%22br_w%22%3A360%2C%22nddc%22%3A1%2C%22rs_h%22%3A800%2C%22rs_w%22%3A360%2C%22rs_cd%22%3A24%2C%22phe%22%3Afalse%2C%22nm%22%3Afalse%2C%22jsf%22%3Afalse%2C%22lg%22%3A%22fr-FR%22%2C%22pr%22%3A3%2C%22ars_h%22%3A800%2C%22ars_w%22%3A360%2C%22tz%22%3A-60%2C%22str_ss%22%3Atrue%2C%22str_ls%22%3Atrue%2C%22str_idb%22%3Atrue%2C%22str_odb%22%3Atrue%2C%22plgod%22%3Afalse%2C%22plg%22%3A2%2C%22plgne%22%3A%22err%22%2C%22plgre%22%3A%22err%22%2C%22plgof%22%3A%22err%22%2C%22plggt%22%3A%22err%22%2C%22pltod%22%3Afalse%2C%22hcovdr%22%3Afalse%2C%22hcovdr2%22%3Afalse%2C%22plovdr%22%3Afalse%2C%22plovdr2%22%3Afalse%2C%22ftsovdr%22%3Afalse%2C%22ftsovdr2%22%3Afalse%2C%22lb%22%3Afalse%2C%22eva%22%3A33%2C%22lo%22%3Afalse%2C%22ts_mtp%22%3A5%2C%22ts_tec%22%3Atrue%2C%22ts_tsa%22%3Atrue%2C%22vnd%22%3A%22Google%20Inc.%22%2C%22bid%22%3A%22NA%22%2C%22mmt%22%3A%22empty%22%2C%22plu%22%3A%226GLkaVK%2CjRvAfXq0%22%2C%22hdn%22%3Afalse%2C%22awe%22%3Afalse%2C%22geb%22%3Afalse%2C%22dat%22%3Afalse%2C%22med%22%3A%22defined%22%2C%22aco%22%3A%22probably%22%2C%22acots%22%3Afalse%2C%22acmp%22%3A%22probably%22%2C%22acmpts%22%3Atrue%2C%22acw%22%3A%22probably%22%2C%22acwts%22%3Afalse%2C%22acma%22%3A%22maybe%22%2C%22acmats%22%3Afalse%2C%22acaa%22%3A%22probably%22%2C%22acaats%22%3Atrue%2C%22ac3%22%3A%22%22%2C%22ac3ts%22%3Afalse%2C%22acf%22%3A%22probably%22%2C%22acfts%22%3Afalse%2C%22acmp4%22%3A%22maybe%22%2C%22acmp4ts%22%3Afalse%2C%22acmp3%22%3A%22probably%22%2C%22acmp3ts%22%3Afalse%2C%22acwm%22%3A%22maybe%22%2C%22acwmts%22%3Afalse%2C%22ocpt%22%3Afalse%2C%22vco%22%3A%22%22%2C%22vcots%22%3Afalse%2C%22vch%22%3A%22probably%22%2C%22vchts%22%3Atrue%2C%22vcw%22%3A%22probably%22%2C%22vcwts%22%3Atrue%2C%22vc3%22%3A%22maybe%22%2C%22vc3ts%22%3Afalse%2C%22vcmp%22%3A%22%22%2C%22vcmpts%22%3Afalse%2C%22vcq%22%3A%22%22%2C%22vcqts%22%3Afalse%2C%22vc1%22%3A%22probably%22%2C%22vc1ts%22%3Atrue%2C%22dvm%22%3A{}%2C%22sqt%22%3Afalse%2C%22so%22%3A%22portrait-primary%22%2C%22wdw%22%3Atrue%2C%22cokys%22%3A%22bG9hZFRpbWVzY3NpL%3D%22%2C%22ecpc%22%3Afalse%2C%22lgs%22%3Atrue%2C%22lgsod%22%3Afalse%2C%22psn%22%3Atrue%2C%22edp%22%3Afalse%2C%22addt%22%3Atrue%2C%22wsdc%22%3Atrue%2C%22ccsr%22%3Atrue%2C%22nuad%22%3Atrue%2C%22bcda%22%3Atrue%2C%22idn%22%3Atrue%2C%22capi%22%3Afalse%2C%22svde%22%3Afalse%2C%22vpbq%22%3Atrue%2C%22ucdv%22%3Afalse%2C%22spwn%22%3Afalse%2C%22emt%22%3Afalse%2C%22bfr%22%3Afalse%2C%22dbov%22%3Afalse%2C%22cfpfe%22%3A%22ZnVuY3Rpb24oKXt2YXIgbj10LG89ZG9jdW1lbnRbJ1x4NzFceDc1XHg2NVx4NzJceDc5XHg1M1x4NjVceDZjXHg2NVx4NjNceDc0XHg2Zlx4NzInXShuKDQ3MCkpO2lmKG8peyFmdW5jdGlvbiB0KCl7dmFyIGk9bjt0cnl7dmFyIGE9b1snXHg3M1x4NjhceDYxXHg2%22%2C%22stcfp%22%3A%22Oi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6NzUyMzcpCiAgICBhdCB0LmV4cG9ydHMuZGRfYWEgKGh0dHBzOi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6ODg0NDkpCiAgICBhdCBodHRwczovL2QuZGlnaXRhbC5oZXJtZXMvdGFncy5qczoyOjUxMTY1%22%2C%22ckwa%22%3Atrue%2C%22glvd%22%3A%22Google%20Inc.%20(Qualcomm)%22%2C%22glrd%22%3A%22ANGLE%20(Qualcomm%2C%20Adreno%20(TM)%20650%2C%20OpenGL%20ES%203.2)%22%2C%22wwl%22%3Afalse%2C%22jset%22%3A{}%2C%22dcok%22%3A%22.hermes.com%22%2C%22log2%22%3Atrue%2C%22tbce%22%3A0%2C%22es_sigmdn%22%3Anull%2C%22es_mumdn%22%3Anull%2C%22es_distmdn%22%3Anull%2C%22es_angsmdn%22%3Anull%2C%22es_angemdn%22%3Anull%2C%22m_s_c%22%3A3%2C%22m_m_c%22%3A5%2C%22m_c_c%22%3A5%2C%22m_cm_r%22%3A1%2C%22m_ms_r%22%3A1.6666666666666667%7D&eventCounters=%7B%22mousemove%22%3A{}%2C%22click%22%3A{}%2C%22scroll%22%3A3%2C%22touchstart%22%3A{}%2C%22touchend%22%3A{}%2C%22touchmove%22%3A0%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.19.3".format( print("raw le data is " + _raw_data)
hc, tag_pu, dvm, js_set, mousemove_count, click_count, touch_count, touch_count, key_count,
key_count, old_valid_cookie)
print("raw data is " + _raw_data)
return _raw_data return _raw_data
def extract_cid_from_html(self, html_text): def extract_cid_from_html(self, html_text):
@@ -182,48 +196,6 @@ class CaptchaResultGetter:
# #
if __name__ == '__main__': if __name__ == '__main__':
# print(int(time()))
captchaResultGetter = CaptchaResultGetter() captchaResultGetter = CaptchaResultGetter()
_url_encoded_data = captchaResultGetter.get_valid_cookie() _url_encoded_data = captchaResultGetter.get_valid_cookie()
print(_url_encoded_data) print(_url_encoded_data)
# print(urllib.parse.parse_qs((_url_encoded_data)))
# valid_cookie = captchaResultGetter.get_valid_cookie()
# simple_cookie = SimpleCookie()
# simple_cookie.load(valid_cookie)
# new_cookies = {k: v.value for k, v in simple_cookie.items()}
# new_coolies_str = ""
# for key in new_cookies:
# print(key)
# new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
# print(new_coolies_str)
# valid_cookie = new_coolies_str + "app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiYnRodHNYU1lvdnl4RzVGakpGRDZsQ0JtIn0=;policy=accepted;lang=fr;"
# print(valid_cookie)
# # csrf = captchaResultGetter.extract_csrf_from_html(
# # """strong>Français</strong> / <a href="?lang=en">English</a> / <a href="?lang=cn">中文</a> / <a href="?lang=jp">日本語</a> / <a href="?lang=kr">한국어</a> / <a href="?lang=ru">Русский</a></div><div class="row"><div class="col-sm-6 offset-sm-3"></div></div><div class="row"><div class="col-md-6 offset-md-3"><div class="text-center"><h1>Bienvenue chez Hermès</h1><div class="client-nav register-for text-center">Demande de rendez-vous pour le vendredi 12 janvier</div><hr/></div><form id="client-registration-form" method="post" action="/client/register" class=""><input type="hidden" name="check" id="check" /><input type="hidden" name="_csrf" value="Qw5FkdRf--yiWD6S527G7Qt40DCLAzk1q21Y" /><div class="mb-3"><label for="prefer" class="control-label">Magasin préféré</label><select id="prefer" name="prefer" class="form-control" data-value=""><option value="">Sans préférence</option><option value="faubourg">Hermès Faubourg Saint-Honoré</option><option value="georgev">Hermès George V</option><option value="sevres">Hermès Sèvres</option></select></div><div class="mb-3">""")
# # print(csrf)
# contact_list = read_contacts('/Users/panlei/Desktop/yahoo_aol_valid_26-2.xlsx')
# # remove already booked contacts
# sub_contact_list = filter_contacts(contact_list)
# random.shuffle(sub_contact_list)
# valid_cookie = captchaResultGetter.get_valid_cookie()
# contact = random.choice(sub_contact_list)
# if valid_cookie is not None:
# # new_csrf = captchaResultGetter.get_csrf(valid_cookie)
# new_csrf = None
# # if new_csrf is not None:
# # print(new_csrf)
# simple_cookie = SimpleCookie()
# simple_cookie.load(valid_cookie)
# new_cookies = {k: v.value for k, v in simple_cookie.items()}
# new_coolies_str = ""
# for key in new_cookies:
# print(key)
# new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";"
# print(new_coolies_str)
# valid_cookie = new_coolies_str + "app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiYnRodHNYU1lvdnl4RzVGakpGRDZsQ0JtIn0=;policy=accepted;lang=fr;"
# print(valid_cookie)
# new_csrf = captchaResultGetter.get_csrf(valid_cookie)
# if new_csrf is not None:
# sender = Sender(valid_cookie)
# sender.send_request(HERMES_REGISTER, contact=contact, csrf=new_csrf)
+6 -3
View File
@@ -42,12 +42,16 @@ FR_PROXY_RES_OXY = {
'https': 'http://customer-rendezvous-cc-FR:Rdv202220212023@pr.oxylabs.io:7777' 'https': 'http://customer-rendezvous-cc-FR:Rdv202220212023@pr.oxylabs.io:7777'
} }
FR_PROXY_MOB_OXY = { FR_PROXY_MOB_OXY = {
'http': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@pr.oxylabs.io:7777', 'http': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@pr.oxylabs.io:7777',
'https': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@pr.oxylabs.io:7777' 'https': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@pr.oxylabs.io:7777'
} }
FR_PROXY_MOB_OXY_STICKY = {
'http': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@fr-pr.oxylabs.io:{}',
'https': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@fr-pr.oxylabs.io:{}'
}
DE_PROXY_MOBILE = { DE_PROXY_MOBILE = {
'http': 'http://8153587-mobile-country-DE:jp50x9jmo@194.88.106.169:11842', 'http': 'http://8153587-mobile-country-DE:jp50x9jmo@194.88.106.169:11842',
'https': 'http://8153587-mobile-country-DE:jp50x9jmo@194.88.106.169:11842' 'https': 'http://8153587-mobile-country-DE:jp50x9jmo@194.88.106.169:11842'
@@ -57,14 +61,13 @@ DE_PROXY_RES = {
'https': 'http://8254565-res-country-DE:1st57izbhe@185.21.60.181:14648' 'https': 'http://8254565-res-country-DE:1st57izbhe@185.21.60.181:14648'
} }
# FR_PROXY_MOBILE # FR_PROXY_MOBILE
# FR_PROXY_RES # FR_PROXY_RES
# PROXY_LIST = [FR_PROXY_MOBILE, FR_PROXY_RES, DE_PROXY_RES, DE_PROXY_MOBILE, ES_PROXY_MOBILE, IT_PROXY_MOBILE] # PROXY_LIST = [FR_PROXY_MOBILE, FR_PROXY_RES, DE_PROXY_RES, DE_PROXY_MOBILE, ES_PROXY_MOBILE, IT_PROXY_MOBILE]
# PROXY_LIST_FR = [FR_PROXY_MOBILE_2, FR_PROXY_MOBILE, FR_PROXY_RES, FR_PROXY_RES_4, FR_PROXY_RES_2] # PROXY_LIST_FR = [FR_PROXY_MOBILE_2, FR_PROXY_MOBILE, FR_PROXY_RES, FR_PROXY_RES_4, FR_PROXY_RES_2]
# PROXY_LIST_FR = [FR_PROXY_RES_OXY, FR_PROXY_MOBILE_3] # PROXY_LIST_FR = [FR_PROXY_RES_OXY, FR_PROXY_MOBILE_3]
PROXY_LIST_FR = [FR_PROXY_RES_OXY] PROXY_LIST_FR = [FR_PROXY_RES_OXY]
MOBILE_PROXY_LIST_FR = [FR_PROXY_MOB_OXY] MOBILE_PROXY_LIST_FR = [FR_PROXY_MOB_OXY_STICKY]
# PROXY_LIST = [FR_PROXY_MOBILE, FR_ # PROXY_LIST = [FR_PROXY_MOBILE, FR_
# PROXY_RES] # PROXY_RES]
PROXY_LIST_DE = [DE_PROXY_RES, DE_PROXY_MOBILE] PROXY_LIST_DE = [DE_PROXY_RES, DE_PROXY_MOBILE]
+5 -3
View File
@@ -8,6 +8,7 @@ import requests
from db.mongo_manager import MONGO_STORE_MANAGER from db.mongo_manager import MONGO_STORE_MANAGER
from models.ReserveResultPojo import ReserveResultPojo, PublishType from models.ReserveResultPojo import ReserveResultPojo, PublishType
from models.jsdata_pojo import JsDataPojo
from models.result_pojo import RequestResult from models.result_pojo import RequestResult
from queue_message.CookiesPublisher import CookiesPublisher from queue_message.CookiesPublisher import CookiesPublisher
from workers.proxies_constants import PROXY_LIST_FR from workers.proxies_constants import PROXY_LIST_FR
@@ -46,7 +47,7 @@ class Sender:
def get_csrf(self): def get_csrf(self):
pass pass
def send_request(self, url, contact: ContactPojo, csrf: str = None) -> RequestResult: def send_request(self, url, js_data: JsDataPojo, contact: ContactPojo, csrf: str = None) -> RequestResult:
if csrf is None: if csrf is None:
if self._csrf is None: if self._csrf is None:
_csrf = '8Bs2dBwb-nHONOzo9Tei2CcMZglEfsRqUz8E' _csrf = '8Bs2dBwb-nHONOzo9Tei2CcMZglEfsRqUz8E'
@@ -56,7 +57,7 @@ class Sender:
self._csrf = csrf self._csrf = csrf
_csrf = csrf _csrf = csrf
headers = {'Content-Type': 'application/x-www-form-urlencoded', headers = {'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36', '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', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
'Cookie': self.cookie_str, 'Referer': 'https://rendezvousparis.hermes.com/client/register', 'Cookie': self.cookie_str, 'Referer': 'https://rendezvousparis.hermes.com/client/register',
'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Mode': 'navigate',
@@ -67,9 +68,9 @@ class Sender:
'phone_country': "FR", 'phone_number': "+33 " + contact.phone, 'email': contact.mail, 'phone_country': "FR", 'phone_number': "+33 " + contact.phone, 'email': contact.mail,
'passport_id': contact.passport, 'processing': 'on', 'cgu': 'on'} 'passport_id': contact.passport, 'processing': 'on', 'cgu': 'on'}
print(data) print(data)
print("send request with cookie:{}".format(self.cookie_str))
try: try:
proxy_to_use = self.proxy_to_use proxy_to_use = self.proxy_to_use
# proxy_to_use = PROXY_LIST[0]
print(proxy_to_use) print(proxy_to_use)
response = requests.post(url=url, proxies=proxy_to_use, verify=False, headers=headers, data=data, response = requests.post(url=url, proxies=proxy_to_use, verify=False, headers=headers, data=data,
timeout=15) timeout=15)
@@ -93,6 +94,7 @@ class Sender:
# self.cookie_str = new_coolies_str # self.cookie_str = new_coolies_str
return RequestResult.SUCCESS return RequestResult.SUCCESS
else: else:
print(response.text)
return RequestResult.BLOCKED return RequestResult.BLOCKED
except Exception as Error: except Exception as Error:
print(Error) print(Error)