5

как отправлять emoji смайлики через API Telegram?

В официальной документации ни слово про смайликов. Где-то пишут, что нужно отправлять UTF-8 код смайлика....но все без толку

U+1F601
U1F601
#1F601;
&#1F601;
\xF0\x9F\x98\x81

введите сюда описание изображения

Anatol
  • 3,746
cmd
  • 1,530
  • Так покажите, как посылаете эти данные – VenZell Feb 26 '16 at 11:13
  • как UTF коды, вместо смайликов (дополнил) – cmd Feb 26 '16 at 11:18
  • Попробуйте отослать в двойных кавычках следующую последовательность: \xF0\x9F\x98\x81 – VenZell Feb 26 '16 at 11:19
  • так тоже пытаслся, тоже не работает – cmd Feb 26 '16 at 11:22
  • А язык какой у вас? – VenZell Feb 26 '16 at 11:22
  • я не использую язык... отправляю через программу заголовки(запрос) – cmd Feb 26 '16 at 11:24
  • Я клоню к тому, что напишите конкретный пример, как вы формируете заголовок и в какой программе – VenZell Feb 26 '16 at 11:25
  • Обычный запрос, как сказано в документации API. Я дополнил – cmd Feb 26 '16 at 11:46
  • 1
    Не забыли ли вы закодировать текст? %F0%9F%98%81 – VenZell Feb 26 '16 at 11:49
  • ДА! Спасибо! Прошу вас перенести ваш комментарий в ответы и дополнить его, чтобы знать во что кодировать. Спасибо еще раз! – cmd Feb 26 '16 at 12:01
  • Пожалуйста. Добавил ответ – VenZell Feb 26 '16 at 12:05

6 Answers6

11

Посмотрите на Emoji Unicode Tables.
Нужный вам код смайлика находится в колонке Bytes (UTF-8).

Перед отправкой на сервер необходимо выполнять URL Encode.

Например, \xF0\x9F\x98\x81 должен выглядеть так: %F0%9F%98%81.

VenZell
  • 19,872
4

Я просто копировал emoji из таблицы выше обычным выделением мышкой (как выделяется текст) из колонки "Native" получается вот так:

Marat
  • 51
  • 1
  • Работает на node.js. Либо можно просто выбрать эмоджи на компьютере, если у тебя есть эмоджи клавиатура, и вставить в строку. Идеальный вариант, так как и в коде легко считывается – Eugene P. Sep 16 '21 at 10:46
4

На bash я использую этот ресурс для получения кода

Строка "C/C++/Java source code" отображает необходимую кодировку. Запрос приобретает вид

/usr/local/bin/curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"-432111111\",\"text\":\"\uD83D\uDC4C - Here is OK emoji\"}" "https://api.telegram.org/bot<TOKEN>/sendMessage"

где \uD83D\uDE31 и есть кодированный символ 👌

3

Пишу бота на C#, работает в таком виде "\U0001F69A" для кода U+1F69A из таблицы.

Anatol
  • 3,746
0

Для РНР там где смайл:

hex2bin('f09f9880')<br>
f09f9880

- код смайла без отсюда (колонка Bytes (UTF-8))

0

Используйте средства для представления Unicode текста в вашей среде. Она сама выполнит преобразование из текста в октеты согласно utf-8 кодировке, а затем произведёт percent-encoding. Например, чтобы отправить флаг , который состоит из Unicode символов U+1f1f7, U+1f1fa в restclient в Emacs:

POST https://api.telegram.org/bot:token/sendMessage
Content-type: application/x-www-form-urlencoded

chat_id=:chat-id&text=ура !

Это выполняет http POST запрос по указанному url (bot идентифицируемый по :token отправляет сообщение ура ! в :chat-id чат).

На Питоне это может выглядеть как:

import requests

requests.post(f'https://api.telegram.org/bot{token}/sendMessage',
              dict(chat_id=chat_id, text='ура !'))

Видно, что нет необходимости руками кодировать строку в ascii-представление:

'\u0443\u0440\u0430 \U0001f1f7\U0001f1fa!'

Питон автоматически кодирует сообщение. На сервер уходит (зашифрованное с помощью TLS), что-то вроде:

POST /bot<token>/sendMessage HTTP/1.1
Host: api.telegram.org
User-Agent: python-requests/2.18.4
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 69
Content-Type: application/x-www-form-urlencoded

chat_id=<chat-id>&text=%D1%83%D1%80%D0%B0+%F0%9F%87%B7%F0%9F%87%BA%21

jfs
  • 52,361