Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: thechicho от Декабрь 24, 2011, 19:03



Название: Установить заголовок QtWebKit
Отправлено: thechicho от Декабрь 24, 2011, 19:03
Код
C++ (Qt)
QWebPage *page = new QWebPage(this);
QNetworkRequest request;
request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
request.setUrl(QUrl("http://www.site.com/"));
page->mainFrame()->load(QUrl(request));

при выполнении javascript
Код
C++ (Qt)
QWebElement submit = page->mainFrame()->findFirstElement("input[name=submit]");
submit.evaluateJavaScript("this.click()");

заголовок не отправляется и страница отдается на другом языке.
как его установить "на постоянку"?


Название: Re: Установить заголовок QtWebKit
Отправлено: thechicho от Декабрь 24, 2011, 21:27
http://pgl.yoyo.org/http/browser-headers.php

User-Agent:           Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Qt/4.7.4 Safari/533.3
Accept:                   application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Connection:           Keep-Alive
Accept-Encoding:           gzip
Accept-Language:   en-US,*
Host:                           pgl.yoyo.org

вот заголовки, отправляемые браузером по умолчанию.
как мне поменять
en-US,*
на
en-US,en;q=0.8
 ???


Название: Re: Установить заголовок QtWebKit
Отправлено: fuCtor от Декабрь 26, 2011, 12:56
Читай про:
void QWebPage::setNetworkAccessManager ( QNetworkAccessManager * manager )
и
QNetworkReply * QNetworkAccessManager::createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 ) [virtual protected]


Название: Re: Установить заголовок QtWebKit
Отправлено: thechicho от Декабрь 26, 2011, 18:34
да я читал, только не догоняю.
переход осуществляется по клику через js, из-за этого отправляются стандартные заголовки.

Accept-Language:   en-US,*

это чо за заголовок ваще такой? баг это или как? с какого перепугу там звездочка вообще... как мне его сменить по дефолту???


Название: Re: Установить заголовок QtWebKit
Отправлено: fuCtor от Декабрь 27, 2011, 21:00
Ставим свой менеджер, и насильно при формировании запроса прошиваем туда заголовки которые нам нужны. Это будет происходить как просто при загрузке страницы, так и при запросе через JS.


Название: Re: Установить заголовок QtWebKit
Отправлено: thechicho от Декабрь 27, 2011, 21:46
я хз, код покажи


Название: Re: Установить заголовок QtWebKit
Отправлено: fuCtor от Декабрь 30, 2011, 08:36
createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 )
{
  QNetworkRequest my_req(req);
  req.setRawHeader("Accept-Language", "en-US,en;q=0.8" );
  return QNetworkAccessManager::createRequest(op, my_req, outgoingData);
}

как то так, за точность не ручаюсь, писал на коленке.


Название: Re: Установить заголовок QtWebKit
Отправлено: thechicho от Декабрь 30, 2011, 15:01
дак будет возвращен QNetworkReply*
как его сюда-то прикрутить?
QWebPage::setNetworkAccessManager ( QNetworkAccessManager * manager )


Название: Re: Установить заголовок QtWebKit
Отправлено: fuCtor от Декабрь 31, 2011, 06:24
Код
C++ (Qt)
class MySuperAccessManager : public QNetworkAccessManager
{
...
createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 )
{
 QNetworkRequest my_req(req);
 req.setRawHeader("Accept-Language", "en-US,en;q=0.8" );
 return QNetworkAccessManager::createRequest(op, my_req, outgoingData);
}
...
}
 
QNetworkAccessManager * my_am = new QNetworkAccessManager();
web_view->page()->setNetworkAccessManager(my_am);
web_view->load("http://ya.ru");

Вот так понятней? А документацию нужно внимательно читать.


Название: Re: Установить заголовок QtWebKit
Отправлено: thechicho от Декабрь 31, 2011, 20:41
спасибо, попробую! с НГ! :)


Название: Re: Установить заголовок QtWebKit
Отправлено: bosfor от Январь 27, 2012, 17:34
Код
C++ (Qt)
class MySuperAccessManager : public QNetworkAccessManager
{
...
createRequest ( Operation op, const QNetworkRequest & req, QIODevice * outgoingData = 0 )
{
 QNetworkRequest my_req(req);
 req.setRawHeader("Accept-Language", "en-US,en;q=0.8" );
 return QNetworkAccessManager::createRequest(op, my_req, outgoingData);
}
...
}
 
QNetworkAccessManager * my_am = new QNetworkAccessManager();
web_view->page()->setNetworkAccessManager(my_am);
web_view->load("http://ya.ru");

не вижу связи меду переопределенным классом и  my_am