概要
REST APIによる編集のテスト用。
テストは子ページにて行います。
管理人がAPIキーを発行すれば通常ユーザーでも利用可能。
メモ
- 編集差分ログに「API」と表示される。
- 存在しないページに書き込むとページが新規作成される。
- "source"フィールドの内容で全て上書き、置き換えられる。
- "source"が空の状態で送信するとページ削除になる。
- 既に存在するものと同名のファイルを添付しようとするとエラーになる(通常添付時と同じ)
(恐らく)解決済みの問題
'23/12/26:ConvertTo-Jsonを使用するよう変更。
"source"に含まれる特殊文字をエスケープする必要がある。
※雑談掲示板/コメントをコピーして確認。(改行) → \n \ → \\ " → \" / → \/
課題:日本語の文字化け- powershellのInvoke-RestMethodで発生。
curl.exeに切り替えると解決した。原因がよく分からない。
- powershellのInvoke-RestMethodで発生。
- ログ作成時に文字数オーバーエラーが発生(要修正)
- ログの文字数は減らせないため対処不可能?
エラーが発生した場合は手動でログ作成する。
- ログの文字数は減らせないため対処不可能?
子ページ一覧
成果物
ほぼ初心者なのでコードが拙いのはご愛敬……。
以下は全てPowerShell用。
token取得
# 認証情報を入力
$api_key_id = "???"
$secret = "???"
$wiki_id = "alicegear"
$api_url_auth = "https://api.wikiwiki.jp/$wiki_id/auth"
# token取得
$body = @{
api_key_id = "$api_key_id"
secret = "$secret"
}
$json_body = $body | ConvertTo-Json
$token = Invoke-RestMethod -Method POST -Uri $api_url_auth -ContentType "application/json" -Body $json_body | Select-Object -ExpandProperty "token" | ConvertTo-SecureString -AsPlainText -Force
雑談コメント整理
# 認証情報を入力
$api_key_id = "???"
$secret = "???"
$wiki_id = "alicegear"
$api_url_auth = "https://api.wikiwiki.jp/$wiki_id/auth"
$api_url_page = "https://api.wikiwiki.jp/$wiki_id/page/"
$api_url_pages = "https://api.wikiwiki.jp/$wiki_id/pages"
$page_cmt = "雑談掲示板/コメント"
$page_log = "雑談ログVOL."
$page_test = "練習ページ/REST APIテスト/雑談コメント"
# token取得
$body = @{
api_key_id = "$api_key_id"
secret = "$secret"
}
$json_body = $body | ConvertTo-Json
$token = Invoke-RestMethod -Method POST -Uri $api_url_auth -ContentType "application/json" -Body $json_body | Select-Object -ExpandProperty "token" | ConvertTo-SecureString -AsPlainText -Force
# "雑談掲示板/コメント"内容取得
$cmt = Invoke-RestMethod -Method GET -Uri $api_url_page$page_cmt -Authentication Bearer -Token $token -ContentType "application/json" | Select-Object -ExpandProperty "source"
$cmt = $cmt.Split("`n")
# 箇条書きLv.1の行を抽出
$cmt_lv1 = $cmt | Select-String -Pattern "^-[^-]+"
# 先頭コメント取得
$cmt_first = $cmt_lv1[$cmt_lv1.Length - 30]
# 全コメントから先頭コメントを選択し、行番号を取得
$cmt_num = $cmt | Select-String -SimpleMatch "$cmt_first" | Select-Object -ExpandProperty "LineNumber"
# 全コメントの1~2行目+先頭コメント~最後までを結合し代入
$cmt_trim = $cmt[0..1] + $cmt[($cmt_num - 1)..$cmt.Length] -join "`n"
# 送信用変換
$body_cmt_trim = @{
source = $cmt_trim
}
$json_cmt_trim = $body_cmt_trim | ConvertTo-Json
# コメント整理実行(テスト)
# Invoke-RestMethod -Method PUT -Uri $api_url_page$page_test -Authentication Bearer -Token $token -ContentType "application/json" -Body $json_cmt_trim
# コメント整理実行
Invoke-RestMethod -Method PUT -Uri $api_url_page$page_cmt -Authentication Bearer -Token $token -ContentType "application/json" -Body $json_cmt_trim
# ページリスト取得→ページ名のみ選択→"雑談ログVOL."で絞り込み→代入
$pages = Invoke-RestMethod -Method GET -Uri $api_url_pages -Authentication Bearer -Token $token | Select-Object -ExpandProperty "pages" | Select-Object -ExpandProperty "name" | Select-String "$page_log"
# "雑談ログVOL."を除去→降順ソート→代入
$log_num = $pages -replace "$page_log", "" | Sort-Object {[int]$_} -Descending
# 整数変換+1
$log_num = [int]$log_num[0] + 1
# 全コメントを読み込み→0から先頭コメントの1つ前までを切り取り
$cmt_log = $cmt | Select-Object -First ($cmt_num - 1)
# 送信用変換
$cmt_log = $cmt_log -join "`n"
$body_cmt_log = @{
source = $cmt_log
}
$json_cmt_log = $body_cmt_log | ConvertTo-Json
# ログ作成実行(テスト)
# Invoke-RestMethod -Method PUT -Uri $api_url_page$page_test -Authentication Bearer -Token $token -ContentType "application/json" -Body $json_cmt_log
# ログ作成実行
Invoke-RestMethod -Method PUT -Uri $api_url_page$page_log$log_num -Authentication Bearer -Token $token -ContentType "application/json" -Body $json_cmt_log
ファイル一括添付
# 添付するページ名を指定
$page_name = "練習ページ/REST APIテスト"
# 認証情報を入力
$api_key_id = "???"
$secret = "???"
$wiki_id = "alicegear"
$api_url_auth = "https://api.wikiwiki.jp/$wiki_id/auth"
$api_url_attach = "https://api.wikiwiki.jp/$wiki_id/page/$page_name/attachment"
# token取得
$body = @{
api_key_id = "$api_key_id"
secret = "$secret"
}
$json_body = $body | ConvertTo-Json
$token = Invoke-RestMethod -Method POST -Uri $api_url_auth -ContentType "application/json" -Body $json_body | Select-Object -ExpandProperty "token" | ConvertTo-SecureString -AsPlainText -Force
# 添付ファイル取得(サブフォルダ「upload」内)
$upload = Get-ChildItem -Path .\upload
# 全ファイルをbase64に変換して送信
foreach ($file in $upload) {
$converted = [Convert]::ToBase64String([System.IO.File]::ReadAllBytes($file))
$fileName = $file.Name
$body = @{
filename = "$fileName"
data = "$converted"
}
$json_body = $body | ConvertTo-Json
Invoke-RestMethod -Method PUT -Uri $api_url_attach -Authentication Bearer -Token $token -ContentType "application/json" -Body $json_body
}