Пытаюсь сделать аплоадер для 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;
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">
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;
Если сказать примо то тут написано как в той поговорки (хочу конфеку сессть и на *** не сесть) или проше говаря у тебя дома оптико валоконка стоит чтоли.. ты сначало делаешь Code: authenticity_token:=Idhttp1.Get('http://rghost.ru/'); он неуспел оброботаться как ты там что то спытался скопировть и сходу ему впихнул бредятину Code: ShowMessage(IdHTTP1.Post(server, FormData)); посмотри на свою картинку http://i31.fastpic.ru/big/2011/1020/a5/184bda6d9bbe5e3dae8c18b9acf790a5.jpg там виликая подсказка
вы, уважаемый вовсе неправы! TIdHTTP не работает в отдельном потоке, потому пока не выполниться первая операция вторая не наступит, так что тут все верно. посмотрел и я, но подсказки я никакой там не увидел а если вы имеете в виду красный знак восклицания возле запроса (мол он не выполнился), то вы опять не правы, по скольку на скрине отображены запросы, отправляемые не его программой, а оперой ТС, сейчас посмотрю, попробую разобраться, но про прогрессИД я так и не понял, у меня такого и помимо нету
уже не нужно, все заработало после парсинга сервера со страницы, спасибо большое за совет! все заливается и сниффер показывает в RedirectURL ссылку на файл. но возникла другая проблемка - я не знаю, как из idhttp узнать этот самый RedirectURL
Подробней в википедии , http://ru.wikipedia.org/wiki/HTTP#OPTIONS Это самый первый запрос который идет при заливке...
не про то подумал но все равно без них обошелся. вытащил 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;