0xcafebabe -- per aspera ad astra

Dokument pobrany z: http://www.anadoxin.org/blog/comment/reply/27

Tagi:  •    •  

PageRank to algorytm dzięki któremu można określić stopień popularności strony w sieci, a konkretniej jest to prawdopodobieństwo (w notacji Googlowej) trafienia przez użytkownika na daną stronę, jeśli ten będzie losowo klikał w linki w sieci - czyli im PageRank jest wyższy, tym lepiej.

Ten stopień jest w całości określony przez Google i nie można powiedzieć, że ta ocena jest obiektywna, jednak z uwagi na ilość informacji przechowywanych na serwerach google'a nie można też powiedzieć że jest kompletnie bez znaczenia ;).

Szukając sposobu na wykopanie wartości PageRank dla jakiejkolwiek strony przy użyciu serwerów Google'a znalazłem kilka metod które by na to pozwalały, jednak wszystkie okazały się za stare; algorytmy hashujące zapytanie może działały w przeszłości; problem tylko w tym, że przeszłość należy do historyków, nie ludzi IT. Z tego właśnie powodu postanowiłem wysłać zapytanie wgłąb kodu Google Toolbar i poczekać aż wróci do mnie odpowiedź.

Po kilku minutach siedzenia i patrzenia się w ścianę, w głowę uderzyła mnie informacja o kodzie źródłowym Google Toolbar, który znajduje się w katalogu z naszym profilem -> Dane Aplikacji -> Mozilla -> Firefox -> Profiles -> (ciąg znaków twojego profilu) -> extensions -> {3112ca9c-de6d-4884-a869-9855de68056c} -> lib -> toolbar.js. Ten kod JavaScript jest jednak nieco skompresowany (nadal nie tak jak być powinien), ale nazwy klas, zmiennych nie są zaciemnione - wystarczy więc użyć jakiegokolwiek beautifiera (np. http://elfz.laacz.lv/beautify http://jsbeautifier.org) i już możemy cieszyć się przepięknym kodem, który z przyjemnością wyśpiewa przed nami wszystkie tajemnice Toolbara Google'a :).

Ogólna zasada pobierania wyniku PageRank polega na wysłaniu odpowiedniego zapytania. Oto przykład który znalazłem w archiwum grupy newsowej poświęconej Squidowi, czyli znaleziony przez przypadek ;):

http://www.google.com/search?client=navclient-auto&features=Rank&ch=89ff...

(Update 2011r - niestety, powyższy link już nie działa)

Po wejściu na tą stronę pokaże nam się token, który wystarczy teraz sparsować prostym split'em aby otrzymać wartość PageRank. Najważniejsza rzecz w tym zapytaniu to argument ch, który prawdopodobnie oznacza sumę kontrolną (checksum) argumentu q. Suma wyliczana jest przy użyciu algorytmu, który zmieniał się już kilka razy...

Na kolejną informację musiałem poczekać kolejne kilka minut, ale opłacało się: otrzymałem dzisiejszą strategiczną funkcję obliczającą sumę kontrolną...

  1. GTB_PageRank.GPR_awesomeHash = function(value) {
  2.     var kindOfThingAnIdiotWouldHaveOnHisLuggage = 16909125;
  3.     for (var i = 0; i < value.length; i++) {
  4.         kindOfThingAnIdiotWouldHaveOnHisLuggage^ = GTB_PageRank.GPR_HASH_SEED.charCodeAt(i % GTB_PageRank.GPR_HASH_SEED.length)^value.charCodeAt(i);
  5.         kindOfThingAnIdiotWouldHaveOnHisLuggage = kindOfThingAnIdiotWouldHaveOnHisLuggage >>> 23 | kindOfThingAnIdiotWouldHaveOnHisLuggage << 9
  6.     }
  7.     return GTB_PageRank.GPR_hexEncodeU32(kindOfThingAnIdiotWouldHaveOnHisLuggage)
  8.     };

(Konwencja nazewnictwa zmiennych jest oryginalna ;>). Warto jeszcze dodać, że seed sumy kontrolnej też wyliczany jest z charakterystycznego ciągu znaków:

  1. GTB_PageRank.GPR_HASH_SEED = "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer.";

Nasuwa się pytanie, czy wszyscy programiści w Google w młodości odkrywali liściaste tereny Bongo i zapijali piwkiem, czy może brakuje im fazy code-review? :) Na tą odpowiedź chyba przyjdzie mi tym razem poczekać nieco dłużej...

Jeśli interesują cię kody źródłowe i przykłady/demonstracje jak je użyć (Java, PHP), zapraszam tutaj.

EDIT: Albo odpowiedź trzecia, programiści Google'a są fanami filmu Gwiezdne Jaja :)

[King Roland has given in to Dark Helmet's threats, and is telling him the combination to the "air shield"]
Roland: One.
Dark Helmet: One.
Colonel Sandurz: One.
Roland: Two.
Dark Helmet: Two.
Colonel Sandurz: Two.
Roland: Three.
Dark Helmet: Three.
Colonel Sandurz: Three.
Roland: Four.
Dark Helmet: Four.
Colonel Sandurz: Four.
Roland: Five.
Dark Helmet: Five.
Colonel Sandurz: Five.
Dark Helmet: So the combination is one, two, three, four, five? That's the stupidest combination I've ever heard in my life! The kind of thing an idiot would have on his luggage!

Komentuj

Zawartość tego pola nie będzie udostępniana publicznie.
  • Adresy internetowe są automatycznie zamieniane w klikalne odnośniki.
  • Use <!--pagebreak--> to create page breaks.
  • You may post block code using <blockcode [type="language"]>...</blockcode> tags. You may also post inline code using <code [type="language"]>...</code> tags.
  • Use <fn>...</fn> to insert automatically numbered footnotes.

Więcej informacji na temat formatowania