0

我正在尝试创建一个可以登录网站的应用程序。具体网站是:

http://adfast.biz

这是我目前正在使用的代码:

void MainWindow::http_finish(QNetworkReply *reply)
{
    int code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    if (code >= 300 && code < 400)
    {   //HTTP 3XX codes are redirections
        QUrl redirectTo = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
        reply->manager()->get(QNetworkRequest(redirectTo));
        return;
    }
    if (reply->error() == QNetworkReply::NoError)
    {
        QString Msg = QString::fromUtf8(reply->readAll());
        if (cdone == 0)
        {//Runs only once, causing a reload of the main page
            ++cdone;
            QUrl URL("http://adfast.biz");
            QNetworkRequest QNR(URL);
            reply->manager()->get(QNR);
            QMessageBox::information(0,"1)" + QString::number(code),Msg);
            return;
        }
        QMessageBox::information(0,"2)" + QString::number(code),Msg);
    }
    else
    {
        QMessageBox::information(0,"Error:",reply->errorString());
    }
    reply->deleteLater();
}


void MainWindow::on_Send_clicked()
{
    QNetworkAccessManager* MNAM = new QNetworkAccessManager(this); //Stored within QNetworkReply->manager()
    connect(MNAM,SIGNAL(finished(QNetworkReply*)),this,SLOT(http_finish(QNetworkReply*)));
    QUrlQuery postData;
    postData.addQueryItem("email","mail@mail.net");
    postData.addQueryItem("senha","Password");
    postData.addQueryItem("logar","ok");
    QUrl URL(ui->TXT_Input->toPlainText());
    URL.setQuery(postData);
    QNetworkRequest QNR(URL);
    QNR.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
    MNAM->post(QNR,URL.toEncoded());
}

我猜我要么以错误的方式发送信息,要么我可能需要管理 cookie?两个响应都返回 HTTP 状态代码:200。第一个没有源,第二个带有完整的 Web 源,但没有登录。我很肯定发送的用户数据是正确的,但不是这样被正确发送。

编辑:

我改变了一点,没有运气。首先,我使用以下方法添加了一个 cookie-jar:

QNetworkAccessManager* MNAM = new QNetworkAccessManager(this); //Stored within QNetworkReply->manager()
QNetworkCookieJar* cJar = new QNetworkCookieJar;
MNAM->setCookieJar(cJar);
connect(MNAM,SIGNAL(finished(QNetworkReply*)),this,SLOT(http_finish(QNetworkReply*)));

然后,我使用 MainWindow::http_finish 顶部的以下代码测试是否接收到任何 cookie:

QList<QNetworkCookie> cookies = reply->manager()->cookieJar()->cookiesForUrl(QUrl("http://adfast.biz/"));
QMessageBox::information(0,"Cookies",QString::number(cookies.count()));

我想补充一下,帖子正在发送到:http ://adfast.biz/login (即:ui->TXT_Input->toPlainText()的值)但似乎我无法登录一点也不。而且我不确定我错过了什么。

4

4 回答 4

3

所以,我确实设法使用 testguest@yahoo.com 和 mypassword12 登录到这个站点。但是我只能提供非常快速和肮脏的代码,这解释了如何。您必须自己进行“抛光”。:-)

QFile f("/tmp/cookie.txt");
f.open(QIODevice::ReadOnly);
QDataStream s(&f);
while(!s.atEnd()){
    QByteArray c;
    s >> c;
    QList<QNetworkCookie> list = QNetworkCookie::parseCookies(c);
    qDebug() << "eee" << list;
    jar->insertCookie(list.at(0));
 }
    connect(MNAM,SIGNAL(finished(QNetworkReply*)),
    this,SLOT(http_finish(QNetworkReply*)));

QUrlQuery postData;
postData.addQueryItem("email","testguest@yahoo.com");
postData.addQueryItem("senha","mypassword12");
postData.addQueryItem("logar","ok");
//QUrl URL("http://adfast.biz/");
//QUrl URL("http://adfast.biz/anuncios_telexfree");
URL.setQuery(postData);
QNetworkRequest QNR(URL);
QNR.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
MNAM->get(QNR);

