|
|
|||||||||||||||||||||||||||||
|
Использование Microsoft Bing API в DelphiИсточник: delphi2010 Александр Божко
Автор: Александр Божко 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 доступны следующие поисковые типы:
Использовать 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 приложениях. Ссылки по теме
|
|