とある RPA で Nextcloud の REST API を利用する方法が全く思い当たらない…
何だ! この中途半端な実装は…
と思い倦ねて思いついた、困ったときの curl 頼み…
とある RPA で Nextcloud のファイルを整理させようと思い WebDAV のコマンドを叩こうと思ったんだけど、PROPFIND とかが送れない..
で、もちろん PUT も上手く動かない…
追加のパッケージをいくつも追加して、膨大なアクティビティーを積み上げて、指示ファイルの解析、ディレクトリーの一覧作成、送信先のオープンとか、そこそこの機能を実装してシーケンスを構築した…
三十年前くらいはフロー式のシーケンサとか弄ってたので別に苦じゃ無いけど…
(これ弄ってるとなぜかシーケンサの頃を思い出してしまう)
最後に、ファイルをアップロードしようと思ったら適切なコマンドが見つからない…
何じゃそりゃ!
まぁ、Excel の処理をを自動化するが主目的の様な物なのかな….と勝手に思い耽る..
IE 以外のブラウザーだと成功率低いし…
で、Windows10 に限定して、PowerShell の curl を使ってみようと思い立つ…
もう、RPA じゃなくて PowerShell で良いんじゃないか…
と良く思うこの頃….
注意点は PowerShell のエイリアスの curl じゃなくて curl.exe を使う点かな…
Invoke-WebRequest のコマンドと curl.exe のコマンドは違うので全く解らない ^^;
で、ファイルをアップロードするコマンドはこんな感じ…
PUT
curl.exe -v --request PUT -u username:password 'https://XXXXXXXX.sakura.ne.jp/XXXXXXXX/remote.php/dav/files/username/sample.txt' -d "@sample.txt"
これで username のフォルダーに sample.txt がアップロードされるようです…
こんなに簡単なのに、一週間もあれこれしてしまった…
ふぅ…
言われてやっているので、少し面白くないから毒を吐いてしまった..
感染注意!
SSH コマンドの実行!
最初に、PowerShell 上で ssh コマンドを実行しておかないと面倒だと思うので
ssh XXXXXXXX.sakura.ne.jp を実行して鍵のコピーをおいておくと良いかもしれない..
curl.exe のオプションに、こんなのがありますので…
-k, --insecure Allow insecure server connections when using SSL
PROPFIND
curl.exe -v --request PROPFIND -u username:password -H 'Depth: 2' -k 'https://XXXXXXXX.sakura.ne.jp/XXXXXXXX/remote.php/dav/files/username/' --data "<?xml version='1.0' encoding='UTF-8'?><d:propfind xmlns:d='DAV:'></d:propfind>"
こんな感じで行けました
ファイルのアップロード
実際は PDF をアップロードするんですが、上の PUT の様に簡単ではありませんでした
-F オプションを利用しました
curl.exe -v --request PUT -u username:password "https://XXXXXXXX.sakura.ne.jp/XXXXXXXX/remote.php/dav/files/username/sample.pdf" -F "file=@C:\Users\user\Desktop\202012\sample.pdf;type=application/pdf"
日本語のファイル名
上では、Nextcloud 上のファイル名は英字ですが日本語の場合は curl コマンドが暴走します
そう言う場合は URLエンコードすれば良いようです
で、二時間かけて探したのが、これ!
destFileName ← Path.GetFileName(destPath)
encFileName ← System.Net.WebUtility.UrlEncode(destFileName)
これを、上の sample.pdf に置き換えてやれば良い….
curl.exe -v --request PUT -u username:password "https://XXXXXXXX.sakura.ne.jp/XXXXXXXX/remote.php/dav/files/username/%E6%97%A5%E6%9C%AC%E8%AA%9E.pdf" -F "file=@C:\Users\user\Desktop\202012\日本語.pdf;type=application/pdf"
-F オプションの方のファイル名は日本語のままでも通ります
あ、Nextcloud 側のディレクトリー名が日本語の場合は、もちろんファイル名と同様にエンコードしないと暴走します
またコレが曲者で、System.Net.WebUtility.UrlEncode だの System.Web.HtmlUtility.UrlEncode だのと…
で、結局、System.Net.WebUtility.UrlEncode が使える環境でした
これ残しておかないと、後で困るんだよね….
簡単なので、シーケンス図も
何か思いついたら追記予定..