此文章最先发表于我的个人博客,CSDN为同步发布,如有需要,请访问 腿短快跑的个人博客 获取更多内容

hello,大家好啊,最近我正在将文章同步到各大平台,在使用掘金的过程中发现掘金是可以每天签到领矿石的,并且每天可以免费抽奖一次,领取的矿石可以用来兑换掘金的一些周边礼品。

作为一个程序员,那必须安排上每天自动签到、抽奖的功能啊,说干就干,下面开始讲解实际操作步骤

原理

签到和抽奖的原理都很简单,就是模拟浏览器发送接口请求来达到效果

代码实现

下述代码使用数据库存储账号信息,支持多账号签到、抽奖,如不需要如此复杂的逻辑,可自行根据实际情况调整

  • 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency><!-- 数据库配置 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency><!-- tk-mybatis 简化数据库操作 -->
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>4.1.5</version>
</dependency>
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version>
</dependency><!-- ok-http用于发送http请求 -->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.6.0</version>
</dependency>
  • 创建数据库表
CREATE TABLE `juejin_assign_account` (`id` bigint NOT NULL AUTO_INCREMENT,`remark` varchar(255) NOT NULL COMMENT '账号描述',`cookie` text COMMENT 'cookie信息',`last_assign_time` datetime DEFAULT NULL COMMENT '上一次签到时间',`ore_count` bigint NOT NULL DEFAULT '0' COMMENT '矿石数量',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='掘金账号信息';
  • 数据库配置
# mybatis配置
mybatis:mapper-locations: classpath:mapper/**/*.xmlconfiguration:map-underscore-to-camel-case: true# 数据源配置
spring:datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://{你的数据库IP}:{你的数据库端口}/{你的数据库名称}?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: {你的数据库账号}password: {你的数据库密码}hikari:minimum-idle: 5idle-timeout: 600000maximum-pool-size: 10auto-commit: truepool-name: MyHikariCPmax-lifetime: 1800000connection-timeout: 30000connection-test-query: SELECT 1
  • 签到、抽奖代码
package cn.tdkpcw.wechat.model.juejin;import com.google.gson.annotations.SerializedName;
import lombok.Data;/*** @author C.W* @date 2022/6/1 9:49* @desc 免费抽奖次数*/
@Data
public class FreeLotteryResp {@SerializedName("free_count")private Integer freeCount;@SerializedName("point_cost")private Long pointCost;}
package cn.tdkpcw.wechat.model.juejin;import com.google.gson.annotations.SerializedName;
import lombok.Data;/*** @author C.W* @date 2022/6/1 9:47* @desc*/
@Data
public class JueJinResp<T> {@SerializedName("err_no")private Integer errNo;@SerializedName("err_msg")private String errMsg;private T data;}
package cn.tdkpcw.wechat.job;import cn.tdkpcw.wechat.dao.JueJinAssignAccountDao;
import cn.tdkpcw.wechat.model.juejin.FreeLotteryResp;
import cn.tdkpcw.wechat.model.juejin.JueJinResp;
import cn.tdkpcw.wechat.model.po.JueJinAssignAccountPO;
import cn.tdkpcw.wechat.utils.GsonUtils;
import cn.tdkpcw.wechat.utils.HttpUtils;
import com.google.gson.reflect.TypeToken;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author C.W* @date 2022/6/1 9:34* @desc 掘金签到*/
@Slf4j
@Component
public class JueJinAssignJob {// 签到private static final String ASSIGN_URL = "https://api.juejin.cn/growth_api/v1/check_in";// 查询免费抽奖次数private static final String FREE_LOTTERY_URL = "https://api.juejin.cn/growth_api/v1/lottery_config/get";// 抽奖private static final String LOTTERY_URL = "https://api.juejin.cn/growth_api/v1/lottery/draw";// 矿石数量private static final String ORE_COUNT_URL = "https://api.juejin.cn/growth_api/v1/get_cur_point";// 时间格式化private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");@Autowiredprivate JueJinAssignAccountDao jueJinAssignAccountDao;@Scheduled(cron = "0 10 06 * * ?")public void start() throws IOException {Map<String, String> headers = new HashMap<>();headers.put("Referer", "https://juejin.cn/");headers.put("Upgrade-Insecure-Requests", "1");headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");List<JueJinAssignAccountPO> accountPOList = jueJinAssignAccountDao.selectAll();String today = SIMPLE_DATE_FORMAT.format(new Date());log.info("掘金任务开始,本次共:{} 个账号需要处理", accountPOList.size());for (JueJinAssignAccountPO jueJinAssignAccountPO : accountPOList) {log.info("开始处理账号:{}", jueJinAssignAccountPO.getRemark());if (jueJinAssignAccountPO.getLastAssignTime() != null) {String lastAssignTime = SIMPLE_DATE_FORMAT.format(jueJinAssignAccountPO.getLastAssignTime());if (lastAssignTime.equals(today)) {log.info("账号:{} 今日已签到", jueJinAssignAccountPO.getRemark());continue;}}headers.put("cookie", jueJinAssignAccountPO.getCookie());// 签到assign(jueJinAssignAccountPO, headers);// 抽奖lottery(jueJinAssignAccountPO, headers);// 获取矿石数量getOreCount(jueJinAssignAccountPO, headers);// 更新jueJinAssignAccountDao.updateByPrimaryKey(jueJinAssignAccountPO);log.info("处理账号完毕:{}", jueJinAssignAccountPO.getRemark());}log.info("掘金任务结束");}/*** 签到** @param accountPO* @param headers*/private void assign(JueJinAssignAccountPO accountPO, Map<String, String> headers) {try {log.info("开始掘金签到");String assignResult = HttpUtils.post(ASSIGN_URL, "{}", headers, HttpUtils.JSON);log.info("掘金签到结果: {}", assignResult);JueJinResp jueJinResp = GsonUtils.fromJson(assignResult, JueJinResp.class);if (jueJinResp.getErrNo() == 0) {// 签到成功,设置最后一次签到时间为今天accountPO.setLastAssignTime(new Date());}} catch (Exception e) {log.error("掘金签到失败", e);}}/*** 抽奖** @param accountPO* @param headers*/private void lottery(JueJinAssignAccountPO accountPO, Map<String, String> headers) {try {log.info("开始掘金抽奖");String freeLotteryResult = HttpUtils.get(FREE_LOTTERY_URL, headers);log.info("掘金抽奖次数:{}", freeLotteryResult);JueJinResp<FreeLotteryResp> freeLotteryResp = GsonUtils.fromJson(freeLotteryResult, new TypeToken<JueJinResp<FreeLotteryResp>>() {}.getType());if (freeLotteryResp.getErrNo() != 0) {log.info("获取免费抽奖次数失败");return;}if (freeLotteryResp.getData().getFreeCount() <= 0) {log.info("没有免费抽奖次数");return;}// 开始抽奖String lotteryResult = HttpUtils.post(LOTTERY_URL, "{}", headers, HttpUtils.JSON);log.info("抽奖结果:{}", lotteryResult);} catch (Exception e) {log.error("掘金抽奖失败", e);}}/*** 更新矿石数量** @param accountPO* @param headers*/private void getOreCount(JueJinAssignAccountPO accountPO, Map<String, String> headers) {try {String oreCountStr = HttpUtils.get(ORE_COUNT_URL, headers);JueJinResp<Long> resp = GsonUtils.fromJson(oreCountStr, new TypeToken<JueJinResp<Long>>() {}.getType());if (resp.getErrNo() == 0) {accountPO.setOreCount(resp.getData());}} catch (Exception e) {log.error("获取矿石数量异常", e);}}}
  • 运行效果

Java实现掘金自动签到、免费抽奖相关推荐

  1. 掘金社区自动签到+免费抽奖

    分析页面 首先所有的自动化都是拟人操作,只需要模拟出正常的签到步骤并定时重复即可满足需求. 获取登录状态 签到总要知道是哪个用户签的嘛,所以所有的请求都要带上用户登录标识,也就是在header中添加对 ...

  2. 基于 Selenium 掘金自动签到、抽奖的定时任务

    项目地址:https://github.com/tomoyachen/juejin-signin 更新日志: 2022-02-20 自动浏览首页文章 2022-01-28 增加 7 天内过期通知 20 ...

  3. [奶奶看了都会]掘金自动签到-Java版本

    掘金是稀土下面的一个板块,主要是技术博客网站,每日的自动签到可以拿到矿石,矿石能干嘛呢,当然是换真实的物品啊,如下,小卷感觉switch肯定是遥遥无期了,只想攒点矿石换个睡枕,让小卷在卷别人的时候还能 ...

  4. 03.青龙面板——掘金自动签到、沾喜气、抽奖

    青龙面板--掘金自动签到.沾喜气.抽奖 注意:因为掘金社区规则改变,如果连续14天自动签到未在手机端登录可能会进小黑屋,具体规则请移步掘金社区 大佬项目地址:https://github.com/le ...

  5. 图文解释Glados自动签到免费获取天数(腾讯云函数serverless版)

    我在上一篇文章中介绍了如何使用github action来实现glados的自动签到的方法,但对github不太熟悉的同学来说步骤有点多,而且全是英文看起来费劲.接下来我又捣鼓了一下使用腾讯云函数的做 ...

  6. 图文解释Glados自动签到免费获取天数(github action版)

    简介 首次输入邀请码注册免费获得3天,绑定教育邮箱获得360天,每天签到获得1天.本文教大家如何通过脚本自动签到,并自动推送结果到微信上.每步都配了截图,小白也能做. 注册GLaDOS 注册地址: 在 ...

  7. Python + GitHub Actions 实现 CSDN 自动签到与抽奖(非 selenium 版本)

    文章目录 [1x00]技术栈 [2x00]代码实现签到与抽奖 [3x00]签到结果通知 [03x01]Server 酱 [03x02]企业微信 [03x03]钉钉 [4x00]自动签到 [5x00]完 ...

  8. 掘金自动签到成功后推送到一封传话

    前言 最近注册了掘金账号,按照网上大神们的介绍,签到和做任务可以累积矿石,可以兑换实物和道具.网上有使用Github Actions自动实现签到.自动做任务的node项目,直接fork后,填写掘金的c ...

  9. 【掘金 - 自动签到功能的实现】 - 让我们使用【ios/iphone 快捷指令自动化】实现一个社区每天自动签到小脚本

    准备工作 一台能够正常使用的苹果手机 快捷指令自动化功能 配置自动化信息 打开手机的[快捷指令] - 底部[自动化]-点击右上角[+]-点击[创建个人自动化] 第二步 然后我们点击[充电器]进去- 然 ...

最新文章

  1. python是不是特别垃圾-深度解析Python垃圾回收机制(超级详细)
  2. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )
  3. php mysql实现每日签到积分_php+mysql+jquery实现日历签到功能
  4. java excel 超链接_Java 编辑、删除Excel中的超链接
  5. How to: Configure an Azure SQL Database firewall using the Azure Portal
  6. 如何利用 JConsole观察分析Java程序的运行,进行排错调优(转)
  7. C#之Bcd码时间转成ToDateTime
  8. 自己整理的90分以上最新物联网技术导论期末选择填空大题总考点
  9. 投简历 找工作 App
  10. 计算机在化学中的应用免费论文,计算机在化学化工中的应用
  11. 【ROS入门21讲】订阅者Subscriber的编程使用
  12. java+桌球小游戏图片_Java桌球小游戏
  13. CLIP模型的使用和训练-利用CLIP实现zero-shot的分类任务
  14. 第2关:比较、掩码和布尔逻辑
  15. H5_0021:判断平台和微信
  16. linux sqlite图形工具,SQLite 图形化管理工具
  17. 程序员的工资被严重高估?
  18. 驱动led --GPIO控制
  19. 发电厂兰吉尔电表数据采集方案-IEC62056/DLMS/COSEM协议采集网关驱动配置说明
  20. 方队 - 启发式合并 - 主席树

热门文章

  1. pycharm配置python环境变量详细步骤
  2. Aleo提供的zkCloud:去中心化隐私计算
  3. 强烈推荐一波高质量的公众号,全是圈内大佬!
  4. thinkadmin验证器与场景验证
  5. Postman查看Elasticsearch自带的分词器效果
  6. 【python遍历图片进行分类转存到不同的文件夹】
  7. 百度无人驾驶出租车正式上路
  8. 中年人的焦虑:竟然是看不懂年轻人,被时代淘汰
  9. 让border、padding等不改变原本宽度
  10. 实习笔记 —— SSM三个框架的整合 III (对后台管理页面进行编写)