吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3583|回复: 74
收起左侧

[其他原创] 用GitHubAction实现阿里云盘自动打卡

  [复制链接]
Dellevin 发表于 2023-7-25 21:35
本帖最后由 Dellevin 于 2023-9-3 10:37 编辑

开门见山,针对程序员来说,如果每天都手动签到岂不是很费力,昨天和我同学闲聊的时候,发现他在用py实现各种签到的打卡,看的我是狠狠的抽自己脸,怎么能手动打卡呢!!!尊严何在?

因为上个月在吾爱上看见一个zhuoxin99大佬发了一个某盘签到的一个java项目,今天正好心血来潮准备改改修修补补的。因为对GitHub的Action没有什么了解,所以有点怵头。修修补补最终是弄好了

项目地址:https://github.com/dellevin/ToDoTaskForGithubAction

后续添加其他签到的东东,并添加邮件推送
2023年9月3日更新:
更新了阿里云盘的自动签到的脚本,又能用了嗷兄弟们

public class aLiTest {
    private static final String updateAccesssTokenURL = "https://auth.aliyundrive.com/v2/account/token";
    private static final String signinURL = "https://member.aliyundrive.com/v2/activity/sign_in_list?_rx-s=mobile";
    private static final String rewardURL = "https://member.aliyundrive.com/v1/activity/sign_in_reward?_rx-s=mobile";
    private static final RestTemplate re = new RestTemplate();
    public static final HttpHeaders headers = new HttpHeaders();
    private static final String refresh_token = "";
    private static final StringBuffer sb = new StringBuffer();

    public static void main(String[] args) {
        headers.add("Content-Type", "application/json");

        JSONObject updateAccesssDate = new JSONObject();
        updateAccesssDate.put("grant_type", "refresh_token");
        updateAccesssDate.put("refresh_token", refresh_token);

        HttpEntity<String> updateAccesssDateEntity = new HttpEntity<String>(JSONObject.toJSONString(updateAccesssDate), headers);
        ResponseEntity<String> updateAccesssDateRep = null;
        try {
            updateAccesssDateRep = re.postForEntity(updateAccesssTokenURL, updateAccesssDateEntity, String.class);
        } catch (RestClientException e) {
            sb.append("提示 : TOKEN 失效,请更新 !");
            System.out.println(sb);
            return;
        }
        JSONObject UpdateAccesssTokenRep = JSONObject.parseObject(updateAccesssDateRep.getBody());
        sb.append("------------------获取个人信息成功--------------------" + "\n");
        sb.append("用户名 :" + UpdateAccesssTokenRep.getString("user_name") + "\n");

        headers.add("Authorization", UpdateAccesssTokenRep.getString("access_token"));
        JSONObject signinURLDate = new JSONObject();
        signinURLDate.put("isReward", false);
        HttpEntity<String> signinURLDateEntity = new HttpEntity<String>(JSONObject.toJSONString(signinURLDate), headers);
        ResponseEntity<String> signinURLDateRep = null;
        JSONObject signinURListRep = null;

        try {
            signinURLDateRep = re.postForEntity(signinURL, signinURLDateEntity, String.class);
            signinURListRep = JSONObject.parseObject(signinURLDateRep.getBody());
        } catch (RestClientException e) {
            sb.append("提示 : 签到列表获取失败 !");
            System.out.println(sb);
            return;
        }
        String signInCount = signinURListRep.getJSONObject("result").getString("signInCount");
        JSONArray signInLogs = signinURListRep.getJSONObject("result").getJSONArray("signInInfos");
        sb.append("------------------获取签到列表信息成功------------------" + "\n");
        sb.append("本月累计签到 :" + signInCount + "\n");
        JSONObject signDayInLogs = signInLogs.getJSONObject(Integer.valueOf(signInCount) - 1);
        for (int i = 0; i < signInLogs.size(); i++) {

            if (signInLogs.getJSONObject(i).getString("status").equals("normal") ) {
                final String day = signInLogs.getJSONObject(i).getString("day");
                JSONObject rewardDate = new JSONObject();
                rewardDate.put("signInDay", day);
                HttpEntity<String> rewardDateEntity = new HttpEntity<String>(rewardDate.toJSONString(), headers);
                ResponseEntity<String> rewardDateRep = null;
                JSONObject rewardListDateRep = null;
                try {
                    rewardDateRep = re.postForEntity(rewardURL, rewardDateEntity, String.class);
                    rewardListDateRep = JSONObject.parseObject(rewardDateRep.getBody());
                    if (rewardListDateRep.getString("success").equals("true")) {
                        sb.append("------------------奖励领取成功--------------------" + "\n");
                        sb.append("奖品名称 :" + rewardListDateRep.getJSONObject("result").getString("name") + "\n");
                        sb.append("奖品名称 :" + rewardListDateRep.getJSONObject("result").getString("description") + "\n");
                        sb.append("奖品名称 :" + rewardListDateRep.getJSONObject("result").getString("notice") + "\n");
                        System.out.println(sb);
                        return;
                    }
                } catch (RestClientException e) {
                    sb.append("提示 : 奖励领取失败 !");
                    System.out.println(sb);
                    return;
                }
            }
        }
        sb.append("------------------当天已领取奖励-------------------" + "\n");
        sb.append("奖品名称 :" + signDayInLogs.getJSONObject("reward").getString("name") + "\n");
        sb.append("奖品名称 :" + signDayInLogs.getJSONObject("reward").getString("description") + "\n");
        System.out.println(sb);
    }
}

