The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Помогите считать страничку сайта"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (Perl)
Изначальное сообщение [ Отслеживать ]

"Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 11-Окт-13, 16:48 
Изучаю Перл, поэтому другие языки не предлагать.
Вот что дает браузер при входе
http://www.the-game.ru/overview/

POST /overview/ HTTP/1.1
Host: www.the-game.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.the-game.ru/
Cookie: __utma=167751035.95729135.1381258042.1381418287.1381472011.7; __utmz=167751035.1381258042.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=167751035.1.10.1381472011; __utmc=167751035; SID=9762509YNMSUUNKXBNQWAJBXAMD
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 34
action=login&login=t1est&pwd=t1est

Вот что на данный момент имею. Пробовал уже сотни вариантов. Помогите пожалуйста.

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
my $login='test11';
my $pass='test11';
my $url="http://www.the-game.ru/overview/";
$ua->agent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0");
use HTTP::Cookies;
  $ua->cookie_jar( HTTP::Cookies->new(
    'file' => '/some/where/cookies.lwp',        #файл обмена
    'autosave' => 1,       #по завершении, сохранять ли файл
  ));
#  $ua->referer ("www.the-game.ru");
my $req = HTTP::Request->new(POST => $url,[


Host=> 'www.the-game.ru',
User-Agent=> 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0',
Accept=> 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
Accept-Language=> 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
Accept-Encoding=> 'gzip, deflate',
Referer=> 'http://www.the-game.ru/',
pwd=>t1est,
login=>t1est,
#action=>action,
action=> 'login&login=t1est&pwd=t1est',
]);
my $res = $ua->request($req);
$res = $res->as_string;
open FILE, '>ww.xls';
   print FILE "$res \n $url";

C этической стороны проблем нет. Есть не менее 10-ка человек сделавших то же самое, некоторые есть и в открытом доступе, но там писали профессионалы и разобраться в их коде для меня тяжко.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Помогите считать страничку сайта"  +/
Сообщение от михалыч (ok) on 11-Окт-13, 18:06 
>[оверквотинг удален]
> Referer=> 'http://www.the-game.ru/',
> pwd=>t1est,
> login=>t1est,
> #action=>action,
> action=> 'login&login=t1est&pwd=t1est',
> ]);
> my $res = $ua->request($req);
>  $res = $res->as_string;
> open FILE, '>ww.xls';
>    print FILE "$res \n $url";

А wget'ом категорически "низя"?

wget -x --output-document=thegameru.html --post-data 'action=login&login=t1est&pwd=t1est' http://www.the-game.ru/overview/

при необходимости добавить
--referer=URL (включить в HTTP-запрос заголовок Referer: URL)
--no-check-certificate (не проверять сертификат)

--output-file=logfiledownload (записывать отладку в файл журнала загрузки)

--user-agent=agent-string (прикинуться черным шлангом ))

--no-cookies (отключить куки)
--load-cookies file (загрузить куки из файла)
--save-cookies file (сохранить куки в файл)
--keep-session-cookies (сохранить сессионные куки)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 14-Окт-13, 22:06 

> А wget'ом категорически "низя"?

Я же хочу потом и дальше со страничкой работать. Посему очень хочется на Перле, там потом будут готовые скрипты вставляться.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Помогите считать страничку сайта"  +/
Сообщение от михалыч (ok) on 15-Окт-13, 07:17 
>> А wget'ом категорически "низя"?
> Я же хочу потом и дальше со страничкой работать. Посему очень хочется
> на Перле, там потом будут готовые скрипты вставляться.

Не вопрос.
Получаете страницу wget'ом, открываете её в perl'е и потрошите её как вам надо.

А если категорически "низя", но очень хочется и надо через perl, то можно и perl.
Есть такой wget для perl, называется curl )))
С ним что угодно можно скачать и залить. Очень мощный инструмент. Различных плюшек и примочек к нему масса.

Вам потребуется:
WWW::Curl::Easy и собственно сам curl

Не знаю вашу ОС, если FreeBSD, то нужно следующее:
cd /usr/ports/ftp/curl/
make install clean
cd /usr/ports/www/p5-WWW-Curl/
make install clean
rehash

