can retry the contacts in error
This commit is contained in:
+15
-5
@@ -1,7 +1,7 @@
|
|||||||
import PySimpleGUI as sg
|
import PySimpleGUI as sg
|
||||||
|
|
||||||
# First the window layout in 2 columns
|
# First the window layout in 2 columns
|
||||||
from main import start_book
|
from main import start_book, recheck_the_captcha_error_contacts
|
||||||
from pojo.ModeEnum import ModeEnum
|
from pojo.ModeEnum import ModeEnum
|
||||||
from proxy.proxy_type import ProxyType
|
from proxy.proxy_type import ProxyType
|
||||||
|
|
||||||
@@ -20,13 +20,15 @@ KEY_MANUAL = "KEY_MANUAL"
|
|||||||
GROUP_MODE = "GROUP_MODE"
|
GROUP_MODE = "GROUP_MODE"
|
||||||
GROUP_STORE = "STORE"
|
GROUP_STORE = "STORE"
|
||||||
GROUP_PROXY = "GROUP_PROXY"
|
GROUP_PROXY = "GROUP_PROXY"
|
||||||
|
KEY_RUN_ERROR_CONTACT = "KEY_RUN_ERROR_CONTACT"
|
||||||
|
|
||||||
file_list_column = [
|
file_list_column = [
|
||||||
[sg.Text('请输入联系人表的起始和结束行')],
|
[sg.Text('请输入联系人表的起始和结束行')],
|
||||||
[sg.Text('起始行', size=(15, 1)), sg.InputText(tooltip="起始行", key=KEY_START_NUMBER)],
|
[sg.Text('起始行', size=(15, 1)), sg.InputText(tooltip="起始行", key=KEY_START_NUMBER)],
|
||||||
[sg.Text('结束行', size=(15, 1)), sg.InputText(tooltip="结束行", key=KEY_END_NUMBER)],
|
[sg.Text('结束行', size=(15, 1)), sg.InputText(tooltip="结束行", key=KEY_END_NUMBER)],
|
||||||
[sg.Text('并发数', size=(15, 1)), sg.InputText(tooltip="结束行", key=KEY_MAX_WORKERS, default_text=10)],
|
[sg.Text('并发数', size=(15, 1)), sg.InputText(tooltip="结束行", key=KEY_MAX_WORKERS, default_text=10)],
|
||||||
[sg.Submit(button_text="运行", key="submit")]
|
[sg.Submit(button_text="运行", key="submit")],
|
||||||
|
[sg.Submit(button_text="重约发生错误的约会", key=KEY_RUN_ERROR_CONTACT)]
|
||||||
]
|
]
|
||||||
# For now will only show the name of the file that was chosen
|
# For now will only show the name of the file that was chosen
|
||||||
store_settings_column = [
|
store_settings_column = [
|
||||||
@@ -59,14 +61,16 @@ layout = [
|
|||||||
|
|
||||||
window = sg.Window("爱马仕约会", layout)
|
window = sg.Window("爱马仕约会", layout)
|
||||||
|
|
||||||
|
|
||||||
|
def on_no_contact_found():
|
||||||
|
sg.popup("对应联系人列表为空")
|
||||||
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
event, values = window.read()
|
event, values = window.read()
|
||||||
print(event)
|
print(event)
|
||||||
print(values)
|
print(values)
|
||||||
if event == "submit":
|
|
||||||
# try:
|
# try:
|
||||||
start_line = int(values[KEY_START_NUMBER])
|
|
||||||
end_line = int(values[KEY_END_NUMBER])
|
|
||||||
max_workers = int(values[KEY_MAX_WORKERS])
|
max_workers = int(values[KEY_MAX_WORKERS])
|
||||||
store_type = 0
|
store_type = 0
|
||||||
mode = ModeEnum.MANUAL
|
mode = ModeEnum.MANUAL
|
||||||
@@ -85,8 +89,14 @@ while True:
|
|||||||
|
|
||||||
if values[KEY_AUTOMATIC]:
|
if values[KEY_AUTOMATIC]:
|
||||||
mode = ModeEnum.AUTOMATIC
|
mode = ModeEnum.AUTOMATIC
|
||||||
|
if event == "submit":
|
||||||
|
start_line = int(values[KEY_START_NUMBER])
|
||||||
|
end_line = int(values[KEY_END_NUMBER])
|
||||||
start_book(start_line, end_line, store_choose_state=store_type, max_workers=max_workers, proxy_type=proxy_type,
|
start_book(start_line, end_line, store_choose_state=store_type, max_workers=max_workers, proxy_type=proxy_type,
|
||||||
mode=mode)
|
mode=mode)
|
||||||
|
elif event == KEY_RUN_ERROR_CONTACT:
|
||||||
|
recheck_the_captcha_error_contacts(max_workers=max_workers, store_type=store_type, mode=mode,
|
||||||
|
on_no_contact_found=on_no_contact_found)
|
||||||
|
|
||||||
elif event == "Exit" or event == sg.WIN_CLOSED:
|
elif event == "Exit" or event == sg.WIN_CLOSED:
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ from sqlalchemy import MetaData, Column, String, Integer, DateTime, Table
|
|||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
from sqlalchemy_utils import database_exists, create_database
|
from sqlalchemy_utils import database_exists, create_database
|
||||||
|
|
||||||
import definitions
|
|
||||||
import params
|
import params
|
||||||
from pojo.ReserveResultPojo import ReserveResultPojo
|
from pojo.ReserveResultPojo import ReserveResultPojo
|
||||||
from pojo.captcha_error_contact_pojo import ContactInErrorPojo, ERROR_TYPE_CAPTCHA
|
from pojo.captcha_error_contact_pojo import ContactInErrorPojo, ERROR_TYPE_CAPTCHA
|
||||||
@@ -49,15 +48,8 @@ class LocalDbManager:
|
|||||||
self.session.merge(instance)
|
self.session.merge(instance)
|
||||||
self.session.commit()
|
self.session.commit()
|
||||||
|
|
||||||
def get_all_captcha_error_contacts(self) -> list:
|
|
||||||
return self.session.query(ContactInErrorPojo).filter(ContactInErrorPojo.error_type == ERROR_TYPE_CAPTCHA).all()
|
|
||||||
|
|
||||||
def handle_success(self, reservePojo: ReserveResultPojo):
|
def handle_success(self, reservePojo: ReserveResultPojo):
|
||||||
# delete the contact from table
|
# delete the contact from table
|
||||||
self.session.query(ContactInErrorPojo).filter(ContactInErrorPojo.mail == reservePojo.email).delete()
|
self.session.query(ContactInErrorPojo).filter(ContactInErrorPojo.mail == reservePojo.email).delete()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
list = params.local_db_manager.get_all_captcha_error_contacts()
|
|
||||||
for item in list:
|
|
||||||
print(item.mail)
|
|
||||||
|
|||||||
+35
-2
@@ -1,9 +1,12 @@
|
|||||||
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
from pojo.ReserveResultPojo import ReserveResultPojo
|
from pojo.ReserveResultPojo import ReserveResultPojo
|
||||||
|
from pojo.contact_pojo import ContactPojo
|
||||||
|
|
||||||
MONGO_DB_URL = "91.121.210.60"
|
MONGO_DB_URL = "mongo.lpaconsulting.fr"
|
||||||
|
CAPTCHA_ERROR_COLLECTION_PREFIX = "CAPTCHA_ERROR_"
|
||||||
|
|
||||||
|
|
||||||
class MongoDbManager:
|
class MongoDbManager:
|
||||||
@@ -22,8 +25,38 @@ class MongoDbManager:
|
|||||||
collection_to_use.replace_one(filter={'_id': reserve.id, }, replacement=reserve.to_firestore_dict(),
|
collection_to_use.replace_one(filter={'_id': reserve.id, }, replacement=reserve.to_firestore_dict(),
|
||||||
upsert=True)
|
upsert=True)
|
||||||
except Exception as Error:
|
except Exception as Error:
|
||||||
print(Error)
|
self.logger.info(Error)
|
||||||
|
|
||||||
|
def insert_captcha_error_contact(self, contact: ContactPojo):
|
||||||
|
day = str(datetime.date.today())
|
||||||
|
collection_name = CAPTCHA_ERROR_COLLECTION_PREFIX + day
|
||||||
|
try:
|
||||||
|
collection_to_use = self.db[collection_name]
|
||||||
|
collection_to_use.replace_one(filter={'_id': contact.mail, }, replacement=contact.to_firestore_dict(),
|
||||||
|
upsert=True)
|
||||||
|
except Exception as error:
|
||||||
|
self.logger.info(error)
|
||||||
|
|
||||||
|
def get_captcha_error_contacts_for_current_day(self) -> list:
|
||||||
|
day = str(datetime.date.today())
|
||||||
|
collection_name = CAPTCHA_ERROR_COLLECTION_PREFIX + day
|
||||||
|
cursor = self.db[collection_name]
|
||||||
|
contact_list = []
|
||||||
|
for document in cursor.find():
|
||||||
|
contact_list.append(ContactPojo.from_firestore_dict(document))
|
||||||
|
return contact_list
|
||||||
|
|
||||||
|
def delete_captcha_error_contact_for_current_day(self, contact: ContactPojo):
|
||||||
|
day = str(datetime.date.today())
|
||||||
|
collection_name = CAPTCHA_ERROR_COLLECTION_PREFIX + day
|
||||||
|
collection = self.db[collection_name]
|
||||||
|
to_delete = {'_id': contact.mail}
|
||||||
|
try:
|
||||||
|
collection.delete_one(to_delete)
|
||||||
|
except Exception as error:
|
||||||
|
self.logger.info(error)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
db_manager = MongoDbManager()
|
db_manager = MongoDbManager()
|
||||||
|
print(db_manager.get_captcha_error_contacts_for_current_day())
|
||||||
|
|||||||
@@ -34,10 +34,13 @@ def start_book(start_number, end_number, store_choose_state=0, max_workers=10, p
|
|||||||
proxy)
|
proxy)
|
||||||
|
|
||||||
|
|
||||||
def recheck_the_captcha_error_contacts(store_type=0, mode: ModeEnum = ModeEnum.MANUAL):
|
def recheck_the_captcha_error_contacts(on_no_contact_found, store_type=0, mode: ModeEnum = ModeEnum.MANUAL,
|
||||||
|
max_workers=10):
|
||||||
# get all the contacts in captcha error
|
# get all the contacts in captcha error
|
||||||
contact_list = params.local_db_manager.get_all_captcha_error_contacts()
|
contact_list = params.mongo_store_manager.get_captcha_error_contacts_for_current_day()
|
||||||
with ThreadPoolExecutor(max_workers=10) as executor:
|
if len(contact_list) == 0:
|
||||||
|
on_no_contact_found()
|
||||||
|
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
||||||
for errorContact in contact_list:
|
for errorContact in contact_list:
|
||||||
contact = ContactPojo.get_contact_from_error_contact(errorContact)
|
contact = ContactPojo.get_contact_from_error_contact(errorContact)
|
||||||
proxy = get_proxy()
|
proxy = get_proxy()
|
||||||
@@ -54,4 +57,4 @@ def get_proxy(proxy_type=ProxyType.BRIGHT_DATA):
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# 修改联系人行,结束联系人行 第三个参数store等于0的时候是随机,传入1的时候是总店
|
# 修改联系人行,结束联系人行 第三个参数store等于0的时候是随机,传入1的时候是总店
|
||||||
# start_book(16, 16, store_choose_state=0, proxy_type=0)
|
# start_book(16, 16, store_choose_state=0, proxy_type=0)
|
||||||
recheck_the_captcha_error_contacts(0, mode=ModeEnum.AUTOMATIC)
|
recheck_the_captcha_error_contacts(store_type=0, mode=ModeEnum.AUTOMATIC, on_no_contact_found=lambda: None)
|
||||||
|
|||||||
+13
-17
@@ -127,9 +127,9 @@ class CommandorPage:
|
|||||||
self.logger.info("填充信息: " + str(self.contact.phone))
|
self.logger.info("填充信息: " + str(self.contact.phone))
|
||||||
self._set_name(self.contact.last_name, self.contact.first_name)
|
self._set_name(self.contact.last_name, self.contact.first_name)
|
||||||
self._setPhoneCountryAndStore()
|
self._setPhoneCountryAndStore()
|
||||||
self._setPhoneNumber("0" + str(self.contact.phone))
|
self._set_phone_number("0" + str(self.contact.phone))
|
||||||
self._set_email(self.contact.mail)
|
self._set_email(self.contact.mail)
|
||||||
self.setIdNumber(self.contact.passport)
|
self._set_id_number(self.contact.passport)
|
||||||
self._checkCgu()
|
self._checkCgu()
|
||||||
if self.appointment_mode == ModeEnum.AUTOMATIC:
|
if self.appointment_mode == ModeEnum.AUTOMATIC:
|
||||||
self.resolve_captcha()
|
self.resolve_captcha()
|
||||||
@@ -205,7 +205,7 @@ class CommandorPage:
|
|||||||
except Exception as error:
|
except Exception as error:
|
||||||
self.logger.error(error)
|
self.logger.error(error)
|
||||||
|
|
||||||
def _setPhoneNumber(self, phoneNumber):
|
def _set_phone_number(self, phoneNumber):
|
||||||
time.sleep(get_random_wait_time())
|
time.sleep(get_random_wait_time())
|
||||||
try:
|
try:
|
||||||
self.page.evaluate("""(phoneNumber)=>document.getElementById("phone_number").value =phoneNumber""",
|
self.page.evaluate("""(phoneNumber)=>document.getElementById("phone_number").value =phoneNumber""",
|
||||||
@@ -264,9 +264,7 @@ class CommandorPage:
|
|||||||
self.is_captcha_in_error = True
|
self.is_captcha_in_error = True
|
||||||
if not self.is_finished:
|
if not self.is_finished:
|
||||||
# save the error to database with contact info
|
# save the error to database with contact info
|
||||||
params.local_db_manager.insert_or_update(
|
self.handle_captcha_error()
|
||||||
get_captcha_error_contact_from_contact(self.contact, ERROR_TYPE_CAPTCHA))
|
|
||||||
params.oracle_log_sender.send_captcha_error(self.contact)
|
|
||||||
self.is_finished = True
|
self.is_finished = True
|
||||||
# no need to retry captcha, if retry ,will generate DOUBLE_REQUEST_ERROR_MESSAGE
|
# no need to retry captcha, if retry ,will generate DOUBLE_REQUEST_ERROR_MESSAGE
|
||||||
self.termine()
|
self.termine()
|
||||||
@@ -283,7 +281,7 @@ class CommandorPage:
|
|||||||
except Exception as error:
|
except Exception as error:
|
||||||
self.logger.error(error)
|
self.logger.error(error)
|
||||||
|
|
||||||
def setIdNumber(self, id):
|
def _set_id_number(self, id):
|
||||||
time.sleep(get_random_wait_time())
|
time.sleep(get_random_wait_time())
|
||||||
try:
|
try:
|
||||||
self.page.evaluate(""" (id) =>{
|
self.page.evaluate(""" (id) =>{
|
||||||
@@ -332,6 +330,7 @@ class CommandorPage:
|
|||||||
result.store_type = self.store_type
|
result.store_type = self.store_type
|
||||||
params.firebase_store_manager.save(result)
|
params.firebase_store_manager.save(result)
|
||||||
params.local_db_manager.handle_success(result)
|
params.local_db_manager.handle_success(result)
|
||||||
|
params.mongo_store_manager.delete_captcha_error_contact_for_current_day(self.contact)
|
||||||
if status is PublishType.SUCCESS:
|
if status is PublishType.SUCCESS:
|
||||||
self.on_success(result)
|
self.on_success(result)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
@@ -360,13 +359,11 @@ class CommandorPage:
|
|||||||
self.logger.error(error)
|
self.logger.error(error)
|
||||||
self.page.reload(timeout=PAGE_TIMEOUT)
|
self.page.reload(timeout=PAGE_TIMEOUT)
|
||||||
|
|
||||||
|
def handle_captcha_error(self):
|
||||||
def get_random_id_number() -> str:
|
params.local_db_manager.insert_or_update(
|
||||||
S = 8 # number of characters in the string.
|
get_captcha_error_contact_from_contact(self.contact, ERROR_TYPE_CAPTCHA))
|
||||||
ran = ''.join(random.choices(string.digits, k=S))
|
params.mongo_store_manager.insert_captcha_error_contact(self.contact)
|
||||||
id_number = "57" + str(ran)
|
params.oracle_log_sender.send_captcha_error(self.contact)
|
||||||
print("The randomly generated string is : 94" + str(ran)) # print the random data
|
|
||||||
return id_number
|
|
||||||
|
|
||||||
|
|
||||||
def on_success(result: ReserveResultPojo):
|
def on_success(result: ReserveResultPojo):
|
||||||
@@ -374,12 +371,11 @@ def on_success(result: ReserveResultPojo):
|
|||||||
|
|
||||||
|
|
||||||
def launch_page():
|
def launch_page():
|
||||||
passport_number = get_random_id_number()
|
contact = ContactPojo(phone_number="+33758912245", passport_number="82546975", last_name="XU",
|
||||||
contact = ContactPojo(phone_number="+33758912245", passport_number=passport_number, last_name="XU",
|
|
||||||
first_name="xingzhen",
|
first_name="xingzhen",
|
||||||
mail="ColbyPatel653@gmail.com", ccid="", position=0)
|
mail="ColbyPatel653@gmail.com", ccid="", position=0)
|
||||||
page = CommandorPage(contact, store_type=1)
|
page = CommandorPage(contact, store_type=1)
|
||||||
return page.start_page(params.get_proxy())
|
return page.start_page(params.get_proxy(ProxyType.BRIGHT_DATA))
|
||||||
|
|
||||||
|
|
||||||
def wait_for_otp(event: threading.Event, commandor: CommandorPage):
|
def wait_for_otp(event: threading.Event, commandor: CommandorPage):
|
||||||
|
|||||||
Reference in New Issue
Block a user