แก้ปัญหาไฟล์หมดอายุใน LINE ด้วยบอทเก็บไฟล์อัตโนมัติไปยัง Google Drive

หลายคนที่ใช้ LINE ในการสื่อสารอาจเคยเจอปัญหาไฟล์ที่ส่งผ่าน LINE หมดอายุ ซึ่งทำให้ไม่สามารถดาวน์โหลดไฟล์ได้เมื่อต้องการใช้งานในภายหลัง ปัญหานี้สร้างความยุ่งยากในการทำงานและจัดเก็บข้อมูลสำคัญได้อย่างมาก โดยเฉพาะในองค์กรที่ต้องพึ่งพาไฟล์เหล่านี้ในการทำงานร่วมกัน
บทความนี้จะแนะนำวิธีแก้ปัญหาด้วยการสร้างบอท LINE ที่จะช่วยจัดเก็บไฟล์ที่ส่งผ่าน LINE ไปยัง Google Drive โดยอัตโนมัติ ทำให้ไฟล์สำคัญถูกจัดเก็บไว้อย่างปลอดภัย ไม่ต้องกังวลว่าไฟล์จะหมดอายุ การใช้บอทนี้ไม่เพียงแค่แก้ปัญหาไฟล์หมดอายุ แต่ยังช่วยเพิ่มความสะดวกและประสิทธิภาพในการจัดเก็บข้อมูลในองค์กร ทำให้คุณไม่พลาดข้อมูลสำคัญที่เกี่ยวข้องกับงานหรือโปรเจกต์ต่าง ๆ
ในบทความนี้ต้องขอขอบคุณ Noppasit Trisittiwat ที่ได้ทำบทความดีๆแบบนี้ ซึ่งผมก็หยิบยกเอาตัวอย่างโค้ดที่เขาได้ทำไว้มาเรียบเรียงใหม่ สามารถเข้าไปดูเนื้อหาต้นฉบับได้ที่นี่ การเชื่อมโยง LINE กับ Google Drive เพื่อแก้ปัญหาการจัดเก็บไฟล์ที่มีวันหมดอายุ

ก่อนที่จะเริ่มพัฒนาการเชื่อมต่อ LINE กับ Google Drive เพื่อจัดเก็บไฟล์โดยอัตโนมัติ มีขั้นตอนที่จำเป็นต้องเตรียมล่วงหน้าเพื่อให้กระบวนการดำเนินไปอย่างราบรื่นและมีประสิทธิภาพ ดังนี้
1.เข้าไปที่ LINE Official Account (OA)
- สร้าง Channel ใน LINE Developers Console และเปิดการใช้งาน Message API
- ออก Channel Access Token จากระบบ LINE เพื่อใช้ในการเชื่อมต่อ

กด เข้าสู่ระบบด้วยบัญชี LINE

สามารถเข้าสู่ระบบได้ 2 วิธี
1.เข้าสู่ระบบด้วยอีเมล
2.เข้าสู่ระบบด้วยคิวอาร์โค้ด

เข้าไปที่ App LINE บนมือถือจากนั้นกรอกรหัสยืนยันตัวตน

ในหน้า Create a new channel ตั้งค่าตามนี้ได้เลย
- Channel type : Messaging API
- Provider : Create a new provider
- ตั้งชื่อ provider (ภาษาไทย หรืออังกฤษก็ได้)
- Company or owner’s country or region : Thailand
- Channel icon : เลือกรูปไอคอน
- Channel name : ตั้งชื่อ Channel name (ภาษาไทย หรืออังกฤษก็ได้)
- Channel description : ระบุรายละเอียด
- Category : เลือกหมวดหมู่
- Subcategory : เลือกหมวดหมู่รอง
- Email address : ใส่อีเมล
- ตี๊กถูกทั้ง 3 ข้อ
- กด Create



จะมี popup เด้งมา ให้กด OK

ถ้ามี ข้อตกลงเกี่ยวกับการใช้ข้อมูล เด้งมาให้กด Agree

กดที่แท็บ Messaging API

เลื่อนลงมาล่างสุด มองหา Channel access token กดไปที่ Issue

หลังจากกด Issue แล้ว จะได้ Channel access token (key นี้สำคัญมาก อย่าให้ใครมั่วๆนะ)

