Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Pixel от Июнь 02, 2013, 18:09



Название: Работа с сайтом.
Отправлено: Pixel от Июнь 02, 2013, 18:09
Начинаю писать приложение для работы с сайтом, но нигде не могу найти нормальных пояснений. пока только смог получить код страницы, а вот как сделать чтобы программа могла нажимать кнопки, авторизовываться на сайте, забивать текстовые поля? нагуглил множество подобных тем, но везде слишком сложно, а мне бы самые основы. Как-то надо оперировать GET и POST запросами через QNetworkAccessManager или есть какой-то другой способ? можно статейку где подробно объясняется как это делать или примерчик? заранее спасибо!


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 02, 2013, 18:22
нажимать кнопки и заполнять поля можно QtWebKit‎ с помощью javascript. но он работает только в главном потоке.
либо работать гет и пост-запросам, тогда возможна многопоточная работа c обработкой необходимого javascript с помощью QtScript‎.
все сложно, да.


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 02, 2013, 19:35
Цитировать
либо работать гет и пост-запросам, тогда возможна многопоточная работа c обработкой необходимого javascript с помощью QtScript‎.
по подробней можно?


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 02, 2013, 19:46
поиск юзай
http://www.prog.org.ru/topic_24772_0.html


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 02, 2013, 20:36
Цитировать
Собственно по сабжу, цель - залить файл, который лежит на ПК на сервер imagehack.us
они предоставляют API:
Код:
Endpoint : https://post.imageshack.us/upload_api.php
Parameters :
* key : The api key for your application; found in email sent after filling out our API Key Request form
* fileupload : image file
* format : json
tags : a CSV list of tags to describe your picture
public : A string setting your image to public or private where "yes" is public and "no" is private. Images are public by default.

а если мне неизвестен API, как быть?


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 02, 2013, 21:30
воспользоваться поиском


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 02, 2013, 21:40
хорошо, зайдем с другого бока. Можно пожалуйста небольшой примерчик как авторизоваться вот на этом сайте http://chemogu.ru/ ?


Название: Re: Работа с сайтом.
Отправлено: mutineer от Июнь 03, 2013, 10:07
Посмотреть через средства отладки браузера какой запрос отсылается по кнопке "Войти", повторить этот запрос через QNetworkAccessManager, сохранить полученные куки и использовать их при последующих запросах. Например так


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 03, 2013, 23:02
открываю средства отладки, жму вход, вижу вот такую картину http://screenshot.su/show.php?img=b93eef681db98d8832e669422633ba37.jpg и еще в 3 раза больше в полосе прокрутки. Должен быть метод POST, но его там вовсе нет.
как найти какой запрос отвечает за кнопку? как сохранить полученные куки? как использовать куки?
P.S. извиняюсь за глупость, если не сложно дайте хотя бы ссылку на статью где можно прочитать про это? я ведь совершенно не понимаю ваших ответов.


Название: Re: Работа с сайтом.
Отправлено: mutineer от Июнь 04, 2013, 10:12
Там не обязательно должен быть метод POST. Посмотри код страницы, что именно происходит при нажатии кнопки "Вход". Для куков есть класс QNetworkCookie и QNetworkCookieJar. Конкретных статей не знаю


Название: Re: Работа с сайтом.
Отправлено: alex312 от Июнь 04, 2013, 10:21
открываю средства отладки, жму вход, вижу вот такую картину
(https://lh5.googleusercontent.com/-taxxXCr7Qb4/Ua2NzeKraaI/AAAAAAAAAM0/unt8ndM72Dc/w942-h609-no/firefox_tools_post.png)
ЧЯДНТ  ::)

