muxui
@muxui
пишу так, как другие боятся

Как сгенерировать JSON для keyboard VK API?

Здравствуйте. Хочу сделать клавиатуру для отправки ее пользователю.
Вот, какой JSON должен получаться:
spoiler

{
    "one_time": false,
    "buttons": [
        [{
            "action": {
                "type": "location",
                "payload": "{\"button\": \"1\"}"
            }
        }],
        [{
            "action": {
                "type": "open_app",
                "app_id": 6979558,
                "owner_id": -181108510,
                "hash": "sendKeyboard",
                "label": "Отправить клавиатуру"
            }
        }],
        [{
            "action": {
                "type": "vkpay",
                "hash": "action=transfer-to-group&group_id=181108510&aid=10"
            }
        }],
        [{
                "action": {
                    "type": "text",
                    "payload": "{\"button\": \"1\"}",
                    "label": "Negative"
                },
                "color": "negative"
            },
            {
                "action": {
                    "type": "text",
                    "payload": "{\"button\": \"2\"}",
                    "label": "Positive"
                },
                "color": "positive"
            },
            {
                "action": {
                    "type": "text",
                    "payload": "{\"button\": \"2\"}",
                    "label": "Primary"
                },
                "color": "primary"
            },
            {
                "action": {
                    "type": "text",
                    "payload": "{\"button\": \"2\"}",
                    "label": "Secondary"
                },
                "color": "secondary"
            }
        ]
    ]
}



Вот эти блоки вставляются во всю ширину экрана, потому что они идут как разные массивы:
spoiler
[{
            "action": {
                "type": "location",
                "payload": "{\"button\": \"1\"}"
            }
        }],
        [{
            "action": {
                "type": "open_app",
                "app_id": 6979558,
                "owner_id": -181108510,
                "hash": "sendKeyboard",
                "label": "Отправить клавиатуру"
            }
        }],
        [{
            "action": {
                "type": "vkpay",
                "hash": "action=transfer-to-group&group_id=181108510&aid=10"
            }
        }]

Мне без разницы уже, как оно все будет: во всю ширину одна кнопка, или сеткой. Я уже потратил 4 часа на построение этого JSON. У меня совсем ничего не получается.
Вот, как сделал я:
spoiler
public function generateButtons(array $buttons, bool $inline = false) : string {
        $array = [
            'one_time' => !$inline,
            'inline' => $inline,
            'buttons' => [],
        ];

        foreach ($buttons as $item) {
            $array['buttons'][] = [
                'action' => [
                    'type' => $item['type'],
                    'payload' => json_encode($item['payload'], JSON_UNESCAPED_UNICODE),
                    'label' => $item['label'],
                ],
                'color' => $item['color'],
            ];
        }

        return json_encode($array, JSON_UNESCAPED_UNICODE);
    }

Вот, как вызываю:
spoiler
$vk->sendMessage([
           'user_ids' => $app->array['object']['message']['from_id'],
           'message' => 'Привет!',
           'keyboard' => $vk->generateButtons([
               [
                   'type' => 'text',
                   'payload' => ['button' => 'btn_1'],
                   'label' => 'Кнопочка',
                   'color' => 'secondary',
               ]
           ]),
       ]);


Вот, какой JSON у меня получается:
spoiler
{
  "one_time": true,
  "inline": false,
  "buttons": [
    {
      "action": {
        "type": "text",
        "payload": "{\"button\":\"btn_1\"}",
        "label": "Привет"
      },
      "color": "secondary"
    }
  ]
}

И это один из тысячи результатов, которые я делал. Все неправильно.
Я буду очень (!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) благодарен за помощь... Я просто уже не знаю, как правильно сделать, с парсингом JSON от ВК АПИ никогда не было проблем, но вот чтоб сгенирировать по их критериям...
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
HemulGM
@HemulGM
Delphi Developer, сис. админ
{
  "one_time": true,
  "inline": false,
  "buttons": [    <------- а где ещё массив?
    {
      "action": {
        "type": "text",
        "payload": "{\"button\":\"btn_1\"}",
        "label": "Привет"
      },
      "color": "secondary"
    }
  ]
}


Каждый элемент кнопки должен находится внутри массива - слоя, а каждый слой внутри массива buttons
Т.е. buttons - это массив слоёв кнопок (уровней, линий), каждый из которых содержит массив кнопок.

Итого:
public function generateButtons(array $buttons, bool $inline = false) : string {
        $array = [
            'one_time' => !$inline,
            'inline' => $inline,
            'buttons' => [],
        ];

        foreach ($buttons as $item) {
            $array['buttons'][][] = [  <---- ещё один массив
                'action' => [
                    'type' => $item['type'],
                    'payload' => json_encode($item['payload'], JSON_UNESCAPED_UNICODE),
                    'label' => $item['label'],
                ],
                'color' => $item['color'],
            ];
        }

        return json_encode($array, JSON_UNESCAPED_UNICODE);
    }

Результат:
{
    "one_time": true,
    "inline": false,
    "buttons": [
        [
            {
                "action": {
                    "type": "text",
                    "payload": "{\"button\":\"btn_1\"}",
                    "label": "1233123"
                },
                "color": "secondary"
            }
        ]
    ]
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
РосТендер Москва
от 130 000 до 150 000 ₽
Amigoweb Магнитогорск
от 40 000 до 70 000 ₽
ЧИТАЙ-ГОРОД Москва
от 140 000 до 210 000 ₽
17 февр. 2020, в 00:30
1500 руб./за проект
16 февр. 2020, в 22:28
2000 руб./за проект
16 февр. 2020, в 22:03
1200 руб./в час