練習ページ/REST APIテスト

Last-modified: 2024-02-06 (火) 17:10:23

概要

REST APIによる編集のテスト用。
テストは子ページにて行います。

管理人がAPIキーを発行すれば通常ユーザーでも利用可能。

WIKIWIKI REST API コミュニティ

メモ

  • 編集差分ログに「API」と表示される。
  • 存在しないページに書き込むとページが新規作成される。
  • "source"フィールドの内容で全て上書き、置き換えられる。
  • "source"が空の状態で送信するとページ削除になる。
  • 既に存在するものと同名のファイルを添付しようとするとエラーになる(通常添付時と同じ)

(恐らく)解決済みの問題

'23/12/26:ConvertTo-Jsonを使用するよう変更。

  • "source"に含まれる特殊文字をエスケープする必要がある。
    雑談掲示板/コメントをコピーして確認。
    (改行) → \n
    \ → \\
    " → \"
    / → \/
  • 課題:日本語の文字化け
    • powershellのInvoke-RestMethodで発生。
      curl.exeに切り替えると解決した。原因がよく分からない。
  • ログ作成時に文字数オーバーエラーが発生(要修正)
    • ログの文字数は減らせないため対処不可能?
      エラーが発生した場合は手動でログ作成する。

子ページ一覧

成果物

ほぼ初心者なのでコードが拙いのはご愛敬……。

以下は全て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
}

コメント