[qt] Jak zalogować się na forum


(Oski225) #1

Witam,

coś nie mogę sobie poradzić z logowaniem się na forum(albo na inną stronę) w bilbiotece qt. Nie mam żadnego pomysłu.

Mógłby mi ktoś pomóc?


(Qrs) #2

bez kodu nikt Ci nie pomoze, pokaz jak probujesz sie polaczyc?


(Oski225) #3

Miałem kilka wersji, pokażę jedną z nich:

#include "mainwindow.h"

#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent), ui(new Ui::MainWindow)

{

    ui->setupUi(this);

}


MainWindow::~MainWindow()

{

    delete ui;

}


void MainWindow::on_log_clicked()

{

  QNetworkAccessManager *manager = new QNetworkAccessManager(this);

 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));


 QNetworkRequest request;

 request.setUrl(QUrl("http://forum.dobreprogramy.pl/ucp.php"));

 request.setRawHeader("login", "username=mojlogin&password=mojehaslo");

 manager->get(request);

}


void MainWindow::replyFinished(QNetworkReply* reply)

{

    QString string;

    string = reply->readAll();

    ui->textEdit->setText(string);

    ui->plainTextEdit->insertPlainText(string);

}

inna wersja

#include "mainwindow.h"

#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent), ui(new Ui::MainWindow)

{

    ui->setupUi(this);

}


MainWindow::~MainWindow()

{

    delete ui;

}


void MainWindow::on_log_clicked()

{

  QNetworkAccessManager *manager = new QNetworkAccessManager(this);

 connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));


 QNetworkRequest request;

 QNetworkRequest request2;

 request.setUrl(QUrl("http://forum.dobreprogramy.pl/ucp.php"));

 request.setRawHeader("mode=login", "mode=login");

 manager->get(request);

 request2.setUrl(QUrl("http://forum.dobreprogramy.pl/ucp.php"));

 request2.setRawHeader("login","login=mojlogin&password=mojehaslo");

 manager->post(request2, QByteArray());

}


void MainWindow::replyFinished(QNetworkReply* reply)

{

    QString string;

    string = reply->readAll();

    ui->textEdit->setText(string);

    ui->plainTextEdit->insertPlainText(string);

}

(Qrs) #4

tyle że podczas logowania musisz mieć jeszcze klucz sesji dla


(Oski225) #5

Nawet wysyłając klucz sesji logowanie nie przebiega poprawnie.

Czy wykorzystałem dobre funkcje biblioteki qt? Generalnie dobrze kombinuje?


(Qrs) #6

a jak sprawdzasz jaki klucz sesji się wygenerował?


(Oski225) #7

Przez źródło strony.


(Qrs) #8

nie widzę nigdzie w kodzie abyś sprawdzał SID

rozumiem ze wchodzisz na stronę, sprawdzasz źródło i podajesz na sztywno? :wink:

sesja jest tworzona za każdym razem kiedy wykonujesz request ucp.php jeśli nie ma statusu jako 'zalogowany'.

sprawdź

QString ident_str = tr("ref=http://forum.dobreprogramy.pl/ucp.php?mode=login&SID=%1")

.arg(SID);

(Oski225) #9

Heh, jeszcze jutro popróbuje.

Wiesz może, czy dobrze robię(czy w ogóle to będzie działać) korzystając z QNetworkAccessManager i tym podobnych?

PS: SID'a brałem z kodu źródłowego strony na bieżąco(nie jest to pokazane w moim kodzie na tej stronie).

Ale wydaje mi się, że robie to całkowicie złą funkcją.


(Qrs) #10

masz tu pewien przykład:

#include "damnsession.h"


#include 

#include 

#include 

#include 

#include 

#include 


dAmnSession::dAmnSession()

{

    user_agent = tr("mnlib/").append(MNLIB_VERSION);

    auth_token.reserve(32);

}


void dAmnSession::authenticate(const QString& username, const QString& password, bool reusetoken)

