[Java爬虫]利用jsoup爬虫实现网站自动签到--举例B站、CSDN、某库自动签到与通过反爬手段解决XSRF-TOKEN验证

正好没什么事就把这篇文章写写

目录

前言

Jsoup

B站直播签到

CSDN签到

XSRF-TOKEN

*库(这样写应该没有知道吧嘻嘻)


前言

之前就常常使用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,以及一些验证参数,就可以签到了

就喜欢写这种虎头蛇尾的文章,绝对不是上学的时候语文没学好

最后显摆展示一下写进项目中并每日运行的结果

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张德仁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值