add func to copy single file

This commit is contained in:
Jack Liao 2020-07-15 15:26:25 +08:00
parent de9a6950f5
commit 3d33a10866
1 changed files with 20 additions and 9 deletions

View File

@ -4,12 +4,13 @@ const axios = require('@viegg/axios')
const HttpsProxyAgent = require('https-proxy-agent') const HttpsProxyAgent = require('https-proxy-agent')
const { db } = require('../db') const { db } = require('../db')
const { gen_count_body, validate_fid, real_copy, get_name_by_id } = require('./gd') const { gen_count_body, validate_fid, real_copy, get_name_by_id, get_info_by_id, copy_file } = require('./gd')
const { AUTH, DEFAULT_TARGET, USE_PERSONAL_AUTH, BUTTON_LEVEL } = require('../config') const { AUTH, DEFAULT_TARGET, USE_PERSONAL_AUTH } = require('../config')
const { BUTTON_LEVEL } = require('../config_mod')
const { tg_token } = AUTH const { tg_token } = AUTH
const gen_link = (fid, text) => `<a href="https://drive.google.com/drive/folders/${fid}">${text || fid}</a>` const gen_link = (fid, text) => `<a href="https://drive.google.com/drive/folders/${fid}">${text || fid}</a>`
if (!tg_token) throw new Error('請先在config.js中設定tg_token') if (!tg_token) throw new Error('请先在config.js里设置tg_token')
const { https_proxy } = process.env const { https_proxy } = process.env
const axins = axios.create(https_proxy ? { httpsAgent: new HttpsProxyAgent(https_proxy) } : {}) const axins = axios.create(https_proxy ? { httpsAgent: new HttpsProxyAgent(https_proxy) } : {})
@ -18,7 +19,7 @@ const FID_TO_NAME = {}
async function get_folder_name (fid) { async function get_folder_name (fid) {
let name = FID_TO_NAME[fid] let name = FID_TO_NAME[fid]
if (name) return name if (name) return name
name = await get_name_by_id(fid) name = await get_name_by_id(fid, !USE_PERSONAL_AUTH)
return FID_TO_NAME[fid] = name return FID_TO_NAME[fid] = name
} }
@ -244,7 +245,7 @@ async function send_task_info ({ task_id, chat_id }) {
} catch (e) { } catch (e) {
console.log('fail to send message to tg', e.message) console.log('fail to send message to tg', e.message)
} }
//get_task_info 在task目录数超大时比较吃cpu以后最好把mapping也另存一张表 // get_task_info 在task目录数超大时比较吃cpu以后如果最好把mapping也另存一张表
if (!message_id || status !== 'copying') return if (!message_id || status !== 'copying') return
const loop = setInterval(async () => { const loop = setInterval(async () => {
const url = `https://api.telegram.org/bot${tg_token}/editMessageText` const url = `https://api.telegram.org/bot${tg_token}/editMessageText`
@ -260,6 +261,14 @@ async function tg_copy ({ fid, target, chat_id, update }) { // return task_id
sm({ chat_id, text: '請輸入目的地ID或先在config.js中設定預設複製的目的地ID(DEFAULT_TARGET)' }) sm({ chat_id, text: '請輸入目的地ID或先在config.js中設定預設複製的目的地ID(DEFAULT_TARGET)' })
return return
} }
const file = await get_info_by_id(fid, !USE_PERSONAL_AUTH)
if (file && file.mimeType !== 'application/vnd.google-apps.folder') {
return copy_file(fid, target, !USE_PERSONAL_AUTH).then(data => {
sm({ chat_id, parse_mode: 'HTML', text: `單檔複製成功,位置:${gen_link(target)}` })
}).catch(e => {
sm({ chat_id, text: `單檔複製成功失敗,失敗訊息:${e.message}` })
})
}
let record = db.prepare('select id, status from task where source=? and target=?').get(fid, target) let record = db.prepare('select id, status from task where source=? and target=?').get(fid, target)
if (record) { if (record) {
@ -312,7 +321,7 @@ function reply_cb_query ({ id, data }) {
async function send_count ({ fid, chat_id, update }) { async function send_count ({ fid, chat_id, update }) {
sm({ chat_id, text: `開始獲取 ${fid} 所有檔案資訊,請稍後,建議統計完成前先不要開始複製,因为複製也需要先獲取來源資料夾資訊` }) sm({ chat_id, text: `開始獲取 ${fid} 所有檔案資訊,請稍後,建議統計完成前先不要開始複製,因为複製也需要先獲取來源資料夾資訊` })
const table = await gen_count_body({ fid, update, type: 'tg', service_account: !USE_PERSONAL_AUTH }) const table = await gen_count_body({ fid, update, type: 'tg', service_account: !USE_PERSONAL_AUTH })
if (!table) return sm({ chat_id, parse_mode: 'HTML', text: gen_link(fid) + ' 資訊獲取失敗' }) if (!table) return sm({ chat_id, parse_mode: 'HTML', text: gen_link(fid) + ' 信息获取失败' })
const url = `https://api.telegram.org/bot${tg_token}/sendMessage` const url = `https://api.telegram.org/bot${tg_token}/sendMessage`
const gd_link = `https://drive.google.com/drive/folders/${fid}` const gd_link = `https://drive.google.com/drive/folders/${fid}`
const name = await get_folder_name(fid) const name = await get_folder_name(fid)
@ -361,9 +370,11 @@ function extract_fid (text) {
if (!text.startsWith('http')) text = 'https://' + text if (!text.startsWith('http')) text = 'https://' + text
const u = new URL(text) const u = new URL(text)
if (u.pathname.includes('/folders/')) { if (u.pathname.includes('/folders/')) {
const reg = /[^/?]+$/ return u.pathname.split('/').map(v => v.trim()).filter(v => v).pop()
const match = u.pathname.match(reg) } else if (u.pathname.includes('/file/')) {
return match && match[0] const file_reg = /file\/d\/([a-zA-Z0-9_-]+)/
const file_match = u.pathname.match(file_reg)
return file_match && file_match[1]
} }
return u.searchParams.get('id') return u.searchParams.get('id')
} catch (e) { } catch (e) {