2017-02-13 113 views
2

我使用Qt 5.5.1并使用QWebview制作小型浏览器我想在
时打开一个网页并按下一个按钮,它将获取网站就像我用GET方法QnetworkAccessManager不使用它,因为我想从网站上有一个登录页面的数据,所以当我登录并没有POST方法PHP获取数据的URL不会改变。
例如当我登录到www.login.com登录显示在同一链接上的数据
我需要任何想法我可以解决这个问题,或者如果我可以从QWebview
打开网站获取当前数据 注意
当我登录到网站,并获取数据从它通过压上查看源代码在Firefox登录数据出现在源代码
这是我试过
从QWebView使用Qt 5.5.1获取网站的内容

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) { 
     ui->setupUi(this); 
     ui->webView->load(QUrl("https://www.login.com")); // load page that have user name and password field 
     QWebPage *page = ui->webView->page(); // get the current page 
     manager = page->networkAccessManager(); // get the access manager from this page 
    } 

    MainWindow::~MainWindow() { 
     delete ui; 
    } 
    // get button 
    void MainWindow::on_pushButton_clicked() { 
     reply = manager->get(QNetworkRequest(QUrl("https://www.login.com"))); // make get now after login 
     connect(reply, SIGNAL(readyRead()),this,SLOT(readyRead())); 
     connect(reply, SIGNAL(finished()),this, SLOT(finish())); 
    } 

    void MainWindow::readyRead() { 
     QString str = QString::fromUtf8(reply->readAll()).trimmed(); // read the data 
     ui->plainTextEdit->appendPlainText(str); 
    } 

但我得到第一个pag的数据没有登录。我想在登录后获取页面内容,请告诉我应该做什么。
更新
我认为从Firefox在网页源代码中获取文本输入名称,并使用QUrlQuery由结果作出后,以它的第一页没有登录本的HTML代码的一部分,我得到了它的名字

<label class="label-off" for="dwfrm_ordersignup_orderNo">Numéro de la commande</label> <input class="textinput required" id="anyname" type="text" name="UserName" value="" maxlength="2147483647" placeholder="* UserName" data-missing-error="Saisis ton numéro de commande. " data-parse-error="Ce contenu est invalide" data-range-error="Ce contenu est trop long ou trop court" required="required" /> 

它与其他字段的代码相同。
代码我在Qt的使用,使后

manager = new QNetworkAccessManager(this); 
QUrlQuery query; 
query.addQueryItem("UserName", "AAAA"); 
query.addQueryItem("Password", "BBB"); 
reply = manager->post(QNetworkRequest(QUrl(ui->lineEdit->text().trimmed())), query.toString().toUtf8()); 
connect(reply,&QNetworkReply::downloadProgress,this,&MainWindow::progress); 
connect(reply,SIGNAL(readyRead()),this,SLOT(readyRead())); 
connect(reply, SIGNAL(finished()), this,SLOT(finish())); 

我尝试后代码PHP页面我做和在这里工作的问题,这只是HTML页面

+1

你可能要发个帖子方法到服务器,你需要分析的登录页面,看到的文本输入的名称和它当作一键'QUrlQuery',并通过这些相应的值(通常是名和密码)。有关如何使用Qt完成post方法的示例已发布[此处](http://stackoverflow.com/a/7445752/2014561)。 –

+0

我更新什么我都试过,请看一看这个 –

+1

请参阅我的回答这个问题。 –

回答

1

我会用不同的方法,来替代模拟POST请求,我将加载登录页面通常与QWebView和使用Qt来填充用户名,密码以及做提交按钮假的点击。

关于如何保存后登录页面怎么你所看到的,而不是HTML代码,Qt提供的一个好方法是渲染网页视图为PDF,与失去的HTML代码的缺点。

如果只有代码的话,你可以使用webview->page()->mainFrame()->toHtml()

看到一个简单的例子,请注意,您需要将代码适应你的环境,分析了登录页面等

void MainWindow::start() 
{ 
    connect(webview, &QWebView::loadFinished, this, &MainWindow::LogIn); 

    QString html = "<html>" 
        "<body>" 
        "<form action=\"https://httpbin.org/post\" method=\"POST\">" 
        "Username:<br>" 
        "<input type=\"text\" name=\"usernameinput\" value=\"abc\">" 
        "<br>" 
        "Password:<br>" 
        "<input type=\"password\" name=\"passwordinput\" value=\"123\">" 
        "<br><br>" 
        "<button name=\"button1\">Submit</button>" 
        "</form>" 
        "</body>" 
        "</html>"; 

    webview->setHtml(html); //Load yours https://www.login.com, using setHtml just for example 
} 

void MainWindow::LogIn(bool ok) 
{ 
    disconnect(webview, &QWebView::loadFinished, this, &MainWindow::LogIn); //Disconnect the SIGNAL 

    if (!ok) 
     return; 

    QWebElement document = webview->page()->mainFrame()->documentElement(); 

    QWebElement username = document.findFirst("input[name=usernameinput]"); //Find the first input with name=usernameinput 

    if (username.isNull()) 
     return; 

    username.setAttribute("value", "def"); //Change the value of the usernameinput input even 
              //if it already has some value 

    QWebElement password = document.findFirst("input[name=passwordinput]"); //Do the same for password 

    if (password.isNull()) 
     return; 

    password.setAttribute("value", "123456"); //Do the same for password 

    QWebElement button = document.findFirst("button[name=button1]"); //Find the button with name "button1" 

    if (button.isNull()) 
     return; 

    connect(webview, &QWebView::loadFinished, this, &MainWindow::finished); 

    button.evaluateJavaScript("this.click()"); //Do a fake click on the submit button 
} 

void MainWindow::finished(bool ok) 
{ 
    disconnect(webview, &QWebView::loadFinished, this, &MainWindow::finished); 

    if (!ok) 
     return; 

    QByteArray data; 
    QBuffer buffer(&data); 

    if (!buffer.open(QIODevice::WriteOnly)) 
     return; 

    QPdfWriter pdfwriter(&buffer); 

    pdfwriter.setResolution(100); //In DPI 

    webview->page()->setViewportSize(QSize(pdfwriter.width(), pdfwriter.height())); 

    QPainter painter; 
    painter.begin(&pdfwriter); 
    webview->page()->mainFrame()->render(&painter); 
    painter.end(); 

    buffer.close(); 

    qDebug() << "PDF Size:" << data.size(); //Now you have a PDF in memory stored on "data" 
} 
+0

非常感谢您的回复,你的努力,我很欣赏这一点,我试试这个代码,但它由包含写在它的领域的用户名和密码,没有点击按钮按下的登录页面的PDF文件!我检查了源代码,我发现提交按钮的类型不是,但

+0

现在有没有办法让代码中的按钮点击?也许是因为提交的类型不是而是

+0

是的,它取决于对象,它是否具有type = submit,或者是一个按钮,一个超链接等。您需要在页面上找到该对象的唯一标识符并将其传递给'findFirst'。 我编辑了我的答案来显示一个例子,其中按钮的名称= button1。 –