🔖

Windows 10のcurlで日本語postしたい時の対処法

2020/12/12に公開

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