LINUX.ORG.RU

как отправить кнопки в telegram ботом в post сообщении?

 ,


0

1

Никак понять не могу как сформировать запрос для отправки кнопки или нескольких кнопок в POST сообщении. Это ведь делается так?
А то там написано.
Например в sendMessage

reply_markup ReplyKeyboardMarkup
А в ReplyKeyboardMarkup значение
keyboard array of array of KeyboardButton
А KeyboardButton содержит
text string

Сформулируйте вопрос конкретнее. Какая-то библиотека для работы с Bot API используется или голые запросы шлёте?

b-adblack- ()

В общем, там JSON в теле POST надо слать, с кнопками типа такого будет:

{
  "chat_id": 293847,
  "text": "Жмякай",
  "reply_markup": {
    "keyboard": [
      [
        {"text": "Кнопка 1"},
        {"text": "Кнопка 2"}
      ],
      [
        {"text": "Кнопка 3"},
        {"text": "Кнопка 4"}
      ]
    ]
  }
}

b-adblack- ()
Ответ на: комментарий от b-adblack-

А как json отправлять? И как например без json'a вариант?

POST /bot<token>/sendMessage?"{ chat_id": <id>,"text": "Жмякай", "reply_markup": { "keyboard": [ [ {"text": "Кнопка 1"}, {"text": "Кнопка 2"} ], [ {"text": "Кнопка 3"}, {"text": "Кнопка 4"} ] ] } } HTTP/1.1

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Вам бы теорию HTTP подтянуть, опосредованно от телеграмовского АПИ.

И начинайте с простого. Запросы в браузере вы уже умеете. Теперь пора переходить к curl, гуглите как отправлять POST запросы и тот же JSON.

А потом уже пытайтесь программировать.

vvn_black ★★★★★ ()
Ответ на: комментарий от u0atgKIRznY5

Параметры так всё равно в GET размещаются. Тело POST-запроса передаётся после пустой строки:

POST https://api.telegram.org/coolbot:token-shmo-ken/sendMessage

{
  "chat_id": 293847,
  "text": "Жмякай",
  "reply_markup": {
    "keyboard": [
      [
        {"text": "Кнопка 1"},
        {"text": "Кнопка 2"}
      ],
      [
        {"text": "Кнопка 3"},
        {"text": "Кнопка 4"}
      ]
    ]
  }
}

По идее, оно может и комплексные параметры через GET принимать, заворачивая в JSON со второго и дальше уровня вложенности. В доках явно не указано, тут проверять надо. В любом случае, энкодировать придётся.

b-adblack- ()
Ответ на: комментарий от vvn_black

С помощью curl я узнал уже какой запрос отправляется. Вот например у меня бот опрашивает новые поступления.

GET /bot<token>/getUpdates?offset=913047485 HTTP/1.1
Host: api.telegram.org
User-Agent: telegram-bot
Accept: */*

Какой запрос нужно отловить curl чтобы узнать строку с массивом незнаю. Лучше было бы, если бы без json, но как?
Пока информация из интернета не помогла.

u0atgKIRznY5 ()
Ответ на: комментарий от b-adblack-

Напиши полностью запрос, наверное тебе проблем это не составит.

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

А откуда она отловится, если она не шлётся?

Лучше было бы, если бы без json

Почему? В JSON надо экранировать только кавычки. В URI придётся кучу всего экранировать и заворачивать, плюс некоторые прокси ограничивают максимальную длину URI, плюс чувствительная информация падает в логи апача и провайдеров.

b-adblack- ()
Ответ на: комментарий от b-adblack-

ну у меня с POST с вашим примером не получилось получить кнопки. Так какой запрос отправит кнопки? если нужно указать

HTTP/1.1
Host: api.telegram.org
User-Agent: telegram-bot
Accept: */*
То где именно?

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Все заголовки до пустой строки, тело после. И схему с доменом из первой строки убрать, в запросе они не нужны. Обязателен в данном случае только Host, ибо по умолчанию запрос идёт по айпишнику, а все домены третьего уровня привязаны к одному и тому же. Вместе так:

POST /coolbot:token-shmo-ken/sendMessage HTTP/1.1
Host: api.telegram.org

{
  "chat_id": 293847,
  "text": "Жмякай",
  "reply_markup": {
    "keyboard": [
      [
        {"text": "Кнопка 1"},
        {"text": "Кнопка 2"}
      ],
      [
        {"text": "Кнопка 3"},
        {"text": "Кнопка 4"}
      ]
    ]
  }
}
b-adblack- ()
Ответ на: комментарий от u0atgKIRznY5

Какой запрос нужно отловить curl чтобы узнать строку с массивом незнаю.

Пользуйтесь документацией

curl -X POST https://api.telegram.org/bot111111111:AAAAAAAAAAAAAKIdQgmIWrfl3PWlUfCwTRg4/sendMessage \
--header "Content-Type: application/json" -d @json.data \
--trace-ascii /dev/stdout

json.data

{
    "chat_id": 333333333,
    "parse_mode": "Markdown",
    "disable_web_page_preview": true,
    "text": "1591 votes"
}

Ну и смотрите, как оно внутри выглядит:

