GROWI APIを簡単に使ってみる

概要

前回の記事で、GROWI のAPIを使い、GROWI記事の更新を試してみました。

curl コマンドを使用してAPIのコールを行っていましたが、少々コマンドの組み立てが大変でした。
growi-client という便利なgemがあるので、今回はこれを使ってもうちょっと簡単にAPIを呼んでみようと思います。

https://github.com/ryu-sato/growi-client

API Tokenの生成

APIを利用するには、まず API Token の生成が必要です。
すでにAPI Tokenが生成済みの場合は、この手順は対応不要です。

右上 ユーザー名 > ユーザー設定 を開きます。
API設定」タブを開きます。
f:id:Aqutam:20190921173149p:plain

API Tokenを更新」ボタンをクリックします。
f:id:Aqutam:20190921195038p:plain

インストール・準備

ターミナルを起動し、下記コマンドでgemをインストールします。

$ gem install growi-client

.bash_profile などに環境変数API Token と GROWI.cloud のURLを設定します。

export GROWI_ACCESS_TOKEN=0123456789abcdef0123456789abcdef0123456789ab
export GROWI_URL=https://*****.growi.cloud/

設定したら、 source コマンドで適用します。

$ source ~/.bash_profile

irb を起動し、GrowiClientインスタンスを準備します。

$ irb
irb(main):001:0> require 'growi-client'
=> true
irb(main):002:0> growi_client = GrowiClient.new(growi_url: ENV['GROWI_URL'], access_token: ENV['GROWI_ACCESS_TOKEN'])
=> #<GrowiClient:0x00007fe022906f00 @growi_url="https://*****.growi.cloud", @access_token="0123456789abcdef0123456789abcdef0123456789ab", @rest_client_param={}, @cp_entry_point="https://*****.growi.cloud/_api/">

APIを使ってみる

1. ページの一覧を取得する [GApiRequestPagesList]

ページの一覧の取得は、 GApiRequestPagesList でリクエストパラメータを準備し、 growi_client.request(req) を実行することで取得できます。

irb(main):003:0> req = GApiRequestPagesList.new path_exp: '/'
=> #<GApiRequestPagesList:0x00007fe0218af670 @entry_point="/_api/pages.list", @method="GET", @param={:path=>"/"}>
irb(main):004:0> growi_client.request(req)
=> #<GApiReturn:0x00007fe021bf51e0 @ok=true, @data=[#<GrowiPage:0x00007fe021a8d348 @_id="5d9bfe5fab394d00510c39ae", @redirectTo=nil, @updatedAt=#<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,957000000n),+0s,2299161j)>, @lastUpdateUser=#<GrowiUser:0x00007fe022942e10 @_id="5d53b1e3403080003a491d6c", @email="email", @username="username", @name="name", @admin=true, @createdAt=#<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>, @status=2, @lang="ja", @isGravatarEnabled=false, @isEmailPublished=true>, @creator="5d53b1e3403080003a491d6c", @path="/path/", @__v=1, @revision=#<GrowiPageRevision:0x00007fe0229415d8 @_id="5d9bfe5fab394d00510c39af", @author=nil, @body=nil, @path=nil, @__v=0, @createdAt="", @format="">, @createdAt=#<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>, @commentCount=0, @seenUsers=["5d53b1e3403080003a491d6c"], @liker=[], @grantedUsers=[], @grant=1, @status="published", @grantedGroup=nil, @id="5d9bfe5fab394d00510c39ae">, #<GrowiPage:0x00007fe021a84888 @_id="5d831e595799980050f87f64", @redirectTo=nil, @updatedAt=#<DateTime: 2019-10-04T04:57:32+00:00 ((2458761j,17852s,540000000n),+0s,2299161j)>, @lastUpdateUser=#<GrowiUser:0x00007fe0221673f8 @_id="5d53b1e3403080003a491d6c", @email="email", @username="username", @name="name", @admin=true, @createdAt=#<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>, @status=2, @lang="ja", @isGravatarEnabled=false, @isEmailPublished=true>, @creator="5d53b1e3403080003a491d6c", @path="/path/", @__v=1, @revision=#<GrowiPageRevision:0x00007fe0221661d8 @_id="5d96d13c00830e00457918df", @author=nil, @body=nil, @path=nil, @__v=0, @createdAt="", @format="">, @createdAt=#<DateTime: 2019-09-19T06:21:13+00:00 ((2458746j,22873s,448000000n),+0s,2299161j)>, @commentCount=0, @seenUsers=["5d53b1e3403080003a491d6c"], @liker=[], @grantedUsers=[], @grant=1, @status="published", @grantedGroup=nil, @id="5d831e595799980050f87f64">]>

