🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### 示例说明 巧用FiddlerScript,将抓包获取到的响应信息转发到统计服务上,并且设置定时器,每隔n分钟后重新发起request请求,实现定时监控微信文章的互动量变化。 ### 第一步,抓包分析 在PC微信中打开微信文章,通过Fiddler抓包分析可知,统计接口为 ``` https://mp.weixin.qq.com/mp/getappmsgext ``` 其响应内容格式如下 ``` { "advertisement_info": [], "appmsgstat": { "show": true, "is_login": true, "liked": false, "read_num": 30, "like_num": 0, "ret": 0, "real_read_num": 0, "version": 1, "prompted": 1, "like_disabled": true, "style": 1 }, "reward_head_imgs": [], "base_resp": { "wxtoken": 777 }, "more_read_list": [], "friend_subscribe_count": 0, "related_tag_article": [], "original_article_count": 0, "video_share_page_tag": [], "related_tag_video": [] } ``` ### 第二步,编写FiddlerScript脚本 在`OnBeforeResponse`代码块内,新增关键代码如下 ``` //过滤无关请求,只关注特定请求 if (oSession.fullUrl.Contains("/mp/getappmsgext")) { var current_time = DateTime.Now; // 保存请求信息 //oSession.utilDecodeResponse();//消除保存的请求可能存在乱码的情况 //var fso; //var file; //fso = new ActiveXObject("Scripting.FileSystemObject"); //文件保存路径,可自定义 //file = fso.OpenTextFile("D:\\Sessions.txt",8 ,true, true); //file.writeLine("Response code: " + oSession.responseCode); //file.writeLine("Response body: " + oSession.GetResponseBodyAsString()); //file.writeLine("\n"); //file.close(); var res = oSession.GetResponseBodyAsString() if(res.Contains("read_num")){ // 获取到阅读数 FiddlerObject.log(res); //数据统计开始:把内容通过ajax http发送其它地方 var _xhr = new ActiveXObject('Microsoft.XMLHTTP'); var url = 'http://localhost:8000/wx/monitor/'; //发送的数据参数 var param = { point: oSession.GetResponseBodyAsString() }; var par = ''; for (var i in param) { var _data = escape(param[i]); par += par ? ("&" + i + "=" + _data) : (i + "=" + _data); } //不需要返回值所以写啦个空回调 _xhr.onreadystatechange = function() {} _xhr.open('POST', url, true); _xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); _xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); _xhr.send(par); //----数据统计结束----- // 等待n分钟后,重新发起请求,实行文章互动量监控 while (true){// 进入死循环 var wait_time=5; // 设置等待重试时间 if((DateTime.Now-current_time).Minutes==wait_time){ var oSD = new System.Collections.Specialized.StringDictionary(); FiddlerApplication.oProxy.SendRequest(oSession.oRequest.headers, oSession.requestBodyBytes, oSD, null); FiddlerObject.log("auto request done..."); break;//注意退出死循环 } //if controll end } // while loop end }else{ // 没有获取到阅读数,弹窗提示用户重新授权 FiddlerObject.alert("请重新打开微信文章进行授权"); } // if end } // if controll end ``` ### 第三步,编写统计接口 django views.py: ``` @csrf_exempt def wx_monitor(request): """微信单帖监控""" if request.method == "POST": point = json.loads(request.POST.get("point", {"msg": "point is null"})) if point: appmsgstat = point.get("appmsgstat") otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(point.get("timestamp"))) ret = { "appmsgstat": appmsgstat, "timestamp": otherStyleTime } add_db_data(ret) return JsonResponse({"msg": "success"}) monitor_list = get_db_info().get("pt_tmp_db") return render(request, 'jira_report/monitor_list.html', locals()) def get_db_info(): tmp_db = os.path.join(os.path.dirname((__file__)), "pt_db.json") with open(tmp_db, "r", encoding="utf8") as fp: db_data = json.load(fp) return db_data def add_db_data(ret): tmp_db = os.path.join(os.path.dirname((__file__)), "pt_db.json") db_data = get_db_info() db_data.get("pt_tmp_db").append(ret) with open(tmp_db, "w", encoding="utf8") as fp: json.dump(db_data, fp, indent=4, ensure_ascii=False) return db_data ``` >[info] 这里以django为例,就是简单的接收在FiddlerScript中发送过来的请求,将监控到的数据存储起来,然后在页面中显示。 ### 第四步,开始监控数据 微信的统计接口,每隔30分钟会失效,所以在FiddlerScript中,会有个if判断处理,当没有统计数据返回时,提醒用户重新打开微信文章,生成新的统计请求。 ![](https://box.kancloud.cn/6299d646b19484f0f493d778c47f36e4_1519x793.png) 统计结果如下: ![](https://box.kancloud.cn/750ec8061c8d8fca9fcbb64aebc55856_1030x230.png) <hr style="margin-top:100px"> :-: ![](https://box.kancloud.cn/331f659e8e6cddb0d9f182e00e32803f_258x258.jpg) ***微信扫一扫,关注“python测试开发圈”,获取更多测试开发分享!***