XojoでWeb APIを使ってみよう「Wikipedia検索API」

2017.10.03  投稿者: moongift
開発

Xojoで作るWikipediaビューワーです。

最近のシステム開発においてWeb APIは欠かせない存在になっています。かつてはCSV連携などが行われていましたが、今ではWeb APIを使って自動的にデータを送受信するのが当たり前になっています。

今回は例としてWikipediaを検索するビューワーを作ってみます。

利用するWeb APIについて

WikipediaのコンテンツはWikipediaが公式に提供するWeb API(MediaWiki 操作 API)を使っています。詳細はAPI:メイン ページ - MediaWikiに載っています。

画面について

今回の画面構成は以下のようになります。検索キーワードを入力する欄(txtKeyword)、検索を実行するボタン(btnSearch)、検索履歴を残すリストボックス(lstHistory)そして検索結果を表示するHTMLViewer(wikipediaView)です。

検索の流れについて

今回は検索を実行するパターンが二つあります。一つはテキストボックスに入力された文字列を使う場合とリストボックスで選択する場合です。そのため、searchWikipediaメソッドを追加し、どちらもそれを呼び出すようにします。

処理は次のようになります。Wikipediaクラスについては後ほど説明します。コンテンツを取得して、その結果をwikipediaViewに直接流し込むだけです。

Sub searchWikipedia(keyword as String)
  Dim w as Wikipedia = new Wikipedia
  Dim content as string = w.getContent(keyword)

  Dim f As FolderItem = GetTemporaryFolderItem
  wikipediaView.LoadPage(content, f)
End Sub

後はボタンを押した時の処理、リストボックスで選択された処理それぞれにおいてキーワードを上記メソッドに送るだけです。ボタンを押した場合はキーワードをリストボックスに登録します。

// ボタンを押した場合
Dim keyword as String = txtKeyword.Text
Self.searchWikipedia(keyword)
lstHistory.AddRow(keyword)

// リストボックスから選択した場合
Dim keyword as String = Me.Cell(row, column)
Self.searchWikipedia(keyword)

Wikipediaクラスについて

Wikipediaクラスは一つのプロパティ、三つのメソッドを持ったクラスになります。

プロパティ

プロパティは検索用のURL(searchUrl)になります。値は https://ja.wikipedia.org/w/api.php です。

メソッド

メソッドは検索処理(getContent)、URL生成(generateUrl)、JSONのパース(parseJSON)の3つになります。

検索処理(getContent)

検索処理はURL生成、JSONのパースをそれぞれ呼ぶだけでのメソッドです。外部から呼ばれる前提になっています。

// URL生成
Dim url as String = generateUrl(keyword)

// 検索実行
Dim https as HTTPSecureSocket = new HTTPSecureSocket
Dim page as String = https.Get(url, 10)

// パースした結果をそのまま返す
return parseJSON(page)

URL生成(generateUrl)

URLの生成処理です。殆ど固定のパラ-メータで、キーワードだけが可変になります。最初はJSONItemで作り、まとめてエンコードしつつURLを生成します。

// パラメータの生成
Dim parameters as JSONItem = new JSONItem
parameters.Value("format") = "json"
parameters.Value("action") = "query"
parameters.Value("rvparse") = "1"
parameters.Value("rvprop") = "content"
parameters.Value("prop") = "revisions"
parameters.Value("titles") = keyword

// URLとして連結
Dim url as String = Me.searchUrl
url = url + "?"
Dim key as String
For Each key in parameters.Names
  url = url + key + "=" + EncodeURLComponent(parameters.Value(key)) + "&"
Next

// URLを返す
return url

JSONのパース(parseJSON)

Wikipediaから返ってきたJSONデータをパースする処理になります。ここは若干煩雑な処理になってしまっています。これは実際のJSONの構造を確認しながら実装しないといけません。

Dim json as JSONItem = new JSONItem(content)

Dim queryJson as JSONItem = json.Value("query")
Dim pagesJson as JSONItem = queryJson.Value("pages")

Dim pages() as String = pagesJson.Names
Dim pageJson as JSONItem = pagesJson.Value(pages(0))

Dim revisionJson as JSONItem = pageJson.Value("revisions")
Dim contentJson as JSONItem = revisionJson(0)

return contentJson.Value("*")

ここまでの処理でWikipediaのWeb APIからJSONデータを取得してHTMLViewerに表示する処理が完成になります。JSONの取り扱いが若干複雑ですが、JSONの取得などはとても簡単にできます。実装時の参考にしてください。

今回のコードはgoofmint/Xojo_Wikipedia_Searchにアップロードしてあります。実装時の参考にしてください。