środa, 25 sierpnia 2010

adderek Webmini 0.4

Jedyna zmiana w wersji 0.4 to obsługa prostych, 1 poziomowych synonimów w opisie (plik strony.xml, tag opis)
Przykład:

<opis>
Czerwony maluch jest koloru (czerwonego|zielonego|bezbarwnego).
</opis>


Źródło

niedziela, 15 sierpnia 2010

adderek Webmini 0.3

Zmiany:
*nie wymaga przebrzydłego IE (skrypt powinien działać na platformach Windows, Linux, Mac OS X, Solaris, AIX i HP-UX)
*drobne poprawki w kodzie
*poprawa szybkości-->skrypt zapierdala jak meserszmit
*skrypt automatycznie wywala do pliku bledne.xml adresy katalogów do których nie potrafił dodać wpisu. Co z tym zrobić? należy dodać pytania (wraz z poprawnymi odpowiedziami) z tych katalogów do pliku odpowiedzi.xml


Wymagania:
*perl
*moduły perla: XML::Simple, WWW::Mechanize i List::MoreUtils
*pliki strony.xml i odpowiedzi.xml
*dostęp do internetu

Koszta:
Skrypt nie generuje żadnych* (patrz licencja)  kosztów. Nie wymaga hostingu, pehapa czy crona. Działa pod dowolnym systemem i w dowolnej czasoprzestrzeni.

Licencja: Soulware

Źródło


sobota, 14 sierpnia 2010

adderek Webmini 0.2

Nowa wersja adderka Webmini.
Zmiany:
*katalogowanie wielu stron jednocześnie (wymagany plik strony.xml)
*drobne poprawki w kodzie
*obsługa niestandardowych pytań (wymagany plik odpowiedzi.xml)
*zmiana licencji.
Kod zmienia licencję na Soulware(czyli licencja BSD + w zamian za użytkowanie programu zobowiązujesz się oddać duszę autorowi tego skryptu:P).


use Win32::IEAutomation;
use WWW::Mechanize;
use List::MoreUtils qw(uniq);
use strict;
use utf8;
use XML::Simple;
use Data::Dumper;
no warnings;
my $mech = Win32::IEAutomation->new( visible => 1);#zmień na 0 jeśli nie chcesz oglądać okna IE
my $mechanize=WWW::Mechanize->new(autocheck => 0,timeout => 8);
$mechanize->agent_alias("Linux Mozilla");
my @katalogi=();
###################### STRONY #############################
my $xml = new XML::Simple();
my $data = $xml->XMLin("strony.xml",ForceArray => ["strona"]);
my @strony=@{$data->{strona}};
######################### ODPOWIEDZI ###################
my %odpowiedzi=();
$data = $xml->XMLin("odpowiedzi.xml",ForceArray => ["pytanie"]);
foreach (@{$data->{pytanie}})
{
$odpowiedzi{$_->{question}}=$_->{answer}
}
######################### KATALOGI ########################
print "[0]Wczytac liste katalogow z pliku textowego\n[1]Pozyczyc od Mara\n";
my $wybor=<>;
if($wybor==0)
{
print "podaj nazwe pliku:\n";
my $nazwa=<>;
open(ODCZYT,'./'.$nazwa) or die "Nie moge odczytac\n";
@katalogi=<ODCZYT>;
close(ODCZYT);
@katalogi=uniq(@katalogi);
}else{
czary_mary();
}
############################# SERCE #######################
foreach(@katalogi)
{
my $url=$_;
$mechanize->get($url);
if($mechanize->response->is_success)
{
foreach(@strony)
{
$mech->gotoURL($url);
my $content=$mech->Content();
eval
{
$mech->getTextBox('name:','e_www')->SetValue($_->{adres});
$mech->getTextBox('name:','e_title')->SetValue($_->{title});
$mech->getTextBox('name:','e_keywords')->SetValue($_->{keyword});
$mech->getTextArea('name:','e_desc')->SetValue($_->{opis});
if($content=~/<\/TEXTAREA>(.+?)<DIV align=left><INPUT size=53.+?name=answer>/gis)
{
my $zaw=$1;
while($zaw=~/<.*?>/)
{
$zaw=~s/<.*?>//;
}
my $znam_odp=0;
my $wynik="";
while ( my ($key, $value) = each(%odpowiedzi) )
{
if($zaw=~/$key/gis)
{
$wynik=$odpowiedzi{$key};
$znam_odp=1;
next;
}

}
if($znam_odp==0)
{

$zaw=~s/Odpowiedz na pytanie//;
while($zaw=~/(\n+|\s+|:|\?)/gi)
{
$zaw=~s/(\n+|\s+|:|\?)//;
}
$wynik=eval($zaw);
}
print "$wynik\n";
$mech->getTextBox('name:','answer')->SetValue($wynik);


}
$mech->getInputButton('name:','step2')->Click;

};
}
}
}
######################### MAR #################################
sub czary_mary
{
$mechanize->get('http://www.katalogiseo.info/WebMini.html');
my $zawartosc=$mechanize->content();
my @linki=();
while($zawartosc=~/<a href=\"(katalogi-WebMini,[^\"]+)/gi)
{
push(@linki,'http://www.katalogiseo.info/'.$1);
}
@linki=uniq(@linki);
foreach(@linki)
{
#print $_."\n";
$mechanize->get($_);
$zawartosc=$mechanize->content();
while($zawartosc=~/<div style=\"float:left;\"><a href=\"([^\"]+)\" class=\"linki\" target=\"_blank\">/gi)
{
my $url=$1;
if($url=~/\/$/)
{
push(@katalogi,$1.'?mode=add');
}else{
push(@katalogi,$1.'/?mode=add');
}
}
}
@katalogi=uniq(@katalogi);
print "Pobrano ".scalar(@katalogi)." katalogow\n";
}
################################ GAME OVER #################


Lista odpowiedzi

Plik odpowiedzi.xml to plik zawierający odpowiedzi na niestandardowe(nie opierające się na matematyce) pytania w katalogach WebMini.
Przykładowy plik odpowiedzi.xml

<pytania>
<pytanie>
<question>Jak ma na imię Liliputek Marzena</question>
<answer>Marzena</answer>
</pytanie>
<pytanie>
<question>wynik: echo "nie wiem"</question>
<answer>nie wiem</answer>
</pytanie>
<pytanie>
<question>Tokenig</question>
<answer>555</answer>
</pytanie>
<pytanie>
<question>Chrzest Polski byl w roku</question>
<answer>966</answer>
</pytanie>
<pytanie>
<question>Stolica Polski</question>
<answer>Warszawa</answer>
</pytanie>
<pytanie>
<question>największe miasto w Polsce</question>
<answer>warszawa</answer>
</pytanie>
<pytanie>
<question>Jak ma na imię Kwasigroch Janusz</question>
<answer>Janusz</answer>
</pytanie>
<pytanie>
<question>Jak ma na nazwisko Rzęsista Krystyna</question>
<answer>Rzęsista</answer>
</pytanie>
<pytanie>
<question>Jak ma na nazwisko Ocipka Sławomir</question>
<answer>Ocipka</answer>
</pytanie>
<pytanie>
<question>Jak ma na nazwisko Zdzisława Kozak</question>
<answer>Kozak</answer>
</pytanie>
<pytanie>
<question>Jak ma na imię Fiut Stanisław</question>
<answer>Stanisław</answer>
</pytanie>
<pytanie>
<question>Jak ma na nazwisko Chujoman Katarzyna</question>
<answer>Chujoman</answer>
</pytanie>
<pytanie>
<question>Jak ma na nazwisko Skwara Elżbieta</question>
<answer>Skwara</answer>
</pytanie>
<pytanie>
<question>Jak ma na nazwisko Grochowalski Piotr?</question>
<answer>Grochowalski</answer>
</pytanie>
<pytanie>
<question>Co to? W stawie pływa i żaba się nazywa?</question>
<answer>żaba</answer>
</pytanie>
<pytanie>
<question>Jak ma na imię Kutaśko Mieczysław?</question>
<answer>Mieczysław</answer>
</pytanie>
<pytanie>
<question>Jak ma na imię Canibal Roman?</question>
<answer>Roman</answer>
</pytanie>
<pytanie>
<question>Jak ma na nazwisko Leszek Żur?</question>
<answer>Żur</answer>
</pytanie>
<pytanie>
<question>Jak ma na imię Alojzy Student?</question>
<answer>Alojzy</answer>
</pytanie>
</pytania>


Lista stron

Plik strony.xml to plik zawierający wszystkie katalogowane strony wraz z opisem, słowami kluczowymi czy anchorem.
Przykładowy plik strony.xml

<strony>
<strona>
<adres>http://freecrusader.sourceforge.net/</adres>
<title>tworzenie krzyzowek</title>
<keyword>tworzenie krzyzowek,krzyzowki</keyword>
<opis>Krzyżowiec to prosty i sympatyczny program umożliwiający tworzenie krzyżówek</opis>
</strona>
<strona>
<adres>http://www.zwodnik.pl</adres>
<title>darmowe programy</title>
<keyword>darmowe programy, programy Linux</keyword>
<opis>Zwodnik.pl to katalog najlepszych darmowych i legalnych programów(programy na licencji GNU i Freeware) podzielonych na tematyczne kategorie.</opis>
</strona>
</strony>

piątek, 13 sierpnia 2010

Polskie znaki

W przypadku problemów z polskimi znakami łatka na pakiet IEAutomation.pm

--- IEAutomation.pm 2006-09-25 13:43:12.274429000 +0400
+++ IEAutomation2.pm 2006-10-31 16:15:45.281587500 +0300
@@ -34,6 +34,7 @@
sub _startIE{
my ($self, $visible, $maximize) = @_;
defined $self->{agent} and return;
+ Win32::OLE->Option(CP=>Win32::OLE::CP_UTF8);
$self->{agent} = Win32::OLE->new("InternetExplorer.Application") || die "Could not start Internet Explorer Application through OLE\n";
Win32::OLE->Option(Warn => 0);
Win32::OLE->WithEvents($self->{agent});