🔖
Windows 10のcurlで日本語postしたい時の対処法
Windows 10のcurl普通に使えん問題
Windows 10でcurl
コマンドが使えるようになったと聞いて、Macで投げてたコマンドをそのまま実行しようとしたのですが…様々な問題が生じて一筋縄ではいかない様子でした。
VSCodeのbashでcurlポスト
$ curl -X POST -H 'Content-type: application/json' --data '{"blocks": [{"type": "section","block_id": "P3v","text": {"type": "mrkdwn","text": "*発信者* 株式会社ぴえん超えてぱおん スピ子\n*あて先* 佐藤","verbatim": false}},{"type": "context","block_id": "Ff/","elements": [{"type": "mrkdwn","text": ":leftwards_arrow_with_ho
ok: *電話連絡を希望* <tel:012-3456-7890|012-3456-7890>","verbatim": false}]},{"type": "section","block_id": "vKX","text": {"type": "plain_text","text": "もうこの気持ちは「普通」じゃあ言い表せない。一人でも二人でも誰かと分かち合いたい。","emoji": true}}]}' https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ
invalid_blocks_format
コマンドプロンプトでcurlポスト
> curl -X POST -H 'Content-type: application/json' --data '{"blocks": [{"type": "section","block_id": "P3v","text": {"type": "mrkdwn","text": "*発信者* 株式会社ぴえん超えてぱおん スピ子\n*あて先* 佐藤","verbatim": false}},{"type": "context","block_id": "Ff/","elements": [{"type": "mrkdwn","text": ":leftwards_arrow_with_hook: *電話連絡を希望* <tel:012-3456-7890|012-3456-7890>","verbatim": false}]},{"type": "section","block_id": "vKX","text": {"type": "plain_text","text": "もうこの気持ちは「普通」じゃあ言い表せない。一人でも二人でも誰かと分かち合いたい。","emoji": true}}]}' https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ
curl: (6) Could not resolve host: application
curl: (3) [globbing] bad range specification in column 2
curl: (6) Could not resolve host: section,block_id
curl: (6) Could not resolve host: P3v,text
curl: (3) [globbing] unmatched brace in column 1
curl: (6) Could not resolve host: mrkdwn,text
curl: (6) Could not resolve host: *発信者* 株式会社ぴえん超えてぱおん スピ子\n*あて先* 佐藤,verbatim
curl: (3) [globbing] unmatched close brace/bracket in column 6
curl: (6) Could not resolve host: context,block_id
curl: (6) Could not resolve host: Ff
curl: (3) [globbing] bad range specification in column 2
curl: (6) Could not resolve host: mrkdwn,text
curl: (3) [globbing] unmatched close brace/bracket in column 43
curl: (3) [globbing] unmatched close brace/bracket in column 6
curl: (6) Could not resolve host: section,block_id
curl: (6) Could not resolve host: vKX,text
curl: (3) [globbing] unmatched brace in column 1
curl: (6) Could not resolve host: plain_text,text
curl: (6) Could not resolve host: もうこの気持ちは「普通」じゃあ言い表せない。一人でも二人でも誰かと分かち合いたい。,emoji
curl: (3) [globbing] unmatched close brace/bracket in column 5
invalid_payload
ぴえん🥺
普通にしんどい
軽く触っただけでも以下のような問題が浮上…
- フォーマット無効エラー
- 日本語を含む文字列入力の送信がコケる
- URLエンコードが必要
- クォートの配慮が必要
手軽さがウリのcurlなのに、とにかく面倒くさい。
dataオプションで外部ファイルを読み込ませる
色々試しみて最も簡単だったのが--data(-d)
オプションを指定して外部ファイルを読み込む方法。
-d, --data <data> HTTP POST data
--data-ascii <data> HTTP POST ASCII data
--data-binary <data> HTTP POST binary data
--data-raw <data> HTTP POST data, '@' allowed
--data-urlencode <data> HTTP POST data url encoded
--delegation <LEVEL> GSS-API delegation permission
postデータとして投げるjsonをファイルにコピペして保存。ここではpost.json
としているが、テキストファイルでもOK。ファイルの文字コードはUTF-8。
post.json
{"blocks": [{"type": "section","block_id": "P3v","text": {"type": "mrkdwn","text": "*発信者* 株式会社ぴえん超えてぱおん スピ子\n*あて先* 佐藤","verbatim": false}},{"type": "context","block_id": "Ff/","elements": [{"type": "mrkdwn","text": ":leftwards_arrow_with_hook: *電話連絡を希望* <tel:012-3456-7890|012-3456-7890>","verbatim": false}]},{"type": "section","block_id": "vKX","text": {"type": "plain_text","text": "もうこの気持ちは「普通」じゃあ言い表せない。一人でも二人でも誰かと分かち合いたい。","emoji": true}}]}
-d
オプションのパラメータとしてファイルを指定。コマンドプロンプトとVSCodeのbashにて、この方法で無事に動作確認できました。
$ curl -X POST -H 'Content-Type:application/json' -d @post.json https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ
ok
これならMacで打ってたコマンドのjsonペイロードをファイルに貼り付けるだけ。わけわからん配慮も不要です。
「Windowsでもcurl使えるの!?やったぜ!!」とぬか喜びして撃沈された方は、この方法をお試しあれ。
PowerShellは?
PowerShellは知らん!!!
> curl -X POST -H 'Content-Type:application/json' -d $post.json https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ
Invoke-WebRequest : パラメーター 'Headers' をバインドできません。"Content-Type:application/json" の値を "System.String"
型から "System.Collections.IDictionary" 型に変換できません。
発生場所 行:1 文字:17
+ curl -X POST -H 'Content-Type:application/json' -d $post.json https:/ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-WebRequest]、ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Discussion