[РЕШЕНО]как отправить данные на сервер по HTTP методом POST? (надо отправить много разных.)
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
[РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
тут такая проблема - есть форма на сайте, требуется заполнить поля и отправить их. есть поля TEXTAREA, но требуется задать имя этих полей. Пробовал wget, так он только что-то простое может, вроде
--post-data 'user=foo&password=bar'
или я не прав?
PS: может раздел не тот? Если что, модераторы, перенесите пожалуйста.
--post-data 'user=foo&password=bar'
или я не прав?
PS: может раздел не тот? Если что, модераторы, перенесите пожалуйста.
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
Код: Выделить всё
man -P 'less -p "-F/--form <name=content>"' curl
Код: Выделить всё
curl -i -F "userfile=@$file;type=image/png" -F "method=file" http://some.site
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
в том же пункте man-а (про --post-data) описывается и --post-file
$ man -P 'less -rp post-file' wget
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
В общем, с помощью curl'а у меня получилось отправлять данные. Но - не файлом. При попытке отправить файл командой
curl -F 'name=@file.txt' на сервер приходит пустая строка :(
Никто не знает, что я делаю не так?
(если собаку убрать, приходит строчка 'file.txt')
И зачем в curl'е <>? Пробовал по всякому - не получается.
Пока юзаю --form-string <name=string>, но вы-же понимаете, это полумера...
И непонятно, почему куки скаченные curl'ом не подходят wget'у и наоборот? Я полагал, что это простой текстовый файл...
PS: sash-kan спасибо, я так пробовал, тоже не получилось :(
К тому-же, в моём мане не написано, как задавать имя поля --post-file='name=file.txt' ?
curl -F 'name=@file.txt' на сервер приходит пустая строка :(
Никто не знает, что я делаю не так?
(если собаку убрать, приходит строчка 'file.txt')
И зачем в curl'е <>? Пробовал по всякому - не получается.
Пока юзаю --form-string <name=string>, но вы-же понимаете, это полумера...
И непонятно, почему куки скаченные curl'ом не подходят wget'у и наоборот? Я полагал, что это простой текстовый файл...
PS: sash-kan спасибо, я так пробовал, тоже не получилось :(
К тому-же, в моём мане не написано, как задавать имя поля --post-file='name=file.txt' ?
-
- Сообщения: 203
- ОС: RFRemix
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
Если это cookie идентификации сессии, то там может быть что угодно, включая user agent, у CURL и wget они могут быть разными (но можно и поменять через -A/--user-agent)
У меня такой вариант отработал (из примеров брал), в логах посмотрел, файл пришел:
Код: Выделить всё
curl -F "txtfile=@/home/nickm/Pictures/runningman.png" -F "user=foobar&pass=1234ablabla&dig=submit" http://localhost:3000/services
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
Нет. В wget всё значительно сложнее, чем в curl. В качестве аргумента --post-file передаётся временный файл, в котором вы подготовили все данные формы в виде application/x-www-form-urlencoded или multipart/form-data, на выбор.
Спасибо сказали:
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
Запускаю в одном терминале:
$ nc -l -p 8080
В другом:
$ echo hello > /tmp/tmp.tmp
$ curl -F blabla=@/tmp/tmp.tmp http://localhost:8080/
В первом появляется:
Код: Выделить всё
POST / HTTP/1.1
User-Agent: curl/7.20.0 (i686-pc-linux-gnu) libcurl/7.20.0 GnuTLS/2.10.0 zlib/1.2.3
Host: localhost:8080
Accept: */*
Content-Length: 207
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------bf52a9f2746f
------------------------------bf52a9f2746f
Content-Disposition: form-data; name="blabla"; filename="tmp.tmp"
Content-Type: application/octet-stream
hello
------------------------------bf52a9f2746f--
Всё работает.
Попробуйте повторить этот эксперимент и сообщить результат.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
/dev/random писал(а): ↑27.08.2010 09:24Всё работает.
Попробуйте повторить этот эксперимент и сообщить результат.
результат такой-же как и у вас.
Код: Выделить всё
$ nc -l -p 8080
POST / HTTP/1.1
User-Agent: curl/7.19.6 (i686-pc-linux-gnu) libcurl/7.19.6 OpenSSL/0.9.8k zlib/1.2.3 libidn/1.5
Host: localhost:8080
Accept: */*
Content-Length: 207
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------babc785690d5
------------------------------babc785690d5
Content-Disposition: form-data; name="blabla"; filename="tmp.tmp"
Content-Type: application/octet-stream
hello
------------------------------babc785690d5--
но по непонятным причинам в переменной PHP $_POST['name'] пусто.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
а можно curl'ом сформировать multipart/form-data, и отправить? я глянул в вику - ничего сложного, можно из браузера выдернуть, и подделать...
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
Да. В curl это
--data-binary @файл
В этом файле должны быть подготовленные данные. По-умолчанию подразумевается формат application/x-www-form-urlencoded, для переключения в multipart/form-data используйте
-H "Content-Type: multipart/form-data; boundary=ограничитель"
Спасибо сказали:
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
/dev/random писал(а): ↑27.08.2010 09:50Так и должно быть пусто. name=@файл - это аналог <input type=file>. Смотрите в $_FILES.
ясно. ну я примерно так и подозревал. вот только sed мне вернула <textarea></textarea>, потому выбора у меня нет.
/dev/random писал(а): ↑27.08.2010 09:58Да. В curl это
--data-binary @файл
В этом файле должны быть подготовленные данные. По-умолчанию подразумевается формат application/x-www-form-urlencoded, для переключения в multipart/form-data используйте
-H "Content-Type: multipart/form-data; boundary=ограничитель"
спасибо. осталось сделать шаблон и подставить туда нужные данные. это уже совсем просто (:
потом может развёрнутую хаутушку напишу, по этому поводу...
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
что-то не желает 
как будто ничего не отправляется...
В коде написано так:

Код: Выделить всё
* About to connect() to localhost port 80 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> POST /forum/posting.php?mode=post&f=58&sid=5a1aeeaa8d514028bf36e09391010328 HTTP/1.1
> User-Agent: curl/7.19.6 (i686-pc-linux-gnu) libcurl/7.19.6 OpenSSL/0.9.8k zlib/1.2.3 libidn/1.5
> Host: localhost
> Accept: */*
> Cookie: phpbb3_qtoic_sid=073d159488b37456671308ae9899cb15; phpbb3_qtoic_k=; phpbb3_qtoic_u=4
> Content-Type: multipart/form-data; boundary=---10e2ea3a4d70ea40de64111aa67e508f
> Content-Length: 3669
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 3669 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0} [data not shown]
< HTTP/1.1 200 OK
< Date: Fri, 27 Aug 2010 15:32:50 GMT
< Server: Apache/2.2.13 (Unix) DAV/2 PHP/5.2.10
< X-Powered-By: PHP/5.2.10
< Cache-Control: private, no-cache="set-cookie"
< Expires: 0
< Pragma: no-cache
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
<
{ [data not shown]
100 34831 0 31162 101 3669 39619 4664 --:--:-- --:--:-- --:--:-- 39951* Connection #0 to host localhost left intact
* Closing connection #0
как будто ничего не отправляется...
В коде написано так:
Код: Выделить всё
curl -b cookies.txt \
-H "Content-Type: multipart/form-data; boundary=---$BOUNDARY" \
--data-binary @form1.txt \
-v \
-o al5.html \
"http://$HOST/posting.php?mode=post&f=58&sid=$SID"
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
This post is sent with CURL
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
ну в phpbb2 и IBP у меня и wget'ом получалось... А вот в phpbb3... К тому же, мне надо тему открыть, это сложнее. И данных много.
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
Предыдущий пост я отправил с помощью curl.
Команда:
Содержимое /tmp/tmp.tmp:
Попробуйте сделать по образцу.
Команда:
Код: Выделить всё
curl -b ~/.config/midori/cookies.txt -H "Content-Type: multipart/form-data; boundary=----------------------------babc785690d5" --data-binary @/tmp/tmp.tmp http://unixforum.org/index.php?
Содержимое /tmp/tmp.tmp:
Код: Выделить всё
------------------------------babc785690d5
Content-Disposition: form-data; name="act"
Post
------------------------------babc785690d5
Content-Disposition: form-data; name="CODE"
03
------------------------------babc785690d5
Content-Disposition: form-data; name="f"
90
------------------------------babc785690d5
Content-Disposition: form-data; name="t"
116628
------------------------------babc785690d5
Content-Disposition: form-data; name="st"
0
------------------------------babc785690d5
Content-Disposition: form-data; name="auth_key"
602b//ВЫРЕЗАНО//73c5
------------------------------babc785690d5
Content-Disposition: form-data; name="fast_reply_used"
1
------------------------------babc785690d5
Content-Disposition: form-data; name="Post"
This post is sent with CURL
------------------------------babc785690d5--
Попробуйте сделать по образцу.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
что-то не получилось... а формат dos или unix?
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
/dev/random писал(а): ↑27.08.2010 22:11По спецификации должен быть DOS, но у меня прекрасно сработало и в UNIX.
ясно... просто в этом phpbb3 совсем крыша поехала у людей - движок популярный, и там проверок в коде слишком много - входные данные прогоняются через две, а то и три функции(sic!). видимо потому, и не получается.
у вас первой строкой идёт ограничитель, это так по стандарту?
и ещё, в последней строке есть два минуса после ограничителя, они играют какую-нибудь роль?
(я уже и не знаю, что и думать, пойду лучше спать, утро оно вечера мудренее...)
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
Да. Да.
И ещё, сосчитайте количество минусов в начале ограничителя: в заголовке, в поле "boundary=", их на 2 меньше, чем в самих данных.
Upd:
"Общий" формат multipart описан в секции 5.1.1 rfc2046. Отличия multipart/form-data от общего формата описаны в rfc2388.
Спасибо сказали:
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?
/dev/random, огромное вам спасибо! Я разобрался наконец с этим сложным случаем. Итак:
PS: более подробно описано здесь.
- Для отправки простых форм можно использовать curl с ключом -F:
Код: Выделить всё
curl --dump-header cookies.txt \ -F "username=username" \ -F "password=password" \ -F "sid=$SID" \ -F "redirect=index.php" \ -F "login=Вход" \ -F "redirect=./ucp.php?mode=login" \ -o al2.html \ "http://$HOST/ucp.php?mode=login"
(это для phpbb3, впрочем, работает и на других форумах) - для более сложных случаев можно отправлять особым образом сформированную форму:
Код: Выделить всё
-----{BOUNDARY} Content-Disposition: form-data; name="subject" {SUBJECT} -----{BOUNDARY} Content-Disposition: form-data; name="message" {MESSAGE} -----{BOUNDARY} Content-Disposition: form-data; name="post" Отправить -----{BOUNDARY} Content-Disposition: form-data; name="form_token" {FORM_TOKEN} -----{BOUNDARY}--
Перед отправкой с помощью sed я меняю поля в {фигурных скобках} на необходимые значения. Кроме того, данный шаблон обработан командой sed 's/$/\r', что-бы формат соответствовал стандарту. Сама команда отправки следующая:
Код: Выделить всё
curl -b cookies.txt \ -H "Content-Type: multipart/form-data; boundary=---$BOUNDARY" \ --data-binary @form1.txt \ -o al5.html \ "http://$HOST/posting.php?mode=post&f=58&sid=$SID"
Действительно, в опции -H необходимо указать на два минуса меньше, и эти два минуса следует записать в форме, в конце.
PS: более подробно описано здесь.