From da48c6f95e07e402a8a02bc1e9605a0efb524ce0 Mon Sep 17 00:00:00 2001 From: junyiz Date: Fri, 3 Jun 2022 15:55:56 +0800 Subject: [PATCH] add electron --- .gitignore | 3 ++ README.md | 16 +++++------ assets/bg.png | Bin 0 -> 28659 bytes cli.js | 2 +- index.html | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/sina.js | 6 ++-- main.js | 18 ++++++++++++ package.json | 23 +++++++++++---- preload.js | 31 ++++++++++++++++++++ 9 files changed, 158 insertions(+), 17 deletions(-) create mode 100644 assets/bg.png create mode 100644 index.html create mode 100644 main.js create mode 100644 preload.js diff --git a/.gitignore b/.gitignore index 2309d12..74394d2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ .DS_store blog-* node_modules + +out +dist \ No newline at end of file diff --git a/README.md b/README.md index 39e4b77..3de56d0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # dature -基于 Node.js 的新浪博客抓取程序,抓取数据包含标题、正文、时间、分类、标签、图片,并生成 HTML 文件 +基于 Node.js 的新浪博客备份程序,备份数据包含标题、正文、时间、分类、标签、图片,并生成 HTML 文件 ## 前置 需要先安装 Node.js,参见:[https://nodejs.org/zh-cn/download/](https://nodejs.org/zh-cn/download/) @@ -13,25 +13,25 @@ npm install -g dature ## 使用 ```bash -# 抓取牛根生的博客 +# 备份牛根生的博客 dature -u 1263917762 -c "xxxxxx" # xxxxxx 为 cookie ``` -## 抓取后生成的新博客 -![example](https://raw.githubusercontent.com/junyiz/dature/master/images/example.jpg) +## 备份后生成的新博客 +![example](https://gitee.com/junyiz/dature/raw/master/images/example.jpg) ## 如何查看新浪博客的 UID - -![example](https://raw.githubusercontent.com/junyiz/dature/master/images/sina.jpg) +![example](https://gitee.com/junyiz/dature/raw/master/images/sina.jpg) ## 如何查看新浪博客的 cookie -![cookie](https://raw.githubusercontent.com/junyiz/dature/master/images/cookie.png) +登录新浪博客,打开浏览器的开发者工具,然后刷新页面,如下大红框,即是 cookie +![cookie](https://gitee.com/junyiz/dature/raw/master/images/cookie.png) 注意只需复制大红框中冒号后面的部分 ## buy-me-a-tea 如果这个仓库对你有帮助,欢迎 star 或 buy me a tea: - + diff --git a/assets/bg.png b/assets/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7aebf95a52de36880db8eae2b6aae453f89e7f67 GIT binary patch literal 28659 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 Q|3M7rQ*QRnwgKt?1I + + + +Dature:新浪博客备份工具 + + + + + + \ No newline at end of file diff --git a/lib/sina.js b/lib/sina.js index f0a9578..761f0da 100644 --- a/lib/sina.js +++ b/lib/sina.js @@ -11,12 +11,12 @@ module.exports = async function extract(uid, dir, cookie) { let imgs = [] let data = { uid, post: [] } - console.log('抓取博文目录:\n') + console.log('备份博客文章目录:\n') // 遍历博文目录,抽取博客标题、博文地址 let i = 1, page = 1 do { - let list = await htmlDownloader(`http://blog.sina.com.cn/s/articlelist_${uid}_0_${i}.html`, { cookie }).catch(console.error) + let list = await htmlDownloader(`http://blog.sina.com.cn/s/articlelist_${uid}_0_${i}.html`, { cookie }).catch(console.log) let $ = cheerio.load(list) console.log(`第 ${i} 页:`) $('.articleList .atc_main a[title]').each((i, el) => { @@ -34,7 +34,7 @@ module.exports = async function extract(uid, dir, cookie) { } } while (++i <= page) - console.log(`\n博客(${data.title})共有博文 ${urls.length} 篇, 以下开始按篇抓取:\n`) + console.log(`\n博客:${data.title || ''}, 共有文章 ${urls.length} 篇, 以下开始按篇备份:\n`) let n = 1 // 遍历博文地址,抽取博文内容(标题、正文、时间、分类、图片、原文链接) diff --git a/main.js b/main.js new file mode 100644 index 0000000..ae9ed45 --- /dev/null +++ b/main.js @@ -0,0 +1,18 @@ +const { app, BrowserWindow } = require('electron') +const path = require('path') + +const createWindow = () => { + const win = new BrowserWindow({ + width: 528, + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js') + } + }) + + win.loadFile('index.html') +} + +app.whenReady().then(() => { + createWindow() +}) diff --git a/package.json b/package.json index 8c0b298..1a2d175 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,21 @@ { "name": "dature", "version": "0.3.6", - "description": "新浪博客抓取程序", - "main": "cli.js", + "description": "新浪博客备份工具", + "main": "main.js", "bin": { "dature": "cli.js" }, "dependencies": { "cheerio": "^0.22.0", + "iconv-lite": "^0.4.21", "is-url": "^1.2.2", "mkdirp": "^0.5.1", - "yargs": "^11.0.0", - "iconv-lite": "^0.4.21" + "yargs": "^11.0.0" }, "devDependencies": { + "electron": "^19.0.2", + "electron-builder": "^23.0.3", "pkg": "^5.6.0" }, "repository": { @@ -25,9 +27,11 @@ }, "homepage": "https://github.com/junyiz/dature#readme", "scripts": { + "start": "electron .", "build": "pkg .", "build:macos": "pkg . -t node12-macos-x64 -o ./dist/dature-macos -d", - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "dist": "electron-builder --win --x64" }, "keywords": [ "data", @@ -50,6 +54,15 @@ ], "outputPath": "dist" }, + "build": { + "appId": "cn.dature.app", + "mac": { + "target": ["dmg", "zip"] + }, + "win": { + "target": ["nsis", "zip"] + } + }, "author": "Junyi Zhang ", "license": "ISC" } diff --git a/preload.js b/preload.js new file mode 100644 index 0000000..4af37d9 --- /dev/null +++ b/preload.js @@ -0,0 +1,31 @@ +const fetch = require('./lib/fetch') +const join = require('path').join +const { shell } = require('electron') + +const $ = (selector) => document.getElementById(selector) + +window.addEventListener('DOMContentLoaded', () => { + const btn = $('btn') + const out = $('out') + + btn.addEventListener('click', () => { + const uid = $('uid').value + const cookie = ($('cookie').value || '') + .replace(/(NowDate|BLOG_TITLE|mblog_userinfo)[^;]*;/g, '') + + const dir = join(process.cwd(), `./blog-${uid}`) + + console.log = (log) => out.innerHTML += log.replace('\n', '
') + + fetch(dir, uid, cookie).then(function() { + console.log(`\n备份完毕, 博客存储目录:${dir}\n`) + }) + }) + + out.addEventListener('click', (event) => { + if (event.target.tagName === 'A') { + event.preventDefault() + shell.openExternal(event.target.href) + } + }) +})