Конференция "Сети" » TChromium (dcef3). POST запрос. Вознаграждение.
 
  • Алешенька (28.07.14 13:06) [0]
    Доброго здоровья!
    Прошу помощи в формировании правильного POST запроса.
    Известно все, что нужно отправить. Неизвестно как правильно это оформить.

    Использовать надо TChromiumOCR (dcef3).

    Тампердадой установлено что нужно отправить:
    -Заголовки запроса:
    Host, User-Agent, Accept, Accept-Language, Accept-Encoding, Content-Type, Referer, Content-Length, Origin, Cookie, Connection, Pragma, Cache-Control

    -Сообщение:
    sessionid=(*)¤cy(*)=&subtotal=(*)&fee=(*)&total=(*)

    Код такой:

    function CreateField(const AValue: AnsiString): ICefPostDataElement;
    begin
     Result := TCefPostDataElementRef.New;
     Result.SetToBytes(Length(AValue), PAnsiChar(AValue));
    end;

    //*****************************************

    procedure POST(total, fee: integer);
    var
     Header: ICefStringMultimap;
     Data: ICefPostData;
     Request: ICefRequest;
     Cook: ICefCookieManager;
    begin
     Request := TCefRequestRef.New;
     Request.Url := '';
     Request.Method := 'POST';
     Request.Flags:=[UR_FLAG_ALLOW_CACHED_CREDENTIALS,UR_FLAG_ALLOW_COOKIES];
     
     Header := TCefStringMultimapOwn.Create;
     Header.Append('Host', '');
     Header.Append('User-Agent', '');
     Header.Append('Accept', '');
     Header.Append('Accept-Language', '');
     Header.Append('Accept-Encoding', '');
     Header.Append('Content-Type', '');
     Header.Append('Referer', '');
     Header.Append('Content-Length', '');
     Header.Append('Origin', '');
     Header.Append('Connection', '');
     Header.Append('Pragma', '');
     Header.Append('Cache-Control', '');

     Header.Append('Cookie','...');
     ...
     Header.Append('Cookie','...');
     
     Request.SetHeaderMap(Header);

     Data := TCefPostDataRef.New;
     Data.AddElement(CreateField('sessionid='+SessionID));
     Data.AddElement(CreateField('¤cy=5'));
     Data.AddElement(CreateField('&subtotal='+inttostr(total-fee)));
     Data.AddElement(CreateField('&fee='+IntToStr(fee)));
     Data.AddElement(CreateField('&total='+IntToStr(total)));

     Request.PostData := Data;

     form1.Chromium1.Browser.MainFrame.LoadRequest(Request);
    end;



    Сомнения и вопросы:
    - Где то видел, что в конце строки POST запроса надо добавлять "\r\n". Надо ли?
    - Надо ли добавлять строку "POST http://www.site.ru HTTP/1.1\r\n"?
    - Некоторые данные извлекаются из куки файлов в закодированном (utf-8) виде. Content-Type в данном запросе = "application/x-www-form-urlencoded; charset=UTF-8". В каком виде надо отправлять данные: как есть в utf-8 или декодировать в win1251?
    - В коде параметр Request.Flags указывает на использование куки файлов. Нипанятна же... надо вручную прописывать заголовок "Cookie" или нет.

    Кароч, тому кто поможет дам 333 рубля.
  • junglecat (28.07.14 13:21) [1]
    > - Где то видел, что в конце строки POST запроса надо добавлять
    > "\r\n". Надо ли?

    два после заголовка - \n\n, но здесь же не запись сырых данных в сокет, а интерфейсы-объекты, они должны сами всё оформить

    > - Надо ли добавлять строку "POST http://www.site.ru HTTP/1.1\r\n"?

    не надо

    > В каком виде надо отправлять данные: как есть в utf-8 или
    > декодировать в win1251?

    как есть

    > надо вручную прописывать заголовок "Cookie" или нет

    Header.Append('Cookie','...') - это разве не оно?
  • Алешенька (28.07.14 13:27) [2]
    @junglecat

    они должны сами всё оформить

    - я тоже так думаю

    Да этим Header.Append('Cookie','...') я добавляю все куки. Но не уверен, что нужно, если есть флаги.

    Request.Flags:=[UR_FLAG_ALLOW_CACHED_CREDENTIALS,UR_FLAG_ALLOW_COOKIES];

    Из описания флагов:
       // If set user name, password, and cookies may be sent with the request.
       UR_FLAG_ALLOW_CACHED_CREDENTIALS,
       // If set cookies may be sent with the request and saved from the response.
       // UR_FLAG_ALLOW_CACHED_CREDENTIALS must also be set.
       UR_FLAG_ALLOW_COOKIES

    Мож я что-то не так понял?
  • Styx (01.08.14 19:19) [3]
    Так проблема-то в чём если код работает, то... а если нет, рассказывайте, что не работает.
  • Алешенька (05.08.14 14:48) [4]
    Код рабочий. Этим кодом получилось авторизоваться на другом сервере.
    Подсказали вот какую фишку:

    > Надо как я и думал все таки вычитывать ответ сервера на
    > запрос. Каким то серверам по барабану это, другим нет.

    тогда вопрос: как реализовать ЗАПРОС/ОТВЕТ методами TChromiumOSR?
  • Алешенька (08.08.14 11:42) [5]
    ответ от сервера на запрос - 502
    установил httpAnalyser глянуть что передаю... а ничего не передаю... почему анализер не видит post запроса моей программы о_0 ?
  • Styx (11.08.14 03:00) [6]

    > почему анализер не видит post запроса моей программы о_0 ?

    Поставьте WireShark
  • Алешенька (11.08.14 11:58) [7]
    Поставил httpAnalyser 7. Все видит. Выяснилось, что программа отправляет все как в тампердате.
  • Алешенька (19.08.14 14:39) [8]
    Победа!
  • Алешенька (19.08.14 14:43) [9]
    УРАААААААААААААААААААААААА!!!!!!!!! Почти 3 месяца мучился)
  • brother © (25.08.14 12:44) [10]
    Удалено модератором
 
Конференция "Сети" » TChromium (dcef3). POST запрос. Вознаграждение.
Есть новые Нет новых   [118241   +23][b:0][p:0.002]