弄好上面的后,就进入我们最核心的一步了,“偷窥到数据后自动向手机提交答案”!,利用Fiddler的 Script 功能,就能非常的轻松做到,如下图:

Fiddler里捕获的所有会话请求都会执行Script的代码,所以利用这一功能,我们可在Script 实现“答案偷窥”功能,当请求会话接收到远程服务端的数据返回响应后OnBeforeResponse函数会被调用,因此我们可在这函数里增加我们想要做的功能代码,完整代码如下:
static function GetTextLength(text : String) : int{
return System.Text.Encoding.GetEncoding("gb2312").GetByteCount(text);
}
static function GetItemValue(text : String, key : String) : String{
var pattern = key + "":"?([^",}]+)"?";
var m = Regex.Match(text, pattern);
var v = m.Success ? m.Groups[1].Value : null;
FiddlerObject.log(key + " >>>>" + v);
return v;
}
static var questionId : String = "";
static function OnBeforeResponse(oSession: Session) {
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
}
if(oSession.url.IndexOf("secr.baidu.com/nv/answer.sock") >= 0){
var text = oSession.GetResponseBodyAsString();
FiddlerObject.log(oSession.url);
FiddlerObject.log(text);
var var step = GetItemValue(text, "step");
//step=2时才表示是最终认为正确率最高的答案,有时题目出现复活卡文字时表示百度的OCR出现识别错了 :(
if(title != null && title.IndexOf("复活卡") == -1 && "2" == step){
var app = GetItemValue(text, "app");
var qId = app + "_" + GetItemValue(text, "questionId");
//答案(0-2)
var r = GetItemValue(text, "result");
//flag用于处理只提交一次答案
var flag = qId != questionId;
if(r != null && flag){
questionId = qId;
FiddlerObject.log(questionId + ">>选择答案:" + (char)(65 + int.Parse(r)));
var x = 0, y = 0;
//计算题目长度,部分APP的题目显示换行时导致答题项的坐标值跟随改变
var len = GetTextLength(title);
//取得手机APP里答题项的位置坐标(不同屏幕的手机坐标值不一样)
if(app == "huajiao"){
if(r == "0"){
x = 540;
y = 720;
}else if(r == "1"){
x = 540;
y = 880;
}else if(r == "2"){
x = 603;
y = 1040;
}
var m = len / 28;
y = y + (m * 100);
}else if(app == "xiguashipin"){
if(r == "0"){
x = 565;
y = 690;
}else if(r == "1"){
x = 565;
y = 850;
}else if(r == "2"){
x = 565;
y = 1020;
}
//var m = len % 36;
//y = y + (m * 80);
}else if(app == "chongdingdahui"){
if(r == "0"){
x = 550;
y = 552;
}else if(r == "1"){
x = 550;
y = 690;
}else if(r == "2"){
x = 550;
y = 830;
}
var m = len / 36;
y = y + (m * 100);
}else if(app == "zhishichaoren"){
if(r == "0"){
x = 558;
y = 509;
}else if(r == "1"){
x = 558;
y = 686;
}else if(r == "2"){
x = 558;
y = 845;
}
var m = len / 29;
y = y + (m * 70);
}
if(x != 0){
FiddlerObject.log(String.Format("已传送答案>>>>{0} * {1}", x, y));
//调用adb命令用于向手机发送点击命令
var startInfo = new System.Diagnostics.ProcessStartInfo("adb", String.Format("shell input tap {0} {1}",x, y));
startInfo.CreateNoWindow = false;
System.Diagnostics.Process.Start(startInfo);
}
}
}
}
}