{

    typedef QByteArray qba;


    QNetworkAccessManager* http = new QNetworkAccessManager(this);


    connect(http, SIGNAL(finished(QNetworkReply*)),

            this, SLOT(gotAuthToken(QNetworkReply*)));

    connect(http, SIGNAL(sslErrors(QNetworkReply*,QList)),

            this, SLOT(handleSslErrors(QNetworkReply*,QList)));


    QString ident_str = tr("ref=https://www.deviantart.com/users/login&username=%1&password=%2&reusetoken=%3")

                .arg(username, password, QString().setNum(reusetoken));


    QNetworkCookie cookie (qba("skipintro"), qba("1"));

    QList cookies;

    cookies.push_back(cookie);


    QNetworkRequest request (QUrl("https://www.deviantart.com/users/login"));

    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/x-www-form-urlencoded"));

    request.setHeader(QNetworkRequest::ContentLengthHeader, ident_str.size());

    request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies));

    request.setRawHeader(qba("User-Agent"), this->user_agent.toAscii());

    request.setRawHeader(qba("Accept"), qba("text/html"));


    QNetworkReply* response;

    response = http->post(request, ident_str.toAscii());

}


void dAmnSession::handleSslErrors(QNetworkReply* reply, QList errors)

{ // STUB

    reply->ignoreSslErrors();

}


void dAmnSession::gotAuthToken(QNetworkReply* reply)

{

    QNetworkAccessManager* http = reply->manager();


    // The expected form of the cookie is a serialized PHP array, URL-encoded, that contains an item with

    // the key "authtoken" and a value that has 32 characters.


    QString cookiestr;

    QList cookies = http->cookieJar()->cookiesForUrl(QUrl("https://www.deviantart.com/users/login"));

    foreach(QNetworkCookie cookie, cookies)

    {

        if(cookie.name() == "userinfo")

        { // URL-decode the recieved cookie.

            cookiestr = QUrl::fromPercentEncoding(cookie.value());

        }

    }


    int found;

    if(!cookiestr.isEmpty())

    { // HACK: This may break if the cookie changes more than we expect it to.

        // The ideal solution would be a decent parser, but is tedious to implement.

        this->auth_token = cookiestr.mid((found = cookiestr.indexOf("authtoken\";s:32:")) + 17, 32).toAscii();

    }

    else

    { // Got no cookie with the name "userinfo".

        // TODO: Handle error

    }


    if(!found)

    { // Cookie contains no authtoken?

        // TODO: Handle error

    }


    delete http, reply;

}

(Oski225) #11

Dzięki wielkie za odpowiedź. Dzięki temu dostaje przynajmniej jakąś odpowiedź serwera :wink:

Na stronie http://getfile.pl/article_9_API jest opisane api, i chcialem zobaczyć czy uda mi się tam zalogować.

Oto kod:

QHttpRequestHeader header("POST", "/api.php");

    header.setValue("Host", "www.getfile.pl");

    header.setValue("Get","mode=login");

    header.setValue("Post", "login=login&password=haslo");

    header.setContentType("application/x-www-form-urlencoded");

    m_http->setHost("www.getfile.pl");

    m_http->request(header);

I dostaje taką odpowiedź serwera:

HTTP/1.1 302 Found

Date: Sat, 08 Aug 2009 18:14:15 GMT

Server: Apache/2.2.9 (Fedora)

X-Powered-By: PHP/5.2.6

Set-Cookie: PHPSESSID=82i72v1lvs7fdhfvfkq8qti7m5; path=/

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Set-Cookie: PHPSESSID=82i72v1lvs7fdhfvfkq8qti7m5; expires=Sat, 08-Aug-2009 18:44:15 GMT; path=/; domain=getfile.pl

Set-Cookie: PHPSESSID=82i72v1lvs7fdhfvfkq8qti7m5; expires=Sat, 08-Aug-2009 18:44:15 GMT; path=/; domain=ssl.getfile.pl

Connection: close

location: http://getfile.pl/

Content-Length: 0

Content-Type: text/html; charset=UTF-8

Czyli inaczej niż jest napisane w api(nie ma w ogóle wiadomości czy logowanie się udało czy nie).

Jest ktoś w stanie mi pomóc?

Będę bardzo wdzięczny.