利用android monkey 抢支付宝红包

来源:互联网 发布:知其雄兮守其雌 编辑:程序博客网 时间:2024/04/30 21:57

春节来临期间互联网大鳄们纷纷祭出红包必杀技,各种抢红包。支付宝的整点抢红包形式是一个戳人的游戏。话说这个游戏比得就是手快,由此用过android monkey(猴子)工具的人自然可想到抢红包绝招了吧。对,没错这就是绝迹江湖的一阳指,又名adb monkey.下面我就来向大家演示下我是怎么用monkey 戳中支付宝抢红包游戏的每一个小人。


注意如果支付宝有无密码交易的设置请谨慎使用,否则monkey 乱点击可能造成误交易。

两种方式

  • shell 工具 适用于mac linux(android 客户端)
    代码:
echo 开始抓红包啦 ,good luck!#抢红包持续的时间,单位是秒默认持续时间60秒!tTime=60count=$(($tTime*1000/10))echo $countadb shell monkey -p com.eg.android.AlipayGphone --pct-touch 100 --throttle 10 $count &while(true)do    read -p "停止抓红包(按任意键再回车,程序退出)" var    case "$var" in      *)        adb shell kill $(adb shell ps |awk '/monkey/{print $2}')        echo good luck        kill -9 $!        exit 0        ;;          esacdone

com.eg.android.AlipayGphone :支付宝客户客户端packageName
--pct-touch 100 触摸占比(这里100%)
throttle 10 触摸点击间隔,时间单位毫秒(这里10毫秒点击一次)
$count 触摸次数(这里由总的点击持续时间计算出)
最后一个&符号表示此命令作为一个后台命令所以不会影响后续的命令执行。

后面的while 循环实时监控终端输入停止上面的monkey 点击事件。

  • 直接运行于android 的apk

需要手机root权限
上代码:

