XJTU-Pay/app.py

184 lines
5.3 KiB
Python

from io import BytesIO
import flask
import requests
import time
import qrcode
import loguru
import base64
from barcode import EAN13
from barcode.writer import ImageWriter
from barcode.base import Barcode
import yaml
# 学号
username = ""
# base64 编码的密码
pwd = ""
Barcode.default_writer_options['write_text'] = False
Barcode.default_writer_options['quiet_zone'] = 0
logging = loguru.logger
def notify_feishu(msg):
webhook_url = "https://open.feishu.cn/open-apis/bot/v2/hook/ade4ea5a-a64c-40bf-9391-c42c837a421a"
msg_template = {
"msg_type": "text",
"content": {
"text": msg
}
}
requests.post(webhook_url, json=msg_template)
logging.add(notify_feishu, format="{level} {message}", level="WARNING")
logging.add("logs/{time}.log")
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
url = "https://pay.xjtu.edu.cn/"
session = requests.session()
authCode = ""
logging.info("程序启动")
def getTime():
return str(int(time.time() * 1000))
def login():
try:
session = requests.session()
session.get("https://org.xjtu.edu.cn/openplatform/oauth/authorize?appId=1597&redirectUri=https://pay.xjtu.edu.cn/ThirdWeb/CasQrcode&responseType=code&scope=user_info&state=1234")
data = session.post(
'https://org.xjtu.edu.cn/openplatform/g/admin/login',
json={
"jcaptchaCode": "",
"loginType": 1,
"pwd": pwd,
"username": username
},
timeout=30
).json()['data']
session.cookies.set('open_Platform_User', str(data['tokenKey']))
x = session.get(
"https://org.xjtu.edu.cn/openplatform/oauth/auth/getRedirectUrl?userType=1&personNo="+username+"&_="+getTime())
url = x.json()['data']
web = session.get(url)
authCode = web.text.split("sessionStorage.Authorization = '")[
1].split("'")[0]
session.post("https://pay.xjtu.edu.cn/ThirdWeb/VoucherList", headers={
"Authorization": authCode
})
return authCode
except Exception as e:
logging.error(f"登录时发生错误: {e}")
return None
def getPayCode():
try:
x = session.post("https://pay.xjtu.edu.cn/ThirdWeb/GetBarCode", headers={
"Authorization": authCode,
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}, data={
"acctype": "000"
})
return x.json()
except Exception as e:
logging.error(f"Error getting pay code: {e}")
return None
flask_app = flask.Flask(__name__)
logging.info("尝试登录中")
authCode = login()
try_count = 0
while(authCode == None):
logging.warning("登录失败,尝试重新登录,次数: " + str(try_count+1))
authCode = login()
try_count += 1
if(try_count > 5):
logging.error("登录失败,程序退出")
while(True):
pass
logging.info("登录成功")
@flask_app.route('/getPayCode')
def getHTTPPayCode():
global authCode
try:
# 获取访问者IP
ip = flask.request.remote_addr
logging.info(f"IP: {ip} 尝试获取付款码")
res = getPayCode()
if(res['Obj2']):
logging.info("登录过期,重新登录")
authCode = login()
res = getPayCode()
image = qrcode.make(res['Obj'][0])
byte_io = BytesIO()
image.save(byte_io, 'PNG')
byte_io.seek(0)
return flask.send_file(byte_io, mimetype='image/png')
except Exception as e:
logging.error(f"Error in index route: {e}")
return flask.Response("Error", status=500)
class NoTextSVGWriter(ImageWriter):
def _paint_text(self, xpos, ypos):
pass # Do nothing, don't paint text
@flask_app.route('/')
def index():
global authCode
try:
# 获取访问者IP
ip = flask.request.remote_addr
logging.info(f"IP: {ip} 尝试获取付款码")
res = getPayCode()
if(res['Obj2']):
logging.info("登录过期,重新登录")
authCode = login()
res = getPayCode()
pay_number = res['Obj'][0]
bar_writer = NoTextSVGWriter()
bar_code = EAN13(pay_number, writer=bar_writer)
bar_code_bytes = BytesIO()
bar_code.write(bar_code_bytes)
bar_code_bytes = bar_code_bytes.getvalue()
bar_code_base64_str = base64.b64encode(bar_code_bytes).decode()
qrcode_image = qrcode.make(pay_number, border=0)
image_bytes = BytesIO()
qrcode_image.save(image_bytes, format='PNG')
image_bytes = image_bytes.getvalue()
image_base64_str = base64.b64encode(image_bytes).decode()
pay_number_str = pay_number[0:4]+'*'*(len(pay_number)-8)
return flask.render_template('index.html', bar_code_base=bar_code_base64_str, pay_number=pay_number_str, qrcode_base=image_base64_str)
except Exception as e:
logging.error(f"Error in index route: {e}")
exit()
return flask.Response("Error", status=500)
@flask_app.route('/files/<path:filename>')
def send_file(filename):
return flask.send_from_directory(flask_app.static_folder, filename)
if __name__ == '__main__':
try:
flask_app.run()
except Exception as e:
logging.error(f"启动 Flask 应用失败: {e}")