Если начать установку сразу с p5-WWW-Curl, то она автоматически потянет за собой и curl.

#!/usr/bin/perl


use strict;
use warnings;
use WWW::Curl::Easy;


my $curl = WWW::Curl::Easy->new() or die "curl init failed!\n";


$curl->setopt(CURLOPT_VERBOSE, 1);
$curl->setopt(CURLOPT_FOLLOWLOCATION, 1);


my @headers = (
    "User-Agent: Mozilla/5.0",
    "Referer: http://www.the-game.ru/",
    "Content-Type: application/x-www-form-urlencoded"
);
$curl->setopt(CURLOPT_HTTPHEADER, \@headers);


my $url = "http://www.the-game.ru/overview/";
$curl->setopt(CURLOPT_URL, $url);


my $user = 't1est';
my $pass = 't1est';
$curl->setopt(CURLOPT_POSTFIELDS, "action=login&login=$user&pwd=$pass");


sub body_callback {
    my ( $chunk, $context ) = @_;
    push @{$context}, $chunk;
    return length ( $chunk );
}


$curl->setopt(CURLOPT_WRITEFUNCTION, \&body_callback);


my @body;
$curl->setopt(CURLOPT_FILE, \@body);


if ($curl->perform() != 0) {
    print "Failed ::".$curl->errbuf."\n";
};


$curl->cleanup;


print join ( "", @body );


my $filename = "/tmp/thegameru.html";


open  FH, ">", $filename;
print FH @body;
close FH;

CURLOPT_VERBOSE - выводит дополнительную информацию, записывает вывод в поток STDERR, или файл, указанный параметром CURLOPT_STDERR

CURLOPT_STDERR - альтернативный файл для вывода ошибок, используемый вместо потока ошибок STDERR

CURLOPT_FOLLOWLOCATION - рекурсивно следует за всеми заголовкам "Location: ", отправленным сервером в своем ответе, за исключением случая, когда установлена константа CURLOPT_MAXREDIRS

CURLOPT_MAXREDIRS - максимальное количество принимаемых редиректов, используется вместе с параметром CURLOPT_FOLLOWLOCATION

CURLOPT_HTTPHEADER - массив устанавливаемых HTTP-заголовков

CURLOPT_URL - загружаемый URL

CURLOPT_POSTFIELDS - передаваемые данные('var1=val1&var2=val2&...')/файлы для передачи в HTTP POST-запросе

CURLOPT_WRITEFUNCTION - название callback-функции, принимающей два параметра. Первым параметром является дескриптор cURL, а вторым параметром является строка с записываемыми данными. Данные должны быть сохранены с помощью данной функции. Она должна возвратить точное количество записанных байт, иначе закачка будет прервана с ошибкой.

CURLOPT_FILE - файл, в который будет записан результат передачи

CURLOPT_WRITEDATA – объект, в который производится запись принимаемых данных

Если работаете с cookies, то:

CURLOPT_COOKIE - содержимое заголовка "Cookie: ", используемого в HTTP-запросе, несколько cookies разделяются точкой с запятой с последующим пробелом (например, "fruit=apple; colour=red")

CURLOPT_COOKIEFILE - файл, содержащий cookies, данный файл должен быть в формате Netscape или просто заголовками HTTP, записанными в файл

CURLOPT_COOKIEJAR - файл, в который будут сохранены все внутренние cookies текущей передачи после закрытия дескриптора, например, после вызова curl_close

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Помогите считать страничку сайта"  +/
Сообщение от mpasl email(ok) on 15-Окт-13, 08:46 
Спасибо, буду курить.
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 17-Окт-13, 12:40 
> Спасибо, буду курить.

Все таки хочу решить проблему стандартными библиотеками. Узнал, мне надо определить
Content-Length:
Со всеми остальными данными разобрался. Параллельно пытаюсь сделать то же самое на socket-ах  но там проблема, http 1.0 - все ок, http 1.1. - HTTP/1.1 400 Bad Request

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Помогите считать страничку сайта"  +/
Сообщение от михалыч (ok) on 17-Окт-13, 15:04 
>> Спасибо, буду курить.
> Все таки хочу решить проблему стандартными библиотеками. Узнал, мне надо определить
> Content-Length:
> Со всеми остальными данными разобрался. Параллельно пытаюсь сделать то же самое на
> socket-ах  но там проблема, http 1.0 - все ок, http
> 1.1. - HTTP/1.1 400 Bad Request

Вам надо посчитать Content-Length и запихнуть в массив заголовков и обязательно передать?
Заменить

my @headers = (
    "User-Agent: Mozilla/5.0",
    "Referer: http://www.the-game.ru/",
    "Content-Type: application/x-www-form-urlencoded"
);
$curl->setopt(CURLOPT_HTTPHEADER, \@headers);

my $url = "http://www.the-game.ru/overview/";
$curl->setopt(CURLOPT_URL, $url);

my $user = 't1est';
my $pass = 't1est';
$curl->setopt(CURLOPT_POSTFIELDS, "action=login&login=$user&pwd=$pass");

на

my $user = 't1est';
my $pass = 't1est';

my $post_send = "action=login&login=$user&pwd=$pass";

my $cont_len = length $post_send;

my @headers = (
    "User-Agent: Mozilla/5.0",
    "Referer: http://www.the-game.ru/",
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: $cont_len"
);
$curl->setopt(CURLOPT_HTTPHEADER, \@headers);

my $url = "http://www.the-game.ru/overview/";
$curl->setopt(CURLOPT_URL, $url);

$curl->setopt(CURLOPT_POSTFIELDS, "$post_send");

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 17-Окт-13, 23:02 
> Вам надо посчитать Content-Length и запихнуть в массив заголовков и обязательно передать?

Если уж быть совсем кратко, мне надо передать вот такой запрос,
[pre]POST /overview/ HTTP/1.1
Host: www.the-game.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.the-game.ru/
Cache-Control: max-age=0
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Content-Type: application/x-www-form-urlencoded
Content-Length: 34


action=login&login=t1est&pwd=t1est
[/pre]
по протоколу HTTP/1.1 методом пост, библиотеками, входящих в activ perl под виндовс и получить в ответ страничку. Как вариант найти способ самому смотреть на запросы, которые я посылаю, что бы иметь возможность приводить их к правильному виду. Я пытаюсь послать такой запрос через сокеты и через LWP. Но не получается.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Помогите считать страничку сайта"  +/
Сообщение от михалыч (ok) on 18-Окт-13, 05:21 
>[оверквотинг удален]
> Cache-Control: max-age=0
> Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
> Content-Type: application/x-www-form-urlencoded
> Content-Length: 34
> action=login&login=t1est&pwd=t1est
> по протоколу HTTP/1.1 методом пост, библиотеками, входящих в activ perl под виндовс
> и получить в ответ страничку. Как вариант найти способ самому смотреть
> на запросы, которые я посылаю, что бы иметь возможность приводить их
> к правильному виду. Я пытаюсь послать такой запрос через сокеты и
> через LWP. Но не получается.

Запихнул в массив

my @headers = (
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0",
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding: gzip, deflate",
    "Referer: http://www.the-game.ru/",
    "Cache-Control: max-age=0",
    "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3",
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: $cont_len"
);


отправил и получил


POST /overview/ HTTP/1.1
Host: www.the-game.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.the-game.ru/
Cache-Control: max-age=0
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Content-Type: application/x-www-form-urlencoded
Content-Length: 34

< HTTP/1.1 200 OK
< Server: nginx/1.1.19
< Date: Fri, 18 Oct 2013 01:14:43 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Set-Cookie: SID=9774074IPDWWLGAPFVWICRJGPTC; path=/
< Cache-Control: no-cache
< Expires: Fri, 18 Oct 2013 00:58:03 GMT
< Content-Encoding: gzip


Похоже на ваш образец.
Вроде и curl под винду есть?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 18-Окт-13, 17:58 
Кто-нибудь может помочь переделать скрипт с Сокет на LWP?
Причина, как я понял сокет не умеет автоматически генерировать куки.
#!perl
use IO::Socket;
my $res; my @res;
my $url="www.the-game.ru";
my $port="http(80)";
my $sock = IO::Socket::INET->new( # объявляем сокет
    Proto => "tcp", # указываем протокол
    PeerAddr => $url, # указываем доменное имя или ip
    PeerPort => $port # указываем сервис и порт
    );
if($sock) { # проверяем, удачно ли открылся сокет
    $sock->autoflush(1); # отключаем буферизацию
    print $sock "POST http://.$url./overview/ HTTP/1.1\nPOST http://www.the-game.ru/overview HTTP/1.1\nHost: www.the-game.ru\nUser-Agent: Mozilla//5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko//20100101 Firefox//24.0\nAccept: text//html,application//xhtml+xml,application//xml;q=0.9,*//*;q=0.8\nAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\nReferer: http://www.the-game.ru/\nCache-Control: max-age=0\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\nContent-Type: application/x-www-form-urlencoded\nContent-Length: 34\n\naction=login&login=t1est&pwd=t1est\n\n";
    while( $res = <$sock>) { # читаем ответ из сокета
        push @res,$res;
    }
    close($sock); # закрываем сокет
}
open FILE, '>ww.xls';
print FILE "@res \n ";
Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Помогите считать страничку сайта"  +1 +/
Сообщение от михалыч (ok) on 20-Окт-13, 19:33 
> Кто-нибудь может помочь переделать скрипт с Сокет на LWP?

Лови:

#!/usr/bin/perl


use strict;
use warnings;
use LWP::UserAgent;


my $url = 'http://www.the-game.ru/overview/';
my $referer = 'http://www.the-game.ru/';


my $user = 't1est';
my $pass = 't1est';


my %params = (
    'action' => 'login',
    'login'  => $user,
    'pwd'    => $pass
);


my %headers = (
    'User-Agent'      => 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0',
    'Accept'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' => 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding' => 'gzip, deflate',
    'Referer'         => $referer,
    'Cache-Control'   => 'max-age=0',
    'Accept-Charset'  => 'windows-1251,utf-8;q=0.7,*;q=0.3',
    'Content-Type'    => 'application/x-www-form-urlencoded',
);


my $browser = LWP::UserAgent->new();
$browser->cookie_jar({});


my $response = $browser->post($url, \%params, \%headers);


if ( $response->is_error() ) {
    printf " %s\n", $response->status_line;
} else {
    print $response->content;
#    print $response->as_string;
}


Забыл про ваш "Content-Length", его же обязательно нужно указывать и считать?

Вот другой вариант, кстати, здесь заголовки представлены массивом, а не хешем, как в предыдущем примере.

#!/usr/bin/perl


use strict;
use warnings;
use LWP::UserAgent;


my $url = 'http://www.the-game.ru/overview/';
my $referer = 'http://www.the-game.ru/';


my $user = 't1est';
my $pass = 't1est';


my $params = "action=login&login=$user&pwd=$pass";
my $cont_len = length $params;


my @headers = (
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0",
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding: gzip, deflate",
    "Referer: $referer",
    "Cache-Control: max-age=0",
    "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3",
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: $cont_len"
);

my $browser = LWP::UserAgent->new();
$browser->cookie_jar({});


my $response = $browser->post($url, \@headers, Content => $params);


if ( $response->is_error() ) {
    printf " %s\n", $response->status_line;
} else {
    print $response->content;
#    print $response->as_string;
}


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 21-Окт-13, 14:31 
Огромнейшее спасибо. В этих 2-х примерах сложено все что я хотел изучить и понять. Я Ваш должник. :). До меня дошли все мои ошибки.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Помогите считать страничку сайта"  +/
Сообщение от михалыч (ok) on 21-Окт-13, 16:09 
> Огромнейшее спасибо. В этих 2-х примерах сложено все что я хотел изучить
> и понять. Я Ваш должник. :). До меня дошли все мои
> ошибки.

Да, ладно!

Делай добро и бросай его в воду! (С)
Может и вы, в свою очередь, кому-нибудь, когда-нибудь поможете. ))

Давайте, я вам примерчик с сокетом подкину.
Посмотрите его внимательно, сравните с вашим, разница в мелочах, но именно она оказывает существенное значение.

#!/usr/bin/perl


use strict;
use warnings;
use IO::Socket;


my $url = 'www.the-game.ru';
my $referer = 'http://www.the-game.ru/';


my $user = 't1est';
my $pass = 't1est';


my $params = "action=login&login=$user&pwd=$pass";
my $cont_len = length $params;


my @headers = (
    "POST http://$url/overview/ HTTP/1.0",
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0",
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding: gzip, deflate",
    "Referer: $referer",
    "Cache-Control: max-age=0",
    "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3",
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: $cont_len","",
    "$params",""
);


my $sock = new IO::Socket::INET (
    PeerAddr => $url,
    PeerPort => '80',
    Proto    => 'tcp',
);
die "Could not create socket: $!\n" unless $sock;


$sock->autoflush(1);


my $socket = join("\n", @headers);


print $sock $socket;


while ( <$sock> ) { print }


close $sock;

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Помогите считать страничку сайта"  +1 +/
Сообщение от михалыч (ok) on 22-Окт-13, 09:13 
Предыдущий пример можно и без промежуточного массива.

#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket;

my $url = 'www.the-game.ru';
my $referer = 'http://www.the-game.ru/';

my $user = 't1est';
my $pass = 't1est';

my $params = "action=login&login=$user&pwd=$pass";
my $cont_len = length $params;

my $sock = new IO::Socket::INET (
    PeerAddr => $url,
    PeerPort => '80',
    Proto    => 'tcp',
);
die "Could not create socket: $!\n" unless $sock;

$sock->autoflush(1);

print $sock join("\n",
    "POST http://$url/overview/ HTTP/1.0",
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0",
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding: gzip, deflate",
    "Referer: $referer",
    "Cache-Control: max-age=0",
    "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3",
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: $cont_len","",
    "$params",""
);

my @body;

while ( <$sock> ) { push @body, $_ }
close $sock;

my $filename = "/tmp/thegameru.html";

open  FH, ">", $filename;
print FH @body;
close FH;

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 23-Окт-13, 16:16 
Появилась еще одна интересная проблема, к решению которой не знаю с какой стороны подойти.
Есть нейкая программа *.pl. В ней написано
#!/usr/bin/perl
use Empire; # или другое название
$Empire->queue(375,621)->addJob(3);

Вопрос, что должно быть написано в файле Empire.pm (самописном), что бы файл выполнил действие
$url="http://www.the-game.ru/frames/planet_buildings/on/planet/?pl...

$Empire='$url="http://www.the-game.ru/frames;'; # начало вроде должно быть таким, а вот дальше...

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

15. "Помогите считать страничку сайта"  +/
Сообщение от михалыч (ok) on 23-Окт-13, 19:39 
Вы всё с игрой возитесь?
Здесь смотрели => http://www.the-game.ru/about/scripting/ ?
Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

16. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 23-Окт-13, 20:01 
> Вы всё с игрой возитесь?
> Здесь смотрели => http://www.the-game.ru/about/scripting/ ?

Так вот именно эти скрипты и подсадили меня на перл. То что есть на этой ссылке знаю почти наизусть. Написал на нем много скриптов, но это язык внутренний и имеет ограничения. Я же хочу сделать то же самое внешне, но что бы эти команды выполняли старые функции. Для этого мне надо написать что-то типа переводчика. Я считаю что это неплохой способ изучить перл дальше банальной математики.

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

17. "Помогите считать страничку сайта"  +/
Сообщение от михалыч (ok) on 29-Окт-13, 08:38 
>> Вы всё с игрой возитесь?
>> Здесь смотрели => http://www.the-game.ru/about/scripting/ ?
> Так вот именно эти скрипты и подсадили меня на перл. То что
> есть на этой ссылке знаю почти наизусть. Написал на нем много
> скриптов, но это язык внутренний и имеет ограничения. Я же хочу
> сделать то же самое внешне, но что бы эти команды выполняли
> старые функции. Для этого мне надо написать что-то типа переводчика. Я
> считаю что это неплохой способ изучить перл дальше банальной математики.

