From 4230165f419d7a8c89462652624affef29fce151 Mon Sep 17 00:00:00 2001 From: Lei PAN Date: Thu, 4 Jan 2024 21:53:33 +0100 Subject: [PATCH] first commit --- db/__init__.py | 0 db/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 159 bytes db/__pycache__/mongo_manager.cpython-39.pyc | Bin 0 -> 3328 bytes db/mongo_manager.py | 74 ++++++++++ excel_reader.py | 127 +++++++++++++++++ models/ReserveResultPojo.py | 131 ++++++++++++++++++ models/__init__.py | 0 .../ReserveResultPojo.cpython-39.pyc | Bin 0 -> 2773 bytes models/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 163 bytes .../__pycache__/contact_pojo.cpython-39.pyc | Bin 0 -> 1567 bytes models/contact_pojo.py | 51 +++++++ request_sender.py | 103 ++++++++++++++ 12 files changed, 486 insertions(+) create mode 100644 db/__init__.py create mode 100644 db/__pycache__/__init__.cpython-39.pyc create mode 100644 db/__pycache__/mongo_manager.cpython-39.pyc create mode 100755 db/mongo_manager.py create mode 100755 excel_reader.py create mode 100755 models/ReserveResultPojo.py create mode 100644 models/__init__.py create mode 100644 models/__pycache__/ReserveResultPojo.cpython-39.pyc create mode 100644 models/__pycache__/__init__.cpython-39.pyc create mode 100644 models/__pycache__/contact_pojo.cpython-39.pyc create mode 100755 models/contact_pojo.py create mode 100644 request_sender.py diff --git a/db/__init__.py b/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/db/__pycache__/__init__.cpython-39.pyc b/db/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e97639f2a1fba9669f3b2252a4bf62880094f7f GIT binary patch literal 159 zcmYe~<>g`k0-jUTQbF`%5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HEerR!OQL%nO zVqQ*aroKyla%paAUP-Zjd45rLaY15os(xZYL4Ial2}n4;D7COOwYWq-B}qR%J~J<~ aBtBlRpz;=nO>TZlX-=vg$n?)Z%m4th?kBJS literal 0 HcmV?d00001 diff --git a/db/__pycache__/mongo_manager.cpython-39.pyc b/db/__pycache__/mongo_manager.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f69fd4a70381fbccf5d984629664b1735bf41140 GIT binary patch literal 3328 zcmb7GOLH4V5T4nWRcLB-dOy_xm6?;nX2k@}?FAU2&A2YN-^zsgBmuEj?~)j?qh5DQN4K$qg&bQ&xtX z)&fskS)Q>L`GS?>S!;s-ekq??Rurw+$z_aN!Q6zz1A$25{)(M>~_6= zH_DW^ij`_IVr{d$)2!5r%}Tw-roOLKE48~jIOW@7wX#`kmZQ~5EpAT@Yonvn&jk1o zz6ye1TMDOKc|t5zXhP@eGlgqhf1+82NO9vCMjjxx3YJTYEyb>6D=gv<>)|;O}1s z5s-kQo$yzmY6mo=T_q$;4YZNYwL=PRgA-U+uSE;3e&4g*pa)SMnhpNw*0qgm*Yav) z4j{a4t0y9}-}3#RJ;|+1YY_aj;|*k6SgAO=o4fgxL<6GiR=swo&NgqedyT4G#7_#} zjZ%)cw+Dfb(t9GPLR-klz;8n4l}Pi2(}|3BOseNZo`z|ERSNfDYroKMxsI?4n_hc> z*7*gn;eiiq5``(FnG_EP!Ve03w-B4edI?7B{r$*f%y#X7u~V?Hk024cOiemGJ&Wi1 z(KxVasqHzAXa~0Eve5`D1B?oG#j%cVHQcS@e@|@Q4 zid=yaQO0(`tAKf~$ZHbqk>^mng`F!?dj=ju=n;xU;0E$-5IEk)y$Q|G;n_JCrq-uX zN+#JkW3~=6vDU<9{|JrYg@RdX}RdxLDm&gZq7r81j0flWrob^-|ff)srRB8UOCj6okE0R|yL z)=?iq6e%{hRsf2Q4W0y^6bz#frOUsxMIU1$Pr{r?v)zuD*QfBj0H5VM*r%7J^yD0n z(Wx;`V}O7@SekHxp94Xt0^qJvJ z?PGdC_s9WcWmlWsEneRMD#sV4XG= znWG2Wll)r-<%q^3YLi1awi2w8%(Eb&2X4TQobe$e{p=ZrAUh@useuxZE*&X{_*SukKc#2L0S$m7z!(J>qhjiX3RD^`)JDdbF*;P8 zRA7$Mp+08JjZlU9uGU`QK>_>(mhAiajLd^7KSXf_M3hDfap43li3dl_ANdisK1P8U zOY}Ey#E@C(eMm+jF(`5ID&T+(6jxEq)~x8#D+4@P3a5^9Zw+emgf5@Vf%|5w0ckQ| zAJlyYiSlpm%wT>4whoVxB@<-n6tYU7jW) z#3@NC?HHx&{|BYhRL3-13n$5D zBw(b_<6{Ql;t7MsXWpwBbN&bixG~~AlEDeE>v<32x^x@X^6~s4$KGH05AR<#zm{LZ z3jv<#3~rr_^*lasu$^V>;h^OtJ@PEt9H#@G&GE^bWWps-BMnQWyoNo<9{Cvx42}E} z#c>M6t@!N5nBi&VW2rK!sV{3eGiNTVx%9Fru{VDr$;?$~TdDqj4{y%Nz3L2DDI9;j zF@N12SN3uDk;8qsh|3st+|0T#d)F@2tJQKTz8`Nl%3oLROFX0`hF`{!GqIIMfk4Xz z6lh>{BDvn}H0zBr+bY(Icgl^IIUAW@C9vMa%H!j?3LYz2B}=mk(st&j=05!gc}6*D literal 0 HcmV?d00001 diff --git a/db/mongo_manager.py b/db/mongo_manager.py new file mode 100755 index 0000000..4c9f436 --- /dev/null +++ b/db/mongo_manager.py @@ -0,0 +1,74 @@ +import datetime +import logging + +from pymongo import MongoClient + +from models.ReserveResultPojo import ReserveResultPojo +from models.contact_pojo import ContactPojo + +MONGO_DB_URL = "mongo.lpaconsulting.fr" +CAPTCHA_ERROR_COLLECTION_PREFIX = "CAPTCHA_ERROR_" +BLACK_LIST = "BLACK_LIST" +ACCEPTED_APPOINTMENT_LIST = "ACCEPTED_APPOINTMENT_LIST" +CONTACT_LIST_TO_BOOK = "CONTACT_LIST_TO_BOOK" +EMAIL_LIST = "EMAIL_LIST" +DESTINATION_EMAIL_LIST = "DESTINATION_EMAIL_LIST" +LINKS_TO_VALIDATE = "LINKS_TO_VALIDATE" +INVALID_EMAIL_LIST = "INVALID_EMAIL_LIST" + + +class MongoDbManager: + def __init__(self): + client = MongoClient(MONGO_DB_URL, username='appointment', password='Rdv@2022', authSource='appointment') + self.db = client.appointment + self.logger = logging.getLogger("mongoDb") + + def insert_one(self, collection_name: str, dict: dict): + collection_to_use = self.db[collection_name] + collection_to_use.insert_one(dict) + + def insert_reserve_result(self, collection_name, reserve: ReserveResultPojo): + try: + collection_to_use = self.db[collection_name] + collection_to_use.replace_one(filter={'_id': reserve.id, }, replacement=reserve.to_firestore_dict(), + upsert=True) + except Exception as Error: + self.logger.info(Error) + + def get_all_successful_items_for_day(self) -> list: + collection_name = str(datetime.date.today()) + result_list = [] + cursor = self.db[collection_name] + for document in cursor.find(): + result_list.append(ReserveResultPojo.from_firestore_dict(document)) + return result_list + + def count_all_successful_items_for_day(self, day: str) -> list: + return self.db[day].count_documents({}) + + def get_all_successful_items_for_yesterday(self) -> list: + yesterday = datetime.date.today() - datetime.timedelta(days=1) + collection_name = str(yesterday) + result_list = [] + cursor = self.db[collection_name] + for document in cursor.find(): + result_list.append(ReserveResultPojo.from_firestore_dict(document)) + return result_list + + def get_all_successful_items_for_one_day(self, day_in_str: str) -> list: + collection_name = day_in_str + result_list = [] + cursor = self.db[collection_name] + for document in cursor.find(): + result_list.append(ReserveResultPojo.from_firestore_dict(document)) + return result_list + + def get_all_contact_to_book_list(self) -> list: + result_list = [] + cursor = self.db[CONTACT_LIST_TO_BOOK] + for document in cursor.find(): + result_list.append(ContactPojo.from_firestore_dict(document)) + return result_list + + +MONGO_STORE_MANAGER = MongoDbManager() diff --git a/excel_reader.py b/excel_reader.py new file mode 100755 index 0000000..0f98b58 --- /dev/null +++ b/excel_reader.py @@ -0,0 +1,127 @@ +import json +import random +import string + +import pandas as pandas + +from models.contact_pojo import ContactPojo + +phone_number_prefix = ['7'] +chinnese_number_prefix = ['13', '15', '18'] + + +def read_contacts(file_name) -> list: + print("read file " + file_name) + contact_list_in_json = pandas.read_excel(file_name).to_json(orient='records') + contact_dict_list = json.loads(contact_list_in_json) + contact_list = [] + for contact_dict in contact_dict_list: + if contact_dict['name']: + raw_name = contact_dict['name'].strip() + name = raw_name.split(' ') + last_name = name[0] + if len(name) == 2: + first_name = name[-1] + else: + first_name = ''.join(name[1:len(name)]) + + contact = ContactPojo(phone_number=contact_dict['phone'], + last_name=last_name, + first_name=first_name, + passport_number=contact_dict['passport'], + mail=contact_dict['email']) + contact_list.append(contact) + return contact_list + + +class ExcelHelper: + + def __init__(self): + self._df = pandas.Series() + + def check_contact_list(self, file_name): + contact_list = read_contacts(file_name) + for contact in contact_list: + if contact.first_name is None or len(contact.first_name) == 0: + print("error in firstName for " + contact.mail) + if contact.last_name is None or len(contact.last_name) == 0: + print("error in last_name for " + contact.mail) + if contact.phone is None or len(contact.phone) == 0: + print("error in phone for " + contact.mail) + if contact.passport is None or len(contact.passport) == 0: + print("error in passport_number for " + contact.mail) + if contact.mail is None or len(contact.mail) == 0: + print("error in mail for " + contact.phone_number) + + + def read_names(self, file_name) -> list: + contact_list_in_json = pandas.read_excel(file_name).to_json(orient='records') + contact_dict_list = json.loads(contact_list_in_json) + contact_list = [] + count = 2 + for contact_dict in contact_dict_list: + if contact_dict['name']: + raw_name = contact_dict['name'].strip() + name = raw_name.split(' ') + if len(name) == 1: + name = raw_name.split('\xa0') + if len(name) == 1: + print("error in " + str(name)) + last_name = name[0] + if len(name) == 2: + first_name = name[-1] + else: + first_name = ''.join(name[1:len(name)]) + + contact = ContactPojo(phone_number="", + last_name=last_name, + first_name=first_name, + passport_number="", + mail="") + + if len(first_name) == 0: + print("first_name is empty: position:" + str(count)) + print(name) + if len(last_name) == 0: + print("last_name is empty: position:" + str(count)) + count = count + 1 + contact_list.append(contact) + + return contact_list + + +def get_random_fr_phone_numbers(): + length = 8 # number of characters in the string. + ran = ''.join(random.choices(string.digits, k=length)) + id_number = random.choice(phone_number_prefix) + str(ran) + return id_number + + +def get_random_cn_phone_numbers(): + length = 8 # number of characters in the string. + ran = ''.join(random.choices(string.digits, k=length)) + id_number = random.choice(phone_number_prefix) + str(ran) + prefix = random.choice(chinnese_number_prefix) + return prefix + id_number + + +def generate_email_from_name(first_name: str, last_name: str) -> str: + length = 2 # number of characters in the string. + ran = ''.join(random.choices(string.digits, k=length)) + separator = ['.', '_', ''] + domains = ['gmail.com', 'hotmail.com', 'yahoo.com', 'aol.com', 'outlook.com', 'hotmail.fr', 'gmx.com', + 'hotmail.com', 'yahoo.com', 'aol.com', 'hotmail.com'] + email = "{}{}{}{}@{}".format(last_name.lower(), random.choice(separator), + first_name.replace("-", "").replace("'", "").lower(), ran, + random.choice(domains)) + print(email) + return email + + +def get_random_id_number() -> str: + # write_the_valid_profiles_to_excel() + S = 8 # number of characters in the string. + # call random.choices() string module to find the string in Uppercase + numeric data. + ran = ''.join(random.choices(string.digits, k=S)) + print("The randomly generated string is : 94" + str(ran)) # print the random data + return ran diff --git a/models/ReserveResultPojo.py b/models/ReserveResultPojo.py new file mode 100755 index 0000000..4b7fc3a --- /dev/null +++ b/models/ReserveResultPojo.py @@ -0,0 +1,131 @@ +import socket +from dataclasses import dataclass +from enum import Enum +from typing import Union + +from dataclasses_json import dataclass_json + + +class PublishType(Enum): + SUCCESS = "SUCCESS" + ERROR = "ERROR" + PENDING = "PENDING" + DUPLICATED = "DUPLICATED" + + +@dataclass_json +@dataclass +class ReserveResultPojo: + type: PublishType = PublishType.ERROR + phone: str = "" + message: str = "" + url: str = "" + firstName: Union[None, str] = "" + lastName: Union[None, str] = "" + email: Union[None, str] = "" + id: str = "" + accepted = None + passport: str = "" + slot_position = None + sim_position = None + ccid: str = "" + source_from: str = socket.gethostname() + store_type = 0 + url_validated = None + created_at = None + validated_at = None + + @staticmethod + def from_firestore_dict(source): + publish_type = PublishType.ERROR + if 'type' in source: + publish_type = source['type'] + if publish_type: + publish_type = PublishType[publish_type] + if 'phone' in source: + phone = source['phone'] + else: + phone = "" + if 'url' in source: + url = source['url'] + else: + url = "" + if 'id' in source: + id = source['id'] + if '_id' in source: + id = source['_id'] + else: + id = "" + if 'email' in source: + email = source['email'] + else: + email = "" + if 'lastName' in source: + lastName = source['lastName'] + else: + lastName = "" + + if 'firstName' in source: + firstName = source['firstName'] + else: + firstName = "" + + result = ReserveResultPojo(type=publish_type, phone=phone, + url=url, email=email, + firstName=firstName, lastName=lastName) + if 'accepted' in source: + accepted = source['accepted'] + result.accepted = accepted + if 'message' in source: + message = source['message'] + result.message = message + if 'source' in source: + source_from = source['source'] + result.source_from = source_from + if 'sim_position' in source: + sim_position = source['sim_position'] + result.sim_position = sim_position + if 'slot_position' in source: + slot_position = source['slot_position'] + result.slot_position = slot_position + if 'passport' in source: + passport = source['passport'] + result.passport = passport + if 'ccid' in source: + ccid = source['ccid'] + result.ccid = ccid + if 'store_type' in source: + store_type = source['store_type'] + result.store_type = store_type + if 'url_validated' in source: + url_validated = source['url_validated'] + result.url_validated = bool(url_validated) + if 'created_at' in source: + created_at = source['created_at'] + result.created_at = created_at + if 'validated_at' in source: + validated_at = source['validated_at'] + result.validated_at = validated_at + result.id = id + return result + + def to_firestore_dict(self): + dest = { + u'type': self.type.value, + u'id': self.id, + u'phone': self.phone, + u'firstName': self.firstName, + u'lastName': self.lastName, + u'email': self.email, + u'passport': self.passport, + u'url': self.url, + u'sim_position': self.sim_position, + u'slot_position': self.slot_position, + u'source_from': self.source_from, + u'created_at': self.created_at, + u'store_type': self.store_type, + u'accepted': self.accepted, + u'url_validated': self.url_validated, + } + + return dest diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models/__pycache__/ReserveResultPojo.cpython-39.pyc b/models/__pycache__/ReserveResultPojo.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfba9da34826760d032d0e7ea5850dbd2e37b6d2 GIT binary patch literal 2773 zcmbuBzi%8x6vy}X?d|=(vy(UpBqSu_5Xv=_Q50lbAqW{`#}r$zy4;MD+w9$5X7_>; zttBK!bVyWGDS(cKf|9?1igH8|iHeejf&%edAl?Fe(eq$jljU~ z>d#-xA6ka-8x4;BTnujF$nHW2LzsyX(%DMPi4|HV>2_jIoX}z2N!*DSdaS!iW#Wgv zY1}e|Cn`@3QIXER9ag0;EihkH!K(Y#zPWFPfiSm?e(*ciF*f?9u8Ltk93{gn!@yae z&L=p#JJWGGh0|(@?n{eh zw5)GB{AYT?MK&yMlIe4ZLl^BB(vF?bmA3SRc^!ccD+re-Y}P4so^V(XSa(^k$-3~Q zziX`+n6EHv9AiGS<}p@f*5dmF(7mvY^*TJR@wf}t16yKNzi!CoZ%%z{gr|AjfK4+z z1Dh2bXK|d9=S54jpBhN0*F;BjpBmxo!b6yQx^u!|+Q}*8hIVK7({ra>Mr`hx!YqtOhPqUswpNTivoO`A+$dNV7SFwlIXHIDnj&-eEa5Qy0Mr4s zncBi-`YEUj>Ijd=GmJeNvy~$%OuqoFfVxaw;WK>(>VtYrJyB))BWM-0!nBfGg;`jI zUART1@I>&Xx95u*TRw+n4VKlSTKJJI>P-Ixt%C+d0P2Va(XUL^1aE-XiW;~pFlK%g zya`?}>foMe9q=3AE$~Ls0I!Jl0sjQN4c;u8;J)Y_@F{o)yj8TotD<|r>DjyB?V=4H zh~5GJ4!j56$!kSt-^5&9EFH}Kgt;Zmb&D=|Lo6TgU%;2adqoetSvZhb4e54jLv;{n z)g#d*u}oqGLfg?;s53M?P2vfHnt7AN6%zF1{Uvn)r?5UN8!m6CbkV{)FF8hg ziu>DtUHs)`7tL1T?Plm6)n6uTioaj*3Ua{X}UB$w-DLC9!-iJ~cG5QK5dPi*IK(~m| z8)Ec>7}X!6)?-w59N<9R#;DR5H5sG+;+8Ot9ec+)UL;G)U0vx2za`*j5w`r_(eaQh8=k#80ek?6s^T z_8mLbp$oYkaN)Ddx!%~v?AeQC!sU$WA3cz{uHBRQ{WQzzbEB+D_WAM3Lyw^KM-#FY z>Mgp}`m^Zkl!eFPZeO!)J7mY#;j1vdrK%U)Qgx0j|=u#iyCf z6y>LOB);C1O{#|;G@jm5^t^c6AAaJ=j6dTPeQuUcq+Psfi`u_ler?^rE7Zuy%;!DU Mt-9T=Sf*wE0|t0Yga7~l literal 0 HcmV?d00001 diff --git a/models/__pycache__/__init__.cpython-39.pyc b/models/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f3a3e306206d264878b2693ef62465325024240 GIT binary patch literal 163 zcmYe~<>g`k0>6FJQbF`%5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HAerR!OQL%nO zVqQ*aroKyla%paAUP-Zjd45rLaY15os(xZYL4Ial2}n4;D7COOwYWq-H$Npcr&vEe dJ~J<~BtBlRpz;=n4N$N&C)EyQ!)G97004?UDX0Jd literal 0 HcmV?d00001 diff --git a/models/__pycache__/contact_pojo.cpython-39.pyc b/models/__pycache__/contact_pojo.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c35d876fc2e058d195a1463595082faaa6bd38d GIT binary patch literal 1567 zcmZuxy^h>A5GJYL-P8JfKZy|pL4XuNwzTpm61drhkVPJ>jaHILEsPxG zG&k#%z%HD8BklUM=Oe)x{)|R5-+W{`nT#2ldh?HdA29Zo7Q^Oa zafV@kfKW{Fg01+1bEf$NriAjYnDQ>gC0_{T|IVhtJJ_))cO#WHX;!4xX0$VGBP`A^ z>|YR?Ex2L}@tA2(`--3TT5Pnp(f&pU8y!Liu#YzD_>`$5c)0F?+ItzPL`|-OMX2tm z{VTSJbgb^GgDZx3N9qvq9=pB!Rf$NON7b@&LH)EUwTo-SU00@YBV^FXGF@pmKF`f| z?yu6kaDJBM3dWVqo4hKWUsjEF%y8s2jaljVB#L>sri^|{$FA*@V9A|^qo7%E0a z%Wb1M)!;scJ%eai%P;xATyZ5{iIz#xlJr^+(rr%}f-`&cUF>|Ti*qxfojbesyUDy}<`Cx} zAI=_IZS1U0%R=X~U#o1r(q&_3&nxqXt?~0&TGv%xHnc5`ezw-OnXM|N3p>mD63H4h zI;sD3v6Ok4H&X7yx4jF&yh9!i`o-~}tS4LZj4HEj0uu_hgZ4*ETDGLYF#y*RfGz>& z5-=`9#a~7*c*_Bxn7@v0MQS&5^A%i9g*kw7zCtz~61_O0&4Z?r;1o_OqovBT=38uA z!ix!?5Bi62eDU2dp)bDN$&5-yqs#0!Oj=yrZy4gom4!xj%7aFR%7;dlDu70&Duf1o zR0JIn*+4HJvByL|dJ&{_V<|z=bwTq)%4h4e=uZqW)9p){mUt9WdLArnJP_O*ldF4lo>)4{ zR=RmwDMQsCaD;eZh$tOA1V{G>k8k7 bool: + already_sent_contacts = MONGO_STORE_MANAGER.get_all_successful_items_for_day() + for required_contact in already_sent_contacts: + if contact.mail == required_contact.email: + return True + return False + + +class Sender: + + def __init__(self): + self.store_type = "random" + self.cookie = SimpleCookie() + self.cookie_str = 'datadome=~pxdHFAvsQl2rvDrTzhPgCHxu~4TBcePTTE~Cy8Rgol6oMRc11gA02VRp0Z3uEDUszCjacubNu7vbfQCh27gz8RC10u_325pt_gsMmJh1ScGvOofVJiVAbEKvSEUjd82;policy=accepted;app.sig=PhjmDkq_dI49pADppDNKxpLe_G4;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiYnRodHNYU1lvdnl4RzVGakpGRDZsQ0JtIn0=;lang=fr;' + self.cookie.load(self.cookie_str) + + def publish_message_to_queue(self, contact: ContactPojo, status: PublishType, url: str): + # create the message + if url == "https://rendezvousparis.hermes.com/client/welcome": + return + id = url.split("/")[-1] + result = ReserveResultPojo(type=status, phone=contact.phone, message=status.value, url=url, + firstName=contact.first_name, lastName=contact.last_name, email=contact.mail, + passport=contact.passport, ccid=contact.ccid) + result.id = id + result.store_type = self.store_type + result.created_at = time.strftime("%H:%M:%S", time.localtime()) + collection_name = str(datetime.date.today()) + MONGO_STORE_MANAGER.insert_reserve_result(collection_name=collection_name, reserve=result) + + def send_request_for_list(self, contact_list: list): + pass + + def send_request(self, url, contact: ContactPojo): + 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', + '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', + 'Sec-Fetch-Mode': 'navigate', + 'Sec-Fetch-Dest': 'document', + 'Accept-Language': 'fr-FR,fr;q=0.6'} + data = {'check': '', '_csrf': 'SqI0z6xt-guBLrwEQLcqhTczFWh_EpcffX9w', 'prefer': '', + 'surname': contact.last_name.capitalize(), 'name': contact.first_name.capitalize(), + 'phone_country': "FR", 'phone_number': contact.phone, 'email': contact.mail, + 'passport_id': contact.passport, 'processing': 'on', 'cgu': 'on'} + print(data) + response = requests.post(url=url, proxies=FR_PROXY_MOBILE, verify=False, headers=headers, data=data) + print(response.status_code) + if response.status_code == 200: + # add to mongodb + print(response.text) + print(response.url) + self.publish_message_to_queue(contact, status=PublishType.SUCCESS, url=response.url) + cookies_to_set = response.headers['set-cookie'] + self.cookie.load(cookies_to_set) + new_cookies = {k: v.value for k, v in self.cookie.items()} + new_coolies_str = "" + for key in new_cookies: + new_coolies_str = new_coolies_str + key + "=" + new_cookies[key] + ";" + print(new_coolies_str) + self.cookie_str = new_coolies_str + return True + else: + return False + + +if __name__ == '__main__': + sender = Sender() + contact_list = read_contacts('/Users/panlei/Desktop/yahoo_aol_valid_26-1.xlsx') + sub_contact_list = contact_list[200:300] + for con in sub_contact_list: + if not is_already_sent(con): + time.sleep(random.randint(2, 10)) + can_continue = sender.send_request(HERMES_REGISTER, con) + if not can_continue: + print("cannot continue") + break + else: + print(con.mail + "--> skip") + print(con.mail) + # sender.send_request(HERMES_REGISTER, contact_list[-5])