上面的代码读取cookie,这些cookie被写入下面的http_finish槽到/tmp/cookie.txt。

第一次运行此代码时,您必须取消注释第一个 URL,第二次,当您有您的 cookie 时,第二个 URL。忽略我把你的帖子变成了一个get。我这样做只是出于调试原因。

void MainWindow::http_finish(QNetworkReply *reply){
    qDebug() << reply->readAll();
    QList<QNetworkCookie> list =  
        MNAM->cookieJar()->cookiesForUrl(QUrl("http://adfast.biz/"));

    QFile f("/tmp/cookie.txt");
    f.open(QIODevice::ReadWrite);
    for(int i = 0; i < list.size(); ++i){
        QDataStream s(&f);
        s << list.at(i).toRawForm();
    }
    f.close();
}

上面的代码将来自http://adfast.biz/的 cookie 写入/tmp/cookie.txt。下面是我收到的 cookie 示例:

2-Sep-2013 16:41:39 GMT; domain=adfast.biz; path=/3 16:41:39 GMT; 
domain=adfast.biz; path=/n=adfast.biz; path=/

摘要:您必须连接到http://adfast.biz/才能获取您的 cookie。当你拥有它时,你必须再次连接,但这次连接到http://adfast.biz/anuncios_telexfree

于 2013-09-01T17:00:32.633 回答
0

您可能需要将QNetworkCookieJar添加到您的 QNetworkAccessManager 以在请求和响应之间保存和发送 cookie。您可以使用QNetworkAccessManager::setCookieJar(QNetworkCookieJar* cookieJar). 查看在 Firefox 中使用 HttpFox 发送的请求,您可以查看是否有任何 cookie 来回发送。

于 2013-08-28T12:45:20.620 回答
0

尝试连接:

connect(&MNAM,SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
        this,SLOT(provideAuthentication(QNetworkReply*,QAuthenticator*)));

并创建一个插槽:

void TrackerClient::provideAuthentication(QNetworkReply *reply, 
                                          QAuthenticator *auth){
    Q_UNUSED(reply);
    auth->setUser(<your username>);
    auth->setPassword(<your password>);
}
于 2013-08-31T11:55:22.383 回答
0

好的,第二次尝试。添加 cookiejar 的想法是正确的,但仅添加 jar 是不够的。我在另一个需要登录的站点上尝试了以下操作。我确实工作了。对于您的网站,我没有登录名和密码,而且由于它不是英文的,所以我很难获得快速帮助。:-)

登录过程如何在“我的”网站上运行。

  1. 您转到主 url,例如 www.mysite.something。
  2. 该网站要求您提供 cookie。你没有。
  3. 您被重定向(状态 302 临时移动)到页面 www.mysite.something/takelogin.php <--- 示例。
  4. 您输入您的凭据。您已经在 postdata.addQuery 调用中执行此操作。
  5. 你发你的帖子。如果您的信用没问题,该网站会向您发送一个 cookie。

到目前为止,一切都很好。你做错了什么?现在您有了 cookie,您必须再次访问 www.mysite.something。您不会自动登录并重定向到您网站的主页。请记住,QNetworkCookieJar 中的 cookie 不存储在磁盘上。它们只保存在内存中。所以,如果你的 jar/MNAM 被删除,一切都消失了。

toRawForm()您可以使用QNetworkCookie的方法轻松地将接收到的 cookie 存储到磁盘。要恢复 cookie,请使用静态QNetworkCooky::parseCookies(const QByteArray &cookieString)方法。

哦,差点忘了:主网址 www.mysite.something 没有发送任何 cookie。我必须遵循重定向 www.mysite.something/takelogin.php。

免责声明:它在我的网站上有效。我不知道,这是否适用于所有需要登录的网站。

检查了错误的信用:我被重定向到 adfast.biz/login。这似乎是您的重定向登录页面。没有真正的信用,我做不到更多。

于 2013-08-31T21:34:57.497 回答