2023年7月29日更新:
添加了掘金的签到打卡
支持了网易163邮箱stmp发送
e1ff191924b369e20c0bcd41840f45d.png

下面针对像我这样的技术小白说一下几个技术要点:

创建工作流

./github/workflows 的文件夹下面创建yml文件,文件名随便,后缀名一定是yml的格式

编写配置

下面贴一下我的完整配置

name: Java CI
on:
  schedule:
    - cron: "30 22 * * *"  # 北京时间上午06:30
  workflow_dispatch:   # 添加 workflow_dispatch 触发器,用于手动运行
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up JDK
      uses: actions/setup-java@v1
      with:
        java-version: '11' # 这里可以指定你需要的 Java 版本

    - name: Cache Maven packages
      uses: actions/cache@v2
      with:
        path: ~/.m2
        key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
        restore-keys: ${{ runner.os }}-m2

    - name: Build with Maven
      run: mvn -B package --file pom.xml   # 使用 Maven 进行项目构建,可以根据你的项目需要修改命令

    - name: run Java Application
      run: |
        java -Djava.security.manager -Djava.security.policy==src/main/resources/policy.policy -jar  target/ToDoTask.jar
      # 附带权限加载运行程序
      env:
        REFRESH_TOKEN: ${{ secrets.REFRESH_TOKEN }}

name: Java CI表示我的工作流叫做Java CI

on里面我就不写了,已经打注释了

接下来是重头戏是job里面的东西们

runs-on: ubuntu-latest表示我在这个ubuntu的系统上运行的(一个linux系统)

build任务首先做checkout代码操作。

接下来是构建步骤,

- name 表示我这个步骤叫什么名

下面表示我是java11版本运行的

uses: actions/setup-java@v1
      with:
        java-version: '11' # 这里可以指定你需要的 Java 版本

这一步表示 缓存Maven本地包,加速构建,避免了每次运行都要下载maven里面引入的包(ps:我是看别人写的copy过来的)

    - name: Cache Maven packages
      uses: actions/cache@v2
      with:
        path: ~/.m2
        key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
        restore-keys: ${{ runner.os }}-m2

使用Maven进行项目打包构建。

- name: Build with Maven
  run: mvn -B package --file pom.xml   # 使用 Maven 进行项目构建,可以根据你的项目需要修改命令

最后调用Java命令运行打包生成的JAR文件

- name: run Java Application
  run: |
    java -Djava.security.manager -Djava.security.policy==src/main/resources/policy.policy -jar  target/ToDoTask.jar
  # 附带权限加载运行程序
  env:
    REFRESH_TOKEN: ${{ secrets.REFRESH_TOKEN }}

其中-Djava.security.manager -Djava.security.policy==src/main/resources/policy.policy的作用是设置权限,让github设置的screct传入进来,也就是传入到ToDoTask类里面的private static final String refresh_token = System.getenv("REFRESH_TOKEN");里面,其中System.getenv("REFRESH_TOKEN")就是用来获取GitHub设置的screct的,通过yml配置文件里面的,

  env:
    REFRESH_TOKEN: ${{ secrets.REFRESH_TOKEN }}

