Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Bruno Fierens из бельгийской компании TMS Software рассказал о Bing API – интересном сервисе от Microsoft, попутно прорекламировав пару TMS’овских компонентов для работы с Web. Я попытался это перевести.

С помощью Bing API, Microsoft предоставляет набор простых в использовании служб, которые могут быть полезны как для разработки Delphi веб-приложений, так и для Win32 приложений.  Стартовой точкой для того, что бы увидеть возможности Bing API, является http://www.bing.com/developers . Первая вещь, которую необходимо сделать для начала работы с Bing API – получить Bing AppID. Для этого воспользуйтесь URL: http://www.bing.com/developers/createapp.aspx .

В основном применять Bing API можно бесплатно, при условии соблюдения правил его использования, выдвигаемых Microsoft, каковые, к счастью, довольно гибкие.

По получении Bing AppID, вы можете приступить к работе. Простейшим способом использования Bing API является применение запроса HTTP GET, возвращающего в качестве результата XML файл. Bing API предоставляет доступ к нескольким поисковым типам, которые обозначаются как SourceType. В v2.0 API доступны следующие поисковые типы:

  • Ad SourceType: получить содержимое рекламы;
  • Image SourceType: поиск изображений;
  • InstantAnswer SourceType: получить ответ на вопросы типа, «какой город является столицей Германии?»;
  • MobileWeb SourceType:
  • News SourceType: получить информацию из новостных заголовков;
  • Phonebook SourceType: получить информацию об адресе и телефонном номере;
  • RelatedSearch SourceType: получить смежные поисковые запросы;
  • Spell SourceType: выполнить проверку орфографии;
  • Translation SourceType: выполнить перевод;
  • Video SourceType: поиск  видео;
  • Web SourceType: выполнить обычный веб-поиск.

Использовать Bing API в Delphi можно отсылая серверу api.bing.net  HTTP GET запрос  следующей структуры:

http://api.bing.net/xml.aspx?Appid=YourAppID

&Query=YourQueryString

&Sources=YourSourceType(s) + more options

Этот HTTP GET запрос  возвратит XML файл, содержащий результат. Delphi 2009 предоставляет все необходимые компоненты для того, что бы начать использовать API. Вы можете использовать Indy TidHTTP компонент для выполнения HTTP GET запроса и TXMLDocument для парсинга результирующего XML файла. Что бы облегчить себе жизнь, мы используем компонент TWebCopy для получения результирующего XML файла и TXMLDocument для парсинга результата.

Пример 1. Web поиск.

Web поиск производится с использованием ‘web’ SourceType. Типовой запрос выглядит так:

http://api.bing.net/xml.aspx?Appid=YourAppID

&Query=Delphi&Sources=web

Опционально мы можем установить запрашиваемое число результатов и смещение, т.е.

http://api.bing.net/xml.aspx?Appid=YourAppID

&Query=Delphi&Sources=web&web.count=20&web.offset=40

Для того, что бы быстро получить результирующий XML файл, мы используем TWebCopy следующим образом:

with webcopy.Items.Add do
begin
  // AppID is a string constant containing our AppID, searchstr is our search query.  
  url := 'http://api.search.live.net/xml.aspx?Appid=' + AppID + '&query='+HTTPEncode(searchstr)+'&sources=web&web.count='+inttostr(count)+'&web.offset='+inttostr(offset);
  TargetFilename := 'response.xml';
  Protocol := wpHttp;
end;
webcopy.ShowDialog := false;
webcopy.Execute;

В этом фрагменте кода,  мы просто получили текст с описанием найденных Bing’ом URL. Мы так же можем  извлечь сами URL, заголовки страниц, время их создания…

Пример 2. Перевод теста с английского на немецкий.

Bing API также предоставляет сервис перевода текста с одного языка на другой. HTTP запрос очень похож на запрос Web поиска. Нам только потребуется указать Translation в качестве SourceType и задать опции исходного языка и языка перевода. Мы включили все это в простую для использования функцию.

function HTTPEncode(const AStr: string): string;
const
NoConversion = ['A'..'Z', 'a'..'z', '*', '@', '.', '_', '-'];
var
i: integer;
begin
Result := '';

for i := 1 to Length(AStr) do
begin
if CharInSet(AStr[i],NoConversion) then
Result := Result + AStr[i]
else
Result := Result + Format('%%%.2x',[ord(AStr[i])]);
end;
end;

function GetTranslation(text, fromLang, toLang: string): string;
var
xmldoc: TXMLDocument;
inode,mnode,rnode,irnode: IXMLNode;
j: integer;
uri: string;
webcopy: TWebCopy;

begin
Result := '';

webcopy := TWebCopy.Create(application);

try
webcopy.Items.Clear;
with webcopy.Items.Add do
begin
url := 'http://api.search.live.net/xml.aspx?Appid=' + AppID + '&query='+HTTPEncode(text)+
'&sources=translation'+
'&Translation.SourceLanguage=' + fromLang +
'&Translation.TargetLanguage=' + toLang;

TargetFilename := 'response.xml';
Protocol := wpHttp;
end;
webcopy.ShowDialog := false;
webcopy.Execute;
finally
webcopy.Free;
end;

xmldoc := TXMLDocument.Create(application);

try
xmldoc.LoadFromFile('response.xml');

inode := xmldoc.ChildNodes.FindNode('SearchResponse');

if Assigned(inode) then
begin
uri := 'http://schemas.microsoft.com/LiveSearch/2008/04/XML/translation';
mnode := inode.ChildNodes.FindNode('Translation',uri);
if Assigned(mnode) then
begin
rnode := mnode.ChildNodes.FindNode('Results',uri);
if Assigned(rnode) then
begin
irnode := rnode.ChildNodes.FindNode('TranslationResult',uri);
if Assigned(irnode) then
Result := irnode.ChildNodes.FindNode('TranslatedTerm',uri).NodeValue;
end;
end;
end;
finally
xmldoc.Free;
end;
end;

begin
// sample call:  
ShowMessage(GetTranslation('Hello world','En','De'));
end;

Этот пример кода переведет «Hello world» с английского на немецкий («hallo Welt» ).

Пример 3. Исправление орфографических ошибок.

Bing API может, кроме всего прочего, предложить нам проверку английской орфографии. Опять же, интерфейс очень прост, т.е. обычный HTTP GET запрос с SourceType Spell. Мы также включили этот API в Delphi функцию для простоты использования.

function DoSpellCheck(text: string): string;
var
xmldoc: TXMLDocument;
inode,mnode,rnode,irnode: IXMLNode;
j: integer;
uri: string;
webcopy: TWebCopy;
begin
Result := '';

webcopy := TWebCopy.Create(application);
try
with webcopy.Items.Add do
begin
url := 'http://api.bing.net/xml.aspx?Appid=' + AppID + '&query='+HTTPEncode(text)+
'&Sources=Spell&Version=2.0&Market=en-us&Options=EnableHighlighting';

TargetFilename := 'response.xml';
Protocol := wpHttp;
end;
webcopy.ShowDialog := false;
webcopy.Execute;
finally
webcopy.Free;
end;

xmldoc := TXMLDocument.Create(application);
try
xmldoc.LoadFromFile('response.xml');

inode := xmldoc.ChildNodes.FindNode('SearchResponse');

if Assigned(inode) then
begin
uri := 'http://schemas.microsoft.com/LiveSearch/2008/04/XML/spell';

mnode := inode.ChildNodes.FindNode('Spell',uri);
if Assigned(mnode) then
begin
rnode := mnode.ChildNodes.FindNode('Results',uri);
if Assigned(rnode) then
begin
irnode := rnode.ChildNodes.FindNode('SpellResult',uri);
if Assigned(irnode) then
Result := irnode.ChildNodes.FindNode('Value',uri).NodeValue;
end;
end;
end;
finally
xmldoc.Free;
end;
end;

begin
// sample call with a forced spelling error  
ShowMessage( DoSpellCheck('Mispeling words is a common ocurrence') );
end;

Пример 4. Получения изображения из web.

Для нескольких существующих более интересных SourceType’ов, таких как News, InstantAnswer, Video, концепция остается идентичной. В последнем примере мы используем Bing API для получения первого соответствующего нашему запросу  изображения из web  и отображения его в приложении. Мы упростим эту операцию используя TMS TWebImage, который выполнит всю работу по загрузке и отображению результирующего изображения. Полученный код приведен ниже:

function GetImageLink(searchstr: string): string;
var
xmldoc: TXMLDocument;
inode,mnode,rnode,irnode: IXMLNode;
j: integer;
uri: string;
webcopy: TWebCopy;
begin
Result := '';

webcopy := TWebCopy.Create(application);
try
with webcopy.Items.Add do
begin
url := 'http://api.bing.net/xml.aspx?Appid=' + AppID + '&query='+HTTPEncode(searchstr)+'&sources=image&image.count=1';
TargetFilename := 'response.xml';
Protocol := wpHttp;
end;
webcopy.ShowDialog := false;
webcopy.Execute;
finally
webcopy.Free;
end;

xmldoc := TXMLDocument.Create(application);
try
xmldoc.LoadFromFile('response.xml');

inode := xmldoc.ChildNodes.FindNode('SearchResponse');

if Assigned(inode) then
begin
uri := 'http://schemas.microsoft.com/LiveSearch/2008/04/XML/multimedia';
mnode := inode.ChildNodes.FindNode('Image',uri);
if Assigned(mnode) then
begin
rnode := mnode.ChildNodes.FindNode('Results',uri);
if Assigned(rnode) then
begin
irnode := rnode.ChildNodes.Nodes[0];
if Assigned(irnode) then
Result := irnode.ChildNodes.FindNode('MediaUrl',uri).NodeValue;
end;
end;
end;
finally
xmldoc.Free;
end;
end;

begin
// sample retrieving an image hyperlink and show it on the form using a TWebImage component  
imageurl := GetImageLink('mercedes SL gullwing');
caption := imageurl;
Screen.Cursor := crHourGlass;
WebImage1.URL := imageurl;
Screen.Cursor := crDefault;
end;

Приведенный фрагмент кода отображает прекрасный Mercedes SL gullwing (с открывающимися наверх дверьми) в компоненте TWebImage, размещенном на форме. Мы надеемся, что эти примеры вдохновят вас на создание ряда интересных функции в Delphi Win32 или IntraWeb приложениях.


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

1 комментарий: Использование Microsoft Bing API в Delphi

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика