def request_ticket_info(self, order, rebot): ticketType = u'全票' ticketPassword = '' url = 'http://www.84100.com/getTrainInfo/ajax' data = { "shiftId": order.line.shift_id, "startId": order.line.s_sta_id, "startName": order.line.s_sta_name, "ttsId": '' } headers = {"User-Agent": rebot.user_agent} try: trainInfo = requests.post(url, data=data, headers=headers, cookies=rebot.cookies) trainInfo = trainInfo.json() tickType = trainInfo.get('tickType', '') if tickType: if re.findall(u'全票', tickType) or re.findall( '\u5168\u7968', tickType): ticketType = u'全票' else: if re.findall(u'全', tickType): ticketType = u'全' msg = trainInfo['msg'] if re.findall('ticketPassword', msg): ticketPassword = str(random.randint(100000, 999999)) else: ticketPassword = '' except Exception: order_log.info("[lock-result] query trainInfo . order: %s,%s", order.order_no, trainInfo) return ticketType, ticketPassword
def fangbian_callback(): try: order_log.info("[fanbian-callback] %s", request.get_data()) args = json.loads(request.get_data()) data = args["data"] service_id = args["serviceID"] code = args["code"] order = Order.objects.get(order_no=data["merchantOrderNo"]) if service_id == "B001": # 锁票回调 raw_order = data["ticketOrderNo"] if code == 2100: order.modify(status=STATUS_ISSUE_ING, raw_order_no=raw_order) order.on_issueing(reason="code:%s, message:%s" % (code, args["message"])) else: order.modify(status=STATUS_ISSUE_FAIL, raw_order_no=raw_order) order.on_issue_fail(reason="code:%s, message:%s" % (code, args["message"])) issued_callback.delay(order.order_no) elif service_id == "B002": if code == 2102: msg = urllib.unquote(data["exData"].decode("gbk").encode('utf-8')).replace(u"【", "").replace(u"】", " ") order.modify(status=STATUS_ISSUE_SUCC, pick_code_list=[""], pick_msg_list=[msg]) order.on_issue_success() issued_callback.delay(order.order_no) else: order.modify(status=STATUS_ISSUE_FAIL) order.on_issue_fail(reason="code:%s, message:%s" % (code, args["message"])) issued_callback.delay(order.order_no) except: order_log.error("%s\n%s", "".join(traceback.format_exc()), locals()) return "error" return "success"
def do_refresh_issue(self, order): result_info = { "result_code": 0, "result_msg": "", "pick_code_list": [], "pick_msg_list": [], } if not self.need_refresh_issue(order): result_info.update(result_msg="状态未变化") return result_info ret = self.send_order_request(order) if ret["code"] != 0: result_info.update(result_msg="状态未变化") return result_info pay_info = ret["data"]["payments"][0] pay_money = float(pay_info["amount"]) pay_no = str(pay_info["payment_id"]) if order.pay_order_no != pay_no: order_log.info("[chane_pay_order_no] order:%s, %s=>%s", order.order_no, order.pay_order_no, pay_no) order.modify(pay_order_no=pay_no, pay_money=pay_money) state = int(ret["data"]["status"]) if state == 2: # 出票成功 if order.line.s_province in ["江西", "安徽"]: order_detail = ret["data"]["lstorderdetail"][0] pick_code = ",".join( [d["etccert"] for d in order_detail["listordertickets"]]) dx_info = { "time": order.drv_datetime.strftime("%Y-%m-%d %H:%M"), "start": order.line.s_sta_name, "end": order.line.d_sta_name, "code": pick_code, } dx_tmpl = DUAN_XIN_TEMPL[SOURCE_LVTU100] code_list = [pick_code] msg_list = [dx_tmpl % dx_info] result_info.update({ "result_code": 1, "result_msg": state, "pick_code_list": code_list, "pick_msg_list": msg_list, }) elif state == "出票中": result_info.update({ "result_code": 4, "result_msg": state, }) # elif state=="已取消": # result_info.update({ # "result_code": 2, # "result_msg": state, # }) # elif state==4: # result_info.update({ # "result_code": 2, # "result_msg": state, # }) return result_info
def do_refresh_issue(self, order): result_info = { "result_code": 0, "result_msg": "", "pick_code_list": [], "pick_msg_list": [], } if not self.need_refresh_issue(order): result_info.update(result_msg="状态未变化") return result_info rebot = BjkyWebRebot.objects.get(telephone=order.source_account) order_log.info( "[refresh_issue_start] order: %s,account:%s start orderDetail request", order.order_no, rebot.telephone) ret = self.send_orderDetail_request(rebot, order=order) order_log.info( "[refresh_issue_end] order: %s,account:%s orderDetail request result : %s", order.order_no, rebot.telephone, ret) state = ret["state"] order_status_mapping = { u"购票成功": "出票成功", u"已取消": "出票失败", u"已释放": "出票失败", u"出票中": "正在出票", u"出票失败": "出票失败", } if state in (u"购票成功"): #"出票成功": code_list = [] msg_list = [] dx_templ = DUAN_XIN_TEMPL[SOURCE_BJKY] dx_info = { "start": order.line.s_sta_name, "end": order.line.d_sta_name, "time": order.drv_datetime.strftime("%Y-%m-%d %H:%M"), "raw_order": ','.join(ret['raw_order_list']), } code_list.append('无需取票密码') msg_list.append(dx_templ % dx_info) result_info.update({ "result_code": 1, "result_msg": order_status_mapping[state], "pick_code_list": code_list, "pick_msg_list": msg_list, }) elif state in ("出票中"): #"出票中": result_info.update({ "result_code": 4, "result_msg": order_status_mapping[state], }) elif state in (u"已取消", u'已释放', u"出票失败"): #取消购票,购票失败,退票成功 result_info.update({ "result_code": 2, "result_msg": order_status_mapping[state], }) return result_info
def do_refresh_issue(self, order): result_info = { "result_code": 0, "result_msg": "", "pick_code_list": [], "pick_msg_list": [], } rebot = order.get_lock_rebot() if not rebot.test_login_status(): rebot.login() rebot.reload() order_log.info("[refresh_issue_start] order: %s,account:%s start orderDetail request", order.order_no, rebot.telephone) ret = self.send_orderDetail_request(rebot, order=order) order_log.info("[refresh_issue_end] order: %s,account:%s orderDetail request result : %s", order.order_no, rebot.telephone,ret) if not order.raw_order_no: order.modify(raw_order_no=ret["order_no"]) state = ret["state"] order_status_mapping = { "1": "购票成功", "2": "已作废", } if state == "1": #"出票成功": pick_no, pick_code = ret["pick_no"], ret["pick_code"] dx_info = { "order_no": order.raw_order_no, "time": order.drv_datetime.strftime("%Y-%m-%d %H:%M"), "start": order.line.s_sta_name, "end": order.line.d_sta_name, "code": pick_code, "no": pick_no, } dx_tmpl = DUAN_XIN_TEMPL[SOURCE_NMGHY] code_list = ["%s|%s" % (pick_no, pick_code)] msg_list = [dx_tmpl % dx_info] result_info.update({ "result_code": 1, "result_msg": order_status_mapping[state], "pick_code_list": code_list, "pick_msg_list": msg_list, }) elif state == "001007": #"出票中": result_info.update({ "result_code": 4, "result_msg": order_status_mapping[state], }) elif state in ("2"):#取消购票,购票失败,退票成功 result_info.update({ "result_code": 2, "result_msg": order_status_mapping[state], }) return result_info
def async_lock_ticket(self, order_no, retry_seq=1): """ 请求源网站锁票 + 锁票成功回调 Return: expire_time: "2015-11-11 11:11:11", # 订单过期时间 total_price: 322, # 车票价格 """ order_log.info("[async_lock_ticket] order:%s retry_seq: %s", order_no, retry_seq) order = Order.objects.get(order_no=order_no) if order.status != STATUS_WAITING_LOCK: return flow = get_flow(order.crawl_source) try: flow.lock_ticket(order) except Exception, e: order_log.exception("async_lock_ticket: %s", str(e))
def do_lock_ticket(self, order): rebot = order.get_lock_rebot() if not rebot.test_login_status(): rebot.login() rebot.reload() line = order.line riders = order.riders contact_info = order.contact_info passengers = [] buyPersonCard = riders[0]['id_number'] buyPersonName = riders[0]['name'] buyPersonPhone = contact_info['telephone'] for r in riders: cyuserid = self.send_add_passenger(r["id_number"], r["name"], rebot) passengers.append(cyuserid) if r["id_number"] == contact_info['id_number'] and r[ "name"] == contact_info['name']: #如果联系人中没有乘车人就取第一个乘车人作为取票人 buyPersonName = contact_info['name'] buyPersonCard = contact_info['id_number'] data = { "userId": rebot.user_id, "buyPersonName": buyPersonName, "insuCode": "", "buyPersonCard": buyPersonCard, "insuType": '', "buyPersonPhone": buyPersonPhone, "couponId": '', "insuPrice": '0', 'token': '', "lineBcId": order.line.bus_num, "passengers": ','.join(passengers), } order_log.info("[lock-start] order: %s,account:%s start lock request", order.order_no, rebot.telephone) try: res = self.send_lock_request(order, rebot, data=data) except Exception, e: order_log.info( "[lock-end] order: %s,account:%s lock request error %s", order.order_no, rebot.telephone, e) rebot.login() rebot.reload() res = self.send_lock_request(order, rebot, data=data)
def do_refresh_issue(self, order): result_info = { "result_code": 0, "result_msg": "", "pick_code_list": [], "pick_msg_list": [], } rebot = E8sAppRebot.objects.get(telephone=order.source_account) order_log.info( "[refresh_issue_start] order: %s,account:%s start orderDetail request", order.order_no, rebot.telephone) try: ret = self.send_orderDetail_request(rebot, order=order) except Exception, e: order_log.info( "[refresh_issue_start] order: %s,account:%s start orderDetail request error %s", order.order_no, rebot.telephone, e) rebot.login() rebot.reload() ret = self.send_orderDetail_request(rebot, order=order)
def do_lock_ticket(self, order): rebot = order.get_lock_rebot() line = order.line data = { "drvDate": line.drv_date, "orderSourceId": '7', "userId": rebot.user_id, "stopId": line.d_city_id, "carryStaId": line.s_sta_id, "schId": line.bus_num, } jsonStr = {"carryPersonInfo": [], "ticketAmount": 0} riders = order.riders tmp = {} ticketAmount = len(riders) jsonStr['ticketAmount'] = ticketAmount for i in riders: tmp = { "cardCode": i["id_number"], "insuranceFlag": "N", "cardName": i["name"], "mobile": i["telephone"], } jsonStr['carryPersonInfo'].append(tmp) data['jsonStr'] = json.dumps(jsonStr) order_log.info("[lock-start] order: %s,account:%s start lock request", order.order_no, rebot.telephone) try: res = self.send_lock_request(order, rebot, data=data) except Exception, e: order_log.info( "[lock-end] order: %s,account:%s lock request error %s", order.order_no, rebot.telephone, e) rebot.login() rebot.reload() res = self.send_lock_request(order, rebot, data=data)
def do_lock_ticket(self, order): lock_result = { "lock_info": {}, "source_account": '', "result_code": -1, "result_reason": "", "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } rebot = order.get_lock_rebot() if not rebot.test_login_status(): rebot.login() rebot.reload() res = self.send_lock_request(order, rebot) print res if res.has_key('struts.token'): del res['struts.token'] lock_result.update({ "lock_info": res, "source_account": rebot.telephone, "pay_money": '', }) if res['values']['result'] == 'success': order_no = res["values"]['orderInfo']['orderMap']['ddh'] order_log.info( "[lock-end] order: %s,account:%s start query encode orderId request", order.order_no, rebot.telephone) try: encode_order_detail = self.send_order_request(rebot, lock_info=res) except Exception, e: order_log.info( "[lock-end] order: %s,account:%s start query encode orderId request error %s", order.order_no, rebot.telephone, e) rebot.login() rebot.reload() encode_order_detail = self.send_order_request(rebot, lock_info=res) order_log.info( "[lock-end] order: %s,account:%s query encode orderId request result:%s", order.order_no, rebot.telephone, encode_order_detail) res.update({"encode_orderId": encode_order_detail['orderId']}) expire_time = dte.now() + datetime.timedelta(seconds=10 * 60) lock_result.update({ "result_code": 1, "result_reason": "", "pay_url": "", "raw_order_no": order_no, "expire_datetime": expire_time, "lock_info": res, "pay_money": encode_order_detail['pay_money'], })
def do_lock_ticket(self, order): lock_result = { "lock_info": {}, "source_account": order.source_account, "result_code": -1, "result_reason": "blank", "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } rebot = order.get_lock_rebot() line = order.line is_login = rebot.test_login_status() if not is_login: for i in range(3): msg = rebot.login() if msg == "OK": is_login = True break elif msg == "invalid_pwd": rebot.modify(is_active=False) rebot = order.change_lock_rebot() if not is_login: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "账号未登录", }) return lock_result res = self.request_station_status(line, rebot) if res["success"]: mode = 2 else: mode = 1 order_log.info("[locking] order:%s account:%s ip:%s", order.order_no, rebot.telephone, rebot.proxy_ip) # 加入购物车 res = self.request_add_shopcart(order, rebot, sta_mode=mode) ilst = re.findall(r"(\d+)\s张车票", str(res.get("msg", ""))) # 清理购物车 amount = ilst and int(ilst[0]) or 0 msg = res.get("msg", "") if (amount and amount != order.ticket_amount ) or u"单笔订单一次只允许购买3张车票" in msg or u"单笔订单只能购买一个车站的票" in msg: res = self.request_get_shoptcart(rebot) del_success = False for ids in res["data"][u"ShopTable"].keys(): d = self.request_del_shoptcart(rebot, ids) if d.get("success", False): del_success = True if not del_success: rebot.modify(cookies="{}") rebot = order.change_lock_rebot() rebot.modify(ip="") lock_result.update({ "result_code": 2, "result_reason": u"购物车数量不对:%s, %s" % (msg, del_success), "source_account": rebot.telephone, }) return lock_result def _check_fail(msg): if u"当前系统维护中" in msg: return False lst = [ u"可售票数量不足", u"锁票超时超过10次", u"当前班次座位资源紧张", u"可能车站已调整票价", u"拒绝售票", u"提前时间不足", u"班次席位可售数不足", u"班次站点无可售席位", u"班次状态为停班", u"无可售席位资源", u"可售数不足", u"班次状态为保班", u"无可售席位", u"中心转发30003请求TKLock_3失败", u"班次状态为作废", u"不允许锁位", u"锁位失败" ] for s in lst: if s in msg: return True return False if res["success"]: res = self.request_lock(order, rebot, sta_mode=mode) if res["success"]: expire_time = dte.now() + datetime.timedelta(seconds=15 * 60) lock_result.update({ "result_code": 1, "result_reason": "", "pay_url": "", "raw_order_no": res["raw_order_no"], "expire_datetime": expire_time, "source_account": rebot.telephone, "pay_money": res["pay_money"], "lock_info": { "mode": mode }, }) elif u"同一IP一天最多可订" in res["msg"]: res["msg"] = "ip: %s %s" % (rebot.proxy_ip, res["msg"]) get_proxy("cqky").set_black(rebot.proxy_ip) rebot.modify(ip="") lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif u"当前用户今天交易数已满" in res["msg"] or u"当前登录用户已被列为可疑用户" in res[ "msg"] or u"当前系统维护中" in res["msg"]: rebot.modify(cookies="{}") rebot = order.change_lock_rebot() lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif u"例行维护" in res["msg"] or u"暂停网上购票业务" in res[ "msg"] or u"维护时间" in res["msg"]: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif _check_fail(res["msg"]): self.close_line(line, reason=res["msg"]) lock_result.update({ "result_code": 0, "source_account": rebot.telephone, "result_reason": res["msg"], }) else: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif u"您未登录或登录已过期" in res["msg"] or u"例行维护" in res["msg"]: rebot.modify(ip="") lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": res["msg"], }) else: lock_result.update({ "result_code": 0, "result_reason": "add_shopcart fail, %s" % res["msg"], "source_account": rebot.telephone, }) return lock_result
class Flow(BaseFlow): name = "e8s" def do_lock_ticket(self, order): rebot = order.get_lock_rebot() line = order.line data = { "drvDate": line.drv_date, "orderSourceId": '7', "userId": rebot.user_id, "stopId": line.d_city_id, "carryStaId": line.s_sta_id, "schId": line.bus_num, } jsonStr = {"carryPersonInfo": [], "ticketAmount": 0} riders = order.riders tmp = {} ticketAmount = len(riders) jsonStr['ticketAmount'] = ticketAmount for i in riders: tmp = { "cardCode": i["id_number"], "insuranceFlag": "N", "cardName": i["name"], "mobile": i["telephone"], } jsonStr['carryPersonInfo'].append(tmp) data['jsonStr'] = json.dumps(jsonStr) order_log.info("[lock-start] order: %s,account:%s start lock request", order.order_no, rebot.telephone) try: res = self.send_lock_request(order, rebot, data=data) except Exception, e: order_log.info( "[lock-end] order: %s,account:%s lock request error %s", order.order_no, rebot.telephone, e) rebot.login() rebot.reload() res = self.send_lock_request(order, rebot, data=data) order_log.info( "[lock-end] order: %s,account:%s lock request result : %s", order.order_no, rebot.telephone, res) # {"detail":{"orderCode":"160412010300100009","orderId":"439997"},"flag":"1"} lock_result = { "lock_info": res, "source_account": rebot.telephone, "pay_money": line.real_price() * order.ticket_amount, } if res.get('detail', []): order_no = res["detail"]['orderCode'] expire_time = dte.now() + datetime.timedelta(seconds=10 * 60) lock_result.update({ "result_code": 1, "result_reason": "", "pay_url": "", "raw_order_no": order_no, "expire_datetime": expire_time, "lock_info": res }) else: errmsg = res.get('failReason', '') if "一张身份证一天只能订一张票" in errmsg: new_rebot = order.change_lock_rebot() lock_result.update({ "result_code": 2, "source_account": new_rebot.telephone, "result_reason": str(rebot.telephone) + errmsg, }) return lock_result lock_result.update({ "result_code": 0, "result_reason": res.get('failReason', '') or res, "pay_url": "", "raw_order_no": "", "expire_datetime": None, }) return lock_result
def check_raw_order_no(self, order): """ 有时候源站返回的订单号是错的,这时需要从源站搜出来 """ if order.status != STATUS_WAITING_ISSUE: return try: other = Order.objects.get( raw_order_no=order.raw_order_no, status__in=[STATUS_ISSUE_SUCC, STATUS_ISSUE_FAIL]) except Order.DoesNotExist: return if other.order_no == order.order_no: return rebot = order.get_lock_rebot() base_url = "http://www.96096kp.cn/UserData/UserCmd.aspx" params = { "isCheck": "false", "ValidateCode": "", "IDTypeCode": 1, "IDTypeNo": order.contact_info["id_number"], "start": 0, "limit": 10, "Status": -1, "cmd": "OnlineOrderGetList" } headers = { "User-Agent": rebot.user_agent, "Referer": "http://www.96096kp.cn/TicketMain.aspx", "Origin": "http://www.96096kp.cn", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } cookies = json.loads(rebot.cookies) r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies) res = json.loads(trans_js_str(r.content)) order_list = res["data"] if order.contact_info["id_number"] != order.riders[0]["id_number"]: params = { "isCheck": "false", "ValidateCode": "", "IDTypeCode": 1, "IDTypeNo": order.riders[0]["id_number"], "start": 0, "limit": 10, "Status": -1, "cmd": "OnlineOrderGetList" } r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies) res = json.loads(trans_js_str(r.content)) order_list.extend(res["data"]) for d in order_list: if d["OrderStatus"] == "未支付" and float( d["OrderMoney"]) == order.order_price and int( d["TicketCount"]) == order.ticket_amount: raw_order = d["OrderNo"] qs = Order.objects.filter(raw_order_no=raw_order) cnt = qs.count() if not cnt: old = order.raw_order_no order.modify(raw_order_no=raw_order, pay_money=float(d["OrderMoney"])) order.add_trace(OT_CHECK_RAW_ORDER, "%s=>%s" % (old, order.raw_order_no)) order_log.info("order:%s change raw_order_no %s to %s", order.order_no, old, order.raw_order_no) return elif cnt == 1: if qs.first().order_no == order.order_no: return
} rebot = E8sAppRebot.objects.get(telephone=order.source_account) order_log.info( "[refresh_issue_start] order: %s,account:%s start orderDetail request", order.order_no, rebot.telephone) try: ret = self.send_orderDetail_request(rebot, order=order) except Exception, e: order_log.info( "[refresh_issue_start] order: %s,account:%s start orderDetail request error %s", order.order_no, rebot.telephone, e) rebot.login() rebot.reload() ret = self.send_orderDetail_request(rebot, order=order) order_log.info( "[refresh_issue_end] order: %s,account:%s orderDetail request result : %s", order.order_no, rebot.telephone, ret) if not order.raw_order_no: order.modify(raw_order_no=ret["order_no"]) order_status = ret["order_status"] pay_status = ret["pay_status"] state = '' if pay_status == '1' and order_status in ('7', '8', '9'): state = '失败订单' if pay_status in ('7', '3', '2') and order_status == '1': state = "已购票" order_status_mapping = { "失败订单": "失败订单", "已购票": "购票成功",
def refresh_issue(self, order, force=False): """ 出票刷新主流程,子类不用重写 """ old_status = order.status if not self.need_refresh_issue(order, force=force): return order_log.info("[issue-refresh-start] order:%s", order.order_no) ret = self.do_refresh_issue(order) order.reload() code = ret["result_code"] code_status_mapping = { 0: old_status, 1: STATUS_ISSUE_SUCC, 2: STATUS_ISSUE_FAIL, 3: STATUS_GIVE_BACK, 4: STATUS_ISSUE_ING, } if code_status_mapping.get(code, "") == old_status or code == 0: order_log.info("[issue-refresh-result] keeping order:%s, msg:%s", order.order_no, ret["result_msg"]) return elif code == 1: # 出票成功 msg_list = ret["pick_msg_list"] or order.pick_msg_list code_list = ret["pick_code_list"] or order.pick_code_list if not code_list: # 最初设计要求msg_list和code_list长度必须一致 code_list = [""] * len(msg_list) msg = msg_list and msg_list[0] or "" order_log.info( "[issue-refresh-result] order: %s succ. msg:%s, pick_msg: %s", order.order_no, ret["result_msg"], msg) order.modify(status=STATUS_ISSUE_SUCC, pick_code_list=code_list, pick_msg_list=msg_list) order.on_issue_success() issued_callback.delay(order.order_no) elif code == 2: # 出票失败 order_log.info("[issue-refresh-result] order: %s fail. msg:%s", order.order_no, ret["result_msg"]) order.modify(status=STATUS_ISSUE_FAIL) order.on_issue_fail(ret["result_msg"]) issued_callback.delay(order.order_no) elif code == 3: # 源站已退款 order_log.info( "[issue-refresh-result] order: %s give back. msg:%s", order.order_no, ret["result_msg"]) order.modify(status=STATUS_GIVE_BACK) issued_callback.delay(order.order_no) order.on_give_back() elif code == 4: # 正在出票 order_log.info("[issue-refresh-result] order: %s issueing. msg:%s", order.order_no, ret["result_msg"]) order.modify(status=STATUS_ISSUE_ING) order.on_issueing() elif code == 5: # 超时过期, 进入锁票重试 order_log.info("[issue-refresh-result] order: %s expire. msg:%s", order.order_no, ret["result_msg"]) order.modify(pay_order_no="", raw_order_no="", lock_info={}) self.lock_ticket_retry(order, reason=ret["result_msg"]) else: order_log.error( "[issue-refresh-result] order: %s error, 未处理状态 status:%s", order.order_no, code)
def lock_ticket2(self, order, **kwargs): order.reload() notify_url = order.locked_return_url data = { "sys_order_no": order.order_no, "out_order_no": order.out_order_no, "raw_order_no": order.raw_order_no, } order_log.info("[lock-start] order: %s", order.order_no) fail_msg = self.check_lock_condition(order) if fail_msg: # 防止重复下单 order_log.info("[lock-ignore] order: %s %s", order.order_no, fail_msg) return force_fail = False if (order.line.drv_datetime - dte.now()).total_seconds() <= 40 * 60: force_fail = True fail_msg = "[系统检查]距离开车时间太近" elif order.order_channel.lower() == "taobao" and (dte.now( ) - order.create_date_time).total_seconds() > 5 * 60 * 60 + 50 * 60: force_fail = True fail_msg = "[系统检查]淘宝的单,过了5小时50分则自动失败" if force_fail: ret = { "lock_info": {}, "source_account": order.source_account, "result_code": 0, "result_reason": fail_msg, "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } else: ret = self.do_lock_ticket(order, **kwargs) order.reload() fail_msg = self.check_lock_condition(order) if fail_msg: # 再次检查, 防止重复支付 order_log.info("[lock-ignore] order: %s %s", order.order_no, fail_msg) return if ret["result_code"] == 1: # 锁票成功 order.modify( status=STATUS_WAITING_ISSUE, lock_info=ret["lock_info"], lock_datetime=dte.now(), source_account=ret["source_account"], pay_url=ret["pay_url"], raw_order_no=ret["raw_order_no"], pay_money=ret["pay_money"], ) order.on_lock_success() order.reload() data.update({ "raw_order_no": order.raw_order_no, "expire_time": ret["expire_datetime"].strftime("%Y-%m-%d %H:%M:%S"), "total_price": order.order_price, }) json_str = json.dumps({ "code": RET_OK, "message": "OK", "data": data }) order_log.info("[lock-result] succ. order: %s rebot:%s raw_order_no:%s pay_order_no:%s lock_info:%s", \ order.order_no, order.source_account, order.raw_order_no, order.pay_order_no, order.lock_info) elif ret["result_code"] == 2: # 锁票失败,进入锁票重试 order.modify(source_account=ret["source_account"], lock_info=ret["lock_info"]) self.lock_ticket_retry(order, reason=ret["result_reason"]) order_log.info("[lock-result] retry. order: %s, reason: %s", order.order_no, ret["result_reason"]) return elif ret["result_code"] == 0: # 锁票失败 order.modify(status=STATUS_LOCK_FAIL, lock_info=ret["lock_info"], lock_datetime=dte.now(), source_account=ret["source_account"]) order.on_lock_fail(reason=ret["result_reason"]) json_str = json.dumps({ "code": RET_LOCK_FAIL, "message": ret["result_reason"], "data": data }) order_log.info("[lock-result] fail. order: %s, reason: %s", order.order_no, ret["result_reason"]) elif ret["result_code"] == 3: # 锁票输验证码 order_log.info("[lock-result] order:%s need valid code", order.order_no) return else: order_log.info( "[lock-result] unrecognize. order: %s, reason: %s code:%s", order.order_no, ret["result_reason"], ret["result_code"]) return if notify_url: order_log.info("[lock-callback] order:%s, %s %s", order.order_no, notify_url, json_str) response = urllib2.urlopen(notify_url, json_str, timeout=20) result = response.read() order.add_trace(OT_LOCK_CB, "锁票回调成功 收到回应:%s" % result) order_log.info("[lock-callback-response] order:%s, %s", order.order_no, result)
class Flow(BaseFlow): name = "kuaiba" def do_lock_ticket(self, order): rebot = order.get_lock_rebot() if not rebot.test_login_status(): rebot.login() rebot.reload() line = order.line riders = order.riders contact_info = order.contact_info passengers = [] buyPersonCard = riders[0]['id_number'] buyPersonName = riders[0]['name'] buyPersonPhone = contact_info['telephone'] for r in riders: cyuserid = self.send_add_passenger(r["id_number"], r["name"], rebot) passengers.append(cyuserid) if r["id_number"] == contact_info['id_number'] and r[ "name"] == contact_info['name']: #如果联系人中没有乘车人就取第一个乘车人作为取票人 buyPersonName = contact_info['name'] buyPersonCard = contact_info['id_number'] data = { "userId": rebot.user_id, "buyPersonName": buyPersonName, "insuCode": "", "buyPersonCard": buyPersonCard, "insuType": '', "buyPersonPhone": buyPersonPhone, "couponId": '', "insuPrice": '0', 'token': '', "lineBcId": order.line.bus_num, "passengers": ','.join(passengers), } order_log.info("[lock-start] order: %s,account:%s start lock request", order.order_no, rebot.telephone) try: res = self.send_lock_request(order, rebot, data=data) except Exception, e: order_log.info( "[lock-end] order: %s,account:%s lock request error %s", order.order_no, rebot.telephone, e) rebot.login() rebot.reload() res = self.send_lock_request(order, rebot, data=data) order_log.info( "[lock-end] order: %s,account:%s lock request result : %s", order.order_no, rebot.telephone, res) lock_result = { "lock_info": res, "source_account": rebot.telephone, "pay_money": line.real_price() * order.ticket_amount, } if res['code'] == '100': order_no = res["data"]['orderid'] closetime = int(res["data"]['closetime']) expire_time = dte.now() + datetime.timedelta(seconds=60 * closetime) lock_result.update({ "result_code": 1, "result_reason": "", "pay_url": "", "raw_order_no": order_no, "expire_datetime": expire_time, "lock_info": res }) else: errmsg = res['msg'] for s in ["班次余票不足"]: if s in errmsg: self.close_line(line, reason=errmsg) break lock_result.update({ "result_code": 0, "result_reason": errmsg, "pay_url": "", "raw_order_no": "", "expire_datetime": None, }) return lock_result
def issued_callback(self, order_no, retry_seq=1): """ 出票回调 Return: { "code": RET_OK, "message": "OK" "data":{ "sys_order_no": "", "out_order_no": "", "raw_order_no"; "", "need_send_msg": 0, "pick_info":[{ "pick_code": "1", "pck_msg": "2" },], } } """ from app.models import Order order = Order.objects.get(order_no=order_no) cb_url = order.issued_return_url order_log.info("[issue-callback-start] order:%s, retry_seq: %s, callback:%s", retry_seq, order_no, cb_url) if not cb_url: return if order.status == STATUS_ISSUE_SUCC: if not order.pick_code_list: # 没取票信息不回调 order_log.info("[issue-callback-ignore] no pick info") return pick_info = [] for i, code in enumerate(order.pick_code_list): pick_info.append({ "pick_code": code, "pick_msg": order.pick_msg_list[i] }) ret = { "code": RET_OK, "message": "OK", "data": { "sys_order_no": order.order_no, "out_order_no": order.out_order_no, "raw_order_no": order.raw_order_no, "pick_info": pick_info, "need_send_msg": order.need_send_msg, } } elif order.status in [STATUS_GIVE_BACK, STATUS_LOCK_FAIL, STATUS_ISSUE_FAIL]: ret = { "code": RET_ISSUED_FAIL, "message": "fail", "data": { "sys_order_no": order.order_no, "out_order_no": order.out_order_no, "raw_order_no": order.raw_order_no, "need_send_msg": order.need_send_msg, } } else: order_log.info("[issue-callback-ignore] status incorrect") return order_log.info("[issue-callback] %s %s", order_no, str(ret)) try: response = urllib2.urlopen(cb_url, json.dumps(ret), timeout=15) except: order_log.exception("issued_callback") self.retry(kwargs={"retry_seq": retry_seq+1}, countdown=30, max_retries=120) else: result = response.read() order.add_trace(OT_ISSUE_CB, "出票回调成功 收到回应:%s" % result) order_log.info("[issue-callback-response]%s %s", order_no, result)
def get_pay_page(self, order, **kwargs): self.refresh_issue(order) if order.status != STATUS_WAITING_ISSUE: return {"flag": "refuse", "content": ""} rebot = order.get_lock_rebot() headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", "Content-Type": "application/json;charset=utf-8", } param_url = "http://m.ctrip.com/restapi/soa2/10098/HandleOrderPayment.json?_fxpcqlniredt=09031108210147109160" req_args = { "ClientVersion": "6.12", "Channel": "H5", "PaymentOrderInfos": [{ "BizType": "QiChe", "OrderIDs": [ order.raw_order_no, ] }], "From": "http://m.ctrip.com/webapp/myctrip/orders/allorders?from=%2Fwebapp%2Fmyctrip%2Findex", "Platform": "H5", "head": rebot.head, "contentType": "json" } r = requests.post(param_url, data=json.dumps(req_args), headers=headers) ret = r.json() order_log.info("[pay-request1] order:%s ret: %s", order.order_no, str(ret)) if ret["Result"]["ResultCode"] == -1: order_log.error("[pay-fail] order:%s msg: %s", order.order_no, ret["Result"]["ResultMsg"]) token_info = json.loads(ret["PaymentInfos"][0]["Token"]) bus_type = token_info["bustype"] req_id = token_info["requestid"] price = token_info["amount"] title = token_info["title"] submit_url = "https://gateway.secure.ctrip.com/restful/soa2/10289/paymentinfo/submitv3?_fxpcqlniredt=09031108210147109160" submit_args = { "opttype": 1, "paytype": 4, "thirdpartyinfo": { "paymentwayid": "EB_MobileAlipay", "typeid": 0, "subtypeid": 4, "typecode": "", "thirdcardnum": "", "amount": str(price), "brandid": "EB_MobileAlipay", "brandtype": "2", "channelid": "109" }, "opadbitmp": 4, "ver": 612, "plat": 5, "requestid": req_id, "clientextend": "eyJpc1JlYWxUaW1lUGF5IjoxLCJpc0F1dG9BcHBseUJpbGwiOjF9", "clienttoken": "eyAib2lkIjogIjE2NjIxMzA3NjUiLCAiYnVzdHlwZSI6ICIxNCIsICJzYmFjayI6ICJodHRwOi8vbS5jdHJpcC5jb20vd2ViYXBwL3RyYWluL2luZGV4Lmh0bWwjYnVzcmVzdWx0IiwgInRpdGxlIjogIui+vuW3ni3ph43luoYiLCAiYW1vdW50IjogIjQ3IiwgInJiYWNrIjogIiIsICJlYmFjayI6ICJodHRwOi8vbS5jdHJpcC5jb20vd2ViYXBwL3RyYWluL2luZGV4Lmh0bWwjYnVzcmVzdWx0IiwgInJlcXVlc3RpZCI6ICIxMzE1MTIzMTEwMDAwMTI5ODIzIiwgImF1dGgiOiAiNzI3NTI4ODU5RjA2MEIzMkMzMTIyMkYwMzVCNDA1NTZFN0Q1QjU2MTg4MzU3QTM1NTIxMDFDMjY3RUM3RTNCMyIsICJmcm9tIjogImh0dHA6Ly9tLmN0cmlwLmNvbS93ZWJhcHAvbXljdHJpcC9pbmRleCIsICJpc2xvZ2luIjogIjAiIH0=", "clientsign": "", "bustype": bus_type, "usetype": 1, "subusetype": 0, "subpay": 0, "forcardfee": 0, "forcardcharg": 0, "stype": 0, "payrestrict": {}, "oinfo": { "oid": order.raw_order_no, "oidex": order.raw_order_no, "odesc": title, "currency": "CNY", "oamount": str(price), "displayCurrency": "CNY", "displayAmount": "", "extno": "", "autoalybil": True, "recall": "" }, "cardinfo": None, "statistic": None, "cashinfo": None, "head": rebot.head, "contentType": "json" } r = requests.post(submit_url, data=json.dumps(submit_args), headers=headers) ret = r.json() pay_url = ret["thirdpartyinfo"]["sig"] base_url, query_str = pay_url.split("?") params = {} lst = [] for s in query_str.split("&"): k, v = s.split("=") if k == "ctu_info": v = "\"{isAccountDeposit:false,isCertificate:true}\"" params[k] = v[1:-1] lst.append("%s=%s" % (k, v[1:-1])) pay_url = "%s?%s" % (base_url, "&".join(lst)) return { "flag": "url", "content": pay_url, }
def submit_order(): """ 提交订单 Input: { "line_id: "2891249051391980105" # 线路ID "out_order_no": "222" # 商户订单号 "order_price: 11 # 订单金额(总票价) "contact_info:{ # 联系人信息 "name": "罗军平", # 名字 "telephone": "15575101324", # 手机 "id_type": 1, # 证件类型 "id_number": "xxxxx", # 证件号 "age_level": 1, # 大人 or 小孩 }, rider_info: [{ # 乘客信息 "name": "罗军平", # 名字 "telephone": "15575101324", # 手机 "id_type": 1, # 证件类型 "id_number": "xxxxxx", # 证件号 "age_level": 1, # 大人 or 小孩 }], "locked_return_url: "" # 锁票成功回调地址 "issued_return_url: "" # 出票成功回调地址 "channel": "pc|wx|taobao...", # 售票来源 字符串类型 "insurance": 3.0, # 保险费: 小数 "channel_order_no": "12308q16080414083743f", # 合作方订单号 } Return: { "code": 1, "message": "submit order success!" "data":{ "sys_order_no": xxxxxx, } } """ order_log.info("[submit-start] receive order: %s", request.get_data()) try: post = json.loads(request.get_data()) line_id = post["line_id"] contact_info = post["contact_info"] rider_list = post["rider_info"] out_order_no = post["out_order_no"] for info in [contact_info] + rider_list: for key in [ "name", "telephone", "id_type", "id_number", "age_level" ]: assert key in info order_price = float(post.get("order_price")) except: order_log.info("[submit-fail] parameter error") return jsonify({ "code": RET_PARAM_ERROR, "message": "parameter error", "data": "" }) try: line = Line.objects.get(line_id=line_id) except Line.DoesNotExist: order_log.info("[submit-fail] line not exist") return jsonify({"code": RET_LINE_404, "message": "线路不存在", "data": ""}) flow, line = get_compatible_flow(line) if not flow: return jsonify({ "code": RET_LINE_404, "message": "未找到合适路线", "data": "" }) try: order = Order.objects.get(out_order_no=out_order_no) ret = { "code": RET_OK, "message": u"已存在这个单", "data": { "sys_order_no": order.order_no } } order_log.info("[submit-response] out_order:%s order:%s ret:%s", out_order_no, order.order_no, ret) return jsonify(ret) except Order.DoesNotExist: pass ticket_amount = len(rider_list) locked_return_url = post.get("locked_return_url", None) or None issued_return_url = post.get("issued_return_url", None) or None order = Order() order.order_no = Order.generate_order_no() order.out_order_no = out_order_no order.status = STATUS_WAITING_LOCK order.order_price = order_price order.create_date_time = dte.now() order.line = line order.ticket_price = line.full_price order.ticket_amount = ticket_amount order.ticket_fee = line.fee order.contact_info = contact_info order.riders = rider_list order.crawl_source = line.crawl_source order.locked_return_url = locked_return_url order.issued_return_url = issued_return_url order.drv_datetime = line.drv_datetime order.bus_num = line.bus_num order.starting_name = line.s_city_name + ';' + line.s_sta_name order.destination_name = line.d_city_name + ';' + line.d_sta_name order.order_channel = post.get("channel", "") order.order_insurance = float(str(post.get("insurance", "0")).strip()) order.channel_order_no = post.get("channel_order_no", "") order.save() order.on_create() ret = { "code": RET_OK, "message": "ok", "data": { "sys_order_no": order.order_no } } order_log.info("[submit-response] out_order:%s order:%s ret:%s", out_order_no, order.order_no, ret) if order.crawl_source == SOURCE_FB: async_lock_ticket.delay(order.order_no) else: enqueue_wating_lock(order) return jsonify(ret)
class Flow(BaseFlow): name = "cqky" def do_lock_ticket(self, order): lock_result = { "lock_info": {}, "source_account": order.source_account, "result_code": -1, "result_reason": "blank", "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } rebot = order.get_lock_rebot() line = order.line is_login = rebot.test_login_status() if not is_login: for i in range(3): msg = rebot.login() if msg == "OK": is_login = True break elif msg == "invalid_pwd": rebot.modify(is_active=False) rebot = order.change_lock_rebot() if not is_login: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "账号未登录", }) return lock_result res = self.request_station_status(line, rebot) if res["success"]: mode = 2 else: mode = 1 order_log.info("[locking] order:%s account:%s ip:%s", order.order_no, rebot.telephone, rebot.proxy_ip) # 加入购物车 res = self.request_add_shopcart(order, rebot, sta_mode=mode) ilst = re.findall(r"(\d+)\s张车票", str(res.get("msg", ""))) # 清理购物车 amount = ilst and int(ilst[0]) or 0 msg = res.get("msg", "") if (amount and amount != order.ticket_amount ) or u"单笔订单一次只允许购买3张车票" in msg or u"单笔订单只能购买一个车站的票" in msg: res = self.request_get_shoptcart(rebot) del_success = False for ids in res["data"][u"ShopTable"].keys(): d = self.request_del_shoptcart(rebot, ids) if d.get("success", False): del_success = True if not del_success: rebot.modify(cookies="{}") rebot = order.change_lock_rebot() rebot.modify(ip="") lock_result.update({ "result_code": 2, "result_reason": u"购物车数量不对:%s, %s" % (msg, del_success), "source_account": rebot.telephone, }) return lock_result def _check_fail(msg): if u"当前系统维护中" in msg: return False lst = [ u"可售票数量不足", u"锁票超时超过10次", u"当前班次座位资源紧张", u"可能车站已调整票价", u"拒绝售票", u"提前时间不足", u"班次席位可售数不足", u"班次站点无可售席位", u"班次状态为停班", u"无可售席位资源", u"可售数不足", u"班次状态为保班", u"无可售席位", u"中心转发30003请求TKLock_3失败", u"班次状态为作废", u"不允许锁位", u"锁位失败" ] for s in lst: if s in msg: return True return False if res["success"]: res = self.request_lock(order, rebot, sta_mode=mode) if res["success"]: expire_time = dte.now() + datetime.timedelta(seconds=15 * 60) lock_result.update({ "result_code": 1, "result_reason": "", "pay_url": "", "raw_order_no": res["raw_order_no"], "expire_datetime": expire_time, "source_account": rebot.telephone, "pay_money": res["pay_money"], "lock_info": { "mode": mode }, }) elif u"同一IP一天最多可订" in res["msg"]: res["msg"] = "ip: %s %s" % (rebot.proxy_ip, res["msg"]) get_proxy("cqky").set_black(rebot.proxy_ip) rebot.modify(ip="") lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif u"当前用户今天交易数已满" in res["msg"] or u"当前登录用户已被列为可疑用户" in res[ "msg"] or u"当前系统维护中" in res["msg"]: rebot.modify(cookies="{}") rebot = order.change_lock_rebot() lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif u"例行维护" in res["msg"] or u"暂停网上购票业务" in res[ "msg"] or u"维护时间" in res["msg"]: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif _check_fail(res["msg"]): self.close_line(line, reason=res["msg"]) lock_result.update({ "result_code": 0, "source_account": rebot.telephone, "result_reason": res["msg"], }) else: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "%s sta_mode:%s" % (res["msg"], mode), }) elif u"您未登录或登录已过期" in res["msg"] or u"例行维护" in res["msg"]: rebot.modify(ip="") lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": res["msg"], }) else: lock_result.update({ "result_code": 0, "result_reason": "add_shopcart fail, %s" % res["msg"], "source_account": rebot.telephone, }) return lock_result def request_lock(self, order, rebot, sta_mode=1): headers = { "User-Agent": rebot.user_agent, "Referer": "http://www.96096kp.cn/User/CommitGoods.aspx", } cookies = json.loads(rebot.cookies) if sta_mode == 1: base_url = "http://www.96096kp.cn/CommitGoods.aspx" r = rebot.http_get(base_url, headers=headers, cookies=cookies) soup = BeautifulSoup(r.content, "lxml") headers.update({ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" }) mail = "*****@*****.**" % rebot.telephone info = {} for attr in [ "Moblie", "ID", "Email", "Name", "CerType", "CerNo", "Addr", "Notes" ]: key = attr if attr == "Moblie": key = "Mobile" info[attr] = rebot.user_info[key] params = { "__VIEWSTATE": soup.select("#__VIEWSTATE")[0].get("value"), "__EVENTVALIDATION": soup.select("#__EVENTVALIDATION")[0].get("value"), "ctl00$FartherMain$NavigationControl1$CustRBList": info, "ctl00$FartherMain$NavigationControl1$o_CustomerName": order.contact_info["name"], "ctl00$FartherMain$NavigationControl1$o_Mobele": order.contact_info["telephone"], "ctl00$FartherMain$NavigationControl1$o_IdType": 1, "ctl00$FartherMain$NavigationControl1$o_IdCard": order.contact_info["id_number"], "ctl00$FartherMain$NavigationControl1$o_IdCardConfirm": order.contact_info["id_number"], "ctl00$FartherMain$NavigationControl1$radioListPayType": "OnlineAliPay,支付宝在线支付", "ctl00$FartherMain$NavigationControl1$o_Email": mail, "ctl00$FartherMain$NavigationControl1$ContactAddress": "", "ctl00$FartherMain$NavigationControl1$o_Memo": "", "ctl00$FartherMain$NavigationControl1$hideIsSubmit": "true", } else: base_url = "http://www.96096kp.cn/OrderConfirm.aspx" r = rebot.http_get(base_url, headers=headers, cookies=cookies) soup = BeautifulSoup(r.content, "lxml") headers.update({ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" }) params = { "__VIEWSTATE": soup.select("#__VIEWSTATE")[0].get("value"), "__EVENTVALIDATION": soup.select("#__EVENTVALIDATION")[0].get("value"), "ctl00$FartherMain$radioListPayType": "OnlineAliPay,支付宝在线支付", "ctl00$FartherMain$hideIsSubmit": "true", } r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies, timeout=90) soup = BeautifulSoup(r.content, "lxml") msg_lst = re.findall(r'<script>alert\("(.+)"\);</script>', r.content) msg = "" if msg_lst: msg = msg_lst[0] try: order_no = soup.find("input", attrs={ "name": "out_trade_no" }).get("value") pay_money = float( soup.find("input", attrs={ "name": "total_fee" }).get("value")) flag = True except: order_no = "" pay_money = "" flag = False return { "success": flag, "msg": msg, "raw_order_no": order_no, "pay_order_no": order_no, "pay_money": pay_money, } def request_get_shoptcart(self, rebot): """ 获取购物车条目 """ base_url = "http://www.96096kp.cn/UserData/ShopCart.aspx" headers = { "User-Agent": rebot.user_agent, "Referer": "http://www.96096kp.cn/TicketMain.aspx", "Origin": "http://www.96096kp.cn", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } cookies = json.loads(rebot.cookies) params = { "cmd": "getCartItemList", } r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies) return json.loads(trans_js_str(r.content)) def request_del_shoptcart(self, rebot, sid): """ 删除购物车 """ base_url = "http://www.96096kp.cn/UserData/ShopCart.aspx" headers = { "User-Agent": rebot.user_agent, "Referer": "http://www.96096kp.cn/TicketMain.aspx", "Origin": "http://www.96096kp.cn", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } cookies = json.loads(rebot.cookies) params = { "cmd": "delCartItem", "id": sid, } r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies) return json.loads(trans_js_str(r.content)) def request_add_shopcart(self, order, rebot, sta_mode=1): """ 加入购物车 """ line = order.line base_url = "http://www.96096kp.cn/UserData/ShopCart.aspx" headers = { "User-Agent": rebot.user_agent, "Referer": "http://www.96096kp.cn/TicketMain.aspx", "Origin": "http://www.96096kp.cn", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } cookies = json.loads(rebot.cookies) params = { "classInfo": json.dumps(line.extra_info["raw_info"], ensure_ascii=False), "drBusStationCode": line.s_sta_id, "drBusStationName": line.s_sta_name, "ticketHalfCount": 0, "ticketFullCount": order.ticket_amount, "ticketChildCount": 0, "cmd": "buyTicket", } if sta_mode == 2: lst = [] for r in order.riders: lst.append("1~%s~1~%s~%s~0~false" % (r["name"], r["id_number"], r["telephone"])) params.update({ "passengerMsg": "|".join(lst), "contactMsg": "%s~%s~" % (order.contact_info["name"], order.contact_info["telephone"]), "isIns": "false", }) r = rebot.http_post( base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies, ) try: res = json.loads(trans_js_str(r.content)) except Exception, e: rebot.modify(ip="") raise e order_log.info("[locking] order: %s add shopcart, %s", order.order_no, res.get("msg", "")) return res
def do_lock_ticket(self, order): lock_result = { "lock_info": {}, "source_account": '', "result_code": -1, "result_reason": "", "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } rebot = order.get_lock_rebot() is_login = rebot.test_login_status() if not is_login: lock_result.update(result_code=2, source_account=rebot.telephone, result_reason="账号未登陆") data = { "loginType": 0, "backUrl": '', "mobile": rebot.telephone, "password": rebot.password, "validateCode": '1234' } r = requests.post("http://84100.com/doLogin/ajax", data=data) if r.json().get('flag', '') == '0': ua = rebot.user_agent if not ua: ua = random.choice(BROWSER_USER_AGENT) rebot.modify(cookies=dict(r.cookies), is_active=True, last_login_time=dte.now(), user_agent=ua) if not rebot.test_login_status(): return lock_result else: return lock_result try: rebot.recrawl_shiftid(order.line) except: lock_result.update(result_code=2, source_account=rebot.telephone, result_reason="源站刷新线路错误,锁票重试") return lock_result line = Line.objects.get(line_id=order.line.line_id) order.line = line order.ticket_price = line.full_price order.save() lock_result.update(source_account=rebot.telephone) if order.line.shift_id == "0" or not order.line.extra_info.get( 'flag', 0): lock_result.update(result_reason="该条线路无法购买", result_code=0) return lock_result ttype, ttpwd = self.request_ticket_info(order, rebot) lock_info = self.request_create_order(order, rebot, ttype, ttpwd) order_log.info( "[lock-result] request_create_order . order: %s,account:%s,result:%s", order.order_no, rebot.telephone, lock_info) lock_flag, lock_msg = lock_info["flag"], lock_info.get("msg", "") if u"乘车人不能超过" in lock_msg: order.line.shift_id = "0" order.save() lock_result.update(result_code=0, result_reason=lock_msg) if lock_flag == '0': # 锁票成功 expire_datetime = dte.now() + datetime.timedelta(seconds=20 * 60) lock_result.update({ "result_code": 1, "lock_info": lock_info, "pay_url": "", "raw_order_no": '', "expire_datetime": expire_datetime, "pay_money": order.order_price, }) elif lock_flag == '2': if u'同一出发日期限购6张' in lock_msg: lock_result.update(result_code=2, source_account="", result_reason="账号被限购,锁票重试") elif u'Could not return the resource to the pool' in lock_msg: lock_result.update(result_code=2, source_account="", result_reason="源站系统错误,锁票重试") else: lock_result.update(result_code=0, result_reason=lock_msg) elif lock_flag == '99' or u'班次信息错误' in lock_msg: lock_result.update(result_code=2, result_reason=lock_msg) else: lock_result.update({ "result_code": 0, "lock_info": lock_info, "result_reason": lock_msg, }) return lock_result
def do_lock_ticket(self, order): lock_result = { "lock_info": {}, "source_account": order.source_account, "result_code": 0, "result_reason": "", "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } rebot = order.get_lock_rebot() line = order.line cookies = json.loads(rebot.cookies) headers = { 'User-Agent': rebot.user_agent, "Content-Type": "application/x-www-form-urlencoded", } uname = order.contact_info['name'] tel = order.contact_info['telephone'] uid = order.contact_info['id_number'] # url = 'http://www.0000369.cn/buytks!tobuy.action' # pa = 'bliid=%s+&bliidSendDatetime=%s+%s&\ # portName=%s&arrivalPortID=%s&stationId=%s&\ # CanSellNum=%s&startNo=%s&portPrice=%s&\ # ticketDate=%s&\ # sendTime=++++++++++++++++++++++%s++++++++++++++++++++++' %(line.bus_num, \ # line.drv_date, line.drv_time, line.d_city_name, \ # line.d_sta_id, line.s_sta_id, line.left_tickets, \ # line.extra_info['startNo'], line.full_price, \ # line.drv_date, line.drv_time) # pa = ''.join(pa.split()) # pa = urllib.quote(pa.encode('utf-8'), safe='=&+') # r = requests.post(url, headers=headers, cookies=cookies, data=pa) # soup = bs(r.content, 'lxml') # info = soup.find('div', attrs={'class': 'buy'}) v = vcode_glcx(cookies) url = 'http://www.0000369.cn/buytks!toAffirm.action' pre = 'insuranceValue=2&' # rider = list(order.riders) pk = len(order.riders) # for x in rider: # if uid == x['id_number']: # rider.remove(x) tmp = '' for x in order.riders: tmp += 'name=%s&idcard=%s&tel=%s&tkstype=0&\ insurance=0&' % (x['name'], x['id_number'], tel) suf = 'rand=%s&bliid=%s+&sendTime=&stationId=%s&\ bliidSendDatetime=%s+%s&arrivalPortID=%s&\ customName=%s&customTelephone=%s&customIDCardNo=%s\ &customAddress=&ticketDate=%s&startNo=%s&CanSellNum=%s\ &ticketPrice=%s' % (v[0], line.bus_num, line.s_sta_id, line.drv_date, line.drv_time, line.d_sta_id, rebot.telephone, rebot.telephone, rebot.userid, line.drv_date, line.extra_info['startNo'], line.left_tickets, line.full_price) pa = pre + tmp + suf pa = ''.join(pa.split()) pa = urllib.quote(pa.encode('utf-8'), safe='=&+') r = requests.post(url, headers=headers, cookies=cookies, data=pa) soup = bs(r.content, 'lxml') try: sn = soup.find('input', attrs={'id': 'dealOrder'}).get('value', '') except: sn = '' if '确认支付' in soup.title and sn: expire_time = dte.now() + datetime.timedelta(seconds=15 * 60) # cookies = {} # for x, y in cks.items(): # cookies[x] = y order.modify( extra_info={ 'orderId': sn, 'ticketDate': line.drv_date, 'totalPirce': line.full_price * pk, 'stationId': line.s_sta_id, 'ticketNum': pk, 'telephone': rebot.telephone, 'userId': rebot.telephone, }) lock_result.update({ 'result_code': 1, 'raw_order_no': sn, "expire_datetime": expire_time, "source_account": rebot.telephone, 'pay_money': 0, }) return lock_result else: try: errmsg = soup.find('ul', attrs={ 'class': 'errorMessage' }).get_text().strip() except: errmsg = '' if '座号不足' in errmsg or '票价非法更改' in errmsg: self.close_line(order.line) lock_result.update({ 'result_code': 0, "result_reason": errmsg, }) return lock_result if errmsg: order_log.info("[lock-fail] order: %s %s", order.order_no, errmsg) lock_result.update({ 'result_code': 2, "result_reason": errmsg, }) return lock_result errmsg = soup.title.get_text() lock_result.update({ 'result_code': 2, "result_reason": errmsg, }) return lock_result
class Flow(BaseFlow): name = "szky" def do_lock_ticket(self, order): lock_result = { "lock_info": {}, "source_account": order.source_account, "result_code": -1, "result_reason": "blank", "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } rebot = order.get_lock_rebot() line = order.line is_login = rebot.check_login() if not is_login: for i in range(3): if rebot.login() == "OK": is_login = True break if not is_login: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": "账号未登录", }) return lock_result # 加入购物车 res = self.request_add_shopcart(order, rebot) ilst = re.findall(r"(\d+)\s张车票", str(res.get("msg", ""))) # 清理购物车 amount = ilst and int(ilst[0]) or 0 msg = res.get("msg", "") if (amount and amount != order.ticket_amount ) or u"单笔订单一次只允许购买3张车票" in msg or u"单笔订单只能购买一个车站的票" in msg: res = self.request_get_shoptcart(rebot) del_success = False for ids in res["data"][u"ShopTable"].keys(): d = self.request_del_shoptcart(rebot, ids) if d.get("success", False): del_success = True if not del_success: rebot.modify(cookies="{}") rebot = order.change_lock_rebot() lock_result.update({ "result_code": 2, "result_reason": u"购物车数量不对:%s, %s" % (msg, del_success), "source_account": rebot.telephone, }) return lock_result def _check_fail(msg): if u"当前系统维护中" in msg: return False lst = [ u"可售票数量不足", u"锁票超时超过10次", u"当前班次座位资源紧张", u"可能车站已调整票价", u"拒绝售票", u"提前时间不足", u"班次席位可售数不足", u"班次站点无可售席位", u"班次状态为停班", u"无可售席位资源", u"可售数不足", u"班次状态为保班", u"无可售席位", u"中心转发30003请求TKLock_3失败", u"班次状态为作废", u"不允许锁位", u"锁位失败", u"添加订单记录失败" ] for s in lst: if s in msg: return True return False if res["success"]: res = self.request_lock(order, rebot) if res["success"]: try: other = Order.objects.get(raw_order_no=res["raw_order_no"]) except Order.DoesNotExist: other = '' if other: rebot.modify(cookies="{}") rebot = order.change_lock_rebot() lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": '系统中存在已经存在订单号:%s' % res["raw_order_no"] }) return lock_result expire_time = dte.now() + datetime.timedelta(seconds=20 * 60) lock_result.update({ "result_code": 1, "result_reason": "", "pay_url": "", "raw_order_no": res["raw_order_no"], "expire_datetime": expire_time, "source_account": rebot.telephone, "pay_money": res["pay_money"], "lock_info": {}, }) elif u"同一IP一天最多可订" in res["msg"]: # res["msg"] = "ip: %s %s" % (rebot.proxy_ip, res["msg"]) # get_proxy("szky").set_black(rebot.proxy_ip) rebot.modify(ip="") lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": res["msg"] }) elif u"当前用户今天交易数已满" in res["msg"] or u"当前登录用户已被列为可疑用户" in res[ "msg"] or u"当前系统维护中" in res["msg"] or u'维护时间' in res["msg"]: rebot.modify(cookies="{}") rebot = order.change_lock_rebot() lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": res["msg"] }) elif u"例行维护" in res["msg"] or u"暂停网上购票业务" in res["msg"]: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": res["msg"] }) elif _check_fail(res["msg"]): self.close_line(line, reason=res["msg"]) lock_result.update({ "result_code": 0, "source_account": rebot.telephone, "result_reason": res["msg"], }) else: lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": res["msg"] }) elif u"您未登录或登录已过期" in res["msg"] or u"例行维护" in res[ "msg"] or u'现暂停网上购票业务' in res['msg']: rebot.modify(ip="") lock_result.update({ "result_code": 2, "source_account": rebot.telephone, "result_reason": res["msg"], }) else: lock_result.update({ "result_code": 0, "result_reason": "add_shopcart fail, %s" % res["msg"], "source_account": rebot.telephone, }) return lock_result def request_lock(self, order, rebot, sta_mode=1): headers = { "User-Agent": rebot.user_agent, } cookies = json.loads(rebot.cookies) base_url = "http://211.162.125.225/User/CommitGoods.aspx" r = rebot.http_get(base_url, headers=headers, cookies=cookies) content = r.content soup = BeautifulSoup(content, "lxml") headers.update({ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Referer": "http://211.162.125.225/User/CommitGoods.aspx", }) params = { "__EVENTTARGET": soup.select("#__EVENTTARGET")[0].get("value"), "__EVENTARGUMENT": soup.select("#__EVENTARGUMENT")[0].get("value"), "__VIEWSTATE": soup.select("#__VIEWSTATE")[0].get("value"), "__EVENTVALIDATION": soup.select("#__EVENTVALIDATION")[0].get("value"), "__VIEWSTATEGENERATOR": soup.select("#__VIEWSTATEGENERATOR")[0].get("value"), "ctl00$FartherMain$o_CustomerName": order.contact_info["name"], "ctl00$FartherMain$o_Mobele": order.contact_info["telephone"], "ctl00$FartherMain$o_IdType": 1, "ctl00$FartherMain$o_IdCard": order.contact_info["id_number"], "ctl00$FartherMain$radioListPayType": "OnlineUnionPay,银联在线支付", "ctl00$FartherMain$o_Email": '', "ctl00$FartherMain$ContactAddress": "", "ctl00$FartherMain$o_Memo": "", "ctl00$FartherMain$hideIsSubmit": "true", } r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies, timeout=90, allow_redirects=False) location_url = r.headers.get('location', '') cookies.update(dict(r.cookies)) msg = "" order_no = "" pay_money = "" flag = False if location_url and location_url == '/User/SendOI.aspx': pay_url = "http://211.162.125.225" + location_url r = rebot.http_get( pay_url, headers=headers, cookies=cookies, ) soup = BeautifulSoup(r.content, "lxml") try: order_no = soup.find("input", attrs={ "name": "orderNumber" }).get("value") pay_money = float( soup.find("input", attrs={ "name": "orderAmount" }).get("value")) / 100 flag = True except: order_no = "" pay_money = "" flag = False else: soup = BeautifulSoup(r.content, "lxml") msg_lst = re.findall(r'<script>alert\("(.+)"\);</script>', r.content) if msg_lst: msg = msg_lst[0] return { "success": flag, "msg": msg, "raw_order_no": order_no, "pay_order_no": '', "pay_money": pay_money, } def request_get_shoptcart(self, rebot): """ 获取购物车条目 """ base_url = "http://211.162.125.225/UserData/ShopCart.aspx" headers = { "User-Agent": rebot.user_agent, "Referer": "http://211.162.125.225/User/CommitGoods.aspx", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } cookies = json.loads(rebot.cookies) params = { "cmd": "getCartItemList", } r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies) def my_trans_js_str(s): for k in set(re.findall("([A-Za-z]+):", s)): if k in ('http', 'https', 'com', 'cn'): continue s = re.sub(r"\b%s\b" % k, '"%s"' % k, s) return s content = json.loads(my_trans_js_str(r.content)) return content def request_del_shoptcart(self, rebot, sid): """ 删除购物车 """ base_url = "http://211.162.125.225/UserData/ShopCart.aspx" headers = { "User-Agent": rebot.user_agent, "Referer": "http://211.162.125.225/User/CommitGoods.aspx", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } cookies = json.loads(rebot.cookies) params = { "cmd": "delCartItem", "id": sid, } r = rebot.http_post(base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies) return json.loads(trans_js_str(r.content)) def request_add_shopcart(self, order, rebot, sta_mode=1): """ 加入购物车 """ line = order.line base_url = "http://211.162.125.225/UserData/ShopCart.aspx" headers = { "User-Agent": rebot.user_agent, "Referer": "http://211.162.125.225/User/Default.aspx", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } cookies = json.loads(rebot.cookies) params = { "classInfo": json.dumps(line.extra_info["raw_info"], ensure_ascii=False), "drBusStationCode": line.s_sta_id, "drBusStationName": line.s_sta_name, "ticketFullCount": order.ticket_amount, "ticketType": "1", "cmd": "buyTicket", "IsAgreeBX": "false" } r = rebot.http_post( base_url, data=urllib.urlencode(params), headers=headers, cookies=cookies, ) try: res = json.loads(trans_js_str(r.content)) except Exception, e: rebot.modify(ip="") raise e order_log.info("[locking] order: %s add shopcart, %s", order.order_no, res.get("msg", "")) return res
def do_lock_ticket(self, order): lock_result = { "lock_info": {}, "source_account": '', "result_code": -1, "result_reason": "", "pay_url": "", "raw_order_no": "", "expire_datetime": "", "pay_money": 0, } rebot = order.get_lock_rebot() is_login = rebot.test_login_status() if not is_login: flag = False for i in range(3): if rebot.login() == "OK": flag = True break if not flag: lock_result.update(result_code=2, source_account=rebot.telephone, result_reason="账号未登陆") return lock_result try: rebot.recrawl_shiftid(order.line) except: lock_result.update(result_code=2, source_account=rebot.telephone, result_reason="源站刷新线路错误,锁票重试") return lock_result line = Line.objects.get(line_id=order.line.line_id) order.modify(line=line) lock_result.update(source_account=rebot.telephone) if order.line.shift_id == "0" or not order.line.extra_info.get('flag', 0): lock_result.update(result_reason="该条线路无法购买", result_code=0) return lock_result ttype, ttpwd = self.request_ticket_info(order, rebot) is_login = rebot.test_login_status() if not is_login: flag = False for i in range(3): if rebot.login() == "OK": flag = True break if not flag: lock_result.update(result_code=2, source_account=rebot.telephone, result_reason="账号未登陆") return lock_result lock_info = self.request_create_order(order, rebot, ttype, ttpwd) order_log.info("[lock-result] request_create_order . order: %s,account:%s,result:%s", order.order_no,rebot.telephone,lock_info) lock_flag, lock_msg = lock_info["flag"], lock_info.get("msg", "") if u"乘车人不能超过" in lock_msg: order.line.shift_id = "0" order.save() lock_result.update(result_code=0, result_reason=lock_msg) if lock_flag == '0': # 锁票成功 expire_datetime = dte.now()+datetime.timedelta(seconds=20*60) lock_result.update({ "result_code": 1, "lock_info": lock_info, "pay_url": "", "raw_order_no": '', "expire_datetime": expire_datetime, "pay_money": order.order_price, }) order.modify(lock_info=lock_info) try: ret = self.send_order_request(order, rebot) order.modify(raw_order_no=ret['order_id']) lock_result.update({"raw_order_no": ret['order_id']}) except: new_rebot = order.change_lock_rebot() lock_result.update(result_code=2, source_account=new_rebot.telephone, result_reason='锁票后未获取到订单号,重新锁票') elif lock_flag == '2': if u'同一出发日期限购6张' in lock_msg: new_rebot = order.change_lock_rebot() lock_result.update(result_code=2, source_account=new_rebot.telephone, result_reason="账号被限购,锁票重试") elif u'Could not return the resource to the pool' in lock_msg: lock_result.update(result_code=2, source_account="", result_reason="源站系统错误,锁票重试") else: for s in [u'班次信息错误',u'该条线路无法购买',u"余票不足",u"剩余座位数不足",u"获取座位信息失败",u"没有可售的座位"]: if s in lock_msg: self.close_line(line, reason=lock_msg) break lock_result.update(result_code=0, result_reason=lock_msg) elif lock_flag == '99' or u'班次信息错误' in lock_msg: lock_result.update(result_code=2, result_reason=lock_msg) elif lock_flag == '1': if u'请先支付或取消上一份订单' in lock_msg: new_rebot = order.change_lock_rebot() lock_result.update(result_code=2, source_account=new_rebot.telephone, result_reason=lock_msg) else: lock_result.update({ "result_code": 0, "lock_info": lock_info, "result_reason": lock_msg, }) return lock_result