利用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
- 利用android monkey 抢支付宝红包
- 支付宝抢红包神器
- 支付宝AR抢红包
- 怎么抢支付宝口令红包口令 支付宝抢红包的吱口令红包
- 支付宝红包口令
- 支付宝红包分析
- 怎样抢支付宝口令红包 支付宝红包在哪里抢
- 支付宝无限抢红包工具-速度来领!
- 安卓支付宝抢红包脚本软件
- 前端轻松破解支付宝AR抢红包
- 支付宝AR抢红包?前端轻松就破解~
- 在电脑上怎么用支付宝抢红包
- 支付宝如何领取红包 红包怎么领取的
- 支付宝红包首秀失利
- 支付宝商家红包发红包步骤
- 春晚最全支付宝现金红包全攻略
- 扫码领取支付宝红包
- 红包 支付宝 微信 qq
- Jboss:配置应用的部署目录
- MSSQL示例(三)ROW_NUMBER、RANK、DENSE_RANK、NTILE排名窗口函数示例
- STL insert() demo
- Ruby Digest
- POJ 3279 Fliptile
- 利用android monkey 抢支付宝红包
- 【Java】浅谈JDBC事务处理
- iOS长按保存图片
- HDU-Can you solve this equation? -二分法求高次方程近似解
- http和socket简介
- Machine Learning - VIII. Neural Networks Representation神经网络的表示 (Week 4)
- 安卓之WebView的使用小结
- 毕设记录
- [linux device driver] Chapter 03:scullc_open理解