From 033842fe6802d4497166c278537fd3baac689ad3 Mon Sep 17 00:00:00 2001 From: Armor00 <2654988228@qq.com> Date: Fri, 19 Jul 2024 11:03:17 +0800 Subject: [PATCH] update --- run_service_backend.py | 116 ++++++++++++++++++++++++++++++ src/ark_helper_backend/backend.py | 21 ++++-- src/util/mail.py | 75 +++++++++++++++++++ 3 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 run_service_backend.py create mode 100644 src/util/mail.py diff --git a/run_service_backend.py b/run_service_backend.py new file mode 100644 index 0000000..d3c443d --- /dev/null +++ b/run_service_backend.py @@ -0,0 +1,116 @@ +import traceback +import threading +import logging +import json +import time +import datetime + +from flask import Flask, request +from flask_cors import CORS + +from src.My_Logger.project_logger import LoggerClass +from src.ark_helper_backend.backend import ArkHelperBackend +from src.util.mail import send_batch_email + +app = Flask(__name__) +CORS(app, supports_credentials=True) +admin_key = '1145141919810' + + +@app.route("/GetCurrentStatus", methods=["POST"]) +def get_current_status(): + input_param_dict = json.loads(request.get_data()) if request.get_data() else {} + if not input_param_dict: + return 'No data supplied' + return json.dumps({'status': 0, 'data': ark_back.is_retrieving_data}) + + +@app.route("/StartDataRetrieve", methods=["POST"]) +def start_data_retrieve(): + input_param_dict = json.loads(request.get_data()) if request.get_data() else {} + if not input_param_dict: + return 'No data supplied' + if input_param_dict.get('admin_key') != admin_key: + return '403 Forbidden' + if ark_back.is_retrieving_data(): + return json.dumps({'status': 1, 'data': 'already started'}) + else: + ark_back.is_retrieving_data = True + s1 = threading.Thread(target=data_retrieve_thread) + s1.start() + return json.dumps({'status': 0, 'data': ark_back.is_retrieving_data}) + + +@app.route("/ChangeStatus", methods=["POST"]) +def change_status(): + input_param_dict = json.loads(request.get_data()) if request.get_data() else {} + if not input_param_dict: + return 'No data supplied' + if input_param_dict.get('admin_key') != admin_key: + return '403 Forbidden' + if input_param_dict.get('status') == 'on going' and not ark_back.is_retrieving_data: + ark_back.is_retrieving_data = True + s1 = threading.Thread(target=data_retrieve_thread) + s1.start() + return json.dumps({'status': 0, 'data': ark_back.is_retrieving_data}) + elif input_param_dict.get('status') == 'breaking' and ark_back.is_retrieving_data: + ark_back.is_retrieving_data = False + return json.dumps({'status': 0, 'data': ark_back.is_retrieving_data}) + else: + return json.dumps({'status': -1}) + + +@app.route("/GetData", methods=["POST"]) +def get_data(): + input_param_dict = json.loads(request.get_data()) if request.get_data() else {} + if not input_param_dict: + return 'No data supplied' + if input_param_dict.get('admin_key') != admin_key: + return '403 Forbidden' + gacha_data, payment_data = ark_back.show_data() + data = {'status': 0, 'gacha_data': gacha_data, 'payment_data': payment_data} + return json.dumps(data) + + +def data_retrieve_thread(): + try: + while 1: + time.sleep(3600) + if ark_back.is_retrieving_data: + ark_back.data_retrieve() + else: + ark_back.logger.info('Breaking') + break + except Exception as e: + print(e, traceback.format_exc()) + ark_back.logger.error(traceback.format_exc()) + send_batch_email(['2654988228@qq.com'], 'Error in ArkHelper data retrieval', str(traceback.format_exc())) + finally: + ark_back.logger.info('Data Retrieve Stopped') + + +def skland_sign_in_thread(): + try: + last_run = None + while 1: + if not ark_back.is_retrieving_data: + break + time.sleep(20) + now = datetime.datetime.now() + if now.strftime('%H:%M') == '08:00' and last_run != now.date(): + ark_back.skland_sign() + last_run = now.date() + except Exception as e: + print(e, traceback.format_exc()) + ark_back.logger.error(traceback.format_exc()) + send_batch_email(['2654988228@qq.com'], 'Error in ArkHelper Skland Sign-in', str(traceback.format_exc())) + finally: + ark_back.logger.info('Data Retrieve Stopped') + + +if __name__ == '__main__': + print('start') + logger = LoggerClass().get_log(logging.INFO) + ark_back = ArkHelperBackend(logger=logger) + app.run(host="192.168.195.194", port=59001) + diff --git a/src/ark_helper_backend/backend.py b/src/ark_helper_backend/backend.py index cf0739c..ae70c4b 100644 --- a/src/ark_helper_backend/backend.py +++ b/src/ark_helper_backend/backend.py @@ -26,9 +26,9 @@ class ArkHelperBackend: self.user_config_dict = self.load_users() self.user_data_dict = self.initiate_user_data() - # # 更新用户token - # self.refresh_user_token() - + # 更新用户token + self.refresh_user_token() + self.is_retrieving_data = True self.logger.info('ArkHelperBackend initiated') def load_users(self): @@ -184,10 +184,21 @@ class ArkHelperBackend: pay_dict = {item['orderId']: item for item in pay_data} payment_data.update(pay_dict) self.user_data_dict[phone]['payment'] = payment_data + self.logger.info(f'{phone} payment data updated') self.save_data(token_status=False, gacha_status=False) + def data_retrieve(self): + self.refresh_user_token() + self.update_payment_data() + self.update_gacha_data() + + def show_data(self): + gacha_data = {user: content['gacha'] for user, content in self.user_data_dict.items()} + payment_data = {user: content['payment'] for user, content in self.user_data_dict.items()} + return gacha_data, payment_data + if __name__ == '__main__': ak_back = ArkHelperBackend() - ak_back.update_payment_data() - + # ak_back.update_payment_data() + ak_back.skland_sign() diff --git a/src/util/mail.py b/src/util/mail.py new file mode 100644 index 0000000..7debc46 --- /dev/null +++ b/src/util/mail.py @@ -0,0 +1,75 @@ +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.mime.base import MIMEBase +from email import encoders + + +def send_batch_email(receiver_email_list, subject, content, file_path=None): + """ + Send Email to the receiver list. Can attach files if needed. + :param receiver_email_list: + :param subject: Title + :param content: Word Content + :param file_path: file list + :return: + """ + # sender config + sender_email = "ArmorServer@outlook.com" + password = "ServerOnly2024!" + + # mail content + message = MIMEMultipart() + message["Subject"] = subject + message["From"] = sender_email + + # main body + part1 = MIMEText(content, "plain") + message.attach(part1) + + if file_path and isinstance(file_path, list): + for filename in file_path: + # 指定附件的路径和文件名 + attachment = open(filename, 'rb') + + # 创建MIMEBase实例 + part = MIMEBase('application', 'octet-stream') + part.set_payload(attachment.read()) + encoders.encode_base64(part) + + # 添加邮件头 + part.add_header( + 'Content-Disposition', + f'attachment; filename= {filename}', + ) + message.attach(part) + attachment.close() + + # 登录SMTP服务器并发送邮件 + # 使用Hotmail的SMTP服务器 + server = smtplib.SMTP('smtp.office365.com', 587) + try: + server.starttls() # 启用安全传输模式 + server.login(sender_email, password) + + for receiver_email in receiver_email_list: + message["To"] = receiver_email + server.sendmail(sender_email, receiver_email, message.as_string()) + print(f"Email to {receiver_email} sent successfully!") + except Exception as e: + print(f"Error: {e}") + finally: + server.quit() + + +if __name__ == '__main__': + target_email_list = ['2654988228@qq.com'] + email_subject = 'Test Message' + email_body = """ + This is a test email + """ + + email_file_list = [] + + send_batch_email(target_email_list, email_subject, email_body, email_file_list) +