mirror of
https://github.com/027xiguapi/code-box.git
synced 2026-09-27 17:48:27 +00:00
102 lines
3.1 KiB
TypeScript
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
|