Files
2026-04-28 17:18:19 +08:00

102 lines
3.1 KiB
TypeScript

import JSZip from "jszip"
import type { PlasmoMessaging } from "@plasmohq/messaging"
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
const { action } = req.body
if (action === "batchDownloadAllTabs") {
try {
const tabs = await chrome.tabs.query({})
const supportedSites = [
{ pattern: "mp.weixin.qq.com", name: "weixin" },
{ pattern: "juejin.cn", name: "juejin" },
{ pattern: "csdn.net", name: "csdn" },
{ pattern: "cnblogs.com", name: "cnblogs" },
{ pattern: "jianshu.com", name: "jianshu" },
{ pattern: "segmentfault.com", name: "segmentfault" },
{ pattern: "zhihu.com", name: "zhihu" },
{ pattern: "oschina.net", name: "oschina" },
{ pattern: "51cto.com", name: "51cto" },
{ pattern: "php.net", name: "php" },
{ pattern: "jb51.net", name: "jb51" },
{ pattern: "baidu.com", name: "baidu" }
]
const validTabs = tabs.filter((tab) => {
if (!tab.url) return false
return supportedSites.some((site) => tab.url.includes(site.pattern))
})
if (validTabs.length === 0) {
res.send({ code: 0, msg: "没有找到支持的页面" })
return
}
const zip = new JSZip()
let successCount = 0
let failCount = 0
for (const tab of validTabs) {
try {
const site = supportedSites.find((s) => tab.url.includes(s.pattern))
if (!site) continue
const response = await chrome.tabs.sendMessage(tab.id, {
name: `${site.name}-downloadMarkdown`,
body: { action: "getMarkdown" }
})
if (response && response.markdown) {
const title = response.title || `page-${tab.id}`
const safeTitle = title.replace(/[<>:"/\\|?*]/g, "-")
zip.file(`${safeTitle}.md`, response.markdown)
successCount++
} else {
failCount++
}
} catch (error) {
console.error(`Failed to download tab ${tab.id}:`, error)
failCount++
}
}
if (successCount === 0) {
res.send({ code: 0, msg: "所有页面下载失败" })
return
}
const zipBlob = await zip.generateAsync({ type: "blob" })
const reader = new FileReader()
reader.onload = function (event) {
const dataUrl = event.target.result as string
const timestamp = new Date()
.toISOString()
.replace(/[:.]/g, "-")
.slice(0, 19)
chrome.downloads.download(
{
url: dataUrl,
filename: `batch-download-${timestamp}.zip`
},
() => {
res.send({
code: 200,
msg: `成功 ${successCount} 个,失败 ${failCount} 个`,
data: { successCount, failCount, total: validTabs.length }
})
}
)
}
reader.readAsDataURL(zipBlob)
} catch (error) {
console.error("Batch download error:", error)
res.send({ code: 0, msg: error.message })
}
}
}
export default handler