Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++/Qt] Poruszanie się po stronach www

Ostatnio zmodyfikowano 2013-05-07 21:42
Autor Wiadomość
Unlimited
Temat założony przez niniejszego użytkownika
[C++/Qt] Poruszanie się po stronach www
» 2013-05-06 22:04:11
Witam. Doszedłem do momentu, w którym coraz trudniej jest coś dobrego w internecie znaleźć na swój problem. Kompletnie nie potrafię poradzić sobie z poruszaniem się po stronach www. Otóż umiem tylko wpisać dane do inputbox'ów na stronie i nic poza tym. Chciałbym się dowiedzieć jak np przycisnąć buttona? Jak np przejść do jakiegoś tematu i napisać tam posta? Jak wyświetlić temat/post w programie (jak go pobrać do zmiennej)?
Mój dotychczasowy kod: ( już od 2 dni stoję w miejscu, na próżno moje szukanie w google :/ )
C/C++
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QDebug>

namespace Ui {
    class Dialog;
}

class Dialog
    : public QDialog
{
    Q_OBJECT
   
public:
    explicit Dialog( QWidget * parent = 0 );
    ~Dialog();
   
private:
    Ui::Dialog * ui;
    QNetworkAccessManager * manager;
   
public slots:
    void test( QNetworkReply * );
};

#endif // DIALOG_H

C/C++
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog( QWidget * parent )
    : QDialog( parent )
    , ui( new Ui::Dialog )
{
    ui->setupUi( this );
   
    manager = new QNetworkAccessManager( this );
   
    connect( manager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( test( QNetworkReply * ) ) );
   
    QByteArray postData;
    QUrl paare;
    QNetworkRequest request;
    request.setUrl( QUrl( "http://127.0.0.1/ucp.php?mode=login" ) );
    request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant( "application/x-www-form-urlencoded" ) );
    paare.addQueryItem( "username", "myusername" );
    paare.addQueryItem( "password", "mypassword" );
    postData = paare.encodedQuery();
    manager->post( request, postData );
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::test( QNetworkReply * e )
{
    qDebug() << e->errorString();
}
P-82276
DejaVu
» 2013-05-06 22:37:54
Komunikacja ze stronami www sprowadza się do wysłania zapytania/odebrania odpowiedzi. Wysyłane zapytanie może zawierać dane dla formularza, a może być to po prostu żądanie pobrania strony. Ty jako program nie 'klikasz' linków, tylko wczytujesz np. href-a i znając swoją np. aktualną lokalizację, wiesz jaki adres strony należy otworzyć. Dodam jeszcze, że jeżeli strona używa intensywnie Javascripta, to nie odczytasz z niej treści, którą wygeneruje Javascript (np. nie pokoloruje Ci kodu źródłowego, jeżeli do tego jest używany Javascript).
P-82285
Unlimited
Temat założony przez niniejszego użytkownika
» 2013-05-06 22:44:36
Ok rozumiem Cię ale mi np z tym kliknięciem buttona chodziło o to żeby każdy wiedział o co chodzi. Zdaje sobie sprawę, że z poziomu programu nie będzie możliwości kliknięcia w odnośnik tylko trzeba je "jakoś" wywołać zapytaniem. Tylko jak?
P-82287
DejaVu
» 2013-05-07 00:03:18
Tak samo jak wysyłasz formularz z zalogowaniem się na stronę :P
P-82296
Unlimited
Temat założony przez niniejszego użytkownika
» 2013-05-07 00:58:19
No właśnie nie tak samo bo dla formularza jest funkcja addQueryItem() która przyjmuje 2 argumenty: nazwe pola i wartość. Dla "przyciśnięcia" buttona to nie zda egzaminu, a innej funkcji się nie doszukałem. Jakbym wiedział jak to zrobić to bym nie zakładał tematu ;p

No dobra już z zniechęcenia stworzyłem trzeci addQueryItem() z parametrami "login", "Zaloguj" i o dziwo zalogowało się :D Nie wierzę no ale jednak działa.

