Skip to content
This repository was archived by the owner on Dec 4, 2023. It is now read-only.

Commit 459f122

Browse files
committed
Fix bugs for #11
1 parent c908ea1 commit 459f122

File tree

12 files changed

+146
-75
lines changed

12 files changed

+146
-75
lines changed

.github/workflows/schedule.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
branches: [ main ]
88
schedule:
99
# 东八区09:00,约莫有延时10~20,看github服务器情况
10-
- cron: ' 0 1 * * *'
10+
- cron: '0 1 * * *'
1111

1212
# 当star当前仓库时立即执行
1313
watch:
@@ -59,4 +59,5 @@ jobs:
5959
AUTOCARD_PWD: ${{ secrets.AUTOCARD_PWD }}
6060
AUTOCARD_DINGTALK_URL: ${{ secrets.AUTOCARD_DINGTALK_URL }}
6161
AUTOCARD_DINGTALK_SECRET: ${{ secrets.AUTOCARD_DINGTALK_SECRET }}
62+
AUTOCARD_MAX_TRIAL: ${{ secrets.AUTOCARD_MAX_TRIAL }}
6263
run: cd action && java --add-opens java.base/java.lang=ALL-UNNAMED -jar autocard.jar --app.autoCard.immediate=true

README.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@
7777
// 钉钉机器人webhook 签名,如果没有可以不配置
7878
"dingtalksecret": "SEC****",
7979
//任务开启随机延时0-1800秒
80-
"delay":true
80+
"delay":true,
81+
//任务最大重试次数,默认为3
82+
"maxtrial": 3
8183
},
8284
{
8385
//打卡的通行证账号2
@@ -149,6 +151,7 @@ Fork本项目(右上角,喜欢的小伙伴麻烦顺手点star支持一下)
149151
- **AUTOCARD_DINGTALK_SECRET** 打卡的钉钉推送密钥
150152
- **AUTOCARD_DELAY** 是否随机延迟打卡
151153
- **AUTOCARD_CACHE_FLAG** 用于程序缓存输出提供一个索引,任意值即可,例如设为1
154+
- **AUTOCARD_MAX_TRIAL** 打卡失败最大重试次数,默认是3次
152155

153156
上述环境变量与前述配置文件的参数对应。AutoCard会读取这些环境变量,配置打卡用户。其相较于配置文件的优点在于,配置文件是在github开源显示的,二上述环境变量是加密的。但不支持多个账号配置。
154157
![github环境变量](templete/env.png)
@@ -237,6 +240,8 @@ powershell build.ps1 ## windows
237240
若打卡题目被更新或者你的任何信息情况有变化(如返校),请先手动打卡一次。本项目仅供学习参考。使用时请确保信息的正确性。滥用造成的后果请自行承担。
238241

239242
## 八、更新记录
243+
### v1.4.6
244+
修复了相关[issue](https://github.com/GCS-ZHN/AutoCard/issues/11),支持了设置最大重试次数。
240245
### v1.4.5
241246
修复了在获取照片异常时引起的空指针异常。
242247

action/autocard.jar

702 Bytes
Binary file not shown.

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>org.gcszhn</groupId>
66
<artifactId>autocard</artifactId>
7-
<version>1.4.5</version>
7+
<version>1.4.6</version>
88
<packaging>jar</packaging>
99

1010
<name>Auto Heathy Report for Zhejiang University</name>

src/main/java/org/gcszhn/autocard/AppConfig.java

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public void setEnvironment(Environment env) {
8787
global_user.put("dingtalkurl", System.getenv("AUTOCARD_DINGTALK_URL"));
8888
global_user.put("dingtalksecret", System.getenv("AUTOCARD_DINGTALK_SECRET"));
8989
global_user.put("delay", System.getenv("AUTOCARD_DELAY") != null);
90+
global_user.put("maxtrial", System.getenv("AUTOCARD_MAX_TRIAL"));
9091
appConfig.getJSONArray("jobs").add(global_user);
9192
}
9293

src/main/java/org/gcszhn/autocard/service/AutoCardJob.java

+28-13
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.gcszhn.autocard.service;
1717

18+
import java.util.Optional;
19+
1820
import org.gcszhn.autocard.utils.LogUtils;
1921
import org.gcszhn.autocard.utils.SpringUtils;
2022
import org.gcszhn.autocard.utils.StatusCode;
@@ -26,9 +28,10 @@
2628
/**
2729
* 自动打卡的定时任务
2830
* @author Zhang.H.N
29-
* @version 1.1
31+
* @version 1.2
3032
*/
3133
public class AutoCardJob implements Job {
34+
private static final int DEFAULT_MAX_TRIAL = 3;
3235
@Override
3336
public void execute(JobExecutionContext context) throws JobExecutionException {
3437
try (AutoCardService cardService = SpringUtils.getBean(AutoCardService.class)) {
@@ -42,12 +45,16 @@ public static void execute(
4245
MailService mailService,
4346
AutoCardService cardService,
4447
DingTalkHookService dingTalkHookService) throws JobExecutionException {
48+
// 参数初始化
4549
boolean isDelay = dataMap.getBooleanValue("delay");
4650
String username = dataMap.getString("username");
4751
String password = dataMap.getString("password");
4852
String mail = dataMap.getString("mail");
4953
String dingtalkURL = dataMap.getString("dingtalkurl");
5054
String dingtalkSecret = dataMap.getString("dingtalksecret");
55+
int maxTrial = Optional.ofNullable(dataMap.getString("maxtrial"))
56+
.map((String value)->Integer.parseInt(value))
57+
.orElse(DEFAULT_MAX_TRIAL);
5158
//开启随机延迟,这样可以避免每次打卡时间过于固定
5259
try {
5360
if (isDelay) {
@@ -58,23 +65,31 @@ public static void execute(
5865
} catch (Exception e) {
5966
throw new JobExecutionException(e);
6067
}
61-
LogUtils.printMessage("自动打卡开始");
62-
// 三次打卡尝试,失败后发送邮件提示。
63-
int change = 3;
68+
6469
try {
70+
LogUtils.printMessage("自动打卡开始");
6571
if (username==null||password==null||username.isEmpty()||password.isEmpty())
6672
throw new NullPointerException("Empty username or password of zjupassport");
67-
//打卡
73+
6874
StatusCode statusCode = new StatusCode();
69-
while (change>0 && (statusCode = cardService.submit(username, password)).getStatus()==-1) {
70-
int delay = (4-change) * 10;
71-
LogUtils.printMessage(delay+"秒后再次尝试",
72-
LogUtils.Level.ERROR);
73-
Thread.sleep(delay * 1000);
74-
change--;
75+
int trial = maxTrial;
76+
LOOP: while (trial > 0) {
77+
statusCode = cardService.submit(username, password);
78+
switch(statusCode.getStatus()) {
79+
case 0:
80+
case 1: {break LOOP;}
81+
default: {
82+
int delay = (maxTrial - trial + 1) * 10;
83+
LogUtils.printMessage(delay+"秒后再次尝试",
84+
LogUtils.Level.ERROR);
85+
Thread.sleep(delay * 1000);
86+
trial--;
87+
}
88+
}
89+
7590
}
76-
if (change==0) {
77-
LogUtils.printMessage("打卡尝试失败3次 " + username,
91+
if (trial == 0) {
92+
LogUtils.printMessage(String.format("%s打卡尝试失败%d次", username, maxTrial),
7893
LogUtils.Level.ERROR);
7994
}
8095

src/main/java/org/gcszhn/autocard/service/AutoCardService.java

+60-41
Original file line numberDiff line numberDiff line change
@@ -187,51 +187,70 @@ public ArrayList<NameValuePair> getOldInfo(String username, String password) {
187187
*/
188188
public StatusCode submit(String username, String password) {
189189
StatusCode statusCode = new StatusCode();
190-
LogUtils.printMessage("准备提交打卡 " + username);
191-
ArrayList<NameValuePair> info = getOldInfo(username, password);
192-
if (info==null) {
193-
LogUtils.printMessage("打卡信息获取失败", LogUtils.Level.ERROR);
194-
statusCode.setMessage(username+"的打卡信息获取失败,可能是打卡更新了或网络不稳定,请查看后台打卡日志输出");
195-
statusCode.setStatus(-1);
196-
return statusCode;
197-
}
198-
String area = null;
199-
for (NameValuePair pair: info) {
200-
if (pair.getName().equals("area")) {
201-
area = pair.getValue();
202-
break;
190+
try {
191+
LogUtils.printMessage("准备提交打卡 " + username);
192+
ArrayList<NameValuePair> info = getOldInfo(username, password);
193+
if (info==null) {
194+
LogUtils.printMessage("打卡信息获取失败", LogUtils.Level.ERROR);
195+
statusCode.setMessage(username+"的打卡信息获取失败,可能是打卡更新了或网络不稳定,请查看后台打卡日志输出");
196+
statusCode.setStatus(-1);
197+
return statusCode;
198+
}
199+
String area = null;
200+
for (NameValuePair pair: info) {
201+
if (pair.getName().equals("area")) {
202+
area = pair.getValue();
203+
break;
204+
}
205+
}
206+
207+
JSONObject resp;
208+
try {
209+
resp = JSONObject.parseObject(client.doPostText(submitUrl, info));
210+
} catch (Exception e) {
211+
resp = new JSONObject();
212+
resp.put("e", 3);
213+
resp.put("m", "打卡提交失败");
203214
}
204-
}
205-
JSONObject resp = JSONObject.parseObject(client.doPostText(submitUrl, info));
206-
int status = resp.getIntValue("e");
207-
LogUtils.Level level = null;
208-
switch(status) {
209-
case 0:{level= LogUtils.Level.INFO;break;}
210-
case 1:{level= LogUtils.Level.ERROR;break;}
211-
}
212-
JSONObject userInfo = client.getUserInfo();
213-
String message = String.format("%s,你好,今日自动健康打卡状态:%s,打卡地区为:%s(如若区域不符,请次日手动打卡更改地址)",
214-
userInfo==null? username: userInfo.getString("userName"),
215-
resp.getString("m"),
216-
area);
217-
statusCode.setStatus(status);
218-
statusCode.setMessage(message);
219215

220-
if (appConfig.isEnablePreview()) {
221-
JSONObject jsonMessage = new JSONObject();
222-
jsonMessage.put("id", username);
223-
jsonMessage.put("name", userInfo==null? username: userInfo.getString("userName"));
224-
jsonMessage.put("message", message);
225-
Optional<String> photo = Optional.ofNullable(client.getUserPhoto());
226-
photo.ifPresent((String p)->{
227-
p = ImageUtils.toBase64(ImageUtils.resize(ImageUtils.toImage(p), 75, 100), "gif");
228-
jsonMessage.put("photo", "data:image/gif;base64,"+p);
229-
});
230-
statusCode.setJsonMessage(jsonMessage);
216+
int status = resp.getIntValue("e");
217+
LogUtils.Level level = null;
218+
switch(status) {
219+
case 0:{level= LogUtils.Level.INFO;break;}
220+
case 1:{level= LogUtils.Level.ERROR;break;}
221+
default: {
222+
level = LogUtils.Level.ERROR;
223+
}
224+
}
225+
JSONObject userInfo = client.getUserInfo();
226+
String message = String.format("%s,你好,今日自动健康打卡状态:%s,打卡地区为:%s(如若区域不符,请次日手动打卡更改地址)",
227+
userInfo == null || userInfo.getString("userName") == null? username: userInfo.getString("userName"),
228+
resp.getString("m"),
229+
area);
230+
statusCode.setStatus(status);
231+
statusCode.setMessage(message);
232+
233+
if (appConfig.isEnablePreview()) {
234+
JSONObject jsonMessage = new JSONObject();
235+
jsonMessage.put("id", username);
236+
jsonMessage.put("name", userInfo==null? username: userInfo.getString("userName"));
237+
jsonMessage.put("message", message);
238+
Optional<String> photo = Optional.ofNullable(client.getUserPhoto());
239+
photo.ifPresent((String p)->{
240+
p = ImageUtils.toBase64(ImageUtils.resize(ImageUtils.toImage(p), 75, 100), "gif");
241+
jsonMessage.put("photo", "data:image/gif;base64,"+p);
242+
});
243+
statusCode.setJsonMessage(jsonMessage);
244+
}
245+
246+
LogUtils.printMessage(resp.getString("m"), level);
247+
LogUtils.printMessage("地点:"+area);
248+
} catch (Exception e) {
249+
statusCode.setStatus(10);
250+
statusCode.setMessage(username + "发生未知打卡异常,请查看打卡日志");
251+
LogUtils.printMessage(null , e, LogUtils.Level.ERROR);
231252
}
232253

233-
LogUtils.printMessage(resp.getString("m"), level);
234-
LogUtils.printMessage("地点:"+area);
235254
return statusCode;
236255
}
237256
@Override

src/test/java/org/gcszhn/autocard/AppTest.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@
2727
@RunWith(SpringRunner.class)
2828
@SpringBootTest
2929
public abstract class AppTest {
30-
protected static final String trueZjuPassPortUser = "****";
31-
protected static final String trueZjuPassPortPass = "****";
32-
protected final String PAYLOAD_URL = "https://oapi.dingtalk.com/robot/send?access_token=****";
33-
protected final String SECRET = "SEC****";
30+
protected static final String USERNAME = "***";
31+
protected static final String PASSWORD = "***";
32+
protected static final String MAIL = "***";
33+
protected static final String PAYLOAD_URL = "https://oapi.dingtalk.com/robot/send?access_token=***";
34+
protected static final String SECRET = "SEC***";
3435
}

src/test/java/org/gcszhn/autocard/service/AutoCardServiceTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void afterTest() {
4141
public void getPageTest() {
4242
try {
4343
for (int i = 0; i < 2; i++) {
44-
String page = autoCardService.getPage(trueZjuPassPortUser, trueZjuPassPortPass);
44+
String page = autoCardService.getPage(USERNAME, PASSWORD);
4545
Assert.assertNotNull(page);
4646
Assert.assertTrue(autoCardService.formValidation(page));
4747
}
@@ -51,11 +51,11 @@ public void getPageTest() {
5151
}
5252
@Test
5353
public void getOldInfoTest() {
54-
System.out.println(autoCardService.getOldInfo(trueZjuPassPortUser, trueZjuPassPortPass));
54+
System.out.println(autoCardService.getOldInfo(USERNAME, PASSWORD));
5555
}
5656
@Test
5757
public void submitReportTest() {
58-
StatusCode statusCode = autoCardService.submit(trueZjuPassPortUser, trueZjuPassPortPass);
58+
StatusCode statusCode = autoCardService.submit(USERNAME, PASSWORD);
5959
Assert.assertNotEquals(statusCode.getStatus(), -1);
6060
}
6161
}

src/test/java/org/gcszhn/autocard/service/DingTalkHookServiceTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ public void sendMarkdownTest() {
4747
@Test
4848
public void sendPhotoTest() {
4949
ZJUClientService clientService = SpringUtils.getBean(ZJUClientService.class);
50-
if (clientService.login(trueZjuPassPortUser, trueZjuPassPortPass)) {
50+
if (clientService.login(USERNAME, PASSWORD)) {
5151
String photo = clientService.getUserPhoto();
52-
StatusCode statusCode = service.sendMarkdown(encrypt_url, trueZjuPassPortUser, "### "+trueZjuPassPortUser+"\n你好\n![img](data:image/gif;base64,"+photo+")");
52+
StatusCode statusCode = service.sendMarkdown(encrypt_url, USERNAME, "### "+USERNAME+"\n你好\n![img](data:image/gif;base64,"+photo+")");
5353
System.out.println(statusCode.getMessage());
5454
Assert.assertEquals(statusCode.getStatus(), 0);
5555
}

src/test/java/org/gcszhn/autocard/service/JobServiceTest.java

+31-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
package org.gcszhn.autocard.service;
1717

1818
import org.gcszhn.autocard.AppTest;
19+
import org.junit.Before;
1920
import org.junit.Test;
21+
import org.quartz.JobDataMap;
22+
import org.quartz.JobExecutionException;
2023
import org.springframework.beans.factory.annotation.Autowired;
2124

2225
/**
@@ -27,12 +30,38 @@
2730
public class JobServiceTest extends AppTest {
2831
@Autowired
2932
JobService jobService;
33+
private JobDataMap dataMap;
34+
@Autowired
35+
private MailService mailService;
36+
@Autowired
37+
private AutoCardService cardService;
38+
@Autowired
39+
private DingTalkHookService dingTalkHookService;
40+
41+
@Before
42+
public void initDataMap() {
43+
dataMap = new JobDataMap();
44+
dataMap.put("username", USERNAME);
45+
dataMap.put("password", PASSWORD);
46+
dataMap.put("mail", MAIL);
47+
dataMap.put("dingtalkurl", PAYLOAD_URL);
48+
dataMap.put("dingtalksecret", SECRET);
49+
}
50+
3051
@Test
31-
public void test() throws InterruptedException {
52+
public void cronTest() throws InterruptedException {
3253
synchronized(jobService) {
33-
jobService.addJob(AutoCardJob.class, null, null);
54+
jobService.addJob(AutoCardJob.class, null, dataMap);
3455
jobService.start();
3556
jobService.wait(50000);
3657
}
3758
}
59+
@Test
60+
public void executeTest() {
61+
try {
62+
AutoCardJob.execute(dataMap, mailService, cardService, dingTalkHookService);
63+
} catch (JobExecutionException e) {
64+
e.printStackTrace();
65+
}
66+
}
3867
}

src/test/java/org/gcszhn/autocard/service/ZJUClientServiceTest.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -52,25 +52,25 @@ public void afterTest() throws IOException {
5252
*/
5353
@Test
5454
public void loginTest() {
55-
Assert.assertEquals(true, client.login(trueZjuPassPortUser, trueZjuPassPortPass));
55+
Assert.assertEquals(true, client.login(USERNAME, PASSWORD));
5656
Assert.assertEquals(false, client.login("dadadada", "dadad"));
5757
}
5858
@Test
5959
public void getUserInfoTest() {
60-
if (client.login(trueZjuPassPortUser, trueZjuPassPortPass)) {
60+
if (client.login(USERNAME, PASSWORD)) {
6161
System.out.println(client.getUserInfo());
6262
}
6363
}
6464
@Test
6565
public void getUserPhotoTest() {
66-
if (client.login(trueZjuPassPortUser, trueZjuPassPortPass)) {
66+
if (client.login(USERNAME, PASSWORD)) {
6767
String photo = client.getUserPhoto();
6868
if (photo != null) {
69-
ImageUtils.write(photo, new File(trueZjuPassPortUser+ "-raw.gif"));
69+
ImageUtils.write(photo, new File(USERNAME+ "-raw.gif"));
7070
BufferedImage image = ImageUtils.toImage(photo);
71-
ImageUtils.write(image, "gif", new File(trueZjuPassPortUser+ "-t.gif"));
71+
ImageUtils.write(image, "gif", new File(USERNAME+ "-t.gif"));
7272
image = ImageUtils.resize(image, 75, 100);
73-
ImageUtils.write(image, "gif", new File(trueZjuPassPortUser+ "-resize.gif"));
73+
ImageUtils.write(image, "gif", new File(USERNAME+ "-resize.gif"));
7474
}
7575
}
7676
}
@@ -83,7 +83,7 @@ public void loginCourseTest() throws FileNotFoundException {
8383
ArrayList<String> peoples = new ArrayList<>();
8484
PrintWriter pw = new PrintWriter("studentInfo.csv");
8585
pw.println("\"id\",\"name\",\"department\",\"email\"");
86-
if (client.login(trueZjuPassPortUser, trueZjuPassPortPass)) {
86+
if (client.login(USERNAME, PASSWORD)) {
8787
String userIndexPage=client.doGetText(userUrl);
8888
Document document = Jsoup.parse(userIndexPage);
8989
String userId = document.getElementById("userId").attr("value");

0 commit comments

Comments
 (0)