Russian Qt Forum

Qt => Работа с сетью => Тема начата: vbi от Август 17, 2011, 11:25



Название: Yandex не отвечает
Отправлено: vbi от Август 17, 2011, 11:25
Написал програмку, которая посылает GET запрос на "www.yandex.ru", который по идее должен возвратить содержание страницы, но вместо этого возвращает пустую строку.
Если послать get запрос на "yandex.ru", то яндекс возвращает страницу "302 Moved Permanently" и перенаправляет на "www.yandex.ru", а тот в свою очередь возвращает пустую строку.
Как с ним бороться, может какие-то уникальные заголовки передать?

Код программы:
.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QtNetwork/QNetworkAccessManager>
#include <QUrl>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QDebug>
 
namespace Ui {
    class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
private slots:
    void on_pushButton_clicked();
    void searshFinished(QNetworkReply*);
};
 
#endif // MAINWINDOW_H

.cpp

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
    QNetworkRequest request;
    request.setUrl(QUrl("http://www.yandex.ru/"));
    request.setRawHeader("Host", "yandex.ru");
    request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.10) Gecko/2009042809 GranParadiso/3.0.10");
    //request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)");
    //request.setRawHeader("User-Agent", "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50");
    //request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    //request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
    //request.setRawHeader("Accept-Encoding", "gzip,deflate");
    //request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    request.setRawHeader("Keep-Alive", "115");
    request.setRawHeader("Connection", "keep-alive");
    //request.setRawHeader("Referer", urlBytes);
    //request.setRawHeader("Cookie", "");
    //request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
    //request.setRawHeader("Content-Length", "557");
 
 
    QNetworkAccessManager* manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(searshFinished(QNetworkReply*)));
    manager->get(request);
}
 
void MainWindow::searshFinished(QNetworkReply* reply)
{
    QByteArray ansver = reply->read(reply->bytesAvailable());
    qWarning() << ansver;
}

Скачать прогу можно отсюда (http://bibyte.net/TestYandex.zip)


Название: Re: Yandex не отвечает
Отправлено: Igore от Август 17, 2011, 16:40
У меня ответил. Qt 4.7.3, windows:
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><title>Яндекс</title>..." и т.д.
Программа рабочая, разбирайся с окружением. Интернет через прокси?

По поводу 302
Цитировать
QNetworkRequest::RedirectionTargetAttribute   2   Replies only, type: QVariant::Url (no default) If present, it indicates that the server is redirecting the request to a different URL. The Network Access API does not by default follow redirections: it's up to the application to determine if the requested redirection should be allowed, according to its security policies. The returned URL might be relative. Use QUrl::resolved() to create an absolute URL out of it.
http://www.qtforum.org/article/29493/problems-with-qnetworkaccessmanager.html


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 17, 2011, 17:41
 :o :o :o
та нет. Подключен напрямую к билайн по кабелю


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 17, 2011, 17:43
У меня 4.7.0 Попробую переустановить...


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 17, 2011, 23:06
Поставил последнюю версию, то же самое, запрос пустой, а вот в QWebView страница яндекса нормально загружается. А QNetworkReply возвращает пустую строку, в чем же проблема?


Название: Re: Yandex не отвечает
Отправлено: sendevent от Август 18, 2011, 12:22
глянь сниффером - мож че полезное найдешь.


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 18, 2011, 15:01
Проверил. Все равно что-то не пойму.
Вот мой запрос:
Цитировать
No.     Time        Source                Destination           Protocol Length Hypertext Transfer Protocol Info
      6 0.671130    172.25.0.22           93.158.134.203        HTTP     288    Yes                         GET / HTTP/1.1

Frame 6: 288 bytes on wire (2304 bits), 288 bytes captured (2304 bits)
Ethernet II, Src: Pegatron_ce:67:77 (70:71:bc:ce:67:77), Dst: EdimaxTe_96:43:13 (00:50:fc:96:43:13)
Internet Protocol Version 4, Src: 172.25.0.22 (172.25.0.22), Dst: 93.158.134.203 (93.158.134.203)
Transmission Control Protocol, Src Port: 53921 (53921), Dst Port: http (80), Seq: 1, Ack: 1, Len: 234
Hypertext Transfer Protocol
    GET / HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n]
            [Message: GET / HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: GET
        Request URI: /
        Request Version: HTTP/1.1
    Host: www.yandex.ru\r\n
    User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.10) Gecko/2009042809 GranParadiso/3.0.10\r\n
    Keep-Alive: 115\r\n
    Connection: keep-alive\r\n
    Accept-Encoding: gzip\r\n
    Accept-Language: uk-UA,en,*\r\n
    \r\n
    [Full request URI: http://www.yandex.ru/]

А это ответ (пустой):
Цитировать
No.     Time        Source                Destination           Protocol Length Hypertext Transfer Protocol Info
      9 0.760279    93.158.134.203        172.25.0.22           HTTP     635    Yes                         HTTP/1.1 302 Found

Frame 9: 635 bytes on wire (5080 bits), 635 bytes captured (5080 bits)
Ethernet II, Src: EdimaxTe_96:43:13 (00:50:fc:96:43:13), Dst: Pegatron_ce:67:77 (70:71:bc:ce:67:77)
Internet Protocol Version 4, Src: 93.158.134.203 (93.158.134.203), Dst: 172.25.0.22 (172.25.0.22)
Transmission Control Protocol, Src Port: http (80), Dst Port: 53921 (53921), Seq: 1, Ack: 235, Len: 581
Hypertext Transfer Protocol
    HTTP/1.1 302 Found\r\n
        [Expert Info (Chat/Sequence): HTTP/1.1 302 Found\r\n]
            [Message: HTTP/1.1 302 Found\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Version: HTTP/1.1
        Status Code: 302
        Response Phrase: Found
    Server: nginx\r\n
    Date: Thu, 18 Aug 2011 11:43:29 GMT\r\n
    Connection: close\r\n
    Cache-Control: no-cache,no-store,max-age=0,must-revalidate\r\n
    Location: http://pass.yandex.ru/?retpath=http%3A%2F%2Fwww.yandex.ua\r\n
    Content-Length: 0\r\n
    Expires: Thu, 18 Aug 2011 11:43:29 GMT\r\n
    Last-Modified: Thu, 18 Aug 2011 11:43:29 GMT\r\n
    P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"\r\n
    Set-Cookie: yandexuid=9523829581313667809; domain=.yandex.ru; path=/; expires=Sun, 15-Aug-2021 11:43:29 GMT\r\n
    X-XRDS-Location: http://openid.yandex.ru/server_xrds/\r\n
    \r\n


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 18, 2011, 15:06
По ходу не находит его чтоли?


Название: Re: Yandex не отвечает
Отправлено: Serr500 от Август 18, 2011, 15:16
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP#302 (http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP#302)


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 18, 2011, 15:24
Попробовал сделать запрос на "http://www.yandex.ua", Выдает то же:

Цитировать
No.     Time        Source                Destination           Protocol Length Hypertext Transfer Protocol Info
      7 1.065026    87.250.251.3          172.25.0.22           HTTP     605    Yes                         HTTP/1.1 302 Found

Frame 7: 605 bytes on wire (4840 bits), 605 bytes captured (4840 bits)
Ethernet II, Src: EdimaxTe_96:43:13 (00:50:fc:96:43:13), Dst: Pegatron_ce:67:77 (70:71:bc:ce:67:77)
Internet Protocol Version 4, Src: 87.250.251.3 (87.250.251.3), Dst: 172.25.0.22 (172.25.0.22)
Transmission Control Protocol, Src Port: http (80), Dst Port: 54216 (54216), Seq: 1, Ack: 235, Len: 551
Hypertext Transfer Protocol
    HTTP/1.1 302 Found\r\n
        [Expert Info (Chat/Sequence): HTTP/1.1 302 Found\r\n]
        Request Version: HTTP/1.1
        Status Code: 302
        Response Phrase: Found
    Server: nginx\r\n
    Date: Thu, 18 Aug 2011 12:17:34 GMT\r\n
    Connection: close\r\n
    Cache-Control: no-cache,no-store,max-age=0,must-revalidate\r\n
    Location: http://pass.yandex.ua/?retpath=http%3A%2F%2Fwww.yandex.ua%2F\r\n
    Content-Length: 0\r\n
    Expires: Thu, 18 Aug 2011 12:17:35 GMT\r\n
    Last-Modified: Thu, 18 Aug 2011 12:17:35 GMT\r\n
    P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"\r\n
    Set-Cookie: Cookie_check=CheckCookieCheckCookie; domain=.yandex.ua; path=/\r\n
    X-XRDS-Location: http://openid.yandex.ru/server_xrds/\r\n
    \r\n


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 18, 2011, 15:25
Делаю запрос на "http://pass.yandex.ua/?retpath=http%3A%2F%2Fwww.yandex.ua%2F\r\n"
Выдает вот что:
Цитировать
No.     Time        Source                Destination           Protocol Length Hypertext Transfer Protocol Info
      6 0.106435    213.180.204.47        172.25.0.22           HTTP     497    Yes                         HTTP/1.1 302 Moved Temporarily

Frame 6: 497 bytes on wire (3976 bits), 497 bytes captured (3976 bits)
Ethernet II, Src: EdimaxTe_96:43:13 (00:50:fc:96:43:13), Dst: Pegatron_ce:67:77 (70:71:bc:ce:67:77)
Internet Protocol Version 4, Src: 213.180.204.47 (213.180.204.47), Dst: 172.25.0.22 (172.25.0.22)
Transmission Control Protocol, Src Port: http (80), Dst Port: 54240 (54240), Seq: 1, Ack: 287, Len: 443
Hypertext Transfer Protocol
    HTTP/1.1 302 Moved Temporarily\r\n
        [Expert Info (Chat/Sequence): HTTP/1.1 302 Moved Temporarily\r\n]
        Request Version: HTTP/1.1
        Status Code: 302
        Response Phrase: Moved Temporarily
    Server: nginx\r\n
    Date: Thu, 18 Aug 2011 12:23:28 GMT\r\n
    Transfer-Encoding: chunked\r\n
    Connection: close\r\n
    Location: http://passport.yandex.ru/passport?trace=pass-f2.8788.ebadretp1&mode=error&error=badretpath&badretpath=http%253A%252F%252Fwww.yandex.ua%252F%0D%0A\r\n
    Expires: Thu, 01 Jan 1970 00:00:01 GMT\r\n
    Cache-Control: no-cache\r\n
    Cache-Control: no-cache, private, no-cache, no-store, must-revalidate, max-age=0\r\n
    \r\n
    HTTP chunked response


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 18, 2011, 15:28
Вот при переходе сюда: "http://passport.yandex.ru/passport?trace=pass-f2.8788.ebadretp1&mode=error&error=badretpath&badretpath=http%253A%252F%252Fwww.yandex.ua%252F%0D%0A\r\n"
наконец то загружается хоть что-то. Но это всего-лиш страница с предупреждением о фишинге... :(


Название: Re: Yandex не отвечает
Отправлено: Serr500 от Август 18, 2011, 16:52
Хм... Странно... Попробуйте указать referer.


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 19, 2011, 09:02
Та не помогает... Что ж буду наверно пользоватся QWebView. Этот компонент сам решает множество проблем.


Название: Re: Yandex не отвечает
Отправлено: sendevent от Август 19, 2011, 16:56
Не, ну понятно - не получается, бесит, но зачем яндекс-то ломать было?  ;D
(Похоже, из Росси он сейчас не доступен - лежит, и в твиттере народ жалуется, и я попасть не могу).
Если серьезно - при переходе на новый локейшн, указанный в первом редиректе, необходимо передавать и установленные куки - практически уверен, проблема в них (из "Set-Cookie: yandexuid=9523829581313667809; domain=.yandex.ru; path=/; expires=Sun, 15-Aug-2021 11:43:29 GMT" - предпоследняя строчка ответа на первый гет).


Название: Re: Yandex не отвечает
Отправлено: vbi от Август 20, 2011, 10:39
не работает и с куками...


Название: Re: Yandex не отвечает
Отправлено: sendevent от Август 31, 2011, 13:30
Да, про куки я тупанул - в первом ответе ведь и без них все норм.