Ubuntu

Alfresco スクリプトでファイル登録

前回記事で、Brotherの複合機でスキャンしたファイルをPDFにしたり、OCRを掛けたりできた。
この勢いでAlfrescoにファイルが登録できれば、いつでもどこでもその紙を探せて閲覧できる便利な環境ができる。



広告


AlfrescoのReST APIは全てのリポジトリにアクセスできるもので、API Explorerでそのリファレンスを閲覧できる、とのこと。
機能の呼び出しは、curlでURLを叩く感じになる。

今回の処理は、Alfrescoが動作しているサーバーで行う。
外部サーバーからでもちゃんと準備をすれば動くかもしれないが、調べていないし試していない。

準備

jqのインストール

操作はAlfrescoをインストールしたサーバーにsshで接続して行う。
リモートでも良さそうだけれど、説明が localhost:8080 にアクセスしているし、ウチの場合はスキャナの取り込み先も同じサーバーなので都合が良い。

機能を叩いた結果は、JSON形式で戻される。結果を読みやすくするために整形処理があると便利。

$ sudo apt install jq

 

チケット取得

各機能を呼び出すためには、ユーザー認証を受けてチケットを利用する必要があるらしい。

$ curl -H "Content-Type: application/json" \
-d '{"userId":"admin","password":"admin"}' \
http://localhost:8080/alfresco/api/-default-/public/authentication/versions/1/tickets \
| jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   163    0    91  100    72    263    208 --:--:-- --:--:-- --:--:--   471
{
  "entry": {
    "id": "TICKET_d552b54cccddc0cbc39e57e996dbf2346a67f890",
    "userId": "admin"
  }
}

このユーザIDとパスワードのところを自分の環境に合わせればよさそうだ。

アクセスする先は http://localhost:8080/alfresco/api/-default-/public/authentication/versions/1/tickets となっている。

項目意味備考
httpHTTPプロトコルでアクセスする。httpsでも行けそうな気がするので、やっぱり保護が必要だと思う。
ウチではクライアント証明書で全てを保護している。
localhost自ホスト。ウチではhostsに登録されている127.0.0.1が戻される。
8080アクセス用のポート番号。インストールの仕方によって変わるかもしれない。
alfrescoalfresco側を呼び出す。いつもはshareで日頃使うUIが提供されている。
apiAPI呼び出しであることを示す。
-default-テナントを表す。データー構造が理解できていない。マルチテナントを意識したことがないので、ウチではデフォルトのリポジトリを使っているのだろう。
publicスコープ。publicは外部からの呼び出しが可能。privateは内部専用。
authenticationAPIの名前。
versions/1バージョン。
Entity or
Oparation
実態か操作を表す。

実際にチケットを利用するには、BASE64エンコーディングが必要。

$ echo -n 'TICKET_d552b54cccddc0cbc39e57e996dbf2346a67f890' | openssl base64
VElDS0VUX2Q1NTJiNTRjY2NkZGMwY2JjMzllNTdlOTk2ZGJmMjM0NmE2N2Y4OTA=

このチケットは一定期間有効。

スクリプト

チケットが恒久的に使えるものではないことから、チケットを取得するスクリプトを作成した。

#!/bin/bash
ADMNID="admin"
ADMNPS="admin"
TICKET=`curl -s -H "Content-Type: application/json" \
    -d "{\"userId\":\"${ADMNID}\",\"password\":\"${ADMNPS}\"}" \
    http://localhost:8080/alfresco/api/-default-/public/authentication/versions/1/tickets \
    | jq -r '.entry.id' | tr -d "\n" | base64`

スクリプトの作成では、これらのサイトにお世話になった。
DeveloppersIO / jqを活用してAPIレスポンス等から欲しい情報だけを抽出する【初級編】
Qoosky / jq チートシート
Qiita / シェルスクリプトでシンプルにurlエンコードする話

ファイル登録

登録先フォルダの確定

一口にファイルを登録する、といっても、一体どこへ?となる。
Shareの画面上は、サイト「家族」の「スキャン」だけれど…

リポジトリブラウザで見てみると、
 [ルート]→[サイト]→[家族]→[documentLibrary]→[スキャン]
だった。

この場合、フォルダの指定は
 ”サイト/家族/documentLibrary/スキャン”
となる。

ファイルの登録

ここまでできていると、意外と簡単にファイル登録ができる。

