Электростальский форум
Hi-Tech => Компьютеры, периферия, мультимедиа и ПО => Тема начата: LEO от 18.09.07, 17:53:02
-
давно меня посещала идея написать прогу, чтоб в файлы она сама чего-нибудь выкладывала...
сегодня появилось время, начал разбираццо... наткнулся на хорошую статью Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse) (http://vbstreets.ru/VBdotNET/Articles/66484.aspx) попытался разобраццо...
вот что опера посылает на формум, когда я указав файлы, жму "отправить" (отправил простой текстовый файл)
POST /index.php?action=downloads&d=other HTTP/1.0
User-Agent: Opera/9.23 (Windows NT 5.1; U; ru)
Host: forum.elsite.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Referer: http://forum.elsite.ru/index.php?action=downloads&d=other
Cookie: SMFCookie119172794=a%3A4%3A%7Bi%3A0%3Bs%3A4%3A%222615%22%3Bi%3A1%3Bs%3A40%3A%228625757d34278cee330ab6c6b4c3837f5744ead2%22%3Bi%3A2%3Bi%3A1364583578%3Bi%3A3%3Bi%3A0%3B%7D; PHPSESSID=2f60ebae21b1dc9b9cf868aa9d4fa98a
Cookie2: $Version=1
Proxy-Connection: close
Content-Length: 494
Content-Type: multipart/form-data; boundary=----------MmfN11OfiQhFKaQiB7bxXf
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="dir"
other/
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="userfile"; filename="testxxx.txt"
Content-Type: text/plain
testdada
blablabla =)
end of test data
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="info"
)
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="upload"
------------MmfN11OfiQhFKaQiB7bxXf--
кстати, русские буквы тут куда-то пропадают. например в поле инфо я писал тест ) - осталась одна скобка - это глюк Fiddler'a ?
что за "------------MmfN11OfiQhFKaQiB7bxXf" - которое повторяется несколько раз
Content-Disposition - это я так понял один из заголовков? тогда почему он несколько раз меняется?
пытался оформить код... на всякий случай, сначала загрузить страницу, а потом, используя куки - пытался отправить данные...
кстати, ща можно выкладывать файлы на форум вообще не залогинившись =)
' url.Text = "http://forum.elsite.ru/index.php?action=downloads&d=other"
Dim myHttpWebRequest As HttpWebRequest = HttpWebRequest.Create(url.Text)
myHttpWebRequest.Proxy = New WebProxy("127.0.0.1", 8888) ' для Fiddler
myHttpWebRequest.UserAgent = "LEO File Uploader" ' =)
Dim myHttpWebResponse As HttpWebResponse = myHttpWebRequest.GetResponse()
Dim myStreamReader As New StreamReader(myHttpWebResponse.GetResponseStream, Encoding.GetEncoding(1251))
Dim st As String = myStreamReader.ReadToEnd()
Dim sCookies As String = ""
If Not String.IsNullOrEmpty(myHttpWebResponse.Headers("Set-Cookie")) Then
sCookies = myHttpWebResponse.Headers("Set-Cookie")
End If
myHttpWebRequest = HttpWebRequest.Create(url.Text)
myHttpWebRequest.Proxy = New WebProxy("127.0.0.1", 8888)
myHttpWebRequest.Method = "POST"
myHttpWebRequest.Referer = "http://forum.elsite.ru/index.php?action=downloads&d=other"
myHttpWebRequest.UserAgent = "LEO File Uploader"
myHttpWebRequest.ContentType = "multipart/form-data"
'передаем куки, полученные в предыдущем запросе
If Not String.IsNullOrEmpty(sCookies) Then
myHttpWebRequest.Headers.Add(HttpRequestHeader.Cookie, sCookies)
End If
'ставим False, чтобы не делать автоматический редирект
myHttpWebRequest.AllowAutoRedirect = False
вот... тут все почти как в примерах в статье выше... а как дальше я не знаю =)
можно например добавить
myHttpWebRequest.Headers.Add("Content-Disposition", "form-data; name=" & Chr(34) & "dir" & Chr(34))
Dim sQueryString As String = "other/"
Dim ByteArr As Byte() = Encoding.GetEncoding(1251).GetBytes(sQueryString)
myHttpWebRequest.ContentLength = ByteArr.Length()
myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length)
но тогда уже больше в поток ничего не дописать... как сделать?
маюсь с самого утра...
-
сформулирую вопрос точнее:
что писАть в myHttpWebRequest.ContentType
если он меняетсяется несколько раз, и что надо писАть непосредственно в сам поток?
пробовал написать в поток сразу все - не работает =)
да, приведенный выше код запроса, взят из вкладки Raw в фиддлере, если нажать TextView, то там вот что:
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="dir"
other/
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="userfile"; filename="testxxx.txt"
Content-Type: text/plain
testdada
blablabla =)
end of test data
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="info"
)
------------MmfN11OfiQhFKaQiB7bxXf
Content-Disposition: form-data; name="upload"
------------MmfN11OfiQhFKaQiB7bxXf--
вот это вот, только без "------------MmfN11OfiQhFKaQiB7bxXf" я и пытался писать в поток, задав ContentType = "multipart/form-data"
как уже сказал - не пашет. форум просто выдет ту же страничку.
-
и еще вопрос... просто по html =)
<form name="upload" action="" method="POST" enctype="multipart/form-data">
эта строчка с кода страницы. action="" - страница-обработчик не указана. что используется по-дефолту? просто index.php ?
-
и еще вопрос... просто по html =)
<form name="upload" action="" method="POST" enctype="multipart/form-data">
эта строчка с кода страницы. action="" - страница-обработчик не указана. что используется по-дефолту? просто index.php ?
Если action не указан, то используется текущая страница, т.е страница на которой находиться форма.
С остальным постараюсь помочь чуть попозже.
-
жду помощи...
пока что нашел еще статью на сишарпе - http://www.codeproject.com/csharp/UploadFileEx.asp
попробовал поюзать их проект... получил практрически идентичный с браузером запрос, только в браузере файл отправился, а в проге - нет =)
opera
POST /index.php?action=downloads&d=other HTTP/1.0
User-Agent: Opera/9.23 (Windows NT 5.1; U; ru)
Host: forum.elsite.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Referer: http://forum.elsite.ru/index.php?action=downloads&d=other
Proxy-Connection: close
Content-Length: 468
Content-Type: multipart/form-data; boundary=----------FxN2SUKuxh9C7987clC0L8
------------FxN2SUKuxh9C7987clC0L8
Content-Disposition: form-data; name="dir"
other/
------------FxN2SUKuxh9C7987clC0L8
Content-Disposition: form-data; name="userfile"; filename="xtest2cs2-2.txt"
Content-Type: text/plain
c#UploadEx
test
------------FxN2SUKuxh9C7987clC0L8
Content-Disposition: form-data; name="info"
------------FxN2SUKuxh9C7987clC0L8
Content-Disposition: form-data; name="upload"
------------FxN2SUKuxh9C7987clC0L8--
prog
POST /index.php?action=downloads&d=other HTTP/1.1
Content-Type: multipart/form-data; boundary=----------8c9c9d7cb310c6a
Host: forum.elsite.ru
Content-Length: 418
Expect: 100-continue
------------8c9c9d7cb310c6a
Content-Disposition: form-data; name="dir"
other/
----------8c9c9d7cb310c6a
Content-Disposition: form-data; name="info"
----------8c9c9d7cb310c6a
Content-Disposition: form-data; name="upload"
----------8c9c9d7cb310c6a
Content-Disposition: form-data; name="userfile"; filename="xtest2cs2-2.txt"
Content-Type: text/plain
c#UploadEx
test
------------8c9c9d7cb310c6a--
отличается отстутсвием некоторых заголовков от оперы (язык, поддержка картинок и тп.)
появился какой-то заголовок Expect: 100-continue - что это, еще не разобрался
ну и еще отличие - порядок следование полей формы изменен, опера отправляет файл вторым полем, прога - последним...
и что такое boundary и как его правильно формировать... тоже еще не выяснил...
заранее спасибо за помощь...
-
Самое правильное это обратится к rfc - http://www.w3.org/Protocols/rfc2616/rfc2616.html. Вот тебе в нем про Expect: - http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20
-
Самое правильное это обратится к rfc - http://www.w3.org/Protocols/rfc2616/rfc2616.html. Вот тебе в нем про Expect: - http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20
мало там чего понятно...
пробовал перед вызовом ответа (myHttpWebResponse = myHttpWebRequest.GetResponse())
явно задать Expect путой строкой (Expect=""; )
все равно - фидлер показывает Expect: 100-continue
но все равно спасибо
вопрос остается открытым: как программно заполнить форму и отправить какой-нибудь файл в "файлы" форума?