有道云笔记自动签到

主体步骤:

  1. 笔记本装fiddler,开热点;
  2. 手机连接,设置代理为fiddler监听的8888端口;
  3. 抓app的包。注意导入fiddler 的证书到手机,否则app是不给联网的。
  4. 分析app登录、签到时都干了什么。

更多关于fiddller参考:

http://chessman-126-com.iteye.com/blog/2001501

http://www.cnphp6.com/archives/97865

http://www.cnblogs.com/mfryf/p/5028010.html



好,假设你已经做好了准备工作。

当有道云笔记app打开时,fiddler抓到的包:

(1)注意返回的delusers数组,删除用户?怪吓人的。

上图是POST请求,下图是服务器返回(下同)。

(2)如图,重点是请求时发送的usertoken,这个是app内部产生的。这个token变化的频率是?

经测试,退出app后再次打开,此token没有变化。或许是每天变化一次。后面测试。

服务器返回的就是set-cookie了。usertoken不变,cookie就不用变。

(3)在这之后app的自动请求已有LOGIN=true的cookie了。

(4)点击签到按钮,请求checkin method

返回签到是否成功,签到得到的空间等等。

2016/05/10 09:50

今天打开笔记签到,user token 没变,cookie也没变。



2016/05/11 13:44

user token 和 cookie 依旧没变。

由此推论,只要app运行的环境不改变,发送给server的token不会变,返回的cookie不会变。

退出账号后再次登录,user token会改变。仅退出app(登录状态是保留的),下次打开app自动登录,user token 不改变。

好,下面上代码。关键是main函数中的三个方法,模拟了你打开app-点击签到按钮的这个过程。

程序中有的参数需要自己抓包然后放进去。

  1 import java.io.BufferedReader;
  2 import java.io.IOException;
  3 import java.io.InputStreamReader;
  4 import java.io.OutputStream;
  5 import java.net.HttpURLConnection;
  6 import java.net.MalformedURLException;
  7 import java.net.URL;
  8
  9
 10 import java.io.PrintWriter;
 11 import java.net.URLConnection;
 12 import java.util.*;
 13 import java.io.*;
 14 import java.util.zip.GZIPInputStream;
 15 import java.io.UnsupportedEncodingException;
 16
 17 public class Signin {
 18     public static String seesion_cookie = null;
 19
 20     public static void main(String[] args) throws IOException {
 21         /*
 22          * set proxy so that fiddler
 23          * can capture packages sent by this program
 24         System.setProperty("http.proxyHost", "127.0.0.1");
 25         System.setProperty("https.proxyHost", "127.0.0.1");
 26         System.setProperty("http.proxyPort", "8888");
 27         System.setProperty("https.proxyPort", "8888");
 28         System.setProperty("javax.net.ssl.trustStore",
 29             "D:\\Program Files\\Java\\jre1.8.0_25\\lib\\security\\FiddleKeystore");
 30         System.setProperty("javax.net.ssl.trustStorePassword", "your_passwd");
 31         */
 32
 33         System.out.println("deviceOpen:" + deviceOpen());
 34         System.out.println("login:" + login());
 35         System.out.println("checkIn:" + checkIn());
 36
 37     }
 38
 39     public static String deviceOpen() {
 40         String url = "http://note.youdao.com/yws/device_open/poll";
 41         String arg = "your_arg";
 42         Map<String, String> headers = new HashMap<String, String>();
 43         headers.put("Content-Length", "481");
 44         headers.put("Content-Type", "application/x-www-form-urlencoded");
 45
 46         return sendPost(url, arg, headers);
 47     }
 48
 49     public static String login() {
 50         String url = "http://note.youdao.com/login/acc/co/cq?product=YNOTE&cf=7&userid=.......";
 51         String arg = null;
 52         Map<String, String> headers = new HashMap<String, String>();
 53         headers.put("Content-Length", "0");
 54         headers.put("YNOTE-PC", "v2|urstoken||YNOTE|......");
 55
 56         return sendPost(url, arg, headers);
 57     }
 58
 59     public static String checkIn() {
 60         String url = "https://note.youdao.com/yws/mapi/user?method=checkin";
 61         String arg = "your_arg";
 62         Map<String, String> headers = new HashMap<String, String>();
 63         headers.put("Cookie", "YNOTE_LOGIN=true;" + seesion_cookie);
 64         headers.put("Content-Length", "481");
 65         headers.put("Content-Type", "application/x-www-form-urlencoded");
 66
 67         return sendPost(url, arg, headers);
 68     }
 69
 70
 71
 72     public static String sendPost(String url, String param, Map<String, String> headers) {
 73         PrintWriter out = null;
 74         BufferedReader in = null;
 75         StringBuilder result = new StringBuilder();
 76         try {
 77             URL realUrl = new URL(url);
 78
 79             HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
 80             conn.setRequestMethod("POST");
 81
 82             conn.setRequestProperty("Accept-Encoding", "gzip");
 83             conn.setRequestProperty("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3");
 84             for (String key : headers.keySet())
 85                 conn.setRequestProperty(key, headers.get(key));
 86             conn.setRequestProperty("Host", "note.youdao.com");
 87             conn.setRequestProperty("Connection", "Keep-Alive");
 88             conn.setRequestProperty("User-Agent", "ynote-android");
 89
 90             conn.setDoOutput(true);
 91             conn.setDoInput(true);
 92
 93             out = new PrintWriter(conn.getOutputStream());
 94             if (param != null) out.print(param);
 95             out.flush();
 96             System.out.println(conn.getResponseCode() + " " + conn.getResponseMessage());
 97
 98             for (int i = 1; conn.getHeaderFieldKey(i) != null; ++i) {
 99                 if (conn.getHeaderFieldKey(i).equals("Set-Cookie") &&
100                         conn.getHeaderField(i).contains("YNOTE_SESS=v2")) {
101                     seesion_cookie = conn.getHeaderField(i).split(";")[0];
102                     System.out.println("seesion_cookie:" + seesion_cookie);
103                     break;
104                 }
105             }
106
107             Reader reader = null;
108             if ("gzip".equals(conn.getContentEncoding())) {
109                 System.out.println("Response body is encoded in gzip.");
110                 reader = new InputStreamReader(new GZIPInputStream(conn.getInputStream()));
111             } else {
112                 reader = new InputStreamReader(conn.getInputStream());
113             }
114
115             in = new BufferedReader(reader);
116             String line;
117             while ((line = in.readLine()) != null) {
118                 result.append(line);
119             }
120         } catch (Exception e) {
121             System.out.println("sendPost Exception !!! " + e);
122             e.printStackTrace();
123         }
124
125         finally {
126             try {
127                 if (out != null) out.close();
128                 if (in != null) in.close();
129             } catch (IOException ex) {
130                 ex.printStackTrace();
131             }
132         }
133
134         return result.toString();
135     }
136 }

Java Code


2016/05/12 00:53

把程序放在服务器上:

设置crontab例行任务

# signin.sh
cd /home/whuliss/Documents/
date >> signin_log
java SignIn >> signin_log

log:

Fri Jun  3 00:37:01 CST 2016
checkIn:{"total":830472192,"time":1464885510110,"space":6291456,"success":1}
Sat Jun  4 00:37:01 CST 2016
checkIn:{"total":834666496,"time":1464971913651,"space":4194304,"success":1}
Sun Jun  5 00:37:02 CST 2016
checkIn:{"total":840957952,"time":1465058318146,"space":6291456,"success":1}
Mon Jun  6 00:37:01 CST 2016
checkIn:{"total":842006528,"time":1465144721286,"space":1048576,"success":1}
Tue Jun  7 00:37:01 CST 2016
checkIn:{"total":847249408,"time":1465231125472,"space":5242880,"success":1}
Wed Jun  8 00:37:01 CST 2016
checkIn:{"total":852492288,"time":1465317528907,"space":5242880,"success":1}
时间: 2024-11-15 07:49:59

有道云笔记自动签到的相关文章

关于产品的一些思考——(四十一)网易之有道云笔记

--------------------2014.07.17-------------------- 先前的使用体验,补上. 建议在有道云笔记安装的时候,就可以由用户设置笔记和图片存储目录,并且用户可以控制是否自动同步笔记,防止软件安装之后,笔记自动同步,在用户修改存储目录后,由于拷贝过多小文件,而造成软件无响应.

如何用有道云笔记写含数学公式的专业文章

有道云笔记Markdown功能(“新建”-Markdown)可输入数学公式,用Latex语法,所见即所得,有简洁的Help,所生成的网页也漂亮. 输入数学公式可与Online LaTex Equation Editor一起使用. 同时,用Markdown写计算机专业文章惊人地妙—— 首先,语法极其简单 我想我只需要标题,列表.代码.链接.表格.流程图,均有图标做标记语言语法引导. 其次,参考文档引用(citation)简单 即使在LaTex中,Citation也是问题,必须另立一个Bibtex文

[转]有道云笔记markdown

作为半个文字工作者,一天当中,一半时间用在遣词造句,一半时间则在死磕排版.当听说"前所未有的极简语法"Markdown,不仅能简化排版.大大提高书写效率,而且上手零门槛.好奇宝宝怎么忍得住一颗蠢蠢欲动的心? 从未接触过代码的门外汉,初次听说Markdown,脑子是空的.但如果愿意抽5分钟,看下这篇文章--了解Markdown是什么.能干什么.对码字的你有什么益处:再打开有道云笔记,抽出10分钟对照Markdown简明教程加以练习. 15分钟,你就能掌握一门极客圈最流行的文本编辑语言~

用游戏外挂的方式修复有道云笔记的BUG

由爱到痛 有道云笔记是个好东西,在认识它之前,我一直使用Windows记事本来保存网上摘抄的文档资料和学习心得体会.某天朋友推荐了有道云笔记,我安装后就不可收拾的爱上了它.那种感觉,就好比一夜之间手扶拖拉机换成了奥迪Q7,从此驶上了码字界的康庄大道. 可就在我对它的爱如火如荼的进行中时,一件痛心疾首的事情发生了. 宋体,是我钟爱的字体,而有道云笔记钟爱的字体则是微软雅黑.就是那么一个兴趣爱好的不同,使我们之间产生了矛盾,并不断被激化,最终影响到了工作和生活,以至于之后一度要和它分手. 问题是这样

有道云笔记客户端的下载和安装、使用

想说的是,写此博文,是为了让自己学会使用和做好笔记. 下载 安装 使用 有道云笔记网页剪报(备)

Linux下使用crontab命令以及Python脚本实现自动签到

关于这一部分, 我首先介绍下如何实现使用Python脚本实现签到功能其实,linux下有个命令叫做curl,完全可以完成模拟签到的功能,但是为了练习Python,我就用Python来写了.有这个想法完全是因为实验室的学长开发了一款App,上边收个起床签到,还有排名,为了能那个首签... 言归正传 首先,因为是手机上的App, 所以,我们需要抓包看下它具体的URL以及发送的内容是什么,关于这部分内容我就不在赘述了,我实现的功能主要有模拟发布状态和模拟签到两种功能,两个的URL也是不同的.为了不让学

有道云笔记

使用有道云笔记,轻松同步.管理您各终端的所有笔记.三重备份,存储数据安全有保障.免费的超大存储空间,无限量增长.激活后即可免费获得2GB云存储空间.赶紧来体验吧.快速注册入口 有道云笔记(原有道笔记)是2011年6月28日网易旗下的有道推出的云笔记软件,支持多种附件格式,拥有2G容量的初始免费存储空间,能够实时增量式同步,并采用“三备份存储”技术,同时上线的还有网页剪报功能.2012年12月初,有道云笔记推出3.0新版,PC.iPhone.Android和web端四大平台全面升级.升级后的有道云

云笔记使用的感受想法!(对有道云笔记、印象云笔记的比较与评价)

看到同事在使用云笔记,也下载了来试用一下,不过安装试用之后,就吧下载的几个都给删除了.说一下自己内心的感受和想法: 功能太多 下载了有道云笔记.印象笔记.云笔记.功能真的太多了,支持语音.视频.图片.还有拍照,裁剪还有各种发送到微博.邮件发送.转发.功能多且细,让人看的有点头疼,我只是为了记录一些文字比较,不想记录那么多 云笔记本身的思路缺陷(印象云笔记.有道云笔记) 一直用的都是用QQ邮箱的记事本来保存笔记,直接只记录文字.现在主流的云笔记功能多而且非常细,眼花缭乱的产品功能,细致繁杂.感觉就

有道云笔记网页版(Cloud notes page)

插件介绍: 说到储存,小伙伴们都有自己的储存方法,今天为大家推荐一款云储存的插件.有道云笔记(note.youdao.com)是网易旗下有道搜索推出的笔记类应用,通过云存储技术帮助用户建立一个可以轻松访问.安全存储的云笔记空间,解决个人资料和信息跨平台跨地点的管理问题. 使用说明: 将有道云笔记网页版(Cloud notes page)添加至chrome,并在应用中启动它. 功能介绍: -免去数据线传输烦恼,手机电脑轻松同步; -资料多重备份,云端存储永不丢失;-分类整理纷繁资料,支持丰富附件格