Electron通过本地文件读写cookies值

此处以假设目标网站是百度(www.baidu.com),我们的目标是将用户登陆记录保存在本地,以便下次重启时在百度登陆界面时自动填充用户名。

假设目标信息在cookies结构如下:

{
name: 'username',
value: 'csdnrole',
domain: 'www.baidu.com',
hostOnly: true,
path: '/baiduacc',
secure: false,
httpOnly: false,
session: true,
sameSite: 'unspecified'
},

假设读取操作在main.js中执行,程序启动读取本地文件,程序结束前检测当前cookies变化写入文件,那么首先在electron的main.js创建生命周期前,声明require、全局变量和预先在本地创建的文件路径

const fs =require('fs')
const {session} = require('electron')
uname=''
cname=''
defaultpath=—__dirname+'\\config.cfg'

如果生成窗口自动执行的是function createWindow(),则在此函数中编写如下代码

function createWindow () {

  // Create the browser window.
  const mainWindow = new BrowserWindow({
    width: 1280,
    height: 720,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // 从defaultpath读取文件内容,通过strd传递给uname
  fs.readFile(defaultpath,"utf-8",function(err,strd){
    if(err){
      console.log(err)
    }else{
      uname=strd
      console.log('current username value: '+uname)

  // 得到uname,设定cookies的值
  session.defaultSession.cookies.set({ url: 'http://www.baidu.com', name:'username', value:uname})
  .then((cookies) => {
    console.log(cookies)
  }).catch((error) => {
    console.log(error)
  })
    }
  })

  // 加载目标网址,读取cookies值并写入至程序cookies必须在加载目标页面之前
  mainWindow.loadURL=('http://www.baidu.com')
}

在生命周期窗口关闭时,检测cookies有无变化,无变化或者为空时回滚写入最后一次的值,有变化则更新新值

app.on('window-all-closed', function () {
  //过滤cookies内容
  session.defaultSession.cookies.get({ url: 'http://www.baidu.com' , name:'username'})
  .then((cookies) => {
    var a=cookies[0].name.toString()
    var b=cookies[0].value.toString()
    console.log('name: '+a+'value: '+b)

    //检测cookies的值有无变化
    if(b=='' || b==uname){
      //cookies获取到的值为空或未发生变化,不执行任何操作

    }else{
      //cookies值发生变化,重置文件内容,写入新值
      cname=b
      console.log('cookies update to: '+cname)

      //创建一个文件索引号,以提供给fs.ftruncate()函数
      fd=fs.openSync(defaultpath,'r+')

      //清空文件全部内容
      fs.ftruncate(fd,0,(err)=>{
        if(err){
          console.log(err)
        }
      })

      //关闭文件,保存
      fs.close(fd,(err)=>{
        if(err){
          console.log(err)
        }else{
          console.log('ftruncate ok,close.')
        }
      })
      console.log('update name:'+cname)

      //同步文件写入到defaultpath
      fs.writeFileSync(defaultpath,cname)

      //同步读取文件内容到rdata,控制台输出rdata
      rdata=fs.readFileSync(defaultpath)
      console.log('now cookies name: '+rdata)
    }
    
  }).catch((error) => {
    console.log(error)
  })
  if (process.platform !== 'darwin') app.quit()
})


版权声明:本文为FreeEagle_Kaze原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。