Remove fake links 0.1.9 (2012-10-16)

Автор: Infocatcher
Описание: удаляет перенаправляющие ссылки на Google и Yandex.

Например, при нажатии мыши ссылки в результатах поиска в Yandex заменяются на http://clck.yandex.ru/redir/... , а в Google – на http://www.google.ru/url?...

Установить: remove_fake_links.user.js

Код скрипта:

Выделить код

Код:

// ==UserScript==
// @name        Remove fake links
// @description Remove tracking redirects like http://www.google.com/url?... and http://clck.yandex.ru/redir/...
// @author      Infocatcher
// @version     0.1.9 - 2012-10-16
// @run-at      document-start
// @namespace   dev/null
// @include     http://www.google.*/search?*
// @include     https://www.google.*/search?*
// @include     http://www.google.*/webhp?*
// @include     https://www.google.*/webhp?*
// @include     http://www.google.*/#*q=*
// @include     https://www.google.*/#*q=*
// @include     http://www.google.*/imgres?*
// @include     https://www.google.*/imgres?*
// @include     http://groups.google.com/*
// @include     https://groups.google.com/*
// @include     http://yandex.*/yandsearch?*
// @include     https://yandex.*/yandsearch?*
// @include     http://market.yandex.ru/model.xml?*
// @include     https://market.yandex.ru/model.xml?*
// @grant       none
// ==/UserScript==

