前言

1024 的时候我发现掘金的福利兑换礼品真的是白菜价,奈何如此少的矿石,我依然没有。我每天开始去签到,只是为了来年 1024 的时候去挥霍一番,可是我发现每天都念叨这件事情属实让我很不舒服,因为只有女朋友可以让我每天如此思念 T_T

所以我决定写个自动签到的脚本来帮我干这件事情 (:

功能点

自动签到

聪明的人打开浏览器控制台就可以找到签到对应的接口:

  • 查询今日是否已经签到:
https://api.juejin.cn/growth_api/v1/get_today_status
  • 签到:
https://api.juejin.cn/growth_api/v1/check_in

这样一来就非常简单了,先获取一下签到状态,没签到的去签个到:

// 查询今日是否已经签到
const getTodayCheckStatus = async () => {
  const cookie = '从浏览器的请求头里 copy 一个 cookie';
  let { data } = await axios({
    url: 'https://api.juejin.cn/growth_api/v1/get_today_status',
    method: "get",
    headers: {
      Cookie: cookie,
    },
  });
  return {
    error: data.err_no !== 0,
    isCheck: data.data,
  };
};

// 签到
const checkIn = async () => {
  let { error, isCheck } = await getTodayCheckStatus();
  if (error) {
    console.log('验证签到错误');
    return;
  }
  if (isCheck) {
    console.log('已经签到');
    return;
  }
  const cookie = '从浏览器的请求头里 copy 一个 cookie';
  let { data } = await axios({
    url: 'https://api.juejin.cn/growth_api/v1/check_in',
    method: "post",
    headers: {
      Cookie: cookie,
    },
  });
  if (data.err_no) {
    console.log('签到失败');
  } else {
    console.log('签到成功');
  }
};

顺带免费抽奖

聪明的人又打开了浏览器的控制台找到了抽奖对应的接口:

  • 获取抽奖配置:
https://api.juejin.cn/growth_api/v1/lottery_config/get
  • 发起抽奖
https://api.juejin.cn/growth_api/v1/lottery/draw

这样一来就又非常简单了,先获取一下抽奖状态,没抽奖的去抽个奖:

const getTodayLotteryStatus = async () => {
  const cookie = '从浏览器的请求头里 copy 一个 cookie';
  let { data } = await axios({
    url: 'https://api.juejin.cn/growth_api/v1/lottery_config/get',
    method: "get",
    headers: {
      Cookie: cookie,
    },
  });
  if (data.err_no) {
    return {
      error: true,
      isLotteryed: false,
    };
  } else {
    return {
      error: false,
      isLotteryed: data.data.free_count === 0,
    };
  }
};

// 抽奖
const draw = async () => {
  let { error, isLotteryed } = await getTodayLotteryStatus();
  if (error || isLotteryed) {
    console.log('抽过啦');
    return;
  } 
  const cookie = '从浏览器的请求头里 copy 一个 cookie';
  let { data } = await axios({
    url: 'https://api.juejin.cn/growth_api/v1/lottery/draw',
    method: "post",
    headers: {
      Cookie: cookie,
    },
  });
  if (data.err_no) {
    console.log('抽奖失败啦');
    return;
  }
  console.log('抽奖结果:\n' + data);
};

失败了再顺带给我发个邮件

邮件服务可以参考:nodemailer

const sendEmail = async (subject, html) => {
  // xxx
};

将上面函数里失败的 console.log() 替换成邮件提醒 await sendEmail()

丢到服务器上每天定时执行

let job = new Cron(
  "10 10 10 * * *",
  async () => {
    await checkIn();
    await draw();
  },
  null,
  true,
  'Asia/Shanghai'
);

job.start();

注意事项

由于 cookie 会过期,所以失败之后可以尝试在浏览器里重新 copy 一个 cookie 到脚本里执行。