как отправить post-запрос в perl?

Elina74

Понимаю, боянный и дурацкий вопрос, но все мои потуги решить его в данном конкретном случае не увенчались успехом.
Если смотреть с помощью Live HTTP Headers, запрос получается такой:

http://smdc.sinp.msu.ru/data.py/redirect

POST /data.py/redirect HTTP/1.1
Host: smdc.sinp.msu.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: close
Content-Type: application/x-www-form-urlencoded
smdc_data: p15=p15&dy0=15&mn0=7&yr0=2001&hr0=0&mi0=0&dy1=15&mn1=7&
yr1=2001&hr1=23&mi1=0&width=1024&src=coronas_f&output=numbers
Referer: http://smdc.sinp.msu.ru/index.py?nav=coronasf
Content-Length: 0
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.x 200 OK
Date: Tue, 22 Apr 2008 19:31:07 GMT
Server: Apache/2.2.4 (Ubuntu) mod_python/3.3.1 Python/2.5.1 PHP/5.2.3-1ubuntu6.3 mod_perl/2.0.2 Perl/v5.8.8
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain

Я пишу прогу типа

use cgi;
use strict;
use LWP::UserAgent;

my ($query, $content, $ua, %header_content, $url);

$ua = LWP::UserAgent->new;
my $content = $ua->post(
'http://smdc.sinp.msu.ru/data.py/redirect',
[
'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14',
'Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
'Accept-Language' => 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
'Accept-Encoding' => 'gzip,deflate',
'Accept-Charset' => 'windows-1251,utf-8;q=0.7,*;q=0.7',
'Keep-Alive' => '300',
'Connection' => 'close',
'Content-Type' => 'application/x-www-form-urlencoded',
'smdc_data' => 'p15=p15&p265=p265&e615=e615&e36=e36&e1623=e1623&lat=lat&lng=lng&
alu=alu&dy0=15&mn0=7&yr0=2001&hr0=0&
mi0=0&dy1=15&mn1=7&yr1=2001&hr1=23&mi1=0&width=768&
src=coronas_f&output=numbers',
'Referer' => 'http://smdc.sinp.msu.ru/index.py?nav=coronasf',
'Content-Length' => '0',
'Pragma' => 'no-cache',
'Cache-Control' => 'no-cache'
]
);
print $content->as_string;

сервер мне выдает
500 - internal server error
Видимо, я не правильно сформировал запрос. Вопрос - как это сделать правильно?

pitrik2

лень ман открывать :(
при образщении к серваку ты должен 1) указать хедер 2) указать данные
хедер ты указываешь
а данные?
мне верней даж наоборот кажется
что ты указываешь хедер в том месте где указываешь данные
по идее должно быть как-то так:
$ua->header - тут все что ты указал
ua->post(а вот тут данные)
эххх
поборол лень
открыл ман
http://search.cpan.org/~gaas/libwww-perl-5.805/lib/LWP/UserA...
так и есть как я говорил, ты хедер в данные пихаешь

Elina74

2) указать данные
а данные могут быть пустыми? вся необходимая инфа, а именно, параметр smdc_data передаются в заголовке

pitrik2

не знаю что такое заголовок
в хедере передаются настройки, типа кукисы или версия браузера
в данных передаются сами данные
обычно хедер можно ваще не куказывать
$ua->post(url, ['smdc_data' => '30']);

pitrik2

а чего ты тупа из их кода не скопировал строчки?
вот их код
http://smdc.sinp.msu.ru//aux/loader.js
тебе надо вот это:

this.req.open('POST',url,true);
this.req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
this.req.setRequestHeader("Content-length", parameters.length);
this.req.setRequestHeader("Connection", "close");
this.req.setRequestHeader("smdc_data",parameters);
this.req.send('');

эти засранцы и вправду в данных ничего не отправляют, а smdc_data отправляют в хедере
это типа защита от дураков что ли?
вот твой код:

$ua->default_headers->push_header('Content-type' => "application/x-www-form-urlencoded");
...
$ua->default_headers->push_header('smdc_data' => "lalala");

Elina74

