iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 20
0
Modern Web

我每天都接一個API系列 第 20

[30apis] Day 19 : Wikipedia (MediaWiki) API

Wikipedia 維基百科本身,就是建立在 MediaWiki 之上,所以 Wikipedia 使用的就是 MediaWiki 的 API,但 MediaWiki 並不是只有 Wikipedia 在使用。

MediaWiki API ,我覺得還挺難懂的,主要是因為所有的東西都擠在一起,沒有分類可言。要找到自己想找的東西要找好久。

MediaWiki API 可以讓使用者使用維基的各項功能跟資料,現在來說明一下 Request URL 跟可以放的參數。
API 的 base URL如下:

"https://en.wikipedia.org/w/api.php"

這個 URL 回傳的會是英文維基的資料,如果想要其他語言的資料或操作其他語言的維基百科,就要修改 URL 裡的 en 成其他語言代碼。在這邊要注意的是,中文維基百科並不是很完整,而且透過 API 不會自動換簡繁,所以改成 zh 很可能不會出現預期的結果。

由於資料四散於各處,使用 API Sandbox 可以大致了解有哪些參數還有各種參數之間的關係,沒有放入該放的參數時,Sandbox 會跳出警告。

首先,所有的 API request 必需放一個 action 參數,這個參數會表明要進行怎麼樣的操作。如下圖所示,可以進行的操作非常多,比方說比較兩個維基頁面或是對用戶進行某些操作。

剩下的參數比較重要的有:

  • format :回傳的資料格式,像 jsonjsonfmxmlphp 之類的。預設是 jsonfm
    後面接fm的是將原本的資料格式做成適合在使用瀏覽器開 HTML 檔案時看的,所以通常使用此參數時記得改成 format=json 不然會拿到 HTML

  • origin:在使用瀏覽器做跨網域的 API Request 時,在 preflight 中要使用這個參數把它設為你的網址。對於要 authenticate 的 request,此參數值要跟 origin header 裡的一致,網址才會被放入白名單。如果是不需要 authenticate 的 request,可以直接把值設成 *Access-Control-Allow-Origin 就會設好

回來講講 action 參數。

  • action=query:回傳特定維基頁面的內容。
    在眾多操作當中,最重要的就是 action=query ,他自己就有一頁很長的文件,主頁面也是以它為例來講解。在設了action=query 之後,就必須再加上一些其他參數,比方說

    • titles:設定要查詢的維基頁面 title。舉例:回傳 New York 頁面 titles=New%20York (記得要 URL encoded)

    • prop:回傳查詢頁面的哪些屬性

      • extracts 會回傳特定頁面上的文字或 HTML,可以加上 exlimit 設定回傳幾個 extract、exchars 設定 extract的長短

      • categories:回傳頁面的分類

      • images:回傳頁面上的附加圖片檔

      • 還有很多族繁不及備載

    • list:指名抓取特定 list 結果

  • action=parse:把內容傳入以得到想要的結果,比方說利用指定 titlespageIdpage 的方法抓取頁面然後加上 prop=wikitext 來把內容改成wikitext 的格式。

  • action=opensearch:可以獲得特定關鍵字的簡短介紹,加上以下參數

    • namespace:頁面的種類,預設是 0,也就是主條目,想要了解請看這邊
    • search:(必選)搜尋關鍵字
    • format:預設是 json
    • limit:回傳結果數量

以上詳細的寫了幾個比較好利用的參數使用方法,現在我們就套用之前字典的 code 來做個簡單查詢維基百科的功能。

API Request URL:

"https://en.wikipedia.org/w/api.php
    ?action=opensearch
    &search=" +
    word +
    "&limit=1
    &namespace=0
    &format=json
    &origin=*"

成果:

CodePen 連結
搭配服用這篇文章:如果你想要用 API 來讀取維基百科


上一篇
[30apis] Day 18 : Trello API
下一篇
[30apis] Day 20 : Webhose.io API
系列文
我每天都接一個API30

尚未有邦友留言

立即登入留言