Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
371b4d6
Update tg.js
liaojack8 Jul 7, 2020
87eadcc
Update tg.js
liaojack8 Jul 7, 2020
9e85cfa
setInterval only if in pm2
liaojack8 Jul 7, 2020
cb101b6
close db when exit process
liaojack8 Jul 7, 2020
5c9f0a3
add back-db.js
liaojack8 Jul 7, 2020
fc47b77
add back-db.js, add backup file in gitignore
liaojack8 Jul 7, 2020
5d1fac2
./dedupe help
liaojack8 Jul 7, 2020
8ff4fbc
translate to cht.
liaojack8 Jul 7, 2020
ebeda6c
update w/ iwestlin -7dd7998
liaojack8 Jul 8, 2020
b12caaa
Delete .DS_Store
liaojack8 Jul 8, 2020
8c000fc
fix the problem folder name 'undefine'
liaojack8 Jul 9, 2020
0e599c2
typo
liaojack8 Jul 9, 2020
d3f1734
typo
liaojack8 Jul 9, 2020
c8cc23b
translate validate-sa.js
liaojack8 Jul 15, 2020
29f23d5
add tree.js
liaojack8 Jul 15, 2020
2bb7b1a
update gd.js
liaojack8 Jul 15, 2020
de9a695
update router.js, consider more than 1 whitespaces in bot cmd
liaojack8 Jul 15, 2020
3d33a10
add func to copy single file
liaojack8 Jul 15, 2020
60b494a
update readme
liaojack8 Jul 15, 2020
2427168
Update readme.md
liaojack8 Jul 16, 2020
9c83275
Update tg.js
liaojack8 Jul 16, 2020
d41aa2d
Update tg.js
liaojack8 Jul 16, 2020
10c5909
update readme w/ demo video
liaojack8 Jul 16, 2020
6dad590
typo
liaojack8 Jul 16, 2020
41d5083
add install script for cloud flare
liaojack8 Jul 21, 2020
a131529
update readme≈
liaojack8 Jul 30, 2020
134a79f
just update
liaojack8 Jul 30, 2020
6cd85e2
fix sequence of button
liaojack8 Jul 30, 2020
b7957f5
update readme.me
liaojack8 Jul 30, 2020
3fe80f3
update readme
liaojack8 Mar 29, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
node_modules/
gdurl.sqlite
gdurl.sqlite*
config.js
sa/*.json
backup/*.sqlite
14 changes: 14 additions & 0 deletions backup-db.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env node

const path = require('path')
const {db} = require('./db')

const filepath = path.join(__dirname, 'backup', `${Date.now()}.sqlite`)

db.backup(filepath)
.then(() => {
console.log(filepath)
})
.catch((err) => {
console.log('backup failed:', err)
})
Empty file added backup/.keep
Empty file.
28 changes: 28 additions & 0 deletions bookmark.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const fs = require('fs')
const {db} = require('./db')

const action = process.argv[2] || 'export'
const filepath = process.argv[3] || 'bookmarks.json'

if (action === 'export') {
const bookmarks = db.prepare('select * from bookmark').all()
fs.writeFileSync(filepath, JSON.stringify(bookmarks))
console.log('bookmarks exported', filepath)
} else if (action === 'import') {
let bookmarks = fs.readFileSync(filepath, 'utf8')
bookmarks = JSON.parse(bookmarks)
bookmarks.forEach(v => {
const {alias, target} = v
const exist = db.prepare('select alias from bookmark where alias=?').get(alias)
if (exist) {
db.prepare('update bookmark set target=? where alias=?').run(target, alias)
} else {
db.prepare('INSERT INTO bookmark (alias, target) VALUES (?, ?)').run(alias, target)
}
})
console.log('bookmarks imported', bookmarks)
} else {
console.log('[help info]')
console.log('export: node bookmark.js export bm.json')
console.log('import: node bookmark.js import bm.json')
}
8 changes: 8 additions & 0 deletions clear-db.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const { db } = require('./db')

const record = db.prepare('select count(*) as c from gd').get()
db.prepare('delete from gd').run()
console.log('已刪除', record.c, '項資料')

db.exec('vacuum')
db.close()
25 changes: 11 additions & 14 deletions config.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,24 @@
// 单次请求多少毫秒未响应以后超时(基准值,若连续超时则下次调整为上次的2倍
// 單次請求多少毫秒無回應以後超時(基準值,若連續超時則下次調整為上次的2倍
const TIMEOUT_BASE = 7000
// 最大超时设置,比如某次请求,第一次7s超时,第二次14s,第三次28s,第四次56s,第五次不是112s而是60s,后续同理
// 最大超時設置,比如某次請求,第一次7s超時,第二次14s,第三次28s,第四次56s,第五次不是112s而是60s,後續同理
const TIMEOUT_MAX = 60000

const LOG_DELAY = 5000 // 日志输出时间间隔,单位毫秒
const PAGE_SIZE = 1000 // 每次网络请求读取目录下的文件数,数值越大,越有可能超时,不得超过1000
const LOG_DELAY = 5000 // 日志輸出時間間隔,單位毫秒
const PAGE_SIZE = 1000 // 每次網絡請求讀取目錄下的文件數,數值越大,越有可能超時,不得超過1000

const RETRY_LIMIT = 7 // 如果某次请求失败,允许其重试的最大次数
const PARALLEL_LIMIT = 20 // 网络请求的并行数量,可根据网络环境调整
const RETRY_LIMIT = 7 // 如果某次請求失敗,允許其重試的最大次數
const PARALLEL_LIMIT = 20 // 網絡請求的並行數量,可根據網絡環境調整(即多線程之線程數量)

const DEFAULT_TARGET = '' // 必填,拷贝默认目的地ID,如果不指定target,则会复制到此处,建议填写团队盘ID
const DEFAULT_TARGET = '' // 必填,copy時預設的dstID,建議填寫小組雲端硬碟ID

const AUTH = { // 如果您拥有service account的json授权文件,可将其拷贝至 sa 目录中以代替 client_id/secret/refrest_token
const AUTH = { // 如果您擁有SA的json授權文件,可將其拷貝至 sa 目錄中以代替 client_id/secret/refrest_token 這裡建議使用自己的client_id, 具體參考說明文件#個人帳號配置
client_id: 'your_client_id',
client_secret: 'your_client_secret',
refresh_token: 'your_refrest_token',
expires: 0, // 可以留空
access_token: '', // 可以留空
tg_token: 'bot_token', // 你的 telegram robot 的 token,获取方法参见 https://core.telegram.org/bots#6-botfather
tg_whitelist: ['your_tg_username'] // 你的tg username(t.me/username),bot只会执行这个列表里的用户所发送的指令
tg_token: 'bot_token', // 你的 telegram robot 的 token,獲取方法參見 https://core.telegram.org/bots#6-botfather
tg_whitelist: ['your_tg_username'] // 你的tg username(t.me/username),bot只會執行這個列表中的用戶所發送的指令
}

//-------------------MOD-------------------
const SA_PATH = '../sa' //sa路徑配置, 給定絕對路徑或是以src為當前路徑給定相對路徑, 預設為'../sa'
const BUTTON_LEVEL = 1 //預設為1, 填入大於2皆視為2
module.exports = { AUTH, PARALLEL_LIMIT, RETRY_LIMIT, TIMEOUT_BASE, TIMEOUT_MAX, LOG_DELAY, PAGE_SIZE, DEFAULT_TARGET, SA_PATH, BUTTON_LEVEL }
module.exports = { AUTH, PARALLEL_LIMIT, RETRY_LIMIT, TIMEOUT_BASE, TIMEOUT_MAX, LOG_DELAY, PAGE_SIZE, DEFAULT_TARGET }
5 changes: 5 additions & 0 deletions config_mod.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
//-------------------MOD-------------------
const SA_PATH = '../sa' //sa路徑配置, 給定絕對路徑或是以src為當前路徑給定相對路徑, 預設為'../sa'
const BUTTON_LEVEL = 1 //預設為1, 填入大於2皆視為2

module.exports = { SA_PATH, BUTTON_LEVEL }
24 changes: 13 additions & 11 deletions copy
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@ const bytes = require('bytes')
const { argv } = require('yargs')
.usage('用法: ./$0 <source id> <target id> [options]\ntarget id可选,不填则使用config.js里的DEFAULT_TARGET')
.alias('u', 'update')
.describe('u', '不使用本地缓存,强制从线上获取源文件夹信息')
.describe('u', '不使用本地快取,則無視快取記錄強制從線上獲取源資料夾資訊')
.alias('y', 'yes')
.describe('yes', '如果發現拷貝紀錄,直接繼續上次的進度')
.alias('f', 'file')
.describe('f', '复制单个文件')
.describe('f', '複製單一文件')
.alias('n', 'name')
.describe('n', '给目标文件夹重命名,不填则保留原始目录名')
.describe('n', '給目標資料夾重新命名,不填則保留原始目錄名')
.alias('N', 'not_teamdrive')
.describe('N', '如果不是团队盘链接,可以加上此参数以提高接口查询效率,降低延迟')
.describe('N', '如果不是小組雲端硬碟連結,可以加上此参數以提高接口查詢效率,降低延遲')
.alias('s', 'size')
.describe('s', '不填默认拷贝全部文件,如果设置了这个值,则过滤掉小于这个size的文件,必须以b结尾,比如10mb')
.describe('s', '不填則預設拷貝全部文件,如果設置了这個值,則過濾掉小於这個大小的檔案,必須以b為結尾,比如10mb')
.alias('S', 'service_account')
.describe('S', '指定使用service account进行操作,前提是必须在 ./sa 目录下放置json授权文件,请确保sa帐号拥有操作权限。')
.describe('S', '指定使用service account進行操作,前提是必須在 ./sa 目錄下放置json授權文件,請確認sa帳號擁有相關操作權限。')
.alias('D', 'dncnr')
.describe('D', 'do not create new root, 不在目的地创建同名文件夹,直接将源文件夹中的文件原样复制到目的文件夹中')
.describe('D', 'do not create new root, 不在目的地創建同名資料夾,直接將來源資料夾中的文件原樣複製到目的資料夾中')
.help('h')
.alias('h', 'help')

Expand All @@ -33,19 +35,19 @@ if (validate_fid(source)) {
if (!validate_fid(target)) throw new Error('target id 格式不正确')
return copy_file(source, target, service_account).then(r => {
const link = 'https://drive.google.com/drive/folders/' + target
console.log('任务完成,文件所在位置:\n', link)
console.log('任務完成,文件所在位置:\n', link)
}).catch(console.error)
}
let min_size
if (size) {
console.log(`不复制大小低于 ${size} 的文件`)
console.log(`不複製大小低於 ${size} 的文件`)
min_size = bytes.parse(size)
}
copy({ source, target, name, min_size, update, not_teamdrive, service_account, dncnr }).then(folder => {
if (!folder) return
const link = 'https://drive.google.com/drive/folders/' + folder.id
console.log('\n任务完成,新文件夹链接:\n', link)
console.log('\n任務完成,新資料夾連結:\n', link)
})
} else {
console.warn('目录ID缺失或格式错误')
console.warn('無目錄ID或格式錯誤')
}
24 changes: 12 additions & 12 deletions count
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
#!/usr/bin/env node

const { argv } = require('yargs')
.usage('用法: ./$0 <目录ID> [options]')
.example('./$0 1ULY8ISgWSOVc0UrzejykVgXfVL_I4r75', '获取 https://drive.google.com/drive/folders/1ULY8ISgWSOVc0UrzejykVgXfVL_I4r75 内包含的的所有文件的统计信息')
.example('./$0 root -s size -t html -o out.html', '获取个人盘根目录统计信息,结果以HTML表格输出,根据总大小逆序排列,保存到本目录下的out.html文件中(不存在则新建,存在则覆盖)')
.example('./$0 root -s name -t json -o out.json', '获取个人盘根目录统计信息,结果以JSON格式输出,根据文件扩展名排序,保存到本目录下的out.json文件中')
.example('./$0 root -t all -o all.json', '获取个人盘根目录统计信息,将所有文件信息(包括文件夹)以JSON格式输出,保存到本目录下的all.json文件中')
.usage('用法: ./$0 <目錄ID> [options]')
.example('./$0 1ULY8ISgWSOVc0UrzejykVgXfVL_I4r75', '獲取 https://drive.google.com/drive/folders/1ULY8ISgWSOVc0UrzejykVgXfVL_I4r75 内包含的所有文件的統計資訊')
.example('./$0 root -s size -t html -o out.html', '獲取個人空間根目錄統計資訊,結果以HTML表格輸出,根據總大小降冪排列,保存到本目錄下的out.html文件中(不存在則新建,存在的覆蓋)')
.example('./$0 root -s name -t json -o out.json', '獲取個人空間根目錄統計資訊,結果以JSON格式輸出,根據文件扩展名排序,保存到本目录下的out.json文件中')
.example('./$0 root -t all -o all.json', '獲取個人空間根目錄統計資訊,將所有文件資訊(包括資料夾)以JSON格式輸出,保存到本目錄下的all.json文件中')
.alias('u', 'update')
.describe('u', '强制从线上获取信息(无视是否存在本地缓存)')
.describe('u', '強制從線上獲取資訊(不論是否存在本地快取)')
.alias('N', 'not_teamdrive')
.describe('N', '如果不是团队盘链接,可以加上此参数以提高接口查询效率,降低延迟。如果要统计的是个人盘且./sa目录下的service account没有相关权限,请确保加上此参数以使用个人的auth信息进行查询')
.describe('N', '如果不是小組雲端硬碟連結,可以加上此参數以提高接口查詢效率,降低延遲。如果要統計的是帳號下之個人空間,且./sa目錄下的service account沒有相關權限,請加上此參數以使用個人的auth身份進行查詢')
.alias('S', 'service_account')
.describe('S', '指定使用service account进行统计,前提是必须在sa目录下放置SA json文件')
.describe('S', '指定使用service account進行統計,前提是必須在sa路徑下放置SA json文件')
.alias('s', 'sort')
.describe('s', '统计结果排序方法,可选值 name 或 size,不填则默认根据文件数量逆序排列')
.describe('s', '統計結果排序方法,可選值如下: name 或 size,不填則預設根據文件數量降冪排列')
.alias('t', 'type')
.describe('t', '统计结果输出类型,可选值 html/json/all,all表示输出所有文件json数据,最好搭配 -o 使用。不填则默认输出命令行表格')
.describe('t', '統計結果輸出類型,可選值如下: html/tree/json/all,all表示輸出所有文件json數據,最好與 -o 一起使用。不填則預設輸出命令列表格')
.alias('o', 'output')
.describe('o', '统计结果输出文件,适合搭配 -t 使用')
.describe('o', '統計結果輸出文件,適合與 -t 一起使用')
.help('h')
.alias('h', 'help')

Expand All @@ -27,5 +27,5 @@ if (validate_fid(fid)) {
const { update, sort, type, output, not_teamdrive, service_account } = argv
count({ fid, update, sort, type, output, not_teamdrive, service_account }).catch(console.error)
} else {
console.warn('目录ID缺失或格式错误')
console.warn('無目錄ID或格式錯誤')
}
12 changes: 7 additions & 5 deletions dedupe
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#!/usr/bin/env node

const { argv } = require('yargs')
.usage('用法: ./$0 <source id> <target id> [options]')
.usage('用法: ./$0 <folder-id> [options]')
.alias('y', 'yes')
.describe('yes', '如果發現重複項目,直接刪除')
.alias('u', 'update')
.describe('u', '不使用本地缓存,强制从线上获取源文件夹信息')
.describe('u', '不使用本地快取,則無視快取記錄強制從線上獲取源資料夾資訊')
.alias('S', 'service_account')
.describe('S', '使用service account进行操作,前提是必须在 ./sa 目录下放置sa授权json文件')
.describe('S', '使用service account進行操作,前提是必須在 ./sa 目錄下存放sa授權json文件')
.help('h')
.alias('h', 'help')

Expand All @@ -17,8 +19,8 @@ if (validate_fid(fid)) {
dedupe({ fid, update, service_account }).then(info => {
if (!info) return
const { file_count, folder_count } = info
console.log('任务完成,共删除文件数:', file_count, '目录数:', folder_count)
console.log('任務完成,共刪除檔案數:', file_count, '目錄數:', folder_count)
})
} else {
console.warn('目录ID缺失或格式错误')
console.warn('無目錄ID或格式錯誤')
}
Loading