コード例 #1
0
ファイル: bus100.py プロジェクト: matengfei000/busweb
 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
コード例 #2
0
ファイル: views.py プロジェクト: matengfei000/busweb
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"
コード例 #3
0
 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
コード例 #4
0
ファイル: bjky.py プロジェクト: matengfei000/busweb
 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
コード例 #5
0
ファイル: nmghy.py プロジェクト: matengfei000/busweb
    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
コード例 #6
0
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))
コード例 #7
0
ファイル: kuaiba.py プロジェクト: matengfei000/busweb
    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)
コード例 #8
0
ファイル: e8s.py プロジェクト: cash2one/busweb
 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)
コード例 #9
0
ファイル: e8s.py プロジェクト: cash2one/busweb
 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)
コード例 #10
0
    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'],
            })
コード例 #11
0
    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
コード例 #12
0
ファイル: e8s.py プロジェクト: cash2one/busweb
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
コード例 #13
0
    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
コード例 #14
0
ファイル: e8s.py プロジェクト: cash2one/busweb
        }
        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 = {
            "失败订单": "失败订单",
            "已购票": "购票成功",
コード例 #15
0
    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)
コード例 #16
0
    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)
コード例 #17
0
ファイル: kuaiba.py プロジェクト: matengfei000/busweb
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
コード例 #18
0
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)
コード例 #19
0
    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,
        }
コード例 #20
0
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)
コード例 #21
0
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
コード例 #22
0
ファイル: bus100.py プロジェクト: matengfei000/busweb
    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
コード例 #23
0
    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
コード例 #24
0
ファイル: szky.py プロジェクト: matengfei000/busweb
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
コード例 #25
0
    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