feat: 添加 Drone CI 配置和 Docker 镜像构建

- 新增 .drone.yml 文件,配置 Drone CI/CD 流程
- 添加 Dockerfile,定义应用的 Docker 镜像构建过程
- 新增 app.py 文件,实现携程卡绑定功能
- 添加 __pycache__ 目录,存放编译后的 Python 文件
This commit is contained in:
danial
2025-03-06 00:28:02 +08:00
commit 752ef17fc8
11 changed files with 2911 additions and 0 deletions

48
.drone.yml Normal file
View File

@@ -0,0 +1,48 @@
---
kind: pipeline
type: ssh
name: master-machine
server:
host: 38.38.251.113:31245
user: root
password:
from_secret: www_password
clone:
depth: 1
steps:
- name: build new image
environment:
DOCKER_LOGIN:
from_secret: docker_login
DOCKER_TOKEN:
from_secret: docker_token
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- echo "$DOCKER_PASSWORD" | docker login -u $DOCKER_LOGIN --password-stdin docker.kkknametrans.buzz
- docker build -t docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} -f deploy/Dockerfile . --build-arg USE_PROXY=0
- docker tag docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:latest
- docker push docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER}
- docker push docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:latest
- docker logout docker.kkknametrans.buzz
- docker login git.kkknametrans.buzz -u $DOCKER_LOGIN -p $DOCKER_TOKEN
- docker tag docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} git.kkknametrans.buzz/danial/kami_ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER}
- docker tag docker.kkknametrans.buzz/kami/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER} git.kkknametrans.buzz/danial/kami_ctrip_${DRONE_BRANCH}:latest
- docker push git.kkknametrans.buzz/danial/ctrip_${DRONE_BRANCH}:${DRONE_BUILD_NUMBER}
- docker push git.kkknametrans.buzz/danial/kami_ctrip_${DRONE_BRANCH}:latest
- docker logout git.kkknametrans.buzz
- name: deploy to docker compose
environment:
DOCKER_LOGIN:
from_secret: docker_login
DOCKER_TOKEN:
from_secret: docker_token
DOCKER_PASSWORD:
from_secret: docker_password
commands:
- echo "$DOCKER_PASSWORD" | docker login -u $DOCKER_LOGIN --password-stdin docker.kkknametrans.buzz
- BRANCH=${DRONE_BRANCH} VERSION=${DRONE_BUILD_NUMBER} docker compose -f /data/kami/docker-compose.yml --profile itunes up -d
- docker logout docker.kkknametrans.buzz

36
Dockerfile Normal file
View File

@@ -0,0 +1,36 @@
# 基于 Python 3.8.6 镜像
FROM python:3.8.6
WORKDIR /app
# 设置工作目录
ENV FLASK_APP=app.py
# 复制项目
ADD . /app
# 修改apt-get源地址为阿里云镜像
RUN echo "" > /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian buster main" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security buster/updates main" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian buster-updates main" >> /etc/apt/sources.list
# 安装cv2依赖和其他依赖
RUN apt-get update && apt-get install -y libgl1-mesa-glx libglib2.0-0
# 下载并安装 Node.js
RUN wget https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.gz && \
tar -xvf node-v16.13.0-linux-x64.tar.gz && \
mv node-v16.13.0-linux-x64 /usr/local/nodejs && \
ln -s /usr/local/nodejs/bin/node /usr/local/bin && \
ln -s /usr/local/nodejs/bin/npm /usr/local/bin && \
rm node-v16.13.0-linux-x64.tar.gz
# python环境包
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple gunicorn gevent
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 暴露容器端口
EXPOSE 5001
# 运行应用
CMD ["gunicorn", "-c", "gun.conf", "app:app"]

Binary file not shown.

Binary file not shown.

Binary file not shown.

59
app.py Normal file
View File

@@ -0,0 +1,59 @@
import json
from flask import Flask, g, request, jsonify
from ctrip import CtripLogin
from logger import get_logger
app = Flask(__name__)
logger = get_logger()
@app.before_request
def before_request():
g.ip_list = None
g.order_num = None
g.ck = None
g.card_num = None
g.card_pwd = None
g.money = None
g.proxies = {}
@app.route('/xiecheng/v3/card/bind', methods=['GET', 'POST'])
def bind_card_v3():
if request.method == 'GET':
return 'okk'
elif request.method == 'POST':
# 接收参数
data = json.loads(request.get_data())
g.ck = data.get("ck")
g.card_num = data.get("card_num")
g.card_pwd = data.get("card_pwd")
g.order_num = data.get("order_num")
g.money = data.get("money")
# 绑卡
trip = CtripLogin(
cookies=g.ck,
card_num=g.card_num,
card_pwd=g.card_pwd,
price=g.money,
order_num=g.order_num
)
res = trip.run()
logger.info(f"订单ID{g.order_num},返回速代充:{res}")
if res.get("code") == 111:
for _ in range(5):
res = trip.check_card()
logger.info(f"订单ID{g.order_num},未知重新查卡返回:{res}")
if res.get("code") in [110, 2001]:
res = {'code': 110, 'msg': '重新查卡返回可重新绑卡', 'data': {}}
return jsonify(res)
if res.get("code") == 111:
continue
res = {'code': 111, 'msg': '重新查卡未知', 'data': {}}
return jsonify(res)
if __name__ == '__main__':
app.run()

1133
ctrip.py Normal file

File diff suppressed because it is too large Load Diff

1573
enc1.js Normal file

File diff suppressed because it is too large Load Diff

19
gun.conf Normal file
View File

@@ -0,0 +1,19 @@
# 并行工作进程数
workers = 2
# 指定每个工作者的线程数
threads = 4
# 监听内网端口80
bind = '0.0.0.0:5001'
# 工作模式协程
worker_class = 'gevent'
# 设置最大并发量
worker_connections = 2000
# 设置进程文件目录
pidfile = 'gunicorn.pid'
# 设置访问日志和错误信息日志路径
accesslog = '-'
errorlog = '-'
# 设置日志记录水平
loglevel = 'info'
# 代码发生变化是否自动重启
reload = True

29
logger.py Normal file
View File

@@ -0,0 +1,29 @@
from loguru import logger
import sys
import pytz
from datetime import datetime
# 移除默认的日志处理器
logger.remove()
# 设置中国时区
china_tz = pytz.timezone("Asia/Shanghai")
# 自定义时间格式函数
def custom_time():
return datetime.now(china_tz).strftime("%Y-%m-%d %H:%M:%S")
# 添加新的处理器,输出到控制台
logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} {level} {message}", level="INFO", serialize=False)
# 添加文件日志处理器
logger.add("xiecheng.log", rotation="20 MB", retention="30 days", format="{time:YYYY-MM-DD HH:mm:ss} {level} {message}")
# 创建一个带有时间信息的 Logger
logger = logger.bind(time=custom_time())
def get_logger():
return logger

14
requirements.txt Normal file
View File

@@ -0,0 +1,14 @@
flask==3.0.3
flask_cors==4.0.1
opencv-python-headless==4.9.0.80
pillow==10.3.0
requests==2.32.3
urllib3==1.26.2
pyexecjs==1.5.1
gunicorn==22.0.0
gevent==24.2.1
selenium==3.141.0
pillow==10.3.0
pycryptodome==3.21.0
pytz==2024.2
loguru==0.7.2