• PHP模拟登陆获取成绩信息


        首先用Wireshark抓包分析。在浏览器中进入西电研究生院的登陆页面http://210.27.12.1:90/login.jsp, 抓包得到的结果如下:

       1. 获取Cookie:

       

        从图中可以看到,此时已从服务器那里得到了Cookie。我做了个测试,如果停留在这个页面时间过长,Cookie就会失效,此时即使输入正确的用户名和密码,也不会正常登陆,而是出现以下情况:

        或者

        所以PHP模拟登陆第一步要做的就是访问http://210.27.12.1:90/login.jsp这个url并获得Cookie.根据抓包截图,发现有Host、User-Agent、Accept、Accept-Language、Accept-Encoding、Connection、Cookie这7个参数。其中设置User-Agent的PHP语句为curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0'),其他的暂时不会,就先不管了。所以目前语句是这样的:

       

        测试结果如下:

       

        2. 验证:

       

        由图中可以看到,这一步是要带着刚才获取到的Cookie和自己的用户名、密码向http://210.27.12.1:90/j_security_check 这个url POST数据,其中CURLOPT_USERAGENT设置为 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0',Accept和Accept-Language、Accept-Encoding、Connection、Content-Type、Content-Length应该不用管,Cookie值就是刚在第一步中获取到的,j_username和j_password则是需要用户填写的账号和密码,Referer自己构造,代码如下:

       

        测试结果如下:

       

        尼玛啊,又是400号错误。索性之前做过C#模拟登陆,这一步也是400,但是对于最终获取数据并无影响,先不管了。

        3. 进入系统主页:

       

        代码如下:

       

        测试结果如下:

       

       

        一开始我很疑惑,它不是应该把我主页的信息输出吗?后来想明白了,因为主页是用Frame实现的,自然没办法显示详细内容。

        4. 获取成绩信息

       

        代码如下:

       

        测试结果如下:

       

        Bingo! 拿到了。虽然最终实现了抓取目的,但还是有很多地方想不透彻。比如说在通过j_security_check进行验证的时候,用浏览器正常登陆的时候,向j_security_check POST数据后返回信息为:

       

        标志码为302,可是PHP模拟登陆的时候,这一步的返回信息为:

       

        标志码为400,且提示“Invalid direct reference to form login page”,为此我调试了半天,后来拿出以前的C#版本发现它在这一步也是这么个情况。难道模拟登陆时出现“Invalid direct reference to form login page”都可以忽略吗?求指点。

  • 相关阅读:
    分页的实现
    调取地图map
    meta标签应用,适应手机屏幕以及关键词、描述的添加
    页面中公共部分的统一调用
    PC端变成手机端的时候,把特效去掉(把canvas标签去掉)
    IIS上绑定域名,发布上线
    动态截取字符串获取当前网页的URL地址
    Vue 打包后报错 Uncaught TypeError: Cannot redefine property: $router
    Vue项目部署到线上页面空白
    让从后台返回的数据在让elementui 的el-select 显示对应的label值而不是value值
  • 原文地址:https://www.cnblogs.com/cysolo/p/3016374.html
Copyright © 2020-2023  润新知