PDA

Просмотр полной версии : Perl , post


$p01nt
21.02.2008, 14:52
хочу передать пост запрос на определенный сайт , он выглядит так :
name=тут имя & message= тут сообщение & id=тут индефикатор . id генерируется каждый раз разный , как его узнать ?

mr.The
21.02.2008, 14:57
Найти алгоритм генерирования или выдирать из страницы.
ЗЫ. а флудить нехарашо.

diehard
21.02.2008, 15:00
id генерируется каждый раз разный , как его узнать ?

Кем генерируется? У него и узнай.

Пост-запрос имеет такой вид:


$post = "name=$name&mess=$mess&id=$id";
$len = strlen($post);
$query = "POST /go.php HTTP/1.1\r\n".
"User-Agent: Mozillko\r\n".
"Host: host.com\r\n".
"Referer: http://host.com\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Connection: close\r\n".
"Content-Length: $len\r\n".
"\r\n".
"$post";

bul.666
21.02.2008, 15:03
Этот $id идентификатор сообщения? или капча?

$p01nt
21.02.2008, 15:13
$id идентификатор сообщения

krypt3r
21.02.2008, 15:14
use LWP::UserAgent;
use HTTP::Request;
$url = "http://site.ru";
$ua = LWP::UserAgent->new();
$req = HTTP::Request->new (POST => $url);
$req->content_type ("application/x-www-form-urlencoded");
$req->content ("name=IMYA&message=MESSAGE&id=ID");
$res = $ua->request($req);
die "Error: " . $res->status_line unless ($res->is_success);
$content = $res->content;
....

Если id - каптча, то нужно искать антикаптчу (если повезет, найдете)

$p01nt
21.02.2008, 15:17
http://paste.org.ru/?s3rkdn кто может переделать скрипт так что бы он отправлял ? на примере проще гораздо просто :)

Isis
21.02.2008, 15:20
Сначала обратиться к странице и узнать id
Найти его так:
<?php
$site = file_get_contents('http://www.antichat.ru');
preg_match("#<div>(.*)</div>#isU", $site, $out);
echo $out['1']; // Это твой id
?>
<div> - Это тэг или какой-то код который идет до определения id на странице, а </div> это тег или кусок кода, который идет после определения id на странице...
далее делаешь пост запрос, что показан выше с этим $id

$p01nt
21.02.2008, 15:23
Isis можно тоже самое только на перл ?

Isis
21.02.2008, 15:27
http://paste.org.ru/?s3rkdn кто может переделать скрипт так что бы он отправлял ? на примере проще гораздо просто :)
http://pastebin.x3k.ru/145

Не проверял

Isis
21.02.2008, 15:29
Isis можно тоже самое только на перл ?
Нет))))Не знаю перл..увы

imajo.ati
21.02.2008, 15:30
речь случайно не про гостевую на том сайте?

http://www.kyky.altnet.ru/guest/write.php
куда проще зафлудить, тем более там активная xss (но кавычки фильтрует)

$p01nt
21.02.2008, 15:37
2all !! примеры , отрывки кода и т.д. и т.п. только на PERL !
imajo.ati да про ту , я знаю - просто использую как пример

imajo.ati
21.02.2008, 16:00
именно для данного случая этот ид совсем не нужен. он не привязан ни к чему, а
потому это просто число. одно из чисел, которые сервер принимает за валидные.
проще сохранить форму на хард и наштамповать посты яваскриптом.

$p01nt
21.02.2008, 17:40
у кого нибудь будет ответ который нужен мне ? как узнать id , плз пишите на примере , ЯП обязательно перл !

imajo.ati
21.02.2008, 19:16
$p01nt
я ещё раз повторюсь. id постоянный он не генерируется. посмотри. 41c3c0244c353
сколько страницу не обновляй id будет один и тот же.
имхо неудачный пример для тренировки


а на твой вопрос уже ответил Isis, пост №8

bul.666
21.02.2008, 19:19
$p01nt Стучи в Осику напишем

Piflit
21.02.2008, 19:52
можно тоже самое только на перл ?
use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
my $res = $ua->post($url,
[ 'param1' => 'val1',
'param2' => 'val2', ],
'header1' => 'val1',
'header2' => 'val2',
);
etc

bul.666
22.02.2008, 20:15
Пиф он имел регулярку ^^

Php:

$site = file_get_contents('http://www.antichat.ru');
preg_match("#<div>(.*)</div>#isU", $site, $out);
echo $out['1']; // Это твой id

Perl: (Покажу напримера файла)
Сделал файл page.html с содержанием:

<html>
<head>
<title>PERL regexp</title>
</head>
<body>
<h1>File where I serach text</h1>
<DIV>I NEED THIS TEXT</DIV>
</body>
</html>

Тут I NEED THIS TEXT то что нам надо искать...
Вот perl скрипт:

#!/usr/bin/perl

open(DATAFILE, "scr/page.html") || die "Cannot open DATAFILE";
while(defined($file = <DATAFILE>))
{
if($file=~m%(<DIV>(.*)</DIV>)%igs)
{
$file=~s%(<DIV>(.*)</DIV>)%%igs;
print "Result: $2";
}
}


Запустил, результат:

C:\Perl\bin>perl scr/reg.pl
Result: I NEED THIS TEXT
C:\Perl\bin>

Piflit
22.02.2008, 22:03
#!/usr/bin/perl

open(DATAFILE, "scr/page.html") || die "Cannot open DATAFILE";
while(defined($file = <DATAFILE>))
{
if($file=~m%(<A>(.*)</A>)%igs)
{
$file=~s%(<A>(.*)</A>)%%igs;
print "Result: $2";
}
}



#!/usr/bin/perl -w #вроде этот ключ исправляет некоторые ошибки в коде

open(DATAFILE, "scr/page.html") || die "Cannot open DATAFILE";
while(<DATAFILE>)
{
if(m/<A>(.+)<(backslash)/A>/igs)
{
s/<A>(.+)<(backslash)/A>/igs;
print "Result: ".$_;
}
}
close(DATAFILE);


^^

bul.666
22.02.2008, 22:33
^^
C:\Perl\bin>perl scr/reg.pl
Bareword found where operator expected at scr/reg.pl line 6, near "m/<A>(.+)<(ba
ckslash)/A"
Unquoted string "backslash" may clash with future reserved word at scr/reg.pl li
ne 8.
syntax error at scr/reg.pl line 6, near "m/<A>(.+)<(backslash)/A"
Search pattern not terminated at scr/reg.pl line 8.

(backslash)
А не легче экранировать?
<\/DIV>

my $s='<html> <head> <title>PERL regexp</title> </head>
<body> <h1>File where I serach text</h1>
<DIV>I NEED THIS TEXT</DIV>
</body>
</html>';
print "Result : $1 " if $s=~/<DIV>(.+)<\/DIV>/;
Более ч0ткий пример (c) demonoid

Piflit
22.02.2008, 22:46
C:\Perl\bin>perl scr/reg.pl
Bareword found where operator expected at scr/reg.pl line 6, near "m/<A>(.+)<(ba
ckslash)/A"
Unquoted string "backslash" may clash with future reserved word at scr/reg.pl li
ne 8.
syntax error at scr/reg.pl line 6, near "m/<A>(.+)<(backslash)/A"
Search pattern not terminated at scr/reg.pl line 8.

бугага. в теге [php] бэкслеши '\' не отображаются, поэтому я заменил его словом. еще раз бугага

Spyder
22.02.2008, 22:47
ыыы, backslash
\/

bul.666
22.02.2008, 23:02
Пиф ты вообще свой код проверял? Меня очень сильно возбудила 8 линия ^^ +)

Piflit
22.02.2008, 23:26
s/<A (.+)<(backslash)/A>//igs;
вот так =)
это если надо тереть линки.
я просто немного переписал твой код. я хз че он должен делать =))

Isis
23.02.2008, 03:20
s/<A (.+)\\/A>//igs;

bul.666
23.02.2008, 03:58
Он должен выдерать текст между <div> и </div>

ZET36
23.02.2008, 04:49
как понял начало нужно написат парсер выдирающий из страницы нужное нам значение.
возбмём в пример яндэкс например нам нужно узнать значение id из этой строки (17 строка ответа)
</script><table id=head><tr> итд .....
и отправить запрос с этим значением запрос скажем запрос будет
http://www.yandex.ru/yandsearch?text=значение



use Socket;

$host="www.yandex.ru";
$port="80";

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);

connect(SOCK, $paddr);
send (SOCK, "GET / HTTP/1.0\n\n", 0);

