2012-05-03 5 views
1

QWebPage를 사용하여 일부 웹 페이지를 긁는 응용 프로그램을 작성하고 있습니다. 응답이 Http 리디렉션 인 경우 (예 : 302, 303 등) 몇 가지 문제가 있습니다. QWebPage는 단순히 리디렉션을 따르지 않습니다.처음로드 후 QWebPage가 작동하지 않습니다.

내가 응답의 상태를 캡처하고 리디렉션을로드 페이지의 네트워크 관리자의 완성 된 신호에 연결 한이 문제를 해결하려면, 그러나, 나는 QWebPage에서 두 번째로 부하 메서드를 호출 할 때, 그것은 그냥 공백으로 설정하고 어떤 요청도하지 않습니다.

여기에 코드의 몇 가지 관련 비트입니다 :

connect(page->networkAccessManager(), SIGNAL(finished(QNetworkReply*)), SLOT(gotReply(QNetworkReply*))); 
connect(page, SIGNAL(loadFinished(bool)), SLOT(doneLoading(bool))); 
page->mainFrame()->load(url); 

내 슬롯 :

void Snapshot::gotReply(QNetworkReply *reply) 
{ 
    if(reply->header(QNetworkRequest::ContentTypeHeader).toString().contains(QString("text/html"))) 
    { 
     qDebug() << "Got reply " + reply->url().toString() + " - " + reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString() + " - " + reply->header(QNetworkRequest::ContentTypeHeader).toString(); 
    } 

    if(!statusCode && reply->header(QNetworkRequest::ContentTypeHeader).toString().contains(QString("text/html"))) { 
     statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
     redirectUrl = QUrl(reply->header(QNetworkRequest::LocationHeader).toUrl()); 
    } 
} 

void Snapshot::doneLoading(bool) 
{ 
    // A reasonable waiting time for any script to execute 
    timer->start(3000); 
} 

void Snapshot::doneWaiting() 
{ 
    if(statusCode != 0 && 
     statusCode != 301 && 
     statusCode != 302 && 
     statusCode != 303 
     ) { 
     qDebug() << page->mainFrame()->url().toString(); 
     qDebug() << page->mainFrame()->toHtml(); 

     QImage image(page->viewportSize(), QImage::Format_ARGB32); 
     QPainter painter(&image); 

     page->mainFrame()->render(&painter); 

     painter.end(); 

     image.save(*outputFilename); 

     delete outputFilename; 
     QApplication::quit(); 
    } 
    else if(statusCode != 0) { 
     statusCode = 0; 
     qDebug() << "Redirecting to: " + redirectUrl.toString(); 
     if(page->mainFrame()->url().toString().isEmpty()) { 
      qDebug() << "about:blank"; 
      page->mainFrame()->load(this->redirectUrl); // No network activity after this 
      qDebug() << "Loading"; 
     } 
    } 

    // This should ensure that the program never hangs 
    if(statusCode == 0) { 
     if(tries > 5) { 
      qDebug() << "Giving up."; 
      QApplication::quit(); 
     } 
     tries++; 
    } 
} 

답변

0

문제는 내가 있던 페이지가 테스트 HTTPS로 리디렉션 된 것이 었습니다 및 자체 서명 된 인증서를했다.

void Snapshot::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors) 
{ 
    reply->ignoreSslErrors(); 
} 
:

이 솔루션은 QNetworkReply는 SSL 오류를 무시하는 것이었다