在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、做的时候没有想好怎么做,弄得封装性不这么好,后面再花时间重新整理哈。

转载于:https://www.cnblogs.com/qnkk123/p/5443621.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值