Возникла такая проблема. Пытаюсь загрузить вконтакте картику как граффити на стену в группе. Code: ras:='image/pjpeg'; multi:=Tidmultipartformdatastream.Create; multi.AddFormField('method','post'); multi.AddFile('file',name,ras); Page:=Form1.idhttp1.Post('http://vkontakte.ru/graffiti.php?to_id=0&group_id='+id,multi); Form1.idhttp1.Free; Page:=Form1.IdHTTP1.Get('http://vkontakte.ru/al_wall.php?act=last_graffiti&al=1'); Проблема возникает после этой строки Code: Page:=Form1.idhttp1.Post('http://vkontakte.ru/graffiti.php?to_id=0&group_id='+id,multi); Происходит редирект на "graffiti.php?act=last", далее на стену профиля. Этот редирект мне не нужен. Если поставить HandleRedirects := False, то программа останавливается и дальше никаких действий нет. Где ошибка? ЯП delphi
Бог с ним, с редиректом, что возвращает сервак на этот запрос? Должно быть что то вроде этого: ( я сейчас грузил ради интереса) 3643<!><!>0<!>3724<!>0<!>22117876_297162763<!>http://cs9318.vkontakte.ru/u22117876/s_bae333b6.png Я так понял, парсишь то что выделено цветом и потом составляешь новый запрос, с хешем и тд. какой именно - глянь в снифере как контакт шлет. ЗЫ опять смотрю алгоритм загрузки поменялся.
t-s, Всё это я знаю. Выше только часть кода. Я так понял, что ошибка у меня в отправке картинки на сервер, т.к. на act=last_graffiti&al=1 не так картинка, что загрудена программой. Мне нужно узнать где именно ошибка, в остальном я уже разберусь сам
Code: Page:=Form1.idhttp1.Post('http://vkontakte.ru/graffiti.php?to_id=0&group_id='+id,multi); [SIZE=4]Form1.idhttp1.Free; [/SIZE] Page:=Form1.IdHTTP1.Get('http://vkontakte.ru/al_wall.php?act=last_graffiti&al=1'); Я наверное чего-то недопонимаю... но ЗАЧЕМ ты уничтожаешь idhttp1? Это раз multi.AddFile('file',name,GetMIMETypeFromFile(name)); //так правильнее это два ras:='image/pjpeg' у тебя тут скорее всего ошибка, там 'image/jpeg', в общем попробуй GetMIMETypeFromFile и отпишись.
перед Post: Form1.idHttp1.Request.ContentType:=Multi.RequestContentType; после Post: //только потом не забудь обратно вернуть 'application/x-www-form-urlencoded' Form1.idHttp1.Request.ContentType:='application/x-www-form-urlencoded'; и вообще что мы тут телепатов строим из себя. Заголовки в студию! 1) как должно быть 2) что у тебя получается
Полный код Code: var ras, id,hash,pic:string; i:integer; multi: Tidmultipartformdatastream; begin try Page:=Form1.idhttp1.Get(Form1.Edit3.Text); id:=pars('{"group_id":',page,','); hash:=pars('"post_hash":"',page,'",'); for I := 0 to Form1.memo1.Lines.Count-1 do begin ras:='image/pjpeg'; multi:=Tidmultipartformdatastream.Create; multi.AddFormField('method','post'); multi.AddFile('file',Form1.Memo1.lines[i],ras); Form1.idHttp1.Request.ContentType:=Multi.RequestContentType; page:=Form1.idhttp1.Post('http://vkontakte.ru/graffiti.php?to_id=0&group_id='+id,multi); Page:=Form1.IdHTTP1.Get('http://vkontakte.ru/al_wall.php?act=last_graffiti&al=1'); pic:=pars('<!>0<!>',Page,'<!>http'); delete(pic,1,11); Data := TStringList.Create; Data.Add('act=post'); Data.Add('all=1'); Data.Add('media='+pic); Data.Add('media_type=graffiti'); Data.Add('hash=' + hash); Data.Add('to_id=-' + id); Data.Add('type=all'); Data.Add('official=1'); Page:=form1.idhttp1.Post('http://vkontakte.ru/al_wall.php', data); end; except end; data.Free; end;
код это конечно хорошо, но 1) загрузи картинку через браузер и отснифай все. 2) загрузи картинку через твою прогу и отснифай. Выкладывай заголовки и будем посмотреть где что не так. После POST верни Form1.idHttp1.Request.ContentType:='application/x-www-form-urlencoded'; иначе при следующем POST у тебя попытается отправить multipart/form-data, в общем оно ничего не отправит Так правильно: Code: Data:=TstringList.create; Try ............... Finally Data.free; end; Привыкай сразу Code: multi.AddFile('file',Form1.Memo1.lines[i],ras); Тебе было сказано твой ras на что заменить? Вот тут Code: Form1.idHttp1.Request.ContentType:=Multi.RequestCo ntentType; Какого-то фига пробел добавляет мужду Co и ntent надеюсь ты понимаешь, что его быть не должно?
Вроде оный редирект происходит при удачной загрузке граффити. Или она была загружена ранее, но не была запощена. Написал бы проще - не загружается граффити, и все. А то непонятно что конкретно за проблема. Толи она у тебя вообще не грузится на сервер. (bad request) Толи тебе непонятно как ее грузить на стену
Таже проблема в C++ билдере, не хочет загружать саму картинку. Но последнюю с http://vk.com/al_wall.php?act=last_graffiti&al=1 отправляет. Вот код: Code: AnsiString club,pars,idc,hash,link,idpost,pis; idc=http->Get(Edit1->Text); idc.Delete(1,idc.Pos("group_id\":")+9); club=idc.SubString(1,idc.Pos(",")-1); idc.Delete(1,idc.Pos("post_hash\":")+11); hash=idc.SubString(1,idc.Pos("\"")-1); TIdMultiPartFormDataStream*ass=new TIdMultiPartFormDataStream(); ass->AddFormField("method","post"); ass->AddFile("file","graffiti.png","image/png"); http->Request->ContentType=ass->RequestContentType; link="http://vk.com/graffiti.php?to_id=0&group_id="+club; http->Post(link,ass); http->Request->ContentType="application/x-www-form-urlencoded"; pars=http->Get("http://vk.com/al_wall.php?act=last_graffiti&al=1"); if(pars.Pos("http")){ pars.Delete(1,pars.Pos("<!>0<!>")); pars.Delete(1,pars.Pos("<!>0<!>")+6); idpost=pars.SubString(1,pars.Pos("<")-1); TStringList*post=new TStringList(); post->Add("act=post"); post->Add("all=1"); post->Add("media="+idpost); post->Add("media_type=graffiti"); post->Add("hash="+hash); post->Add("to_id=-"+club); post->Add("type=all"); post->Add("official=1"); http->Post("http://vk.com/al_wall.php",post); //Memo1->Lines->Add(club); ShowMessage("up"); }
я так понял что сигнатура определяется когда добавляешь картинку и генерирует ее сам флеш , но как его достать оттуда?
Сигнатуру ты сам определяешь. считываешь первые 1024 байта картинки, кодируешь в base64, и все это дело в md5