Образовательный портал «Кафедра онлайн» НИЯУ «МИФИ», Обнинск"

Реквием JS-интерфейсу Google Ajax Search

В.П. Тельнов, канд. техн. наук, доцент ИАТЭ НИЯУ «МИФИ», Обнинск

Замечание. Как обнаружили студенты, весной 2015г. обсуждаемый Javascript-интерфейс к поисковой машине Google Ajax Search заработал вновь. Надолго ли?

Широкие круги веб-разработчиков с прискорбием узнали о том, что 01.11.2013г. Гугл собственноручно убил Javascript-интерфейс к своей поисковой машине Google Ajax Search, ничего при этом не предложив взамен. Данный софт был доступен с публичных хостингов (CDN) через стандартный загрузчик Гугла:

<script type=’text/javascript’ src=’https://www.google.com/jsapi’></script>
<script type=’text/javascript’>google.load(‘search’, 1);</script>

Доступен он и сейчас, но код на CDN безнадежно испорчен. Перестали работать многочисленные примеры в интернете, посвященные данному софту.

При этом серверные скрипты, ответственные за сам процесс глобального поиска, остались целы и невредимы: http://www.google.com/uds/GwebSearch?v=1.0&q=ксст.

Возможно, некоторые предусмотрительные веб-разработчики заранее скачали нужный JS-код c CDN, и теперь злорадно продолжают его юзать, загружая со своих хостингов.

Как это было


В ноябре 2010г. упомянутый JS-интерфейс был объявлен Гуглом как deprecated (порицаемый) и через три года перестал работать.

Действительно, с точки зрения технологии данный софт не был выдающимся образцом программирования. Например, вкладки на странице результатов были сделаны на базе тегов <table>. Дизайн выдаваемых страниц, наверное, тоже нельзя было назвать блестящим.

Однако, сотни (тысячи?) веб-ресурсов по всему миру использовали этот JS-интерфейс, программно работая с поисковыми машинами Гугла. Применялся он и на наших кафедральных ресурсах http://ksst.obninsk.ru. В настоящее время в сети на многочисленных профессиональных форумах недоумевающие веб-разработчики вопрошают: а что же теперь?

А что теперь?

А теперь либо смотрим в сторону Yahoo, либо напрямую работаем с поисковыми машинами Гугла:

https://ajax.googleapis.com/ajax/services/search/web/?…

Самостоятельно формируем запросы к серверным скриптам, в ответ получаем порции фидов в формате JSON, которые потом разбираем. Сами выкладываем на веб-страницы и оформляем полученные результаты поиска. Полная свобода, однако.

Нет сомнения, что в скором будущем в сети обнаружатся достойные решения, своим качеством превосходящие JS-интерфейс, погубленный Гуглом.

А пока предлагаем вашему вниманию немного кода, наскоро сделанного за пару вечеров, который временно работает в Облачном кабинете и Специализированном поиске.

Пока не доступен поиск по специализированным ресурсам, не обеспечена кроссбраузерность и т.п., то есть это временная заплатка.

// Временный заменитель интерфейса Google Ajax Search
    function tempo() {
        had = [];        // массив имен найденных ресурсов (чтобы не повторялись)
        s_result.innerHTML = ‘ ‘;        // очистим div с результатами поиска
        g_search_prepare();                // «всплытие» нужного слоя
        back_back = «web»;            // куда вернуться при закрытии слоя
        var url_1 = «https://ajax.googleapis.com/ajax/services/search/web?v=1.0&hl=ru&callback=?&safe=active&rsz=8&start=»;
        var url_2 = «&q=» + request.value;
        get_8(url_1, 0, url_2);        // начать поиск
        very_scroll(search_active_pane);    // актуализация внешнего скролла
        browserMessage(voice.tempo);        // сообщение о тестовом режиме работы
        function get_8(url_1, n, url_2) {    // рекурсивный поиск, порции по 8 ссылок
            $.getJSON(url_1 + n + url_2,                    // запрос к поисковой машине
            function(data){             // callback-функция
                if(!data.responseData || data.responseData.results.length == 0) {
                    if(n == 0) { $mess = $(‘<div/>’).addClass(‘search_empty’);
                        $mess.html(voice.x); $(s_result).append($mess);    // ничего не найдено
                    } return;     // выход из рекурсии
                }
                var x, div, title, favicon, content, hostname, has = false;
                for (i in data.responseData.results) {    // обработка порции фидов
                    x = data.responseData.results[i].title.replace(new RegExp(«<b>|</b>»),»»); // имя ресурса, очищенное от разметки
                    for(k = 0; k < had.length; k++) if(x == had[k]) has = true;     // этот ресурс уже появлялся ранее?       
                    if(has) continue; else had.push(x);        // не повторять сниппеты
                    div = document.createElement(«div»);    // дальше — создаем сниппет
                    title = document.createElement(«div»);
                    favicon = ‘<img src=»http://favicon.yandex.net/favicon/’ + data.responseData.results[i].visibleUrl + ‘» style=»border:0px;float:left;margin-right:5px;» alt=»»>’;
                    title.innerHTML = favicon + x;
                    $(title).addClass(‘my_link’);
                    content = ‘<div>’ + data.responseData.results[i].content + ‘.</div>’;
                    hostname = ‘<div class=»hostname»>’ + data.responseData.results[i].visibleUrl + ‘</div>’;
                    $(div).html(content+hostname);
                    $(div).prepend($(title));
                    s_result.appendChild(div); // добавим сниппет в div с результатами поиска
                    // зададим атрибуты url и hostname, они понадобятся обработчику onmouseup
                    title.setAttribute(‘url’, data.responseData.results[i].unescapedUrl);
                    title.setAttribute(‘hostname’, data.responseData.results[i].visibleUrl);
                    if(title.firstChild && title.firstChild.setAttribute) {
                        title.firstChild.setAttribute(‘url’, data.responseData.results[i].unescapedUrl);
                        title.firstChild.setAttribute(‘hostname’, data.responseData.results[i].visibleUrl);
                    }
                    dojo.connect(title, «onmouseup», null, on_search_up);    // цепляем обработчик onmouseup
                    $(div).addClass(‘my_snippet’);
                }
                get_8(url_1, n+8, url_2);        // продолжим поиск рекурсивно
            });
        }
    }

