首页 > 其它 > 如何在Fiddler script中捕获请求结果并针对返回内容发起一个新请求

如何在Fiddler script中捕获请求结果并针对返回内容发起一个新请求

有朋友报名东方时尚,理论课选的网上教学,需要看完所有的视频才能算科目一培训完成,在很早之前就有朋友因为这个找过我。当时东方时尚的授课系统还很简单。。每次看完一个视频都会发起一个固定的请求,表示当前视频看完了。所以之前的做法很简单,把那个url在新标签页打开,每开一个视频,刷一下页面,就算看完一段视频了。。所以不用什么复杂操作,很容易就能完成。
不过现在,东方时尚的系统明显升级了,已经不是那么简单的逻辑了,每次请求一个新视频,都会有一个/start的请求,把视频id返回,后边每次心跳和看完视频的请求,都是以该id为参数。不能再像以前那么简单的玩耍了。。本来是想写个chrome的扩展来拦截请求做处理的,突然想到Fiddler的script就可以做这些,而且语法是.NET的,会比较熟:)。
做法也很简单,就是在OnBeforeResponse阶段,获取到body,正则匹配到需要的id,然后再发起一个请求:),多说无益,直接show code.

static function OnBeforeResponse(oSession: Session) {
        
        if (m_Hide304s && oSession.responseCode == 304) {
            oSession["ui-hide"] = "true";
        }
        oSession.utilDecodeResponse();

        var oBody = oSession.GetResponseBodyAsString (); 
        var regex = /{"data":\{"streamId":(\d+)},"/i ;
        if (oBody.match(regex)) {
            var matches = oBody.match(regex);
            //MessageBox.Show(matches );
            var s = "POST http://api.dfsstv.cn/api/v1/Stream/End?streamId=" + matches[1] + " HTTP/1.1\r\nHost: api.dfsstv.cn\r\nConnection: keep-alive\r\nContent-Length: 0\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nDeviceId: 1456634190000\r\nOrigin: http://www.dfsstv.cn\r\nApiKey: 59d71859d3dd491a8ad6accbe7262d94\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36\r\nAuthToken: a54a874bddfb449cbbf4ed698b4e0fc4\r\nAccept: */*\r\nReferer: http://www.dfsstv.cn/?u=11107668&p=06260\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.8\r\n\r\n";
            try{ 
                FiddlerObject.utilIssueRequest(s); 
            } 
            catch(e){ 
                MessageBox.Show("send failed" + e.ToString()); 
            } 
        }
}

regex正则匹配内容。使用 utilIssueRequest 发起请求。
当然这里的做法简单了些,因为东方时尚的请求header里还使用了authToken认证,每次登录的token都不一样,这里直接写死了。

到这里就简单多了,每次打开视频就相当于播放完了,直接刷新就可以看下一集了。
下边图片就是效果,每次视频一start,就产生一个end的请求:)

fiddler-BeforeOnResponse-send-new-request

fiddler-BeforeOnResponse-send-new-request

当然也没这么简单。。它会把token放在localSotrage里,每次开始播放的时候会清掉,应该是等快结束的时候才放进去。。所以导致每次刷新页面都会需要重新登录,所以又要麻烦点,在浏览器的开发者工具里,每次刷新页面前,都set一下localStorage,就可以拉。。

视频是可以快速跳过了,但是每一章视频看完后都会有一个测验,要把三十道题目都回答正确才行。一看请求,每次请求问题的时候,答案也放在返回结果里了。。所以,很容易想到,答题完成其实也就是一个固定的请求而已。。硬着头皮答完了一次题,抓到了完成题目的请求,是一个 Practice/Finish?lessonId=1 这样的请求,每次只要改lessionId的值就好了, 很简单吧。。:)

  1. 还没有评论
评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks