[Perl] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Доброго времени суток. Написал подделие быдлокодинга. Отбрасывает кривые мыла с пасом, если задан файл с хостами то выбираем ток их. Скрипт без файла с хостами отрабатывает секунд за 5, с ним часа 2 с половиной. Задаю 8 хостов.

    Code:
    use Getopt::Std;
    
    %options=();
    getopts("i:o:h:",\%options);
    
    $innerFile = 'dump.txt';
    $outFile = 'valid_mails.txt';  
    
    if ($options{i}) {
    	$innerFile = $options{i}; 
    }
    if ($options{o}) {
    	$outFile = $options{o};
    }
    if ($options{h}) {
    	@hosts = ();
    	%findingHosts = {};
    	
    	$i = 0;
    
    	open(HOSTS, $options{h}) or die "Can't find hosts file";
    
    	while (<HOSTS>) {
    		chomp;
    		$hosts[$i] = lc($_);
    		$i++;
    	}
    	
    	close(HOSTS);
    }
    
    open (FILE, $innerFile) or die "Input file wasn't found";
    open (CHECKFILE, $innerFile);
    open (OUT, ">>", $outFile);
    
    MAIN: while(<FILE>) {
    	chomp;
    	$repeats = 0;
    	$valid = valid($_);
    	
    	if (!$valid) {
    		next MAIN;
    	}
    	
    	CHECK: while(<CHECKFILE>) {
    		chomp;
    
    		if ($valid eq $_) {
    			$repeats++;
    			if ($repeats > 1) {
    				next MAIN;
    			}
    		}
    	}
    	
    	print OUT $valid . "\n";
    }
    
    close(OUT);
    
    
    close(FILE);
    
    sub valid {
    	my($str) = @_;
    	
    	if ($str =~ /^\s*?([a-zA-Z_0-9-\.]+)(@[a-zA-Z_0-9-\.]+):(.+)/) {
    		if (@hosts) {
    			while (<@hosts>) {
    				if (lc($2) =~ /$_/) {
    					return $str;
    				}
    			}
    			return undef;
    		}
    		
    		return $str;
    	}
    
    	return undef;
    }
    проверка на нужный хост.
    Code:
    if (@hosts) {
    while (<@hosts>) {
    	if (lc($2) =~ /$_/) {
    		return $str;
    	}
    }
    Что у меня не так сделано в проверке, что оч увеличивается время? Какой ещё рефакторинг можно провести? Или же что можно конкретного почитать на эту тему?
     
    #1841 Melfis, 18 Jun 2011
    Last edited: 18 Jun 2011
  2. Optik-Crack

    Optik-Crack New Member

    Joined:
    14 Jun 2011
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0
    Если я в jpg файле выделю некоторое количество null байтов, и вставлю туда код, он будет считываться?
     
  3. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Файл будет считываться, но код выполняться не будет.
     
  4. hazejkeoo

    hazejkeoo New Member

    Joined:
    9 Feb 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    deleted
     
    #1844 hazejkeoo, 24 Jun 2011
    Last edited: 24 Jun 2011
  5. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Возникла проблема:
    берётся контент с сайта и надо распарсить его, но никак не могу натравить регулярку на кириллицу. И локали пробовал менять и прочее. Кто знает какой-нить стандартный метод решения или же предложит свой? Нагуглить никак ничего не могу.

    зы. АР стоит на винде.
     
    #1845 Melfis, 29 Jun 2011
    Last edited: 29 Jun 2011
  6. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Encode::from_to() и др.
     
  7. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    Сайтец шлет данные через line based text data. Что это вообще такое и с чем его едят?
    Я на перле пишу скрипт, шлю обычным постом, но он кидает ключ-значение в общую кучу данных.
     
  8. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    Доброго времени суток. Пишу парсер для lockerz.com, тупо не могу авторизоваться. Код:
    PHP:
    use IO::Socket;

    $handle '[email protected]';
    $password 'coolPass';

    $sock IO::Socket::INET->new(PeerAddr => 'lockerz.com',
                                    
    PeerPort => 80,
                                    
    PeerProto => 'tcp',
                                    
    TimeOut => 10);

    print 
    $sock "GET / HTTP/1.0\r\n".
                  
    "Host: lockerz.com\r\n".
                  
    "Accept-encoding: */*\r\n".
                  
    "Accept: text/html\r\n".
                  
    "User-Agent: Mozilla/9.0\r\n".
                  
    "Connection: keep-alive\r\n\r\n";
                  
    sysread($sock ,$data1024576);
    $cookies getCookies($data);
    open(P'>data.html');
    print 
    P $data;
    close(P);

    $content 'handle='.$handle.'&password='.$password;

    print 
    $sock join("\r\n" => "POST /auth/login HTTP/1.1",
                               
    "Host: lockerz.com",
                               
    "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
                               
    "Content-type: application/x-www-form-urlencoded",
                               
    "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8",
                               
    "Accept-Encoding: gzip, deflate",
                               
    "Referer: http://lockerz.com/",
                               
    "Cookie: $cookies",
                               
    "Connection: Keep-Alive",
                               
    "Content-length: ".length($content),
                               
    "",
                               
    $content);

    sysread($sock$data1999999);

    open(P'>data1.html');
    print 
    P $data1;
    close(P);
                           
    sub getCookies
    {
        
    my $ans = @_[0];
        @
    answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?\r\n/g);
        for 
    $cookie(@answer)
        {
            
    $cookies .= $cookie."; ";
        }
        return 
    $cookies;
    }
    Запросы прописал прям как в сниффере (только второй, т.к. первый работает норм). Должно возвращать 302, не возвращает абсолютно ничего. В чем может быть ошибка? (Файлы data.html и data1.html содержат ответы сервера)
     
    #1848 SHiNiGaMi, 24 Jul 2011
    Last edited: 24 Jul 2011
  9. red_joker

    red_joker New Member

    Joined:
    4 Nov 2010
    Messages:
    31
    Likes Received:
    3
    Reputations:
    0
    Возможно, проблема в отсутствии $sock->autoflush(1), данные print могут буферизоваться без этого перед отправкой
    + смотри сниффером что отправляет твой парсер - и сравнивай с запросами браузера, возможно ошибка в куках, регексп в getCookies не очень похож на правильный - скорее всего он выберет в @answer только первую куку из ответа, а не все.
    При наличии готовых модулей типа LWP::UserAgent + HTTP::Cookies проще через них сделать - свой велосипед на сокетах вряд ли будет чем-то лучше парсера на lwp. К тому же лучше сразу заранее подумать об использовании списка проксей для парсера.
     
  10. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    red_joker
    1)autoflush не дал результ
    2)LWP::UserAgent и HTTP::Cookies дали тот же результат, поэтому я и решил свой велосипед сделать
    3)Cookie парсит наура, это моя проверенная функция, во многих моих скриптах (парсит все куки, потому что стоит квантификатор g)

    если изменить код так (закрыть и пересоздать сокет):
    PHP:
    use IO::Socket;

    $handle '[email protected]'
    $password 'coolPass';

    $sock IO::Socket::INET->new(PeerAddr => 'lockerz.com',
                                    
    PeerPort => 80,
                                    
    PeerProto => 'tcp',
                                    
    TimeOut => 10);

    print 
    $sock "GET / HTTP/1.0\r\n".
                  
    "Host: lockerz.com\r\n".
                  
    "Accept-encoding: */*\r\n".
                  
    "Accept: text/html\r\n".
                  
    "User-Agent: Mozilla/9.0\r\n".
                  
    "Connection: keep-alive\r\n\r\n";
                  
    sysread($sock ,$data1024576);
    $cookies getCookies($data);
    open(P'>data.html');
    print 
    P $data;
    close(P);
    close($sock);

    $sock IO::Socket::INET->new(PeerAddr => 'lockerz.com',
                                    
    PeerPort => 80,
                                    
    PeerProto => 'tcp',
                                    
    TimeOut => 10);

    $content 'handle='.$handle.'&password='.$password;

    print 
    $sock join("\r\n" => "POST /auth/login HTTP/1.1",
                               
    "Host: lockerz.com",
                               
    "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
                               
    "Content-type: application/x-www-form-urlencoded",
                               
    "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8",
                               
    "Accept-Encoding: gzip, deflate",
                               
    "Referer: http://lockerz.com/",
                               
    "Cookie: $cookies",
                               
    "Connection: Keep-Alive",
                               
    "Content-length: ".length($content),
                               
    "",
                               
    $content);

    sysread($sock$data1999999);

    open(P'>data1.html');
    print 
    P $data1;
    close(P);
                               
    sub getCookies
    {
        
    my $ans = @_[0];
        @
    answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?\r\n/g);
        for 
    $cookie(@answer)
        {
            
    $cookies .= $cookie."; ";
        }
        return 
    $cookies;
    }
    то возвращает
    Code:
    HTTP/1.1 200 OK
    
    Server: nginx
    
    Date: Sun, 24 Jul 2011 17:53:46 GMT
    
    Content-Type: text/html
    
    Transfer-Encoding: chunked
    
    Connection: keep-alive
    
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    
    Pragma: no-cache
    
    Content-Encoding: gzip
    
    
    
    202
    
    ‹
    
    UP: разобрался, всем спасибо
    UUP: нифига не разобрался, увидел Content-encoding: gzip и сделал Compress::Zlib::memGunzip($data1);, но там пусто как в первом варианте. снова там же, откуда и начал

    В User-Agent я что только не писал)) ему фиолетово
     
    #1850 SHiNiGaMi, 24 Jul 2011
    Last edited: 24 Jul 2011
  11. red_joker

    red_joker New Member

    Joined:
    4 Nov 2010
    Messages:
    31
    Likes Received:
    3
    Reputations:
    0
    Еще причина может быть в кривом Useragent, "User-Agent: Mozilla/9.0\r\n" такого юзерагента в реале не существует (мозила до 5 версии + должна быть ось итд), многие фильтруют по нему ботов. Попробуй поставить что-то человеко-подобное, типа "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0"
     
  12. Excellent18

    Excellent18 New Member

    Joined:
    4 Jun 2010
    Messages:
    16
    Likes Received:
    1
    Reputations:
    0
    пацаны, я в перлче полный нуб :)
    разьясните мне пожалуйста вот эти строки

    Code:
    if ($resp-> content=~ m/link button_register/msgi){
    print "[BAD] $login:$pass\n";
    wf($bad, "$login:$pass\n");}
    else {
    $resp = $ua->get("https://4game.ru/subscription/index.html")->content;
    my $bal = $2 if $resp =~ /class="text_green"(>)(\d{1,10})\s(.*)<\/span>/;
    print "[GOOD] $login:$pass:$bal\n";
    wf($good, "$login:$pass:$bal\n");}
    Лучше в Icq, может у меня еще вопросики будут) 78055223
     
  13. warlock000

    warlock000 New Member

    Joined:
    6 Sep 2009
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Perl, регулярки

    Привет всем, есть скрипт:

    Code:
    #!c:\usr\bin\perl.exe
    open(FILE,"<",'data.txt') || die "$!\n";# открываем файл для чтения
    open(OUT,"> out.txt");
    while(<FILE>) {
    chomp;
    my ($C3) = $_ =~/Условие/;
    my ($D3) = $_ =~/Условие/;
    my ($sum) = $_ =~/Условие/;
    my ($G3) = $_ =~/Условие/;
    my ($etaj , $etajnost,) = $_ =~/Условие Условие/;
    my ($L3) = $_ =~/Условие/;
    my ($O3) = $_ =~/Условие/;
    print (OUT "C$i=$C3\nD$i=$D3\nE$i=$etaj\nF$i=$etajnost\nG$i=$G3\nH$i=\nI$i=\n\J$i=$sumn\nK$i=\nL$i=$L3\nM$i=\nN$i=Парсер\nO$i=$O3\n\n");
    }
    Скрипт считает данные из файла data.txt, каждую строку он обрабатывает регулярками и пишет в файл out.txt
    Как мы видим есть переменная $i она должна после обработки регулярками и сохранения в файл становится на 1 больше (инкремент) не понмаю как можно это организовать, к примеру разберём первую строку:C$i=$C3
    Дожно получится так С4=бла бла, при обработке следующей строки из файла С5=бла бла и.т.д.
     
  14. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    О_о
    Code:
    #!c:\usr\bin\perl.exe
    open(FILE,"<",'data.txt') || die "$!\n";# открываем файл для чтения
    open(OUT,"> out.txt");
    $i = 0;
    while(<FILE>) {
    chomp;
    my ($C3) = $_ =~/Условие/;
    my ($D3) = $_ =~/Условие/;
    my ($sum) = $_ =~/Условие/;
    my ($G3) = $_ =~/Условие/;
    my ($etaj , $etajnost,) = $_ =~/Условие Условие/;
    my ($L3) = $_ =~/Условие/;
    my ($O3) = $_ =~/Условие/;
    print (OUT "C$i=$C3\nD$i=$D3\nE$i=$etaj\nF$i=$etajnost\nG$i=$G  3\nH$i=\nI$i=\n\J$i=$sumn\nK$i=\nL$i=$L3\nM$i=\nN$  i=Парсер\nO$i=$O3\n\n");
    $i++;
    }
     
  15. warlock000

    warlock000 New Member

    Joined:
    6 Sep 2009
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Сижу уже никакой, спасибо))
     
  16. warlock000

    warlock000 New Member

    Joined:
    6 Sep 2009
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Получился в общем такой скрипт:

    Code:
    use strict;
    my @words = ('891111111111', '892222222222', '893333333333');
    open my $flh, "<", "data.txt";
    while(my $line = <$flh>) {
        print $line unless grep {$line =~ /$_/} @words;
    }
    close $flh
    Помогите модифицировать скрипт что бы он читал данные из файла phone.txt в формате 81112223344 в массив добавлял и обрабатывал в формате: 8.*111.*222.*33.*44 для того чтобы если в базе есть строка с номером 8-111-222-33-44 8(111)222-33-44 для скрипта это было одно и тоже, заранее спасибо!
     
  17. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Code:
    $phone = '8-(100500)-11111-5555';
    
    $phone =~ s/\D+//g; 
    Удаляет из переменной $phone всё, кроме цифр...
     
  18. reddim

    reddim Banned

    Joined:
    2 Aug 2011
    Messages:
    5
    Likes Received:
    2
    Reputations:
    0
    Не могу авторизироваться
    Code:
    my $resp = $ua->post("http://love.mail.ru/ajax/login.phtml?XForm=Login",
    [
    Referer=>'http://love.mail.ru/', - не знаю куда его пихать..вначало или в конец или вообще не сюда его нада реф этот..
    clickUrl =>'http%3A%2F%2Flove.mail.ru%2Ftips%2F%3Ftip%3DLogin',
    target =>'',
    login_captcha =>'',
    login =>'my-mail-it',
    domain =>'mail.ru',
    password =>'my-pass-it',
    VAnketaId =>'0',
    RedirectBack =>'http%253A%252F%252Flove.mail.ru%252Findex.phtml%253F'])->as_string;
     
  19. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Referer должен идти как заголовок пост-запроса, а не как параметр формы
     
  20. YuNi|[c

    YuNi|[c Elder - Старейшина

    Joined:
    17 Sep 2006
    Messages:
    293
    Likes Received:
    33
    Reputations:
    18
    есть вопрос насчет ppm тоесть perl package module. Хотел юзать toolza.pl на ssl но пишет
    Thread 10 terminated abnormally: Can't locate object method "new" via package "IO::Socket::SSL" (perhaps you forgot to load "IO::Socket:
    :SSL"?) at C:\tools\toolza_last\toolza.pl line 206, <STDIN> line 3.

    Пробовал ActivePerl 5.8/5.10/5.14 с Net-SSLeay-1.22 и IO-Socket-SSL-1.21 но не пашет
    Если кто знает правильную конфигурацию с версиями то скажем плз
     
Thread Status:
Not open for further replies.