2. 指定したページの情報を取得する [GApiRequestPagesGet]

GApiRequestPagesGet のリクエストパラメータ page_id に、「1. ページの一覧を取得する [GApiRequestPagesList]」で取得した GrowiPage._id を指定します。
すると、下記のように指定した page_id の本文を含む情報が取得できます。

irb(main):007:0> req = GApiRequestPagesGet.new page_id: '5d9bfe5fab394d00510c39ae'
=> #<GApiRequestPagesGet:0x00007fe022981fe8 @entry_point="/_api/pages.get", @method="GET", @param={:page_id=>"5d9bfe5fab394d00510c39ae"}>
irb(main):008:0> pp growi_client.request(req)
#<GApiReturn:0x00007fe02218c5e0
 @data=
  #<GrowiPage:0x00007fe0221853f8
   @__v=1,
   @_id="5d9bfe5fab394d00510c39ae",
   @commentCount=0,
   @createdAt=
    #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>,
   @creator=
    #<GrowiUser:0x00007fe02218f920
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @grant=1,
   @grantedGroup=nil,
   @grantedUsers=[],
   @id="5d9bfe5fab394d00510c39ae",
   @lastUpdateUser=
    #<GrowiUser:0x00007fe022184520
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @liker=[],
   @path="/path/",
   @redirectTo=nil,
   @revision=
    #<GrowiPageRevision:0x00007fe02218e548
     @__v=0,
     @_id="5d9bfe5fab394d00510c39af",
     @author=nil,
     @body="本文本文本文本文本文本文",
     @createdAt=
      #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,954000000n),+0s,2299161j)>,
     @format="markdown",
     @path="/path/">,
   @seenUsers=["5d53b1e3403080003a491d6c"],
   @status="published",
   @updatedAt=
    #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,957000000n),+0s,2299161j)>>,
 @ok=true>

3. 画像をアップロードする [GApiRequestAttachmentsAdd]

画像のアップロードは、 GApiRequestAttachmentsAdd で行います。
リクエストパラメータには、 page_idfile を指定します。
fileFile.open('/path/to/image.jpg', 'r') の形式でローカルに保存されている画像ファイルのパスを指定します。
APIを呼ぶと、下記のように指定したページに画像がアップロードされます。

irb(main):011:0> req = GApiRequestAttachmentsAdd.new page_id: '5d9bfe5fab394d00510c39ae', file: File.open('/path/to/image.jpg', 'r')
=> #<GApiRequestAttachmentsAdd:0x00007fe0211253c8 @entry_point="/_api/attachments.add", @method="POST", @param={:page_id=>"5d9bfe5fab394d00510c39ae", :file=>#<File:/path/to/image.jpg>}>
irb(main):012:0> pp growi_client.request(req)
#<GApiReturn:0x00007fe0220586d8
 @data=
  {:page=>
    #<GrowiPage:0x00007fe021187af0
     @__v=1,
     @_id="5d9bfe5fab394d00510c39ae",
     @commentCount=0,
     @createdAt=
      #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>,
     @creator="5d53b1e3403080003a491d6c",
     @grant=1,
     @grantedGroup=nil,
     @grantedUsers=[],
     @id="5d9bfe5fab394d00510c39ae",
     @lastUpdateUser="5d53b1e3403080003a491d6c",
     @liker=[],
     @path="/path/",
     @redirectTo=nil,
     @revision=
      #<GrowiPageRevision:0x00007fe021195f88
       @__v=0,
       @_id="5d9bfe5fab394d00510c39af",
       @author=nil,
       @body=nil,
       @createdAt="",
       @format="",
       @path=nil>,
     @seenUsers=["5d53b1e3403080003a491d6c"],
     @status="published",
     @updatedAt=
      #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,957000000n),+0s,2299161j)>>,
   :attachment=>
    #<GrowiAttachment:0x00007fe02204ace0
     @__v=0,
     @_id="5d9c91b2ab394d00510c39b3",
     @createdAt=
      #<DateTime: 2019-10-08T13:40:02+00:00 ((2458765j,49202s,350000000n),+0s,2299161j)>,
     @creator="5d53b1e3403080003a491d6c",
     @downloadPathProxied="/download/5d9c91b2ab394d00510c39b3",
     @fileFormat="image/jpeg",
     @fileName="image.jpg",
     @filePath=nil,
     @filePathProxied="/attachment/5d9c91b2ab394d00510c39b3",
     @fileSize=65987,
     @id="5d9c91b2ab394d00510c39b3",
     @originalName="image.jpg",
     @page="5d9bfe5fab394d00510c39ae",
     @url="">},
 @ok=true>

