2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Qiita API v2をPowerShellから実行してみる

Last updated at Posted at 2021-07-31

管理用にQiitaに公開した記事の一覧を取得したいと調べてみたら、Qiita API v2としてAPIが公開されていました。

本記事ではQiita API v2PowerShellから実行して指定ユーザの公開記事一覧を取得してみます。

APIを実行するPowerShellコマンドレットについて

今現在のWindows 10ではcurl.exeが標準インストールされていますが、ここではPowerShell
Invoke-WebRequestコマンドレットを利用してAPIを実行しています。

Invoke-RestMethodでもいいのですが、Windows PowerShellだとInvoke-RestMethodにはレスポンスヘッダを取得するResponseHeadersパラメータがないのでWindows PowerShellPowerShell 7の両方で動くにように書いたので今回はInvoke-WebRequesを利用しています。

ちなみにInvoke-WebRequestのaliasはiwr

更に余談ですがInvoke-RestMethodResponseHeadersVariableオプションが追加された経緯については下記に記載があったりします。

New PowerShell Core Feature: Invoke-RestMethod -ResponseHeadersVariable

ドキュメント

Qiita API v2 の利用制限について

Qiita API v2/利用制限

2021年7月現在は下記のようになっていました。

利用制限

まずは認証しないで使えるAPIを実行して任意のユーザの公開記事一覧を取得してみる

ドキュメントを読むと、指定されたユーザの記事一覧を、作成日時の降順で返す GET /api/v2/users/:user_id/items があったのでまずはこれを利用して指定ユーザの記事一覧を取得してみます。

Qiita API v2/GET /api/v2/users/:user_id/items

# Invoke-WebRequeset
iwr https://qiita.com/api/v2/users/SAITO_Keita/items

実行すると、ドキュメントにある通りの項目がContentに取得できている事が確認できます。

今回は記事一覧をつくりたかったので下記のようにして作成日、URL、タイトル、更新日付 項目を選択してみます。

# select-objectで作成日、URL,タイトル、更新日付を取得
( iwr https://qiita.com/api/v2/users/SAITO_Keita/items | select-object -ExpandProperty content |  Convertfrom-Json ) | select-object created_at,url,title,updated_atat

これで指定したユーザの公開記事の一覧が取得できました。
ただし、ドキュメントを読むとページネーションの部分に一度に取得できる件数について記載があり、上記の例では20件までの記事一覧しか取得できません。

Qiita API v2/ページネーション

ドキュメントを読むと、

  • レスポンスヘッダのTotal-Countでアイテムの合計数
  • pageでページ指定
  • per_pageで1ページあたりに取得する要素の設定(デフォルト20,最大100)

と記載があるのでここらへんを考慮して全件取得する場合は下記のようにPowerShellスクリプトGet-PublicQiitaItemList.ps1かいてみました。

やっている事としては、初回リクエスト時のレスポンスヘッダからアイテムの要素数を取得して、残りのページ回数分APIを実行してデータを取得しています。

Get-PublicQiitaItemList.ps1
#!/usr/bin/env pwsh
<#
.SYNOPSIS
    qiitaの公開記事リストをとるやつ
.DESCRIPTION
    qiitaの公開記事リストをとるやつ
    qiitaのapi v2を利用しているので利用制限に引っかかるととまります
    https://qiita.com/api/v2/docs#利用制限
.EXAMPLE
    PS C:\> ./Get-PublicQiitaItemList.ps1 -UserId <<UserId>>
    PS C:\> "<<UserId>>"| ./Get-PublicQiitaItemList.ps1
.INPUTS
    System.String
.OUTPUTS
    System.Collections.ArrayList
.NOTES
    None
#>
param (
    [Parameter(ValueFromPipeline = $True, Mandatory = $True)]
    [String]$UserId
)

PROCESS {

    Set-StrictMode -Version Latest
    $ErrorActionPreference = "stop"

    # 出力用配列
    $output = New-Object System.Collections.ArrayList
    # 1ページ目取得
    $uri = ('https://qiita.com/api/v2/users/{0}/items??page=1&per_page=100' -f $UserId)
    $1stResponse = Invoke-WebRequest -Uri $uri
    $output += ( $1stResponse | Select-Object -ExpandProperty Content | ConvertFrom-Json ) | Select-Object created_at, url, title, updated_at

    #ページ処理
    #レスポンスヘッダから記事数を取得
    $totalCount = ([int[]]$1stResponse.Headers["Total-Count"])[0]
    # ページ数を計算
    $maxPage = [Math]::Ceiling($totalCount / 100)
    # 2ページ以降があったら取得
    for ($nowPage = 2; $nowPage -le $maxPage; $nowPage++) {
        $uri = 'https://qiita.com/api/v2/users/{0}/items?page={1}&per_page=100' -f $UserId, $nowPage
        $output += $(Invoke-WebRequest -Uri $uri | Select-Object -ExpandProperty Content |  ConvertFrom-Json) | Select-Object created_at, url, title, updated_at
    }

    Write-Output $output
}

認証して認証したユーザの記事一覧を取得してみる

ここでは認証したユーザの記事一覧を取得する/api/v2/authenticated_user/itemsを利用してみます。

Qiita API v2/GET /api/v2/authenticated_user/items
Qiita API v2/認証認可 

認証については 認証認可  に記載があり、ユーザ管理画面/アプリケーション からアクセストークンを取得してそれをリクエストヘッダとして送ってあげればよさそうです。

ユーザ管理画面のアプリケーションページで個人用アクセストークンを発行する

image.png

Qiita API v2/スコープ

今回は読みだしたいだけなのでread_qiitaを指定してアクセストークンの名前をqiita-readonlyとしてみました。

image.png

image.png

アクセストークンが発行されるのでこの文字列を控えておきます。

ここでもGET /api/v2/users/:user_id/itemsを実行したときと同様にInvoke-RestMethodを利用してGET /api/v2/authenticated_user/itemsを実行します。

# headersでtokenを渡して /api/v2/authenticated_user/items を実行
$token="<<発行したトークン>>"
iwr https://qiita.com/api/v2/authenticated_user/items -Headers @{Authorization = "Bearer $token"}

実行してみると、認証しているユーザの記事一覧が出力され、こちらについては認証がなかったGET /api/v2/users/:user_id/itemsとは違い限定共有の記事も取得できているようです。
privateの項目がTrueになっている)

