CrowiのAPIを使ってみた

どうもざわです。
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ユーザが増えることを期待しています!

サーバサイドエンジニア。オムライスが好物
:)