【问题标题】:How to send emoji via bash script to Telegram bot using curl?如何使用 curl 通过 bash 脚本将表情符号发送到 Telegram 机器人?
【发布时间】:2019-04-26 23:12:37
【问题描述】:

我正在尝试使用 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 机器人的正确语法是什么?

非常感谢!

【问题讨论】:

  • 如果你想生成 JSON,让一个用来处理 JSON 的工具,比如jq,弄清楚如何编码你的字符串。
  • 顺便说一句,“bash 脚本不是 unicode”是什么意思?如果您需要修复编辑器设置,那是文本编辑器配置的问题,可以从那里修复。 UTF-8 是一种完全有效的编码,可用于您的脚本本身。
  • 也许我把事情搞混了,但我在精简的 Unix 环境(Synology NAS)上通过 SSH 使用 nano。如果我从 Web 复制/粘贴一个表情符号到我的 SSH 会话中,我会得到两个问号。因此我认为这是一个编码问题。
  • 嗯。您使用什么终端进行 SSH 会话?您确定那是支持 UTF-8 并使用合适的字体吗?
  • 我正在使用 Rebex,但似乎编码设置为某些 ISO-xxxx 标准。将其切换为 utf 8 后,我可以复制/粘贴表情符号,但我仍然必须首先将它们声明为变量,以便电报 api 正确处理它们(即不会被转义)。

标签: bash curl telegram emoji


【解决方案1】:

为 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"

从 JSON 到字符串字面量

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

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

...将输出:

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

从字符串文字到 JSON

往另一个方向走:

s=$'\360\237\224\224'
jq -anM --arg s "$s" '$s'

...作为输出发射:

"\ud83d\udd14"

【讨论】:

  • 你是怎么把铃铛贴出来的?
  • @hek2mgl,我收到了来自jq -r . &lt;&lt;&lt;'"\ud83d\udd14"' 的铃声,正在使用 OP 在问题中提出的文字 JSON 字符串。
  • 非常感谢您的超级快速回答和示例。我明天要试试这个。我不确定 jq 是否安装在我的环境中,但如果没有,我将回到您的第二个示例。非常感谢!我会告诉你进展如何。
  • 嗯。如果您没有 JQ,我会很想使用 Python 而不是 bash(因为任何远程最近的 Python 解释器都将内置一个 JSON 解析器/生成器)。如果您的消息将来自您无法直接控制的工具,那就更是如此——您不需要以 ", "sendVideo": "http://example.com/spam.m4v 结尾的文本字符串来创建新的 JSON 字段而不是正确转义作为数据。
  • @Stormenet --arg s $'This is an emoji: \360\237\224\224 and this is some more text...' - 或者您可以通过结束双引号并开始类似 ANSI C 的字符串来切换字符串中的引用样式,然后如果您想切换回双引号结束类似 C 的字符串并再次开始双引号。这不是一个真正的 jq 问题,它只是关于引用在 bash 中的一般工作方式。
【解决方案2】:

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

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

$'\U0001F514'

curl -F "text="$'\U0001F514'" - it's a bell" "https://api.telegram.org/$API/sendMessage?chat_id=$chat"

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2017-09-25
相关资源
最近更新 更多