当前位置: 首页 > news >正文

chrome插件提取标签数据

        本意想把chrome保存的标签拉一个目录保存,可以使用插件直接导出文件,现在实现了数据拼接,导出文件未实现(因为没有new Blob);

目录结构如下;

background.js

// 递归函数,用于构建书签树
function buildBookmarkTree(node) {if (node.children) {const folder = {name: node.title,type: 'folder',children: []};node.children.forEach(child => {folder.children.push(buildBookmarkTree(child));});return folder;} else {return {name: node.title,url: node.url,type: 'bookmark',needLogin: false,loginInfo: {username: '',password: ''}};}
}
// 处理书签导出  是一个异步
async function exportBookmarks(sendResponse) {let bookList = []await chrome.bookmarks.getTree(tree => {const root = tree[0];const bookmarkTree = buildBookmarkTree(root);sendResponse({ status: 'success' ,bookList:[bookmarkTree]});console.log('bookmarkTree',[bookmarkTree]);bookList.concat([bookmarkTree])// const jsonData = JSON.stringify(bookmarkTree, null, 2);// const blob = new Blob([jsonData], { type: 'application/json' });// try{//     const url = URL.createObjectURL(blob);//     const a = document.createElement('a');//     a.href = url;//     a.download = 'bookmarks.json';//     a.click();//     URL.revokeObjectURL(url);// }catch(e){//     console.log('bookmarkTree-error',e)// }});console.log('bookList2',bookList);return bookList
}
// 监听来自 popup.js 的消息
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) => {if (request.action === 'exportBookmarks') {let bookList = await exportBookmarks(sendResponse);console.log('bookList1',bookList)sendResponse({ status: 'success' ,bookList:bookList});}return true;
});

manifest.json

{"manifest_version": 3,"name": "Bookmark Exporter","version": "1.0","description": "Export bookmarks to a JSON file with tree structure and login info","action": {"default_popup": "popup.html","default_icon": {"16": "icon16.png","32": "icon16.png"}},"permissions": ["bookmarks"],"background": {"service_worker": "background.js"}
}

popup.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Bookmark Exporter</title>
</head><body><button id="exportButton">保存书签</button><script src="popup.js"></script>
</body></html>

popup.js

document.addEventListener('DOMContentLoaded', () => {const exportButton = document.getElementById('exportButton');exportButton.addEventListener('click', () => {chrome.runtime.sendMessage({ action: 'exportBookmarks' }, response => {console.log('response',response)if (response.status === 'success') {const jsonData = JSON.stringify(response.bookList, null, 2);const blob = new Blob([jsonData], { type: 'application/json' });try{const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'bookmarks.json';a.click();URL.revokeObjectURL(url);}catch(e){console.log('bookmarkTree-error',e)}console.log('Bookmarks exported successfully');}else{}});});
});

http://www.xdnf.cn/news/348913.html

相关文章:

  • Python cv2对象检测与跟踪:从基础到进阶实战
  • Java JWT 配置类 (JwtProperties) 学习笔记
  • el-table计算表头列宽,不换行显示
  • C++模板笔记
  • 使用DEEPSEEK快速修改QT创建的GUI
  • 【日撸 Java 三百行】Day 6(For语句)
  • Cursor降智找不到文件(Cursor降智)
  • C++漫步结构与平衡的殿堂:AVL树
  • SpringBoot应急知识学习系统开发实现
  • [计算机科学#10]:早期的计算机编程方式
  • 基于php人力劳务招聘系统开发功能需求分析【源码】
  • 千星计划小程序开发方案
  • SpringAI实现AI应用-自定义顾问(Advisor)
  • 基金从入门到荒废-基金的分类
  • #define ccw (0)和#define ccw 0什么区别
  • 数据结构 - 8( AVL 树和红黑树 10000 字详解 )
  • Python序列Day3
  • 【软件设计师:操作系统】5.操作系统基础与进程
  • FPGA图像处理(四)------ 图像裁剪
  • 5月8号.
  • MySQL事务隔离机制与并发控制策略
  • 电子电路原理第十五章(运算放大器)
  • 新手SEO基础优化步骤
  • conda创建一个新环境,指定环境的存储位置,而不是默认值地址
  • 操作系统 : Linux进程信号
  • 【LeetCode 热题 100】二叉树 系列
  • 基于GlusterFS的分布式存储集群部署实战指
  • 硕博士学位论文题目需要注意的几个问题
  • [计算机科学#11]:编程语言简史,从二进制到简约表达的华丽转身,造就原因——“懒”
  • 实现类似AI流式输出效果