[РЕШЕНО]как отправить данные на сервер по HTTP методом POST? (надо отправить много разных.)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

[РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

тут такая проблема - есть форма на сайте, требуется заполнить поля и отправить их. есть поля TEXTAREA, но требуется задать имя этих полей. Пробовал wget, так он только что-то простое может, вроде
--post-data 'user=foo&password=bar'
или я не прав?

PS: может раздел не тот? Если что, модераторы, перенесите пожалуйста.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение SLEDopit »

Код: Выделить всё

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.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение sash-kan »

drBatty писал(а):
24.08.2010 00:07
Пробовал wget, так он только что-то простое может, вроде
--post-data 'user=foo&password=bar'
в том же пункте man-а (про --post-data) описывается и --post-file
$ man -P 'less -rp post-file' wget
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

В общем, с помощью curl'а у меня получилось отправлять данные. Но - не файлом. При попытке отправить файл командой
curl -F 'name=@file.txt' на сервер приходит пустая строка :(
Никто не знает, что я делаю не так?
(если собаку убрать, приходит строчка 'file.txt')
И зачем в curl'е <>? Пробовал по всякому - не получается.

Пока юзаю --form-string <name=string>, но вы-же понимаете, это полумера...

И непонятно, почему куки скаченные curl'ом не подходят wget'у и наоборот? Я полагал, что это простой текстовый файл...

PS: sash-kan спасибо, я так пробовал, тоже не получилось :(
К тому-же, в моём мане не написано, как задавать имя поля --post-file='name=file.txt' ?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
nickm
Сообщения: 203
ОС: RFRemix

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение nickm »

drBatty писал(а):
27.08.2010 07:59
И непонятно, почему куки скаченные curl'ом не подходят wget'у и наоборот? Я полагал, что это простой текстовый файл...

Если это 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
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

drBatty писал(а):
27.08.2010 07:59
К тому-же, в моём мане не написано, как задавать имя поля --post-file='name=file.txt' ?

Нет. В wget всё значительно сложнее, чем в curl. В качестве аргумента --post-file передаётся временный файл, в котором вы подготовили все данные формы в виде application/x-www-form-urlencoded или multipart/form-data, на выбор.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

drBatty писал(а):
27.08.2010 07:59
При попытке отправить файл командой curl -F 'name=@file.txt' на сервер приходит пустая строка :(

Запускаю в одном терминале:
$ 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--

Всё работает.
Попробуйте повторить этот эксперимент и сообщить результат.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

/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'] пусто.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

а можно curl'ом сформировать multipart/form-data, и отправить? я глянул в вику - ничего сложного, можно из браузера выдернуть, и подделать...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

drBatty писал(а):
27.08.2010 09:33
но по непонятным причинам в переменной PHP $_POST['name'] пусто.

Так и должно быть пусто. name=@файл - это аналог <input type=file>. Смотрите в $_FILES.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

drBatty писал(а):
27.08.2010 09:44
а можно curl'ом сформировать multipart/form-data, и отправить? я глянул в вику - ничего сложного, можно из браузера выдернуть, и подделать...

Да. В curl это
--data-binary @файл
В этом файле должны быть подготовленные данные. По-умолчанию подразумевается формат application/x-www-form-urlencoded, для переключения в multipart/form-data используйте
-H "Content-Type: multipart/form-data; boundary=ограничитель"
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

/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=ограничитель"


спасибо. осталось сделать шаблон и подставить туда нужные данные. это уже совсем просто (:
потом может развёрнутую хаутушку напишу, по этому поводу...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

что-то не желает :(

Код: Выделить всё

* 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"
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

This post is sent with CURL
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

/dev/random писал(а):
27.08.2010 19:55
This post is sent with CURL

ну в phpbb2 и IBP у меня и wget'ом получалось... А вот в phpbb3... К тому же, мне надо тему открыть, это сложнее. И данных много.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

Предыдущий пост я отправил с помощью curl.
Команда:

Код: Выделить всё

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--


Попробуйте сделать по образцу.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

/dev/random писал(а):
27.08.2010 20:00
Попробуйте сделать по образцу.

что-то не получилось... а формат dos или unix?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

drBatty писал(а):
27.08.2010 21:50
что-то не получилось... а формат dos или unix?

По спецификации должен быть DOS, но у меня прекрасно сработало и в UNIX.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

/dev/random писал(а):
27.08.2010 22:11
По спецификации должен быть DOS, но у меня прекрасно сработало и в UNIX.

ясно... просто в этом phpbb3 совсем крыша поехала у людей - движок популярный, и там проверок в коде слишком много - входные данные прогоняются через две, а то и три функции(sic!). видимо потому, и не получается.
/dev/random писал(а):
27.08.2010 20:00
Содержимое /tmp/tmp.tmp:

у вас первой строкой идёт ограничитель, это так по стандарту?
и ещё, в последней строке есть два минуса после ограничителя, они играют какую-нибудь роль?
(я уже и не знаю, что и думать, пойду лучше спать, утро оно вечера мудренее...)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение /dev/random »

drBatty писал(а):
27.08.2010 23:00
у вас первой строкой идёт ограничитель, это так по стандарту?
и ещё, в последней строке есть два минуса после ограничителя, они играют какую-нибудь роль?

Да. Да.
И ещё, сосчитайте количество минусов в начале ограничителя: в заголовке, в поле "boundary=", их на 2 меньше, чем в самих данных.

Upd:
"Общий" формат multipart описан в секции 5.1.1 rfc2046. Отличия multipart/form-data от общего формата описаны в rfc2388.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [РЕШЕНО]как отправить данные на сервер по HTTP методом POST?

Сообщение drBatty »

/dev/random, огромное вам спасибо! Я разобрался наконец с этим сложным случаем. Итак:

  • Для отправки простых форм можно использовать 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: более подробно описано здесь.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: