On Thu, Apr 28, 2005 at 06:36:09PM +0200, Olaf Matyja wrote:
Ponieważ już dwie osoby prosiły mnie o informacje na
temat bota, bo
chcą napisać własne, więc odpiszę na listę.
To ja może powiem, jak wygląda mój bot.
Jeśli chodzi o mojego bota - stara wersja programu (a
raczej kilku
różnych programów) jest - żródła można znaleźć pod linkami ze strony
http://pl.wikipedia.org/wiki/Wikipedysta:Olafbot :
http://pl.wikipedia.org/wiki/Wikipedysta:Olafbot/OlafbotCalendar.java
http://pl.wikipedia.org/wiki/Wikipedysta:Olafbot/OlafbotDaysOfYear.java
Niestety później zmienił się na wikipedii system logowania, przez co te
wersje chyba nie potrafią się logować (o ile w ogóle działają
poprawnie).
Relatywnie prostym sposobem jest zalogowanie się w przeglądarce i
skopiowanie ciastka do bota ;-)
Zmęczyła mnie konieczność regularnego update'owania logowania,
i teraz tak robię.
Poza tym ja używałem javy, która może nie jest
najlepsza, gdyż... nie
zaimplementowano w niej funkcji setCookie (jest, ale ma pustą treść...)
przez co musiałem to robić niskopoziomowo socketami.
W każdym razie, gdyby ktoś pisał bota, to poniżej są moje rady:
* Bot po prostu symuluje użytkownika łączącego się przez HTTP (metody
GET i POST) z wikipedią. Nie ma żadnego specjalnego API.
Źle, źle :-)
Jedyny słuszny sposób to Perl i LWP.
Ja swojemu botu wydaję polecenia w stylu: wpisz treść w pole wpTextbox1,
kliknij na przycisk wpSave itd.
* Zwróćcie uwagę, czy nie psuje japońskich liter - mój
kiedyś psuł
LWP o to też raczej dba.
* Nie powinien zbyt często wywoływać wikipedii, bo
zapcha serwer. Jak
się zapytałem, co to znaczy "zbyt często" na liście, to usłyszałem, że
raz na minutę. Przy tej prędkości boty nie mają sensu (szybciej
wprowadzam zmiany osobiście), więc starałem się nie przekraczać 5 razy
na minutę i nikt nie protestował.
"Raz na minutę" to oczywiście absurd.
Ja swojego w ogóle nie limituje. Po SDI nie jest w stanie nic zepsuć.
* Bot, kiedy się go już przetestuje, powinien mieć
przez Biurokratę
ustawioną flagę "bot", żeby go w ostatnich zmianach widać nie było.
Gorzej, biurokraci nie mają takie opcji, trzeba na meta go zgłosić :-)
* Musi być jakiś mechanizm awaryjnego zatrzymywania
bota przez każdego.
Ja zrobiłem tak, że bot reaguje na wpisanie czegokolwiek na stronie
jego dyskusji - wtedy pokazuje mu się w odpowiedzi od wiki informacja,
że ma nową wiadomość.
Ja po prostu jak uruchamiam bota zawsze mam ostatnie zmiany na autorefreshu
i jakby coś się działo killuję jeden przycisk i bota się wyłącza.
Ale nigdy się jeszcze nic nie działo. Jedyne problemy (np. kiedyś
bot nie sprawdzał czy jest [[Kategoria:X|Y]], tylko [[Kategoria:X]]
i dopisywał [[Kategoria:X]] drugi raz) zauważałem po prostu masowo
otwierając diffa (tak np. z 50 pierwszych edycji bota, jeden środkowy
myszklik na diffa w nowej karcie w tle) w trakcie jego działania
i natychmiast poprawiałem.
* Bot powinien sprawdzać, czy wciąż jest zalogowany.
Wikipedia
potrafiła czasem wylogować bota po paru godzinach pracy i potem wszyscy
jęczeli, że im ostatnie zmiany zawalam, bo bot nagle stawał się
widoczny. W dodatku niezalogowany bot nie wie, że przyszła do niego
wiadomość, więc moją metodą nie dało się go zatrzymać. Szczęśliwie da
się wtedy zablokować jego IP.
* Oficjalnie bot "powinien się zatrzymać, gdy stanie się cokolwiek
nieprzewidzianego" (np. zła odpowiedź od serwera). To też jest
nierealne - takie boty ciągle się wysypują, bo wikipedia bardzo często
jest zapchana i nie odpowiada. Lepiej po prostu w przypadku błędu
serwera odczekać powiedzmy 5 minut i spróbować jeszcze raz.
Mój bot żadnej magii tego typu nie robi - po prostu jak go puszczam
to siedzę zwykle obok. Nigdy mi się też nie wylogował podczas pracy,
więc nie sprawdzam tego.