Russian Qt Forum

Qt => Работа с сетью => Тема начата: Andrey7 от Август 08, 2010, 16:30



Название: QWebView
Отправлено: Andrey7 от Август 08, 2010, 16:30
Здравствуйте. Недавно загорелся написать автокликер для одного сайта. Суть такова - я даю программе ссылку, она открывает эту ссылку с помощью QWebView и и кликает сама по ссылкам которые я задам по умолчанию в программе.. Тоесть например сама находит на странице link и сама же переходит по нему. Возможно ли это реализовать? И если да подскажите как можно осуществить поиск нужной ссылки на странице и переход по ней. заранее благодарен


Название: Re: QWebView
Отправлено: Joss от Август 08, 2010, 19:13
А зачем QWebView для этого?


Название: Re: QWebView
Отправлено: Andrey7 от Август 08, 2010, 21:47
а есть другие варианты?


Название: Re: QWebView
Отправлено: Joss от Август 08, 2010, 22:17
QNetworkAccessManager


Название: Re: QWebView
Отправлено: serg_hd от Август 09, 2010, 02:27
не всё так просто как кажется  :)


Название: Re: QWebView
Отправлено: Andrey7 от Август 09, 2010, 12:56
Код:
{
    view = new QWebView(this);
    view->load(QUrl("http://cайт.ру"));
    setCentralWidget(view);
    QString code = "document.forms.submit()";
    view->page()->mainFrame()->evaluateJavaScript(code);


}


подскажите пожалуйста где я ошибся?


Название: Re: QWebView
Отправлено: serg_hd от Август 09, 2010, 13:21
я так и не понял, что нужно? Переходить по ссылкам или отсылать формы?
Если по ссылкам, то для получения всех ссылок страницы, метод типа такого:
Код
C++ (Qt)
void Tools::getPageLinks(ListOfMappedStrings* listOfAllLinks, QWebView* webview)
{
QString strUrl;
QList<QWebFrame*> framesList(webview->page()->mainFrame()->childFrames()); //add parent frames
framesList.append(webview->page()->mainFrame()); //and main frame
 
QString resString = ""; //full data strings
const QString& jScript = "function getAllLinks(){var res;for (i=0; i<document.links.length; i++)"
"{res += document.links[i].innerHTML + '[DATALINK_SEPARATOR]' + document.links[i].href + '[LINKS_SEPARATOR]';}"
"return res.substring(0, (res.length - 17));}getAllLinks();";
 
QList<QVariant> list; //only for item contains control
foreach(QWebFrame* wFrame, framesList)
{
 if (wFrame->childFrames().size() > 0)
 {
  //parsing child frames
  foreach (QWebFrame* wFrameChild, wFrame->childFrames())
  {
   const QVariant& obj = wFrameChild->evaluateJavaScript(jScript);
   if (!list.contains(obj))
   {
    list.append(obj);
    resString += obj.value<QString>();
   }
  }
 }
 //main frame
 const QVariant& obj = wFrame->evaluateJavaScript(jScript);
 if (!list.contains(obj))
 {
  list.append(obj);
  resString += obj.value<QString>();
 }
}
 
resString.replace("null", "");
resString.replace("undefined", "");
QStringList strList = resString.split("[LINKS_SEPARATOR]");
if (strList.size() > 1)
{
 foreach (QString strItem, strList)
 {
  const QStringList& subStrList = strItem.split("[DATALINK_SEPARATOR]");
  QMap<QString, QString> map;
  map.insert("text", subStrList[0].trimmed());
  strUrl = subStrList[1].trimmed();
  map.insert("url", strUrl);
  listOfAllLinks->append(map);
 }
}
}
 

Код можно несколько сократить, но давно писал и лень уже).
ListOfMappedStrings это QMap(QString, QString).
Имея контейнер ссылок, грузишь какие надо через load(). При этом, конечно, не забываешь про подмену referrer'a, других заголовков, сохранения и загрузки cookies и т.п. ;)


Название: Re: QWebView
Отправлено: Andrey7 от Август 09, 2010, 17:36
Аха.. Спасибо разобрался. Теперь другой вопрос. Задам тут же чтобы не плодить темы. Вот эта весчь заружает страницу 
Код:
view->load(QUrl("http://блаблабла.ру"));
как можно загружать эту же страницу только без картинок?


Название: Re: QWebView
Отправлено: serg_hd от Август 09, 2010, 17:55
наверное
Код
C++ (Qt)
this->webView.page()->settings()->setAttribute(QWebSettings::AutoLoadImages, false);
а вообще не пробовал


Название: Re: QWebView
Отправлено: Andrey7 от Август 10, 2010, 01:06
Да эта штука работает! Спасибо!  :) :) :)