LINE 機器人取得對方名字教學

2021 LINE Bot 教學:讓 LINE 機器人知道使用者 / 群組成員的名字

在開發 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 機器人的程式碼取得使用者的名字,需要以下兩個資訊:

  1. 使用者 User ID,會包含在 LINE Messaging API 的 Receive Webhook 裡
  2. 你的 LINE API Token

而 LINE 會以 json 格回傳使用者的資訊給你,包括:

  1. 使用者的帳號名字
  2. 使用者大頭照網址
  3. 使用者的 bio 內容
  4. 使用者的偏好語言
{
  "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 試算表的目的,詳情可以看這篇文:

嗨囉我是 Shawn,首先感謝你看完全部內容!我是位澎湖高中生,也是科技編輯跟業餘 Programmer,希望教大家如何運用科技提高生產力,並紀錄著自己樸實無華的平凡人生。

如果對於文中內容有任何問題,或是商業合作洽詢,可在下方管道與我聯繫:
e-mail: [email protected]
Telegram: jschang666

留個言吧!