Журнал LinuxFormat - перейти на главную

LXF74-75:PHP1

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Разбираемся с Google API

«Тру-ля-ля, тра-ля-ля», — напевал Пол Хадсон (Paul Hudson), впервые за этот год раздобыв кусочек МЫЛА и отправляясь в ванную подумать о WSDL.

Ostagazuzulum! Нет, я не стучу от нечего делать по клавиатуре и не начитался Гарри Поттера. В свое время, компания BBC выпускала изумительную программу для детей — Wizbit. Главная роль в ней была отведена большой желтой волшебной шляпе - Wizbit, которая умела летать и совершать волшебство. Нереально, я знаю. У Wizbit было два основных заклинания: «Ostagazuzulum» (это волшебное слово заставляло все работать, как надо) и «Think about it» («подумай об этом»), причем последнее она произносила лишь тогда, когда предлагала своей юной аудитории новую загадку.

Как мы все прекрасно знаем, достаточно развитая технология — это та же магия, и в этом выпуске мы попробуем проделать кое-какие трюки самостоятельно. Мы будем использовать SOAP (англ. «мыло», - прим.перев.), WSDL, XML и web-сервисы. Да, сейчас я произнес несколько страшных слов, но не беспокойтесь — я объясню, что они значат и зачем нужны, и вы будет просто сгорать от нетерпения, п о н я т н о ? Отвечайте же: «Да, Пол!»

Принимаемся за дело

Итак, первым из четырех основных компонентов нашей магии является SOAP, или Simple Object Access Protocol (простой протокол для доступа к объектам). Это облегченный протокол для обмена информацией, работающий поверх HTTP. С его помощью мы отправляем на сервер запрос и получаем результат. WSDL (произносится как «виздулл» и немного напоминает Wizbit, что, впрочем, случайность) — это Web Service Definition Language (язык описания web-сервисов), средство для описания интерфейсов, которые вы можете использовать через SOAP.

XML, я надеюсь, вы уже знаете. Сегодня мы будем использовать его вместе с SOAP и WSDL, так что наши данные смогут быть легко переработаны на обоих концах. Объединив все это, мы получим web-сервисы. Мы можем узнать у сервера, что он умеет делать, послать ему данные, получить результаты и вывести их на экран.

Теперь давайте подумаем: какие вещи мы мы можем запросить через Web? Варианты могут быть различными: загрузить с Amazon базу данных их продукции, получить котировки акций или сделать что-то более интересное с помощью Google. О последнем мы и поговорим более подробно.

В этом учебнике мы рассмотрим, как посылать запросы в Google, используя PHP и web-сервисы, а также использовать их результаты в наших сценариях. Это, конечно, не так эффектно, как вытащить кролика из шляпы, но я ни за что не поверю, что у Google нет феи и даже крестной. Чтобы воспользоваться web-сервисами Google, вам придется завести на нем учетную запись. Посетите www.google.com/apis и нажмите Create Account. Вам может потребоваться использовать новый e-mail адрес, если система откажет вам в регистрации. После прохождения этой процедуры на ваш адрес будет выслан ключ, дающий вам право на 1000 запросов в день. Сохраните его где-нибудь - он потребуется нам чуть позже.

Начинаются чудеса

Одевайте свой волшебный колпак и приготовьтесь к магии. Мы будем использовать SOAP-расширения PHP5 для чтения WSDL-Файла Google, а затем использовать эти данные для отправки запроса. WSDL-файл доступен по адресу http://api.google.com/GoogleSearch.wsdl, загрузите его на свой компьютер и сохраните в одном каталоге со сценарием. Теперь создайте файл google1.php со следующим содержимым:

<?php
$soap = new SoapClient(‘GoogleSearch.wsdl’);
var_dump($result = $soap->__getFunctions());
?>

Всего две строки и — вуаля! — вы уже в стране web-сервисов. В первой строке создается объект SoapClient, с помощью которого мы отправляем и получаем данные. Конструктору этого класса передается имя WSDL-файла, который содержит в себе перечень доступных функций и их параметров. Мы передаем ему описание интерфейса Google API. Вторая строка вызывает волшебную функцию __getFunctions(). Она возвращает массив функций, предоставляемых SOAP-объектом. Вывод сценария будет следующим:

array(3) {
[0]=>
string(54) "base64Binary doGetCachedPage(string $key,
string $url)"
[1]=>string(56) "string doSpellingSuggestion(string $key, string
$phrase)"
[2]=>
string(178) "GoogleSearchResult doGoogleSearch(string
$key, string $q, int $start, int $maxResults, boolean $filter,
string $restrict, boolean $safeSearch, string $lr, string $ie,
string $oe)"
}

Это очень похоже на прототипы функций PHP. Например, вторая функция имеет имя doSpellingSuggestion, принимает два параметра ($key и $phrase, оба являются строками) и возвращает строку. Нас будет особенно интересовать третья функция: doGoogleSearch(). Как вы можете видеть, она имеет большое число параметров, причем некоторые названы весьма причудливо. Вот их смысл:

  • $key — это уникальный ключ, который Google выдал вам для персонального использования. Не раздавайте его кому попало, поскольку на один ключ допускается не более 1000 запросов в сутки.
  • $q — это текст запроса
  • $start — точка, с которой вы хотите начать вывод результатов. Например, если $start=1000, вы пропустите первую тысячу результатов.
  • $maxResults — максимальное число результатов поиска, которые вы хотите получить. Google ограничивает эту величину десятью, поэтому вам может потребоваться изменять значение параметра $start и делать несколько вызовов, если вы хотите получить больше.
  • $filter — должен ли Google игнорировать множественные результаты для одного сайта или похожие результаты на различных сайтах?
  • $restrict — следует ли Google ограничиться определенной страной или регионом?
  • $safeSearch — Вас интересуют материалы «для взрослых»?
  • $lr — позволяет установить языковые ограничения.
  • $ie — входная кодировка. В настоящий момент это поле игнорируется, так что передайте здесь пустую строку.
  • $oe — выходная кодировка. Это поле также игнорируется.

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

Хадзилла возвращается

Вооружившись знаниями о всемогущей doGoogleSearch(), попробуем выполнить следующий код:

<?php
$soap = new SoapClient('GoogleSearch.wsdl');
$key = "ВАШ_КЛЮЧ_GOOGLE";
$query = "Hudzilla";
$start = 0;
$max_results = 5;
$filter = false;
$restrict = "";
$safe_search = false;
$language_restrict = "";
$input_encoding = "";
$output_encoding = "";
$result = $soap->doGoogleSearch($key, $query, $start,
$max_results, $filter, $restrict, $safe_search, $language_restrict, $input_encoding, $output_encoding);
if (is_soap_fault($result)) {
print "Your query failed: {$result->faultstring}\n";
} else {
print_r( $result );
}
?>

В этом примере я использовал переменные, чтобы сохранить различные параметры SOAP-запроса. Это, конечно, необязательно: в своих собственных сценариях вы можете использовать эти значения напрямую. Я сделал это исключительно для того, чтобы дать параметрам понятные имена (например $output_encoding). Функция doGoogleSearch() возвращает класс, который содержит различную информацию, и данный сценарий попросту выводит все на экран, чтобы вы получили какое-никакое представление о том, с чем имеете дело.

Вот вывод сценария:

stdClass Object
(
[estimatedTotalResultsCount] => 2290
[resultElements] => Array
(
[0] => stdClass Object
(
[URL] => http://www.hudzilla.org/php/index.php
[snippet] => <b>Hudzilla</b>.org - the homepage of
Paul Hudson
[title] => Practical PHP Programming
[cachedSize] => 68k
)

Конечно, реальный результат будет длиннее, но мы побережем бумагу и приведем лишь первые 12 строк. Как видно, объект имеет поле estimatedTotalResultsCount (приблизительное число результатов поиска), а также массив resultElements. Мы запросили всего пять результатов ($max_results=5), а это значит, что число элементов в resultElements также не будет превышать пяти. Первый результат имеет индекс 0, второй — 1 и так далее. Для каждого из результатов предоставляются: URL, заголовок страницы (из <title>), выдержка из текста (несколько слов, обрамляющих поисковый запрос) и размер страницы в кэше Google. Немного поднапрягшись, мы можем организовать цикл по этим элементам и вывести их в простом и удобном виде:

print "Search for $query complete - {$result->estimatedTo
talResultsCount} estimated results.\n";
foreach($result->resultElements as $search_result) {
print " {$search_result->title}\n";
print " {$search_result->URL}\n";
print " " . strip_tags(htmlspecialchars_decode($search_result->snippet)) . "\n\n";
}

Большая часть этого кода очевидна, за исключением, пожалуй, последней строки. Google возвращает данные в формате, пригодном для отправки в web-браузер, то есть, например, выделяет найденные слова жирным шрифтом. Некоторые web-сайты используют &gt;, так что нам также придется конвертировать их в символы (>, в данном случае), а также выкинуть все тэги, которые не предназначены для прямого вывода на экран.

Давайте же, запустите этот сценарий и громко скажите: «Ostagazuzulum!». Вы увидите что-то вроде:

Search for Hudzilla complete - 2340 estimated results.
Practical PHP Programming
http://www.hudzilla.org/php/index.php
Hudzilla.org - the homepage of Paul Hudson

Думаю, вы согласитесь — все достаточно просто. Мощь WSDL состоит в том, что вам не нужно заранее знать, какой функционал предоставляет Google, сила SOAP — в том, что вам не нужно заботиться о том, как передаются по сети все эти объекты. На последнем этапе в бой вступает PHP — он позволяет вам добиться результатов всего парой строчек кода. Вот это чудеса!

Персональные инструменты
купить
подписаться
Яндекс.Метрика