esa.io のデータを丸ごと GROWI に移行する
概要
GROWI には esa.io や Qiita:Team から記事をインポートする機能があります。
しかし、 2019/10/21 現在の機能では、画像は移行されず、移行元に残ったままになります。
今回、 esa.io から GROWI に画像も移行するためのgemを作成しましたので、使い方も合わせて説明します。 Qiita:Team からのインポートにはまだ対応していません。
インポート前の準備
esa.io や Qiita:Team と少々違う部分なのですが、 GROWI は App を立ち上げた初期設定のままでは画像などのファイルをアップロードすることができません。
Amazon S3などのストレージの準備が必要です。
設定方法は下記記事で説明しています。
記事のインポート
esa.io から GROWI に記事をインポートする場合は、GROWIの標準機能で行えます。
記事のインポートの仕方については、下記記事で説明しています。
画像のインポート
Gemのインストール
下記のGemをインストールします。
$ gem install growi-image_converter
アクセストークンの設定
esa.io から GROWI への移行してみた - zuglab で発行した GROWI のアクセストークンと、GROWI App のURLを環境変数で設定します。
シェルがBashの場合は下記のように設定します。
$ echo 'export GROWI_URL=https://*****.growi.cloud' >> ~/.bash_profile $ echo 'export GROWI_ACCESS_TOKEN="0123456789abcdef0123456789abcdef0123456789ab"' >> ~/.bash_profile $ source ~/.bash_profile
移行テスト
何もオプションを指定せずに growi-image_converter
コマンドを実行します。
変換対象になるページの一覧が表示されます。
実際にはまだ変換されていません。
$ growi-image_converter
下記のように表示されます。
[DRY RUN MODE] PageID: 5d9bfe5fab394d00510c39ae, Result: Through PageID: 5d831e595799980050f87f64, Result: Converted PageID: 5d84f0ec87339600517b338a, Result: Converted PageID: 5d941ff8f1be7d00503c4a0a, Result: Through PageID: 5d932aeaf1be7d00503c4a01, Result: Through PageID: 5d8b27c67e03f70050bafa5e, Result: Through PageID: 5d86fd378571d10046324f6c, Result: Through
移行の実行
特にエラー等が表示されていないようであれば、 -d
オプションを付与して、変換を実行します。
$ growi-image_converter -d
移行に失敗した画像がある場合は、結果に出力されるので、手動で対応します。
例えば、下記のエラーでは、記事内で指定されている esa.io の画像のパスがリンク切れを起こしています。
該当のページへは、 https://*****.growi.cloud/5d8652a143cc8400554f977f
のように PageID を指定してアクセスできます。
PageID: 5d8652a143cc8400554f977f, Image URL: https://img.esa.io/uploads/production/attachments/xxxxx/2019/09/21/xxxxx/xxxxx.jpeg, Message: 403 Forbidden
以上で esa.io にある記事、画像を GROWI にインポートできました。
参考
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設定」タブを開きます。
「API Tokenを更新」ボタンをクリックします。
インストール・準備
ターミナルを起動し、下記コマンドで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_id
と file
を指定します。
file
は File.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>
下記のように、画像をアップロードして、本文を更新することができました。
GROWI でAPIを使ってみる
概要
GROWI はAPIを利用して操作することが可能です。
今回は、APIをいくつか試してみようと思います。
GROWI のAPI
GROWI のAPIドキュメントを参照すると、 Export
と Healthcheck
に関するAPIしか記載がありません。
GROWI REST API v3 | GROWI Docs
ドキュメントにはまとまっていませんが、下記にその他の豊富なAPIが定義されています。
https://github.com/weseek/growi/blob/1ad5b697c857db760f293dbb10e3b0e9b09ea93d/src/server/routes/index.js
API Tokenの生成
APIを利用するには、まず API Token の生成が必要です。
右上 ユーザー名 > ユーザー設定 を開きます。
「API設定」タブを開きます。
「API Tokenを更新」ボタンをクリックします。
APIを呼ぶ前に
1. コマンドのインストール
macのターミナルでAPIの呼び出しを試します。
その際、 jq
コマンドと nkf
コマンドを使います。
jq
がない場合は、先にインストールしてください。
Download jq
macの場合は、homebrew でインストールできます。
$ brew install jq
nkf
がない場合も、先にインストールしてください。
macの場合は、これも homebrew でインストールできます。
$ brew install nkf
2. API Tokenの変換
APIは curl
コマンドを使って呼び出します。
その際「API Tokenの生成」で作成したAPI Tokenを利用しますが、このままセットするとエラーになってしまうので、URL Encodeしておきます。
$ echo "[API Token]" | nkf -WwMQ | tr = %
例えば、API Tokenが =/0123456789/abcdef/=
だとした場合は、URL Encodeすると下記のようになります。
$ echo "=/0123456789/abcdef/=" | nkf -WwMQ | tr = % %3D%2F0123456789%2Fabcdef%2F%3D
APIを使ってみる
1. ページの一覧を取得する [/_api/pages.list]
ページの一覧の取得は、 /_api/pages.list
で行えます。
APIを呼び出すために、 curl コマンドに下記を設定します。
- app名:
xxxxx.growi.cloud
のxxxxx
の部分です。 - access_token: 「2. API Tokenの変換」で準備したURL Encode済みのAPI Tokenです。
- user: 右上に表示されているログイン中のユーザー名です。
下記のようにページの一覧が取得できました。
$ curl -s "https://[app名].growi.cloud/_api/pages.list?access_token=[URL Encode済みAPI Token]&user=[ユーザー名]" | jq .
{ "pages": [ { "status": "published", "grant": 4, "grantedUsers": [ "5d53b1e3403080003a491d6c" ], "liker": [], "seenUsers": [ "5d53b1e3403080003a491d6c" ], "commentCount": 0, "_id": "5d84f0ec87339600517b338a", "createdAt": "2019-09-20T15:31:56.653Z", "updatedAt": "2019-09-20T15:31:56.870Z", "path": "/test", "creator": "5d53b1e3403080003a491d6c", "lastUpdateUser": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "redirectTo": null, "grantedGroup": null, "__v": 1, "revision": "5d8610eb43cc8400554f9775", "id": "5d84f0ec87339600517b338a" }, { "status": "published", "grant": 1, "grantedUsers": [], "liker": [], "seenUsers": [ "5d53b1e3403080003a491d6c" ], "commentCount": 0, "_id": "5d831e595799980050f87f72", "createdAt": "2019-09-19T06:21:13.745Z", "updatedAt": "2019-09-19T06:21:13.760Z", "path": "/Templates/%E6%89%8B%E9%A0%86%E6%9B%B8/title", "creator": "5d53b1e3403080003a491d6c", "lastUpdateUser": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "redirectTo": null, "grantedGroup": null, "__v": 1, "revision": "5d831e595799980050f87f73", "id": "5d831e595799980050f87f72" }, ... ], "totalCount": 85, "offset": 0, "limit": 51, "ok": true }
2. 指定したページの情報を取得する [/_api/pages.get]
指定したページの中身を取得します。
/_api/pages.get
で行います。
curl コマンドに下記を設定します。
- app名:
xxxxx.growi.cloud
のxxxxx
の部分です。 - access_token: 「2. API Tokenの変換」で準備したURL Encode済みのAPI Tokenです。
- page_id: 「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスの任意の
.pages[].id
を選択します。例として5d84f0ec87339600517b338a
を指定します。
$ curl -s "https://[app名].growi.cloud/_api/pages.get?access_token=[URL Encode済みAPI Token]&page_id=5d84f0ec87339600517b338a" | jq .
{ "page": { "status": "published", "grant": 1, "grantedUsers": [], "liker": [], "seenUsers": [ "5d53b1e3403080003a491d6c" ], "commentCount": 0, "_id": "5d84f0ec87339600517b338a", "createdAt": "2019-09-20T15:31:56.653Z", "updatedAt": "2019-09-21T12:00:43.124Z", "path": "/test", "creator": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "lastUpdateUser": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "redirectTo": null, "grantedGroup": null, "__v": 3, "revision": { "format": "markdown", "_id": "5d8610eb43cc8400554f9775", "createdAt": "2019-09-21T12:00:43.122Z", "path": "/test", "body": "## 概要\nGROWI.cloud は esa.io や Qiita:team から直接インポートできる便利な機能があります。<br>\n今回、このインポート機能を利用して esa.io から GROWI.cloud へ移行しました。<br>\nインポート機能を利用する際、ハマった所があったため、備忘録としてまとめます。\n\n## esa.io から GROWI への移行\n\n### 1. esa.io の設定\n\nGROWI から esa.io の記事を取得できるように、 esa.io で Personal access token を作成します。<br>\nSETTINGS > Applications にある Personal access tokens 右の Generate new token ボタンをクリックします。\n\n![ORG__DSC0030.jpeg (2.1 MB)](https://img.esa.io/uploads/production/attachments/xxxxx/2019/09/21/xxxxx/xxxxx.jpeg)\n\n下記を設定して Save ボタンをクリックします。\n\n- Token description: 何でもよいので目的がわかる名前をつけます。 例) GROWI\n- Select scopes: Readにのみチェックします。", "author": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "hasDiffToPrev": true, "__v": 0 }, "id": "5d84f0ec87339600517b338a" }, "ok": true }
3. 画像をアップロードする [/_api/attachments.add]
画像のアップロードをするためには、 /_api/attachments.add
を使います。
API名から推測できる通り、このAPIはページに対して画像をアップロードして紐付けます。
アップロードしただけでは、記事内に配置されないため、ページを編集するAPIもしくはWeb UIでコンテンツを書き換える必要があります。
curl コマンドは下記を設定します。
- app名:
xxxxx.growi.cloud
のxxxxx
の部分です。 - access_token: 上記までのAPIとは違い、URL Encodeしていない「API Tokenの生成」で作成したAPI Tokenをセットします。
- file:
@ファイルフルパス
の形式でアップロードする画像を指定します。 - page_id: 画像をアタッチしたい、「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスの任意の .pages[].id を選択します。例として 5d84f0ec87339600517b338a を指定します。
アップロードに成功すると、下記のような結果が返ってきます。
$ curl -s -X POST -F "access_token=[URL EncodeしていないAPI Token]" -F file=@/path/to/image.jpeg -F page_id=5d84f0ec87339600517b338a https://[app名].growi.cloud/_api/attachments.add | jq .
{ "page": { "status": "published", "grant": 1, "grantedUsers": [], "liker": [], "seenUsers": [ "5d53b1e3403080003a491d6c" ], "commentCount": 0, "_id": "5d84f0ec87339600517b338a", "createdAt": "2019-09-20T15:31:56.653Z", "updatedAt": "2019-09-21T12:00:43.124Z", "path": "/test", "creator": "5d53b1e3403080003a491d6c", "lastUpdateUser": "5d53b1e3403080003a491d6c", "redirectTo": null, "grantedGroup": null, "__v": 3, "revision": "5d8610eb43cc8400554f9775", "id": "5d84f0ec87339600517b338a" }, "attachment": { "fileSize": 2094923, "_id": "5d86407b43cc8400554f977c", "createdAt": "2019-09-21T15:23:39.544Z", "page": "5d84f0ec87339600517b338a", "creator": "5d53b1e3403080003a491d6c", "originalName": "ORG__DSC0030_2.jpeg", "fileName": "1e26426f80e91863eb13fb3c61f52305.jpeg", "fileFormat": "image/jpeg", "__v": 0, "filePathProxied": "/attachment/5d86407b43cc8400554f977c", "downloadPathProxied": "/download/5d86407b43cc8400554f977c", "id": "5d86407b43cc8400554f977c" }, "pageCreated": false, "ok": true }
Web UIでも実際にファイルがアップロードされているか確認してみます。
下記のように、 https://[app名].growi.cloud/
の後ろに、 page_id
を指定するとそのページを表示できます。
https://[app名].growi.cloud/[page_id] 例) https://[app名].growi.cloud/5d84f0ec87339600517b338a
ページを開き、一番下にある Attachments
に画像が追加されていることが確認できます。
4. ページを編集する [/_api/pages.update]
ページの書き換えは、/_api/pages.update
を使います。
このAPIを使って、「3. 画像をアップロードする [/_api/attachments.add]」でアタッチした画像をページに埋め込んでみます。
curl コマンドは下記を設定します。
リクエストパラメータは -d
オプションで JSON 形式で指定します。
- app名: xxxxx.growi.cloud の xxxxx の部分です。
- access_token: ここでもURL Encodeしていない「API Tokenの生成」で作成したAPI Tokenをセットします。
- body: ページの内容を記載します。ここを編集してアタッチした画像を埋め込みます。編集方法は後述します。
- page_id: 「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスの任意の
.pages[].id
を選択します。例として 5d84f0ec87339600517b338a を指定します。 - revision_id: 「1. ページの一覧を取得する [/_api/pages.list]」のレスポンスで、
.pages[].id
と同じハッシュに指定されている.pages[].revision
を指定します。 - grant: 今回は
1
を指定します。
body
パラメータは下記のように追加を行いました。
末尾に \n\n![ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d)
を追加しています。
markdown の画像埋め込み書式で記載し、パスに /attachment/[attachment id]
を指定します。
[変更前] ## タイトル\n本文本文本文 [変更後] ## タイトル\n本文本文本文\n\n[ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d)
リクエストとレスポンスは下記のようになります。
curl -s -X POST \ -H 'Content-Type:application/json' \ -d '{"access_token":"[URL EncodeしていないAPI Token]","body":"## タイトル\n本文本文本文\n\n[ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d)","revision_id":"5d8610eb43cc8400554f9775","grant":1}' \ https://[app名].growi.cloud/_api/pages.update | jq .
{ "page": { "status": "published", "grant": 1, "grantedUsers": [], "liker": [], "seenUsers": [ "5d53b1e3403080003a491d6c" ], "commentCount": 0, "_id": "5d84f0ec87339600517b338a", "createdAt": "2019-09-20T15:31:56.653Z", "updatedAt": "2019-09-21T15:52:21.581Z", "path": "/test", "creator": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "lastUpdateUser": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "redirectTo": null, "grantedGroup": null, "__v": 3, "revision": { "format": "markdown", "_id": "5d86473543cc8400554f977e", "createdAt": "2019-09-21T15:52:21.579Z", "path": "/test", "body": "## タイトル\n本文本文本文\n\n[ORG__DSC0030_2.jpeg](/attachment/5d86459f43cc8400554f977d)", "author": { "isGravatarEnabled": false, "isEmailPublished": true, "lang": "ja", "status": 2, "admin": true, "_id": "5d53b1e3403080003a491d6c", "createdAt": "2019-08-14T07:01:55.366Z", "name": "名前", "username": "ユーザー名", "email": "メールアドレス" }, "hasDiffToPrev": true, "__v": 0 }, "id": "5d84f0ec87339600517b338a" }, "ok": true }
Web UIで記事を開いてみると、末尾に画像の記述が追加され、画像が表示されていることが確認できます。
以上、APIを利用してGROWIをかなり柔軟に操作できることがわかりました。
GROWI で画像をアップロードできるようにする (AWS S3の設定)
概要
GROWI.cloud は App を立ち上げた初期設定のままでは画像などのファイルをアップロードすることができません。画像をアップロードできるようにするには、AWS設定 が必要となります。
今回、 GROWI で画像をアップロードできるように、AWSへの設定を説明したいと思います。
なお、この設定後にアップロードされたファイルは Amazon S3 に保存されます。
GROWI.cloud の利用料金とは別に Amazon S3 の料金がかかります。
ちょっとだけ導入の敷居が高いGROWI
esa.io では、契約後に特に設定することなく記事に画像をアップロードすることができました。
画像アップロードは頻繁に使う機能なので、設定が必要になるのは少々不便です。
GROWI Docsを確認すると、2019/9/20現在 「AWS S3 へのアップロード設定」 は執筆中となっています。これもまた、GROWI.cloud の導入を敷居の高いものにしています。
ファイルのアップロード設定 | GROWI Docs
今後、順次ドキュメントは充実していくと思いますから、今だけの問題だと思います。
ちなみに、GROWI に何も設定せずに画像をアップロードしてみようとすると、このように File uploading is disabled
と表示されアップロードできません。
設定方法
1. AWSアカウントの準備
AWSアカウントを持っていない場合は、下記からアカウントを作成します。
アカウント作成だけであれば無料です。
作成されたアカウントはrootアカウントになります。
rootアカウントのまま利用するとセキュリティ上の危険性が高いため、下記記事にあるような設定をし、IAMユーザーを使用するようにしましょう。
AWSのアカウント開設後にすべき事をまとめてみた | DevelopersIO
2. S3バケットの作成
アカウント発行後、コンソールにログインします。
「サービスを検索する」検索フィールドに S3
と入力し、選択します。
「バケットを作成する」 ボタンをクリックします。
「1. 名前とリージョン」 では下記を設定し、「次へ」ボタンをクリックします。
- バケット名: 任意の名前をつけます。なお、世界中でユニークな名前である必要があるため、簡単なバケット名は既に他の方に取得されている場合があります。
- リージョン: 普段 GROWI を利用する場所と地理的に近いリージョンを選ぶことをおすすめします。今回は、
アジアパシフィック (東京)
を選択します。
「2. オプションの設定」は、必要に応じて設定します。特に設定せず、「次へ」ボタンをクリックしても大丈夫です。
「3. アクセス許可の設定」は、下記を設定し、「次へ」ボタンをクリックします。
- パブリックアクセスをすべてブロック: 下記をチェックします。
任意のアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
新しいパブリックバケットポリシーを介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
任意のパブリックバケットポリシーを介して、バケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする
- システムのアクセス許可の管理:
Amazon S3 ログ配信グループにこのバケットへの書き込みアクセス権限を付与しない
「4. 確認」では、設定内容を確認し、「バケットを作成」ボタンをクリックします。
S3バケットの一覧に作成されたバケットが追加されます。
3. GROWI用IAMユーザーの作成
再度コンソールホーム画面に戻り、IAMを開きます。
「ユーザー」をクリックし、「ユーザーを追加」ボタンをクリックします。
下記を設定し、「次のステップ: アクセス権限」ボタンをクリックします。
- ユーザー名: 任意の名前を設定します。 例)
growi-user
- アクセスの種類:
プログラムによるアクセス
にのみチェックします。
既存のポリシーを直接アタッチ
を選択し、 「ポリシーの作成」ボタンをクリックします。
「JSON」タブを選択し、下記を貼り付けます。
その際、 Resource
の growi-hogehoge-test-bucket
の部分は、「2. S3バケットの作成」で設定したバケット名に変更します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:DeleteObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::growi-hogehoge-test-bucket", "arn:aws:s3:::growi-hogehoge-test-bucket/*" ] } ] }
「ポリシーの確認」で、「名前」に任意のポリシー名を設定し、「ポリシーの作成」ボタンをクリックします。
先程のユーザーを追加画面に戻り、「ポリシーの作成」ボタンの右にある 更新マーク のボタンをクリックします。
検索フィールドに growi
と入力し、一覧に先程作成したポリシー名が表示されたら選択し、「次のステップ: タグ」をクリックします。
タグの追加は任意で設定し、「次のステップ: 確認」ボタンをクリックします。
確認画面の内容に問題がなければ、「ユーザーの作成」ボタンをクリックします。
ユーザーが作成され、 アクセスキー
と シークレットアクセスキー
が表示されます。 シークレットアクセスキー
は「表示」をクリックして確認します。一度この画面を離れると再度確認できなくなります。「.csvのダウンロード」ボタンをクリックして保存しておきましょう。
GROWI でのAWS設定
管理 > アプリ設定を開きます。
「AWS設定」セクションで下記を設定し「更新」ボタンをクリックします。
- リージョン: 「2. S3バケットの作成」で選択したリージョンをリージョンコードで入力します。
リージョンコードは下記で確認します。
リージョンとアベイラビリティーゾーン - Amazon Elastic Compute Cloud
アジアパシフィック (東京)
の場合は、ap-northeast-1
です。 - カスタムエンドポイント: 今回はS3を利用するため、空欄にします。
- バケット名: 「2. S3バケットの作成」で入力したバケット名を設定します。
- Access Key ID: 「3. GROWI用IAMユーザーの作成」で発行された
アクセスキーID
を設定します。 - Secret Access Key: 「3. GROWI用IAMユーザーの作成」で発行された
シークレットアクセスキー
を設定します。
下記メッセージが表示されたら、設定を保存成功です。
アップロードを試す
「作成」ボタンをクリックし、任意のページ名を付け、エディタ領域に画像をドラッグアンドドロップします。
正しく設定されると、記事に画像が埋め込まれます。
以上でAWSの設定が完了し、画像などのファイルをアップロードできるようになりました。
esa.io から GROWI への移行してみた
概要
2019年8月中旬に GROWI.cloud が公開され、ライトプランを契約していましたが、今までずっと放置していました。
そして本日、ようやく設定をし始めました。
いままで個人的な情報は esa.io で管理していました。
GROWI.cloud は、esa.io や Qiita:team などのユーザーごとの課金とは異なり、プランを選択して課金します。
プランに応じた上限人数まで同一料金で利用できます。
また、ライトプランの場合、1人で利用したとしてもユーザーあたりに換算した料金は他のサービスと比較しても安いです。
GROWI.cloud は esa.io や Qiita:team から直接インポートできる便利な機能があります。
今回、このインポート機能を利用して esa.io から GROWI.cloud へ移行しました。
インポート機能を利用する際、ハマった所があったため、備忘録としてまとめます。
esa.io から GROWI への移行
1. esa.io の設定
GROWI から esa.io の記事を取得できるように、 esa.io で Personal access token を作成します。
SETTINGS > Applications にある Personal access tokens 右の Generate new token ボタンをクリックします。
下記を設定して Save ボタンをクリックします。
- Token description: 何でもよいので目的がわかる名前をつけます。 例) GROWI
- Select scopes: Readにのみチェックします。
アクセストークンが生成されるので、コピーします。
画面リロードなどをすると、生成されたアクセストークンは確認することができなくなります。
確認できなくなった場合は、一度アクセストークンを削除し、もう一度生成してください。
2. GROWI の設定
管理 > データインポート を開きます。
下記を設定します。
ここで少々ハマりポイントです。
値を設定後に 接続テスト ボタンをクリックしたくなりますが、先に 更新 ボタンをクリックして設定を保存します。
更新 ボタンをクリックせずに 接続テスト ボタンをクリックすると下記のエラーが表示されます。
更新 ボタンで設定を保存後に、 接続テスト ボタンをクリックし、下記のように表示されれば esa.io との接続が成功です。
3. インポート
インポート ボタンをクリックします。
インポートできなかった記事は下記のようにエラーが表示されます。
それらの記事は手動で GROWI に記事を作成して移行します。
GROWI トップページを開くと、 Contents に esa.io からインポートされた記事が表示されています。
インポート機能の注意点
esa.io からインポートされた記事内に含まれる画像などのURLは、 https://img.esa.io/uploads/production/attachments/xxxxxx/xxxx.jpg
のように img.esa.io のままになっています。バージョン 3.5.12 時点では、インポート時のファイルのURLの変換機能は提供されていません。画像などのファイルは手動で GROWI にアップロードし直す必要があります。
そもそも GROWI で画像などのファイルをアップロードするためには、自前でAWSアカウントを発行し、 GROWI に設定する必要があります。 GROWI は画像などのファイルを、自前で用意したAWSアカウントのS3バケットに保存します。
AWS設定方法は下記で説明しています。
www.zuglab.tech
GROWI の情報について
GROWI.cloud は、OSSである GROWI.org を手軽に利用できるようにしたクラウドサービスです。
しかし、公開されて間もないため「インポート機能」、「AWS設定」をはじめ、ドキュメントが不足しています。
設定につまづいた際は、Slack ワークスペースがあるので、ここに質問するとすぐにサポートが受けられます。
参考
Raspberry Piの画面キャプチャ
概要
前回の記事でRaspberry Piのキャプチャを貼っていました。
インストール中の画面は、VNCなどができないため、そのままではキャプチャすることができません。
そこで、HDMIキャプチャ機器の購入と、キャプチャソフトウェア環境を整えました。
キャプチャ機器
購入したHDMIキャプチャ機器はこちらです。
HDMIキャプチャ機器は他にもたくさんありますが、こちらはUVC(USB Video Class) 、いわゆるWebカメラの規格に対応しています。そのため、ドライバは特に要りません。Macでも使いたかったのでこのHDMIキャプチャ機器にしました。
I-O DATA USB HDMI変換アダプター UVC/キャプチャー/HDMI×1/mac対応/土日サポート/GV-HUVC
- 出版社/メーカー: アイ・オー・データ
- 発売日: 2018/06/22
- メディア: Personal Computers
- この商品を含むブログを見る
キャプチャソフト
Macの場合はQuickTimeで撮れるので良いとして、今回はWindowsで使用するキャプチャソフトを探しました。
この辺りが見つかりました。
結論から言うと、 OBS (Open Broadcaster Software) が一番使いやすいと感じました。
Windows 10 カメラ
Windows 10 に標準で入っているアプリです。
シンプルでいいものの、設定があまりできず音声はプレビューできません。
Raspberryのモニタ代わりとして、音声も聞きたい場合は使えません。
録画したファイルには音声が記録されます。
良い点
- 画質が良い。
- 遅延が少ない。
- スクリーンショットが撮れる。
悪い点
- 音声がプレビューできない。
VLC
なんでも大体再生できるプレーヤーです。
https://www.videolan.org/vlc/index.ja.html
良い点
- 音声がプレビューできる。
- スクリーンショットが撮れる。
悪い点
- 画質が悪い。
- 遅延が大きい。
この2つは設定をいじっても改善できず。
OBS (Open Broadcaster Software)
OSSの配信用ソフトウェアです。
I-O DATA GV-HUVCのマニュアルに説明があり、そこからこのソフトウェアを知りました。
3つの中で遅延が最も少なく感じました。
https://obsproject.com/ja
良い点
- 画質が良い。
- 遅延が少ない。
悪い点
- 音声がプレビューできない。
- スクリーンショットが撮れる。
スクリーンショットは撮れないため、ブログなどにキャプチャを貼る場合は一度録画をして、そこから切り出していこうと考えています。
Rasbianのインストール
概要
Raspberry Piに、NOOBSを利用してRaspbianをインストールします。
参考手順
下記のインストールガイドに従って作業します。
https://www.raspberrypi.org/documentation/installation/installing-images/README.md
と、ガイドを開いて早速こんな記載がありました。
We recommend most users download NOOBS, which is designed to be very easy to use. However, more advanced users looking to install a particular image should use this guide.
NOOBSとは、Raspbianなどのを含むOSの簡易インストーラーのようです。
NOOBSが登場する前は、SDカードに直接OSイメージを書き込んで利用していましたが、現在はこちらが主流のようです。
NOOBSインストールガイド
https://www.raspberrypi.org/documentation/installation/noobs.md
NOOBSの書き込み
1. NOOBSのZIPをダウンロードする
下記URLからNOOBSのZIPをダウンロードします。
https://www.raspberrypi.org/downloads/
2. SDカードにNOOBSをインストールする
Mac OS The SD Association's Formatting Tool is also available for Mac users, although the default OS X Disk Utility is also capable of formatting the entire disk. To do this, select the SD card volume and choose Erase with MS-DOS format.
これによると、「 SD Memory Card Formatter
を使ってフォーマットを行え」とのことなので、さっそくアプリケーションをダウンロードします。
SD Memory Card Formatter
https://www.sdcard.org/downloads/formatter/
3. SD Memory Card Formatterをインストールする
SD Memory Card Formatterのzipをダウンロードしたら、中にインストーラーが入っているので、インストールを行います。
4. SD Memory Card Formatterでフォーマットする
キャプチャの通りにフォーマットを進めていきます。
5. NOOBS_v3_0_1.zip
を展開し、中身をフォーマットしたSDカードにコピーする
MacのFinderでファイルを一式、直接コピーします。
コピーが終わったらSDカードを安全に取り外します。
NOOBSでのRaspbianインストール
1. Raspberry Piの起動
NOOBSを書き込んだSDカードをRaspberry Piにセットし、電源を接続します。
2. インストールするOSの選択
しばらくすると、OSの一覧が表示されます。
今回は Raspbian Full
をインストールします。
※ 今回はRaspberry PiとLANケーブルで接続しています。WiFiの場合は先に WiFi networks
ボタンをクリックし、WiFiアクセスポイントに接続する必要があります。WiFi接続後OSの一覧が表示されます。
下記の確認ダイアログが表示されたら、「はい」をクリックします。
3. インストール
インストールが完了するまでしばらく待ちます。
インストールが完了すると、「OSのインストールに成功しました」ダイアログが表示されます。 OKボタンをクリックすると、再起動されます。
4. Raspbianの初期設定
再起動するとデスクトップにセットアップダイアログが表示されるので、初期設定を行います。
Country, Language, Timezoneを設定します。
デフォルトで登録されている Pi
ユーザーのパスワードを設定します。
Raspbianのデスクトップ表示のまわりに黒帯が表示されている場合は、 This screen shows a black border around the desktop
にチェックを入れると、再起動後に領域が拡張されます。
ソフトウェアのアップデートを行います。 アップデート完了まで少々時間がかかります。
アップデートが完了したら、Raspbianを再起動します。
5. ビデオメモリの設定
RaspbianはビデオメモリをRAMと共有しています。 初期のビデオメモリの割り当てのままだと少なく、YouTubeなどで全画面再生を行うとかなり再生がカクつきます。 そこで、ビデオメモリの割り当てサイズを増やします。
GPUメモリに、 256
と入力します。
再起動後、新しいビデオメモリの割り当てで有効化されます。
以上で、Raspbianのインストールは終了です。