关于安卓请求中的滑动验证码的处理
本人第一次写帖子,前段时间跟朋友为了抢学校的羽毛球场,写了一个python的脚本,但是本人又想写一个有ui的。但是呢,我们的频繁请求被学校发现了,同学被老师叫去约谈了,也增加了滑动验证码。所以本次针对滑动验证码处理一下。首先,进行验证码请求抓包!!
其中 "backImg":"/9j/4AAQSkZJRgABAQEAYABgAAD........,这里是验证码的大图片。
"captureImg":"/9j/4AAQSkZJRgABAQEAYABgAAD.....这里是可滑动图片
这里的图片加密编码是base64,为什么呢?因为它的编码方式是以==结尾的,同时BASE64编码加密过的验证码图片应该怎样获取?依照他的方法验证了,确实可行。下面代码可以将base64编码转为图片
public static String GetImageStr(String imgFilePath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
byte[] data = null;
// 读取图片字节数组
try {
InputStream in = new FileInputStream(imgFilePath);
data = new byte;
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 返回Base64编码过的字节数组字符串
}
public static boolean GenerateImage(String imgStr, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片
if (imgStr == null) // 图像数据为空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
// Base64解码
byte[] bytes = decoder.decodeBuffer(imgStr);
for (int i = 0; i < bytes.length; ++i) {
if (bytes < 0) {// 调整异常数据
bytes += 256;
}
}
// 生成jpeg图片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(bytes);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
上面是验证码的获取,现在我们进行处理:
Android Studio 新建一个项目:
activity_main.xml文件代码如下(b为大图片,c为小图片验证):<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/iv_b"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/b"/>
<ImageView
android:id="@+id/iv_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/c"/>
</RelativeLayout>
MainActivity.java代码如下:
package cs.cs;
//你的包名
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView iv_main;
private RelativeLayout parentView;
private int lastX;
private int lastY;
private int maxRight;
private int maxBottom;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_main =findViewById(R.id.iv_main);
parentView = (RelativeLayout) iv_main.getParent();
// int right = parentView.getRight(); //0
//int bottom = parentView.getBottom(); //0
//Toast.makeText(this, right+"---"+bottom,Toast.LENGTH_SHORT).show();
//设置touch监听
iv_main.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int eventX = (int) event.getRawX();
int eventY = (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//得到父视图的right/bottom
if(maxRight==0) {//保证只赋一次值
maxRight = parentView.getRight();
maxBottom = parentView.getBottom();
}
//第一次记录lastX/lastY
lastX =eventX;
lastY = eventY;
break;
case MotionEvent.ACTION_MOVE:
//计算事件的偏移
int dx = eventX-lastX;
int dy = eventY-lastY;
//根据事件的偏移来移动imageView
int left = iv_main.getLeft()+dx;
int top = iv_main.getTop()+dy;
int right = iv_main.getRight()+dx;
int bottom = iv_main.getBottom()+dy;
//限制left >=0
if(left<0) {
right += -left;
left = 0;
}
//限制top
if(top<0) {
bottom += -top;
top = 0;
}
//限制right <=maxRight
if(right>maxRight) {
left -= right-maxRight;
right = maxRight;
}
//限制bottom <=maxBottom
if(bottom>maxBottom) {
top -= bottom-maxBottom;
bottom = maxBottom;
}
iv_main.layout(left, top, right, bottom);
//再次记录lastX/lastY
lastX = eventX;
Log.e("X",String.valueOf(left*221/600));
//这里的600为这里控件的真实长,221为验证码真实长
//225和83同理
lastY = eventY;
Log.e("Y",String.valueOf(top*83/225));
break;
default:
break;
}
return true;//所有的motionEvent都交给imageView处理
}
});
}
}
打包测试:
同时BASE64编码加密过的验证码图片应该怎样获取?的地址为:https://www.teamczyx.com/thread-404-1-1.html 不小心弄掉了 厉害,学习了。
页:
[1]