0

Web サイトにログインできるアプリケーションを作成しようとしています。具体的なウェブサイトは次のとおりです。

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 で返されます。最初の応答にはソースがなく、2 番目の応答には完全な 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);

上記のコードは、下の http_finish スロットに書き込まれた Cookie を /tmp/cookie.txt に読み取ります。

このコードを初めて実行するときは、最初の URL のコメントを解除する必要があります。2 回目は、Cookie があるときに 2 番目の 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 に書き込みます。私が受け取ったクッキーの例を以下に示します。

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

概要: Cookie を取得するには、 http://adfast.biz/に接続する必要があります。取得したら、再度接続する必要がありますが、今度はhttp://adfast.biz/anuncios_telexfreeに接続します。

于 2013-09-01T17:00:32.633 に答える
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

わかりました、2 回目の試行。cookiejar を追加するという考えは正しいですが、jar を追加するだけでは十分ではありません。ログインが必要な別のサイトで次のことを試しました。私は仕事をしました。あなたのサイトにはログインとパスワードがありません。英語ではないため、簡単なヘルプを得るには少し難しすぎます。:-)

「my」サイトへのログイン手順

  1. www.mysite.something などのメイン URL に移動します。
  2. サイトが Cookie を要求します。あなたには何もありません。
  3. ページ www.mysite.something/takelogin.php にリダイレクトされます (ステータス 302 一時的に移動されます) <--- 例。
  4. 資格情報を入力します。これはすでに postdata.addQuery 呼び出しで行っています。
  5. あなたは投稿を送信します。信用情報に問題がなければ、サイトから Cookie が送信されます。

ここまでは順調ですね。何を間違えたのですか?Cookie を取得したら、再びwww.mysite.something にアクセスする必要があります。自動的にログインしてサイトのメイン ページにリダイレクトされることはありません。また、QNetworkCookieJar の Cookie はディスクに保存されないことに注意してください。それらはメモリにのみ保持されます。したがって、jar/MNAM が削除されると、すべてがなくなります。

toRawForm()QNetworkCookieのメソッドを使用して、受信した Cookie をディスクに簡単に保存できます。Cookie を復元するには、静的QNetworkCooky::parseCookies(const QByteArray &cookieString)メソッドを使用します。

ああ、ほとんど忘れていました: メイン URL www.mysite.something は Cookie を送信しませんでした。リダイレクト www.mysite.something/takelogin.php に従わなければなりませんでした。

免責事項:私のサイトでは機能しました。ログインが必要なすべてのサイトでこれが一般的かどうかはわかりません。

間違ったクレデンシャルで確認しました: adfast.biz/login にリダイレクトされました。これがリダイレクト ログイン ページのようです。もっと私は本当の信用なしではできません。

于 2013-08-31T21:34:57.497 に答える
0

リクエストとレスポンスの間で Cookie を保持および送信するために、 QNetworkCookieJarを QNetworkAccessManagerに追加する必要がある場合があります。を使用して、Cookie jar を設定できますQNetworkAccessManager::setCookieJar(QNetworkCookieJar* cookieJar)。Firefox で HttpFox を使用して送信されているリクエストを確認すると、Cookie が送受信されているかどうかを確認できます。

于 2013-08-28T12:45:20.620 に答える