Google App Script を使ってWiki 操作を自動化する
WIKIWIKI REST API はプログラムを通じて Wikiページの読み書きを行うことができる機能です。大量のページを一括で更新したり、記事を定期的に自動更新したりすることができます。
WIKIWIKI REST API は Python, PHP, Java 等どんなプログラミング言語からでも利用できますが、Google App Script (以下 GAS) を利用することで、PCに環境構築する必要もなく、また、Google スプレッドシート 等との連携を行いやすくなります。
GAS を実行するための事前設定
Google アカウントを作成し、Google ドライブ上でドキュメントやスプレッドシート等のファイルを作成します。作成したファイルを開き、メニューの「拡張機能 > Apps Script」を選択するとスクリプトエディタが開きます。ここにプログラムを記載します。
WIKIWIKI 側の設定
コントロールパネル の「各種設定 > HTTP API 利用可能」を ON にしてください。また、API利用の際には APIキー を発行して利用することをおすすめします。管理パスワードと違い、流出しても該当のAPIキーを削除して無効にすることができます。
サンプル
以下に GAS を用いて Wiki ページの取得と書き込みを行うサンプルを示します。
プログラムの中の wikiID, wikiPage, pageContents, authInfo を実際の設定に合わせて変更してください。
ページ取得
/// WikiのIDを設定します
const wikiID = 'your-wiki-id';
// 対象となるWikiのページ名を設定します
const wikiPage = 'samplePage';
// 認証情報を設定します
const authInfo = {
"api_key_id": "your-api-key-id",
"secret": "your-secret"
};
// 認証トークンを取得します
function getAuthToken() {
const url = `https://api.wikiwiki.jp/${wikiID}/auth`;
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(authInfo)
};
const response = UrlFetchApp.fetch(url, options);
const data = JSON.parse(response.getContentText('UTF-8'));
if (data.status !== 'ok') {
throw new Error('認証に失敗しました');
}
return data.token;
}
// 特定のページの内容を取得します
function getPageContent(pageName, token) {
const url = `https://api.wikiwiki.jp/${wikiID}/page/${pageName}`;
const options = {
'method': 'get',
'contentType': 'application/json',
'headers': { 'Authorization': `Bearer ${token}` }
};
const response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText('UTF-8'));
}
// スクリプトを実行します
function runScript () {
try {
const token = getAuthToken();
const pageData = getPageContent(wikiPage, token);
// 新しい Google ドキュメントを作成します
const doc = DocumentApp.create(wikiPage);
// ドキュメントの本文を取得します
const body = doc.getBody();
// ページデータをドキュメントに書き込みます
body.appendParagraph(JSON.stringify(pageData.source));
} catch (e) {
console.error(e);
}
}
ページリスト取得
/// WikiのIDを設定します
const wikiID = 'your-wiki-id';
// 認証情報を設定します
const authInfo = {
"api_key_id": "your-api-key-id",
"secret": "your-secret"
};
// 認証トークンを取得します
function getAuthToken() {
const url = `https://api.wikiwiki.jp/${wikiID}/auth`;
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(authInfo)
};
const response = UrlFetchApp.fetch(url, options);
const data = JSON.parse(response.getContentText('UTF-8'));
if (data.status !== 'ok') {
throw new Error('認証に失敗しました');
}
return data.token;
}
// ページリストを取得します
function getPageList(token) {
const url = `https://api.wikiwiki.jp/${wikiID}/pages`;
const options = {
'method': 'get',
'contentType': 'application/json',
'headers': { 'Authorization': `Bearer ${token}` }
};
const response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText('UTF-8'));
}
// 日時をわかりやすい形に変換します
function convertDateFormat(dateString) {
// 日付文字列をDateオブジェクトに変換
const date = new Date(dateString);
// 曜日の配列
const weekdays = ["日", "月", "火", "水", "木", "金", "土"];
// 年、月、日、曜日、時間、分、秒を取得
const year = date.getFullYear();
const month = ("0" + (date.getMonth() + 1)).slice(-2);
const day = ("0" + date.getDate()).slice(-2);
const weekday = weekdays[date.getDay()];
const hours = ("0" + date.getHours()).slice(-2);
const minutes = ("0" + date.getMinutes()).slice(-2);
const seconds = ("0" + date.getSeconds()).slice(-2);
// 新しい日付形式を作成
const newDateFormat = `${year}-${month}-${day} (${weekday}) ${hours}:${minutes}:${seconds}`;
return newDateFormat;
}
// スクリプトを実行します
function runScript () {
try {
const token = getAuthToken();
const pageList = getPageList(token)['pages'];
// 新しい Google ドキュメントを作成します
const doc = DocumentApp.create('pageList');
// ドキュメントの本文を取得します
const body = doc.getBody();
// ページリストの内容を文字列としてまとめます
let listStrings = '';
pageList.forEach((element) => {
listStrings += 'ページ名: ' + element['name'] + '\n';
listStrings += 'url: ' + element['url'] + '\n';
listStrings += '更新日時: ' + convertDateFormat(element['timestamp']) + '\n';
listStrings += '\n';
});
// ページデータをドキュメントに書き込みます
body.appendParagraph(listStrings);
} catch (e) {
console.error(e);
}
}
ページ書き込み
// WikiのIDを設定します
const wikiID = 'your-wiki-id';
// 対象となるWikiのページ名を設定します
const wikiPage = 'samplePage';
// ページに書き込む内容を設定します
const pageContents = 'your contents';
// 認証情報を設定します
const authInfo = {
"api_key_id": "your-api-key-id",
"secret": "your-secret"
};
// 認証トークンを取得します
function getAuthToken() {
const url = `https://api.wikiwiki.jp/${wikiID}/auth`;
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(authInfo)
};
const response = UrlFetchApp.fetch(url, options);
const data = JSON.parse(response.getContentText('UTF-8'));
if (data.status !== 'ok') {
throw new Error('認証に失敗しました');
}
return data.token;
}
// ページに内容を書き込みます
function writePage(pageName, source, token) {
const url = `https://api.wikiwiki.jp/${wikiID}/page/${pageName}`;
const options = {
'method': 'put',
'contentType': 'application/json',
'headers': { 'Authorization': `Bearer ${token}` },
'payload': JSON.stringify({
'source': source
})
};
const response = UrlFetchApp.fetch(url, options);
const data = JSON.parse(response.getContentText('UTF-8'));
if (data.status !== 'ok') {
throw new Error('書き込みに失敗しました');
}
}
// スクリプトを実行します
function runScript () {
try {
const token = getAuthToken();
writePage(wikiPage, pageContents, token);
console.log('sucess');
} catch (e) {
console.error(e);
}
}
GAS の実行
スクリプトエディタの内容を保存し、「実行する関数を選択」から “runScript” を選択し、「実行」をクリックします。
初回実行時は「承認が必要です」というダイアログが表示されるので「権限を確認」を選択します。
「このアプリは Google で確認されていません」という警告が表示される場合がありますが、「詳細」をクリックし、「(安全ではないページ)に移動」を選択します。
「外部サービスへの接続」権限を要求されるので、「許可」を選択します。
承認後、プログラムが実行されます。