// Пользователь кликнул по псевдоссылке (контент из глобальной сети)       
    function on_search_up(event) {
        var e = event || window.event;    // объект события
        if(e.button == 2 || e.button == 3) return;
        var target = e.target || e.srcElement;     // по какому элементу кликнули?
        if(!target) return;
        var url =  target.getAttribute(«url»);    // должен быть атрибут «url» у самого элемента или его потомка
        var hostname =  target.getAttribute(«hostname»);
        if(target.firstChild && target.firstChild.getAttribute) {
            if(!url) url =  target.firstChild.getAttribute(«url»);
            if(!hostname) hostname =  target.firstChild.getAttribute(«hostname»);
        }
        // убираем дублирующие окна, вкладки
        for(n = 0; n < win_opened.length; n++) if(url == win_opened[n].name) { win_opened[n].win.close(); win_opened.splice(n,1); }
        if(_popup) show_doc(url, url);    // открыть во всплывающем окне
        else if(_tabs) {                 // открыть в отдельной вкладке
            child = window.open(url,’_blank’);
            childIsOK(url);
        }
        else {         // попытаться открыть в iframe
            back = back_back;
            activate_search_frame(url, hostname);
        }
    }

// Попробуем отобразить контент в iframe   
    function activate_search_frame(url, hostname) {
        very_scroll(‘#dummy’);    // всплытие нужного слоя
        fetch_in_docs.style.zIndex = -1;
        fetch_in_lib.style.zIndex = -1;
        search_result.style.zIndex = -1;
        frame.style.zIndex = 0;
        close_search.style.zIndex = 0;
        close_search.setAttribute(‘title’,voice.close_doc);
        frame.innerHTML = voice.iframe;    // создадим iframe
        iframe = dojo.byId(«iframe»);
        hostname = hostname || ‘google’;    // хостинг контента
        if(hostname.indexOf(‘youtube’) >= 0) {    // youtube покажем через proxy
            url = ‘http://youtu.be/’ + url.slice(-11);
            iframe.src = software_holder + ‘json/iframe_page.php?url=’ + url;
        } else if((hostname.indexOf(‘google’) >= 0)
            || (hostname.indexOf(‘vk.com’) >= 0) // эти не отобразятся в iframe
            || (hostname.indexOf(‘facebook.com’) >= 0)
            || (hostname.indexOf(‘twitter.com’) >= 0)) {
            iframe.src = software_holder + voice.no_iframe;
        } else iframe.src = url;    // пробуем отобразить в iframe
    }

К весеннему семестру на http://ksst.obninsk.ru должен вновь появиться полноценный удобный поиск по глобальной сети. Если среди студентов найдутся грамотные люди, желающие поучаствовать в этой работе (УИР, диплом) — добро пожаловать.

1 комментарий

Похожие публикации
 
 

1 комментарий

  1. С марта 2016 поисковые машины Яндекс, Гугл, Yahoo и Bing на образовательном портале http://ksst.obninsk.ru начинают работать в том контексте, который вы сами определите. По умолчанию, поисковые машины будут работать в контексте дисциплин, которые преподаются на кафедре и представлены в Облачном кабинете. В Новом 2016 году желаем вам благополучия, неиссякаемой энергии и лёгкого кода!

 
 

Вы можете оставить комментарий

 





 
 

Выполните простое задание (антиспам). Картинки можно сибирать приблизительно, без точной подгонки фрагментов.


 
 
 

Наверх