4. ページを編集する [GApiRequestPagesUpdate]

ページの編集は、 GApiRequestPagesUpdate で行います。
「2. 指定したページの情報を取得する [GApiRequestPagesGet]」で取得した本文を書き換え、「3. 画像をアップロードする [GApiRequestAttachmentsAdd]」でアップロードしたファイルを、記事内から参照できるようにしてみます。

リクエストパラメータは下記のように指定します。

  • page_id: 「2. 指定したページの情報を取得する [GApiRequestPagesGet]」のレスポンスにある GrowiPage._id を指定します。
  • body: 更新する内容の本文を記載します。今回は、 本文\\n\\n![画像](/attachment/5d9c91b2ab394d00510c39b3) としました。
  • revision_id: 「2. 指定したページの情報を取得する [GApiRequestPagesGet]」のレスポンスにある GrowiPageRevision._id を指定します。
  • grant: 「2. 指定したページの情報を取得する [GApiRequestPagesGet]」のレスポンスにある GrowiPage.grant を指定します。

APIを呼ぶと、下記のように指定したページの本文を更新することができます。

irb(main):015:0> req = GApiRequestPagesUpdate.new page_id: '5d9bfe5fab394d00510c39ae', body: "本文\n\n![画像](/attachment/5d9c91b2ab394d00510c39b3)", revision_id: '5d9bfe5fab394d00510c39af', grant: 1
=> #<GApiRequestPagesUpdate:0x00007fe0212af770 @entry_point="/_api/pages.update", @method="POST", @param={:body=>"本文\n\n![画像](/attachment/5d9c91b2ab394d00510c39b3)", :page_id=>"5d9bfe5fab394d00510c39ae", :revision_id=>"5d9bfe5fab394d00510c39af", :grant=>1}>
irb(main):016:0> pp growi_client.request(req)
#<GApiReturn:0x00007fe0212fe898
 @data=
  #<GrowiPage:0x00007fe0212e7cb0
   @__v=1,
   @_id="5d9bfe5fab394d00510c39ae",
   @commentCount=0,
   @createdAt=
    #<DateTime: 2019-10-08T03:11:27+00:00 ((2458765j,11487s,748000000n),+0s,2299161j)>,
   @creator=
    #<GrowiUser:0x00007fe0212ef898
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @grant=1,
   @grantedGroup=nil,
   @grantedUsers=[],
   @id="5d9bfe5fab394d00510c39ae",
   @lastUpdateUser=
    #<GrowiUser:0x00007fe0212e5ff0
     @_id="5d53b1e3403080003a491d6c",
     @admin=true,
     @createdAt=
      #<DateTime: 2019-08-14T07:01:55+00:00 ((2458710j,25315s,366000000n),+0s,2299161j)>,
     @email="email",
     @isEmailPublished=true,
     @isGravatarEnabled=false,
     @lang="ja",
     @name="name",
     @status=2,
     @username="username">,
   @liker=[],
   @path="path",
   @redirectTo=nil,
   @revision=
    #<GrowiPageRevision:0x00007fe0212ef780
     @__v=0,
     @_id="5d9c948fab394d00510c39b4",
     @author=nil,
     @body="本文\n\n![画像](/attachment/5d9c91b2ab394d00510c39b3)",
     @createdAt=
      #<DateTime: 2019-10-08T13:52:15+00:00 ((2458765j,49935s,542000000n),+0s,2299161j)>,
     @format="markdown",
     @hasDiffToPrev=true,
     @path="path">,
   @seenUsers=["5d53b1e3403080003a491d6c"],
   @status="published",
   @updatedAt=
    #<DateTime: 2019-10-08T13:52:15+00:00 ((2458765j,49935s,546000000n),+0s,2299161j)>>,
 @ok=true>

下記のように、画像をアップロードして、本文を更新することができました。

f:id:Aqutam:20191008230011p:plain