如何在Java Telegram Bot中仅通过user_id获取用户全部信息?
通过TelegramBots库仅用User ID获取外部用户完整信息
核心前提
Telegram Bot API有严格的权限限制:Bot只能获取与自己有过交互(用户发过消息、加入Bot可见的群组/频道)的用户信息,或者用户主动通过分享操作授权的信息。如果目标用户从未和你的Bot打过交道,也不在Bot能访问的群组里,你无法通过User ID直接获取其信息。
可行实现方案(基于telegrambots库)
对于符合权限要求的用户,你可以通过GetChat接口获取用户信息——因为私人用户的Chat ID和User ID是完全一致的,调用GetChat传入目标User ID即可拿到包含用户核心信息的Chat对象。
修改你的代码示例
在收到UserShared事件后,添加以下逻辑获取用户信息:
public void onUpdateReceived(Update update) { if (update.hasMessage() && update.getMessage().hasText()) { String massageText = update.getMessage().getText(); long chatId = update.getMessage().getChatId(); User user = update.getMessage().getFrom(); if (massageText.equals("/start")) { startCommandReceived(chatId, update.getMessage().getChat().getFirstName()); } else { sendMessage(chatId, "Sorry, command was not recognized"); } } else if (update.hasMessage()){ long chatId = update.getMessage().getChatId(); UserShared userShared = update.getMessage().getUserShared(); // 新增:处理用户分享的User ID,获取用户信息 if (userShared != null) { long targetUserId = userShared.getUserId(); try { // 调用GetChat接口,传入目标User ID Chat targetUserChat = execute(new GetChat(targetUserId)); // 提取用户公开信息 StringBuilder userInfo = new StringBuilder(); userInfo.append("获取到的用户信息:\n"); userInfo.append("ID: ").append(targetUserId).append("\n"); userInfo.append("昵称: ").append(targetUserChat.getFirstName()); if (targetUserChat.getLastName() != null) { userInfo.append(" ").append(targetUserChat.getLastName()); } userInfo.append("\n"); if (targetUserChat.getUserName() != null) { userInfo.append("用户名: @").append(targetUserChat.getUserName()).append("\n"); } else { userInfo.append("用户名: 无\n"); } sendMessage(chatId, userInfo.toString()); } catch (TelegramApiException e) { // 处理权限不足或其他异常 sendMessage(chatId, "无法获取用户信息:" + e.getMessage()); e.printStackTrace(); } } // 保留原有的输出逻辑 sendMessage(chatId, "UserShared --> "+ update.getMessage().getUserShared()); sendMessage(chatId, "ChatShared --> "+ update.getMessage().getChatShared()); sendMessage(chatId, "CurrentChatId --> "+chatId); } }
注意事项
- 权限限制:如果目标用户未与Bot交互过,
GetChat会抛出TelegramApiException,错误信息通常为Chat not found。 - 可获取的信息范围:
Chat对象包含用户的姓名、用户名、头像链接(通过getPhoto()获取),但无法获取手机号等隐私信息——这类信息必须用户主动通过KeyboardButtonRequestContact分享才能拿到。 - 异常处理:必须捕获
TelegramApiException,避免Bot崩溃,同时给用户反馈错误原因。
内容的提问来源于stack exchange,提问作者Sergei Lobachev
相关产品推荐
相关产品推荐