上記の例についてもページ処理をしていないので取得できるのは20件までなので全件取得する場合は下記のようなPowerShellスクリプトGet-AuthQiitaItamList.ps1をかいてみました、

Get-AuthQiitaItamList.ps1
#!/usr/bin/env pwsh
<#
.SYNOPSIS
    qiitaの認証ユーザの記事リストをとるやつ
.DESCRIPTION
    qiitaの認証ユーザの記事リストをとるやつ
    qiitaのapi v2を利用しているので利用制限に引っかかるととまります
    https://qiita.com/api/v2/docs#利用制限
    .EXAMPLE
    PS C:\> ./Get-AuthQiitaItamList.ps1 -Token <<access token>>
    PS C:\> "<<Token>>" | ./Get-AuthQiitaItamList.ps1
.INPUTS
    System.String
.OUTPUTS
    System.Collections.ArrayList
.NOTES
    None
#>

param (
    [Parameter(ValueFromPipeline = $True, Mandatory = $True)]
    [String]$Token
)
PROCESS {

    Set-StrictMode -Version Latest
    $ErrorActionPreference = "stop"

    # 認証用
    $headers = @{Authorization = "Bearer $Token" }

    # 出力用配列
    $output = New-Object System.Collections.ArrayList
    # 1ページ目取得
    $uri = 'https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100'
    $1stResponse = Invoke-WebRequest -Headers $headers -Uri $uri
    $output += ($1stResponse | Select-Object -ExpandProperty Content | ConvertFrom-Json ) | Select-Object created_at, url, title, updated_at, private

    #ページ処理
    #レスポンスヘッダから記事数を取得
    $totalCount = ([int[]]$1stResponse.Headers["Total-Count"])[0]
    # ページ数を計算
    $maxPage = [Math]::Ceiling($totalCount / 100)
    # 2ページ以降があったら取得
    for ($nowPage = 2; $nowPage -le $maxPage; $nowPage++) {
        $uri = 'https://qiita.com/api/v2/authenticated_user/items?page={1}&per_page=100' -f $userId, $nowPage
        $output += $(Invoke-WebRequest -Headers $headers -Uri $uri | Select-Object -ExpandProperty Content | ConvertFrom-Json) `
        | Select-Object created_at, url, title, updated_at, private
    }

    Write-Output $output
}

総評

Qiitaは技術者を対象としたサービスなだけあり、普通にAPIが用意されていて便利に使えるのはいいですね。

お手軽なんでたまにはPowerShellからAPIを実行するのいかがでしょうか?

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?