- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF74-75:PHP1
Материал из Linuxformat.
Содержание |
Разбираемся с Google API
«Тру-ля-ля, тра-ля-ля», — напевал Пол Хадсон (Paul Hudson), впервые за этот год раздобыв кусочек МЫЛА и отправляясь в ванную подумать о WSDL.
Ostagazuzulum! Нет, я не стучу от нечего делать по клавиатуре и не начитался Гарри Поттера. В свое время, компания BBC выпускала изумительную программу для детей — Wizbit. Главная роль в ней была отведена большой желтой волшебной шляпе - Wizbit, которая умела летать и совершать волшебство. Нереально, я знаю. У Wizbit было два основных заклинания: «Ostagazuzulum» (это волшебное слово заставляло все работать, как надо) и «Think about it» («подумай об этом»), причем последнее она произносила лишь тогда, когда предлагала своей юной аудитории новую загадку.
Как мы все прекрасно знаем, достаточно развитая технология — это та же магия, и в этом выпуске мы попробуем проделать кое-какие трюки самостоятельно. Мы будем использовать SOAP (англ. «мыло», - прим.перев.), WSDL, XML и web-сервисы. Да, сейчас я произнес несколько страшных слов, но не беспокойтесь — я объясню, что они значат и зачем нужны, и вы будет просто сгорать от нетерпения, п о н я т н о ? Отвечайте же: «Да, Пол!»
Принимаемся за дело
- Поскольку SOAP и WSDL используют XML, вы можете просто прочитать их вручную, не полагаясь на PHP
- С помощью PHP можно создавать также SOAP-сервера, но здесь есть подводные камни
- Создавая объект SoapClient, вы можете передать конструктору второй параметр – массив опций. Таким образом, например, можно установить версию протокола
- Если вы не хотите связываться с WSDL, можете сделать SOAP-вызов вручную, посредством функции __soapCall(), которой передается имя SOAP-функции.
Итак, первым из четырех основных компонентов нашей магии является 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 ); } ?>
- Amazon
Книголюбы могут посетить http://www.amazon.com/gp/aws/landing.html
- eBay
Самый популярный Интернет-аукцион доступен через SOAP и XML – см. http://developer.ebay.com
- Flickr
Хотите научиться запрашивать ваш фото-блог? Заходите сюда: http://www.flickr.com/services/api
- Yahoo!
Ходите по магазинам, заказывайте билеты, смотрите карты Yahoo! Maps на http://developer.yahoo.net
В этом примере я использовал переменные, чтобы сохранить различные параметры 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-сайты используют >, так что нам также придется конвертировать их в символы (>, в данном случае), а также выкинуть все тэги, которые не предназначены для прямого вывода на экран.
Давайте же, запустите этот сценарий и громко скажите: «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 — он позволяет вам добиться результатов всего парой строчек кода. Вот это чудеса!
Категории: Учебники | PHP | Пол Хадсон