分析页面

首先所有的自动化都是拟人操作,只需要模拟出正常的签到步骤并定时重复即可满足需求。

获取登录状态

  • 签到总要知道是哪个用户签的嘛,所以所有的请求都要带上用户登录标识,也就是在header中添加对应的cookie
  • 如何获取cookie呢,这里看了下掘金的登录请求还比较麻烦,对熟悉爬虫的同学可能小菜一碟,对后端来说虽然能做但是本着投入时间与收益的原则,我毅然决然的选择绕过登录,直接拦截请求把request header的cookie复制出来。
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hrACs4W2-1665316799526)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/88660b222a284cc18302a4679346a624~tplv-k3u1fbpfcp-zoom-1.image “image.png”)]

处理cookie失效

  • 没有登录逻辑的话等cookie失效签到请求会返回请登录,这里话通过邮箱提醒更换cookie也是可以接受的

处理https请求

  • 随便从网上找一个http方法即可

落地方案

为了快速满足直接用最熟悉的Java+SpringBoot撸出来个jar包,打开IDEA创建SpringBoot脚手架

创建脚手架

pom里直接引入springboot-web、springboot-mail、lombok、fastjson,版本管理直接继承下spring-boot-dependencies。

   <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.3</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.41</version></dependency></dependencies>

启动类上添加@EnableScheduling注解开启定时任务

@EnableScheduling
@SpringBootApplication
public class SignApplication {public static void main(String[] args) {SpringApplication.run(SignApplication.class, args);}
}

整体的骨架就这么简单。

