From 71c1ff5feaaebc3b30d5a949b05b70e99da22d25 Mon Sep 17 00:00:00 2001 From: PAN Lei Date: Wed, 20 Apr 2022 12:56:06 +0200 Subject: [PATCH] add check sms and sen email if appointment is accepted --- .gitignore | 3 +- db/.~sim_infos.xlsx | Bin 165 -> 0 bytes db/DbManager.py | 11 ++++- docs/.~mobile_user_agent_list.xlsx | Bin 165 -> 0 bytes docs/sim_infos.xlsx | Bin 0 -> 62309 bytes modems/ModemPool.py | 17 ++++--- notification/AcceptedResultPojo.py | 25 +++++++++++ notification/mailer.py | 9 ++-- pojo/SimInfoPojo.py | 9 +++- templates/appointment_results.html | 15 +++---- check_results.py => utils/check_results.py | 0 utils/excel_reader.py | 29 +++++++++++- .../export_valid_profiles.py | 0 utils/utils.py | 0 workers/commandor_page.py | 1 - workers/wait_sms_worker.py | 42 ++++++++++++++++-- 16 files changed, 130 insertions(+), 31 deletions(-) delete mode 100644 db/.~sim_infos.xlsx delete mode 100644 docs/.~mobile_user_agent_list.xlsx create mode 100644 docs/sim_infos.xlsx create mode 100644 notification/AcceptedResultPojo.py rename check_results.py => utils/check_results.py (100%) rename export_valid_profiles.py => utils/export_valid_profiles.py (100%) delete mode 100644 utils/utils.py diff --git a/.gitignore b/.gitignore index 8268d66..4702924 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ pojo/__pycache__/ appointment.log utils/*.log .~contact.xlsx -/db/sim_infos.xlsx +/docs/sim_infos.xlsx .env +/docs/.~sim_infos.xlsx diff --git a/db/.~sim_infos.xlsx b/db/.~sim_infos.xlsx deleted file mode 100644 index 4c491c68136d506a1c8b63fecd8b209e811384ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 ccmZR{DM-vyAQ`YQ= batch_size: return self._delete_collection(coll_ref, batch_size) + # 删除数据库中所有的sim卡信息 def clear_all_sim_info(self): coll_ref = self._db.collection(SIM_INFOS) self._delete_collection(coll_ref, self.batch_size) + ## 读取数据库中的sim卡信息,然后写到sim_infos.xlsx文件中 def save_to_excel(self): # Start from the first cell. Rows and columns are zero indexed. sim_info_list = [] @@ -101,8 +103,15 @@ class DataManager: row = 0 col = 0 # Create a workbook and add a worksheet. - workbook = xlsxwriter.Workbook('sim_infos.xlsx') + workbook = xlsxwriter.Workbook(definitions.ROOT_DIR + "/docs/sim_infos.xlsx") worksheet = workbook.add_worksheet() + worksheet.write(row, 0, "phone") + worksheet.write(row, 1, "ccid") + worksheet.write(row, 2, "name") + worksheet.write(row, 3, "passport") + worksheet.write(row, 4, "email") + worksheet.write(row, 5, "position") + row = row + 1 for info in sim_info_list: # Iterate over the data and write it out row by row. if info.operator == Operator.LYCAMOBILE.value: diff --git a/docs/.~mobile_user_agent_list.xlsx b/docs/.~mobile_user_agent_list.xlsx deleted file mode 100644 index 4c491c68136d506a1c8b63fecd8b209e811384ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 ccmZR{DM-vyAQ`YQ`(%mS6z>uPd(jg%@AS#_o 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ℑl46v-=g;_4_*44v#`F_^uGip`XO5Nvp?vs=6& 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 bool: # use SIM Card storage diff --git a/notification/AcceptedResultPojo.py b/notification/AcceptedResultPojo.py new file mode 100644 index 0000000..fcbabbb --- /dev/null +++ b/notification/AcceptedResultPojo.py @@ -0,0 +1,25 @@ +from dataclasses import dataclass + +from dataclasses_json import dataclass_json + +from pojo.SimInfoPojo import SimInfoPojo + + +@dataclass_json +@dataclass +class AcceptedResultPojo: + + def __init__(self, msg: str, slot_position, sim_position, passport, email, name, phone): + self.sms_msg = msg + self.slot_position = slot_position + self.sim_position = sim_position + self.passport = "{}".format(int(passport)) + self.email = email + self.name = name + self.phone = phone + + +def get_accepted_result_from(sms, sim_info: SimInfoPojo) -> AcceptedResultPojo: + return AcceptedResultPojo(sms.text, slot_position=sim_info.slot_position, sim_position=sim_info.sim_position, + passport=sim_info.passport, email=sim_info.email, phone=sim_info.phone, + name=sim_info.name) diff --git a/notification/mailer.py b/notification/mailer.py index bdf3908..0fdd92f 100644 --- a/notification/mailer.py +++ b/notification/mailer.py @@ -6,6 +6,7 @@ import boto3 import definitions import params +from notification.AcceptedResultPojo import AcceptedResultPojo from pojo.ReserveResultPojo import ReserveResultPojo, PublishType TEMPLATE_NAME = 'scrapy_template_email' @@ -26,10 +27,10 @@ class Mailer: aws_access_key_id="AKIAU67WLKZUXEHXDJB5", aws_secret_access_key=secret) - def send_email(self, result_list: list): + def send_email(self, result: AcceptedResultPojo): # recipients = params.firebase_store_manager.get_mail_list() - recipients = ['panleicim@gmail.com'] + recipients = ['panleicim@gmail.com','kamenonly@gmail.com'] mytemplate = Template(filename=definitions.ROOT_DIR + "/templates/appointment_results.html") self.logger.info("send email to " + str(recipients)) @@ -41,12 +42,12 @@ class Mailer: Content={ 'Simple': { 'Subject': { - 'Data': '约会结果', + 'Data': '约会成功', 'Charset': 'utf8' }, 'Body': { 'Html': { - 'Data': mytemplate.render(result_list=result_list), + 'Data': mytemplate.render(result=result), 'Charset': 'utf8' } } diff --git a/pojo/SimInfoPojo.py b/pojo/SimInfoPojo.py index 88a58c5..dd20ad4 100644 --- a/pojo/SimInfoPojo.py +++ b/pojo/SimInfoPojo.py @@ -13,7 +13,9 @@ class SimInfoPojo: passport: str email: str - def __init__(self, phone: str, ccid: str, position, operator: str, slot_position, sim_position, + def __init__(self, phone: str, ccid: str, position, operator: str, slot_position, sim_position, name=None, + passport=None, + email=None, update_at: int = int(time.time())): self.phone = phone self.ccid = ccid @@ -22,6 +24,9 @@ class SimInfoPojo: self.operator = operator self.slot_position = slot_position self.sim_position = sim_position + self.name = name + self.passport = passport + self.email = email @staticmethod def from_firestore_dict(source): @@ -52,6 +57,8 @@ class SimInfoPojo: u'operator': self.operator, u'slot_position': self.slot_position, u'sim_position': self.sim_position, + u'email': self.email, + u'passport': self.passport, } return dest diff --git a/templates/appointment_results.html b/templates/appointment_results.html index 1e0ef80..2a7a2c6 100644 --- a/templates/appointment_results.html +++ b/templates/appointment_results.html @@ -1,9 +1,6 @@ -
    - % for result in result_list: -
  • 姓名:${result.lastName} ${result.firstName}, 电话: ${result.phone}, -
    邮件: ${result.email}, -
    护照: ${result.passport} -
    SIM卡位置: 卡池第${result.slot_position}行,第${result.sim_position}列 -
  • - % endfor -
\ No newline at end of file +姓名:${result.name} +
电话: ${result.phone} +
邮件: ${result.email}, +
护照: ${result.passport} +
SIM卡位置: 卡池第${result.slot_position}行,第${result.sim_position}列 +
短信: ${result.sms_msg} \ No newline at end of file diff --git a/check_results.py b/utils/check_results.py similarity index 100% rename from check_results.py rename to utils/check_results.py diff --git a/utils/excel_reader.py b/utils/excel_reader.py index 16256c5..ced33ba 100644 --- a/utils/excel_reader.py +++ b/utils/excel_reader.py @@ -3,7 +3,10 @@ import json import pandas as pandas import definitions +import params +from pojo.SimInfoPojo import SimInfoPojo from pojo.contact_pojo import ContactPojo +from utils.operator import check_operator class ExcelHelper: @@ -36,7 +39,29 @@ class ExcelHelper: user_agents.append(user_agent) return user_agents - def read_contacts(self,file_name="/contact_all.xlsx") -> list: + def read_sim_info(self) -> list: + sim_info_list_in_json = pandas.read_excel(definitions.ROOT_DIR + "/docs/sim_infos.xlsx").to_json(orient='records') + sim_info_dict_list = json.loads(sim_info_list_in_json) + sim_info_list = [] + for contact_dict in sim_info_dict_list: + position = contact_dict['position'] + slot_position = int(int(position) / len(params.MODEM_POOL_PORTS)) + 1 + sim_position = int(position) % len(params.MODEM_POOL_PORTS) + ccid = contact_dict['ccid'] + operator = check_operator(ccid).name + siminfo = SimInfoPojo(phone=contact_dict['phone'], + name=contact_dict['name'], + ccid=ccid, + passport=contact_dict['passport'], + position=contact_dict['position'], + slot_position=slot_position, + sim_position=sim_position, + operator=operator, + email=contact_dict['email']) + sim_info_list.append(siminfo) + return sim_info_list + + def read_contacts(self, file_name="/contact_all.xlsx") -> list: contact_list_in_json = pandas.read_excel(definitions.ROOT_DIR + file_name).to_json(orient='records') contact_dict_list = json.loads(contact_list_in_json) contact_list = [] @@ -58,4 +83,4 @@ class ExcelHelper: if __name__ == '__main__': helper = ExcelHelper() # helper.generate_exel_from_txt() - print(helper.read_user_agent_list()) + print(helper.read_sim_info()) diff --git a/export_valid_profiles.py b/utils/export_valid_profiles.py similarity index 100% rename from export_valid_profiles.py rename to utils/export_valid_profiles.py diff --git a/utils/utils.py b/utils/utils.py deleted file mode 100644 index e69de29..0000000 diff --git a/workers/commandor_page.py b/workers/commandor_page.py index 7817bc8..b90a6ec 100644 --- a/workers/commandor_page.py +++ b/workers/commandor_page.py @@ -21,7 +21,6 @@ RDV_URL = "https://rendezvousparis.hermes.com/client/register" # # RDV_URL = "file:///Users/lpan/Downloads/test_appointment.html" # RDV_URL = "https://api.ipify.org" -# RDV_URL = "https://duoyi.org/" # RDV_URL ="https://bot.sannysoft.com/" otp_value = None user_agent_list = ExcelHelper().read_user_agent_list() diff --git a/workers/wait_sms_worker.py b/workers/wait_sms_worker.py index 0ee64ed..ce33e70 100644 --- a/workers/wait_sms_worker.py +++ b/workers/wait_sms_worker.py @@ -1,13 +1,23 @@ +import json import logging import threading import time +from typing import Union + +from gsmmodem.modem import Sms import params from definitions import SMS_TIMEOUT +from notification.AcceptedResultPojo import get_accepted_result_from +from notification.mailer import Mailer +from pojo.SimInfoPojo import SimInfoPojo from pojo.serial_modem import SerialModem +from utils.excel_reader import ExcelHelper class WaitSmsWorker: + HERMES_RDV = "HERMES RDV" + ACCEPT_SENTENCE = "We are pleased to confirm your appointment" def __init__(self, serial_modem: SerialModem): self.serial_modem = serial_modem @@ -18,13 +28,12 @@ class WaitSmsWorker: "sms received for phone:{}(ccid:{})".format(self.serial_modem.phone_number, self.serial_modem.ccid)) self.logger.info( u'== SMS message received ==\nFrom: {0}\nTime: {1}\nMessage:\n{2}\n'.format(sms.number, sms.time, sms.text)) - # extract the otp number + self.check_sms(sms, self.serial_modem.ccid) params.oracle_log_sender.send_sms_reception_log(sms.number, sms.text, self.serial_modem.ccid) def run(self): t = threading.Thread(target=self.start_wait) t.start() - # t.join() def start_wait(self): try: @@ -36,7 +45,6 @@ class WaitSmsWorker: self.serial_modem.modem.smsTextMode = False self.logger.info('Waiting for SMS message, for phone number ' + str(self.serial_modem.phone_number)) listen_at = time.time() - # threading.current_thread().join(self.OTP_TIMEOUT) while True: # self.logger.info("sleep for 2s in thread({})".format(threading.currentThread().name)) time.sleep(5) @@ -47,3 +55,31 @@ class WaitSmsWorker: # save the contact in timeout self.serial_modem.modem.close() return + + @staticmethod + def find_info_via_ccid(ccid) -> Union[None, SimInfoPojo]: + sim_list = ExcelHelper().read_sim_info() + found_sim_list = [contact for contact in sim_list if + contact.ccid.replace("F", "") == ccid.replace("F", "")] + if len(found_sim_list) > 0: + print(found_sim_list[0].to_firestore_dict()) + return found_sim_list[0] + else: + return None + + def check_sms(self, sms: Sms, ccid: str): + self.logger.info("check sms") + if sms.number == self.HERMES_RDV: + if self.ACCEPT_SENTENCE in sms.text: + self.logger.info("收到来自hermes的短信,准备发送邮件") + mailer = Mailer() + sim_info = self.find_info_via_ccid(ccid) + accepted_result = get_accepted_result_from(sms, sim_info) + mailer.send_email(accepted_result) + + +if __name__ == '__main__': + worker = WaitSmsWorker(None) + sms = Sms("HERMES RDV", + "We are pleased to confirm your appointment. You will be welcomed on Apr 14, 2022 in our store at 17 rue de Sèvres at 4:45 PM. The given hour may be subje") + worker.check_sms(sms, "8933130070216295758F")