Буквально на днях Google поменял алгоритм, по которому генерировалась ссылка для получения показателей Google PageRank. В результате этого отвалились многие сервисы, вспомогательные программы, сторонние тулбары, счетчики и еще бессчетное количество сеошного барахла. Мне было бы глубоко фиолетово на их проблемы, но у меня на сайте тоже используется система автоматического съема значений Google PR. Поэтому пришлось быстренько адаптироваться к новым условиям. Я установил себе гугловский тулбар, быстренько выпотрошил его и получил алгоритм генерации ссылки для получения Google PageRank. Вот как он выглядит на JavaScript:
<script type="text/javascript">
// Программисты Google явно с юмором :)
var HASH_SEED = "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. "+
"Yes, I'm talking to you, scammer.";
// Расчет хэша строки запроса
awesomeHash = function(a) {
var b = 16909125;
for (c = 0; c < a.length; c++) {
b ^= HASH_SEED.charCodeAt(c % HASH_SEED.length) ^ a.charCodeAt(c);
b = b >>> 23 | b << 9;
}
return '8'+hexEncodeU32(b);
};
// Перевод числа в HEX-значение
hexEncodeU32 = function(a) {
var b = toHex8(a >>> 24);
b += toHex8(a >>> 16 & 255);
b += toHex8(a >>> 8 & 255);
return b + toHex8(a & 255)
};
toHex8 = function(a) {
return (a < 16 ? "0": "") + a.toString(16)
};
// Функция получения ссылки для запроса Google PR
getPageRankLink = function(a) {
return 'http://toolbarqueries.google.ru/tbr?features=Rank'+
'&client=navclient-auto-ff&ch='+awesomeHash(a)+'&q=info:'+
encodeURIComponent(a);
}
</script>
Функция вызывается следующим образом. На входе подается ссылка на страницу, для которой требуется рассчитать Google PageRank, на выходе получаем ссылку, по которой можно узнать результат.
<script type="text/javascript">
// Пример использования
st='http://www.manhunter.ru/'
alert(getPageRankLink(st));
</script>
Результат запроса к гугловскому серверу возвращается в виде строки, например, "Rank_1:1:2". Последняя цифра и есть искомое значение рейтинга страницы. Алгоритм можно без особого труда перевести на другие языки программирования.
Например, вот моя реализация на Ассемблере. В секции данных предварительно подготовим следующие данные:
section '.data' data readable writeable
buff1 rb 500h ; Буфер для исходной ссылки
buff2 rb 500h ; Буфер для готовой ссылки
buff3 rb 100h ; Хэш
mask db '%.8X',0
p1 db 'http://toolbarqueries.google.ru/tbr?features='
db 'Rank&client=navclient-auto-ff&ch=8',0
p2 db '&q=info:',0
HASH db "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. "
db "Yes, I'm talking to you, scammer."
h_len = $-HASH
А вот так вычисляется хэш и составляется ссылка. Код прокомментирован, остальное можно наглядно посмотреть в варианте JavaScript. Подразумевается, что в buff1 уже содержится исходная ссылка.
; Записать первую часть ссылки
invoke lstrcpy,buff2,p1
; Инициализация хэша
mov ebx,1020345h
xor ecx,ecx
; Вычисление хэша
.loc_encode:
mov al,byte [buff1+ecx]
or al,al
jz .loc_end_encode
xor bl,al
push ecx
xor edx,edx
mov eax,h_len
xchg eax,ecx
div ecx
mov al,byte [HASH+edx]
xor bl,al
pop ecx
mov eax,ebx
shr ebx,23
shl eax,9
or ebx,eax
inc ecx
jmp .loc_encode
.loc_end_encode:
; Добавить в ссылку строку хэша
invoke wsprintf,buff3,mask,ebx
add esp,12
invoke lstrcat,buff2,buff3
; Добавить вторую часть ссылки
invoke lstrcat,buff2,p2
mov edi,buff2
invoke lstrlen,buff2
add edi,eax
mov esi,buff1
; URL-encoded ссылка
.loc_scan:
lodsb
or al,al
jz .loc_end
cmp al,':'
jne @f
mov eax,'%3A'
stosd
dec edi
jmp .loc_scan
@@:
cmp al,'/'
jne @f
mov eax,'%2F'
stosd
dec edi
jmp .loc_scan
@@:
cmp al,'?'
jne @f
mov eax,'%3F'
stosd
dec edi
jmp .loc_scan
@@:
cmp al,'&'
jne @f
mov eax,'%26'
stosd
dec edi
jmp .loc_scan
@@:
stosb
jmp .loc_scan
.loc_end:
xor eax,eax
stosb
; В buff2 теперь находится ссылка для получения PR
В приложении готовый пример программы на Ассемблере, получающий из исходной ссылки новую ссылку для определения Google PageRank.