P.S. пару ссылок http://qt-project.org/doc/qt-5.0/qtdoc/topics-network-connectivity.html
                         http://ru.wikipedia.org/wiki/HTTP


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 04, 2013, 11:08
https://addons.mozilla.org/ru/firefox/addon/httpfox/


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 05, 2013, 23:12
Большое спасибо за ссылки, почитал. Вроде механику понял. Нашел схожее расширение для chrome, тыкнул логин. Имеем 2 запроса POST.
Первый: http://screenshot.su/show.php?img=997004f08ba7b58ef475295e7e7ee582.jpg
Второй: http://screenshot.su/show.php?img=defa6591b63a6de00b81235bfd13521a.jpg
Затрудняюсь теперь с реализацией (все перепробовал, ничего не получилось). Что и как мне нужно повторить? Оба запроса или только один?
Конструкция должна выглядеть как то так, верно?:
Код:
QNetworkRequest request(QUrl("http://chemogu.ru/login/ajax-login/"));
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
request.setRawHeader("Accept", "application/json, text/javascript, */*; q=0.01");
request.setRawHeader("X-Requested-With", "XMLHttpRequest");
m_NAM.post(request, "login=******&password=******&remember=on&return-path=http%3A%2F%2Fchemogu.ru%2F&security_ls_key=f197d25d6a04db642aa23dfd7b14861f");
На такой запрос сервер присылает: "Hacking attemp!".
Графы "Name", "Value" задавать с помощью m_NAM.setProperty()? Если да, то видимо мой код неверен, но что тогда писать в "name" второго запроса и какой будет второй аргумент метода POST?


Название: Re: Работа с сайтом.
Отправлено: alex312 от Июнь 06, 2013, 01:46
Pixel, посмотри на заголовок запроса на моем скриншоте, там перелается 12 параметров, куки, и собственно сам запрос.
Если ты думаеш отделатся тремя, то ты сильно ошибся.
Еще, в запросе передается security_ls_key - ты откуда его береш? Опять же, если ты его один раз выцепил браузером, и думаеш все время использовать, то ты сильно ошибся.

Ну и так, ради интереса, чем тебя не устроили стандартные хромовские расширения для разработчика ?


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 06, 2013, 10:30
спарси из формы значение security_ls_key
<input type="hidden" name="security_ls_key" value=""... />
тебе нужно значение value=""
кот. будешь подставлять сюда security_ls_key=

и куки нужны, наверн, будут

Код:
QNetworkAccessManager qnam;
QNetworkCookieJar *cookieJar = new QNetworkCookieJar;
qnam.setCookieJar(cookieJar);


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 06, 2013, 11:48
   
Код:
    QNetworkRequest request(QUrl("http://chemogu.ru/login/ajax-login/"));
    QNetworkCookieJar *jar = new QNetworkCookieJar;
    m_NAM.setCookieJar(jar);
    request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5");
    request.setRawHeader("Referer", "http://chemogu.ru/");
    request.setRawHeader("Pragma", "no-cache");
    request.setRawHeader("Host", "chemogu.ru");
    request.setRawHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    request.setRawHeader("Accept", "application/json, text/javascript, */*; q=0.01");
    request.setRawHeader("X-Requested-With", "XMLHttpRequest");
    request.setRawHeader("Content-Length", "131");
    request.setRawHeader("Connection", "keep-alive");
    request.setRawHeader("Cache-control", "no-cache");
    request.setRawHeader("Accept-Language", "ru=RU,ru;q=0.8,en=US;q=0.5,eb;q=0.3");
    request.setRawHeader("Accept-Encoding", "gzip, deflate");
    request.setRawHeader("Accept", "application/json, text/javascript, \"/\"; q=0.01");
    m_NAM.post(request, "login=*********&password=*******&remember=on&return-path=http%3A%2F%2Fchemogu.ru%2F&security_ls_key=f197d25d6a04db642aa23dfd7b14861f");
