проверка Google PR на C#

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
немного магии ))
как с помощью снипета проверить PR страницы? самое сложно это подсчиттаь hash от URL. Остальное не так сложно ))
вот код который генерирует URL для запроса у Google PR старницы:
C#:
var url = project.Variables["url"].Value;
var myUri = new Uri(url);
string srUrl = myUri.AbsoluteUri;
// calc Google hash
string urlToHash = srUrl;
urlToHash = string.Format("info:{0}", urlToHash);

int length = urlToHash.Length;

UInt32 a, b;
UInt32 c = 0xE6359A60;

int k = 0;
int len = length;

a = b = 0x9E3779B9;

while (len >= 12)
{
    a += (UInt32)(urlToHash[k + 0] + (urlToHash[k + 1] << 8) + (urlToHash[k + 2] << 16) + (urlToHash[k + 3] << 24));
    b += (UInt32)(urlToHash[k + 4] + (urlToHash[k + 5] << 8) + (urlToHash[k + 6] << 16) + (urlToHash[k + 7] << 24));
    c += (UInt32)(urlToHash[k + 8] + (urlToHash[k + 9] << 8) + (urlToHash[k + 10] << 16) + (urlToHash[k + 11] << 24));
    a -= b; a -= c; a ^= c >> 13;
    b -= c; b -= a; b ^= a << 8;
    c -= a; c -= b; c ^= b >> 13;
    a -= b; a -= c; a ^= c >> 12;
    b -= c; b -= a; b ^= a << 16;
    c -= a; c -= b; c ^= b >> 5;
    a -= b; a -= c; a ^= c >> 3;
    b -= c; b -= a; b ^= a << 10;
    c -= a; c -= b; c ^= b >> 15;
    k += 12;
    len -= 12;
}
c += (UInt32)length;
switch (len) 
{
    case 11:
        c += (UInt32)(urlToHash[k + 10] << 24);
        goto case 10;
    case 10:
        c += (UInt32)(urlToHash[k + 9] << 16);
        goto case 9;
    case 9:
        c += (UInt32)(urlToHash[k + 8] << 8);
        goto case 8;
    case 8:
        b += (UInt32)(urlToHash[k + 7] << 24);
        goto case 7;
    case 7:
        b += (UInt32)(urlToHash[k + 6] << 16);
        goto case 6;
    case 6:
        b += (UInt32)(urlToHash[k + 5] << 8);
        goto case 5;
    case 5:
        b += urlToHash[k + 4];
        goto case 4;
    case 4:
        a += (UInt32)(urlToHash[k + 3] << 24);
        goto case 3;
    case 3:
        a += (UInt32)(urlToHash[k + 2] << 16);
        goto case 2;
    case 2:
        a += (UInt32)(urlToHash[k + 1] << 8);
        goto case 1;
    case 1:
        a += urlToHash[k + 0];
        break;
}

a -= b; a -= c; a ^= c >> 13;
b -= c; b -= a; b ^= a << 8;
c -= a; c -= b; c ^= b >> 13;
a -= b; a -= c; a ^= c >> 12;
b -= c; b -= a; b ^= a << 16;
c -= a; c -= b; c ^= b >> 5;
a -= b; a -= c; a ^= c >> 3;
b -= c; b -= a; b ^= a << 10;
c -= a; c -= b; c ^= b >> 15;
var checksum = string.Format("6{0}", c);
// generate Query URL
return string.Format("http://toolbarqueries.google.com/tbr?client=navclient-auto&features=Rank&ch={0}&features=Rank&q=info:{1}", checksum, System.Web.HttpUtility.UrlEncode(srUrl));
 

Вложения

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
:dm::bm:
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63

BM17

Client
Регистрация
15.08.2014
Сообщения
5
Благодарностей
0
Баллы
1
немного магии ))
как с помощью снипета проверить PR страницы? самое сложно это подсчиттаь hash от URL. Остальное не так сложно ))
вот код который генерирует URL для запроса у Google PR старницы:
C#:
var url = project.Variables["url"].Value;
var myUri = new Uri(url);
string srUrl = myUri.AbsoluteUri;
// calc Google hash
string urlToHash = srUrl;
urlToHash = string.Format("info:{0}", urlToHash);

int length = urlToHash.Length;

UInt32 a, b;
UInt32 c = 0xE6359A60;

int k = 0;
int len = length;

a = b = 0x9E3779B9;

while (len >= 12)
{
    a += (UInt32)(urlToHash[k + 0] + (urlToHash[k + 1] << 8) + (urlToHash[k + 2] << 16) + (urlToHash[k + 3] << 24));
    b += (UInt32)(urlToHash[k + 4] + (urlToHash[k + 5] << 8) + (urlToHash[k + 6] << 16) + (urlToHash[k + 7] << 24));
    c += (UInt32)(urlToHash[k + 8] + (urlToHash[k + 9] << 8) + (urlToHash[k + 10] << 16) + (urlToHash[k + 11] << 24));
    a -= b; a -= c; a ^= c >> 13;
    b -= c; b -= a; b ^= a << 8;
    c -= a; c -= b; c ^= b >> 13;
    a -= b; a -= c; a ^= c >> 12;
    b -= c; b -= a; b ^= a << 16;
    c -= a; c -= b; c ^= b >> 5;
    a -= b; a -= c; a ^= c >> 3;
    b -= c; b -= a; b ^= a << 10;
    c -= a; c -= b; c ^= b >> 15;
    k += 12;
    len -= 12;
}
c += (UInt32)length;
switch (len)
{
    case 11:
        c += (UInt32)(urlToHash[k + 10] << 24);
        goto case 10;
    case 10:
        c += (UInt32)(urlToHash[k + 9] << 16);
        goto case 9;
    case 9:
        c += (UInt32)(urlToHash[k + 8] << 8);
        goto case 8;
    case 8:
        b += (UInt32)(urlToHash[k + 7] << 24);
        goto case 7;
    case 7:
        b += (UInt32)(urlToHash[k + 6] << 16);
        goto case 6;
    case 6:
        b += (UInt32)(urlToHash[k + 5] << 8);
        goto case 5;
    case 5:
        b += urlToHash[k + 4];
        goto case 4;
    case 4:
        a += (UInt32)(urlToHash[k + 3] << 24);
        goto case 3;
    case 3:
        a += (UInt32)(urlToHash[k + 2] << 16);
        goto case 2;
    case 2:
        a += (UInt32)(urlToHash[k + 1] << 8);
        goto case 1;
    case 1:
        a += urlToHash[k + 0];
        break;
}

a -= b; a -= c; a ^= c >> 13;
b -= c; b -= a; b ^= a << 8;
c -= a; c -= b; c ^= b >> 13;
a -= b; a -= c; a ^= c >> 12;
b -= c; b -= a; b ^= a << 16;
c -= a; c -= b; c ^= b >> 5;
a -= b; a -= c; a ^= c >> 3;
b -= c; b -= a; b ^= a << 10;
c -= a; c -= b; c ^= b >> 15;
var checksum = string.Format("6{0}", c);
// generate Query URL
return string.Format("http://toolbarqueries.google.com/tbr?client=navclient-auto&features=Rank&ch={0}&features=Rank&q=info:{1}", checksum, System.Web.HttpUtility.UrlEncode(srUrl));
 

BM17

Client
Регистрация
15.08.2014
Сообщения
5
Благодарностей
0
Баллы
1
пишет ошибку:
System.ArgumentException: Значение не попадает в ожидаемый диапазон.
в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
в ZennoLab.AssemblyCompiler.Forms.AssembliesFormGAC.AssemblyCache.QueryAssemblyInfo(String assemblyName)
в ZennoLab.ZennoPoster.Modules.TemplateExecutor.V5.ExecutorOfStepsV5.p5EUL26BvRtmkVLtdkFX(Object )
в ZennoLab.ZennoPoster.Modules.TemplateExecutor.V5.ExecutorOfStepsV5.CompileCode(Boolean& errorCompile)

как исправить?
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
я вам в личку отправил тестовый билд, посмотрите на нем пожалуйста и пришлите логи, если продолжает падать.
 

BM17

Client
Регистрация
15.08.2014
Сообщения
5
Благодарностей
0
Баллы
1
та же ошибка.
логи отправил в личку
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=AMD64
оригинальный проект хотел сборку из .NET Framewrok 2.0, который скорее всего у вас не установлен
Переделал проект, чтобы брал сборку из 4 Framework.
Проверяйте, должно заработать.
 

Вложения

BM17

Client
Регистрация
15.08.2014
Сообщения
5
Благодарностей
0
Баллы
1
Заработало, спасибо.
Правда, только после того, как я из References удалил и снова добавил System.Web.
Причем, как оказалось, работает и с System.Web 2.0.0.0 и System.Web 4.0.0.0.
А далее еще странность: если я снова удаляю System.Web, то этот проект все равно выполняется без ошибок. Это глюк?
А также вопрос: это нормально, когда меняешь состав References, и закрываешь проект, то PM не спрашивает, сохранить проект или нет? Зато, когда снова этот проект открываешь, то видно, что изменения в References были сохранены.
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
тогда возможно у вас система 32 бита, а в референсы по умолчанию кидается сборка от 64 битных систем, которая не ставится на 32 битных виндах.
с сохранением глюк скорее всего.
 

BM17

Client
Регистрация
15.08.2014
Сообщения
5
Благодарностей
0
Баллы
1
ок, понял. да, 32

спасибо за PR-снипет!
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)