最近想弄个有道云笔记自动签到,于是网上搜了下,就只搜到这篇文章“有道云笔记自动签到”,因为是2016年的,所以只有领取签到奖励空间,不能领取登录奖励空间和看小视频奖励空间,于是在这基础上搞了搞,最终完美搞定,可以自动领取登录奖励空间+签到奖励空间+看小视频奖励空间了,下面是具体步骤
1、电脑上安装 fiddler 抓包软件 https://www.telerik.com/download/fiddler
2、下面是我的 fiddler 的设置
3、电脑开启热点,手机连接上热点并设置下代理,主机名填电脑开启热点的那个适配器的 IPv4 地址,端口号填默认的 8888,ip 地址可以通过 win + R 打开 cmd 输入 ipconfig 获取
4、手机安装 fiddler 的证书,打开手机浏览器,输入电脑 IP 地址:8888 进行安装
5、fiddler 设置好过滤器,手机端正常签到流程操作有道云笔记进行抓包,抓到了这些就行了
6、Java 代码进行请求模拟,拷贝后需分析上面你抓到的包,自行替换下面的一些参数,5个包对应着5个方法
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.PrintWriter;
import java.util.*;
import java.io.*;
import java.util.zip.GZIPInputStream;
public class Checkin {
public static String seesion_cookie = null;
public static void main(String[] args) throws IOException {
deviceOpen();
//System.out.println("deviceOpen:" + deviceOpen());
login();
//System.out.println("login:" + login());
//sync();
System.out.println("sync:" + sync());
System.out.println("checkIn:" + checkIn());
adPrompt();
adPrompt();
System.out.println("adPrompt:" + adPrompt());
System.out.println("-----------------------------------------------------------------------------");
}
public static String deviceOpen() {
String url = "http://note.youdao.com/yws/device_open/poll";
String arg = "your_arg";
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Length", "482");
headers.put("Content-Type", "application/x-www-form-urlencoded");
return sendPost(url, arg, headers);
}
public static String login() {
String url = "https://note.youdao.com/login/acc/co/cq?product=YNOTE&cf=7&替换成你抓到的";
String arg = null;
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Length", "482");
headers.put("YNOTE-PC", "v2|urstoken||YNOTE||替换成你抓到的");
return sendPost(url, arg, headers);
}
public static String sync() {
String url = "https://note.youdao.com/yws/api/daupromotion?method=sync";
String arg = "your_arg";
Map<String, String> headers = new HashMap<String, String>();
headers.put("Cookie", "YNOTE_LOGIN=true;" + seesion_cookie);
headers.put("Content-Length", "482");
headers.put("Content-Type", "application/x-www-form-urlencoded");
return sendPost(url, arg, headers);
}
public static String checkIn() {
String url = "https://note.youdao.com/yws/mapi/user?method=checkin";
String arg = "your_arg";
Map<String, String> headers = new HashMap<String, String>();
headers.put("Cookie", "YNOTE_LOGIN=true;" + seesion_cookie);
headers.put("Content-Length", "482");
headers.put("Content-Type", "application/x-www-form-urlencoded");
return sendPost(url, arg, headers);
}
public static String adPrompt() {
String url = "https://note.youdao.com/yws/mapi/user?method=adPrompt";
String arg = "your_arg";
Map<String, String> headers = new HashMap<String, String>();
headers.put("Cookie", "YNOTE_LOGIN=true;" + seesion_cookie);
headers.put("Content-Length", "482");
headers.put("Content-Type", "application/x-www-form-urlencoded");
return sendPost(url, arg, headers);
}
public static String sendPost(String url, String param, Map<String, String> headers) {
PrintWriter out = null;
BufferedReader in = null;
StringBuilder result = new StringBuilder();
try {
URL realUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept-Encoding", "gzip");
conn.setRequestProperty("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3");
for (String key : headers.keySet())
conn.setRequestProperty(key, headers.get(key));
conn.setRequestProperty("Host", "note.youdao.com");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("User-Agent", "ynote-android");
conn.setDoOutput(true);
conn.setDoInput(true);
out = new PrintWriter(conn.getOutputStream());
if (param != null) out.print(param);
out.flush();
//System.out.println(conn.getResponseCode() + " " + conn.getResponseMessage());
for (int i = 1; conn.getHeaderFieldKey(i) != null; ++i) {
if (conn.getHeaderFieldKey(i).equals("Set-Cookie") &&
conn.getHeaderField(i).contains("YNOTE_SESS=v2")) {
seesion_cookie = conn.getHeaderField(i).split(";")[0];
//System.out.println("seesion_cookie:" + seesion_cookie);
break;
}
}
Reader reader = null;
if ("gzip".equals(conn.getContentEncoding())) {
//System.out.println("Response body is encoded in gzip.");
reader = new InputStreamReader(new GZIPInputStream(conn.getInputStream()));
} else {
reader = new InputStreamReader(conn.getInputStream());
}
in = new BufferedReader(reader);
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
} catch (Exception e) {
System.out.println("sendPost Exception !!! " + e);
e.printStackTrace();
}
finally {
try {
if (out != null) out.close();
if (in != null) in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result.toString();
}
}
7、代码部署
电脑本地:因为是 Java 代码,所以需要先安装 JDK,具体怎么安装百度一下,上面代码保存为 *.java 文件,新建 *.cmd 或 *.bat 文件,复制黏贴以下内容到文件中
date /t >> log.txt
java * >> log.txt
* 代表你自己取的名称,将 *.java 文件和 *.cmd 文件放到同一个文件夹,在文件夹的地址栏输入 cmd 在本目录下打开命令行,输入 javac *.java 进行编译,编译完成后会生成 *.class 文件,此时双击 *.cmd 或 *.bat 文件便可以运行有道云笔记自动签到脚本了,运行后会在当前文件夹新生成 log.txt 日志文件,不想要日志文件的可以删除“>> log.txt”
如果不想每次打开电脑自己点的话可以设置下电脑的计划任务在什么时候自动运行 *.cmd 文件,如我设置的是开机时自动运行,“起始于”这项需要填上 *.cmd 文件所在目录
补充:闲每次运行都会打开命令行黑窗口的可以另外新建一个 *.vbs 文件,内容如下,运行此文件可以让 *.cmd 文件在后台运行而不会弹出黑窗口
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c *.cmd", vbhide
服务器中:以我的 Centos 6 服务器为例,和电脑本地一样,需要先安装好 JDK,然后把代码文件 *.java 和 *.sh 放在同一个目录下,下面是我的 *.sh 文件,请自行更换文件所在路径和文件名,通过 javac *.java 先编译一下,通过命令 ./*.sh 便可以执行自动签到脚本
# checkin.sh
cd /root/youdaoauto
date >> checkin_log
java Checkin >> checkin_log
服务器定时任务设置:crontab -e 打开定时任务设置,我设置的是每天凌晨1点帮我自动签到
0 1 * * * /root/youdaoauto/checkin.sh
如果遇到定时任务没有按时执行应该和服务器时区有关,可以看我的另一篇文章 Linux 修改服务器时间的时区为 CST
8、搞定