Загрузка картинки как граффити

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fuckyoupig, 31 May 2011.

  1. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    Возникла такая проблема. Пытаюсь загрузить вконтакте картику как граффити на стену в группе.

    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
     
  2. t-s

    t-s New Member

    Joined:
    5 Mar 2011
    Messages:
    30
    Likes Received:
    4
    Reputations:
    0
    Бог с ним, с редиректом, что возвращает сервак на этот запрос?
    Должно быть что то вроде этого: ( я сейчас грузил ради интереса)

    3643<!><!>0<!>3724<!>0<!>22117876_297162763<!>http://cs9318.vkontakte.ru/u22117876/s_bae333b6.png


    Я так понял, парсишь то что выделено цветом и потом составляешь новый запрос, с хешем и тд. какой именно - глянь в снифере как контакт шлет.

    ЗЫ опять смотрю алгоритм загрузки поменялся.
     
  3. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    t-s,
    Всё это я знаю. Выше только часть кода. Я так понял, что ошибка у меня в отправке картинки на сервер, т.к. на act=last_graffiti&al=1 не так картинка, что загрудена программой.
    Мне нужно узнать где именно ошибка, в остальном я уже разберусь сам
     
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    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 и отпишись.
     
    #4 xophet, 1 Jun 2011
    Last edited: 1 Jun 2011
  5. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    Без изменений
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    перед Post:
    Form1.idHttp1.Request.ContentType:=Multi.RequestContentType;
    после Post:
    //только потом не забудь обратно вернуть 'application/x-www-form-urlencoded'
    Form1.idHttp1.Request.ContentType:='application/x-www-form-urlencoded';
    и вообще что мы тут телепатов строим из себя.
    Заголовки в студию!
    1) как должно быть
    2) что у тебя получается
     
    #6 xophet, 1 Jun 2011
    Last edited: 1 Jun 2011
  7. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    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;
     
  8. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    код это конечно хорошо, но
    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 надеюсь ты понимаешь, что его быть не должно?
     
    #8 xophet, 1 Jun 2011
    Last edited: 1 Jun 2011
  9. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    Проблема решена. Всем спасибо
     
  10. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Эм.. так в чем же она состояла? Поделись с народом на будущее!
     
  11. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    Не заметил, что сервер принимает image/png, а не image/pjpeg.
    На счёт этой строки ты был прав
     
  12. t-s

    t-s New Member

    Joined:
    5 Mar 2011
    Messages:
    30
    Likes Received:
    4
    Reputations:
    0
    Вроде оный редирект происходит при удачной загрузке граффити. Или она была загружена ранее, но не была запощена. Написал бы проще - не загружается граффити, и все. А то непонятно

    что конкретно за проблема. Толи она у тебя вообще не грузится на сервер. (bad request) Толи тебе непонятно как ее грузить на стену :)
     
  13. BestSeller

    BestSeller New Member

    Joined:
    15 May 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Таже проблема в 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");
              }
    
     
  14. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    BestSeller, Сигнатуру еще надо с картинкой отправлять
     
  15. BestSeller

    BestSeller New Member

    Joined:
    15 May 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    я так понял что сигнатура определяется когда добавляешь картинку и генерирует ее сам флеш , но как его достать оттуда?
     
  16. t-s

    t-s New Member

    Joined:
    5 Mar 2011
    Messages:
    30
    Likes Received:
    4
    Reputations:
    0
    Сигнатуру ты сам определяешь. считываешь первые 1024 байта картинки, кодируешь в base64, и все это дело в md5
     
  17. BestSeller

    BestSeller New Member

    Joined:
    15 May 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Разобрался, для кодировки в base64 юзал стандартный IdEncoderMIME, мд5 нагуглил. Всем спасибо.