mirror of
https://git.oceanpay.cc/danial/kami_itunes_third_api.git
synced 2025-12-18 22:20:08 +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/
|
/.idea/
|
||||||
/data/
|
/data/
|
||||||
|
/venv/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"]
|
||||||
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
|
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
|
||||||
|
|||||||
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__":
|
if __name__ == "__main__":
|
||||||
run()
|
run_task()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
Reference in New Issue
Block a user