java - 带有 InlineKeyboardMarkup 的 Telegram API 请求未显示带有消息的键盘
问题描述
我正在尝试通过 Telegram API 发送 POST 请求,但内联键盘效果不佳。虽然发送了消息文本,但没有显示键盘。
这是我的功能:
public static void ApiToOpponent(InlineKeyboardMarkup keyboardMarkup, long chat_id, String text) throws IOException {
HttpClient httpclient = HttpClients.createDefault();
List<List<InlineKeyboardButton>> keyboard = keyboardMarkup.getKeyboard();
URL url = new URL ("https://api.telegram.org/bot1778589497:AAE2CGovQ67.......bk/sendMessage");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; utf-8");
con.setRequestProperty("Accept", "application/json");
con.setDoOutput(true);
JSONObject params = new JSONObject();
params.put("chat_id",Long.toString(chat_id));
params.put("text",text);
JSONArray field_of_buttons = new JSONArray();
JSONArray row_of_buttons;
for( List<InlineKeyboardButton> row : keyboard) {
row_of_buttons = new JSONArray();
for(InlineKeyboardButton button : row){
JSONObject button_json = new JSONObject();
JSONArray param_aray = new JSONArray();
JSONObject button_param = new JSONObject();
button_param.put("text",button.getText());
button_param.put("callback_data",button.getCallbackData());
param_aray.put(button_param);
button_json.put("InlineKeyboardButton",param_aray);
row_of_buttons.put(button_json);
}
field_of_buttons.put(row_of_buttons);
}
JSONObject last_json = new JSONObject();
last_json.put("InlineKeyboardMarkup",field_of_buttons);
params.put("reply_markup",last_json);
try(OutputStream os = con.getOutputStream()) {
byte[] input = params.toString().getBytes("utf-8");
os.write(input, 0, input.length);
}
try(BufferedReader br = new BufferedReader(
new InputStreamReader(con.getInputStream(), "utf-8"))) {
StringBuilder response = new StringBuilder();
String responseLine = null;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
System.out.println(response.toString());
}
}
请求中的 Json 是:
{"text":"Your opponent has been found. Make a move","reply_markup":{"InlineKeyboardMarkup":[[{"InlineKeyboardButton":[{"text":"⬜","callback_data":"Tic_tac_move:0,0,,X"}]},{"InlineKeyboardButton":[{"text":"⬜","callback_data":"Tic_tac_move:0,1,,X"}]},{"InlineKeyboardButton":[{"text":"⬜","callback_data":"Tic_tac_move:0,2,,X"}]}],[{"InlineKeyboardButton":[{"text":"⬜","callback_data":"Tic_tac_move:1,0,,X"}]},{"InlineKeyboardButton":[{"text":"❌","callback_data":"Tic_tac_move:1,1,,X"}]},{"InlineKeyboardButton":[{"text":"⬜","callback_data":"Tic_tac_move:1,2,,X"}]}],[{"InlineKeyboardButton":[{"text":"⬜","callback_data":"Tic_tac_move:2,0,,X"}]},{"InlineKeyboardButton":[{"text":"⬜","callback_data":"Tic_tac_move:2,1,,X"}]},{"InlineKeyboardButton":[{"text":":heavy_large_circle:","callback_data":"Tic_tac_move:2,2,,X"}]}]]},"chat_id":"369439.."}
请求的响应是{"ok":true,"result":{"message_id":2420,"from":{"id":1778589497,"is_bot":true,"first_name":"Minesweeper","username":"Minesweep..."},"chat":{"id":3694....,"first_name":"Qwzr","username":"Qwa...","type":"private"},"date":1619903986,"text":"Your opponent has been found. Make a move"}}
将非常高兴任何回应:)
解决方案
在这种情况下,正确的 json 请求是:
{"text":"你的对手被找到了。出手","reply_markup":{"inline_keyboard":[[{"text":"⬜","callback_data":"Tic_tac_move:0,0,, X"},{"text":"⬜","callback_data":"Tic_tac_move:0,1,,X"},{"text":"⬜","callback_data":"Tic_tac_move:0,2 ,,X"}],[{"text":"⬜","callback_data":"Tic_tac_move:1,0,,X"},{"text":"❌","callback_data":"Tic_tac_move :1,1,,X"},{"text":"❌","callback_data":"Tic_tac_move:1,2,,X"}],[{"text":"⬜","callback_data ":"Tic_tac_move:2,0,,X"},{"text":"⬜","callback_data":"Tic_tac_move:2,1,,X"},{"text":"⭕","callback_data":"Tic_tac_move:2,2,,X"}]]},"chat_id":"177114... "}
推荐阅读
- python - Python selenium webdriver 等待时间比它应该的要长
- java - 无法在 JAVA 上连接到 SMTP GMAIL(连接超时错误)
- python - 无法初始化 peewee 的内存数据库
- javascript - 提交时关闭模式
- python - Pandas DataFrame:如何将数字列转换为成对分类数据?
- android - 已删除的权限仍显示在 Play 控制台中
- c++builder - bcc64.exe 如何存储调试信息?
- powershell - 使用批处理脚本触发 powershell 脚本
- sql - SQL:当它是敏感数据时改变默认选择顺序(不带 ORDER BY 子句)
- ruby-on-rails - 下拉列表未显示导轨