optimisation for otp

This commit is contained in:
2022-03-21 22:39:47 +01:00
parent 1a60ba3a1d
commit ea0aed7caa
2 changed files with 55 additions and 66 deletions
+38 -56
View File
@@ -3,86 +3,78 @@ import logging
import random import random
import threading import threading
import time import time
from concurrent.futures import ProcessPoolExecutor
from playwright.sync_api import sync_playwright from playwright.sync_api import sync_playwright
from pojo.contact_pojo import ContactPojo from pojo.contact_pojo import ContactPojo
from utils.excel_reader import ExcelHelper from utils.excel_reader import ExcelHelper
RDV_URL = "https://rendezvousparis.hermes.com/client/register" # RDV_URL = "https://rendezvousparis.hermes.com/client/register"
# RDV_URL = "file:///Users/lpan/Downloads/test_appointment.html" RDV_URL = "file:///Users/lpan/Downloads/test_appointment.html"
# RDV_URL = "https://www.google.fr"
# RDV_URL = "https://api.ipify.org"
global_page = None global_page = None
otp_value = None otp_value = None
user_agent_list = ExcelHelper().read_user_agent_list() user_agent_list = ExcelHelper().read_user_agent_list()
OTP_FIELD_ID = "#sms_code"
class CommandorPage: class CommandorPage:
def __init__(self): def __init__(self):
pass self.otp_value = None
def _run(self, e: threading.Event, proxy, contact): def _run(self, e: threading.Event, proxy, contact, on_ready_for_otp):
self.contact = contact
with sync_playwright() as pwright: with sync_playwright() as pwright:
self.browser = pwright.chromium.launch(headless=False, timeout=90000, proxy=proxy) self.browser = pwright.chromium.launch(headless=False, timeout=90000, proxy=proxy)
self.page = self.browser.new_page( self.page = self.browser.new_page(
user_agent=random.choice(user_agent_list)) user_agent=random.choice(user_agent_list))
global global_page global global_page
global_page = self global_page = self
self.page.on("load", self.on_page_loaded) self.page.on("load", self._on_page_loaded)
self.page.goto(RDV_URL, timeout=90000) self.page.goto(RDV_URL, timeout=90000)
# content = self.page.content() self._setPhoneCountry()
self.setPhoneCountry() self._setPhoneNumber(contact.phone)
self.setPhoneNumber(contact.phone) self._setName(contact.last_name, contact.first_name)
self.setName(contact.last_name, contact.first_name) self._set_email(contact.mail)
self.setEmail(contact.mail)
self.setIdNumber(contact.passport) self.setIdNumber(contact.passport)
self.checkCgu() self.checkCgu()
self.page.on("domcontentloaded", self.on_document_loaded) # wait for sms_code field
self.clickOnValidBtn() self.clickOnValidBtn()
self.page.goto("file:///Users/lpan/Downloads/input_otp.html")
order_sent = self.page.locator(OTP_FIELD_ID)
order_sent.wait_for(state='visible')
on_ready_for_otp(e, self)
event_is_set = e.wait() event_is_set = e.wait()
logging.debug('event set: %s', event_is_set) logging.debug('event set: %s', event_is_set)
global otp_value self.fill_otp(self.otp_value)
self.send_otp(otp_value)
self.clickOnValidBtn() self.clickOnValidBtn()
self.page.on("load", self.on_page_loaded) time.sleep(4)
time.sleep(4000) # check and send successful event
# time.sleep(1000)
def start_page(self, proxy, contact: ContactPojo) -> threading.Event: def start_page(self, proxy, contact: ContactPojo, on_ready_for_otp) -> threading.Event:
# specifying an explicit component name
e = threading.Event() e = threading.Event()
t = threading.Thread(target=self._run, args=(e, proxy, contact)) t = threading.Thread(target=self._run, args=(e, proxy, contact, on_ready_for_otp))
t.start() t.start()
return e return e
def on_page_loaded(self): def _on_page_loaded(self):
print("page loaded") print("page loaded")
print("content is " + self.page.content()) print("content is " + self.page.content())
print("url is " + self.page.url) print("url is " + self.page.url)
self.getErrors() self.getErrors()
def on_response(self):
print("on_response called")
def on_document_loaded(self): def on_document_loaded(self):
print("on_document_loaded called") print("on_document_loaded called")
def setPhoneCountry(self): def _setPhoneCountry(self):
self.page.evaluate("""()=>document.getElementById("phone_country").value = \"FR\" """) self.page.evaluate("""()=>document.getElementById("phone_country").value = \"FR\" """)
def setPhoneNumber(self, phoneNumber): def _setPhoneNumber(self, phoneNumber):
self.page.evaluate("""(phoneNumber)=>document.getElementById("phone_number").value =phoneNumber""", self.page.evaluate("""(phoneNumber)=>document.getElementById("phone_number").value =phoneNumber""",
phoneNumber) phoneNumber)
def setName(self, lastName, firstName): def _setName(self, lastName, firstName):
self.page.evaluate("""(name)=> { self.page.evaluate("""(name)=> {
document.getElementById("surname").value = name.lastName; document.getElementById("surname").value = name.lastName;
document.getElementById("name").value = name.firstName}""", {'lastName': lastName, 'firstName': firstName}) document.getElementById("name").value = name.firstName}""", {'lastName': lastName, 'firstName': firstName})
@@ -92,7 +84,7 @@ class CommandorPage:
if items: if items:
print(items.inner_html()) print(items.inner_html())
def setEmail(self, email): def _set_email(self, email):
self.page.evaluate("""(email)=>document.getElementById("email").value = email""", email) self.page.evaluate("""(email)=>document.getElementById("email").value = email""", email)
def setIdNumber(self, id): def setIdNumber(self, id):
@@ -108,41 +100,31 @@ class CommandorPage:
def clear_app_data(self): def clear_app_data(self):
pass pass
def send_otp(self, otp: str): def fill_otp(self, otp: str):
self.page.evaluate("""(otp)=> document.getElementById("sms_code").value = otp""", otp) self.page.fill(OTP_FIELD_ID, otp)
def reset_air_plan_mode(self): def reset_air_plan_mode(self):
pass pass
def main(): def launch_page(ready_for_otp) -> threading.Event:
executor = ProcessPoolExecutor(2)
loop = asyncio.get_event_loop()
loop.run_in_executor(executor, wait_for_otp)
loop.run_in_executor(executor, launch_page)
def launch_page() -> threading.Event:
proxy = { proxy = {
"server": "http://gw.ntnt.io:5959", "server": "http://gw.ntnt.io:5959",
"username": "panleicim-cc-fr-sid-179112", "username": "panleicim-cc-fr-sid-192012",
"password": "M3PZAXgW5V27" "password": "M3PZAXgW5V27"
} }
contact = ContactPojo(phone_number="+33758321759", passport_number="9533251119", last_name="Cheng", first_name="Fan", contact = ContactPojo(phone_number="+33758735284", passport_number="9537551179", last_name="Hong", first_name="Fan",
mail="checn.fan@outlook.com", ccid="", position=0) mail="hongfan@outlook.com", ccid="", position=0)
page = CommandorPage() page = CommandorPage()
return page.start_page(proxy, contact) return page.start_page(proxy, contact, ready_for_otp)
def wait_for_otp(): def wait_for_otp(event: threading.Event, commandorPage: CommandorPage):
sec = input("Press Enter otp to continue...") sec = input("Press Enter otp to continue...\n")
asyncio.sleep(1)
print("input otp is: " + sec) print("input otp is: " + sec)
commandorPage.otp_value = sec
event.set()
if __name__ == '__main__': if __name__ == '__main__':
event = launch_page() event = launch_page(wait_for_otp)
sec = input("Press Enter otp to continue...")
print("input otp is: " + sec)
otp_value = sec
event.set()
+17 -10
View File
@@ -3,27 +3,27 @@ import logging
import re import re
import sys import sys
import time import time
from threading import Event
from typing import Union from typing import Union
from gsmmodem import GsmModem from gsmmodem import GsmModem
import params import params
from commandor_page import CommandorPage
from logs.AppLogging import init_logger
from logs.LogSender import LOG_APPOINTMENT_TIMEOUT
from modems.ModemPool import ModemPool from modems.ModemPool import ModemPool
from modems.card_pool import CardPool from modems.card_pool import CardPool
from commandor import Commandor
from logs.LogSender import LOG_APPOINTMENT_TIMEOUT, LOG_SUBJECT_EVENT, TYPE_EVENT_RESET_ALL_SIM_CARDS, LOG_SUBJECT_SMS, \
TYPE_SMS_RECEIVED
from params import MODEM_POOL_PORTS, CARD_POOL_PORT, firebase_store_manager, oracle_log_sender from params import MODEM_POOL_PORTS, CARD_POOL_PORT, firebase_store_manager, oracle_log_sender
from pojo.ReserveResultPojo import ReserveResultPojo from pojo.ReserveResultPojo import ReserveResultPojo
from utils.excel_reader import ExcelHelper
from pojo.serial_modem import SerialModem from pojo.serial_modem import SerialModem
from logs.AppLogging import init_logger from utils.excel_reader import ExcelHelper
from utils.message_receiver import MessageReceiver from utils.message_receiver import MessageReceiver
OTP_TIMEOUT = 600 OTP_TIMEOUT = 600
is_finished = False is_finished = False
commandor = Commandor() commandor = CommandorPage()
contacts = [] thread_event = None
current_gsm_modem = None current_gsm_modem = None
card_pool = CardPool(CARD_POOL_PORT) card_pool = CardPool(CARD_POOL_PORT)
# used to save the current slot position # used to save the current slot position
@@ -104,7 +104,10 @@ def handle_sms(sms):
match = re.search(pattern, sms.text) match = re.search(pattern, sms.text)
otp = match.group(0) otp = match.group(0)
logger.info("otp is " + otp) logger.info("otp is " + otp)
commandor.send_otp(otp) global thread_event
commandor.otp_value = otp
thread_event.set()
# commandor.send_otp(otp)
# wait for the sms for 20 seconds # wait for the sms for 20 seconds
global is_finished global is_finished
while not is_finished: while not is_finished:
@@ -150,6 +153,11 @@ def start_listen():
receiver.start_listener(on_message_received) receiver.start_listener(on_message_received)
def on_ready_for_otp(e: Event, commandor: CommandorPage):
global thread_event
thread_event = e
def start_book(): def start_book():
slot_number = 1 slot_number = 1
slot_sum = 22 slot_sum = 22
@@ -163,7 +171,6 @@ def start_book():
# create listeners for chaque modem # create listeners for chaque modem
# read the contact, and contact the 2 objects together # read the contact, and contact the 2 objects together
excel_reader = ExcelHelper() excel_reader = ExcelHelper()
global contacts
contacts = excel_reader.read_contacts() contacts = excel_reader.read_contacts()
global current_sim_position global current_sim_position
current_sim_position = 1 current_sim_position = 1
@@ -185,7 +192,7 @@ def start_book():
logger.info("contact found for this ccid") logger.info("contact found for this ccid")
signal = modem.modem.signalStrength signal = modem.modem.signalStrength
logger.info("信号强度: " + str(signal)) logger.info("信号强度: " + str(signal))
commandor.start_page(modem.contact) commandor.start_page(modem.contact, on_ready_for_otp=on_ready_for_otp)
start_to_handle_sms(modem) start_to_handle_sms(modem)
except Exception as error: except Exception as error:
print(error) print(error)