[Delphi] аплоад файлов на rghost.ru

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by name_00, 20 Oct 2011.

  1. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Пытаюсь сделать аплоадер для rghost.ru. Перехватил post-запрос сниффером, их даже получилось два: в первом указывается файл и еще что-то вроде id авторизации (этот самый id я легко получаю с сайта перед загрузкой файла). этот запрос отправляется на этот адрес: http://muon.rghost.ru/files?X-Progress-Id=xxxx, где progress-id - 10-значное число, которое генерируется само при начале загрузки. Второй запрос возникает сразу же после того, как файл полностью загрузится. он отправляет на адрес http://rghost.ru/multiple/calljs тот же id авторизации и еще 2 каких-то уникальных параметра (js и key), откуда он их берет, ума не приложу. сразу после второго запроса происходит редирект на ссылку с файлом. проблема моя собственно вот в чем - отправляю первый пост запрос, генерируя сам progress-id, файл отсылается на сайт и после этого он редиректится непонятно куда, вызывая ошибку 404 (по идее он должен был редиректнутся на ссылку с файлом). я думаю, что это из-за того, что я не вызвал второй запрос. но я не могу его вызвать, т.к. не знаю, откуда брать его параметры (js и key), либо он не хочет принимать сгенерированный мной progress-id. Вот код:

    Code:
    var
      authenticity_token, ProgressID: String;
      i: Integer;
      FormData: TIdMultiPartFormDataStream;
    begin
    for i:=0 to 9 do //генерируем 10 значный X-Progress-ID
      begin
        ProgressID:=ProgressID+IntToStr(Random(10));
      end;
     FormData := TIdMultiPartFormDataStream.Create;
        try
          authenticity_token:=Idhttp1.Get('http://rghost.ru/');
          authenticity_token:=copy(authenticity_token,pos('name="authenticity_token" type="hidden" value="',authenticity_token)+47,44);
          FormData.AddFormField('authenticity_token', authenticity_token);
          FormData.AddFile('file', 'D:\1.mp3', 'multipart/form-data');
          IdHTTP1.Post('http://muon.rghost.ru/files?X-Progress-ID='+ProgressID, FormData);
        finally
          FormData.Free;
        end;
    end;
    
     
  2. mironich:

    mironich: New Member

    Joined:
    7 Oct 2011
    Messages:
    25
    Likes Received:
    2
    Reputations:
    0
    Чет я Options Запроса не вижу который идет в самом начале...
     
  3. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    1. POST на http://phonon.rghost.ru/files
    2. Где параметры utf8 и commit?
    3. Откуда вообще X-Progress-ID ?
    Поправочка на счет п.1 - ссылку нужно парсить
    PHP:
    <form accept-charset="UTF-8" action="http://phonon.rghost.ru/files" enctype="multipart/form-data" id="upload_form" method="post">
     
    #3 patcher, 20 Oct 2011
    Last edited: 20 Oct 2011
  4. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    mironich:, что за Options? можно поподробнее?
    patcher, 1. сделал парсинг ссылки; 2. Задал их, но все равно никакого толку от них; 3. посмотри скриншот:
    http://i31.fastpic.ru/big/2011/1020/a5/184bda6d9bbe5e3dae8c18b9acf790a5.jpg
    вот новый код:
    Code:
    function parse(str, str2, src: String): String;
    begin
      Delete(src, 1, Pos(str,src)+Length(str)-1);
      Delete(src, Pos(str2,src), Length(src));
      Result:=src;
    end;
    .............................
    var
      authenticity_token, server, ProgressID: String;
      i: Integer;
      FormData: TIdMultiPartFormDataStream;
    begin
    for i:=0 to 9 do //генерируем 10 значный X-Progress-ID
      begin
        ProgressID:=ProgressID+IntToStr(Random(10));
      end;
     FormData := TIdMultiPartFormDataStream.Create;
        try
          authenticity_token:=Idhttp1.Get('http://rghost.ru/');
          server:=authenticity_token;
          authenticity_token:=parse('name="csrf-token" content="', '"/>', authenticity_token);
          server:='http://'+parse('<form accept-charset="UTF-8" action="http://', '" enctype', server);
          ShowMessage(authenticity_token+'  '+server);
          FormData.AddFormField('utf8', '✓');
          FormData.AddFormField('authenticity_token', authenticity_token);
          FormData.AddFile('file', 'D:\2.png', 'multipart/form-data');
          FormData.AddFormField('commit', 'Отправить');
          ShowMessage(IdHTTP1.Post(server, FormData));
        finally
          FormData.Free;
        end;
    end;
    
     
    #4 name_00, 20 Oct 2011
    Last edited: 20 Oct 2011
  5. @leks@

    @leks@ New Member

    Joined:
    28 Nov 2009
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    Если сказать примо то тут написано как в той поговорки (хочу конфеку сессть и на *** не сесть)
    или проше говаря у тебя дома оптико валоконка стоит чтоли..
    ты сначало делаешь
    Code:
     authenticity_token:=Idhttp1.Get('http://rghost.ru/');
    он неуспел оброботаться как ты там что то спытался скопировть
    и сходу ему впихнул бредятину
    Code:
    ShowMessage(IdHTTP1.Post(server, FormData));
    посмотри на свою картинку
    http://i31.fastpic.ru/big/2011/1020/a5/184bda6d9bbe5e3dae8c18b9acf790a5.jpg
    там виликая подсказка
     
  6. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    вы, уважаемый вовсе неправы! TIdHTTP не работает в отдельном потоке, потому пока не выполниться первая операция вторая не наступит, так что тут все верно.
    посмотрел и я, но подсказки я никакой там не увидел :confused: а если вы имеете в виду красный знак восклицания возле запроса (мол он не выполнился), то вы опять не правы, по скольку на скрине отображены запросы, отправляемые не его программой, а оперой

    ТС, сейчас посмотрю, попробую разобраться, но про прогрессИД я так и не понял, у меня такого и помимо нету :confused:
     
  7. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    уже не нужно, все заработало после парсинга сервера со страницы, спасибо большое за совет! все заливается и сниффер показывает в RedirectURL ссылку на файл. но возникла другая проблемка - я не знаю, как из idhttp узнать этот самый RedirectURL
     
    #7 name_00, 20 Oct 2011
    Last edited: 20 Oct 2011
  8. mironich:

    mironich: New Member

    Joined:
    7 Oct 2011
    Messages:
    25
    Likes Received:
    2
    Reputations:
    0
    Подробней в википедии , http://ru.wikipedia.org/wiki/HTTP#OPTIONS
    Это самый первый запрос который идет при заливке...
     
  9. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    mironich:, эти опции у меня указаны в инспекторе объектов на IdHTTP
     
  10. mironich:

    mironich: New Member

    Joined:
    7 Oct 2011
    Messages:
    25
    Likes Received:
    2
    Reputations:
    0
    Заголовок Location В хедере.
    ;) Ок, только нечего что это тип запроса:?
     
  11. name_00

    name_00 New Member

    Joined:
    30 May 2011
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    не про то подумал :) но все равно без них обошелся. вытащил URL, спасибо за помощь.

    выкладываю работающий код:

    Code:
    function parse(str, str2, src: String): String;
    begin
      Delete(src, 1, Pos(str,src)+Length(str)-1);
      Delete(src, Pos(str2,src), Length(src));
      Result:=src;
    end;
    ............
    var
      authenticity_token, server: String;
      FormData: TIdMultiPartFormDataStream;
    begin
     FormData := TIdMultiPartFormDataStream.Create;
        try
          authenticity_token:=Idhttp1.Get('http://rghost.ru/');
       except
         ShowMessage('Ошибка подключения!');
       end;
          server:=authenticity_token; // сделал так, чтобы не обращаться к сайту 2 раза
          authenticity_token:=parse('name="csrf-token" content="', '"/>', authenticity_token);
          server:='http://'+parse('<form accept-charset="UTF-8" action="http://', '" enctype', server);
          FormData.AddFormField('utf8', '✓');
          FormData.AddFormField('authenticity_token', authenticity_token);
          FormData.AddFile('file', Edit1.Text, 'multipart/form-data');
          FormData.AddFormField('commit', 'Отправить');
        try
          IdHTTP1.Post(server, FormData);
        except
         Edit1.Text:=IdHTTP1.Response.Location; // выводим ссылку в Edit
         FormData.Free;
        end;
    end;
     
    #11 name_00, 20 Oct 2011
    Last edited: 22 Oct 2011