mirror of
https://git.oceanpay.cc/danial/kami_itunes_third_api.git
synced 2025-12-18 11:06:33 +00:00
test: 尝试修复突然中断的行为
This commit is contained in:
3
.dockerignore
Normal file
3
.dockerignore
Normal file
@@ -0,0 +1,3 @@
|
||||
/.idea/
|
||||
/data/
|
||||
/venv/
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
/.idea/
|
||||
/data/
|
||||
/data/
|
||||
/venv/
|
||||
|
||||
@@ -15,7 +15,7 @@ database:
|
||||
database: itunes_kami
|
||||
|
||||
redis:
|
||||
host: 127.0.0.1
|
||||
host: redis
|
||||
port: 6379
|
||||
password:
|
||||
db: 0
|
||||
|
||||
@@ -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"]
|
||||
15
deploy/docker-compose-local.yml
Normal file
15
deploy/docker-compose-local.yml
Normal 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
|
||||
@@ -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
|
||||
|
||||
4
main.py
4
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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user