Как успехи? ))
По поводу Empire.pm - вам надо смотреть в сторону
объектно-ориентированного программирования в perl

Кстати, о птичках, в 5 посте у вас при использовании IO::Socket вылезала ошибка "HTTP/1.1 400 Bad Request".
Просто в отличии от HTTP/1.0 версия HTTP/1.1 строго проверяет наличие определённых заголовков.
Можно посмотреть здесь => http://tools.ietf.org/html/rfc2068

Минимальный вариант такой

#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket;

my $url = 'www.the-game.ru';
my $referer = 'http://www.the-game.ru/';

my $user = 't1est';
my $pass = 't1est';

my $params = "action=login&login=$user&pwd=$pass";
my $cont_len = length $params;

my $sock = new IO::Socket::INET (
    PeerAddr => $url,
    PeerPort => '80',
    Proto    => 'tcp'
);
die "Could not create socket: $!\n" unless $sock;

$sock->autoflush(1);

print $sock join("\n",
    "POST http://$url/overview/ HTTP/1.1",
    "Connection: close",
    "Host: $url",
    "Content-Length: $cont_len","",
    "$params"
);

while(<$sock>) {print}
$sock->close;

Важно наличие заголовка "Connection: close" иначе повиснет. ))

Вот, ещё Империю строят => http://www.wolfpackempire.com/ и к ней =>  http://search.cpan.org/~romm/Empire-0.121/
Даже сервер есть => http://sourceforge.net/projects/empserver/ типа "Цивилизации".
Можно попробовать самому поднять, на поиграться.
Вы меня заразили.))

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

18. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 29-Окт-13, 10:25 
> Как успехи? ))
> По поводу Empire.pm - вам надо смотреть в сторону
> объектно-ориентированного программирования в perl
> Важно наличие заголовка "Connection: close" иначе повиснет. ))
> Вот, ещё Империю строят => http://www.wolfpackempire.com/ и к ней =>  http://search.cpan.org/~romm/Empire-0.121/
> Вы меня заразили.))

Потихоньку.
Понимаю, что это ООП, да вот зацепиться пока не получается (примера нет). Я как бы использовал классы, но одно дело использовать, а другое дело создавать. Скажем так, пока положил рядышком и посматриваю.
Насчет
"Connection: close" - у меня наоборот виснет при этом, да и все браузеры посылают - Conection: keep-alive - работает нормально, но настроив нормально LWP я перестал смотреть (вылизывать) код на сокетах. LWP - как-то поприятней глазу и на сокетах у меня почему-то соединение всегда было 1 мин., несмотря на команду выхода с сервера и изменения таймаутов.
2 империи я точно не подниму. Мне бы с одной разобраться.
Смысл моей истории в следующем:
5 лет назад зарегался, полтора года поиграл, бросил на год.
2 года назад зарегался - поиграл топом, (стал писать скрипты на внутреннем языке), у меня тогда был знакомый, профессиональный программер, благодаря ему и пошло дело. Бросил на год.
Сей час зарегался, пытаюсь создать скрипто империю. Делаем это вдвоем, мой партнер делает то же что и я, но на PHP. На данный момент собираемся подключать Mysql.
Ник в игре тот же что и тут. Вся информация - в закрытом коммуникаторе. Был бы премного признателен за советы и ответы на дурацкие вопросы.

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

19. "Помогите считать страничку сайта"  +/
Сообщение от mpasl (ok) on 30-Окт-13, 10:27 

> #!/usr/bin/perl
> use Empire; # или другое название
> $Empire->queue(375,621)->addJob(3);
> Вопрос, что должно быть написано в файле Empire.pm (самописном), что бы файл
> выполнил действие
> $url="http://www.the-game.ru/frames/planet_buildings/on/planet/?pl...

sub Empire::queue {
          sub addJob{
                  $url="http://www.the-game.ru/frames/planet_buildings/on/planet/?pl...
          }
}
$Empire->queue(375,621)->addJob(3);
А в этой строчке убрать значек $
и должно отработать, короче я зацепился. Начало получаться.

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру