Blog. Just Blog

Новый алгоритм получения Google PageRank

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Буквально на днях Google поменял алгоритм, по которому генерировалась ссылка для получения показателей Google PageRank. В результате этого отвалились многие сервисы, вспомогательные программы, сторонние тулбары, счетчики и еще бессчетное количество сеошного барахла. Мне было бы глубоко фиолетово на их проблемы, но у меня на сайте тоже используется система автоматического съема значений Google PR. Поэтому пришлось быстренько адаптироваться к новым условиям. Я установил себе гугловский тулбар, быстренько выпотрошил его и получил алгоритм генерации ссылки для получения Google PageRank. Вот как он выглядит на JavaScript:
  1. <script type="text/javascript">
  2.  
  3. // Программисты Google явно с юмором :)
  4. var HASH_SEED "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. "+
  5.                  "Yes, I'm talking to you, scammer.";
  6.  
  7. // Расчет хэша строки запроса
  8. awesomeHash = function(a) {
  9.     var 16909125;
  10.     for (0a.lengthc++) {
  11.         b ^= HASH_SEED.charCodeAt(HASH_SEED.length) ^ a.charCodeAt(c);
  12.         b >>> 23 << 9;
  13.     }    
  14.     return '8'+hexEncodeU32(b);
  15. };
  16.  
  17. // Перевод числа в HEX-значение
  18. hexEncodeU32 = function(a) {
  19.     var toHex8(>>> 24);
  20.     b += toHex8(>>> 16 255);
  21.     b += toHex8(>>> 255);
  22.     return toHex8(255)
  23. };
  24. toHex8 = function(a) {
  25.     return (16 "0""") + a.toString(16)
  26. };
  27.  
  28. // Функция получения ссылки для запроса Google PR
  29. getPageRankLink = function(a) {
  30.     return 'http://toolbarqueries.google.ru/tbr?features=Rank'+
  31.            '&client=navclient-auto-ff&ch='+awesomeHash(a)+'&q=info:'+
  32.            encodeURIComponent(a);
  33. }
  34. </script>
Функция вызывается следующим образом. На входе подается ссылка на страницу, для которой требуется рассчитать Google PageRank, на выходе получаем ссылку, по которой можно узнать результат.
  1. <script type="text/javascript">
  2.  
  3. // Пример использования
  4. st='http://www.manhunter.ru/'
  5. alert(getPageRankLink(st));
  6.  
  7. </script>
Результат запроса к гугловскому серверу возвращается в виде строки, например, "Rank_1:1:2". Последняя цифра и есть искомое значение рейтинга страницы. Алгоритм можно без особого труда перевести на другие языки программирования.

Например, вот моя реализация на Ассемблере. В секции данных предварительно подготовим следующие данные:
  1. section '.data' data readable writeable
  2.  
  3. buff1   rb 500h         ; Буфер для исходной ссылки
  4. buff2   rb 500h         ; Буфер для готовой ссылки
  5. buff3   rb 100h         ; Хэш
  6.  
  7. mask    db '%.8X',0
  8.  
  9. p1      db 'http://toolbarqueries.google.ru/tbr?features='
  10.         db 'Rank&client=navclient-auto-ff&ch=8',0
  11. p2      db '&q=info:',0
  12.  
  13. HASH    db "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. "
  14.         db "Yes, I'm talking to you, scammer."
  15. h_len   = $-HASH
А вот так вычисляется хэш и составляется ссылка. Код прокомментирован, остальное можно наглядно посмотреть в варианте JavaScript. Подразумевается, что в buff1 уже содержится исходная ссылка.
  1.         ; Записать первую часть ссылки
  2.         invoke  lstrcpy,buff2,p1
  3.  
  4.         ; Инициализация хэша
  5.         mov     ebx,1020345h
  6.         xor     ecx,ecx
  7.  
  8.         ; Вычисление хэша
  9. .loc_encode:
  10.         mov     al,byte [buff1+ecx]
  11.         or      al,al
  12.         jz      .loc_end_encode
  13.  
  14.         xor     bl,al
  15.  
  16.         push    ecx
  17.         xor     edx,edx
  18.         mov     eax,h_len
  19.         xchg    eax,ecx
  20.         div     ecx
  21.         mov     al,byte [HASH+edx]
  22.         xor     bl,al
  23.         pop     ecx
  24.  
  25.         mov     eax,ebx
  26.         shr     ebx,23
  27.         shl     eax,9
  28.         or      ebx,eax
  29.  
  30.         inc     ecx
  31.         jmp     .loc_encode
  32.  
  33. .loc_end_encode:
  34.  
  35.         ; Добавить в ссылку строку хэша
  36.         invoke  wsprintf,buff3,mask,ebx
  37.         add     esp,12
  38.         invoke  lstrcat,buff2,buff3
  39.  
  40.         ; Добавить вторую часть ссылки
  41.         invoke  lstrcat,buff2,p2
  42.         mov     edi,buff2
  43.         invoke  lstrlen,buff2
  44.         add     edi,eax
  45.         mov     esi,buff1
  46.  
  47.         ; URL-encoded ссылка
  48. .loc_scan:
  49.         lodsb
  50.         or      al,al
  51.         jz      .loc_end
  52.  
  53.         cmp     al,':'
  54.         jne     @f
  55.  
  56.         mov     eax,'%3A'
  57.         stosd
  58.         dec     edi
  59.         jmp     .loc_scan
  60. @@:
  61.         cmp     al,'/'
  62.         jne     @f
  63.  
  64.         mov     eax,'%2F'
  65.         stosd
  66.         dec     edi
  67.         jmp     .loc_scan
  68. @@:
  69.         cmp     al,'?'
  70.         jne     @f
  71.  
  72.         mov     eax,'%3F'
  73.         stosd
  74.         dec     edi
  75.         jmp     .loc_scan
  76. @@:
  77.         cmp     al,'&'
  78.         jne     @f
  79.  
  80.         mov     eax,'%26'
  81.         stosd
  82.         dec     edi
  83.         jmp     .loc_scan
  84. @@:
  85.         stosb
  86.         jmp     .loc_scan
  87.  
  88. .loc_end:
  89.         xor     eax,eax
  90.         stosb
  91.         ; В buff2 теперь находится ссылка для получения PR
В приложении готовый пример программы на Ассемблере, получающий из исходной ссылки новую ссылку для определения Google PageRank.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Google.PageRank.Demo.zip (3,047 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 5319 | Комментариев: 12

Метки: JavaScript, SEO, Assembler
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (03.11.2013 в 20:11):
А вот здесь проверяют по разным доменам гугла.
http://msurf.ru/tools/prbydcgoogle/
Видимо надо проверять не по ip, а по доменам с максимальным разбросом.

toolbarqueries.google.com.br -> 74.125.143.103
toolbarqueries.google.com.ar -> 74.125.143.147
toolbarqueries.google.com -> 173.194.71.105
toolbarqueries.google.ua -> 173.194.71.99
toolbarqueries.google.gl -> 74.125.143.99
toolbarqueries.google.com.fj -> 74.125.143.105
toolbarqueries.google.mg -> 74.125.143.103

и так далее
Gleb (30.10.2013 в 18:12):
Скажите пожалуйста, а если мне нужно проверить сайт на разных датацентрах и у меня есть их айпишники, то куда необходимо вставить адрес датацентра?
Я вставлял сюда вместо "toolbarqueries.google.ru" но, к сожалению не работает.
ManHunter (22.10.2013 в 17:27):
Никак не называется. Гугловская самоделка.
Gleb (22.10.2013 в 17:26):
Отлично, JS работает.
Мне бы на С# реализацию...
Как называется использованный алгоритм кодирования?
Jon (20.10.2011 в 18:22):
Шикарно, респект.
ManHunter (17.10.2011 в 16:40):
Jon, выложил решение на Ассемблере.
ManHunter (17.10.2011 в 14:43):
deadlink, ты прежде чем тут подобную хуйню постить, проверил бы на каком-нибудь примере. И не просто проверил, а сравнил бы с результатами работы скрипта на JS, попробовал бы получить данные с гугла и т.д.
deadlink (17.10.2011 в 14:39):
<?php
//by deadlink

/* --- весь бред на PHP вырезан --- */

?>
Jon (15.10.2011 в 00:29):
Буду очень признателен за сорцы на асме ;)
DROOPY (14.10.2011 в 15:38):
Реализация на TCL ;)

set HASH_SEED "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer."

proc awesomeHash a {
    global HASH_SEED
    set b 16909125
    for {set c 0} {$c < [string length $a]} {incr c} {
        set b [expr $b ^ [scan [string index $HASH_SEED [expr $c % [string length $HASH_SEED]]] %c] ^ [scan [string index $a $c] %c]]
        set b [expr ($b >> 23 | $b << 9)  % 4294967296]
    }     
    return "8[format %08x $b]"
}
ManHunter (10.10.2011 в 16:20):
Такие вещи стоят денег, с учетом того, сколько инструментария буквально в один день стало бесполезным. Решение на Ассемблере могу выложить бесплатно :)
semenov (10.10.2011 в 16:19):
Было бы неплохо реализацию на PHP увидеть

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.006 сек.) / Память: 4.5 Mb
Наверх