Тот же результат - "Hacking attemp!".
Pixel, посмотри на заголовок запроса на моем скриншоте, там перелается 12 параметров, куки, и собственно сам запрос.
Если ты думаеш отделатся тремя, то ты сильно ошибся.
Просто мое расширение показало всего 3 параметра, их я и передал.
Ну и так, ради интереса, чем тебя не устроили стандартные хромовские расширения для разработчика ?
Как видно из скриншота (http://screenshot.su/show.php?img=b93eef681db98d8832e669422633ba37.jpg) стандартный хромовский выдал не то, что нужно. Судя по всему это запросы ресурсов главной страницы.
спарси из формы значение security_ls_key
Там отсутсвует такая строчка. Из формы значит с кода страницы я правильно понял?


Название: Re: Работа с сайтом.
Отправлено: alex312 от Июнь 06, 2013, 12:20
Просто мое расширение показало всего 3 параметра, их я и передал.
Плохое, плохое расширение   >:(

стандартный хромовский выдал не то, что нужно.
НЕВЕРЮ .

Там отсутсвует такая строчка. Из формы значит с кода страницы я правильно понял?
эта строчка не из воздуха берется, ищи. смотри исходный код страницы.


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 06, 2013, 12:31
var LIVESTREET_SECURITY_KEY = 'b309550a7e31c2fbf249a6f08baf43df';


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 06, 2013, 16:37
Код:
        QNetworkRequest request(QUrl("http://chemogu.ru/login/ajax-login/"));
        request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5");
        request.setRawHeader("Referer", "http://chemogu.ru/");
        request.setRawHeader("Pragma", "no-cache");
        request.setRawHeader("Host", "chemogu.ru");
        request.setRawHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        request.setRawHeader("Accept", "application/json, text/javascript, */*; q=0.01");
        request.setRawHeader("X-Requested-With", "XMLHttpRequest");
        request.setRawHeader("Content-Length", "131");
        request.setRawHeader("Connection", "keep-alive");
        request.setRawHeader("Cache-control", "no-cache");
        request.setRawHeader("Accept-Language", "ru=RU,ru;q=0.8,en=US;q=0.5,eb;q=0.3");
        request.setRawHeader("Accept-Encoding", "gzip, deflate");
        request.setRawHeader("Accept", "application/json, text/javascript, \"/\"; q=0.01");

        QNetworkCookieJar *jar = new QNetworkCookieJar;
        m_NAM.setCookieJar(jar);

        m_NAM.post(request, "login=**********&password=********" \
                   "&remember=on&return-path=http%3A%2F%2Fchemogu.ru%2F&" \
                   "security_ls_key="+key.toUtf8());
и снова "Hacking attemp!"
Key перед этим парсится методом get главной страницы.


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 06, 2013, 16:40
ну зайди на главную страницу, прими куки. возможно придется паузу перед авторизацией сделать


Название: Re: Работа с сайтом.
Отправлено: Pixel от Июнь 06, 2013, 16:59
Разобрался, заработало. Всем спасибо за помощь! Сам виноват)) создавал новые куки каждый запрос, вот он и отправлял меня. Задержка не понадобилась, и кстати говоря для работы хватило тех самых трех заголовков, что показало мое расширение.
Теперь возник вопрос. Получается сайт может попросту не пускать меня в авторизацию, если куки отключены? Можно ли это как-то обойти? И еще я могу те самые куки просто сохранить в файл и потом их использовать, не принимая снова с сайта?


Название: Re: Работа с сайтом.
Отправлено: thechicho от Июнь 06, 2013, 17:12
сессия на куках основана, без них сайт не определит юзера.

можешь, только придется унаследоваться от QNetworkCookieJar
.h
Код:
class RemadedNetworkCookieJar: public QNetworkCookieJar
{
public:
    RemadedNetworkCookieJar(QObject *parent = 0);
    virtual ~RemadedNetworkCookieJar();

    QList<QNetworkCookie> getAllCookies();
    void setAllSitesCookies(const QList<QNetworkCookie>& cookieList);
};

.cpp
Код:
RemadedNetworkCookieJar::RemadedNetworkCookieJar(QObject *parent) : QNetworkCookieJar(parent) { }

QList<QNetworkCookie> RemadedNetworkCookieJar::getAllCookies()
{
    return allCookies();
}

void RemadedNetworkCookieJar::setAllSitesCookies(const QList<QNetworkCookie>& cookieList)
{
    setAllCookies(cookieList);
}

RemadedNetworkCookieJar::~RemadedNetworkCookieJar() { }

только надо ли оно.