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/

1
.gitignore vendored
View File

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

View File

@@ -15,7 +15,7 @@ database:
database: itunes_kami
redis:
host: 127.0.0.1
host: redis
port: 6379
password:
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 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
build:
context: ../.
dockerfile: ./deploy/Dockerfile
volumes:
- /data/kami/itunes/config:/app/config
- /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__":
run()
run_task()

View File

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

View File

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

View File

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