Снова POST запрос, снова Delphi.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by SamaRazor, 10 Feb 2013.

  1. SamaRazor

    SamaRazor New Member

    Joined:
    2 Feb 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Работаю по одноклассникам, пишу соответственно софт для них. Для обработки http запросов использую стороннюю библиотеку Synapse. Все функции софта написаны, а вот с загрузкой изображений(фотографий) столкнулся с проблемой. Поснифил запрос браузера при заливке фоток, составил multipart/form-data запрос, идентичный ему. Как не бился, всегда получаю 302, в котором редирект на http://m.odnoklassniki.ru/dk?bk=UserAddPhoto&st.cmd=userAddPhoto&tkn=5200&errorId=8&details=null. Получив эту страницу, узнал что "еррорайди8" это "Файл не выбран". На данный момент сниффлю запрос софта, и сравниваю с запросом браузера.

    Что получаю от софта(Начало)
    [​IMG]
    Далее файл, и в конце
    [​IMG]

    Что отправляет браузер:
    [​IMG]
    Далее файл, и в конце
    [​IMG]

    Собственно сам код:
    Code:
    procedure SendPhoto;
    Const
      CRLF = #$0d+ #$0a;
    var
      s: AnsiString;
      FS: TFileStream;
      bou:string;
    begin
    randomize;
    http.Clear;
    HTTP.HTTPMethod('GET', 'http://m.odnoklassniki.ru/dk?st.cmd=userAddPhoto');
    HTTP.Document.SaveToFile('userupload.html');
    TS.LoadFromStream(http.Document);  Page:= TS.Text;
    link:=  Pars('<div class="pdiv"></div></div><form action="',Page,'"');
     if pos('amp;',link) <> 0 then delete(link,pos('amp;',link),4);
     if pos('amp;',link) <> 0 then delete(link,pos('amp;',link),4);
     if pos('amp;',link) <> 0 then delete(link,pos('amp;',link),4);
     Form1.ConsoleLog.Lines.Add(link);
     http.Clear;
    
        try
         FS:=TFileStream.Create('C:\z_c9fdba02.jpg', fmOpenRead);
         bou:= '-----------------------------' + IntToStr(Random(999999999999));
         http.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
         http.Headers.Add('Accept-Encoding: gzip, deflate');
         http.Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3');
         http.Headers.Add('Referer: http://m.odnoklassniki.ru/dk?st.cmd=userAddPhoto');
          HTTP.MimeType := 'multipart/form-data; boundary='+bou;
    
          s := bou + CRLF +
            'Content-Disposition: form-data; name="fr.posted"' + CRLF + CRLF + 'set'
            + CRLF + bou + CRLF + 'Content-Disposition: form-data; name="fr.file"; filename="z_c9fdba02.jpg"' + CRLF + 'Content-Type: image/jpeg' + CRLF + CRLF;
          HTTP.Document.Write(PAnsiChar(s)^, Length(s));
          FS.Position := 0;
    
          HTTP.Document.CopyFrom(FS, FS.Size);
    
        s := CRLF + bou + CRLF + 'Content-Disposition: form-data; name="button_load"' + CRLF + CRLF+ utf8encode('Загрузить') + CRLF + bou + '--' + CRLF;
        HTTP.Document.Write(PAnsiChar(s)^, Length(s));
    
        if HTTP.HTTPMethod('POST', link) then
        begin
          ShowMessage(HTTP.ResultString);
        end;
        finally
          FS.Free;
        end;
    
    end;
    
    За любые догадки, подсказки, советы буду очень благодарен ;) Заранее спасибо.
     
  2. SamaRazor

    SamaRazor New Member

    Joined:
    2 Feb 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Ну и заголовки:
    Софт:
    [​IMG]
    Браузер:
    [​IMG]
     
  3. SamaRazor

    SamaRazor New Member

    Joined:
    2 Feb 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Решил проблему сам. Кому интересно: в пост запросе такого типа граница должна иметь '--' в начале при любом использовании в теле.