どうもざわです。
Crowiの読み方が「クロウィ」なのか「クローウィ」なのかわからないままでいます。
「クロウィン」ってのもアリですね.oO(ひふみんっぽい)
さて、今日はそのCrowiのAPIを試してみたいと思います。
APIトークンの取得
まずはAPIトークンの取得です。
個人ページ → Settings → API設定
と進みます。
API Tokenを更新をクリックすると、新たに発行されます。
OKです!
ページ一覧を取得してみる
ブラウザから
ブラウザから以下の書式でアクセスしてみます。
http://[crowiのURL]/_api/pages.list?access_token=[先ほどのAPIトークン]&user=[ユーザ名]
するとリストでJSONがしっかり返ってきました。
{
"pages": [
{
"_id": "59c9c2c30588bb00f5d2f6f9",
"redirectTo": null,
"updatedAt": "2017-09-26T03:00:19.300Z",
"lastUpdateUser": "64bcc369c9ae123d80c147eb",
"creator": "64bcc369c9ae123d80c147eb",
"path": "/user/asn-admin/メモ/2017/09/26/APIテスト",
"__v": 1,
"revision": {
"_id": "59c9c2c30588bb00f5d2f6fa",
"author": {
"_id": "64bcc369c9ae123d80c147eb",
"email": "自主規制@com",
"username": "asn-admin",
"name": "アスニピース",
"admin": true,
"createdAt": "2017-09-16T06:23:37.621Z",
"status": 2,
"lang": "ja"
},
"body": "# APIテスト\r\n\r\n",
"path": "/user/asn-admin/メモ/2017/09/26/APIテスト",
"__v": 0,
"createdAt": "2017-09-26T03:00:19.299Z",
"format": "markdown"
},
"createdAt": "2017-09-26T03:00:19.297Z",
"commentCount": 0,
"seenUsers": [
"64bcc369c9ae123d80c147eb"
],
"liker": [],
"grantedUsers": [
"64bcc369c9ae123d80c147eb"
],
"grant": 1,
"status": "published",
"id": "59c9c2c30588bb00f5d2f6f9"
},
(省略)
],
"ok": true
}
いいですねb
PythonからGETしてみる
今度はリクエストパラメータにuser
ではなく、path
を指定して取得してみたいと思います。
以下の様なファイルを作ります(ファイル名=crowi_get.py)
import requests
url = 'http://[crowiのURL]/_api/pages.list?path=/'
data = {"access_token": "APIトークン"}
rsult = requests.request(method='get', url=url, data=data)
print(rsult.text)
path=/
とすると全てのページ情報が取得できます。
実行
$ python crowi_get.py
{"pages":[{"_id":"59c9c2c30...(省略)
成功です!!
その他API
この辺が参考になりそう。(URLの先頭が「_api」となっているものがそうなのかな?)
https://github.com/crowi/crowi/blob/33adcd02e78275c800622078852214f6becbb658/lib/routes/index.js
app.get('/_api/users.list' , accessTokenParser , loginRequired(crowi, app) , user.api.list);
app.get('/_api/pages.list' , accessTokenParser , loginRequired(crowi, app) , page.api.list);
app.post('/_api/pages.create' , accessTokenParser , loginRequired(crowi, app) , csrf, page.api.create);
app.post('/_api/pages.update' , accessTokenParser , loginRequired(crowi, app) , csrf, page.api.update);
app.get('/_api/pages.get' , accessTokenParser , loginRequired(crowi, app) , page.api.get);
app.get('/_api/pages.updatePost' , accessTokenParser , loginRequired(crowi, app) , page.api.getUpdatePost);
app.post('/_api/pages.seen' , accessTokenParser , loginRequired(crowi, app) , page.api.seen);
app.post('/_api/pages.rename' , accessTokenParser , loginRequired(crowi, app) , csrf, page.api.rename);
app.post('/_api/pages.remove' , loginRequired(crowi, app) , csrf, page.api.remove); // (Avoid from API Token)
app.post('/_api/pages.revertRemove' , loginRequired(crowi, app) , csrf, page.api.revertRemove); // (Avoid from API Token)
app.post('/_api/pages.unlink' , loginRequired(crowi, app) , csrf, page.api.unlink); // (Avoid from API Token)
app.get('/_api/comments.get' , accessTokenParser , loginRequired(crowi, app) , comment.api.get);
app.post('/_api/comments.add' , form.comment, accessTokenParser , loginRequired(crowi, app) , csrf, comment.api.add);
app.get( '/_api/bookmarks.get' , accessTokenParser , loginRequired(crowi, app) , bookmark.api.get);
app.post('/_api/bookmarks.add' , accessTokenParser , loginRequired(crowi, app) , csrf, bookmark.api.add);
app.post('/_api/bookmarks.remove' , accessTokenParser , loginRequired(crowi, app) , csrf, bookmark.api.remove);
app.post('/_api/likes.add' , accessTokenParser , loginRequired(crowi, app) , csrf, page.api.like);
app.post('/_api/likes.remove' , accessTokenParser , loginRequired(crowi, app) , csrf, page.api.unlike);
app.get( '/_api/attachments.list' , accessTokenParser , loginRequired(crowi, app) , attachment.api.list);
app.post('/_api/attachments.add' , uploads.single('file'), accessTokenParser, loginRequired(crowi, app) ,csrf, attachment.api.add);
app.post('/_api/attachments.remove' , accessTokenParser , loginRequired(crowi, app) , csrf, attachment.api.remove);
app.get( '/_api/revisions.get' , accessTokenParser , loginRequired(crowi, app) , revision.api.get);
app.get( '/_api/revisions.ids' , accessTokenParser , loginRequired(crowi, app) , revision.api.ids);
app.get( '/_api/revisions.list' , accessTokenParser , loginRequired(crowi, app) , revision.api.list);
結構ありますね、要チェックです。
感想
セキュリティ面
今回はブログ用なのでhttp通信でしたが、https通信にしたほうがよいですね。
APIトークンの漏洩には気をつけたいところです。
実用面
例えば、現状だと一部のページをログインなしで公開したい場合なんかに使えそうです。(今後機能追加されそうなカンジはありますが)
そしてやはりMarkdownはBacklogやWordpressなどにも使えて便利です。
弊社でもCrowiユーザが増えることを期待しています!