import datetime import hashlib import json import random import time from json import JSONDecodeError import requests import urllib3 import traceback from logger import get_logger logger = get_logger() ANDROID_USER_AGENT = [ "Mozilla/5.0 (Linux; U; Android 1.5; en-us; sdk Build/CUPCAKE) AppleWebkit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1", "Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 1.5; en-us; htc_bahamas Build/CRB17) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1", "Mozilla/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 1.5; de-ch; HTC Hero Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1", "Mozilla/5.0 (Linux; U; Android 2.2; en-us; ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 2.1; en-us; HTC Legend Build/cupcake) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 1.5; de-de; HTC Magic Build/PLAT-RC33) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 FirePHP/0.3", "Mozilla/5.0 (Linux; U; Android 1.6; en-us; HTC_TATTOO_A3288 Build/DRC79) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1", "Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2", "Mozilla/5.0 (Linux; U; Android 1.5; en-us; T-Mobile G1 Build/CRB43) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari 525.20.1", "Mozilla/5.0 (Linux; U; Android 1.5; en-gb; T-Mobile_G2_Touch Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1", "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 2.0.1; de-de; Milestone Build/SHOLS_U2_01.14.0) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2", "Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522 (KHTML, like Gecko) Safari/419.3", "Mozilla/5.0 (Linux; U; Android 1.1; en-gb; dream) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2", "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17", "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 2.2; en-us; ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 3.0.1; fr-fr; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13", "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2", "Mozilla/5.0 (Linux; U; Android 1.6; es-es; SonyEricssonX10i Build/R1FA016) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1", "Mozilla/5.0 (Linux; U; Android 1.6; en-us; SonyEricssonX10i Build/R1AA056) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1", ] # 忽略InsecureRequestWarning警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) class WalMartCardSpider: def __init__(self, cookies, card_num, card_pwd, order_num, app): self.app = app # 接收参数 self.cookies = cookies self.card_num = card_num self.card_pwd = card_pwd self.order_num = order_num # 请求超时 self.timeout = 3 self.bind_timeout = 10 self.user_agent = random.choice(ANDROID_USER_AGENT) # 初始化开始滑块验证时间 self.start_timestamp = int(time.time() * 1000) current_time = datetime.datetime.utcnow() self.start_formatted_time = current_time.strftime("%Y-%m-%dT%H:%M:%S.%fZ") # 日志存储 self.log_list = [] # 执行记录存储 self.record_list = [] # 备注 self.remarks = "" self.session = requests.Session() # 请求超时时间设置 self.timeout = 3.5 def format_number(self, number): if not number: number = 0 number = float(number) formatted_number = "{:.2f}".format(number) return formatted_number def get_walmart_code(self, res): """ /* 绑定成功 {"logId":"qZXePbHl","status":true,"error":{"errorcode":1,"message":null,"redirect":null,"validators":null},"data":"59519706"} * 错误密码 {"logId":"IQwPkfLT","status":false,"error":{"errorcode":19000,"message":"校验密码失败,密码错误次数:1","redirect":null,"validators":null},"data":null} * 重复绑定 {"logId":"Dj6nJ4OM","status":false,"error":{"errorcode":10131,"message":"该电子卡已被其他用户绑定","redirect":null,"validators":null},"data":null} * 错误卡号/卡密 {"logId":"hX6Ju6lD","status":false,"error":{"errorcode":19000,"message":"无权操作该卡","redirect":null,"validators":null},"data":null} * 登录失效 {"logId":"V0Sw4Q2f","status":false,"error":{"errorcode":203,"message":"请先去登录","redirect":null,"validators":null},"data":null} * 错误密码 {"logId":"Aavc0ch1","status":false,"error":{"errorcode":201,"message":"密码输入有误","redirect":null,"validators":null},"data":null} * 密码输入错误次数过多 {"logId":"bchMZcyv","status":false,"error":{"errorcode":110136,"message":"密码输入错误次数过多","redirect":null,"validators":null},"data":null} * 校验密码失败,密码错误次数:2 {"logId":"MDN05jVd","status":false,"error":{"errorcode":19000,"message":"校验密码失败,密码错误次数:2","redirect":null,"validators":null},"data":null} * {"logId":"tP0TWGY8","status":false,"error":{"errorcode":110224,"message":"您绑卡已超过单日20张限制,请明天再试","redirect":null,"validators":null},"data":null} * {'logId': 'Ff4eK7Bu', 'status': False, 'error': {'errorcode': 110134, 'message': '错误次数过多,请稍后再试', 'redirect': None, 'validators': None}, 'data': None} * {'logId': 'LnyEeDcj', 'status': False, 'error': {'errorcode': 2, 'message': None, 'redirect': 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx47085439d65e5fbc&redirect_uri=https%3A%2F%2Fcard.swiftpass.cn%2Fwechat%2Fopen%2Foauth%2F100530000004%3Fredirect%3Dhttps%253A%252F%252Fwalmart-card.swiftpass.cn%252Fcard%252F100530000004%253Fa%253D1%2523bind&response_type=code&scope=snsapi_userinfo&state=bf6a200e39220cf7ce1f9d930e92ce20&component_appid=wxf770fc8d016ff6a8#wechat_redirect', 'validators': None}, 'data': None} */ :return: """ if res.get("error").get("errorcode") == 1: self.set_record(f"绑定成功") return 100 elif res.get("error").get("errorcode") == 203: self.set_record(f"ck失效") return 113 elif res.get("error").get("errorcode") == 5041: self.set_record(f"请重新获取ck,开放平台迁移小程序跳转公众号同步unionid") return 113 elif res.get("error").get("errorcode") == 10131: self.set_record(f"该电子卡已被其他用户绑定") return 104 elif res.get("error").get("errorcode") == 110400: self.set_record("操作频繁,请稍后重试") return 115 elif res.get("error").get("errorcode") == 19000 and "校验密码失败" in res.get("error").get("message"): self.set_record(f"校验密码失败") return 105 elif res.get("error").get("errorcode") == 19000 and "无权操作该卡" in res.get("error").get("message"): self.set_record(f"无权操作该卡") return 105 elif res.get("error").get("errorcode") == 19000 and "该卡已被绑定" in res.get("error").get("message"): self.set_record(f"同一张实体卡只允许绑定到一个微信账户或山姆APP礼品卡账户,该卡已被绑定") return 104 elif res.get("error").get("errorcode") == 19000 and "重复提交" in res.get("error").get("message"): self.set_record(f"重复提交") return 110 elif res.get("error").get("errorcode") == 201: self.set_record(f"密码输入有误") return 105 elif res.get("error").get("errorcode") == 110136: self.set_record(f"密码输入错误次数过多") return 105 elif res.get("error").get("errorcode") == 110224: self.set_record(f"您绑卡已超过单日20张限制,请明天再试") return 116 elif res.get("error").get("errorcode") == 110134: self.set_record(f"错误次数过多,请稍后再试") return 115 else: self.set_record(f"存在未知状态") return 111 def md5_encrypt(self, data): # 创建 MD5 哈希对象 md5_hash = hashlib.md5() # 更新哈希对象以包含数据 md5_hash.update(data.encode('utf-8')) # 确保数据为字节类型 # 返回十六进制表示的大写 MD5 值 return md5_hash.hexdigest().upper() def walmart_bind_card(self): """ /* 绑定成功 {"logId":"qZXePbHl","status":true,"error":{"errorcode":1,"message":null,"redirect":null,"validators":null},"data":"59519706"} * 错误密码 {"logId":"IQwPkfLT","status":false,"error":{"errorcode":19000,"message":"校验密码失败,密码错误次数:1","redirect":null,"validators":null},"data":null} * 重复绑定 {"logId":"Dj6nJ4OM","status":false,"error":{"errorcode":10131,"message":"该电子卡已被其他用户绑定","redirect":null,"validators":null},"data":null} * 错误卡号/卡密 {"logId":"hX6Ju6lD","status":false,"error":{"errorcode":19000,"message":"无权操作该卡","redirect":null,"validators":null},"data":null} * 登录失效 {"logId":"V0Sw4Q2f","status":false,"error":{"errorcode":203,"message":"请先去登录","redirect":null,"validators":null},"data":null} * 错误密码 {"logId":"Aavc0ch1","status":false,"error":{"errorcode":201,"message":"密码输入有误","redirect":null,"validators":null},"data":null} * 密码输入错误次数过多 {"logId":"bchMZcyv","status":false,"error":{"errorcode":110136,"message":"密码输入错误次数过多","redirect":null,"validators":null},"data":null} * 校验密码失败,密码错误次数:2 {"logId":"MDN05jVd","status":false,"error":{"errorcode":19000,"message":"校验密码失败,密码错误次数:2","redirect":null,"validators":null},"data":null} * {"logId":"tP0TWGY8","status":false,"error":{"errorcode":110224,"message":"您绑卡已超过单日20张限制,请明天再试","redirect":null,"validators":null},"data":null} * {'logId': 'Ff4eK7Bu', 'status': False, 'error': {'errorcode': 110134, 'message': '错误次数过多,请稍后再试', 'redirect': None, 'validators': None}, 'data': None} */ :return: """ try: user_info = self.cookies.split("#") if len(user_info) != 3: self.set_record(f"ck失效,格式不正确") return 113 sign = user_info[0] user_key = user_info[1] version = user_info[2] timestamp = f"{int(time.time() * 1000)}" data = '{"cardNo":"%s","cardPwd":"%s","currentPage":0,"pageSize":0,"sign":"%s","storeId":"","userPhone":""}%s%s' % ( self.card_num, self.card_pwd, sign, timestamp, user_key ) signature = self.md5_encrypt(data) headers = { "authority": "apicard.swiftpass.cn", "accept": "*/*", "accept-language": "zh-CN,zh;q=0.9", "content-type": "application/json", "referer": "https://servicewechat.com/wx81d3e1fe4c2e11b4/159/page-frame.html", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "signature": signature, "timestamp": timestamp, "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(0x63090a13) XWEB/8555", "xweb_xhr": "1", "version": version } url = "https://apicard.swiftpass.cn/app/card/mem/bind.json" data = { "cardNo": self.card_num, "cardPwd": self.card_pwd, "currentPage": 0, "pageSize": 0, "sign": sign, "storeId": "", "userPhone": "" } data = json.dumps(data, separators=(',', ':')) response = requests.post(url, headers=headers, data=data) res = response.json() self.app.logger.info(f"订单ID: {self.order_num},请求绑卡返回:{res}") logger.info(f"订单ID: {self.order_num},请求绑卡返回:{res}") self.remarks = res.get("error", {}).get("message", "") if res.get("error").get("errorcode") == 1: self.set_record(f"绑定成功") return 100 elif res.get("error").get("errorcode") == 203: self.set_record(f"ck失效") return 113 elif res.get("error").get("errorcode") == 5041: self.set_record(f"请重新获取ck,开放平台迁移小程序跳转公众号同步unionid") return 113 elif res.get("error").get("errorcode") == 10131: self.set_record(f"该电子卡已被其他用户绑定") return 104 elif res.get("error").get("errorcode") == 110400: self.set_record("操作频繁,请稍后重试") return 115 elif res.get("error").get("errorcode") == 19000 and "校验密码失败" in res.get("error").get("message"): self.set_record(f"校验密码失败") return 105 elif res.get("error").get("errorcode") == 19000 and "无权操作该卡" in res.get("error").get("message"): self.set_record(f"无权操作该卡") return 105 elif res.get("error").get("errorcode") == 19000 and "该卡已被绑定" in res.get("error").get("message"): self.set_record(f"同一张实体卡只允许绑定到一个微信账户或山姆APP礼品卡账户,该卡已被绑定") return 104 elif res.get("error").get("errorcode") == 19000 and "重复提交" in res.get("error").get("message"): self.set_record(f"重复提交") return 110 elif res.get("error").get("errorcode") == 201: self.set_record(f"密码输入有误") return 105 elif res.get("error").get("errorcode") == 110136: self.set_record(f"密码输入错误次数过多") return 105 elif res.get("error").get("errorcode") == 110224: self.set_record(f"您绑卡已超过单日20张限制,请明天再试") return 116 elif res.get("error").get("errorcode") == 110134: self.set_record(f"错误次数过多,请稍后再试") return 115 else: self.set_record(f"存在未知状态") return 111 except Exception as e: self.log_list.append(f"订单ID: {self.order_num},绑卡异常报错:{str(e)}") return 111 def walmart_invoice_bind_card(self): headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Origin": "https://walmart-card.swiftpass.cn", "Referer": "https://walmart-card.swiftpass.cn/card/100530000004?a=1", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.2(0x18000239) NetType/4G Language/zh_CN", "X-Requested-With": "XMLHttpRequest", "group": "100530000004", "page-from": "https://walmart-card.swiftpass.cn/card/100530000004?a=1#bind", "Cookie": self.cookies } url = "https://walmart-card.swiftpass.cn/card/member/bind" data = { "cardNo": self.card_num, "cardPwd": self.card_pwd } response = requests.post(url, headers=headers, data=data) res = response.json() logger.info(f"订单ID: {self.order_num},请求绑卡返回:{res}") self.remarks = res.get("error", {}).get("message", "") code = self.get_walmart_code(res) return code def get_params(self): headers = { "language": "CN", "system-language": "CN", "Content-Type": "application/json", "device-type": "android", "tpg": "1", "app-version": "5.0.98", "device-id": "", "device-os-version": "9", "device-name": "samsung_SM-N9760", "treq-id": "35cbc67b3bdb42238e97214e4bb371ad.515.17270811912489411", "auth-token": self.cookies, "longitude": "113.412697", "latitude": "23.10594", "p": "1656120205", "t": "1727080982681", "n": "b233a136c3484043a022dc935684491a", "sy": "0", "st": "a2f3a3427f7391aa470bca22cfe52177", "sny": "c", # "rcs": "2", "spv": "1.1", "Local-Longitude": "0.0", "Local-Latitude": "0.0", "zoneType": "1", "Host": "api-sams.walmartmobile.cn", "User-Agent": "okhttp/4.8.1" } url = "https://api-sams.walmartmobile.cn/api/v1/sams/sams-user/tool/yinshang/request_param" response = self.session.get(url, headers=headers, verify=False, timeout=self.timeout) self.app.logger.info(f"订单ID: {self.order_num},获取app打开沃尔玛绑卡页面参数:{response.text}") logger.info(f"订单ID: {self.order_num},获取app打开沃尔玛绑卡页面参数:{response.text}") print(f"订单ID: {self.order_num},获取app打开沃尔玛绑卡页面参数:{response.text}") res = response.json() if res.get("code") != "Success": return "01" params = res["data"]["params"] params = dict(item.split("=") for item in params.split("&")) return params def get_session_id(self, params): url = "https://vpay.upcard.com.cn/vcweixin/mwalm/loginmwalmmenu" headers = { "Host": "vpay.upcard.com.cn", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Linux; Android 9; SM-N9760 Build/PQ3B.190801.06281543; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36SR-SAMS/5.0.98", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "X-Requested-With": "cn.samsclub.app", "Sec-Fetch-Site": "none", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-User": "?1", "Sec-Fetch-Dest": "document", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7" } res = self.session.get(url, headers=headers, params=params, verify=False, timeout=self.timeout) cookies = res.cookies.get_dict() print(f"订单ID: {self.order_num},获取JSESSIONID:{cookies}") self.app.logger.info(f"订单ID: {self.order_num},获取JSESSIONID:{cookies}") logger.info(f"订单ID: {self.order_num},获取JSESSIONID:{cookies}") return cookies def sanmu_bind_card(self): for i in range(5): try: if len(self.cookies) > 50: try: params = self.get_params() except JSONDecodeError as e: self.remarks = "请求频繁,跳转至错误页面,请稍后重试" self.set_record(f"请求频繁") return 115 if params == "01": self.set_record(f"ck失效") return 113 cookies = self.get_session_id(params) else: cookies = { "JSESSIONID": self.cookies, "route": "" } headers = { "Host": "vpay.upcard.com.cn", "Accept": "application/json, text/javascript, */*; q=0.01", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Linux; Android 9; SM-N9760 Build/PQ3B.190801.06281543; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36SR-SAMS/5.0.98", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Origin": "https://vpay.upcard.com.cn", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Referer": "https://vpay.upcard.com.cn/vcweixin/mwalm/bind/card?company=mwalm&channel=App", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", } url = "https://vpay.upcard.com.cn/vcweixin/mwalm/bindCard" data = { "company": "mwalm", "channel": "App", "cardNo": self.card_num, "cardPwd": self.card_pwd } response = self.session.post( url=url, headers=headers, data=data, cookies=cookies, verify=False, timeout=self.bind_timeout, ) res = response.json() print(f"订单ID: {self.order_num},app请求绑卡返回:{res}") self.app.logger.info(f"订单ID: {self.order_num},app请求绑卡返回:{res}") logger.info(f"订单ID: {self.order_num},app请求绑卡返回:{res}") self.remarks = res.get("msg", "") if res.get("code") == "00": self.set_record(f"绑定成功") return 100 elif res.get("code") == "11" and "该卡已被绑定" in self.remarks: self.set_record(self.remarks) return 104 elif res.get("code") == "11" and self.remarks == "线上密码无效": self.set_record(self.remarks) return 105 elif res.get("code") == "11" and "校验密码失败" in self.remarks: self.set_record(self.remarks) return 105 elif res.get("code") == "11" and self.remarks == "无法识别的卡号!": self.set_record(self.remarks) return 104 elif res.get("code") == "11" and self.remarks == "卡号不存在": self.set_record(self.remarks) return 104 elif res.get("code") == "01": self.set_record(f"ck失效") return 113 elif res.get("code") == "11" and "超过当天绑定上限" in self.remarks: self.set_record(self.remarks) return 116 else: self.set_record(f"订单ID: {self.order_num},返回:{res}") self.set_record(f"新的状态返回") return 111 except Exception as e: self.app.logger.info(f"订单ID: {self.order_num},报错:{traceback.format_exc()}") logger.info(f"订单ID: {self.order_num},报错:{traceback.format_exc()}") continue return 110 def get_time(self): from datetime import datetime # 获取当前时间 current_time = datetime.now() # 将当前时间格式化为指定格式的字符串 formatted_date = current_time.strftime("%Y-%m-%d %H:%M:%S") return formatted_date def set_record(self, text, log_only=False): # 如果传入的是订单ID则不打印日志,只做记录存储 if text == self.order_num: record = f"{self.get_time()}#订单ID: {self.order_num}" else: log_text = f"{self.get_time()}#订单ID:{self.order_num}, {text}" self.log_list.append(log_text) record = f"{self.get_time()}#{text}" if not log_only: self.record_list.append(record) def get_record(self): return "@".join(self.record_list) + "@" def run(self): if "@" in self.cookies: # 沃尔玛ck绑卡 code = self.walmart_bind_card() else: # 山姆app ck绑卡 code = self.sanmu_bind_card() record = self.get_record() return { "code": code, "record": record, "log_list": self.log_list, "remarks": self.remarks, }