diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e47fcc0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +/.idea/ +/data/ +/venv/ diff --git a/.gitignore b/.gitignore index d849f6b..e47fcc0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /.idea/ -/data/ \ No newline at end of file +/data/ +/venv/ diff --git a/config/config.yml b/config/config.yml index ca8badb..26333f5 100644 --- a/config/config.yml +++ b/config/config.yml @@ -15,7 +15,7 @@ database: database: itunes_kami redis: - host: 127.0.0.1 + host: redis port: 6379 password: db: 0 diff --git a/deploy/Dockerfile b/deploy/Dockerfile index c2392c0..1fd0b3a 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -15,4 +15,4 @@ RUN pip config set global.index-url https://mirrors.hust.edu.cn/pypi/web/simple pip install -r requirements.txt --no-cache-dir && \ pip cache purge -CMD ["python", "main.py"] \ No newline at end of file +CMD ["python","-u", "main.py"] \ No newline at end of file diff --git a/deploy/docker-compose-local.yml b/deploy/docker-compose-local.yml new file mode 100644 index 0000000..58ef461 --- /dev/null +++ b/deploy/docker-compose-local.yml @@ -0,0 +1,15 @@ +services: + itunes_kami: + container_name: kami_redeem_itunes + image: itunes_kami:latest + build: + context: .. + dockerfile: ./deploy/Dockerfile + networks: + - 1panel-network + labels: + createdBy: Developer + +networks: + 1panel-network: + external: true diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 0656b6a..e17bf72 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -4,6 +4,7 @@ services: image: itunes_kami:$VERSION build: context: ../. + dockerfile: ./deploy/Dockerfile volumes: - /data/kami/itunes/config:/app/config - /data/kami/itunes/data:/app/data diff --git a/main.py b/main.py index a38b8c8..b7c5550 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ -from src.cmd.scripts import run +from src.cmd.scripts import run_task if __name__ == "__main__": - run() + run_task() diff --git a/src/cmd/scripts.py b/src/cmd/scripts.py index f8dfeec..db242ac 100644 --- a/src/cmd/scripts.py +++ b/src/cmd/scripts.py @@ -1,13 +1,11 @@ import pickle -import signal import time from datetime import timedelta, datetime -from multiprocessing import Queue, Process +from multiprocessing import Process import redis from loguru import logger -from src.cmd.custom_signal import signal_handler from src.database import redis_pool from src.entities.queues import fifo_queue from src.integrations.june.models.login import AppleAccountModel @@ -27,7 +25,6 @@ from src.service.itunes import ItunesService def run_redeem_task( master_order: RechargeQueryModel, master_node_service: MasterNodeService, - queue: Queue, reties=3, ): redis_conn = redis_pool.get_connection() @@ -114,7 +111,7 @@ def run_redeem_task( return if not response_schema.login_schema.server_id: - return run_redeem_task(master_order, master_node_service, queue, reties - 1) + return run_redeem_task(master_order, master_node_service, reties - 1) if not response_schema_from_itunes: # 登录成功,保存9分钟的登录信息 @@ -142,23 +139,14 @@ def run_redeem_task( ), response_schema_from_itunes is not None, ) - queue.put( - ItunesRedeemRequestModel( - order_no=master_order.orderNo, - status=redeem_result.status, # 这边的登录状态与apple_account_schema的status是一样的 - remark=redeem_result.remark, - amount=redeem_result.amount, - account_amount=redeem_result.balance, - ) - ) # 需要登录 if redeem_result.status == 0: redis_client.delete(f"apple_account_{master_order.account}") - return run_redeem_task(master_order, master_node_service, queue, reties - 1) + return run_redeem_task(master_order, master_node_service, reties - 1) if redeem_result.status == 40: logger.warning("充值1分钟限制,1分钟后重试") time.sleep(60) - return run_redeem_task(master_order, master_node_service, queue, reties - 1) + return run_redeem_task(master_order, master_node_service, reties - 1) # 更新兑换状态 master_node_service.update_order_status( ItunesRedeemRequestModel( @@ -171,10 +159,17 @@ def run_redeem_task( ) except Exception as e: logger.error(f"出现错误:{e}") + master_node_service.update_order_status( + ItunesRedeemRequestModel( + order_no=master_order.orderNo, + status=30, # 这边的登录状态与apple_account_schema的status是一样的 + remark="订单出错,请重新拉取", + amount=0, + account_amount=0, + ), + ) finally: redis_client.decrby(f"apple_account_{master_order.account}_count", 1) - queue.get() - logger.info(f"结束执行:{master_order}") # 如果程序正常结束,也需要执行清理操作 redis_client.close() @@ -188,37 +183,37 @@ def run_task(): # 注册信号处理程序 has_been_console = False while True: - master_node_service = MasterNodeService() - master_order = master_node_service.query_order() - if master_order.orderNo != "": - logger.info(f"当前订单:{master_order}") - run_redeem_task(master_order, master_node_service, fifo_queue) - + # master_node_service = MasterNodeService() + # # 1s获取两次订单 + # master_order = master_node_service.query_order() + # if master_order.orderNo != "": + # logger.info(f"当前订单:{master_order}") + # run_redeem_task(master_order, master_node_service, fifo_queue) # 10分钟打印一次信息 - if datetime.now().minute % 5 == 0 and not has_been_console: + if datetime.now().second % 10 == 0 and not has_been_console: has_been_console = True - print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\t暂时没有订单", flush=True) - if datetime.now().minute % 5 != 0 and has_been_console: + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\t暂时没有订单") + if datetime.now().second % 10 != 0 and has_been_console: has_been_console = False - time.sleep(2) + time.sleep(1) def run(): # signal.signal(signal.SIGINT, signal_handler) # signal.signal(signal.SIGTERM, signal_handler) has_been_console = False - process = Process(target=run_task, args=()) + process = Process(target=run_task, args=(), daemon=True) process.start() while True: - if not process.is_alive(): - process.close() - process = Process(target=run_task, args=()) - process.start() - # 10分钟打印一次信息 if datetime.now().minute % 2 == 0 and not has_been_console: has_been_console = True - print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\t心跳正常", flush=True) + print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\t心跳正常 鲜橙状态:{process.is_alive()}", + flush=True, ) if datetime.now().minute % 2 != 0 and has_been_console: has_been_console = False + if not process.is_alive(): + process.close() + process = Process(target=run_task, args=(), daemon=True) + process.start() time.sleep(5) diff --git a/src/integrations/itunes/api.py b/src/integrations/itunes/api.py index d68c058..021e3a3 100644 --- a/src/integrations/itunes/api.py +++ b/src/integrations/itunes/api.py @@ -1,12 +1,9 @@ -import json import pickle import re import time import requests from loguru import logger -from requests.exceptions import ConnectionError -from urllib3 import HTTPSConnectionPool from src.integrations.itunes.models.login import ( ItunesLoginResponse, @@ -61,7 +58,8 @@ class AppleClient: cookies=cookies, ) logger.info(f"请求用时 {time.time() - start_time}s") - except (ConnectionError, HTTPSConnectionPool) as e: + except Exception as e: + logger.info("这是发生了错误") return self.query_sign_sap_setup(signature, retries - 1) return response.text @@ -198,7 +196,7 @@ class AppleClient: headers=headers, ) logger.info(f"请求用时 {time.time() - start_time}s") - except (ConnectionError, HTTPSConnectionPool) as e: + except Exception as e: logger.warning("兑换连接错误,重试") return self.redeem(code, itunes, reties - 1) response.encoding = "utf-8" @@ -248,7 +246,7 @@ class AppleClient: result.status = 30 logger.warning("兑换状态未知:", response.text) return result - except json.JSONDecodeError as e: + except Exception as e: logger.error(f"json格式化失败:{e}\t返回值{response.text}") return RedeemFailResponseModel( status=30, diff --git a/src/integrations/june/api.py b/src/integrations/june/api.py index 30f5f3f..50bf1e1 100644 --- a/src/integrations/june/api.py +++ b/src/integrations/june/api.py @@ -84,7 +84,7 @@ class SixClient: ) # 请求用时,用s计算 logging.info(f"请求用时 {time.time() - start_time}s") - except (ConnectionError, HTTPSConnectionPool) as e: + except Exception as e: return self._do_post(post_data, type_, start_now_fun, reties - 1) if response.ok: if (