Ale np już napisanie postu nie działa choć wszystko robię tak samo jak przy logowaniu... :/
P-82304
DejaVu
» 2013-05-07 01:55:31
Skoro nie działa dodawanie postów to znaczy, że czegoś nie wypełniasz lub nie wysyłasz ciasteczek. Poczytaj o tym jak działają przeglądarki albo popatrz za pomocą jakiegoś pluginu jakie nagłówki są wysyłane do stron.
P-82307
Unlimited
Temat założony przez niniejszego użytkownika
» 2013-05-07 20:05:53
No niestety wysyłam cookie ale nadal nie ma efektu :/
SID jak i użytkownik w cookie się nie zgadza podczas wysyłania postu choć cookie wysyłam :/

C/C++
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog( QWidget * parent )
    : QDialog( parent )
    , ui( new Ui::Dialog )
{
    ui->setupUi( this );
   
    manager = new QNetworkAccessManager( this );
    connect( manager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( mySlot( QNetworkReply * ) ) );
   
    //login on www
    QByteArray postData;
    QUrl paare;
    request.setUrl( QUrl( "http://127.0.0.1/ucp.php?mode=login" ) );
    request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant( "application/x-www-form-urlencoded" ) );
    paare.addQueryItem( "username", "user" );
    paare.addQueryItem( "password", "password" );
    paare.addQueryItem( "login", "" );
    postData = paare.encodedQuery();
    manager->post( request, postData );
    //end of login on www - effect: OK
   
    //send post on www
    paare.clear();
    postData.clear();
    request.setUrl( QUrl( "http://127.0.0.1/posting.php?mode=reply&f=2&t=1" ) );
    request.setHeader( QNetworkRequest::CookieHeader, var ); //tutaj wysyłam cookie do headeru
    paare.addQueryItem( "message", "my message ..." );
    paare.addQueryItem( "post", "" );
    postData = paare.encodedQuery();
    manager->post( request, postData );
    //end of send post on www - effect: fail
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::mySlot( QNetworkReply * e )
{
    if( e->error() == QNetworkReply::NoError )
    {
        cookie = manager->cookieJar()->cookiesForUrl( request.url() );
        var.setValue( cookie );
        qDebug() << "cookies " << request.url().host() << cookie;
    }
    else
    {
        qDebug() << "ERROR! " << e->errorString();
    }
}

Wynik debbugera:
Uruchamianie C:\Users\Unlimited\Desktop\logowanie-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\debug\logowanie.exe...

cookies  "127.0.0.1" (QNetworkCookie("phpbb3_2s5kq_u=1; HttpOnly; expires=Wed, 07-May-2014 17:59:28 GMT; domain=127.0.0.1; path=/") ,  QNetworkCookie("phpbb3_2s5kq_k=; HttpOnly; expires=Wed, 07-May-2014 17:59:28 GMT; domain=127.0.0.1; path=/") ,  QNetworkCookie("phpbb3_2s5kq_sid=1d20903571857eb86336beca4e7d199e; HttpOnly; expires=Wed, 07-May-2014 17:59:28 GMT; domain=127.0.0.1; path=/") ) 

cookies  "127.0.0.1" (QNetworkCookie("phpbb3_2s5kq_u=54; HttpOnly; expires=Wed, 07-May-2014 17:59:28 GMT; domain=127.0.0.1; path=/") ,  QNetworkCookie("phpbb3_2s5kq_k=; HttpOnly; expires=Wed, 07-May-2014 17:59:28 GMT; domain=127.0.0.1; path=/") ,  QNetworkCookie("phpbb3_2s5kq_sid=dde481c891fa177f8bd4b4920a950773; HttpOnly; expires=Wed, 07-May-2014 17:59:28 GMT; domain=127.0.0.1; path=/") )
 
C:\Users\Unlimited\Desktop\logowanie-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\debug\logowanie.exe zakończone kodem 0

Przydała by się pomoc kogoś bardziej zaawansowanego w te klocki.
P-82382
DejaVu
» 2013-05-07 21:42:40
Niestety w Qt się nie bawiłem z ciasteczkami, no ale z dużym prawdopodobieństwem problem leży w plikach cookie :)
P-82396
« 1 »
  Strona 1 z 1