Stare projekty.

Mam parę skryptów (oczywiście Perl), albo nawet raczej szkieletów skryptów, których nigdy nigdzie nie publikowałem, bo były w fazie „takie tam niedokończone”. Powodów niedokończenia jest sporo – poczynając od kłód rzucanych pod nogi (tak, patrzę na Blox), poprzez jakieś takie rozmycie mojego zapotrzebowania wewnętrznego, brak czasu[1], po zwykłą zmianę warunków zewnętrznych.

Czasem jest taki miły moment, że okazuje się, że to ma sens i w ogóle się przyda. Przynajmniej potencjalnie. To nic, że pewnie rok czy dwa później. Ogólnie miałem do tego skrypt! jest miłym momentem. Nawet jeśli ów skrypt wymaga lekkiego – albo nie tak lekkiego – tuningu.

Tak czy inaczej jest motywacja do ciągu dalszego zabaw ze słowami. Niestety, skrypt w tego typu wypadkach to tylko wisienka na tort, jest też spora praca do wykonania przez człowieka. Przypomina mi się liceum i konkurs w radio, polegający na tym, by z podanego czteroliterowego słowa utworzyć jak najdłuższy ciąg kolejnych słów w taki sposób, by słowa się nie powtarzały i różniły tylko jedną literą. I jeszcze chyba ograniczenie do rzeczowników było. Czyli lupa -> zupa -> kupa -> kopa… No ale wtedy nie było(?) tyle dobra w sieci. 😉

[1] Doba ma tylko 24h, a tydzień tylko 7 dni. Jakby to było 26 i 8, byłoby znacznie lepiej.

Automatyczne wykrywanie spamu na Blox.

Trochę z rozpędu po ostatnim spojrzeniu na beznadziejną captchę na Blox, trochę zażenowany brakiem działania administratorów Blox w tak wydawałoby się prostej sprawie, trochę chcąc odkurzyć stare skrypty i znajomość Perla, trochę ze względu na zainteresowaniem tematem spamu, a w końcu trochę dla zabawy, postanowiłem zrobić przymiarkę do automatycznego wykrywania spamu na Blox. Chodzi o określanie, czy dany blog służy wyłącznie spamowaniu, oczywiście automatycznie, a co za tym idzie nie ze stuprocentową pewnością.

Administratorzy zapowiedzieli, że captcha zostanie poprawiona w kwietniu (trzymam za słowo i liczę na to, zapewne nie tylko ja), więc spamblogów nie powinno od tej pory przybywać. Zatem postanowiłem skupić się nie na liście nowozałożonych blogów, tylko na liście nowych wpisów, czyli aktywnych spamblogach. Co prawda pierwotny plan zakładał przeiterowanie się po wszystkich blogach i określenie prawdopodobieństwa, czy jest to spamblog, ale nie znalazłem niestety listy wszystkich blogów na Blox. Owszem, można próbować robić rzeźbę pod tytułem „przeiterujmy się po tagach”, ale nadal nie daje to gwarancji uzyskania listy wszystkich blogów – wystarczy, że ktoś nie taguje i system nie dotrze do jego bloga, więc stanęło na tym, że obserwuję listę nowych wpisów i stamtąd biorę dane. Przy okazji oceniam nie tyle cały blog, co poszczególne wpisy, co może być przydatne.

Podejście pierwsze – pobierz i oceń. Na samym początku stwierdziłem, że będę pobierał wpis do oceny i oceniał na podstawie arbitralnych kryteriów. Pomysł szybko upadł – zmiany w algorytmie oceniania powodowały niekompatybilność z poprzednimi danymi, a zmiany były konieczne – wychodziły coraz to nowe kryteria i ich wagi. Wersjonowanie algorytmu przy ocenie nie pomagało, bo dane były tracone. OK, nie jest to wszystko aż tak proste, jak się wydawało na początku.

Podejście drugie – pobierz i zapisz jak najwięcej cech wyróżniających dla danego wpisu/bloga, a potem pomyśli się nad algorytmem. No niestety, zapisywanie dużej ilości danych może być ciekawe, szczególnie, że potem można sięgnąć do wiedzy ze studiów i określić poziomy istotności poszczególnych parametrów (albo popytać kumpla o gotowca, może jeszcze ma…). Wytrenuje się AI na próbce kontrolnej, a potem AI sama zrobi resztę. Brzmi fajnie, ale trochę overkill, poza tym, mało odporne na dołożenie kolejnych parametrów, gdyby przyszło mi do głowy ich wyciąganie.

Podejście trzecie, aktualne,kompromisowe – pobierz i zapisz istotne (wybrane arbitralnie przeze mnie) cechy wyróżniające dany wpis. Osobny skrypt ma algorytm procentowy, każda cecha może przyjmować wartości 0-100% prawdopodobieństwa bycia spamem. Następnie w zależności od ilości cech wylicz prawdopodobieństwo dla całego wpisu przy pomocy średniej ważonej. Rezultaty są dość interesujące.

Tutaj lista blogów (praktycznie nikt nie korzystał, więc wywaliłem), które sklasyfikowałem jako spamerskie z prawdopodobieństwem 80% i więcej. Format prawdopodobieństwo bycia spamem (%), spacja, link do bloga. Nie widzę (szybko patrząc) żadnego false positive, a wy? Aktualnie jest takich blogów 375 na 2404 wszystkich sprawdzonych blogów. Jasne, nie jest to cud techniki, ale przy dodaniu pewnych prostych whitelist myślę, że można spokojnie blokować automatem wszystkie blogi z prawdopodobieństwem od 70% w górę.

Szczegółów badanych cech oraz algorytmu nie chcę na razie opisywać, bo po co spamerzy mają się bronić? Jak będzie utrudnione zakładanie nowych blogów, to pomyślę o tym. Na razie cały czas zbierają się dane… Gdyby byli chętni do przeglądania wyniku w celu wychwytywania false positive’ów (wpisujcie miasta, które przeglądają ;-)), to mogę pomyśleć o wystawianiu listy spamów automatem co jakiś czas.

Całość napisana oczywiście w Perlu, główny moduł zbierający z użyciem WWW::Mechanize (genialna sprawa do crawlerów).

UPDATE: Drobny update statystyk z dnia 27.04.2012 – 13481 unikatowe blogi (wcześniej chyba były unikatowe wpisy, ale mniejsza), w tym 1094 do natychmiastowego wycięcia (80% i więcej). Dla porządku 70% i więcej to 2438 sztuki. Listy nie zamieszczam, bo zainteresowanie było znikome. A captcha nadal nie została poprawiona, choć koniec kwietnia…

Yet Another Stupid Checkpoint.

Co jakiś czas łapię się na tym, że robię porządki, zmiany, podsumowania i postanowienia. Zwykle grupowo i w okolicach urlopów. Jako, że właśnie skończyłem urlop, to pora na małe podsumowanie.

Na początek rzeczy z publicznej listy TODO. Przede wszystkim, w końcu uruchomiłem produkcyjnie Dockstara. Póki co – działa i podoba mi się. Prawie pewne jest też, że pojawi się wkrótce test sprzętowego simlocka – muszę (i to szybko!) przenieść numer spam z Plusa, zapewne do Play, bo długie terminy po doładowaniach, a numer tylko na przychodzące. Zobaczymy jak to działa, zobaczymy co dalej z telefonami…

Znowu lenistwo wzięło górę i nie poszukałem kasety Bez Krótkich Spodni. Numer jeden do zrobienia przy najbliższej okazji, razem z (dopisanym w tej chwili) eksportem archiwum listy SzLUUG. Router w domu… kiedyś zrobię, najpierw kable trzeba zabezpieczyć jakoś, bo małą ciągnie i gotowa zepsuć połamać. Certyfikat IPv6 ugrzązł. Chciałem robić tylko w oparciu o publiczne, darmowe zasoby i poległem na revDNS – wygląda, że nikt z dynDNSów nie umożliwia ustawienia reva (albo za słabo poszukałem, po prostu).

Z innych sieciowych rzeczy – dziś przypadkiem sprawdziłem i okazało się, że Google podniósł blogowi pagerank (do 4). Co ciekawe, staremu, nieutrzymywanemu blogowi nie spada (nadal 3). Przypominają się ludzie ze starych projektów. Tydzień na zastanowienie i trzeba sobie jasno odpowiedzieć, czy jest sens się bawić czy kolejne rzeczy do zaorania. Tym bardziej, że są nowe plany (nie nadają się na publiczne TODO) i czas będzie potrzebny.

Z nie wpisanych na listę – zacząłem klepać kod do gry. Tak, zainspirowałem się historią RPG Idee Fixe, które powstawało latami i stwierdziłem, że skoro nic podobnego do tkwiącego w mojej głowie pomysłu nie istnieje (albo przynajmniej o istnieniu nie wiem), to będę pomału rzeźbić, bo pośpiechu nie ma. Na razie bawię się pojedynczymi funkcjami, nie wiem jeszcze, czy miałoby być to webowe, czy standalone. O ile cokolwiek powstanie, co wcale pewne nie jest… Na razie jest pomysł (miejscami mglisty), do tego napiszę parę funkcji i postaram się złożyć to w spójną całość. Potem pozostało dobranie parametrów (czytaj: prawdopodobieństw) i jakby to wyszło, to tylko pozostanie opakować w formę strawną dla przeciętnego użytkownika (czytaj: nie CLI).