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

LXF74-75:PHP1

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: {{Цикл/PHP}} == Разбираемся с Google API == ''«Тру-ля-ля, тра-ля-ля», – напевал '''Пол Хадсон''' (Paul Hudson), впервые за э...)
 
м (викификация)
Строка 2: Строка 2:
  
 
== Разбираемся с Google API ==
 
== Разбираемся с Google API ==
''«Тру-ля-ля, тра-ля-ля», напевал '''Пол Хадсон''' (Paul Hudson), впервые за этот год раздобыв кусочек МЫЛА и отправляясь в ванную подумать о WSDL.''
+
''«Тру-ля-ля, тра-ля-ля», — напевал '''Пол Хадсон''' (Paul Hudson), впервые за этот год раздобыв кусочек МЫЛА и отправляясь в ванную подумать о WSDL.''
  
 
Ostagazuzulum! Нет, я не стучу от нечего делать по клавиатуре и не начитался Гарри Поттера. В свое время, компания
 
Ostagazuzulum! Нет, я не стучу от нечего делать по клавиатуре и не начитался Гарри Поттера. В свое время, компания
BBC выпускала изумительную программу для детей – Wizbit.
+
BBC выпускала изумительную программу для детей — Wizbit.
Главная роль в ней была отведена большой желтой волшебной шляпе
+
Главная роль в ней была отведена большой желтой волшебной шляпе -
 
Wizbit, которая умела летать и совершать волшебство. Нереально, я
 
Wizbit, которая умела летать и совершать волшебство. Нереально, я
знаю. У Wizbit было два основных заклинания: “Ostagazuzulum” (это
+
знаю. У Wizbit было два основных заклинания: «Ostagazuzulum» (это
волшебное слово заставляло все работать, как надо) и “Think about it”
+
волшебное слово заставляло все работать, как надо) и «Think about it»
 
(«подумай об этом»), причем последнее она произносила лишь тогда,
 
(«подумай об этом»), причем последнее она произносила лишь тогда,
 
когда предлагала своей юной аудитории новую загадку.
 
когда предлагала своей юной аудитории новую загадку.
  
Как мы все прекрасно знаем, достаточно развитая технология – это
+
Как мы все прекрасно знаем, достаточно развитая технология — это
та же магия, и в этом выпуске мы попробуем проделать кое-какие трюки самостоятельно. Мы будем использовать SOAP (англ. «мыло»,
+
та же магия, и в этом выпуске мы попробуем проделать кое-какие трюки самостоятельно. Мы будем использовать SOAP (англ. «мыло», -
 
прим.перев.), WSDL, XML и web-сервисы. Да, сейчас я произнес
 
прим.перев.), WSDL, XML и web-сервисы. Да, сейчас я произнес
несколько страшных слов, но не беспокойтесь – я объясню, что они
+
несколько страшных слов, но не беспокойтесь — я объясню, что они
 
значат и зачем нужны, и вы будет просто сгорать от нетерпения,
 
значат и зачем нужны, и вы будет просто сгорать от нетерпения,
 
п о н я т н о ? Отвечайте же: «Да, Пол!»
 
п о н я т н о ? Отвечайте же: «Да, Пол!»
Строка 31: Строка 31:
 
Итак, первым из четырех основных компонентов нашей магии является SOAP, или Simple Object Access Protocol (простой протокол для
 
Итак, первым из четырех основных компонентов нашей магии является SOAP, или Simple Object Access Protocol (простой протокол для
 
доступа к объектам). Это облегченный протокол для обмена информацией, работающий поверх HTTP. С его помощью мы отправляем на
 
доступа к объектам). Это облегченный протокол для обмена информацией, работающий поверх HTTP. С его помощью мы отправляем на
сервер запрос и получаем результат. WSDL (произносится как «виздулл» и немного напоминает Wizbit, что, впрочем, случайность) это
+
сервер запрос и получаем результат. WSDL (произносится как «виздулл» и немного напоминает Wizbit, что, впрочем, случайность) — это
 
Web Service Definition Language (язык описания web-сервисов), средство для описания интерфейсов, которые вы можете использовать
 
Web Service Definition Language (язык описания web-сервисов), средство для описания интерфейсов, которые вы можете использовать
 
через SOAP.
 
через SOAP.
Строка 52: Строка 52:
 
нажмите Create Account. Вам может потребоваться использовать
 
нажмите Create Account. Вам может потребоваться использовать
 
новый e-mail адрес, если система откажет вам в регистрации. После
 
новый e-mail адрес, если система откажет вам в регистрации. После
прохождения этой процедуры на ваш адрес будет выслан ключ, дающий вам право на 1000 запросов в день. Сохраните его где-нибудь
+
прохождения этой процедуры на ваш адрес будет выслан ключ, дающий вам право на 1000 запросов в день. Сохраните его где-нибудь -
 
он потребуется нам чуть позже.
 
он потребуется нам чуть позже.
  
Строка 66: Строка 66:
 
var_dump($result = $soap->__getFunctions());
 
var_dump($result = $soap->__getFunctions());
 
?></source>
 
?></source>
Всего две строки и – вуаля! вы уже в стране web-сервисов.
+
Всего две строки и — вуаля! — вы уже в стране web-сервисов.
 
В первой строке создается объект SoapClient, с помощью которого мы
 
В первой строке создается объект SoapClient, с помощью которого мы
 
отправляем и получаем данные. Конструктору этого класса передается
 
отправляем и получаем данные. Конструктору этого класса передается
Строка 90: Строка 90:
 
будет особенно интересовать третья функция: doGoogleSearch(). Как
 
будет особенно интересовать третья функция: doGoogleSearch(). Как
 
вы можете видеть, она имеет большое число параметров, причем некоторые названы весьма причудливо. Вот их смысл:
 
вы можете видеть, она имеет большое число параметров, причем некоторые названы весьма причудливо. Вот их смысл:
* $key – это уникальный ключ, который Google выдал вам для персонального использования. Не раздавайте его кому попало, поскольку на один ключ допускается не более 1000 запросов в сутки.
+
* $key — это уникальный ключ, который Google выдал вам для персонального использования. Не раздавайте его кому попало, поскольку на один ключ допускается не более 1000 запросов в сутки.
* $q – это текст запроса
+
* $q — это текст запроса
* $start – точка, с которой вы хотите начать вывод результатов. Например, если $start=1000, вы пропустите первую тысячу результатов.
+
* $start — точка, с которой вы хотите начать вывод результатов. Например, если $start=1000, вы пропустите первую тысячу результатов.
* $maxResults – максимальное число результатов поиска, которые вы хотите получить. Google ограничивает эту величину десятью, поэтому вам может потребоваться изменять значение параметра $start и делать несколько вызовов, если вы хотите получить больше.
+
* $maxResults — максимальное число результатов поиска, которые вы хотите получить. Google ограничивает эту величину десятью, поэтому вам может потребоваться изменять значение параметра $start и делать несколько вызовов, если вы хотите получить больше.
* $filter – должен ли Google игнорировать множественные результаты для одного сайта или похожие результаты на различных сайтах?
+
* $filter — должен ли Google игнорировать множественные результаты для одного сайта или похожие результаты на различных сайтах?
* $restrict – следует ли Google ограничиться определенной страной или регионом?
+
* $restrict — следует ли Google ограничиться определенной страной или регионом?
* $safeSearch – Вас интересуют материалы «для взрослых»?
+
* $safeSearch — Вас интересуют материалы «для взрослых»?
* $lr – позволяет установить языковые ограничения.
+
* $lr — позволяет установить языковые ограничения.
* $ie – входная кодировка. В настоящий момент это поле игнорируется, так что передайте здесь пустую строку.
+
* $ie — входная кодировка. В настоящий момент это поле игнорируется, так что передайте здесь пустую строку.
* $oe – выходная кодировка. Это поле также игнорируется.
+
* $oe — выходная кодировка. Это поле также игнорируется.
 
Да, для вызова этой несложной функции потребуется приличное
 
Да, для вызова этой несложной функции потребуется приличное
 
число параметров, но это неизбежная плата за гибкость. Приступим?
 
число параметров, но это неизбежная плата за гибкость. Приступим?
Строка 164: Строка 164:
 
поле estimatedTotalResultsCount (приблизительное число результатов поиска), а также массив resultElements. Мы запросили всего
 
поле estimatedTotalResultsCount (приблизительное число результатов поиска), а также массив resultElements. Мы запросили всего
 
пять результатов ($max_results=5), а это значит, что число элементов в resultElements также не будет превышать пяти. Первый
 
пять результатов ($max_results=5), а это значит, что число элементов в resultElements также не будет превышать пяти. Первый
результат имеет индекс 0, второй – 1 и так далее. Для каждого из
+
результат имеет индекс 0, второй — 1 и так далее. Для каждого из
 
результатов предоставляются: URL, заголовок страницы (из <title>),
 
результатов предоставляются: URL, заголовок страницы (из <title>),
 
выдержка из текста (несколько слов, обрамляющих поисковый
 
выдержка из текста (несколько слов, обрамляющих поисковый
Строка 189: Строка 189:
  
 
Давайте же, запустите этот сценарий и громко скажите:
 
Давайте же, запустите этот сценарий и громко скажите:
“Ostagazuzulum!. Вы увидите что-то вроде:
+
«Ostagazuzulum!». Вы увидите что-то вроде:
 
<source lang="text">Search for Hudzilla complete - 2340 estimated results.
 
<source lang="text">Search for Hudzilla complete - 2340 estimated results.
 
Practical PHP Programming
 
Practical PHP Programming
 
http://www.hudzilla.org/php/index.php
 
http://www.hudzilla.org/php/index.php
 
Hudzilla.org - the homepage of Paul Hudson</source>
 
Hudzilla.org - the homepage of Paul Hudson</source>
Думаю, вы согласитесь – все достаточно просто. Мощь WSDL
+
Думаю, вы согласитесь — все достаточно просто. Мощь WSDL
 
состоит в том, что вам не нужно заранее знать, какой функционал
 
состоит в том, что вам не нужно заранее знать, какой функционал
предоставляет Google, сила SOAP – в том, что вам не нужно
+
предоставляет Google, сила SOAP — в том, что вам не нужно
 
заботиться о том, как передаются по сети все эти объекты.
 
заботиться о том, как передаются по сети все эти объекты.
На последнем этапе в бой вступает PHP – он позволяет вам
+
На последнем этапе в бой вступает PHP — он позволяет вам
 
добиться результатов всего парой строчек кода. Вот это
 
добиться результатов всего парой строчек кода. Вот это
 
чудеса!
 
чудеса!

Версия 15:58, 6 декабря 2008

Содержание

Разбираемся с 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-сайты используют >, так что нам также придется конвертировать их в символы (>, в данном случае), а также выкинуть все тэги, которые не предназначены для прямого вывода на экран.

Давайте же, запустите этот сценарий и громко скажите: «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 — он позволяет вам добиться результатов всего парой строчек кода. Вот это чудеса!

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