通用http方法

 public static String commonReuqest(String url, String method, String cookie) throws Exception {URL serverUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection();conn.setRequestMethod(method);conn.setRequestProperty("Content-type", "application/json");conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36");conn.setRequestProperty("Cookie", cookie);//必须设置false,否则会自动redirect到重定向后的地址conn.setInstanceFollowRedirects(false);conn.connect();String result = getReturn(conn);return result;}/*请求url获取返回的内容*/public static String getReturn(HttpURLConnection connection) throws IOException {StringBuffer buffer = new StringBuffer();//将返回的输入流转换成字符串try (InputStream inputStream = connection.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) {String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}String result = buffer.toString();return result;}}

封装成一个util类,入口加上cookie即可,这里直接从网上找了个方法。

邮箱逻辑

  • 如何开启smtp邮箱服务就不说了,这里直接贴一下教程https://blog.csdn.net/weixin_46822367/article/details/123893527
  • yml配置里需要配置上必要信息,授权码按照上述博客中的步骤获取。
spring:mail:host: smtp.qq.com#发送者邮箱username: #申请到的授权码password: #端口号465或587port: 587#默认的邮件编码为UTF-8default-encoding: UTF-8#其他参数properties:mail:#配置SSL 加密工厂smtp:ssl:#本地测试,先放开sslenable: falserequired: false#开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误debug: true
  • 邮箱业务类

@Service
@Slf4j
public class SendMailServiceImpl implements SendMailService {@Autowiredprivate JavaMailSender javaMailSender;@Value("${spring.mail.username}")private String sendMailer;public void checkMail(MailRequest mailRequest) {Assert.notNull(mailRequest,"邮件请求不能为空");Assert.notNull(mailRequest.getSendTo(), "邮件收件人不能为空");Assert.notNull(mailRequest.getSubject(), "邮件主题不能为空");Assert.notNull(mailRequest.getText(), "邮件收件人不能为空");}@Overridepublic void sendMail(MailRequest mailRequest) {SimpleMailMessage message = new SimpleMailMessage();checkMail(mailRequest);//邮件发件人message.setFrom(sendMailer);//邮件收件人 1或多个message.setTo(mailRequest.getSendTo().split(","));//邮件主题message.setSubject(mailRequest.getSubject());//邮件内容message.setText(mailRequest.getText());//邮件发送时间message.setSentDate(new Date());//        JavaMailSender javaMailSender = new JavaMailSenderImpl();javaMailSender.send(message);log.info("发送邮件成功:{}->{}",sendMailer,mailRequest.getSendTo());}}

JavaMailSender为spring-boot-starter-mail依赖中封装好的业务类,yml中添加对应的配置该类会被注入到容器中。

签到请求

@Slf4j
@Service
public class ActionService {//签到public static final String CHECK_IN = "https://api.juejin.cn/growth_api/v1/check_in";//抽奖public static final String DRAW = "https://api.juejin.cn/growth_api/v1/lottery/draw";@Value("${spring.mail.username}")private String username;@AutowiredSendMailService sendMailService;/*** 签到*/public void checkIn(String cookie) throws Exception {String response = BaseRequest.commonReuqest(CHECK_IN, "POST", cookie);log.info("get result from juejin {}", response);Map<String, Object> resultMap = JSONObject.parseObject(response, Map.class);if((Integer) resultMap.get("err_no") != 0){log.error((String) resultMap.get("err_msg"));// 推送失败消息MailRequest mailRequest = new MailRequest();mailRequest.setText("掘金签到失败!err_msg: " + resultMap.get("err_msg"));mailRequest.setSendTo(username);mailRequest.setSubject("juejin sign");sendMailService.sendMail(mailRequest);}}/*** 抽奖*/public void draw(String cookie) throws Exception {String response = BaseRequest.commonReuqest(DRAW, "POST", cookie);DrawResponce data= JSON.parseObject(response,new TypeReference<DrawResponce>(){});log.info(response);}}

签到请求和抽奖请求都很简单没有参数,带上cookie发一下矿石就到账了,每天第一次抽奖不花矿石,默认第一次抽一下。签到成功就不发邮箱了发多了烦,签到失败会把失败原因发送到配置的邮箱内。

实体类

@NoArgsConstructor
@Data
public class DrawResponce {@JsonProperty("err_no")private Integer errNo;@JsonProperty("err_msg")private String errMsg;@JsonProperty("data")private DataDTO data;@NoArgsConstructor@Datapublic static class DataDTO {@JsonProperty("id")private Integer id;@JsonProperty("lottery_id")private String lotteryId;@JsonProperty("lottery_name")private String lotteryName;@JsonProperty("lottery_type")private Integer lotteryType;@JsonProperty("lottery_image")private String lotteryImage;@JsonProperty("history_id")private String historyId;}
}
@Data
public class MailRequest implements Serializable {/*** 接收人*/private String sendTo;/***  邮件主题*/private String subject;/***  邮件内容*/private String text;/***  附件路径*/private String filePath;
}
@Configuration
@ConfigurationProperties(prefix = "uptown")
@Data
public class Users {List<String> cookies;
}

定时任务

@Slf4j
@Component
public class task {@Value("${uptown.cookie}")String cookie;@ResourceActionService actionService;@Scheduled(cron = "0 0 5 * * ?")public void run() throws Exception {log.info("{} start!", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));this.actionService.checkIn(cookie);// 第一次免费抽奖this.actionService.draw(cookie);}
}

最后加上定时任务就完事了,每天5点签到,签到失败发邮箱提醒。用maven打个包放到服务器上nohup java -jar *.jar &

只需要半小时就可以往后只需要通过邮箱提醒处理cookie失效或失败的情况。

掘金社区自动签到+免费抽奖相关推荐

  1. 线程池+jsoup+htmlclient实现微博超话社区自动签到

    java线程池+jsoup+htmlunit实现微博超话社区自动签到 这是个半夜闲没事写的一个爬虫,所以很多命名可能有点不大好,哈哈,请见谅,程序能运行就行

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

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

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

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

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

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

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

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

  6. Java实现掘金自动签到、免费抽奖

    此文章最先发表于我的个人博客,CSDN为同步发布,如有需要,请访问 腿短快跑的个人博客 获取更多内容 hello,大家好啊,最近我正在将文章同步到各大平台,在使用掘金的过程中发现掘金是可以每天签到领矿 ...

  7. 天翼云盘每天自动签到抽奖领空间 每月至少扩容3G+

    原创文|Space9 背景 天翼云盘官方活动,每天签到和抽奖会获得100多MB云盘空间,每月即可获得3GB多空间.(此活动在最新版手机客户端可见)我们可以通过以下教程来完成每天自动签到和抽奖,增加生产 ...

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

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

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

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

最新文章

  1. 审核中负利率加无现金社会 比特币将何去何从?
  2. linux下备份mssql文件,linux服务器怎么定时备份mysql的sql文件数据
  3. python 图像数据类型及颜色空间转换
  4. 【NLP】 深入浅出解析BERT原理及其表征的内容
  5. 使用Java程序通过http post访问Application server
  6. 使用Visual Studio Code编写和激活ABAP代码 (上)
  7. maven 镜像_Maven(一)
  8. arch 安装准备--包管理的使用pacman
  9. mysql int 转string_mysql的这些坑你踩过吗?快来看看怎么优化mysql
  10. vue el-tree 同时向后台传递选中和半选节点数据 (回显数据勾选问题已解决)
  11. Chapter 1: 使用引用类型
  12. paip.转账功能设计流程
  13. 古风素材无水印免费下载
  14. 用SET工具包制作钓鱼网站
  15. 在window10中怎样连接扫描仪,扫描证件
  16. 湛江景点旅游攻略!究竟有哪些你不容错过的景点?
  17. 2021年美容师(初级)考试内容及美容师(初级)实操考试视频
  18. Android 媒体播放框架MediaSession分析与实践
  19. python从小白到大牛百度云盘_Python从小白到大牛
  20. 网页版音频播放器,歌词随音乐而动

热门文章

  1. 西子奥的斯电梯服务器使用教程方法_OTIS电梯服务器简单使用说明
  2. 2022-2028全球与中国公共行业微电网市场现状及未来发展趋势
  3. TensorFlow.js实现商标识别
  4. 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
  5. 2022长春理工大学计算机之科技大厦
  6. 5G移动网络加速来临 2019年或可商用
  7. 新浪云-swiper 响应式页面
  8. 同一进程的线程共享的资源和独有的资源
  9. HTML5 Canvas 动态勾画等速螺线
  10. 58集团2017校招笔试-前端岗