Windows10 の cURL で Nextcloud を使う方法

この記事は公開されてから時間が経っています

とある 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 が使える環境でした

これ残しておかないと、後で困るんだよね….

簡単なので、シーケンス図も

何か思いついたら追記予定..

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。