@data=<SOCK>; # ответ сервера
close(SOCK);

$fullitself=@data[17]; # считаем в какой строке ответа нужное нам значение она 17тая

@temp=split('table id=',$fullitself); # table id= это символы которые идут перед нашим значением
@semp=split('>',@temp[1]); # > а этот символ после нашего значения
$id = @semp[0]; # и так наше значение это переменная $id









connect(SOCK, $paddr);
send (SOCK, "GET /yandsearch?text=",$id," HTTP/1.0\n\n", 0); #отправляем запрос

@data2=<SOCK>;
close(SOCK);

# извените если гденибуть ошибся, не проверял




но вот если позиция строки постоянно меняется в ответе нужно будет ещё писать цикл который будет находить эту строку переберая каждую в этом массиве.

но намного легче это будет реализовать в пхп так как там есть специальная функция которая исчет ключ по значению array_search(" значение", $массив);

ZET36
23.02.2008, 05:04
и к тому же поле "Город" там нефильтруется. активнаяя хсс

bul.666
23.02.2008, 08:55
use Socket;

$host="www.yandex.ru";
$port="80";

$NEED_STR = "<table id=__STRING__>"; #Строка поиска

@parse_need = split("__STRING__",$NEED_STR);
#print @parse_need[1];
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);

connect(SOCK, $paddr);
send (SOCK, "GET / HTTP/1.0\n\n", 0);

@data=<SOCK>;
close(SOCK);

$size = @data;
for ($i=0;$i<$size;$i++) {
$fullitself=@data[$i];

@temp=split(@parse_need[0],$fullitself);
@semp=split(@parse_need[1],@temp[1]);
$id = @semp[0];
}

if ($id) {
print "\n\n[!] FOUND STRING: '$id'\n\n";
}else {
print "\n\n[!] NOT FOUND\n\n";
}


Вот кстати небольшой тюнинг твоего скриптенга:
$NEED_STR = "<table id=__STRING__>";

Тут вводишь строку которую надо искать;
__STRING__ Отмечено место, где будет выдран текст для вставки в $id

bul.666
23.02.2008, 09:29
Ах ну да еще ты хотел поиск по яндексу =)
Короче я сделал, чтобы выводил количество найденых результатов
Вот полный скрипт:

#!/usr/bin/perl
use Socket;

$host="www.yandex.ru";
$port="80";

$NEED_STR = "<table id=__STRING__>";

@parse_need = split("__STRING__",$NEED_STR);

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);

connect(SOCK, $paddr);
send (SOCK, "GET / HTTP/1.0\n\n", 0);

@data=<SOCK>;
close(SOCK);

$size = @data;
for ($i=0;$i<$size;$i++) {
$fullitself=@data[$i];

@temp=split(@parse_need[0],$fullitself);
@semp=split(@parse_need[1],@temp[1]);
$id = @semp[0];
}

if ($id) {
print "\n\n[!] FOUND STRING: '$id'\n\n";
}else {
print "\n\n[!] NOT FOUND\n\n";
}

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

connect(SOCK, $paddr);
$header = "GET /yandsearch?text=".$id." HTTP/1.0\r\n"
."User-Agent: Opera/10.84 (Windows NT 5.1; U; ru)\r\n"
."Host: www.yandex.ru\r\n"
."Referer: http://yandex.ru/\r\n"
."Proxy-Connection: close\r\n"
."Content-type: application/x-www-form-urlencoded\r\n\r\n";

send (SOCK, $header, 0);

@data2=<SOCK>;
close(SOCK);

$size = @data2;

for ($i=0;$i<$size;$i++) {
$fullitself=@data2[$i];

$fullitself =~ s/(&.*?;)//egs;
if ($fullitself =~m/<b>[0-9]/) {
$fullitself =~/\b([0-9]+)/;
$result = $1;
}
}

if ($result) {
print "\n\n[!] YANDEX FOUND '$result' PAGES WITH '$id'\n\n";
}else {
print "\n\n[!] NOT FOUND\n\n";
}


Резултат скрипта с текущим содержанием:


C:\Perl\bin>perl scr\get.pl


[!] FOUND STRING: 'head'



[!] YANDEX FOUND '14878927' PAGES WITH 'head'

biophreak
24.02.2008, 01:40
use warnings;
use strict;
В начало скрипта :))) И правим его :)