1
+ // This module checks a domain's Google pagerank (rate limits obviously apply)
2
+ //
3
+ // 1. To find the rank of a domain for a given keyword:
4
+ // $ echo "mastercard.com" | node.io -s google_pagerank
5
+ // => mastercard.com,7
6
+
7
+ var Job = require ( '../' ) . Job ;
8
+
9
+ exports . job = new Job ( { timeout :10 , retries :3 } , {
10
+
11
+ run : function google ( input ) {
12
+ var self = this ;
13
+
14
+ var url = input ;
15
+ if ( ! ~ url . indexOf ( 'http://' ) ) url = 'http://' + url ;
16
+
17
+ var ch = '6' + GoogleCH ( strord ( 'info:' + url ) ) ;
18
+
19
+ this . get ( 'http://www.google.com/search?client=navclient-auto&ch=' + ch + '&features=Rank&q=info:' + encodeURIComponent ( url ) , function ( err , data ) {
20
+ if ( err ) self . retry ( ) ;
21
+
22
+ if ( ! ~ data . indexOf ( 'Rank_1:1:' ) ) {
23
+ self . emit ( input + ',' ) ;
24
+ } else {
25
+ self . emit ( input + ',' + data . substr ( 9 ) ) ;
26
+ }
27
+ } ) ;
28
+ } ,
29
+
30
+ fail : function ( input ) {
31
+ this . emit ( input + ',' ) ;
32
+ }
33
+
34
+ } ) ;
35
+
36
+ function zF ( a , b ) {
37
+ var z = parseInt ( 80000000 , 16 ) ;
38
+ if ( z & a ) {
39
+ a = a >> 1 ;
40
+ a &= ~ z ;
41
+ a |= 0x40000000 ;
42
+ a = a >> ( b - 1 ) ;
43
+ } else {
44
+ a = a >> b ;
45
+ }
46
+ return ( a ) ;
47
+ }
48
+
49
+ function mix ( a , b , c ) {
50
+ a -= b ; a -= c ; a ^= ( zF ( c , 13 ) ) ;
51
+ b -= c ; b -= a ; b ^= ( a << 8 ) ;
52
+ c -= a ; c -= b ; c ^= ( zF ( b , 13 ) ) ;
53
+ a -= b ; a -= c ; a ^= ( zF ( c , 12 ) ) ;
54
+ b -= c ; b -= a ; b ^= ( a << 16 ) ;
55
+ c -= a ; c -= b ; c ^= ( zF ( b , 5 ) ) ;
56
+ a -= b ; a -= c ; a ^= ( zF ( c , 3 ) ) ;
57
+ b -= c ; b -= a ; b ^= ( a << 10 ) ;
58
+ c -= a ; c -= b ; c ^= ( zF ( b , 15 ) ) ;
59
+ return ( new Array ( ( a ) , ( b ) , ( c ) ) ) ;
60
+ }
61
+ function GoogleCH ( url , length ) {
62
+ if ( arguments . length == 1 ) length = url . length ;
63
+ var a = 0x9E3779B9 , b = 0x9E3779B9 , c = 0xE6359A60 , k = 0 , len = length , mx = new Array ( ) ;
64
+ while ( len >= 12 ) {
65
+ a += ( url [ k + 0 ] + ( url [ k + 1 ] << 8 ) + ( url [ k + 2 ] << 16 ) + ( url [ k + 3 ] << 24 ) ) ;
66
+ b += ( url [ k + 4 ] + ( url [ k + 5 ] << 8 ) + ( url [ k + 6 ] << 16 ) + ( url [ k + 7 ] << 24 ) ) ;
67
+ c += ( url [ k + 8 ] + ( url [ k + 9 ] << 8 ) + ( url [ k + 10 ] << 16 ) + ( url [ k + 11 ] << 24 ) ) ;
68
+ mx = mix ( a , b , c ) ;
69
+ a = mx [ 0 ] ; b = mx [ 1 ] ; c = mx [ 2 ] ;
70
+ k += 12 ; len -= 12 ;
71
+ }
72
+ c += length ;
73
+ switch ( len ) {
74
+ case 11 : c += url [ k + 10 ] << 24 ;
75
+ case 10 : c += url [ k + 9 ] << 16 ;
76
+ case 9 :c += url [ k + 8 ] << 8 ;
77
+ case 8 :b += ( url [ k + 7 ] << 24 ) ;
78
+ case 7 :b += ( url [ k + 6 ] << 16 ) ;
79
+ case 6 :b += ( url [ k + 5 ] << 8 ) ;
80
+ case 5 :b += ( url [ k + 4 ] ) ;
81
+ case 4 :a += ( url [ k + 3 ] << 24 ) ;
82
+ case 3 :a += ( url [ k + 2 ] << 16 ) ;
83
+ case 2 :a += ( url [ k + 1 ] << 8 ) ;
84
+ case 1 :a += ( url [ k + 0 ] ) ;
85
+ }
86
+ mx = mix ( a , b , c ) ;
87
+ if ( mx [ 2 ] < 0 ) {
88
+ return ( 0x100000000 + mx [ 2 ] ) ;
89
+ } else {
90
+ return ( mx [ 2 ] ) ;
91
+ }
92
+ }
93
+ function strord ( string ) {
94
+ var result = new Array ( ) ;
95
+ for ( i = 0 ; i < string . length ; i ++ ) {
96
+ result [ i ] = string [ i ] . charCodeAt ( 0 ) ;
97
+ }
98
+ return ( result ) ;
99
+ }
0 commit comments