小小滑块可笑可笑-安卓滑块验证码通杀方案研究(3)
前言
本章继续研究滑块的对抗,来到了核心的轨迹生成部分
录制工具的编写
所谓录制工具其实就是记下时间点的坐标位置
关于坐标位置的记录,请各位安卓开发人员自行复习:
Android 事件传递机制详解
事件顺序 Activity--> Window-->DecorView --> 布局View
实体类point_time定义
public class TimePoint {
private long time;
private float x;
private float y;
public TimePoint(long time, float x, float y) {
this.time = time;
this.x = x;
this.y = y;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}
保存point time
触摸事件拦截记录
public class MainActivity extends AppCompatActivity {
ArrayList<TimePoint> timePoints = new ArrayList<>();
long startTime = 0L;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//事件顺序 Activity--> Window-->DecorView --> 布局View
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//从按下开始 0
//从离开结束 1
if(ev.getAction()==0){
startTime = TimeUtils.getNowMills();
timePoints.clear();
}
if(ev.getAction()==2){
timePoints.add(new TimePoint(TimeUtils.getNowMills()-startTime,ev.getRawX(),ev.getRawY()));
}
if(ev.getAction()==1){
timePoints.add(new TimePoint(TimeUtils.getNowMills()-startTime,ev.getRawX(),ev.getRawY()));
String data = new Gson().toJson(timePoints);
Log.e("xxx",data);
}
return super.dispatchTouchEvent(ev);
}
}
核心就是dispatchTouchEvent方法中拦截事件记录下来
测试生成的轨迹记录
随便一滑
[{"time":7,"x":180.83257,"y":1229.4462},{"time":39,"x":182.83072,"y":1229.4462},{"time":41,"x":194.08751,"y":1231.0153},{"time":55,"x":204.31084,"y":1231.9451},{"time":58,"x":222.06346,"y":1237.169},{"time":73,"x":238.27936,"y":1241.9404},{"time":75,"x":254.25331,"y":1247.2677},{"time":89,"x":268.2516,"y":1251.936},{"time":91,"x":285.22064,"y":1254.8489},{"time":106,"x":303.7188,"y":1257.9333},{"time":108,"x":325.78207,"y":1262.648},{"time":122,"x":344.68085,"y":1266.4294},{"time":124,"x":367.20758,"y":1271.279},{"time":139,"x":387.64105,"y":1275.9253},{"time":140,"x":412.6566,"y":1280.6907},{"time":158,"x":450.11096,"y":1286.1744},{"time":188,"x":504.03333,"y":1296.416},{"time":190,"x":551.3913,"y":1306.5754},{"time":206,"x":572.4699,"y":1310.4097},{"time":208,"x":595.25433,"y":1316.845},{"time":222,"x":617.4283,"y":1323.9038},{"time":224,"x":638.30457,"y":1330.0212},{"time":239,"x":660.88806,"y":1336.898},{"time":242,"x":677.3767,"y":1339.2922},{"time":273,"x":733.32104,"y":1354.8896},{"time":276,"x":748.3225,"y":1358.791},{"time":291,"x":763.79285,"y":1361.8865},{"time":294,"x":779.26654,"y":1366.5145},{"time":305,"x":793.765,"y":1370.3826},{"time":306,"x":806.70953,"y":1374.2257},{"time":321,"x":819.74097,"y":1376.8799},{"time":322,"x":833.0282,"y":1380.0782},{"time":339,"x":844.2183,"y":1382.8772},{"time":342,"x":853.7906,"y":1383.8988},{"time":357,"x":873.35693,"y":1387.523},{"time":372,"x":881.68365,"y":1389.3743},{"time":373,"x":887.5774,"y":1389.9404},{"time":388,"x":893.173,"y":1390.8734},{"time":389,"x":896.481,"y":1391.9508},{"time":406,"x":900.16656,"y":1392.8726},{"time":410,"x":903.26733,"y":1392.9243},{"time":422,"x":905.1619,"y":1393.8721},{"time":425,"x":905.6614,"y":1394.8718},{"time":427,"x":905.16187,"y":1394.372}]
如果要指定滑动距离 只需要做好位置标记即可,
假设生成了100条从
100-200到100-1000之间的轨迹记录,接下来在复用轨迹记录的时候。
比较要滑动的距离离哪个最近 就用哪个去匹配即可。
总结
轨迹记录工具源代码放在仓库https://github.com/HuRuWo/KillerAndroidSlide
接下来一节就是实战滑动