migrate-lsw/read-google-drive.js

143 lines
5.4 KiB
JavaScript

const API_KEY = 'AIzaSyAobSJ6RDkfIj6oUNYhvRjygkAODzQocyg';
const DEFAULT_FOLDER_ID = '1Q6LJW_3YarYcUUvUPKqfH7DqPDuJ-8ra'; // รหัสที่อยู่หลัง /folders/ ใน URL
const UPLOAD_TO = 'https://web-lsw-dev.nueamek.app/api/upload-file';
const { google } = require('googleapis');
const fs = require('fs');
// 1. ระบุ path ของไฟล์ JSON ที่คุณโหลดมา
const KEYFILEPATH = 'lsw-website-484309-6a86a07bc9d5.json';
// 2. กำหนดสิทธิ์ (Scopes) - ในที่นี้คืออ่านไฟล์ใน Drive
const SCOPES = ['https://www.googleapis.com/auth/drive.readonly'];
// 3. สร้างตัวตน (Auth Client)
const auth = new google.auth.GoogleAuth({
keyFile: KEYFILEPATH,
scopes: SCOPES,
});
async function listFiles(deep = 0,folderId = undefined, folderName = '') {
// https://www.googleapis.com/drive/v3/files
const url = `https://www.googleapis.com/drive/v3/files?q='${folderId ?? DEFAULT_FOLDER_ID}'+in+parents&key=${API_KEY}`;
let files = []
try {
const response = await fetch(url);
const data = await response.json();
if (data.files && data.files.length > 0) {
let forTest = data.files
if(deep == 0){
forTest = data.files.slice(0, 1)
}
data.files.forEach(async file => {
// console.log(file);
console.log(`ชื่อไฟล์: ${file.name}, ID: ${file.id}`);
if(file.mimeType.includes('folder')){
const fileResultList = await listFiles(deep+1, file.id, file.name)
const onlyHaveUrlList = fileResultList.filter(fileResult => fileResult.url)
files.push(...onlyHaveUrlList)
}
else if(file.mimeType.includes('image/jpeg')){
const fileResult = await downloadAndUpload(file.id, file.name)
if(fileResult.url){
files.push(fileResult)
}
}
});
} else {
console.log('ไม่พบไฟล์ในโฟลเดอร์นี้');
}
} catch (error) {
console.error('เกิดข้อผิดพลาด:', error);
}
if(deep == 1 && folderName){
const payload = {
menuId: 402,
templateId: 2,
tag: 2,
title: folderName,
content: '',
startAt: "2026-01-14",
filedoc: null,
imageList: files,
}
}
return files
}
async function downloadAndUpload(fileId, fileName) {
try {
// #region วิธีที่ง่ายแต่ access มากไปจะโดน google block เพราะคิดว่าเป็น bot
// // 1. ดาวน์โหลดเนื้อหาไฟล์จาก Google Drive (ใช้ alt=media)
// const downloadUrl = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media&key=${API_KEY}`;
// const response = await fetch(downloadUrl);
// console.log('response', response)
// if (!response.ok) {
// // อ่านรายละเอียด Error จาก Google
// const errorText = await response.text();
// console.error("Error Detail:", errorText);
// throw new Error('Download failed');
// }
// const fileBlob = await response.blob();
// // 2. สร้าง FormData เพื่อเตรียมส่งไปยัง API ของคุณ
// const formData = new FormData();
// // 'file' คือชื่อ field ที่ API ของคุณรอรับ (เปลี่ยนได้ตามความเหมาะสม)
// formData.append('file', fileBlob, fileName);
// #endregion
// #region Service Account
const drive = google.drive({ version: 'v3', auth });
// 1. การดึงเนื้อหาไฟล์ (Media)
const res = await drive.files.get(
{ fileId: fileId, alt: 'media' },
// { responseType: 'stream' }
{ responseType: 'arraybuffer' }
);
// คุณสามารถส่ง res.data นี้เข้า FormData เพื่อส่งต่อไปยัง API ของคุณได้เลย
// 2. สร้าง FormData เพื่อเตรียมส่งไปยัง API ของคุณ
// แปลง ArrayBuffer ที่ได้เป็น Blob
const fileBlob = new Blob([res.data]);
const formData = new FormData();
formData.append('file', fileBlob, fileName);
// #endregion
// 3. ส่งข้อมูลไปยัง API ของคุณด้วย POST method
const uploadResponse = await fetch(UPLOAD_TO, {
method: 'POST',
body: formData
});
const result = await uploadResponse.json();
// console.log(`อัปโหลดไฟล์ ${fileName} สำเร็จ:`, result);
return result
} catch (error) {
console.error(`เกิดข้อผิดพลาดกับไฟล์ ${fileName}:`, error);
return {
error: error
}
}
}
// // ตัวอย่างการใช้งานร่วมกับรายชื่อไฟล์ที่ได้จากข้อก่อนหน้า
// async function processAllFiles(files) {
// for (const file of files) {
// // กรองเอาเฉพาะไฟล์ .js (ถ้าจำเป็น)
// if (file.name.endsWith('.js')) {
// await downloadAndUpload(file.id, file.name);
// }
// }
// }
// downloadAndUpload('14SGY4irPJ1FwUA5472zlyYtzHvDNaCQ4', 'test')
listFiles();