Wikinews APIを使って自身のサイトに最新ニュースを掲載する方法

Tool

こんにちは。Web開発者の皆さん、英語学習サイトやアプリにリアルなニュースコンテンツを追加したいと考えたことはありませんか。「ニュース記事は著作権の管理が難しい」「商用利用できるフリーのニュースソースはないだろうか」といった課題を解決する一つの選択肢が Wikinews です。

この記事では、WikinewsのAPIを使って最新の英語ニュースを3件取得し、あなたのサイト等で商用利用するための方法を、ライセンスの解説から具体的なシェルスクリプトの実装まで解説します。APIを呼ぶ方法は、Linux、Windowsで利用可能なcurlで試していますので、適宜自使いたいプログラム言語に読み替えてください。

この記事の内容
  • Wikinewsは商用可能なフリーのニュースソースであり、利用時はクレジット(出所の明記)が必須となります。
  • APIでWikinewsの最新ニュースを自動取得する具体的手法を学べます。
開発・動作環境

この記事のプログラムは、以下の環境で開発および動作確認を行っています
・OS: Windows11, Ubuntu24

Wikinewsとは

Wikinewesは、一言で言うと「誰でも記事を書ける、Wikipediaのニュース版」です。Wikipediaが「百科事典」として知識をまとめるのに対し、Wikinewsは「ニュースサイト」として時事的な出来事を報道する、という違いがあります。

Wikinews, the free news source

Wikinewsのライセンスにつて

今回、WikinewsのAPIを利用方法を説明しますが、その前に、まずライセンスについて理解しておく必要があります。この点を遵守しない場合、コンテンツの利用ができなくなる可能性があります。

Wikinewsの全てのコンテンツは、「クリエイティブ・コモンズ 表示 2.5 (CC BY 2.5)」というライセンスで提供されています。

Q1. Wikinewsの記事は商用利用はできますか?

A1. はい、可能です。 CC BY 2.5 は、営利目的での利用を許可しています。あなたのサイトに広告が掲載されていても、有料コンテンツであっても問題ありません。

このライセンスは、以下の条件を守れば誰でも自由にコンテンツを利用できることを意味します。

  • 共有 — どのようなメディアやフォーマットでも資料を複製し、再配布できます。
  • 翻案 — コンテンツをリミックス、改変し、別の作品のベースにできます。
  • あらゆる目的での利用 — 上記の行為を、商用利用を含めたいかなる目的でも行うことができます。

これらを自由に行う対価として、後述する適切なクレジットを表示する(表示/Attribution)ことだけが求められます。

Q2. 遵守すべき重要なルールはありますか?

A2. 「表示 (Attribution)」が義務付けられています。 これは、「このコンテンツはWikinewsからの提供です」という出所を明記するルールです。具体的には、以下の2つの要素をサイトに表示する必要があります。

  1. コンテンツの提供元がWikinewsであること。
  2. 元のWikinews記事へのハイパーリンク。

クレジット表示の具体例

例えば、あなたのサイトにWikinewsの記事を掲載する場合、記事の下などに以下のようなクレジットを記載してください。これが確実な方法です。

This article, “記事のタイトル“, is from Wikinews and is licensed under a Creative Commons Attribution 2.5 License.

このクレジット表示は、ライセンスを遵守するために必須となります。サービスを適切に運用するためにも、確実な実装をお願いします。

Wikinewsを利用する上での注意点

WikinewsはWikipediaと同様に、「市民ジャーナリスト」つまり一般のボランティアによって執筆・編集されています。そのため、利用にあたっては以下の注意点を考慮するべきです。

  • 厳格な査読プロセスの欠如: 伝統的な報道機関が行うような、専門の編集者による厳格な事実確認(ファクトチェック)や校閲プロセスを経ていない可能性があります。
  • 記事の質のばらつき: 寄稿者の知識や経験によって、記事の正確性、客観性、網羅性に大きな差が出ることがあります。速報性はあっても、情報が不完全だったり、後から修正されたりすることもあります。
  • 中立性の不安: 方針として「中立的な観点」を掲げていますが、個々の記事が常に完全に中立であるとは限りません。

