อยากได้ UserIds ของเพื่อนใน Line OA ทำยังไงดีนะ

Thachaparn Bunditlurdruk
incubate.co.th
Published in
4 min readOct 4, 2019

ความรู้ใหม่เปิดโลกวันนี้ ขอขอบคุณคุณ Oak Bintasan ที่ทำให้รู้ว่า Line OA เขามี API สำหรับยิงไปขอ UserId ของเพื่อน ๆ ด้วยนะ แต่ว่าวิธีนี้จะใช้ได้เฉพาะ verified accounts (โล่น้ำเงิน) กับ premium accounts (โล่เขียว) เท่านั้นค่า ใครยังเป็นโล่เทาอยู่ก็ต้องไปรอเก็บข้อมูลจาก Follow Event หรือ Join Event ก่อนนะ

วันนี้เราจะมาสอนวิธีขอ UserId โดยใช้ Postman และแจกโค้ด Google App script พร้อมวิธีการใช้ไปให้เพื่อนๆได้ลองเล่นกันค่ะ

1. ขอ UserId โดยใช้ Postman

มาดูวิธีการยิง API สำหรับขอ UserId ของ Followers ทั้งหมดของ Line OA กันดีกว่า

  1. เลือก GET เป็น method ในการยิงไปที่ https://api.line.me/v2/bot/followers/ids
  2. ใส่ Headers ไปบอกเซิร์ฟเวอร์ว่าเรากำลังขอ UserIds ของบัญชีไหน โดยเราต้องกำหนด Authorization โดยการใส่ Channel Access Token ของบัญชีนั้นลงไปตรงกรอบเลข 3 หลังคำว่า Bearer เพื่อให้ Line สามารถเข้ามาดึงข้อมูลให้เราได้ แล้วก็ต้องบอกประเภทของข้อมูลที่จะส่ง (Content-Type) ให้เป็น application/json ด้วยนะ

สามารถดูวิธีการดึง Channel Access Token ได้ที่บทความ “Channel Access Token ของ Line เอามาจากที่ไหนได้บ้างเนี่ย” ได้เลยค่ะ

พอกด Send ก็จะได้ Response หน้าตาแบบนี้ออกมา

แต่ว่าถ้า Line OA ไหนมีเพื่อนเยอะ มันก็จะส่ง key ที่มีชื่อว่า “next” ออกมาด้วย เพื่อให้เราเอาค่าของ next ไปใส่เป็นค่าของพารามิเตอร์ที่ชื่อว่า start ในช่อง Params ไว้ให้เราไปขอ request ต่อแบบรูปด้านล่างได้เรื่อย ๆ จนกว่า UserIds จะแสดงครบ

ถ้ามีเพื่อนเยอะมาก ๆ แล้วต้องมานั่งกด Send หลาย ๆ รอบ ๆก็คงจะนิ้วล็อคกันพอดี มาลองเล่น Google App script กันดีกว่า

