Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Delphi] Winsock 2.0; multipart/form-data (https://forum.antichat.xyz/showthread.php?t=206577)

RedFern.89 25.05.2010 00:05

[Delphi] Winsock 2.0; multipart/form-data
 
пытался отправить граффити вконтакт по сокетам.. как составить правильно запрос?

вот пример запроса, который был переснят с ВК через CommView.

Код:

var
  afile, signature, boundary,
  cookie, url, Headers, ret,
  multi, _post : string;
begin
 AFile := 'd:\~tmpPic.png';
// Создаем сигнатуру файла по формуле file -> content -> Base64 -> Copy 1024 bytes -> MD5
 Signature := StrTobase64(file_get_contents(AFile), 0);  // Получаем контент и кодируем в base64
 Signature := Copy(Signature, 0, 1024); // Копируем первые 1024 байта
 Signature := GetMD5(Signature); // Хэшируем в MD5

  url := 'http://vkontakte.ru/graffiti.php?to_id=46405451&group_id=0';
  cookie := 'remixsid=куки; remixchk=5';
  boundary := '----OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST';

  Headers :=
      'POST /graffiti.php?to_id=46405451&group_id=0 HTTP/1.0' + #13#10 +
      'User-Agent: Mozilla/4.8 [en](Windows NT 5.0; U)'      + #13#10 +
      'Accept: Accept: text/html;q=0.9,*/*;q=0.8'            + #13#10 +
      'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'      + #13#10 +
      'Accept-Language: ru,en-us;q=0.7,en;q=0.3'              + #13#10 +
      'Connection: close'                                    + #13#10 +
      'Referer: http://vkontakte.ru/graffiti.swf?12'          + #13#10 +
      'Host: ' + GetHost(url)                                + #13#10 +
      'Cookie: ' + cookie                                    + #13#10 +
      'Content-Length: con-len'                              + #13#10 +
      'Content-Type: multipart/form-data; boundary=' + boundary +  #13#10#13#10;

      multi :=
      boundary + #13#10 +
      'Content-Disposition: form-data; name="Signature"' + #13#10#13#10 +
      signature + #13#10 + boundary + #13#10 +
      'Content-Disposition: form-data; name="Filedata"; filename="graffiti.png"' + #13#10 +
      'Content-Type: image/png' + #13#10#13#10 +
      file_get_contents(AFile) + #13#10#13#10 + boundary;

      Headers := StringReplace(Headers, 'con-len', IntToStr(Length(multi)), []);

      _post := headers + multi;

      send_packs(GetIPAddress(GetHost(url)), 80, _post, ret);

      memo2.Text := _post;
      memo1.Text := ret;
end;

сервак ответил мне на это таким текстом:

PHP код:

HTTP/1.1 302 Found
Server
nginx/0.7.59
Date
Mon24 May 2010 20:03:09 GMT
Content
-Typetext/htmlcharset=windows-1251
Connection
close
X
-Powered-ByPHP/5.2.6-1+lenny3
Pragma
no-cache
Cache
-controlno-store
Location
graffiti.php?act=last
Vary
Accept-Encoding
Content
-Length

я перешел по локации, пришедшей мне в заголовках ответа: http://vkontakte.ru/graffiti.php?act=last и у меня открылся рисовальщик граффити вместо нужной страницы с кнопкой отправить.. что не так составленно в запросе?

Chrome~ 25.05.2010 00:47

Если меня не изменяет память, то везде должно быть не
Код:

boundary + #13#10
а
Код:

'--' + boundary + #13#10
А в самом конце не:
Код:

#13#10#13#10 + boundary
а
Код:

#13#10 + '--' + boundary + '--' + #13#10
Возможно присутствую еще какие-то незначительные ошибки.

Также, этот код относится к не наилучшему стилю:
Код:

Headers := StringReplace(Headers, 'con-len', IntToStr(Length(multi)), []);
Это нельзя использовать в String:
Код:

file_get_contents(AFile);

RedFern.89 25.05.2010 01:17

вот запрос выдранный из graffiti.swf

Код:

POST /graffiti.php?to_id=52505311&group_id=0 HTTP/1.0
Connection: close
Content-Type: multipart/form-data; boundary=----OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
Content-Length: 18773
Host: vkontakte.ru
Accept: text/html;q=0.9,*/*;q=0.8
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Accept-Language: ru,en-us;q=0.7,en;q=0.3
User-Agent: Mozilla/4.8 [ru](Windows NT 5.0; U)
Cookie: remixsid=cookies; remixchk=5

------OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
Content-Disposition: form-data; name="Signature"

a48e6e3b4b07f8e5a668ac2742998c42
------OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
Content-Disposition: form-data; name="Filedata"; filename="d:\~tmpPic.png"
Content-Type: image/png

тело файла

------OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST--


Chrome~ 25.05.2010 01:33

Цитата:

Сообщение от RedFern.89
вот запрос выдранный из graffiti.swf

Код:

POST /graffiti.php?to_id=52505311&group_id=0 HTTP/1.0
Connection: close
Content-Type: multipart/form-data; boundary=----OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
Content-Length: 18773
Host: vkontakte.ru
Accept: text/html;q=0.9,*/*;q=0.8
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Accept-Language: ru,en-us;q=0.7,en;q=0.3
User-Agent: Mozilla/4.8 [ru](Windows NT 5.0; U)
Cookie: remixsid=cookies; remixchk=5

------OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
Content-Disposition: form-data; name="Signature"

a48e6e3b4b07f8e5a668ac2742998c42
------OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
Content-Disposition: form-data; name="Filedata"; filename="d:\~tmpPic.png"
Content-Type: image/png

тело файла

------OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST--


Ну так ты присмотрись к этому рядку:
Код:

Content-Type: multipart/form-data; boundary=----OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
и этому
Код:

------OLEG-ANDREEV-PAVEL-DUROV-GRAFFITI-POST
Content-Disposition: form-data; name="Signature"


RedFern.89 25.05.2010 01:35

и реально)) Спасибо )) с этими минусами (тире) все мозги кипят просто уже! оо :o :o

Berman 25.05.2010 13:11

Разве нет api метода для загрузки граффити?

RedFern.89 25.05.2010 13:30

еть! но всеравно ты заливаешь файл на сервер. Дело не в сложности использования методов (api или стандартный вк метод). Дело в основе

Jingo Bo 26.05.2010 02:04

Цитата:

Это нельзя использовать в String
Гыгы, можно, результат будет тот же:) (P.S. Путаешь стандартные null-terminated строки, у Delphi свой формат, к сожалению)

Chrome~ 26.05.2010 09:11

Цитата:

Сообщение от Jingo Bo
Гыгы, можно, результат будет тот же:) (P.S. Путаешь стандартные null-terminated строки, у Delphi свой формат, к сожалению)

Я не исключаю что можно использовать AnsiString, но советую использовать либо array of char, либо array of byte. Так будет более правильно.

Gar|k 27.05.2010 23:18

RedFern.89 мне кажется через пару лет у тебя будет программа с интерфейсом и функциями вконтакта которая будет отправлять HTTP запросы на сервер вконтакта напрямую, а не через wеb интерфейс...

RedFern.89 учи js php mySQL и переходи уже на веб кодинг )


Время: 10:06