zoukankan      html  css  js  c++  java
  • 在http编程的门口飞牛网自动下单,查单

      刚进这个公司,以前没接触过http编程,所以这两天做了个小例子来熟悉http编程,有点晕。。。。。

      不过还是做出来了,虽然有点粗糙,总结一下这个小软件:

      主要使用QNetworkAccessManager, QNetworkRequest, QNetworkReply来实现网络交互:

      get:

    QString orderAddress = QString("http://www.feiniu.com/item/%1").arg(orderID);
    
        QNetworkRequest request;
        request.setUrl(QUrl(orderAddress));
        request.setRawHeader(PCMEGNAME, "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");
        request.setRawHeader(CONNECTNAME, CONNECTVALUE);
    
        QNetworkReply *pReply = m_pOrderNetLogin->m_pManager->get(request);
    
        //改异步为同步处理
        QEventLoop loop;
        connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
        loop.exec();
    
        //获取响应的信息,状态码为200表示正常
        QVariant status_code = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    
        //无错误返回
        if(pReply->error() == QNetworkReply::NoError)
        {
            //下订单
            placeCurrentOrder(orderID);
        }
        //释放
        delete pReply;

      post:

    QString data = QString("user=%1&pass=%2&captcha=&chkRememberMe=false&referer=%3&CSRF_TOKEN=%4&deviceId=")
            .arg(account).arg(password).arg(m_pOrderNetLogin->m_referer).arg(m_pOrderNetLogin->m_csrfToken);
    
        /************设置HTTP头*****************/
        QNetworkRequest request;
        request.setUrl(QUrl(clogin));
        request.setRawHeader(PCMEGNAME, PCMEGVALUE);
        request.setRawHeader(CONNECTNAME, CONNECTVALUE);
        request.setRawHeader("Content-Length", QString::number(data.size()).toLatin1());
        request.setRawHeader("Referer", "https://passport.feiniu.com/gateway/login");
        request.setRawHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    
        QNetworkReply *pReply = m_pOrderNetLogin->m_pManager->post(request, data.toLatin1());
    
        //改异步为同步处理
        QEventLoop loop;
        connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
        loop.exec();
    
        //获取响应的信息,状态码为200表示正常
        QVariant status_code = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    
        //无错误返回
        if(pReply->error() == QNetworkReply::NoError)
        {
            //我的订单
            QByteArray bytes = pReply->readAll();  
            QString result(bytes);  //转化为字符串
            if (result.indexOf("200") != -1)
            {
                //切换城市
                this->changeStation();
                //登录成功,跳转到主页
                this->jumpToHome("https://member.feiniu.com/home/index");
            }
        }
    
        delete pReply;//删除

      由于第一次接触这方面,不知道流程对不对,先记下来,以后再看看:

        1、首先进入飞牛网的登录界面,获取referer、csrfToken两个参数,以便后面登录使用.

        2、导入账号和密码,然后登录飞牛网,登录之后跳转到我的账户页面(看网页登录就是这样跳的,后面试试不跳至我的账户,直接查找商品).

        3、根据导入的商品ID跳转至其商品页面,然后根据其信息(比如数量,衣服码)来组装信息,然后加入到购物车,很多商品就全加进去后再做其他.

        4、跳转至购物车,不确定购物车里除了我加的商品外还有其他的商品,所以先全部取消选择,然后选择我加入的商品,在这里需要获取商品订单号和金额。

        5、提交订单,首先要确定送货地址,在网站有个站点,如果和送货地址不在同一个省,提交会失败,但是网站的站点切换始终没找到怎么做,但发现是在Cookie里面体现的,所以直接修改的Cookie,Cookie只会对指定域名进行发送;

          修改Cookie(默认四川成都高新区):

    QNetworkCookieJar *cookieJar  = m_pOrderNetLogin->m_pManager->cookieJar();
    
        QNetworkCookie dist("C_dist", "CPG5_CS000005");
        dist.setDomain(".feiniu.com");
        dist.setPath("/");
    
        QNetworkCookie area("C_dist_area", "CS000005_510100_510199");
        area.setDomain(".feiniu.com");
        area.setPath("/");
    
        QList<QNetworkCookie> temp = cookieJar->cookiesForUrl(QUrl("http://www.feiniu.com/"));
        temp.append(dist);
        temp.append(area);
    
        cookieJar->setCookiesFromUrl(temp,  QUrl("http://www.feiniu.com/"));
    
        m_pOrderNetLogin->m_pManager->setCookieJar(cookieJar);

        6、确认导入的送货地址是否满足要求,和网站的省,市,区有没有区别,有区别则用户自己选择,无区别就会自己提交订单,其实还有发票什么的,没做了。。。。

    问题: 1、觉得最坑的就是一直记不住QString的中文乱码解决方法,这次是vs2008 + Qt 4.8.6, win7,解决方法:

          在main.cpp中添加:QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

          并且在程序中使用到中文的地方:QString::fromLocal8Bit("订单号");

        2、http协议一点都不熟悉,一些头根本不知道什么意思,就瞎跟着写。。。。虽然没有报错。。。

        3、GMT时间,网站上是“1461658278819”这么长,但是自己转换出来少了三位,不知道为啥。

        4、数据解析,解析服务器返回的数据后,解析自己关心的数据有点不熟悉,解析算法还有待提高。

        5、当服务器返回200后,有些地方没有继续解析他返回的数据,比如提示“送货地址与所在省不同,请重试”这些信息就没法得到,所以有些时候都是直接就不管。。。(流氓啊!)

        6、做的时候没有想好怎么做,弄得封装性不这么好,后面再花时间重新整理哈。

  • 相关阅读:
    C# WinForm 关于窗体最大化时的是否全屏效果与是否遮盖任务栏
    C# winform 无边框 窗体的拖动
    lenovo 联想笔记本ideapad 320c-15改装win7问题
    解决WIN7第一次开机冷启动QQ未响应的办法
    WIN10X64_LTSB2016极限精简版by双心
    RAMOS和SSD对比
    联想IDEAPAD 320C-15笔记本显卡驱动问题
    WIN7以上系统安装VB6的解决办法,附上个批处理。
    吐槽下银联1分钱乘公交
    QQ聊天框变成方框口口口口的解决办法
  • 原文地址:https://www.cnblogs.com/qnkk123/p/5443621.html
Copyright © 2011-2022 走看看