0000: ....O
=> Send header, 194 bytes (0xc2)
0000: POST /bot111111111:AAAAAAAAAAAAAKIdQgmIWrfl3PWlUfCwTRg4/sendMessa
0040: ge HTTP/1.1
004d: Host: api.telegram.org
0065: User-Agent: curl/7.51.0
007e: Accept: */*
008b: Content-Type: application/json
00ab: Content-Length: 117
00c0: 
=> Send data, 117 bytes (0x75)
0000: {    "chat_id": 333333333,    "parse_mode": "Markdown",    "disa
0040: ble_web_page_preview": true,    "text": "1591 votes"}
== Info: upload completely sent off: 117 out of 117 bytes

vvn_black ★★★★★ ()

Мамкин говнокодер, ты опять выходишь на связь?

anonymous ()
Ответ на: комментарий от vvn_black

Ну вот а как такой с кнопками получить с помощью curl? Или может знаете в какой программе можно посмотреть где конвертится запрос в json?

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Ну вот а как такой с кнопками получить с помощью curl?

Я привел пример как послать запрос к телеграм АПИ с помощью curl, что в нем непонятного? А если что и непонятно, то есть curl --help и дока телеграма.

Или может знаете в какой программе можно посмотреть где конвертится запрос в json?

Что в чего конвертится? Опция curl --trace-ascii /dev/stdout в консоль вывалит запрос как он есть.

vvn_black ★★★★★ ()
Ответ на: комментарий от vvn_black

Я запрос таким примером отправил, ничего даже json в логах stdout не было. Что-то вроде html ошибки было. Вероятно, вы не знаете как отправить запрос, чтобы пришли кнопки?

u0atgKIRznY5 ()
Ответ на: комментарий от vvn_black

Опция curl --trace-ascii /dev/stdout в консоль вывалит запрос как он есть.

Можно покороче:

       --trace-ascii <file>
              Enables a full trace dump of all incoming and outgoing data,  including
              descriptive  information, to the given output file. Use "-" as filename
              to have the output sent to stdout.


Последнее предложение.

evilface ★★ ()
Ответ на: комментарий от u0atgKIRznY5

Он не знает, как из курлы голый запрос без мусора сдампать :D

curl -v -X POST -d @input.json telegourla 2>&1 |grep '^>'|cut -c 3-

b-adblack- ()
Ответ на: комментарий от evilface

HTTP-запросы вполне себе без заданной длины бывают, всякие потоки и прочие на лету генерируемые архивы. Раз оно там столь всеядное и жуёт четыре вида запросов, ещё и регистронезависимо — не думаю, что набор заголовков станет помехой. Разве что Content-Type может быть важен. В конце концов, Bot API специально проектировалось, чтоб его с любой кофеварки можно было дёргать. Чай, не API для клиентов, которой с велосипедным протоколом и кучей шифрования; реализаций всего этого зоопарка — кот наплакал, ещё и новые слои постоянно добавляют; я с месяц назад хотел логгер запилить, в итоге даже готовую либу пришлось обмазывать методами, потому что протухла, и так и не въехал, почему messages.getDialogs из четырёх групчатов, в которых я висел, отдавал только два.

b-adblack- ()
Ответ на: комментарий от b-adblack-

В конце концов, Bot API специально проектировалось, чтоб его с любой кофеварки можно было дёргать.

Ну да, ТС же на Си ваяет, ему тогда можно и malloc(117) делать не парясь.

vvn_black ★★★★★ ()
Ответ на: комментарий от b-adblack-

Но у тебя оно работает? А то моя реализация недавно начала получать ошибку при авторизации, не важно с какой версией апи.

kardapoltsev ★★★★ ()
Ответ на: комментарий от evilface

Эдак можно «на всякий» накопипастить из браузера километровые юзерагенты, дуноттреки, куки и прочий мусор и повышать энтропию Вселенной, гоняя это всё без дела каждый раз. Нафиг, проще всё отпилить и обмазывать до получения MWE.

b-adblack- ()
Ответ на: комментарий от Deleted

Всяко лучше, чем получить поражение мозга скриптухой без физической типизации и потом всю жизнь мучиться. И потом, если некрофилировать CGI, то лучше компилируемого кода по производительности для него ничего нет; вон у Эдика целый веб-фреймворк самодельный на сишечке.

b-adblack- ()
Ответ на: комментарий от kardapoltsev

Ну вот оно типа работает, но со странностями; спрашивал в конфе телегодевов — никто подобного не встречал со свежими либами, а telegram.link уже около года заброшен и там кучу слоёв на API намазали; видимо, сломали что-то и не задокументировали; я в эти два чата, которые не видны, не по инвайт-ссылке заходил, а просто по юзернейму добавил через поиск контактов — может, они в базе хранятся иначе и под метод из старого слоя не подпадают. Короче, придётся либо шаманить, чтоб telegram.link новый слой апгрейднуть, либо пилить на другом языке; на JS уже есть рабочий логгер, даже с докачкой, но он только для лички сохраняет и только текст, думал допилить.

b-adblack- ()
Ответ на: комментарий от evilface

А на практике приходится балансировать между стандартами и защитой от DDoS'еров. На GPRS уже жить сложно, например — таймауты на многих сайтах.

b-adblack- ()
Ответ на: комментарий от b-adblack-

Браузеры-то нормально отправляют заголовки обычно. Тут вроде как тот случай как раз, когда от стандартов можно отойти и забить на тех, кто их не шлёт.

evilface ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.