よって、Wikinewsの記事を利用・公開する場合は、次のような注意文も添えるべきでしょう。

当コンテンツで利用する Wikinewsの記事 は、市民ジャーナリスト(ボランティア)が執筆・編集しています。専門の編集者による厳格な事実確認は行われていない場合があり、記事の正確性や網羅性、客観性には差がありますため、その内容については参考情報としてお考えください。

APIを直接試す:基本的なCURLコマンド

シェルスクリプトを作成する前に、まずはAPIの基本的な動作をcURLコマンドで直接試してみましょう。ターミナル(コマンドプロンプト)で以下のコマンドを実行することで、APIからの生の応答を確認できます。

1. 最新記事の一覧を取得する

以下のコマンドは、公開済みの最新記事3件のリスト(記事IDとタイトルを含む)をJSON形式で取得します。

curl -G "https://en.wikinews.org/w/api.php"  -d "action=query&format=json&list=categorymembers&cmtitle=Category:Published&cmsort=timestamp&cmdir=desc&cmlimit=3"

実行すると、"pageid""title"のペアが3つ含まれたデータが返ってきます。
しかし、改行が無い状態でJSONデータが表示されますので、せめてWindowsのpowershellにパイプで渡して改行を入れてみましょう。

curl -G "https://en.wikinews.org/w/api.php" -d "action=query&format=json&list=categorymembers&cmtitle=Category:Published&cmsort=timestamp&cmdir=desc&cmlimit=3"  2>nul  | powershell -Command "$input.Replace(\"pageid\", \"`npageid\")"

実行結果:

{"batchcomplete":"","continue":{"cmcontinue":"20250915022044|3001179","continue":"-||"},"query":{"categorymembers":[{"
pageid":3022282,"ns":0,"title":"New York ..."},{"
pageid":3022229,"ns":0,"title":"Brazil's ..."},{"
pageid":3001520,"ns":0,"title":"Prosecutors.."}]}}

たしかに3行受け取っていますね。

curlのパラメータの解説

上記のcurlコマンドのパラメータを説明します。

  • -G: GET送信する意味
  • -d (–data) : 本来は「POST のボディにデータを送る」ためのオプションです。-G をつけた場合は挙動が変わり、データがクエリ文字列(URLの ?以降)として付与されるようになります。

APIパラメータの解説

上記のコマンドで使用した各パラメータは、Wikinews(およびWikipediaなど)が使用するMediaWiki APIの仕様に基づいています。

  • action=query: データを取得するための基本的な操作を指定します。
  • format=json: 取得するデータの形式をJSONに指定します。
  • list=categorymembers: 「カテゴリに含まれるページのリスト」を取得することを指定します。
  • cmtitle=Category:Published: どのカテゴリを対象とするかを指定します。ここでは「公開済み」の記事が対象です。
  • cmsort=timestamp: リストの並び順をタイムスタンプ(日時)に指定します。
  • cmdir=desc: desc(descending)は降順を意味し、新しい記事から順に並べます。
  • cmlimit=3: 取得する件数を3件に制限します。

2. 記事IDを指定して本文を取得する

次に、上記で取得したpageidのいずれか一つを使って、その記事の本文を取得します。以下のコマンドの ここに記事IDを入力 の部分を、実際の記事IDに置き換えてください。

curl -G "https://en.wikinews.org/w/api.php" -d "action=query&format=json&prop=extracts&exintro=true&explaintext=true&pageids=ここに記事IDを入力"

実行すると、指定したIDの記事タイトルと本文("extract"の部分)が含まれたデータが返ってきます。

APIパラメータの解説

  • prop=extracts: ページから本文の「抜粋(extract)」を取得することを指定します。
  • exintro=true: 記事全体ではなく、導入部(最初のセクション)のみを取得します。
  • explaintext=true: 本文をHTMLタグなしのプレーンテキストで取得します。
  • pageids=...: どのページの情報を取得するかを記事IDで指定します。

ここで使用したパラメータ以外にも、MediaWiki APIには数多くの機能が存在します。より詳細な情報については、以下の公式ドキュメントをご参照ください。

シェルスクリプトで最新ニュース3件を取得する方法

基本的な動作を確認したところで、これらの処理を自動化するシェルスクリプトを紹介します。

このスクリプトはcURLgrepといったUnix系システムに標準で搭載されているコマンドだけで動作し、外部ツールに依存しません。

スクリプト(Linux用bash)

以下の内容を get_latest_news.sh という名前で保存してください。

#!/bin/bash

# --- 設定 ---
# 取得したい記事の数
LIMIT=3
# APIエンドポイント
API_ENDPOINT="https://en.wikinews.org/w/api.php"

echo "Fetching latest ${LIMIT} news articles from Wikinews..."

# --- ステップ1: 最新ニュースの記事IDを3件取得する ---
# cURLでAPIを叩き、grepで記事IDだけを抽出してループ処理する
PARAMS_LIST="action=query&format=json&list=categorymembers&cmtitle=Category:Published&cmsort=timestamp&cmdir=desc&cmlimit=$LIMIT"

curl -s -G "$API_ENDPOINT" -d "$PARAMS_LIST" \
| grep -o '"pageid":[0-9]*' \
| grep -o '[0-9]*' \
| while read -r pageid; do
    echo "---"
    echo "Fetching content for Page ID: ${pageid}"

    # --- ステップ2: 取得した記事IDから記事本文を取得する ---
    # `pageids`パラメータを使い、記事IDで直接コンテンツをリクエストする
    PARAMS_CONTENT="action=query&format=json&prop=extracts&exintro=true&explaintext=true&redirects=1&pageids=$pageid"
    curl -s -G "$API_ENDPOINT" -d "$PARAMS_CONTENT"
 
    echo "" 
done

このスクリプトは、いくつかのコマンドをパイプ(|)で繋いで処理を連携させています。

  1. 設定セクション
    • LIMIT, API_ENDPOINT, USER_AGENT という変数を定義しています。これらの値を変更することで、取得件数などを簡単に調整できます。USER_AGENTは、APIサーバーに対して「誰がアクセスしているか」を伝えるためのもので、設定することが推奨されています。
  2. ステップ1: curlコマンド
    • 最初のcurlコマンドは、最新記事の一覧をAPIにリクエストする役割を担います。
    • -sオプションは、実行中の進捗メーターなどを表示しない「サイレントモード」を指定します。
    • このコマンドの実行結果(JSONデータ)は、次のgrepコマンドに渡されます。
  3. grepコマンドによるID抽出
    • grep -o '"pageid":[0-9]*': grepはテキストを検索するコマンドです。-oオプションは、マッチした部分だけを抜き出して表示します。このコマンドで、JSONデータの中から "pageid":12345 のような部分をすべて見つけ出し、1行ずつ出力します。
    • grep -o '[0-9]*': 最初のgrepの出力をさらにパイプで受け取り、今度はその中から数字の部分だけを抜き出します。
    • 結果として、記事IDの数字だけが1行ずつ確実に出力され、次のwhileループに渡されます。
  4. whileループによる繰り返し処理
    • grepが出力した記事IDのリストを一行ずつ読み込み、pageidという変数に格納してループ処理を開始します。
    • これにより、取得した記事の数だけ、ステップ2の処理が繰り返されます。
  5. ステップ2: ループ内のcurlコマンド
    • ループの中で実行される2回目のcurlコマンドです。
    • pageids=$pageid の部分で、ループ中の現在の記事IDをAPIに渡して、その記事の本文をリクエストします。
    • この結果が、最終的にターミナル画面に出力されます。

スクリプト(Windows用bat)

@echo off
setlocal enabledelayedexpansion

REM --- 設定 ---
REM 取得したい記事の数
set LIMIT=3

REM APIエンドポイント
set API_ENDPOINT=https://en.wikinews.org/w/api.php

echo Fetching latest %LIMIT% news articles from Wikinews...

REM --- ステップ1: 最新ニュースの記事IDを3件取得する ---
REM curlでAPIを叩き、findstrで記事IDだけを抽出
set TEMP_FILE=%TEMP%\wikinews_pageids.txt
set TEMP_JSON=%TEMP%\wikinews_response.json

REM curlでAPIを叩く(URLを直接指定)
curl -s "%API_ENDPOINT%?action=query&format=json&list=categorymembers&cmtitle=Category:Published&cmsort=timestamp&cmdir=desc&cmlimit=%LIMIT%" > "%TEMP_JSON%"

REM PowerShellを使って記事IDを抽出(より確実)
powershell -Command "Get-Content '%TEMP_JSON%' | Select-String -Pattern '\"pageid\":(\d+)' -AllMatches | ForEach-Object { $_.Matches } | ForEach-Object { $_.Groups[1].Value }" > "%TEMP_FILE%"

REM --- ステップ2: 取得した記事IDから記事本文を取得する ---
for /f "tokens=*" %%i in (%TEMP_FILE%) do (
    echo ---
    echo Fetching content for Page ID: %%i
    
    REM pageidsパラメータを使い、記事IDで直接コンテンツをリクエスト
    REM curlでAPIを叩いて記事内容を取得(URLを直接指定)
    curl -s "%API_ENDPOINT%?action=query&format=json&prop=extracts&exintro=true&explaintext=true&redirects=1&pageids=%%i"
    echo.
)

REM 一時ファイルを削除
del "%TEMP_FILE%" 2>nul
del "%TEMP_JSON%" 2>nul]
echo.

このbatファイルは基本的にはshと同じですので、差分部分を説明します。

・curl による記事ID取得:
JSON形式の結果を一時ファイル %TEMP_JSON% に保存します。

・JSON解析とID抽出

powershell -Command "Get-Content '%TEMP_JSON%' | Select-String -Pattern '\"pageid\":(\d+)' -AllMatches | ForEach-Object { $_.Matches } | ForEach-Object { $_.Groups[1].Value }" > "%TEMP_FILE%"

処理内容:

  1. Get-Content: JSONファイルを読み込み
  2. Select-String -Pattern '\"pageid\":(\d+)': 「”pageid”:数字」のパターンを検索
  3. (\d+): 数字部分をキャプチャグループとして抽出
  4. $_.Groups[1].Value: キャプチャした数字(記事ID)を取得
  5. 結果を %TEMP_FILE% に保存

・記事内容取得

for /f "tokens=*" %%i in (%TEMP_FILE%) do (...)

forループ:

  • %TEMP_FILE% から記事IDを1行ずつ読み取り
  • 各IDに対してAPI呼び出しを実行

Pythonスクリプト

以下のコードを get_wikinews.py のような名前で保存して実行してください。

import requests
import sys

# --- 設定 ---
API_ENDPOINT = "https://en.wikinews.org/w/api.php"
LIMIT = 3
# ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
# User-Agentヘッダーを設定(あなたのアプリ名や連絡先に書き換えてください)
# これがないと、Error fetching article IDs: 403 Client Error
# ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
HEADERS = {
    'User-Agent': 'MyCoolNewsBot/1.0 (https://example.com/bot; myemail@example.com)'
}

def get_latest_article_ids(limit: int) -> list[int]:
    """
    Wikinews APIから最新記事の記事IDリストを取得します。
    """
    print(f"Fetching latest {limit} article IDs from Wikinews...")
    
    params = {
        "action": "query",
        "format": "json",
        "list": "categorymembers",
        "cmtitle": "Category:Published",
        "cmsort": "timestamp",
        "cmdir": "desc",
        "cmlimit": limit
    }

    try:
        # headers=HEADERS を追加
        response = requests.get(API_ENDPOINT, params=params, headers=HEADERS, timeout=10)
        response.raise_for_status()
        
        data = response.json()
        
        article_ids = [item['pageid'] for item in data['query']['categorymembers']]
        return article_ids

    except requests.exceptions.RequestException as e:
        print(f"Error fetching article IDs: {e}", file=sys.stderr)
        return []

def get_article_content(page_id: int) -> dict | None:
    """
    指定された記事IDの記事タイトルと本文(抜粋)を取得します。
    """
    print(f"Fetching content for Page ID: {page_id}")
    
    params = {
        "action": "query",
        "format": "json",
        "prop": "extracts",
        "exintro": True,
        "explaintext": True,
        "pageids": page_id
    }

    try:
        # こちらの関数にも headers=HEADERS を追加
        response = requests.get(API_ENDPOINT, params=params, headers=HEADERS, timeout=10)
        response.raise_for_status()
        
        data = response.json()
        
        page_data = data['query']['pages'][str(page_id)]
        
        return {
            'title': page_data.get('title', 'No Title'),
            'extract': page_data.get('extract', 'No content available.')
        }

    except requests.exceptions.RequestException as e:
        print(f"Error fetching content for page ID {page_id}: {e}", file=sys.stderr)
        return None

def main():
    """
    メインの処理を実行します。
    """
    article_ids = get_latest_article_ids(LIMIT)

    if not article_ids:
        print("Could not retrieve any articles. Exiting.")
        return

    print("\n--- Latest Wikinews Articles ---")

    for page_id in article_ids:
        article = get_article_content(page_id)
        if article:
            print(f"\n■ {article['title']}")
            print(f"  (Page ID: {page_id})")
            print("-" * 30)
            print(article['extract'])
            
    print("\n--- End of Articles ---")


if __name__ == "__main__":
    main()

スクリプトの解説

  • ライブラリのインポート: requestsでHTTP通信を、sysでエラーメッセージの出力を制御します。
  • 設定: シェルスクリプトと同様に、APIのエンドポイントや取得件数を変数としてまとめています。
  • get_latest_article_ids() 関数:
    • APIに渡すパラメータを辞書(params)として定義します。requestsライブラリが自動的にURLエンコードしてくれるため、非常に見やすいです。
    • requests.get()でAPIにGETリクエストを送信します。
    • response.raise_for_status()は、リクエストが失敗した場合(404や500エラーなど)に自動で例外を発生させ、処理を中断させます。
    • response.json()でレスポンスボディをJSONからPythonの辞書に変換します。
    • リスト内包表記を使い、jqコマンドのようにスマートにpageidだけを抽出してリストを作成しています。
  • get_article_content() 関数:
    • 記事IDを引数に取り、その記事の情報を取得します。
    • MediaWiki APIの仕様上、pagesオブジェクトのキーは文字列型の記事IDになるため、str(page_id)としてアクセスしています。
  • main() 関数:
    • 全体の処理の流れを制御します。まず記事IDのリストを取得し、そのリストを使ってループ処理で各記事の内容を取得・表示します。
  • if __name__ == "__main__"::
    • このスクリプトが直接実行された場合にmain()関数を呼び出す、Pythonの標準的なお作法です。

まとめ

この記事では、Wikinews APIを利用して、商用利用可能な英語ニュースコンテンツを自身のWebサイトやアプリに組み込む方法を、ライセンスの解説から具体的なスクリプトの実装まで紹介しました。

この記事のポイント:

  • 商用利用可能なフリー素材: Wikinewsは「クリエイティブ・コモンズ 表示 2.5」ライセンスで提供されており、商用・非商用を問わず無料で利用できます。
  • 必須のクレジット表示: 利用する際は、Wikinewsが提供元であることの明記と、元記事へのリンク設置が義務付けられています。これを怠るとライセンス違反になるため、確実な実装が必要です。
  • 品質に関する注意点: 市民ジャーナリストによって執筆されているため、情報の正確性や中立性にはばらつきがある可能性があります。利用者に誤解を与えないよう、その旨を伝える注意書きを添えるのが賢明です。
  • APIによる自動取得: curlコマンドとMediaWiki APIを組み合わせることで、最新ニュースのIDリスト取得から本文の取得までを自動化できます。記事で紹介したシェルスクリプト(bash/bat)は、コピー&ペーストしてすぐに利用可能です。

ニュースコンテンツの利用は著作権のハードルが高いと思われがちですが、Wikinewsはライセンスを正しく理解すれば、開発者にとって非常に強力な選択肢となります。ぜひ本記事で紹介した方法を活用して、あなたのサービスにリアルな英語ニュースを取り入れてみてください。

タイトルとURLをコピーしました