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

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

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

// 下面两种引入方式只需选择一种就行,看在什么进程中使用
// 主进程
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)
})

相关接口:

// 获取某本书你的全部笔记
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