2.เตรียม Google App Script
- สร้าง Script บน Google App Script เพื่อใช้ในการดำเนินการระหว่าง LINE กับ Google Drive
กดที่ Start Scripting

กดที่ +โครงการใหม่

- ตั้งชื่อโครงการ (ตั้งว่า “บอทเก็บไฟล์” ก็ได้)
- ลบฟังชั่นที่มีอยู่ออกก่อน

จากนั้น Copy โค้ดนี้ไปวางได้เลย
var CHANNEL_TOKEN = "Channel access token";
var GDRIVE_FOLDER_FILE_ID = "ไอดีโฟลเดอร์ไฟล์";
var GDRIVE_FOLDER_IMAGE_ID = "ไอดีโฟลเดอร์รูป";
var GDRIVE_FOLDER_VIDEO_ID = "ไอดีโฟลเดอร์วิดีโอ";
var GDRIVE_FOLDER_AUDIO_ID = "ไอดีโฟลเดอร์เสียง";
function doPost(e) {
var value = JSON.parse(e.postData.contents);
var event = value.events[0];
var type = event.type;
var replyToken = event.replyToken;
var userId = event.source.userId;
var userProfile = getUserProfile(userId);
var displayName = userProfile.displayName;
switch (type) {
case 'message':
var messageType = event.message.type;
if (messageType == 'file') {
var replyMessage = handleFileMessage(event,displayName);
} else if (messageType == 'image') {
var replyMessage = [{
'type': 'text',
'text': '🖼️ ไฟล์รูปภาพ 🖼️' +
'\n\nลิงก์ Google Drive :\n' + toDrive(event.message.id, "image/jpeg", ".jpg", GDRIVE_FOLDER_IMAGE_ID) +
'\n\nอัปโหลดโดย : ' + displayName
}];
} else if (messageType == 'video') {
var replyMessage = [{
'type': 'text',
'text': '🎞️ ไฟล์วิดีโอ 🎞️' +
'\n\nลิงก์ Google Drive :\n' + toDrive(event.message.id, "video/mp4", ".mp4", GDRIVE_FOLDER_VIDEO_ID) +
'\n\nอัปโหลดโดย : ' + displayName
}];
} else if (messageType == 'audio') {
var replyMessage = [{
'type': 'text',
'text': '🔊 ไฟล์เสียง 🔊' +
'\n\nลิงก์ Google Drive :\n' + toDrive(event.message.id, "audio/mpeg", ".mp3", GDRIVE_FOLDER_AUDIO_ID) +
'\n\nอัปโหลดโดย : ' + displayName
}];
}
if (replyMessage) {
replyMsg(replyToken, replyMessage);
}
break;
default:
break;
}
}
function handleFileMessage(event,displayName) {
var fileName = event.message.fileName;
var fileType = fileName.split('.').pop(); // ดึงนามสกุลไฟล์
var fileN = fileName.substring(0, fileName.lastIndexOf('.')); // ดึงชื่อไฟล์โดยไม่รวมนามสกุล
var mimetype = getMimeType(fileType);
if (mimetype !== "undefined") {
var messageId = event.message.id;
var url = "https://api-data.line.me/v2/bot/message/" + messageId + "/content";
var headers = {
"headers": { "Authorization": "Bearer " + CHANNEL_TOKEN }
};
try {
var getcontent = UrlFetchApp.fetch(url, headers);
var blob = getcontent.getBlob();
var fileBlob = Utilities.newBlob(blob.getBytes(), mimetype, fileName);
var fileId = DriveApp.getFolderById(GDRIVE_FOLDER_FILE_ID).createFile(fileBlob).getId();
var replyMessage = [
{ 'type': 'text', 'text': '📂 ชื่อไฟล์: ' + fileName + '\n\nลิงก์ Google Drive:\nhttps://drive.google.com/file/d/' + fileId + '/view'+'\n\nอัปโหลดโดย : '+ displayName }
];
} catch (error) {
Logger.log("Error uploading to Google Drive: " + error);
var replyMessage = [{ 'type': 'text', 'text': 'Error uploading the file.' }];
}
} else {
var replyMessage = [{ 'type': 'text', 'text': 'ไม่รองรับไฟล์ประเภทนี้' }];
}
return replyMessage;
}
function getMimeType(fileType) {
var mimeTypes = {
"pdf": "application/pdf",
"zip": "application/zip",
"rar": "application/vnd.rar",
"7z": "application/x-7z-compressed",
"doc": "application/msword",
"xls": "application/vnd.ms-excel",
"ppt": "application/vnd.ms-powerpoint",
"docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"mp4": "video/mp4",
"mp3": "audio/mpeg",
"png": "image/png",
"gif": "image/gif",
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
// Add more mime types as needed
};
return mimeTypes[fileType] || "undefined";
}
function replyMsg(replyToken, messages) {
var url = 'https://api.line.me/v2/bot/message/reply';
var options = {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': messages
})
};
UrlFetchApp.fetch(url, options);
}
function toDrive(messageId, meType, mType, gdriveId) {
var url = "https://api-data.line.me/v2/bot/message/" + messageId + "/content";
var headers = {
"headers": { "Authorization": "Bearer " + CHANNEL_TOKEN }
};
try {
var getcontent = UrlFetchApp.fetch(url, headers);
var blob = getcontent.getBlob();
var fileBlob = Utilities.newBlob(blob.getBytes(), meType, messageId + mType);
var fileId = DriveApp.getFolderById(gdriveId).createFile(fileBlob).getId();
return 'https://drive.google.com/uc?id=' + fileId;
} catch (error) {
Logger.log("Error uploading to Google Drive: " + error);
return null;
}
}
function getUserProfile(userId) {
var url = "https://api.line.me/v2/bot/profile/" + userId;
var headers = {
"Authorization": "Bearer " + CHANNEL_TOKEN
};
var options = {
"method": "get",
"headers": headers
};
var response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText());
}

