test: 尝试修复突然中断的行为

This commit is contained in:
danial
2024-08-31 21:07:31 +08:00
parent 3dcf887ef1
commit 2344dca725
10 changed files with 60 additions and 47 deletions

3
.dockerignore Normal file
View File

@@ -0,0 +1,3 @@
/.idea/
/data/
/venv/

3
.gitignore vendored
View File

@@ -1,2 +1,3 @@
/.idea/ /.idea/
/data/ /data/
/venv/

View File

@@ -15,7 +15,7 @@ database:
database: itunes_kami database: itunes_kami
redis: redis:
host: 127.0.0.1 host: redis
port: 6379 port: 6379
password: password:
db: 0 db: 0

View File

@@ -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 install -r requirements.txt --no-cache-dir && \
pip cache purge pip cache purge
CMD ["python", "main.py"] CMD ["python","-u", "main.py"]

View File

@@ -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

View File

@@ -4,6 +4,7 @@ services:
image: itunes_kami:$VERSION image: itunes_kami:$VERSION
build: build:
context: ../. context: ../.
dockerfile: ./deploy/Dockerfile
volumes: volumes:
- /data/kami/itunes/config:/app/config - /data/kami/itunes/config:/app/config
- /data/kami/itunes/data:/app/data - /data/kami/itunes/data:/app/data

View File

@@ -1,4 +1,4 @@
from src.cmd.scripts import run from src.cmd.scripts import run_task
if __name__ == "__main__": if __name__ == "__main__":
run() run_task()

View File

@@ -1,13 +1,11 @@
import pickle import pickle
import signal
import time import time
from datetime import timedelta, datetime from datetime import timedelta, datetime
from multiprocessing import Queue, Process from multiprocessing import Process
import redis import redis
from loguru import logger from loguru import logger
from src.cmd.custom_signal import signal_handler
from src.database import redis_pool from src.database import redis_pool
from src.entities.queues import fifo_queue from src.entities.queues import fifo_queue
from src.integrations.june.models.login import AppleAccountModel from src.integrations.june.models.login import AppleAccountModel
@@ -27,7 +25,6 @@ from src.service.itunes import ItunesService
def run_redeem_task( def run_redeem_task(
master_order: RechargeQueryModel, master_order: RechargeQueryModel,
master_node_service: MasterNodeService, master_node_service: MasterNodeService,
queue: Queue,
reties=3, reties=3,
): ):
redis_conn = redis_pool.get_connection() redis_conn = redis_pool.get_connection()
@@ -114,7 +111,7 @@ def run_redeem_task(
return return
if not response_schema.login_schema.server_id: 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: if not response_schema_from_itunes:
# 登录成功保存9分钟的登录信息 # 登录成功保存9分钟的登录信息
@@ -142,23 +139,14 @@ def run_redeem_task(
), ),
response_schema_from_itunes is not None, 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: if redeem_result.status == 0:
redis_client.delete(f"apple_account_{master_order.account}") 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: if redeem_result.status == 40:
logger.warning("充值1分钟限制1分钟后重试") logger.warning("充值1分钟限制1分钟后重试")
time.sleep(60) 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( master_node_service.update_order_status(
ItunesRedeemRequestModel( ItunesRedeemRequestModel(
@@ -171,10 +159,17 @@ def run_redeem_task(
) )
except Exception as e: except Exception as e:
logger.error(f"出现错误:{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: finally:
redis_client.decrby(f"apple_account_{master_order.account}_count", 1) redis_client.decrby(f"apple_account_{master_order.account}_count", 1)
queue.get()
logger.info(f"结束执行:{master_order}")
# 如果程序正常结束,也需要执行清理操作 # 如果程序正常结束,也需要执行清理操作
redis_client.close() redis_client.close()
@@ -188,37 +183,37 @@ def run_task():
# 注册信号处理程序 # 注册信号处理程序
has_been_console = False has_been_console = False
while True: while True:
master_node_service = MasterNodeService() # master_node_service = MasterNodeService()
master_order = master_node_service.query_order() # # 1s获取两次订单
if master_order.orderNo != "": # master_order = master_node_service.query_order()
logger.info(f"当前订单:{master_order}") # if master_order.orderNo != "":
run_redeem_task(master_order, master_node_service, fifo_queue) # logger.info(f"当前订单:{master_order}")
# run_redeem_task(master_order, master_node_service, fifo_queue)
# 10分钟打印一次信息 # 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 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暂时没有订单")
if datetime.now().minute % 5 != 0 and has_been_console: if datetime.now().second % 10 != 0 and has_been_console:
has_been_console = False has_been_console = False
time.sleep(2) time.sleep(1)
def run(): def run():
# signal.signal(signal.SIGINT, signal_handler) # signal.signal(signal.SIGINT, signal_handler)
# signal.signal(signal.SIGTERM, signal_handler) # signal.signal(signal.SIGTERM, signal_handler)
has_been_console = False has_been_console = False
process = Process(target=run_task, args=()) process = Process(target=run_task, args=(), daemon=True)
process.start() process.start()
while True: while True:
if not process.is_alive():
process.close()
process = Process(target=run_task, args=())
process.start()
# 10分钟打印一次信息 # 10分钟打印一次信息
if datetime.now().minute % 2 == 0 and not has_been_console: if datetime.now().minute % 2 == 0 and not has_been_console:
has_been_console = True 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: if datetime.now().minute % 2 != 0 and has_been_console:
has_been_console = False has_been_console = False
if not process.is_alive():
process.close()
process = Process(target=run_task, args=(), daemon=True)
process.start()
time.sleep(5) time.sleep(5)

View File

@@ -1,12 +1,9 @@
import json
import pickle import pickle
import re import re
import time import time
import requests import requests
from loguru import logger from loguru import logger
from requests.exceptions import ConnectionError
from urllib3 import HTTPSConnectionPool
from src.integrations.itunes.models.login import ( from src.integrations.itunes.models.login import (
ItunesLoginResponse, ItunesLoginResponse,
@@ -61,7 +58,8 @@ class AppleClient:
cookies=cookies, cookies=cookies,
) )
logger.info(f"请求用时 {time.time() - start_time}s") 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 self.query_sign_sap_setup(signature, retries - 1)
return response.text return response.text
@@ -198,7 +196,7 @@ class AppleClient:
headers=headers, headers=headers,
) )
logger.info(f"请求用时 {time.time() - start_time}s") logger.info(f"请求用时 {time.time() - start_time}s")
except (ConnectionError, HTTPSConnectionPool) as e: except Exception as e:
logger.warning("兑换连接错误,重试") logger.warning("兑换连接错误,重试")
return self.redeem(code, itunes, reties - 1) return self.redeem(code, itunes, reties - 1)
response.encoding = "utf-8" response.encoding = "utf-8"
@@ -248,7 +246,7 @@ class AppleClient:
result.status = 30 result.status = 30
logger.warning("兑换状态未知:", response.text) logger.warning("兑换状态未知:", response.text)
return result return result
except json.JSONDecodeError as e: except Exception as e:
logger.error(f"json格式化失败{e}\t返回值{response.text}") logger.error(f"json格式化失败{e}\t返回值{response.text}")
return RedeemFailResponseModel( return RedeemFailResponseModel(
status=30, status=30,

View File

@@ -84,7 +84,7 @@ class SixClient:
) )
# 请求用时用s计算 # 请求用时用s计算
logging.info(f"请求用时 {time.time() - start_time}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) return self._do_post(post_data, type_, start_now_fun, reties - 1)
if response.ok: if response.ok:
if ( if (