Kindle to Flomo 现在已经支持微信读书笔记的导入啦。我现在想着要不要给它换个名字,因为它现在已经支持 Kindle、Apple Books、微信读书三种导入方式了。这个后面再说吧。

远离其实就是访问微信读书网页版,然后扫码登录,获取到 cookie,之后就模拟请求腾讯那边的接口就可以了。因为要获取cookie,模拟请求,所以这个功能在纯浏览器端肯定是无法实现的,因为存在跨域等限制。但我这个应用还有 electron 版本,有客户端就好办很多。

经过一番查询,找到 electron 捕获应用内所有请求,iframe 中的请求当然也包含在内:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 下面两种引入方式只需选择一种就行,看在什么进程中使用
// 主进程
const { session } = require('electron')
// 渲染进程
const { session } = require('electron').remote

// 过滤器,只捕获此域名下的请求
const filter = {
urls: ['https://weread.qq.com/*']
}

session.defaultSession.webRequest.onBeforeSendHeaders(filter,(details, callback) => {
console.log(details.requestHeaders.Cookie)
callback(details)
})

相关接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// 获取某本书你的全部笔记
export const get_bookmarklist = bookId => {
return axios({
method: 'get',
url: '/book/bookmarklist',
headers,
params: {
bookId
}
})
}
// 获取某一本书的热门划线
export const get_bestbookmarks = bookId => {
return axios({
method: 'get',
url: '/book/bestbookmarks',
headers,
params: {
bookId
}
})
}
// 获取书架上的书籍列表
export const get_bookshelf = (cookie) => {
return axios({
method: 'get',
url: '/shelf/friendCommon',
headers,
params: {
userVid: getUid(cookie)
}
})
}
// 获取你的所有有笔记本书单
export const get_notebooklist = () => {
return axios({
method: 'get',
headers,
url: '/user/notebooks'
})
}
// 获取某本书的详情
export const get_bookinfo = bookId => {
return axios({
method: 'get',
url: '/book/info',
headers,
params: {
bookId
}
})
}

// 获取某本书的批注
export const get_reviewlist = (params, cookie) => {
return axios({
method: 'get',
url: '/web/review/list',
baseURL: 'https://weread.qq.com',
headers,
params: {
userVid: getUid(cookie),
...params
}
})
}

主要的逻辑其实就是:

  1. 用户点击导入按钮
  2. 通过 iframe 访问 https://weread.qq.com/#login
  3. 获取 cookie,请求图书列表
  4. 如果用户为登录,那么请求就会失败,此时显示 iframe 内容,iframe 中应该有个登录二维码
  5. 用户扫码登录,重新请求接口,进行后续请求

查看仓库

参考:

wr_marker

wereader