Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2010, 23:27   #1
Byblick32
Пользователь
 
Аватар для Byblick32
 
Регистрация: 29.07.2010
Сообщений: 10
По умолчанию Помогите отправить фотографию ВКонтакте

Привет, мне необходимо загрузить фотографию в альбом группы.
Посмотрев на запросы при отправки фотографии из браузера в снифере определил, что отправляется на сервер.

act do_add
id 99195162
aid 99195162
gid 11271478
mid *мой_id*
hash e56317deea4628856a3d1c6547519320
vk
rhash a84bec6e644eabef86d4940a07f68edb
file1 <Place Holder for File> bmw11.jpg Content-Type: image/jpeg


file2 Content-Type: application/octet-stream


file3 Content-Type: application/octet-stream


Что это за значения и как их получить я разобрался, кроме значения переменой file1, т.е. я понимаю что там передаеться изображение, но в каком виде передать его из Delphi?

После отправления этого запроса идет редирект на
Код:
http://vkontakte.ru/photos.php?act=done_add&mid=*мой_id*&aid=99195162&gid=11271478&server=4435&photos=8254663b12:x&hash=ad157d5c54c62eab75ea128145efdccd (GET)
После этого редирект на страницу-редактор фотографии. (
Код:
http://vkontakte.ru/photos.php?act=editphotos&id=99195162&oid=-11271478&u=1
)

Разрабатывая программу, написал следующий код
Код:
procedure TForm1.Button1Click(Sender: TObject);
var params:TStringList;
res:string;
begin
Params:=TstringList.Create;
IdHTTP1.AllowCookies:=true; 
 IdHTTP1.HandleRedirects:=false;
//Авторизация в системе
Params.Add('email=my_e-mail');
Params.Add('pass=my_pass');
Params.Add('expire=');
Params.Add('vk=');
res:=idHttp1.Post('http://login.vk.com/?act=login', Params);
Memo1.Text:=res;
Params.Clear;
 s:=Copy(res, Pos('value', res)+7, 56);
Params.Add('s='+Copy(res, Pos('value', res)+7, 56));
Params.Add('op=slogin');
Params.Add('redirect=1');
Params.Add('expire=0');
Params.Add('to=');
IdHTTP1.HandleRedirects:=true;

res:=IdHttp1.Post('http://vkontakte.ru/login.php', Params);
 Memo1.Text:=res;

//авторизация проходит успешно

Params.Clear;


//переходим к загрузке изображения

Params.Add('act=do_add');
Params.Add('id=99195162');
Params.Add('aid=99195162');
Params.Add('gid=11271478');
Params.Add('mid=28229780');
Params.Add('hash=e56317deea4628856a3d1c6547519320');
Params.Add('vk=');
Params.Add('rhash=a84bec6e644eabef86d4940a07f68edb');
Params.Add('file1=C:\Scr02.jpg');  //опять же, как передавать картинку??

res:=IdHttp1.Post('http://cs4435.vkontakte.ru/upload.php', Params);
 Memo1.Text:=res; //в Мемо ничего не возвращается =(
end;
P.S. ссылка для редиректа возвращается в Location (из снифера)

Что делать после POST-запроса, передавать GET-запрос, тогда как определить URL для запроса&

Будут полезны любые рассуждения.
Byblick32 вне форума Ответить с цитированием
Старый 30.07.2010, 12:45   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Для отправки файла надо использывать IdMultipartFormData

в uses подключить IdMultipartFormData

Объявить переменную типа TIdMultiPartFormDataStream

Код:
var
  data : TIdMultiPartFormDataStream;
И подгатовить запрос
Код:
  data := TIdMultiPartFormDataStream.Create;
  data.AddFormField('act','do_add');
  ...
  data.AddFile('file1','c:\1.png','image/png');
  IdHTTP1.post('',data);
kangreon вне форума Ответить с цитированием
Старый 30.07.2010, 15:54   #3
Byblick32
Пользователь
 
Аватар для Byblick32
 
Регистрация: 29.07.2010
Сообщений: 10
По умолчанию

kangreon, большое спасибо, попробую
Byblick32 вне форума Ответить с цитированием
Старый 30.07.2010, 20:48   #4
Byblick32
Пользователь
 
Аватар для Byblick32
 
Регистрация: 29.07.2010
Сообщений: 10
По умолчанию

Еще раз привет.
Последовав совету kangreon, написал часть кода, но пришел в тупик:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var params:TStringList;
data : TIdMultiPartFormDataStream;
res,s,location,photos,hash:string;
start,stop:integer;
begin
<авторизация>
//Отправляю Post-запрос с изображением
 data := TIdMultiPartFormDataStream.Create;
data.AddFormField('act', 'do_add');
data.AddFormField('id', '99195162');
data.AddFormField('aid', '99195162');
data.AddFormField('gid', '11271478');
data.AddFormField('mid', '28229780');
data.AddFormField('hash', 'e56317deea4628856a3d1c6547519320');
data.AddFormField('vk', '');
data.AddFormField('rhash', 'a84bec6e644eabef86d4940a07f68edb');
data.AddFile('file1','c:\seo-cafe-avatar.png','image/png');

res:=IdHttp1.Post('http://cs4435.vkontakte.ru/upload.php', data);

Memo1.Text:=res; 
//После пост запроса вырезаю ссылку, на которую идет редирект (это что то типа http://vkontakte.ru/photos.php?act=done_add&mid=28229780&aid=99195162&gid=11271478&server=4435&photos=898ef646fb:x&hash=21a5b92da4f82f65679312d4c5f5e646)
 start:=Pos('action', res)+8;
 stop:= Pos('x&hash', res)+39;
Location:=Copy(res, start, stop-start);
Memo2.Text:=Location;
res:=IdHttp1.Get(location); //сдесь делаю Get-запрос с вырезанным URL
Memo1.Text:=res;// в результате чего получаю тоже самое что и при IdHttp1.Post('http://cs4435.vkontakte.ru/upload.php', data), только с другим хэшэм
Как сделать запрос с этим длинным URl'ом
Byblick32 вне форума Ответить с цитированием
Старый 30.07.2010, 20:54   #5
Byblick32
Пользователь
 
Аватар для Byblick32
 
Регистрация: 29.07.2010
Сообщений: 10
По умолчанию

В общем как последовать редиректу, ведь IdHTTP1.HandleRedirects:=true;
Byblick32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправить сообщение вконтакте Pasha_Sh Работа с сетью в Delphi 12 07.05.2012 21:13