如何使用 curl 通过 bash 脚本将表情符号发送到 Telegram bot?

Fre*_*eek 3 bash curl emoji telegram

我正在尝试使用 bash 脚本向我的 Telegram 机器人发送表情符号/表情符号。这个 bash 脚本调用 Telegram API 如下:

curl -s -X POST 'https://api.telegram.org/'$API'/sendMessage' -F chat_id=$chat -F text=$text

由于 bash 脚本不是 unicode,我不能简单地从网络复制/粘贴表情符号。因此,我尝试使用 UTF-8 表情符号变体,但反斜杠字符不断被转义。

预期的 json 输出应如下所示: "text":"\ud83d\udd14"

相反,这就是我得到的:

输入:$text = \xF0\x9F\x98\x81 JSON 输出 ="text":"\\xF0\\x9F\\x98\\x81\\"

输入:$text = u'\U0001F604' JSON 输出 ="text": "u'\\U0001F604'\"

输入:$text = \U0001F514 JSON 输出 ="text":"\\U0001F514"

输入:$text = "(1f600)" JSON 输出 ="text":"\"(1f600)\""

输入:$text = \ud83d\ude08 JSON 输出 ="text":"\\ud83d\\ude08"

输入:$text = \\\ud83d\\\udd14 JSON 输出 ="text":"\\\\\\ud83d\\\\\\udd14"

使用 bash 脚本和 curl 向我的 Telegram 机器人发送表情符号的正确语法是什么?

非常感谢!

Geo*_*aph 6

您可以用于echo -e '\U0001F514'获取表情符号

curl -F "text=`echo -e '\U0001F514'` - it's a bell" "https://api.telegram.org/$API/sendMessage?chat_id=$chat"
Run Code Online (Sandbox Code Playgroud)

或者$'\U0001F514'

curl -F "text="$'\U0001F514'" - it's a bell" "https://api.telegram.org/$API/sendMessage?chat_id=$chat"
Run Code Online (Sandbox Code Playgroud)


Cha*_*ffy 5

为 Telegram API 生成 JSON

如果您的问题是关于 JSON 编码,让我们jq为您解决:

s=''  ## or s=$'\360\237\224\224'

json=$(jq -anc --arg id "$chat" --arg s "$s" '{"chat_id": $id, "text": $s}')
curl -X POST -H "Content-Type: application/json" -d "$json" \
  "https://api.telegram.org/$API/sendMessage"
Run Code Online (Sandbox Code Playgroud)

从 JSON 到字符串文字

在 bash 4.0 或更新版本中,可以要求 shell 本身为您提供一个 ASCII 可打印文字字符串,该字符串对应于多字节字符。

LC_ALL=C printf "s=%q\n" "$(jq -r . <<<'"\ud83d\udd14"')"
Run Code Online (Sandbox Code Playgroud)

...将输出:

s=$'\360\237\224\224'
Run Code Online (Sandbox Code Playgroud)

从字符串文字到 JSON

往另一个方向走:

s=$'\360\237\224\224'
jq -anM --arg s "$s" '$s'
Run Code Online (Sandbox Code Playgroud)

...作为输出发出:

"\ud83d\udd14"
Run Code Online (Sandbox Code Playgroud)

  • 你是怎么贴那个钟的? (3认同)