首先需要请求root权限执行 android 手机内部的monkey 命令(system/bin/monkey)/** commonds 执行的命令* isRoot 是否需要root 权限*/public static CommandResult execCommand(String command, boolean isRoot,            boolean isNeedResultMsg) {        return execCommand(new String[] { command }, isRoot, isNeedResultMsg);    }/** commonds 执行的命令* isRoot 是否需要root 权限*/public static CommandResult execCommand(String[] commands, boolean isRoot,            boolean isNeedResultMsg) {        int result = -1;        if (commands == null || commands.length == 0) {            return new CommandResult(result, null, null);        }        Process process = null;        BufferedReader successResult = null;        BufferedReader errorResult = null;        StringBuilder successMsg = null;        StringBuilder errorMsg = null;        DataOutputStream os = null;        try {            process = Runtime.getRuntime().exec(                    isRoot ? COMMAND_SU : COMMAND_SH);            os = new DataOutputStream(process.getOutputStream());            for (String command : commands) {                if (command == null) {                    continue;                }                // donnot use os.writeBytes(commmand), avoid chinese charset                // error                os.write(command.getBytes());                os.writeBytes(COMMAND_LINE_END);                os.flush();            }            os.writeBytes(COMMAND_EXIT);            os.flush();            result = process.waitFor();            // get command result            if (isNeedResultMsg) {                successMsg = new StringBuilder();                errorMsg = new StringBuilder();                successResult = new BufferedReader(new InputStreamReader(                        process.getInputStream()));                errorResult = new BufferedReader(new InputStreamReader(                        process.getErrorStream()));                String s;                while ((s = successResult.readLine()) != null) {                    successMsg.append(s);                }                while ((s = errorResult.readLine()) != null) {                    errorMsg.append(s);                }            }        } catch (IOException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (os != null) {                    os.close();                }                if (successResult != null) {                    successResult.close();                }                if (errorResult != null) {                    errorResult.close();                }            } catch (IOException e) {                e.printStackTrace();            }            if (process != null) {                process.destroy();            }        }        return new CommandResult(result, successMsg == null ? null                : successMsg.toString(), errorMsg == null ? null                : errorMsg.toString());    }/** 执行命令单独成一个服务这样避免阻塞ui线程造成无响应*/public class StartService extends Service {    private static String tag = "StartService";    private static boolean isStart = false;    public static int totalTime = 60;// second    public static int speed = 2;    private static int count = totalTime * 1000 / 5;    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        Log.e(tag, "onBind");        return null;    }    @Override    public void onCreate() {        // TODO Auto-generated method stub        Log.e(tag, "create");        super.onCreate();    }    /*     * (non-Javadoc)     * @see android.app.Service#onStartCommand(android.content.Intent, int, int)     *      */    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        // TODO Auto-generated method stub        Log.e(tag, "onStartCommond:flags:" + flags + ",startid:" + startId                + ";action:" + intent.getAction() + ";extra:"                + intent.getExtras().get("start"));        start();        return super.onStartCommand(intent, flags, startId);    }    /*     * 结束点击事件     */    public static void stopMonkey() {        isStart = false;        String commond = "kill $(ps |awk '/monkey/{print $2}')";        CommandResult result = ShellUtils.execCommand(commond, true, true);        Log.e("stop Reuslt:", "successMsg:" + result.successMsg + "errorMsg:"                + result.errorMsg + "result:" + result.result);    }/* * 启动服务 */    public static void start() {        if (isStart) {            return;        }        isStart = true;        String commond = "monkey -p com.eg.android.AlipayGphone --pct-touch 100 --throttle "                + speed + " " + count + "& >&/dev/null";        CommandResult result = ShellUtils.execCommand(commond, true, true);        Log.e("start Reuslt:", "successMsg:" + result.successMsg + "errorMsg:"                + result.errorMsg + "result:" + result.result);    }}/** activity 可配置抢红包持续时间以及速度*/public class MainActivity extends ActionBarActivity {    private CastReceive receiver;    private static String tag = "MainActivity";    private Notification notifi;    private NotificationManager nm;    @Override    protected void onCreate(Bundle savedInstanceState) {        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViews();        registReceive();    }    private void initViews() {        Button btn = (Button) findViewById(R.id.done);        btn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                createNotifaction();                EditText speed = (EditText) findViewById(R.id.speed);                String speedStr = speed.getEditableText().toString();                int speedInteger = Integer.valueOf(speedStr);                if (speedInteger != 0) {                    StartService.speed = 5 / speedInteger;                }                EditText total = (EditText) findViewById(R.id.total);                int totalInteger = Integer.valueOf(total.getEditableText()                        .toString());                if (totalInteger != 0) {                    StartService.totalTime = totalInteger;                }            }        });        Button start = (Button) findViewById(R.id.start);        start.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                StartService.start();            }        });    }    private void registReceive() {        IntentFilter filter = new IntentFilter();        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);        filter.addAction(Intent.ACTION_SCREEN_OFF);        receiver = new CastReceive();        registerReceiver(receiver, filter);    }    private void unRegistReceiver() {        if (receiver != null) {            this.unregisterReceiver(receiver);        }    }/** * 创建通知 */    private void createNotifaction() {        NotificationCompat.Builder builder = new NotificationCompat.Builder(                this);        nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);        builder.setAutoCancel(false);        builder.setOngoing(true);        notifi = builder.build();        Intent intent = new Intent();        intent.setClass(getApplicationContext(), StartService.class);        intent.putExtra("start", "hehe");        PendingIntent pendingIntent = PendingIntent.getService(                this.getApplicationContext(), 0, intent, 0);        notifi.when = System.currentTimeMillis();        notifi.icon = R.drawable.ic_launcher;        notifi.tickerText = "asdfsda";        RemoteViews remote = new RemoteViews(getPackageName(), R.layout.remote);        remote.setOnClickPendingIntent(R.id.iambtn, pendingIntent);        notifi.contentView = remote;        Log.e(tag, "createNOtofiy");        nm.notify(R.string.app_name, notifi);    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        //移除通知,结束监听服务        nm.cancelAll();        try {            unRegistReceiver();            Intent intent = new Intent();            intent.setClass(getApplicationContext(), StartService.class);            stopService(intent);        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }    }}

完整代码就不贴了,如有需要请留言。
此案例可延伸为更丰富的压力测试,通过配置adb monkey 其他的参数。

关于android monkey 更多地使用自行脑补了。

0 0
原创粉丝点击