2. Google App script สำหรับการดึง Line User Profiles

  • เปิด Google Spreadsheet ขึ้นมา แล้วเลือก Tool ที่แถบเมนูด้านบน จากนั้นกดที่ Script editor
  • นำโค๊ดในกล่องสีเทาด้านล่างไปแปะตามรูปนี้ จากนั้นก็กด Save
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('LINE')
.addItem('get Friend\'s Profiles', 'getFriends')
.addToUi();
}
function getFriends() {
var ui = SpreadsheetApp.getUi();
var response = ui.prompt('Channel Access Token >', ui.ButtonSet.OK_CANCEL);
if (response.getSelectedButton() == ui.Button.OK) {
getFriendsFromLINE(response.getResponseText());
} else if (response.getSelectedButton() == ui.Button.CANCEL) {
} else {
}
}
function getFriendsFromLINE(token){
// Make a GET request and log the returned content.
var options={headers:{
"Content-Type": "application/json",
"Authorization": "Bearer "+token
}};
var url='https://api.line.me/v2/bot/followers/ids';
var response = UrlFetchApp.fetch(url,options);
var json = JSON.parse(response.getContentText());
var allData = [];
var results;
var jsons;
var requests;
Logger.log(json);
while ('next' in json){
requests=json.userIds.map(function(id){
return {
url:'https://api.line.me/v2/bot/profile/'+id,
headers:options.headers
}
});
requests.push({
url:url+'?start='+json.next,
headers:options.headers
});
results = UrlFetchApp.fetchAll(requests);
jsons = results.map(function(result){
return JSON.parse(result.getContentText());
});
Logger.log(jsons);
json=jsons.pop();
allData=allData.concat(jsons);
}
requests=json.userIds.map(function(id){
return {
url:'https://api.line.me/v2/bot/profile/'+id,
headers:options.headers
}
});
results = UrlFetchApp.fetchAll(requests);
jsons = results.map(function(result){
return JSON.parse(result.getContentText());
});
allData=allData.concat(jsons);
var data = allData.map(function(item){
return [
item.userId,
('displayName' in item)?item.displayName:'',
('pictureUrl' in item)?item.pictureUrl:'',
('statusMessage' in item)?item.statusMessage:''
];
});
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange(1,1,data.length,4).setValues(data);
}
  • กดปุ่ม Trigger ในหน้า Script Editor จากนั้นจะมีหน้าต่าง G Suite Developer Hub ขึ้นมาให้เรากดปุ่ม Add Trigger ที่อยู่ด้านล่างขวา
  • พอเรากดปุ่ม Add Trigger ปุ๊ป ก็จะมีกล่องข้อความเด้งขึ้นมาสำหรับตั้งค่า Trigger ให้เราตั้งค่าตามกรอบแดงที่ 1 ในรูปด้านล่างเลย ส่วน Failure notification settings ในกรอบที่ 2 สามารถตั้งค่าเวลาที่จะให้แจ้งเตือน error ว่า Script ของเรามีปัญหาหรือป่าวก็เลือกเวลากันตามสะดวกได้เลย
  • หลังจากกด Save จะมีหน้าต่างให้ขอ access ผ่านอีเมล์ก็กดยืนยันไปเรื่อย ๆ ถ้ามีหน้าต่าง Warning ขึ้นมาให้คลิกที่ลิ้งก์ซ้ายล่างที่เขียนว่า Advanced แล้วกดลิ้งก์ที่เขียนว่า Go to LINE Friends Profiles (unsafe) เพื่อจะไปยังหน้าถัดไป
  • หลังจากทำการขออนุญาตเสร็จจะได้ Trigger ขึ้นมา 1 ตัวในหน้า G Suite Hub ซึ่งเจ้าตัวนี้แหละที่เอาไว้เรียก LINE Messaging API ผ่านแถบเมนู LINE บน Google Spreadsheet
  • ใกล้จะถึงความจริงแล้วทุกคน หลังจากสร้าง Trigger สำเร็จให้กลับไป Refresh หน้า Google Spreadsheet ที่เราเปิดไว้ เราก็จะเห็นแถบเมนูอันใหม่ที่ชื่อว่า LINE ขึ้นมา พอคลิกไปที่เมนู LINE ก็จะมีฟังก์ชั่น get Friend’s Profiles ขึ้นมาพร้อมให้เราใช้งานแล้ว
  • ส่วนวิธีใช้ก็ไม่ยากเลย เพียงใส่ Channel Access Token เจ้าเก่าลงไป แล้วกด Ok ก็จะได้ UserId, ชื่อผู้ใช้, ลิ้งก์รูป Profile, และ Status ออกมาอย่างสวยงาม

ข้อควรระวัง

ในการกดรัน App Script ตัวนี้ 1 ครั้ง จะมีการส่ง URL Fetch calls ดังนี้
— 1 ครั้งสำหรับไปเก็บ UserID จำนวน 300 คนตามลิมิตของ LINE
—ส่งไปรับข้อมูล Display Name, Picture url, Status อีก 1 ครั้งต่อ UserID 1 คน

ดังนั้น ในการที่จะได้ข้อมูลของเพื่อน 300 คน จะต้องส่ง URL Fetch calls เป็นจำนวน 301 ครั้ง

(จำนวน UserId/300)+ จำนวน UserID

  • ประเด็นอยู่ตรงที่ Google App Script มีข้อจำกัดให้เราใช้ URL Fetch calls ได้เพียง 20,000 ครั้งต่อวันสำหรับ User ที่ใช้ gmail ธรรมดา ดังนั้นเราจะสามารถยิงไปเก็บข้อมูลเพื่อนในไลน์ได้ 19,933 คนเท่านั้น แต่ถ้าใครมีบัญชีของ Google เป็นแบบ Enterprise และสถาบันการศึกษาจะสามารถยิงได้ 100,000 ครั้งต่อวันเลย
https://developers.google.com/apps-script/guides/services/quotas
  • นอกจากนี้ยังมีข้อจำกัดเรื่องเวลาในการรัน App Script ด้วย สำหรับ User ที่ใช้ gmail ธรรมดาจะต้องกดรันให้โค๊ดทำงานเสร็จจนได้ข้อมูลมาภายใน 6 นาที ส่วน User ที่เป็น Enterprise และสถาบันการศึกษาจะมีเวลาให้ 30 นาที ยิ่งจำนวนเพื่อนเยอะ ก็จะใช้เวลาในการรันนานนะ
https://developers.google.com/apps-script/guides/services/quotas

ถ้า URL Fetch Calls หรือ Script runtime เกินจากที่กำหนด โค๊ดนี้จะไม่สามารถคืน UserID กลับมาให้ได้เลย แต่ถ้าใครมีความรู้เกี่ยวกับ Javascript ก็ลองนำโค๊ดไปปรับเล่นดูนะคะ หรือถ้าใครเจอ bug ตรงไหนก็มาคุยกันได้นะคะ

สวัสดีวันศุกร์ทุกคนน Happy Friday ~~~

--

--

Thachaparn Bunditlurdruk
incubate.co.th

An Arts graduate who’s trying to challenge herself with programming