window.addEventListener("mousedown", function(e) {
    var exclude;
    // Uncomment following to leave "Warning - visiting this web site may harm your computer!"
    //exclude = /^https?:\/\/(?:www\.)google\.[\w.]+\/interstitial\?url=http\S+$/;
    for(var a = e.target; a && a.localName; a = a.parentNode) {
        if(a.localName.toLowerCase() == "a" && a.href) {
            if(a.hasAttribute("onmousedown")) {
                a.setAttribute("__deleted__onmousedown", a.getAttribute("onmousedown"));
                a.removeAttribute("onmousedown");
            }
            if(a.hasAttribute("onclick")) {
                var onclick = a.getAttribute("onclick");
                if(/(^|\W)location\.replace\(/.test(onclick)) {
                    a.setAttribute("__deleted__onclick", onclick);
                    a.removeAttribute("onclick");
                }
            }
            if(exclude && exclude.test(a.href))
                break;
            else if(/^https?:\/\/(?:\w+\.)?google\.[\w.]+\/.*=(https?:\/\/[^&?]*)/.test(a.href)) {
                var h = RegExp.$1;
                if(!/^https?:\/\/(?:\w+\.)?google\.[\w.]+\/(search|imgres)\?/.test(a.href))
                    a.href = decodeURIComponent(h);
            }
            else if(/^https?:\/\/clck\.yandex\.\w+\/redir\/.*?\*(https?:\/\/.*)$/.test(a.href))
                a.href = RegExp.$1;
            break;
        }
    }
}, true);



Разрабатываемая версия (будьте осторожны!)

У меня вот тут ссылки на результаты не обрабатываются скриптом, потому что URL имеет вид google.*/webhp? вместо google.*/search?

_iD пишет:

потому что URL имеет вид google.*/webhp? вместо google.*/search?

Угу. Добавил

Выделить код

Код:

// @include     http://www.google.*/webhp?*
// @include     https://www.google.*/webhp?*

Спасибо. А расширение Паланта я посмотрел - оно на той странице правильно срабатывает. Полез смотреть код, т.к. думал, что это дополнение - обёрнутый в джетпак юзерскрипт, а код там совсем не как у юзерскриптов, так что понять разницу в работе этого скрипта и джетпака от Паланта - мне не удалось.

Есть еще
https://encrypted.google.com/*
(без всяких search? и webhp?)

https://encrypted.google.com/

И для него RegExp нужно переписать - недостаточно просто добавить @include
Кроме того, imho, может быть ситуация
http://google.*/
то есть без www.

И .test со странностями работает в отличие от .search

Почемучкин пишет:

без всяких search?

Если отключить скрипты, будет https://encrypted.google.com/search?...

Добавил
Только там экспериментальная версия, обрабатывающая дополнительно "mouseover" и "focus" (то есть при наведении курсора в строке состояния будет показана уже очищенная ссылка, и можно открывать ссылки с клавиатуры).

Почемучкин пишет:

И для него RegExp нужно переписать

Эээ... А что конкретно не так?

Почемучкин пишет:

http://google.*/
то есть без www.

У меня  всегда перенаправляет на www.

Почемучкин пишет:

И .test со странностями работает в отличие от .search

Примеры?

Infocatcher, Это эти скрипты?

скрытый текст
Поиск в Гугле и Яндексе — если заглянуть в html-код страницы результатов поиска Гугла, то можно убедиться, что все найденные результаты являются не просто ссылками. Каждая ссылка результатов поиска содержит метод onmousedown, который заставляет браузер выполнить особые действия по щелчку на ссылке. В данном случае переход на нужную страницу происходит через редирект на адрес-посредник. То есть сначала браузер идёт на сервер Гугла, и только после захода туда происходит переход на нужную страницу. Переход осуществляется достаточно быстро, что незаметно на широком канале. А между тем, в Гугл попадает статистика с информацией, что ты искал и куда, в результате, пошёл. То же самое делает и Яндекс, и Яху, и многие другие поисковики. Противостоять этому можно, используя в браузере клиентские скрипты, которые приведут ссылки в правильный формат. Установи плагин к Фаерфоксу дополнение Greasemonkey и добавь в список скрипты зачистки ссылок для Гугла и Яндекса. Полный список приложений на donttrack.us. Это единственный способ борьбы. Даже если настроить поиск Гугла, чтобы тот не сохранял историю поиска, это ни к чему не приведёт. Однако ссылку можно открыть в новой вкладке, это минует onmousedown и не даст Гуглу узнать правду.

amin01
Да, они самые.

Infocatcher
>> И .test со странностями работает в отличие от .search
> Примеры?


При проверке в цикле с помощью .test были глюки. Я не стал разбираться абсолютно до конца в чем дело было, вернувшись к проверенному .search, но похоже, что RegExp запоминал позицию и при следующем вызове .test мог что-то пропустить. С .search такого не случается никогда.

Почемучкин
А не надо использовать для проверки регулярные выражения с флагом g.

Выделить код

Код:

var s = "0123456789";
var r = /\d/;
var res = [];
for(var i = 0; i < 10; ++i)
    if(r.test(s))
        res.push(RegExp.lastMatch);
alert(res.join("\n"));

r = /\d/g;
res = [];
for(var i = 0; i < 10; ++i)
    if(r.test(s))
        res.push(RegExp.lastMatch);
alert(res.join("\n"));

Infocatcher
Ясно. Я кажется припоминаю, что хотел использовать одни и те же RegExp для проверки и для замены подстроки. С .test это глючило, да, кажется именно из-за флага /g

Почемучкин
Ну, это скорее так и задумано, чем «глючило».
Можно вот так сделать:

Выделить код

Код:

var s = "0123456789";
var r = /\d/g;
var res = [];
for(var i = 0; i < 10; ++i) {
    r.lastIndex = 0;
    if(r.test(s))
        res.push(RegExp.lastMatch);
}
alert(res.join("\n"));

Infocatcher
Здравствуйте.

Версия 0.2.0pre12 - 2015-01-19 в поиске на www.google.com также "очищает" кнопку логина в аккаунт:
https://lh4.ggpht.com/-mDIOrLzFNK0/VNwUJNAr70I/AAAAAAAAaq4/BPJ_kjN-hig/s0/screenshot%2525202015-02-12%252520002.png

и ссылки "перевести эту страницу":
https://lh4.ggpht.com/-QedDg7feErI/VNwUmt-pNaI/AAAAAAAAarA/Hzyw6dgwLns/s0/screenshot%2525202015-02-12%252520004.png

И спасибо вам за скрипт.

(еще хотелка: нельзя ли добавить поддержку DuckDuckGo? Того что duckduckgo.com, а не duckduckgo.com/html/ (последний таким не балуется). Пример ссылки из результатов поиска:
https://duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.test-search.com%2F)

Infocatcher
Спасибо вам за скрипт. Но вот попался мне скрипт Straight Google, там вроде ссылок по более, и есть youtube.com. Может стоило бы учесть их.

turbot пишет:

в поиске на www.google.com также "очищает" кнопку логина в аккаунт
...
и ссылки "перевести эту страницу"

Подправил: https://github.com/Infocatcher/UserScri … 9b5f1f55fd

turbot пишет:

(еще хотелка: нельзя ли добавить поддержку DuckDuckGo? Того что duckduckgo.com, а не duckduckgo.com/html/ (последний таким не балуется). Пример ссылки из результатов поиска:
https://duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.test-search.com%2F)

Я посмотрю.

AlexCondor пишет:

Но вот попался мне скрипт Straight Google, там вроде ссылок по более, и есть youtube.com. Может стоило бы учесть их.

Там много всего... лучше реальные примеры смотреть.

turbot пишет:

(еще хотелка: нельзя ли добавить поддержку DuckDuckGo? Того что duckduckgo.com, а не duckduckgo.com/html/ (последний таким не балуется). Пример ссылки из результатов поиска:
https://duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.test-search.com%2F)

Вроде, получилось, но пришлось порезать местный код, навешивающий редиректы: https://github.com/Infocatcher/UserScri … 7a91613ee2

Infocatcher
Спасибо. Вроде все отлично работает.

Поправьте, пожалуйста, работу версии, находящейся в разработке, с яндексом. Если адрес начинается с www, то скрипт не подключается (https://www.yandex.ru/)

Kon Diter пишет:

Поправьте, пожалуйста, работу версии, находящейся в разработке, с яндексом. Если адрес начинается с www, то скрипт не подключается (https://www.yandex.ru/)

Спасибо, подправил: https://github.com/Infocatcher/UserScri … 503a773872

Скажите, расширение https://addons.mozilla.org/ru/firefox/addon/clean-links/ выполняет ту же функцию, чем лучше пользоваться ?

Infocatcher
Подскажите пожалуйста, как можно скачать файл с гитхаба? Пробовал скачивать, переименовывать в .js и редактировать текстовым редактором (удалить лишнее в шапке и внизу). Так всё открывается с html-тегами. Три раза попробовал.. [firefox] так и не увидел ни строки..

Douglas
https://lh3.googleusercontent.com/-cNIp … pboard.png

turbot
Огромное спасибо!

На 4pda ссылка для входа режется.

ElFrio пишет:

На 4pda ссылка для входа режется.

Подправил, спасибо: https://github.com/Infocatcher/UserScri … 6c755d1a89

Не очень понял: как им пользоваться?

А как обстоят дела с яндекс.маркетом? Там появились ссылки https://market-click2.yandex.ru/redir/*

Douglas
А как из таких ссылок извлечь оригинальную?
Там же вот такое:

Выделить код

Код:

https://market-click2.yandex.ru/redir/<буквоцифры>?data=<снова_буквоцифры>&b64e=1&sign=<тут_похоже_на_MD5>&keyno=1

Буквоцифры, впрочем, похожи на какую-то модификацию base 64.
Но простая замена алфавита

Выделить код

Код:

- -> +
_ -> /

не помогает. Возможно, там еще шифруется как-то.

Infocatcher пишет:

Буквоцифры, впрочем, похожи на какую-то модификацию base 64.

Наличие "b64e" в ссылке как бы намекает на base64. Но для base64 там неестественно большое (да ещё и непостоянное) соотношение длин кодированного и исходного URL - от 1,9 до 5,5.

Перестал работать скрипт. Можно исправить?

Infocatcher
Можете добавить в скрипт eventlistener "touchstart"?