ответ тот же - 500

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->default_headers->push_header('Content-type' => 'application/x-www-form-urlencoded');
$ua->default_headers->push_header('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru;
rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14');
$ua->default_headers->push_header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;
q=0.8,image/png,*/*;q=0.5');
$ua->default_headers->push_header('Accept-Language' => 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3');
$ua->default_headers->push_header('Accept-Encoding' => 'gzip,deflate');
$ua->default_headers->push_header('Accept-Charset' => 'windows-1251,utf-8;q=0.7,*;q=0.7');
$ua->default_headers->push_header('Keep-Alive' => '300');
$ua->default_headers->push_header('Connection' => 'close');
$ua->default_headers->push_header('Content-Type' => 'application/x-www-form-urlencoded');
$ua->default_headers->push_header('smdc_data' => 'p15=p15...и проч и проч.');
$ua->default_headers->push_header('Referer' => 'http://smdc.sinp.msu.ru/index.py?nav=coronasf');
$ua->default_headers->push_header('Content-Length' => '0');
$ua->default_headers->push_header('Pragma' => 'no-cache');
$ua->default_headers->push_header('Cache-Control' => 'no-cache');
$content = $ua->post('http://smdc.sinp.msu.ru/data.py/redirect');
print $content->as_string;

Elina74

В развитие темы - подскажите, кто-нибудь, прогу, чтобы смотреть, какие запросы я отправляю на сервер. Это, вроде, называется, сниффер. Я поставил TCPView.exe, а он меня сетки лишил совсем.

AlexV769

WireShark

pitrik2

тебе же достаточно нвключить расширение лисы типа тампердата или фаербаг
и увидеть что улетает на сервак
а потом тупо это воспроизвести
потом
зачем ты опять ВСЕ свои параметры шлешь?
попробуй только те что в джаваскрипте послать
например content-type ns два раза шлешь, будь я серваком я бы на такое точно обиделся бы

Elina74

Ну, убрал копию контент-тайпа... не помогло
зачем ты опять ВСЕ свои параметры шлешь?
попробуй только те что в джаваскрипте послать

Думаешь, я не попробовал? То же самое.
Еще, скажите, не надо ли экранировать & в параметрах?

Elina74

WireShark
И какой там network interface указывать? Сам он нифига не нашел.
Интерфейс это что из нижеперечисленного? Я попробовал написать "Hackers - Ethernet адаптер", он, как и следовало ожидать, сказал, что "unable to open interface"
Hackers - Ethernet адаптер:
DNS-суффикс этого подключения . . : hackers
IP-адрес . . . . . . . . . . . . : 172.16.54.5
Маска подсети . . . . . . . . . . : 255.255.252.0
Основной шлюз . . . . . . . . . . : 172.16.52.1

pitrik2

Еще, скажите, не надо ли экранировать & в параметрах?
ну wireshark же показывает как есть
хотя может эта гадина экранирует обратно?
брррр, там же в нижнем окошечке tcpdumpp показан - дык там тож нет экранирования

pitrik2

гыгы
включил tcpdump на перл
дык там летит Smdc-Data вместо smdc_data
перл преобразовал название :(

pitrik2

ураааааааааа
получилось
в библиотеке HTTP::Headers.pm
там вначале такая строчка:

# The $TRANSLATE_UNDERSCORE variable controls whether '_' can be used
# as a replacement for '-' in header field names.

$TRANSLATE_UNDERSCORE = 1 unless defined $TRANSLATE_UNDERSCORE;

я перл не знаю, поэтому не знаю как поставить этот $TRANSLATE_UNDERSCORE заранее
я тупо поправил этот файл :)
единичку заменил на нолик
запустил твой скрипт - УРААААААА
лучше все таки узнать как править глобальные переменные другого пакета
а то чегонить другое в системе полетит...

pitrik2

блин
это ж легко

use strict;
use LWP::UserAgent;

$HTTP::Headers::TRANSLATE_UNDERSCORE = 0;

...

эхх
терь на работу опаздываю
с тебя пиво вощем :)

Elina74

Реально, ура! Работает. Ты какое пиво любишь?
Оставить комментарий
Имя или ник:
Комментарий: