正好没什么事就把这篇文章写写
目录
前言
之前就常常使用jsoup方法写爬虫,也爬过很多国内外有的没的资源,因为可以应对大部分静态页面与大部分接口,可以说十分方便,当然因人而异各有所好的工具和方法
本篇文章教大家使用jsoup方法实现自动签到功能(当然这个方法十分简单,但简单的同时也很便捷)
Jsoup
Jsoup想必大家没有用过也有听过,没有听过也应该了解爬虫,没有了解爬虫也应该知道Python,不知道Python的想必也被Python的广告洗脑过,当然我是用java的,jsoup就是个可以做爬虫工作的工具,介绍完毕
太过基础的介绍就结束了,如果对爬虫这项技术不了解的可以自行百度,这里不会过多叙述
有请我们第一位受害者测试者
B站直播签到
首先由我们熟知的B站直播每日签到着手,主要是我手里的需要签到的网站不多
首先看一下成果
当然只要你有一个属于自己的服务器,爬虫坐牢指日可待,就可以玩出很多花样
第一步寻找接口
想必大家都知道浏览器的F12开发者工具,可以查看网页原码,接口的访问信息,先F12开发者工具,再点击签到,查看是哪个接口调用的签到方法
这里我截取一张图,可以看到从上到下红框圈起来的分别是接口地址,登录的cookie信息,浏览器信息,接口用来访问签到方法,cookie用来验证登录信息,浏览器信息判断是否为用户真实浏览器访问(伪装),直接用cookie是为了快速验证用户身份,不然每次都要通过用户名密码从登陆接口进行登录,耗时不说还可能因为网络等问题导致登录失败影响签到,所以直接使用cookie,当然如果cookie过期了也会登陆失败,就需要定期对cookie进行检测
第二步梳理参数
整理一下参数
URL:接口地址
cookie:登录信息
user-agent:用户本机信息
其余信息可以参考下面贴出来的完整方法
public void Bilibili() {
String outString = "";
try {
String URL = "https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign";
String Sdoc = null;
Connection conn = null;
conn = Jsoup.connect(URL);
conn.header("accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
conn.header("accept-encoding", "gzip, deflate, br");
conn.header("accept-language", "zh-CN,zh;q=0.9");
conn.header("cache-control", "max-age=0");
conn.header("user-agent","这里填自己浏览器的或者自己收集的浏览器信息");
conn.header("cookie" , "将接口中cookie信息直接粘贴过来,有什么粘贴什么");
conn.header("upgrade-insecure-requests", "1");
conn.method(Connection.Method.GET);
conn.ignoreContentType(true);
Response response = conn.execute();
Sdoc = response.body();
outString = tool.unicode(Sdoc);
Map<String, String> map = response.cookies();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(outString);
System.out.println(outString.length());
// {"code":-101,"message":"账号未登录","ttl":1}
}
这个方法在引入Jsoup包后用main方法调用就能使用,当然cookie与user-agent需要自己获取,执行结果最后会将接口返回值打印出来,就能知道是否执行成功
第三步把大象放进冰箱里
签到成功
对于没有过多校验的接口可以直接使用这种方法,这种也是较为简单的
CSDN签到
刚开始不想写出来的,感觉不太好,但调查一圈发现同样做CSDN签到的人也蛮多的,抱着我不作死谁作死的态度,先对CSDN平台说一声对不起拿你下手了,如若冒犯我会删除的
话说回来,我也是用了好久才知道原来CSDN也有签到,被放在了不起眼的位置,好在无意中看到了,还是蛮有意思的为了活跃气氛
第一步打开冰箱
和上面一样的方法找到接口
同样是使用cookie与user-agent,记录好
第二步梳理参数
整理一下参数
URL:接口地址
cookie:登录信息
user-agent:用户本机信息
其余信息可以参考下面贴出来的完整方法
public void CSDNsignIn() {
String outString = "";
try {
String URL = "https://me.csdn.net/api/LuckyDraw_v2/signIn";
Map<String, String> cookiemap = new HashMap<String, String>();
String Sdoc = null;
Connection conn = null;
conn = Jsoup.connect(URL);
conn.header("accept", "application/json, text/plain, */*");
conn.header("accept-encoding", "gzip, deflate, br");
conn.header("accept-language", "zh-CN,zh;q=0.9");
conn.header("cache-control", "max-age=0");
conn.header("content-type", "text/html;charset=utf-8");
conn.header("user-agent","这里填自己浏览器的或者自己收集的浏览器信息");
conn.header("cookie","将接口中cookie信息直接粘贴过来,有什么粘贴什么");
conn.header("origin", "https://i.csdn.net");
conn.header("referer", "https://i.csdn.net/");
conn.method(Connection.Method.POST);
conn.ignoreContentType(true);
Response response = conn.execute();
Sdoc = response.body();
outString = tool.unicode(Sdoc);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(outString);
JSONObject json = JSONObject.parseObject(outString);
Map<String, Object> MapJson = json.getInnerMap();
if (MapJson.get("message").toString().contains("成功")) {
System.out.println("签到成功");
}
// {"code":200,"message":"成功","data":{"totalSignedCount":3879,"msg":"当前已签到2天,再累计签到3天即可赢到抽奖机会","keepCount":2,"star":2,"isSigned":false,"signed":true,"totalCount":3,"serialCount":2,"drawTimes":2}}
}
(复制)这个方法在引入Jsoup包后用main方法调用就能使用,当然cookie与user-agent需要自己获取,执行结果最后会将接口返回值打印出来,就能知道是否执行成功
第三步运行一下
不知为什么,感觉签到也就是调用一下接口,没有什么挑战,接下来就要来点比较特殊的签到方式了
那么重头戏来了
XSRF-TOKEN
跨站请求伪造与校验token
由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。
------来自百度百科
因为兴趣使然(靠,可不能让你们知道是什么网站不然我的兴趣就暴露了),因为常常访问该站,并且写过该站的爬虫,说实话这个站做的不错,动态加载的页面,使用静态的Jsoup爬取只能得到页面的HTML框架,里面的数据是得不到的,最后通过webdriver配合谷歌浏览器来加载数据并爬取内容,是我目前遇到的比较有难度的网站
话说回来,这篇文章讲的是自动签到,而这个站用到了校验token方式,导致直接携带cookie而没有携带token信息访问签到接口就会签到失败.
总结
token存在于cookie里,这个token的cookie与用户登录凭证的cookie是两个相对独立的
token有时效性会过期
token是伪随机数,可以模拟但不知道算法也不能自己生成
那么由于token是网站提供的,只要获取到token并在没有过期之前使用,就可以通过验证,就能成功调用接口,所以难点就在获取token与快速使用token
说到这里就要引入我们这篇文章的最后一位受害者了,当然我不会暴露这个站的,我以网络人格担保
*库(这样写应该没有知道吧嘻嘻)
这个站懂得都懂,而且知道这个站的也知道签到也就是给点经验,而且没有任何实际作用,所以就是学学技术
这里只是讲一下获取方式,以及一些思路,不同网站的获取方法可能不同
携带用户凭证cookie访问主站首页,在返回的数据里的cookie中就会有"XSRF-TOKEN"字样的数据,这个就是我们要的token值
是不是感觉很简单,坏消息是你刚刚获取到的token可能已经过期失效了,当初我是调用十多次只有一次token可以使用,所以这里要多次访问主站来获取token并当时使用
访问主站获取XSRF-TOKEN
这个是点击页面返回的成功提示
这个是携带token与用户登录cookie访问签到接口
签到成功!!!
到这里这篇文章就结束了,通过找到签到接口,用户的cookie,以及一些验证参数,就可以签到了
就喜欢写这种虎头蛇尾的文章,绝对不是上学的时候语文没学好
最后显摆展示一下写进项目中并每日运行的结果