油猴自动化应用案例实践

8,101 阅读4分钟

避免漏签小神器

一共2种实现方式

方式优缺点
最优的就是github的actions,可以写个定时任务定时每天执行,建议配合第二种一起使用需要定期更新cookie(cookie是保存在github的secret里的)
其次就是油猴脚本,也是本文的主要内容浏览器打开掘金才能触发
大家都知道谷歌必装油猴,但是油猴究竟都有哪些使用场景呢?
今天就提供给大家一个使用场景,自动签到。

估计大家都苦于掘金签到中断的痛苦而没有好的办法,今天就带大家使用油猴写一个脚本解决这个问题,解放双手,愉快摸鱼。

先直接上脚本,可以直接粘贴到自己的油猴里:

// ==UserScript==
// @name         掘金自动签到免费抽奖
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  掘金自动签到 自动触发免费抽奖
// @author       无仙
// @match        https://juejin.cn/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

(function () {
  'use strict';

  // 抽奖
  const drawFn = async () => {
    // 查询今日是否有免费抽奖机会
    const today = await fetch('https://api.juejin.cn/growth_api/v1/lottery_config/get', {
      headers: {
        cookie: document.cookie
      },
      method: 'GET',
      credentials: 'include'
    }).then((res) => res.json());

    if (today.err_no !== 0) return console.warn('免费抽奖失败!');
    if (today.data.free_count === 0) return console.log('今日已经免费抽奖!');

    // 免费抽奖
    const draw = await fetch('https://api.juejin.cn/growth_api/v1/lottery/draw', {
      headers: {
        cookie: document.cookie
      },
      method: 'POST',
      credentials: 'include'
    }).then((res) => res.json());

    if (draw.err_no !== 0) return console.warn('免费抽奖失败!');
    [3, 4].includes(draw.data.lottery_type) ? alert(`恭喜抽到:${draw.data.lottery_name}`) : console.log(`恭喜抽到:${draw.data.lottery_name}`);
  };

  // 签到
  (async () => {
    // 查询今日是否已经签到
    const today_status = await fetch('https://api.juejin.cn/growth_api/v1/get_today_status', {
      headers: {
        cookie: document.cookie
      },
      method: 'GET',
      credentials: 'include'
    }).then((res) => res.json());

    if (today_status.err_no !== 0) return console.warn('签到失败!');
    if (today_status.data) {
      console.log('今日已经签到!');
      drawFn();
      return;
    }

    // 签到
    const check_in = await fetch('https://api.juejin.cn/growth_api/v1/check_in', {
      headers: {
        cookie: document.cookie
      },
      method: 'POST',
      credentials: 'include'
    }).then((res) => res.json());

    if (check_in.err_no !== 0) return console.warn('签到失败!');
    console.log(`签到成功!当前积分;${check_in.data.sum_point}`);
    drawFn();
  })();
})();

开始之前,首先先分析一下这个需求:

  • 油猴脚本规则
  • 业务场景
  • 会用到哪些接口

油猴脚本规则

我们在打开油猴新建用户脚本的时候都会看到这样的一段初始代码,那这段代码有什么含义呢?
油猴脚本的规则是什么样的呢?

1629946920(1).jpg

// ==UserScript==
// @name         这里是你的编写的油猴脚本的名字
// @namespace    这个是命名空间;用来区分名称相同但是作者不同的用户脚本,一般都是写作者的个人网址,没有也可以写你的博客地址
// @version      这个是你编写的脚本版本号
// @description  这个是功能描述,描述你的这个脚本是用来干嘛的
// @author       这个是作者的名字,比如我:无仙
// @match        这个是该脚本匹配的网址,支持通配符匹配
// @icon         脚本图标
// @grant        请看下边表格
// ==/UserScript==

(function() {
    'use strict';

    // 你的脚本代码
})();
权限名功能
none无任何权限
unsafeWindow允许脚本可以完整访问原始页面,包括原始页面的脚本和变量。
GM_getValue(name,defaultValue)从油猴扩展的存储中访问数据。可以设置默认值,在没成功获取到数据的时候当做初始值。如果保存的是日期等类型的话,取出来的数据会变成文本,需要自己转换一下。
GM_setValue(name,value)将数据保存到存储中
GM_xmlhttpRequest(details)异步访问网页数据的API,这个方法比较复杂,有大量参数和回调,详情请参考官方文档。
GM_setClipboard(data, info)将数据复制到剪贴板中,第一个参数是要复制的数据,第二个参数是MIME类型,用于指定复制的数据类型。
GM_log(message)将日志打印到控制台中,可以使用F12开发者工具查看。

业务场景

那我们要写的这个脚本的场景就是帮助我们在浏览器打开掘金的时候实现自动签到
并且签到之后,会获得一次免费抽奖的机会,顺便可以实现自动免费抽奖,说不定就会欧神附体呢

会用到哪些接口

通过查看Chrome的Newwork面板我们会发现其实一共涉及到4个接口,分别是:
序号接口调用方式功能
1/growth_api/v1/get_today_statusGET查询今日是否已经签到
2/growth_api/v1/check_inPOST签到
3/growth_api/v1/lottery_config/getGET查询今日免费抽奖机会
4/growth_api/v1/lottery/drawGET抽奖

拿到了上述信息之后就可以开始正式编写脚本喽

学会编写这一个油猴脚本之后就可以编写任何你想要的功能的油猴脚本喽,
比如去除广告,自动通知,复制解禁,划词翻译等等

如果没有时间打开浏览器的话,还是建议使用github的actions去实现定时自动签到,这样就可以真正的解放
用法可以参考上边我的github仓库,并且还有发送邮件通知签到结果的功能
如果邮件显示签到失败,那大概率是cookie过期导致的,需要手动更新一下cookie
另外就是cookie是保存在github的secret里的,也不用担心cookie泄漏的问题

祝大家玩的愉快!!!