定时刷新cookies同步工具适合的场景

不知道大家在做一些简易的爬虫、工具时,会不会遇到cookies过期的问题❓

我自己的使用场景就是,为公司其他同事提供图片转链接的功能,这里面会使用到一个内部cms后台上传的功能,这个upload功能并不是一个公开的api接口,需要有登录cookies的信息才能保证上传。为此,我尝试用最简单的办法调用浏览器的cookies信息,然后提交到我设置的url里面,完成上传同步的功能。

当然你可能是在写爬虫的时候需要用到它,也可能是一些签到功能需要……

chrome/edge同步cookies插件实现方式的选择

  • 使用油猴脚本编写
  • 直接编写浏览器插件
编写这个插件之前,想过使用油猴脚本来写,但是最后可能还是因为自己比较菜,改用了浏览器插件的方式来实现同步cookies的功能

同步浏览器cookies实现步骤

  1. 监听浏览器^^load^^动作,当页面载入完毕是,执行getcookies的动作
  2. 将获取到的cookies提交到指定的url页面,指定的页面可以针对具体的页面设置,也可以不设置发送到默认的网址
  3. 当前访问页面插入时钟,根据设置的时间间隔刷新页面,保证页面cookies自动更新
  4. 使用popup页面,添加、设置提交url地址和刷新时间间隔功能

同步cookies浏览器插件 popup设置功能界面

浏览器插件部分核心代码

function getCookies(url) {
  chrome.cookies.getAll({
    url: url
  }, (cks) => {
    let cookie = cks.map((item) => {
      return item.name + "=" + item.value;
    }).join(";") ;
    // 保存到服务器
    console.log(cookie);
    
    // 根据url读取设置
    json = localStorage.getItem(md5(url));
    if(isJSON(json)){
      var setting = JSON.parse(json);
    }else{
      var setting = {
        "url": '',
        "fresh": 0,
        "auto": false,
        "ref": url
    }
    }
    
    // 给setting添加当前访问url数据
    // 调试输出setting
    console.log(setting, url);
    if(cookie != ''){
      saveCookieToServer(setting, cookie);
    }


    if(setting.auto == true && setting.fresh > 0){
      // fresh_id = setInterval(function () {
      setTimeout(function () {
        // location.reload();
        console.log('log', setting);
        chrome.tabs.query({},  function (tabs){
          // console.log(tabs);
          tabs.forEach(function(item) {
            // console.log(item);
            // chrome.browserAction.setBadgeText({text: setting.fresh + 'm'}, item.id);
            // chrome.browserAction.setBadgeBackgroundColor({color: [255, 0, 0, 255]}, item.id);
            if(item.url == setting.ref){
              chrome.tabs.reload(item.id);
            }
          });
        });
      }, parseInt(parseInt(setting.fresh) * 60 * 1000));
      // console.log("fresh_id", fresh_id);
      // clearInterval(fresh_id);
    }
  });
}

// 保存cookie到服务器
function saveCookieToServer(setting, currentCookie) {
  var ref = setting.ref;
  var post_url = setting.url;
  var fresh_time = setting.fresh;
  var auto_fresh = setting.auto;
  console.log(ref, post_url, fresh_time, auto_fresh);

  // 如未设置当前页面提交地址,使用默认提交地址
  if(post_url == null || post_url == ''){
    post_url = localStorage.getItem('post_url');
  }

  // 尝试提交数据
  var xhr = new XMLHttpRequest();
  if (post_url.indexOf("?") != -1) {
    xhr.open("POST", `${post_url}&ref_url=${ref}`, true);
  }else{
    xhr.open("POST", `${post_url}?ref_url=${ref}`, true);
  }
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
      // JSON解析器不会执行攻击者设计的脚本.
      var resp = JSON.parse(xhr.responseText);
      console.log(resp)
    }
  }
  xhr.send(`${currentCookie}`);
}

完整自动同步cookies到指定页面插件代码下载

插件代码下载链接

插件使用方式:

  • 下载代码,解压到文件夹
  • 打开浏览器插件功能,并开启开发者模式
  • 添加本地代码(刚刚解压的目录)
  • 设置插件起动即可