在開發 LINE Messaging API 時,你可能需要讓機器人知道傳訊息來的 LINE 使用者名稱,但官方預設的 API 回傳資料只有一長串的 User ID,這篇來分享怎麼用 User ID 取得使用者的 LINE 帳號名字,讓訊息內容更貼切~
問題:LINE 官方 API 只給 User ID
在 LINE 官方的說明文件中,可以看到有使用者傳訊息時,LINE Receive Webhook 的 JSON 檔案內容如下:
{
"destination": "xxxxxxxxxx",
"events": [
{
"replyToken": "***",
"type": "message",
"mode": "active",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U4af4980629..."
},
"message": {
"id": "325708",
"type": "text",
"text": "@example Hello, world! (love)",
"emojis": [
{
"index": 23,
"length": 6,
"productId": "5ac1bfd5040ab15980c9b435",
"emojiId": "001"
}
],
"mention": {
"mentionees": [
{
"index": 0,
"length": 8,
"userId": "U850014438e..."
}
]
}
}
}
]
}
可以看到接收訊息的 Webhook 裡面只有一長串的 User ID,而沒有該位使用者的帳號名稱,是因為需要呼叫另一個 API,讓機器人用這組 ID 去查詢該帳號的名稱等資料。下文來分享怎麼讓 LINE Bot 知道帳號名稱,叫出對方名字。
LINE 機器人取得使用者名字( 資訊 )方法
若要讓 LINE 機器人的程式碼取得使用者的名字,需要以下兩個資訊:
- 使用者 User ID,會包含在 LINE Messaging API 的 Receive Webhook 裡
- 你的 LINE API Token
而 LINE 會以 json 格回傳使用者的資訊給你,包括:
- 使用者的帳號名字
- 使用者大頭照網址
- 使用者的 bio 內容
- 使用者的偏好語言
{
"userId": "U82******************",
"displayName": "張君祥", // 傳訊息使用者的帳號名字
"pictureUrl": "https://sprofile.line-scdn.net/***/", // 使用者的大頭照圖片網址
"statusMessage": "蘋果仁 IG 編輯\n做個無所畏懼的謙卑之人", // 使用者的 Bio
"language": "zh-Hant" // 使用者的偏好語言
}
再來是呼叫 API,各種程式語言的語法如下:
Shell
user_id 改為你自己解析 JSON 的變數,並將 {channel access token } 改成你的 API Token
curl -v -X GET https://api.line.me/v2/bot/profile/{userId} \
-H 'Authorization: Bearer {channel access token}'
Python
Python 取得 LINE user 名稱的語法如下:
from linebot import LineBotApi
from linebot.exceptions import LineBotApiError
line_bot_api = LineBotApi('<channel access token>')
try:
profile = line_bot_api.get_profile('<user_id>')
except LineBotApiError as e:
# error handle
...
Node.js
const line = require('@line/bot-sdk');
const client = new line.Client({
channelAccessToken: '<channel access token>'
});
client.getProfile('<userId>')
.then((profile) => {
console.log(profile.displayName); //顯示使用者名字
console.log(profile.userId);
console.log(profile.pictureUrl); // 顯示使用者大頭照網址
console.log(profile.statusMessage) // 使用者自介內容
})
.catch((err) => {
// error handling
});
Google App Script
App Script 語法比較特別,要用 UrlFetchApp:
// user_id 要另外取
const msg = JSON.parse(e.postData.contents);
const user_id = msg.events[0].source.userId;
var response = UrlFetchApp.fetch("https://api.line.me/v2/bot/profile/"+user_id, {
"method": "GET",
"headers": {
"Authorization": "Bearer { 刪掉括號,放入你的 Token }",
"Content-Type": "application/json"
},
});
var namedata = JSON.parse(response); // 解析 json
var user_name = namedata.displayName; // 抓取 json 裡的 displayName
}
只要將上述的 code 放到你的程式碼中即可讓機器人讀取使用者的帳號名字,機器人也就能叫出使用者是誰了~
其他語法請參考官方文件
LINE 機器人取得群組成員名稱的方法
如果你的想開放機器人加到群組,並取得群組成員的名字,需要多從原始 json 取出 Group ID 並修改 API 網址:
const msg = JSON.parse(e.postData.contents); const groupid = msg.events[0].source.groupId; // 從原始 json 取出群組 ID // 並將 API 網址改成 https://api.line.me/v2/bot/group/" + groupid + "/member/" + user_id // 還是需要 user_id 喔
參考資料:LINE 官方文件之群組資訊說明
LINE Bot 取得使用者名字的應用
利用上文的程式碼,你可以在回覆的訊息文字中加上使用者名字的變數,讓機器人叫出對方是誰,或是可以將名稱直接紀錄到資料庫內,而不是落落長的 user_id。
像我就是用這個方法取的名字,達到紀錄名字到 Google 試算表的目的,詳情可以看這篇 LINE Bot 教學:
嗨囉我是 Shawn,首先感謝你看完全部內容!我是位大一學生,也是一間新創的前端實習生,希望跟大家分享如何運用科技提高生產力,並在網站紀錄著自己樸實無華的平凡人生。 如果對於文中內容有任何問題,或是商業合作洽詢,可在下方管道與我聯繫: e-mail: contact@jcshawn.com Telegram: jschang666