โค้ดบนสุดที่เราต้องนำค่าต่างๆมาใส่
var CHANNEL_TOKEN = "Channel access token";
var GDRIVE_FOLDER_FILE_ID = "ไอดีโฟลเดอร์ไฟล์";
var GDRIVE_FOLDER_IMAGE_ID = "ไอดีโฟลเดอร์รูป";
var GDRIVE_FOLDER_VIDEO_ID = "ไอดีโฟลเดอร์วิดีโอ";
var GDRIVE_FOLDER_AUDIO_ID = "ไอดีโฟลเดอร์เสียง";
ไปคัดลอก Channel access token จาก LINE Developer มาใส่ CHANNEL_TOKEN

นำมาใส่แบบนี้

สร้างโฟลเดอร์ใน Google Drive โดยแยกแฟ้มตามประเภทของไฟล์ ดังนี้
- ไฟล์ต่างๆ
- รูปภาพ
- วิดีโอ
- เสียง

กดเข้าไปที่ โฟลเดอร์ที่สร้าง เพื่อเอาไอดี

นำไอดีมาใส่ในโค้ดแยกตามประเภทของโฟลเดอร์
var GDRIVE_FOLDER_FILE_ID = "14Fl7aVUSdKPp2qSH7-_J_cIPxe2wlxO4"; //ไอดีจากโฟลเดอร์ "ไฟล์ต่างๆ"
var GDRIVE_FOLDER_IMAGE_ID = "1jWEPNTigJdq8TN1v8XErt7nMCAf19HqA"; //ไอดีจากโฟลเดอร์ "รูปภาพ"
var GDRIVE_FOLDER_VIDEO_ID = "1uEPfHusIW83s_MsiuHo6WfoN8-0Ars68"; //ไอดีจากโฟลเดอร์ "วิดีโอ"
var GDRIVE_FOLDER_AUDIO_ID = "1KTWlzswQsscRcdMhQ4gv4de4r10N7Pou"; //ไอดีจากโฟลเดอร์ "เสียง"
จะได้แบบนี้

เมื่อใส่ครบหมดทุกอย่างแล้ว ทีนี้เราจะมาทดสอบกัน โดยกดปุ่ม “การทำให้ใช้งานได้” แล้วเลือก การทำให้ใช้งานได้รายการใหม่

กดที่ ไอคอนฟันเฟือง และเลือก เว็บแอป

ใส่คำอธิบายใหม่ (หรือจะไม่ใส่ก็ได้)
ดำเนินการในฐานะ เลือก ฉัน…
ผู้มีสิทธิ์เข้าถึง เลือก ทุกคน
จากนั้นกด “การทำให้ใช้งานได้”

กดให้สิทธิ์เข้าถึง