curl -X POST \
-F 'filedata=@/home/rohhie/document/sample.pdf' \
-F 'name=sample.pdf' \
-F 'nodeType=cm:content' \
-F 'cm:description=Scanned PDF' \
-F 'relativePath=サイト/家族/documentLibrary/スキャン' \
-H 'Authorization: Basic VElDS0VUX2Q1NTJiNTRjY2NkZGMwY2JjMzllNTdlOTk2ZGJmMjM0NmE2N2Y4OTA=' \
http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children \
| jq

同じファイル名で登録がなされる可能性がある場合には、autoRename=true を追加で渡しておけばいいらしい。
ウチの場合はスキャナがファイルを取り込んで年月日時分秒のファイル名を付けてくれるので、その可能性は考えなくても大丈夫ということで付けていない。

スクリプト

ファイルの登録ができたので、チケット取得からファイルの登録までを一気に行うスクリプトを作成。
赤太字のところをいじれば、多分どこでも使える系。

#!/bin/bash
# チケット取得
ADMNID="admin"
ADMNPS="admin"
TICKET=`curl -s -H "Content-Type: application/json" \
    -d "{\"userId\":\"${ADMNID}\",\"password\":\"${ADMNPS}\"}" \
    http://localhost:8080/alfresco/api/-default-/public/authentication/versions/1/tickets \
    | jq -r '.entry.id' | tr -d "\n" | base64`

#echo $TICKET

# ファイル登録
ALFDIR="サイト/家族/documentLibrary/スキャン"

ALBASE=`basename $1`
#ALNAME=${SC_BASE%.*}  ファイル名(拡張子なし)が使いたい場合
#AL_EXT=${SC_BASE##*.} 拡張子が使いたい場合

curl -s -X POST \
-F "filedata=@$1" \
-F "name=${ALBASE}" \
-F "nodeType=cm:content" \
-F "cm:description=Scanned PDF" \
-F "relativePath=${ALFDIR}" \
-H "Authorization: Basic ${TICKET}" \
http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children | jq

#-F "cautoRename=tru" \  ファイル名の重複があり得るならパラメータとして追加
#-F "cm:title=My text" \ コンテンツにタイトルを付けるならパラメータとして追加

もっと細かく色々と指定はできると思うが、スキャナから取り込んだPDFの登録なので、できることはこの程度か。

登録されたファイルの確認

登録されたファイルを確認するために、フォルダの一覧を見てみる
作ったばかりのフォルダで、登録したファイル1つだけが入っている。

curl -X GET \
-H 'Accept: application/json' \
-H 'Authorization: Basic VElDS0VUX2Q1NTJiNTRjY2NkZGMwY2JjMzllNTdlOTk2ZGJmMjM0NmE2N2Y4OTA=' \
-F 'relativePath=サイト/家族/documentLibrary/スキャン' \
'http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children?skipCount=0&maxItems=100' \
| jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   785    0   589  100   196  24541   8166 --:--:-- --:--:-- --:--:-- 32708
{
  "list": {
    "pagination": {
      "count": 1,
      "hasMoreItems": false,
      "totalItems": 1,
      "skipCount": 0,
      "maxItems": 100
    },
    "entries": [
      {
        "entry": {
          "createdAt": "2021-03-26T17:38:27.977+0000",
          "isFolder": false,
          "isFile": true,
          "createdByUser": {
            "id": "admin"
          },
          "modifiedAt": "2021-03-26T17:38:27.977+0000",
          "modifiedByUser": {
            "id": "admin"
          },
          "name": "sample.pdf",
          "id": "23d0395e-f87f-4569-8fd7-b69c5e3f898f",
          "nodeType": "cm:content",
          "content": {
            "mimeType": "application/pdf",
            "mimeTypeName": "Adobe PDF Document",
            "sizeInBytes": 3599738,
            "encoding": "UTF-8"
          },
          "parentId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
        }
      }
    ]
  }
}

最初、URLにrelativePathをくっつけて、URLエンコードしたディレクトリを指定するやり方を試し、それはそれで上手くいった。
しかし、-F でパラメーターにできるんじゃ?と言うことで試したところ上手くいったので、この記録だけを残しておく。

さいごに

スキャナで取り込んだ文書を自動的にAlfrescoに登録する。
たったこれだけのことが何年もできずにいたが、その気になれば20~30行でその結果が得られた。

スキャナがBrother製で、本体はSMB機能を持っておらず、ネットワーク上で「特別なプロトコルを使って手を上げているサーバー」に画像を渡すだけ。
でも、サーバー側でスクリプトを組めば、やりたいことが何でもできる、という作りになっていることに気付くのが遅すぎた。

もっと早くこれに全力を出していれば何かが変わっていたかもしれない。
でもまぁ、そのときそのときの最優先次項に取り組んだ結果だし、仕方がないか。
と思うのだった。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他