commit 2f52032a5dee0ddf3403478b55addef42e1e142f
Author: cc892786825 <72603353+cc892786825@users.noreply.github.com>
Date: Tue Nov 26 21:51:15 2024 +0800
Create bwcj.py
diff --git a/bwcj.py b/bwcj.py
new file mode 100644
index 0000000..734d2d0
--- /dev/null
+++ b/bwcj.py
@@ -0,0 +1,304 @@
+"""
+
+霸王茶姬签到、查券 V1.1
+
+食翔狂魔
+
+环境变量:bwcj_token,多号用#隔开
+
+注意:缺什么依赖就安装什么依赖
+
+"""
+
+
+
+import hashlib
+
+import json
+
+import random
+
+import time
+
+import requests
+
+import os
+
+from os import environ, path
+
+from concurrent.futures import ThreadPoolExecutor
+
+import random
+
+import math
+
+import uuid
+
+from datetime import datetime
+
+activity_id = '947079313798000641'
+
+cur_path = path.abspath(path.dirname(__file__))
+
+def load_send():
+
+ global send, mg
+
+ if path.exists(cur_path + "/notify.py"):
+
+ try:
+
+ from notify import send
+
+ print("加载通知服务成功!")
+
+ except:
+
+ send = False
+
+ print("加载通知服务失败~")
+
+ else:
+
+ send = False
+
+ print("加载通知服务失败~")
+
+
+
+# 通知服务
+
+load_send()
+
+logObj = {}
+
+send_msg = ""
+
+invalidCks = []
+
+activityData = {"activityId":"947079313798000641","appid":"wxafec6f8422cb357b"}
+
+activityData = {
+
+ "activityId": activity_id,
+
+ "storeId": 49006,
+
+ "timestamp": 0,
+
+ "signature": "",
+
+ "appid": "wxafec6f8422cb357b",
+
+ "store_id": 49006
+
+}
+
+def getUid(token):
+
+ if token == None:
+
+ return None
+
+ else:
+
+ res = requests.get('https://webapi2.qmai.cn/web/catering2-apiserver/crm/customer/card/level/benefits?appid=wxafec6f8422cb357b', headers={
+
+ 'Qm-From': 'wechat',
+
+ 'Qm-User-Token': token,
+
+ 'xweb_xhr': '1',
+
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309071d) XWEB/8555',
+
+ 'Qm-From-Type': 'catering',
+
+ 'Content-Type': 'application/json'
+
+ }).json()
+
+ if res["code"] == '0':
+
+ return res["data"]["upgradeInfoResponse"]["customerId"]
+
+ else:
+
+ return None
+
+def getUserInfo(token):
+
+ url = f'https://webapi.qmai.cn/web/catering/crm/personal-info?appid=wxafec6f8422cb357b'
+
+ rsp = requests.get(url,headers={
+
+ 'Qm-From': 'wechat',
+
+ 'Qm-User-Token': token,
+
+ 'xweb_xhr': '1',
+
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309071d) XWEB/8555',
+
+ 'Qm-From-Type': 'catering',
+
+ 'Content-Type': 'application/json'
+
+ }).json()
+
+ if(rsp["message"] == "登录超时"):
+
+ logObj[token] = f"token失效,已删除!"
+
+ invalidCks.append(token)
+
+ return False
+
+ phone = rsp['data']['mobilePhone']
+
+ phone = '****'.join([phone[:3],phone[7:]]) + '----bwcj' + str(random.randint(1, 1000))
+
+ return phone
+
+
+
+def getList(phone,token):
+
+ url = f'https://webapi.qmai.cn/web/catering/crm/coupon/list'
+
+ rsp = requests.post(url,headers={
+
+ 'Qm-From': 'wechat',
+
+ 'Qm-User-Token': token,
+
+ 'xweb_xhr': '1',
+
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309071d) XWEB/8555',
+
+ 'Qm-From-Type': 'catering',
+
+ 'Content-Type': 'application/json'
+
+ },data=json.dumps({"pageNo":1,"pageSize":1000,"useStatus":0,"appid":"wxafec6f8422cb357b"})).json()
+
+ if rsp['status'] == True:
+
+ for item in rsp['data']['data']:
+
+ logObj[phone] += f'
\n券名称:{item["title"]},有效时间:{item["expireDesc"]}。'
+
+
+
+def getSignature(timestamp, user_id):
+
+ reversed_activity_id = activity_id[::-1]
+
+ store_id = 49006
+
+
+
+ params = {
+
+ 'activityId': activity_id,
+
+ 'sellerId': str(store_id),
+
+ 'timestamp': timestamp,
+
+ 'userId': user_id
+
+ }
+
+ sorted_params = sorted(params.items())
+
+ query_string = '&'.join(f'{key}={value}' for key, value in sorted_params if value is not None)
+
+ query_string += f'&key={reversed_activity_id}'
+
+
+
+ md5_hash = hashlib.md5(query_string.encode()).hexdigest().upper()
+
+
+
+ return md5_hash
+
+
+
+def signIn(phone,token):
+
+ url = f'https://webapi.qmai.cn/web/cmk-center/sign/takePartInSign'
+
+ timestamp = time.time_ns() // 1000000
+
+ uid = getUid(token)
+
+ activityData["timestamp"] = timestamp
+
+ activityData["signature"] = getSignature(timestamp, uid)
+
+ rsp = requests.post(url,headers={
+
+ 'Qm-From': 'wechat',
+
+ 'Qm-User-Token': token,
+
+ 'xweb_xhr': '1',
+
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309071d) XWEB/8555',
+
+ 'Qm-From-Type': 'catering',
+
+ 'Content-Type': 'application/json'
+
+ },data=json.dumps(activityData))
+
+ rsp = rsp.json()
+
+ print(rsp)
+
+ if rsp['status'] == True:
+
+ logObj[phone] = "签到成功!"
+
+ else:
+
+ logObj[phone] = f'{rsp["message"]}'
+
+
+
+def task(token):
+
+ phone = getUserInfo(token)
+
+ if phone != False:
+
+ logObj[phone] = ""
+
+ signIn(phone,token)
+
+ getList(phone,token)
+
+
+
+if __name__ == '__main__':
+
+ tokens = os.environ["bwcj_token"].split("#")
+
+ with ThreadPoolExecutor(max_workers=3) as executor:
+
+ result = list(executor.map(task, tokens))
+
+ for item in logObj:
+
+ send_msg += f'{item}:
\n{logObj[item]}
\n
\n'
+
+ if len(invalidCks) > 0:
+
+ send_msg += f'失效Token:
\n{"#".join(invalidCks)}
\n
\n'
+
+ print(send_msg)
+
+ send('霸王茶姬签到查券', send_msg)
+