From 68f86a048505b9491d72108dab75931810602b72 Mon Sep 17 00:00:00 2001 From: Lei PAN Date: Sat, 16 Mar 2024 16:56:23 +0100 Subject: [PATCH] can exchange cookies --- models/jsdata_pojo.py | 311 ++++++++++++---------- queue_message/CookiesPublisher.py | 2 + queue_message/appointmentrequestsender.py | 101 ++++--- request_sender.py | 9 +- utils/__init__.py | 0 utils/generate_js_data.py | 30 +++ workers/captcha_result_getter.py | 33 +-- workers/sender.py | 8 +- 8 files changed, 284 insertions(+), 210 deletions(-) create mode 100644 utils/__init__.py create mode 100644 utils/generate_js_data.py diff --git a/models/jsdata_pojo.py b/models/jsdata_pojo.py index b5600b5..3eb86be 100644 --- a/models/jsdata_pojo.py +++ b/models/jsdata_pojo.py @@ -1,6 +1,10 @@ -from typing import Any -from dataclasses import dataclass import json +import random +import time +import urllib +from dataclasses import dataclass + +import jsonpickle @dataclass @@ -131,144 +135,167 @@ class JsDataPojo: wwl: bool jset: int - @staticmethod - def from_dict(obj: Any) -> 'JsDataPojo': - _opts = str(obj.get("opts")) - _ttst = int(obj.get("ttst")) - _ifov = False - _hc = int(obj.get("hc")) - _br_oh = int(obj.get("br_oh")) - _br_ow = int(obj.get("br_ow")) - _ua = str(obj.get("ua")) - _wbd = False - _tagpu = float(obj.get("tagpu")) - _wdif = False - _wdifrm = False - _npmtm = False - _br_h = int(obj.get("br_h")) - _br_w = int(obj.get("br_w")) - _isf = - _nddc = int(obj.get("nddc")) - _rs_h = int(obj.get("rs_h")) - _rs_w = int(obj.get("rs_w")) - _rs_cd = int(obj.get("rs_cd")) - _phe = - _nm = - _jsf = - _lg = str(obj.get("lg")) - _pr = int(obj.get("pr")) - _ars_h = int(obj.get("ars_h")) - _ars_w = int(obj.get("ars_w")) - _tz = int(obj.get("tz")) - _str_ss = - _str_ls = - _str_idb = - _str_odb = - _plgod = - _plg = int(obj.get("plg")) - _plgne = str(obj.get("plgne")) - _plgre = str(obj.get("plgre")) - _plgof = str(obj.get("plgof")) - _plggt = str(obj.get("plggt")) - _pltod = - _hcovdr = - _hcovdr2 = - _plovdr = - _plovdr2 = - _ftsovdr = - _ftsovdr2 = - _lb = - _eva = int(obj.get("eva")) - _lo = - _ts_mtp = int(obj.get("ts_mtp")) - _ts_tec = - _ts_tsa = - _vnd = str(obj.get("vnd")) - _bid = str(obj.get("bid")) - _mmt = str(obj.get("mmt")) - _plu = str(obj.get("plu")) - _hdn = - _awe = - _geb = - _dat = - _med = str(obj.get("med")) - _aco = str(obj.get("aco")) - _acots = - _acmp = str(obj.get("acmp")) - _acmpts = - _acw = str(obj.get("acw")) - _acwts = - _acma = str(obj.get("acma")) - _acmats = - _acaa = str(obj.get("acaa")) - _acaats = - _ac3 = str(obj.get("ac3")) - _ac3ts = - _acf = str(obj.get("acf")) - _acfts = - _acmp4 = str(obj.get("acmp4")) - _acmp4ts = - _acmp3 = str(obj.get("acmp3")) - _acmp3ts = - _acwm = str(obj.get("acwm")) - _acwmts = - _ocpt = - _vco = str(obj.get("vco")) - _vcots = - _vch = str(obj.get("vch")) - _vchts = - _vcw = str(obj.get("vcw")) - _vcwts = - _vc3 = str(obj.get("vc3")) - _vc3ts = - _vcmp = str(obj.get("vcmp")) - _vcmpts = - _vcq = str(obj.get("vcq")) - _vcqts = - _vc1 = str(obj.get("vc1")) - _vc1ts = - _dvm = int(obj.get("dvm")) - _sqt = - _so = str(obj.get("so")) - _wdw = - _cokys = str(obj.get("cokys")) - _ecpc = - _lgs = - _lgsod = - _psn = - _edp = - _addt = - _wsdc = - _ccsr = - _nuad = - _bcda = - _idn = - _capi = - _svde = - _vpbq = - _ucdv = - _spwn = - _emt = - _bfr = - _dbov = - _cfpfe = str(obj.get("cfpfe")) - _stcfp = str(obj.get("stcfp")) - _ckwa = - _glvd = str(obj.get("glvd")) - _glrd = str(obj.get("glrd")) - _wwl = - _jset = int(obj.get("jset")) - return Root(_opts, _ttst, _ifov, _hc, _br_oh, _br_ow, _ua, _wbd, _tagpu, _wdif, _wdifrm, _npmtm, _br_h, _br_w, - _isf, _nddc, _rs_h, _rs_w, _rs_cd, _phe, _nm, _jsf, _lg, _pr, _ars_h, _ars_w, _tz, _str_ss, _str_ls, - _str_idb, _str_odb, _plgod, _plg, _plgne, _plgre, _plgof, _plggt, _pltod, _hcovdr, _hcovdr2, - _plovdr, _plovdr2, _ftsovdr, _ftsovdr2, _lb, _eva, _lo, _ts_mtp, _ts_tec, _ts_tsa, _vnd, _bid, _mmt, - _plu, _hdn, _awe, _geb, _dat, _med, _aco, _acots, _acmp, _acmpts, _acw, _acwts, _acma, _acmats, - _acaa, _acaats, _ac3, _ac3ts, _acf, _acfts, _acmp4, _acmp4ts, _acmp3, _acmp3ts, _acwm, _acwmts, - _ocpt, _vco, _vcots, _vch, _vchts, _vcw, _vcwts, _vc3, _vc3ts, _vcmp, _vcmpts, _vcq, _vcqts, _vc1, - _vc1ts, _dvm, _sqt, _so, _wdw, _cokys, _ecpc, _lgs, _lgsod, _psn, _edp, _addt, _wsdc, _ccsr, _nuad, - _bcda, _idn, _capi, _svde, _vpbq, _ucdv, _spwn, _emt, _bfr, _dbov, _cfpfe, _stcfp, _ckwa, _glvd, - _glrd, _wwl, _jset) + 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): + self.opts = "endpoint,ajaxListenerPath" + self.ttst = random.randint(38, 94) + self.ifov = False + self.hc = hc + self.br_oh = br_oh + self.br_ow = br_ow + self.ua = ua + self.wbd = False + tag_pu = random.uniform(1, 10) + while len(str(tag_pu)) != 17: + tag_pu = random.uniform(1, 10) + self.tagpu = tag_pu + self.wdif = False + self.wdifrm = False + self.npmtm = False + self.br_h = br_h + self.br_w = br_w + self.isf = True + self.nddc = 1 + self.rs_h = rs_h + self.rs_w = rs_w + self.rs_cd = rs_cd + self.phe = False + self.nm = False + self.jsf = False + self.lg = "fr-FR" + self.pr = pr + self.ars_h = ars_h + self.ars_w = ars_w + self.tz = -60 + self.str_ss = True + self.str_ls = True + self.str_idb = True + self.str_odb = True + self.plgod = False + self.plg = plg + self.plgne = "err" + self.plgre = "err" + self.plgof = "err" + self.plggt = "err" + self.pltod = False + self.hcovdr = False + self.hcovdr2 = False + self.plovdr = False + self.plovdr2 = False + self.ftsovdr = False + self.ftsovdr2 = False + self.lb = False + self.eva = eva + self.lo = False + self.ts_mtp = ts_mtp + self.ts_tec = True + self.ts_tsa = True + self.vnd = vnd + self.bid = "NA" + self.mmt = "empty" + self.plu = str.join(",", plu) if isinstance(plu, list) else plu + self.hdn = False + self.awe = False + self.geb = False + self.dat = False + self.med = "defined" + self.aco = "probably" + self.acots = False + self.acmp = "probably" + self.acmpts = True + self.acw = "probably" + self.acwts = False + self.acma = "maybe" + self.acmats = False + self.acaa = "probably" + self.acaats = True + self.ac3 = "" + self.ac3ts = False + self.acf = "probably" + self.acfts = False + self.acmp4 = "maybe" + self.acmp4ts = False + self.acmp3 = "probably" + self.acmp3ts = False + self.acwm = "maybe" + self.acwmts = False + self.ocpt = False + self.vco = "" + self.vcots = False + self.vch = "probably" + self.vchts = True + self.vcw = "probably" + self.vcwts = True + self.vc3 = "maybe" + self.vc3ts = False + self.vcmp = "" + self.vcmpts = False + self.vcq = "" + self.vcqts = False + self.vc1 = "probably" + self.vc1ts = True + self.dvm = dvm + self.set_default_values() + self.glrd = glrd + self.glvd = glvd + self.wwl = False + self.jset = int(time.time()) -# Example Usage -# jsonstring = json.loads(myjsonstring) -# root = Root.from_dict(jsonstring) + def set_default_values(self): + self.sqt = False + self.so = "portrait-primary" + self.wdw = True + self.cokys = "bG9hZFRpbWVzY3NpL=" + self.ecpc = False + self.lgs = True + self.lgsod = False + self.psn = True + self.edp = False + self.addt = True + self.wsdc = True + self.ccsr = True + self.nuad = True + self.bcda = True + self.idn = True + self.capi = False + self.svde = False + self.vpbq = True + self.ucdv = False + self.spwn = False + self.emt = False + self.bfr = False + self.dbov = False + self.cfpfe = "ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudFsnXHg3MVx4NzVceDY1XHg3Mlx4NzlceDUzXHg2NVx4NmNceDY1XHg2M1x4NzRceDZmXHg3MiddKCdceDYyXHg3Mlx4NmZceDc3XHg3M1x4NjVceDcyXHg2Nlx4NmNceDZmXHg3N1x4MmRceDYzXHg2Zlx4NmVceDc0XHg2" # 4.24.1 + self.stcfp = "Oi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6NzYzMDIpCiAgICBhdCB0LmV4cG9ydHMuZGRfYWIgKGh0dHBzOi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6OTA2MjIpCiAgICBhdCBodHRwczovL2QuZGlnaXRhbC5oZXJtZXMvdGFncy5qczoyOjUxNzMz" # 4.24.1 + self.ckwa = True + + def to_url_encoded_json(self): + js_str = jsonpickle.encode(self, unpicklable=False).replace(": ", ":").replace(", ", ",") + _safe_string = urllib.parse.quote(js_str) + return _safe_string + + +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) + js = JsDataPojo(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']) + print(js.to_url_encoded_json()) + # text_file = open("jsdata.txt", "w") + # # write string to file + # text_file.write(safe_string) + # # close file + # text_file.close() + # print(safe_string) + # print(js.__dict__) diff --git a/queue_message/CookiesPublisher.py b/queue_message/CookiesPublisher.py index d0eed07..7d7a280 100644 --- a/queue_message/CookiesPublisher.py +++ b/queue_message/CookiesPublisher.py @@ -4,7 +4,9 @@ QUEUE_HOST = "appointment.lpaconsulting.fr" REQUEST_DATA_QUEUE = 'REQUEST_DATA' # REQUEST_DATA_QUEUE_TEST = 'REQUEST_DATA_TEST' REQUEST_DATA_QUEUE_TEST = 'REQUEST_DATA_TEST' +TEST_QUEUE = 'TEST_QUEUE' REQUEST_DATA_QUEUE_DE = 'REQUEST_DATA_DE' +REQUEST_DATA_OBJECT = 'REQUEST_DATA_OBJECT' credentials = pika.PlainCredentials('appointment', 'ZyuhJZ2xEYWhElhpJjy7YEpZGZwNYJz2fHIu') diff --git a/queue_message/appointmentrequestsender.py b/queue_message/appointmentrequestsender.py index a3a6e87..8b734b0 100644 --- a/queue_message/appointmentrequestsender.py +++ b/queue_message/appointmentrequestsender.py @@ -1,4 +1,5 @@ import datetime +import json import random import threading import time @@ -8,6 +9,7 @@ import pika from db.mongo_manager import MONGO_STORE_MANAGER from models.contact_pojo import ContactPojo +from models.jsdata_pojo import JsDataPojo from models.result_pojo import RequestResult from queue_message.CookiesPublisher import CookiesPublisher from utiles import is_time_between @@ -97,52 +99,67 @@ class AppointmentRequestSender(threading.Thread): self.channel.start_consuming() def on_message(self, ch, method, properties, body): - print(f" [x] Received {body}") _message_count = self.cookiesPublisher.message_count() print("message count in queue is {}".format(_message_count)) - _received_cookies = body.decode("UTF-8") - sender = Sender(_received_cookies, cookiesPublisher=self.cookiesPublisher, - proxy_to_use=random.choice(self.proxy_to_use_list)) - self.contact_list = filter_contacts(self.contact_list) - # remove already booked contacts - random.shuffle(self.contact_list) - if len(self.contact_list) > 0 and is_open() and _message_count > 5: - captchaResultGetter = CaptchaResultGetter() - print("contact number is {}".format(len(self.contact_list))) + _received_object = body.decode("UTF-8") + print(f" [x] Received {_received_object}") + if "glrd" in _received_object: + _received_dict = json.loads(_received_object) + js_data = JsDataPojo(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']) + _received_cookies = _received_dict["cookiesStr"] + sender = Sender(_received_cookies, cookiesPublisher=self.cookiesPublisher, received_dict=_received_dict, + proxy_to_use=random.choice(self.proxy_to_use_list)) self.contact_list = filter_contacts(self.contact_list) - for con in self.contact_list: - # if not is_already_sent(con): - print(con.mail) - # time.sleep(random.randint(1, 5)) - if self.valid_csrf is None: - self.valid_csrf = captchaResultGetter.get_csrf(proxy_to_use=random.choice(self.proxy_to_use_list), - cookie=body.decode("UTF-8")) - _new_cookies = captchaResultGetter.get_valid_ch_cookie(sender.proxy_to_use, - old_valid_cookie=_received_cookies) - if _new_cookies is not None: - print("new cookie is " + _new_cookies) - sender.cookie_str = _new_cookies - can_continue = sender.send_request(HERMES_REGISTER, con, csrf=self.valid_csrf) - else: - can_continue = RequestResult.COOKIES_ERROR - if can_continue == RequestResult.BLOCKED: - print("cannot continue, valid_csrf is " + str(self.valid_csrf)) - break - elif can_continue == RequestResult.PROXY_ERROR: - print("PROXY_ERROR, will not reset valid_csrf") - elif can_continue == RequestResult.COOKIES_ERROR: - print("COOKIES_ERROR, will not reset valid_csrf") - else: - print("can continue, will reset valid_csrf") - self.valid_csrf = None - # else: - # print(con.mail + "--> skip") - time.sleep(random.randint(1, 2)) - ch.basic_ack(delivery_tag=method.delivery_tag) + # remove already booked contacts + random.shuffle(self.contact_list) + if len(self.contact_list) > 0 and is_open(): + captchaResultGetter = CaptchaResultGetter() + print("contact number is {}".format(len(self.contact_list))) + self.contact_list = filter_contacts(self.contact_list) + for con in self.contact_list: + # if not is_already_sent(con): + print(con.mail) + # time.sleep(random.randint(1, 5)) + if self.valid_csrf is None: + self.valid_csrf = captchaResultGetter.get_csrf( + proxy_to_use=random.choice(self.proxy_to_use_list), + cookie=body.decode("UTF-8")) + _new_cookies = captchaResultGetter.get_valid_ch_cookie(sender.proxy_to_use, js_data, + old_valid_cookie=_received_cookies) + if _received_cookies is not None: + print("new cookie is " + _received_cookies) + sender.cookie_str = _received_cookies + can_continue = sender.send_request(HERMES_REGISTER, con, csrf=self.valid_csrf) + else: + can_continue = RequestResult.COOKIES_ERROR + if can_continue == RequestResult.BLOCKED: + print("cannot continue, valid_csrf is " + str(self.valid_csrf)) + break + elif can_continue == RequestResult.PROXY_ERROR: + print("PROXY_ERROR, will not reset valid_csrf") + elif can_continue == RequestResult.COOKIES_ERROR: + print("COOKIES_ERROR, will not reset valid_csrf") + else: + print("can continue, will reset valid_csrf") + self.valid_csrf = None + time.sleep(random.randint(1, 2)) + print("will ack method.delivery_tag: " + str(method.delivery_tag)) + ch.basic_ack(delivery_tag=method.delivery_tag) + else: + print("empty list") + time.sleep(120) + print("will basic_reject method.delivery_tag: " + str(method.delivery_tag)) + ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True) else: - print("empty list") - time.sleep(120) - ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True) + print("not a valid object") + ch.basic_ack(delivery_tag=method.delivery_tag) def run(self): print(threading.currentThread().name + " starts") diff --git a/request_sender.py b/request_sender.py index 7904d71..43847b7 100644 --- a/request_sender.py +++ b/request_sender.py @@ -7,7 +7,8 @@ from threading import Thread from db.mongo_manager import MONGO_STORE_MANAGER from excel_reader import read_contacts 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 from queue_message.appointmentrequestsender import AppointmentRequestSender, REQUEST_DATA_QUEUE from utiles import is_time_between from workers.captcha_result_getter import CaptchaResultGetter, HERMES_REGISTER @@ -88,14 +89,14 @@ def send_appointment_request(message_queue_name, _contact_list): if __name__ == '__main__': - contacts_file_path = '~/Desktop/contact_list_2024-03-14-2.xlsx' + contacts_file_path = '~/Desktop/contact_list_2024-03-09.xlsx' _contact_list = read_contacts(contacts_file_path) - _segment_number = 1 + _segment_number = 10 for i in range(0, _segment_number): print(i) _step = int(len(_contact_list) / _segment_number) _sublist = _contact_list[i:_step * (i + 1)] print(_sublist[0]) print(_sublist[-1]) - _thread1 = Thread(target=send_appointment_request, args=(REQUEST_DATA_QUEUE_DE, _sublist)) + _thread1 = Thread(target=send_appointment_request, args=(REQUEST_DATA_OBJECT, _sublist)) _thread1.start() diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/generate_js_data.py b/utils/generate_js_data.py new file mode 100644 index 0000000..4ed23ed --- /dev/null +++ b/utils/generate_js_data.py @@ -0,0 +1,30 @@ +from models.jsdata_pojo import JsDataPojo + + +def generate_js_data(): + pass + + +if __name__ == '__main__': + glrd = "ANGLE (Qualcomm, Adreno (TM) 650, OpenGL ES 3.2)" + glvd = "Google Inc. (Qualcomm)" + hc = 6 + br_oh = 646 + br_ow = 360 + br_h = 646 + br_w = 360 + rs_h = 1440 + rs_w = 2560 + rs_cd = 24 + ars_h = 800 + ars_w = 360 + eva = 33 + vnd = "Google Inc." + plu = "LNGqVpzZ,yCJEKNO" + plg = 2 + ua = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36" + jsData = JsDataPojo(glrd=glrd, hc=hc, ua=ua, br_oh=br_oh, br_ow=br_ow, br_h=br_h, br_w=br_w, rs_h=rs_h, rs_w=rs_w, + eva=eva, + rs_cd=rs_cd, plg=plg, plu=plu, ars_h=ars_h, ars_w=ars_w, vnd=vnd, glvd=glvd) + + print(jsData) \ No newline at end of file diff --git a/workers/captcha_result_getter.py b/workers/captcha_result_getter.py index 705c0f5..3579d72 100644 --- a/workers/captcha_result_getter.py +++ b/workers/captcha_result_getter.py @@ -5,6 +5,7 @@ from time import time from typing import Union import requests +from models.jsdata_pojo import JsDataPojo from workers.proxies_constants import PROXY_LIST_FR API_KEY = "d66aaf490d8aa424a5175e1fbd1aadea" @@ -97,9 +98,16 @@ class CaptchaResultGetter: print(error) return None - def get_valid_ch_cookie(self, proxy_to_use, old_valid_cookie: str = None, dvm=4, hc=6) -> Union[str, None]: + def get_ch_raw_data_from_js_data(self, js_data: JsDataPojo, old_valid_cookie) -> str: + _tag_version = "4.24.1" + _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]: 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': '*/*', 'referer': 'https://rendezvousparis.hermes.com/', 'origin': 'https://rendezvousparis.hermes.com/', @@ -109,13 +117,14 @@ class CaptchaResultGetter: 'sec-fetch-dest': 'empty', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'fr-FR,fr;q=0.6'} - print(proxy_to_use) + # print(proxy_to_use) print("send request to get new cookie") print(headers) try: # tag_pu = 10 * Math.random() response = requests.post(url="https://d.digital.hermes/js/", headers=headers, verify=False, - data=self.get__ch_raw_data(old_valid_cookie=old_valid_cookie, dvm=dvm, hc=hc), + data=self.get_ch_raw_data_from_js_data(js_data=js_data, + old_valid_cookie=old_valid_cookie), proxies=proxy_to_use, timeout=15) print(response.status_code) if response.status_code == 200: @@ -130,22 +139,6 @@ class CaptchaResultGetter: print(error) return None - def get__ch_raw_data(self, old_valid_cookie: str = None, dvm=4, hc=6): - _raw_data = None - js_set = int(time()) - tag_pu = random.uniform(1, 10) - while len(str(tag_pu)) != 17: - tag_pu = random.uniform(1, 10) - - if old_valid_cookie is None: - _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%22ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudFsnXHg3MVx4NzVceDY1XHg3Mlx4NzlceDUzXHg2NVx4NmNceDY1XHg2M1x4NzRceDZmXHg3MiddKCdceDYyXHg3Mlx4NmZceDc3XHg3M1x4NjVceDcyXHg2Nlx4NmNceDZmXHg3N1x4MmRceDYzXHg2Zlx4NmVceDc0XHg2%22%2C%22stcfp%22%3A%22aWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6NzUxMjIpCiAgICBhdCA8Y29tcHV0ZWQ%2BIFthcyBkZF9hYV0gKGh0dHBzOi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6ODc0OTcpCiAgICBhdCBodHRwczovL2QuZGlnaXRhbC5oZXJtZXMvdGFncy5qczoyOjUxNTM1%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{}%7D&eventCounters=%5B%5D&jsType=ch&cid=HG1lksF0XhPB_eV20MFkjOIO23fSH1DxZ1lsGCJ3opnnvGKp_7gihsaJK76kIwphZYvAkAs19ohywGLxvAi~5F3VT6kg8ubmzYfBNcdbfXabTcb7Z4QNDG5UlD7lri90&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv=4.19.3".format( - hc, tag_pu, dvm, js_set) - else: - _raw_data = "jsData=%7B%22opts%22%3A%22endpoint%2CajaxListenerPath%22%2C%22ttst%22%3A53%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%22isf%22%3Atrue%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%22LNGqVpzZ%2CyCJEKNO%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%22ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudFsnXHg3MVx4NzVceDY1XHg3Mlx4NzlceDUzXHg2NVx4NmNceDY1XHg2M1x4NzRceDZmXHg3MiddKCdceDYyXHg3Mlx4NmZceDc3XHg3M1x4NjVceDcyXHg2Nlx4NmNceDZmXHg3N1x4MmRceDYzXHg2Zlx4NmVceDc0XHg2%22%2C%22stcfp%22%3A%22Oi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6NzYzMDIpCiAgICBhdCB0LmV4cG9ydHMuZGRfYWIgKGh0dHBzOi8vZC5kaWdpdGFsLmhlcm1lcy90YWdzLmpzOjI6OTA2MjIpCiAgICBhdCBodHRwczovL2QuZGlnaXRhbC5oZXJtZXMvdGFncy5qczoyOjUxNzMz%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{}%7D&eventCounters=%5B%5D&jsType=ch&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv=4.24.1".format( - hc, tag_pu, dvm, js_set, old_valid_cookie) - print("raw data is " + _raw_data) - return _raw_data - def get_raw_data(self, old_valid_cookie: str = None, dvm=4, hc=6): _raw_data = None diff --git a/workers/sender.py b/workers/sender.py index 53d7c1a..db276eb 100644 --- a/workers/sender.py +++ b/workers/sender.py @@ -1,4 +1,5 @@ import datetime +import json import random import time from http.cookies import SimpleCookie @@ -14,13 +15,14 @@ from workers.proxies_constants import PROXY_LIST_FR class Sender: - def __init__(self, cookie_str, cookiesPublisher: CookiesPublisher, proxy_to_use): + def __init__(self, cookie_str, cookiesPublisher: CookiesPublisher, received_dict, proxy_to_use): self.store_type = "random" self.cookie = SimpleCookie() self.cookiesPublisher = cookiesPublisher # self.cookie_str = 'datadome=~pxdHFAvsQl2rvDrTzhPgCHxu~4TBcePTTE~Cy8Rgol6oMRc11gA02VRp0Z3uEDUszCjacubNu7vbfQCh27gz8RC10u_325pt_gsMmJh1ScGvOofVJiVAbEKvSEUjd82;policy=accepted;app.sig=PhjmDkq_dI49pADppDNKxpLe_G4;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiYnRodHNYU1lvdnl4RzVGakpGRDZsQ0JtIn0=;lang=fr;' self.cookie_str = cookie_str self._csrf = None + self.received_dict = received_dict self.proxy_to_use = proxy_to_use self.cookie.load(self.cookie_str) @@ -85,7 +87,9 @@ class Sender: new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";" print("will publish to queue {}".format(new_coolies_str)) # upload the cookie to queue - self.cookiesPublisher.publish_body(new_coolies_str) + self.received_dict['cookiesStr'] = new_coolies_str + print("body in json:{}".format(json.dumps(self.received_dict))) + self.cookiesPublisher.publish_body(json.dumps(self.received_dict)) # self.cookie_str = new_coolies_str return RequestResult.SUCCESS else: