在開發 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