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?
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?
bez kodu nikt Ci nie pomoze, pokaz jak probujesz sie polaczyc?
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);
}
tyle że podczas logowania musisz mieć jeszcze klucz sesji dla
Nawet wysyłając klucz sesji logowanie nie przebiega poprawnie.
Czy wykorzystałem dobre funkcje biblioteki qt? Generalnie dobrze kombinuje?
a jak sprawdzasz jaki klucz sesji się wygenerował?
Przez źródło strony.
nie widzę nigdzie w kodzie abyś sprawdzał SID
rozumiem ze wchodzisz na stronę, sprawdzasz źródło i podajesz na sztywno?
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);
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ą.
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;
}
Dzięki wielkie za odpowiedź. Dzięki temu dostaje przynajmniej jakąś odpowiedź serwera
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.