[qt] Problem ze ściąganiem plików z getfile/downfiles


(Oski225) #1

Witam.

Ostatnio napisałem program(w qt), który ma za zadanie ściągać plik .zip z podanego serwera.

Program działa dobrze przy wszystkich serwerach oprócz getfile.pl/downfiles.eu(przynajmniej tylko w nich spotkałem się z błędem).

Podobny program jest w examplach qt, jednak tam również jest ten sam błąd.

Macie jakiś pomysł jak zmusić program do ściągania z w/w serwerów?

Załączam kody źródłowe(prosty program, nie męczyłem się z żadnym progressdialogiem)

Main.cpp

#include 

#include "mainwindow.h"


int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    MainWindow w;

    w.show();

    return a.exec();

}

MainWindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include 

#include 

#include 


namespace Ui

{

    class MainWindow;

}


class MainWindow : public QMainWindow

{

    Q_OBJECT


public:

    MainWindow(QWidget *parent = 0);

    ~MainWindow();


private:

    Ui::MainWindow *ui;


private slots:

    void on_zaloguj_clicked();

    void polacz();

    void slotAuthenticationRequired(const QString &, quint16, QAuthenticator *);

private:

    QHttp *http;

    QFile *file;

};


#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)

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

{

    ui->setupUi(this);

    http = new QHttp (this);

}


MainWindow::~MainWindow()

{

    delete ui;

}


void MainWindow::on_zaloguj_clicked()

{

    polacz();

    ui->status->setText("Ściąganie");

}


void MainWindow::polacz()

{

    file = new QFile ("plik.zip");

    if(!file -> open (QFile::WriteOnly))

    {

        QMessageBox::critical(this,"Błąd","Nie mozna utworzyc pliku");

        delete file;

        file = NULL;

        return;

    }

    QUrl url (ui->wpisz -> text ().toLower());

    if (!url.isValid())

    {

        QMessageBox::critical (this,"Błąd","Niepoprawny adres URL");

        return;

    }

    if (url.scheme() != "http")

    {

        QMessageBox::critical(this,"Błąd","Brak http://");

    }


    http -> setHost (url.host());

    http -> get (url.path(),file);

}


void MainWindow::slotAuthenticationRequired(const QString &hostName, quint16, QAuthenticator *authenticator)

{

        authenticator->setUser("mojanazwauzytkownika");

        authenticator->setPassword("mojehaslo");

}

([alex]) #2

Prawdopodobnie wskazany serwer sprawdza kilka rzeczy zanim zwróci treść pliku, jest kilka możliwości:

  1. [*:wqtpyq6n]Cookie

(Oski225) #3

Wiesz może jak zapisuje się cookie w qt?


([alex]) #4

curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"cookies.txt");


(Oski225) #5

Dzięki, jutro sprawdze jak działa.

PS: To na pewno jest do qt?


([alex]) #6

Heh, coś mi się pochrzaniło, przepraszam.

To był curl, z QT muszę sobie przypomnieć.

Zapisuje się to w QHttpRequestHeader, jako:

Cookie: x=abc&y=def

Podczas odpowiedzi serwer w nagłówku wysyła:

Set Cookie: x=abc&y=def

nazwy i wartości przykładowe


(Oski225) #7

Mógłbyś to jakoś rozwinąć?

Nie mogę jakoś tego ogarnąć.


([alex]) #8

Nagłówki

Protokól


(Oski225) #9

Znalazłem api getfile.pl(http://getfile.pl/article_9_API).

Czy taka funkcja jest poprawna i spełnia swoją role(logowanie)? Jak mógłbym to sprawdzić?

void MainWindow::polacz()

{

    QHttpRequestHeader header;

    http -> setHost ("http://getfile.pl/api.php");

    header.setRequest("GET","mode = login");

    header.setRequest("POST","login=mojlogin&password=mojehaslo");

    ui->status2->setText("Zalogowano");

}