【掘金自动签到】有手就行的自动化签到工具

简介: 掘金社区签到拿矿石能兑换礼品,每天签到又怕遗忘,搞个脚本每天自动签到岂不美哉~

分析页面


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

获取登录状态

  • 签到总要知道是哪个用户签的嘛,所以所有的请求都要带上用户登录标识,也就是在header中添加对应的cookie
  • 如何获取cookie呢,这里看了下掘金的登录请求还比较麻烦,对熟悉爬虫的同学可能小菜一碟,对后端来说虽然能做但是本着投入时间与收益的原则,我毅然决然的选择绕过登录,直接拦截请求把request header的cookie复制出来。
  • 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@SpringBootApplicationpublicclassSignApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(SignApplication.class, args);
    }
}

整体的骨架就这么简单。


通用http方法

publicstaticStringcommonReuqest(Stringurl, Stringmethod, Stringcookie) throwsException {
URLserverUrl=newURL(url);
HttpURLConnectionconn= (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();
Stringresult=getReturn(conn);
returnresult;
    }
/*请求url获取返回的内容*/publicstaticStringgetReturn(HttpURLConnectionconnection) throwsIOException {
StringBufferbuffer=newStringBuffer();
//将返回的输入流转换成字符串try (InputStreaminputStream=connection.getInputStream();
InputStreamReaderinputStreamReader=newInputStreamReader(inputStream);
BufferedReaderbufferedReader=newBufferedReader(inputStreamReader);) {
Stringstr=null;
while ((str=bufferedReader.readLine()) !=null) {
buffer.append(str);
            }
Stringresult=buffer.toString();
returnresult;
        }
    }

封装成一个util类,入口加上cookie即可。


邮箱逻辑

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@Slf4jpublicclassSendMailServiceImplimplementsSendMailService {
@AutowiredprivateJavaMailSenderjavaMailSender;
@Value("${spring.mail.username}")
privateStringsendMailer;
publicvoidcheckMail(MailRequestmailRequest) {
Assert.notNull(mailRequest,"邮件请求不能为空");
Assert.notNull(mailRequest.getSendTo(), "邮件收件人不能为空");
Assert.notNull(mailRequest.getSubject(), "邮件主题不能为空");
Assert.notNull(mailRequest.getText(), "邮件收件人不能为空");
    }
@OverridepublicvoidsendMail(MailRequestmailRequest) {
SimpleMailMessagemessage=newSimpleMailMessage();
checkMail(mailRequest);
//邮件发件人message.setFrom(sendMailer);
//邮件收件人 1或多个message.setTo(mailRequest.getSendTo().split(","));
//邮件主题message.setSubject(mailRequest.getSubject());
//邮件内容message.setText(mailRequest.getText());
//邮件发送时间message.setSentDate(newDate());
//        JavaMailSender javaMailSender = new JavaMailSenderImpl();javaMailSender.send(message);
log.info("发送邮件成功:{}->{}",sendMailer,mailRequest.getSendTo());
    }
}

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



签到请求

@Slf4j@ServicepublicclassActionService {
//签到publicstaticfinalStringCHECK_IN="https://api.juejin.cn/growth_api/v1/check_in";
//抽奖publicstaticfinalStringDRAW="https://api.juejin.cn/growth_api/v1/lottery/draw";
@Value("${spring.mail.username}")
privateStringusername;
@AutowiredSendMailServicesendMailService;
/*** 签到*/publicvoidcheckIn(Stringcookie) throwsException {
Stringresponse=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"));
// 推送失败消息MailRequestmailRequest=newMailRequest();
mailRequest.setText("掘金签到失败!err_msg: "+resultMap.get("err_msg"));
mailRequest.setSendTo(username);
mailRequest.setSubject("juejin sign");
sendMailService.sendMail(mailRequest);
        }
    }
/*** 抽奖*/publicvoiddraw(Stringcookie) throwsException {
Stringresponse=BaseRequest.commonReuqest(DRAW, "POST", cookie);
DrawResponcedata=JSON.parseObject(response,newTypeReference<DrawResponce>(){});
log.info(response);
    }
}

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


定时任务

@Slf4j@Componentpublicclasstask {
@Value("${uptown.cookie}")
Stringcookie;
@ResourceActionServiceactionService;
@Scheduled(cron="0 0 5 * * ?")
publicvoidrun() throwsException {
log.info("{} start!", newSimpleDateFormat("yyyy-MM-dd").format(newDate()));
this.actionService.checkIn(cookie);
// 第一次免费抽奖this.actionService.draw(cookie);
    }
}

最后加上定时任务就完事了,每天5点签到,签到失败发邮箱提醒。直接打包扔服务器上大功告成~




相关文章
|
22天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
2月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
73 3
|
2月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
66 4
|
2月前
|
运维 Linux Apache
Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例
【10月更文挑战第8天】本文介绍了Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例。Puppet通过定义资源状态和关系,确保系统配置始终如一,支持高效管理基础设施。文章详细讲解了Puppet的安装步骤、配置方法及DSL语言示例,帮助读者快速掌握Puppet的使用技巧。
86 2
|
2月前
|
监控 虚拟化 云计算
从物理到云:使用自动化工具简化服务器迁移流程
【10月更文挑战第4天】随着云计算的快速发展,越来越多的企业选择将物理服务器迁移到云环境以提高效率和降低成本。本文详细介绍了使用自动化工具简化从物理到云的服务器迁移流程的技术实现细节,并提供了代码示例。
158 6
|
15天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
104 17
Selenium:强大的 Web 自动化测试工具
|
20天前
|
运维 Kubernetes Devops
自动化运维:从脚本到工具的演进之旅
在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
1月前
|
机器学习/深度学习 人工智能 运维
自动化运维之路:从脚本到工具的演进
在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
|
1月前
|
JavaScript 前端开发 开发者
探索 DrissionPage: 强大的Python网页自动化工具
DrissionPage 是一个基于 Python 的网页自动化工具,结合了浏览器自动化的便利性和 requests 库的高效率。它提供三种页面对象:ChromiumPage、WebPage 和 SessionPage,分别适用于不同的使用场景,帮助开发者高效完成网页自动化任务。
135 4
|
1月前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。