进行传入,如果不加入-Djava.security.manager -Djava.security.policy==src/main/resources/policy.policy这句话的话refresh_token 获取的一直是null。。。。。

因为我每次运行都是各种权限错误,运行一次加一次,最后索性在policy文件下面加了一个permission java.security.AllPermission;释放所有权限

报错log(部分)

----1
Error: Exception in thread "main" java.lang.IllegalStateException: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getProtectionDomain")
----2
access denied ("java.lang.RuntimePermission" "setFactory")
----3
access denied ("java.util.PropertyPermission" "java.protocol.handler.pkgs" "read")
----4
access denied ("java.util.PropertyPermission" "java.protocol.handler.pkgs" "write")
----5
access denied ("java.lang.RuntimePermission" "getProtectionDomain")

然后好多权限报错问题,运行一次报一次。。。。。。

yml配置之 项目切忌class方式运行

一开始我是懵的,创建的是springboot的项目,然后就要编写如何运行java文件的东西,一开始我选择的是采用直接编译java文件运行class类的方式。

这种方式是大错特错的,因为是项目的原因,必须要引入这个

name: Build with Maven
run: mvn -B package --file pom.xml 

pom配置之 一定要加bulid

也就是说一定要加入下面这段,finalName标签是必须要的,因为是打包成一个jar包运行的是一个jar包,你不加finalName人家都不知道运行啥,运行class文件吗,别搞笑了。

另外plugins标签里面也一定要加上,因为该插件提供了打包和运行Spring Boot项目的能力。添加这个插件后可以直接使用mvn spring-boot:run来运行Spring Boot应用,我不加上无法运行jar包。。。。

<build>
    <!--    打包后的文件名-->
    <finalName>ToDoTask</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

java文件之获取传入进来的token

我一直好奇的是REFRESH_TOKEN: ${{ secrets.REFRESH_TOKEN }}这段是如何传入进来的,结果百度无果之后果断问了gpt,他告诉我用System.getenv("REFRESH_TOKEN")接收就好(ps:gpt真厉害)。在我运行工作流之后,发现token是null,很明显是没传入进来嘛,然后又去问,他告诉我要设置权限,也就是上面提到的哪些。。。。这样下来,最终是完成了这个

其中

env:
    REFRESH_TOKEN: ${{ secrets.REFRESH_TOKEN }}

这一段你要放在外面就是全局变量,你要放在里面就是局部变量

注意

Github Action对于公有仓库是免费的,对于私有仓库用户提供了一定的免费额度:

  • 对于运行在Linux上的作业,github提供了2000分钟的免费额度;
  • Github提供了10G免费的缓存,并且会对7天内未被访问的key进行删除;
  • 以上的使用限额,会在每个月进行重置;

免费评分

参与人数 9吾爱币 +4 热心值 +9 收起 理由
love008 + 1 + 1 优秀的普文,有注释!
minghas + 1 热心回复!
qingfengvvv + 1 + 1 谢谢@Thanks!
XJCQ2014 + 1 + 1 用心讨论,共获提升!
gxdyxh + 1 感谢~ 有没有其他语言的?
5omggx + 1 + 1 用心讨论,共获提升!
zwhhyj + 1 我很赞同!
yeahsyan + 1 谢谢@Thanks!
Caiy + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ttspop 发表于 2023-7-25 22:33
看到问GPT要代码,绝了
littleworm 发表于 2023-7-26 09:04
最近好多人搞这个阿里云自动打卡,昨天才学完金山文档实现自动打卡,今天又可以再学一个
要是阿里云盘打卡增加容量就好了······哎
COD19 发表于 2023-7-25 21:53
wapj22 发表于 2023-7-25 22:13
会编程真好
 楼主| Dellevin 发表于 2023-7-25 22:16

我也是小白,看bilibili自学的
violetlilac 发表于 2023-7-25 22:27
代码熟练了真好,能够自己写
梁茵 发表于 2023-7-25 22:31
最近好多人搞这个阿里云自动打卡,昨天才学完金山文档实现自动打卡,今天又可以再学一个
NewShowTime 发表于 2023-7-25 22:34
能自己做出来,并运行
Aim灬血饮 发表于 2023-7-25 22:55
感谢分享
lzspain 发表于 2023-7-25 22:57
在用这种操作白嫖Microsoft365
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表