จะมีหน้า login เด้งมา ให้เลือก บัญชีที่เราจะใช้เก็บไฟล์ (บัญชีที่เราสร้างโฟลเดอร์นั้นแหละ)

จะพบกับการแจ้งเตือนความปลอดภัยว่า
Google ยังไม่ได้ตรวจสอบแอปนี้ แอปกำลังร้องขอการเข้าถึงข้อมูลที่ละเอียดอ่อนในบัญชี Google ของคุณ จนกว่าผู้พัฒนา จะยืนยันแอปนี้กับ Google คุณไม่ควรใช้แอปนี้ ซึ่งก็ไม่ต้องตกใจ เพราะแอปนี้ก็เป็นแอปของเราเองนั้นแหละ ให้กดตามถาพได้เลย
กด Advanced กด Go to บอทเก็บไฟล์ (unsafe)
Script ที่เราสร้างจะขอสิทธิ์การเข้าถึงการจัดการ Google Drive ให้กด Allow

จากนั้นให้กด คัดลอก URL ของเว็ปแอป

หลังจากคัดลอกแล้วให้ไปที่ LINE Developer ในแท็บ Messaging API เลื่อนลงมาที่หัวข้อ Webhook URL กดที่ Edit วาง URL ที่คัดลอกมา จากนั้น กด Update

จะมีเมนูเพิ่มขึ้นมา Use webhook ให้กดเปิดใช้งาน

ทดสอบ Webhook ว่าใช้งานได้หรือไม่ โดยกดที่ปุ่ม Verify ถ้ามีข้อความเด้งมาว่า Success แสดงว่าใช้งานได้
ในกรณีที่ไม่ขึ้นคำว่า Success อาจลองตรวจสอบที่เมล ลองกดเข้าไปดูการแจ้งเตือนความปลอดภัย > ตรวจสอบกิจกรรม > จำได้ ฉันทำกิจกรรมนั้นเอง แล้วกลับไปกด verify อีกรอบ

ถ้ากดแล้วยังไม่มี Success เด้งมา ให้กกลับไปที่ Google App Script แล้วลองกด เรียกใช้ จากนั้นกลับไปกด verify อีกรอบ
**หมายเหตุ ตอนกด เรียกใช้ อาจจะมีหน้าต่างเด้งมาขอสิทธิ์การเข้าถึงอีกรอบ ก็ให้กด อนุญาต อีกรอบ

ถ้าทุกอย่างผ่านแล้ว (ตอนกด Verify มีข้อความเด้งมาว่า Success แสดงว่าผ่าน) ถัดไปเราจะไป ปิดการตอบกลับอัตโนมัติ เลื่อนหา Auto-reply messages กดไปที่ Edit

ในส่วนของ ข้อความตอบกลับอัตโนมัติ ให้ปิดไป

ทีนี้มาถึงขั้นตอนที่สำคัญให้แอดไลน์ บอทเก็บไฟล์ ที่เราสร้างและลองส่งรูป ไฟล์ วิดีโอ และเสียง เพื่อทดสอบ

ลองส่งไฟล์รูป

แต่ปัญหาคือถ้าเราแชทกับไฟล์บอทตรงๆเลย มันจะส่งได้แค่รูปภาพ ถ้าอยากส่งไฟล์อื่นๆ แนะนำให้สร้างกลุ่ม แล้วดึงไลน์บอทเข้าไปด้วย แต่ว่าต้องไปตั้งค่าที่ LINE Developer ในหัวข้อ Allow bot to join group chats กดที่ Edit

ในส่วนของ การใช้ฟีเจอร์ กดที่ อนุญาตให้เข้าร่วมกลุ่มหรือแชทแบบหลายคน

สร้างกลุ่มแล้วดึงไลน์บอทเข้ามา

ทดสอบการอัปไฟล์
ต้องให้เพื่อนแอดไลน์บอทก่อนนะ หลังจากนั้นค่อยเข้ากลุ่มจึงจะสามารถใช้ได้
จะมีชื่อบอกในไลน์ด้วยว่าไฟล์นี้อัปโหลดโดยใคร

ใน Google ของเราก็จะมีไฟล์ที่อัปจากไลน์
ที่นี้ทุกคนก็จะหมดปัญหาเรื่องไฟล์หมดอายุในไลน์แล้ว ลองเอาไปปรับใช้กันดูได้นะครับ