免责申明:
本文只讨论技术,项目不用于任何利益行为,如因此产生的纠纷,本人概不负责。

前言

在阅读本文之前,假设你的手机已经root,并且已经成功安装好了 XposedInstaller。

正文

就我知道的,微信自动抢红包存在着两种方式,一种是利用安卓帮助残障用户使用android设备和应用的AccessibilityService进行模拟点击(本文不做讨论),第二种方式是直接hook微信本身的方法进行自动抢。第一种方式受限太多,比如手机本身性能等,并且抢的速度在不考虑手机性能的情况下第二种会快一些。
我们需要一个方法去实现 IXposedHookLoadPackage 这个接口,重写它内部提供的方法。此间我们会用到的是微信的包地址(com.tencent.mm)和数据库地址(com.tencent.wcdb.database.SQLiteDatabase)这里先给出。
首先第一步我们需要插入数据库进行操作,获取一些必要的信息:
1)hook数据库insert操作,打印是否成功插入
2)判断插入的数据是否是发送过来的消息
3)判断是否是红包消息类型
4)处理红包消息

   //hook数据库插入操作private void hookDatabaseInsert(final XC_LoadPackage.LoadPackageParam loadPackageParam) {Class findClassIfExists = XposedHelpers.findClassIfExists(WECHAT_DATABASE_PACKAGE_NAME, loadPackageParam.classLoader);if (findClassIfExists == null) {XposedBridge.log("hook数据库insert操作:未找到类com.tencent.wcdb.database.SQLiteDatabase");return;}XposedHelpers.findAndHookMethod(findClassIfExists, "insertWithOnConflict", new Object[]{String.class, String.class, ContentValues.class, Integer.TYPE, new XC_MethodHook() {/* access modifiers changed from: protected */public void afterHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) throws Throwable {Integer asInteger;//打印插入的信息XposedBridge.log("------------------------insert start---------------------\n\n");XposedBridge.log("param args1:" + ((String) methodHookParam.args[0]));XposedBridge.log("param args1:" + ((String) methodHookParam.args[1]));ContentValues contentValues = (ContentValues) methodHookParam.args[2];XposedBridge.log("param args3 contentValues:");for (Map.Entry next : contentValues.valueSet()) {if (next.getValue() != null) {XposedBridge.log(((String) next.getKey()) + "---------" + next.getValue().toString());} else {XposedBridge.log(((String) next.getKey()) + "---------null");}}XposedBridge.log("------------------------insert over---------------------\n\n");//判断插入的数据是否是发送过来的消息String str = (String) methodHookParam.args[0];XposedBridge.log("消息类型:" + contentValues.getAsInteger("type"));if (!TextUtils.isEmpty(str) && str.equals("message") && (asInteger = contentValues.getAsInteger("type")) != null && asInteger.intValue() == 436207665) {//处理红包消息XposedInit.this.handleLuckyMoney(contentValues, loadPackageParam);}}}});}

其次需要在红包出现的界面做一些操作:
1)hook 微信主界面的onCreate方法,获得主界面对象
2)hook领取红包页面的onCreate方法,打印Intent中的参数(只起到调试作用)
3)hook红包界面初始化“开”按钮的方法,在该方法完成后自动点击开按钮领取红包

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) {//调用hook数据库插入hookDatabaseInsert(loadPackageParam);//**************红包专用开始**************//hook微信主界面的onCreate方法,获得主界面对象XposedHelpers.findAndHookMethod("com.tencent.mm.ui.LauncherUI", loadPackageParam.classLoader, "onCreate", new Object[]{Bundle.class, new XC_MethodHook() {/* access modifiers changed from: protected */public void afterHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) throws Throwable {XposedBridge.log("com.tencent.mm.ui.LauncherUI onCreated\n");Activity unused = XposedInit.launcherUiActivity = (Activity) methodHookParam.thisObject;}}});//hook领取红包页面的onCreate方法,打印Intent中的参数(只起到调试作用)
XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI", loadPackageParam.classLoader, "onCreate", new Object[]{Bundle.class, new XC_MethodHook() {/* access modifiers changed from: protected */public void afterHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) throws Throwable {Activity activity = (Activity) methodHookParam.thisObject;String stringExtra = activity.getIntent().getStringExtra("key_native_url");String stringExtra2 = activity.getIntent().getStringExtra("key_username");int intExtra = activity.getIntent().getIntExtra("key_way", 0);XposedBridge.log("key_native_url: " + stringExtra + "\n");XposedBridge.log("key_way: " + intExtra + "\n");XposedBridge.log("key_username: " + stringExtra2 + "\n");}}});
//hook红包界面初始化“开”按钮的方法,在该方法完成后自动点击“开”按钮领取红包
XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI", loadPackageParam.classLoader, "d", new Object[]{Integer.TYPE, Integer.TYPE, String.class, XposedHelpers.findClass("com.tencent.mm.ab.l", loadPackageParam.classLoader), new XC_MethodHook() {/* access modifiers changed from: protected */public void afterHookedMethod(XC_MethodHook.MethodHookParam methodHookParam) throws Throwable {XposedBridge.log("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI: Method d called\n");((Button) XposedHelpers.findField(methodHookParam.thisObject.getClass(), "kMG").get(methodHookParam.thisObject)).performClick();}}});
}
//**************红包专用结束**************

最后到了最关键的一步:
1)从插入的数据库中获得nativeurl
2)启动红包页面
3)至于抢的操作Xposed内置的 callStaticMethod 已经帮我们完成了

 //处理红包消息public void handleLuckyMoney(ContentValues contentValues, XC_LoadPackage.LoadPackageParam loadPackageParam) throws Exception {String asString = contentValues.getAsString("talker");//从插入的数据库中获得nativeurlString asString2 = contentValues.getAsString("content");if (!asString2.startsWith("<msg")) {asString2 = asString2.substring(asString2.indexOf("<msg"));}String string = new XmlToJson.Builder(asString2).build().toJson().getJSONObject(NotificationCompat.CATEGORY_MESSAGE).getJSONObject("appmsg").getJSONObject("wcpayinfo").getString("nativeurl");XposedBridge.log("nativeurl: " + string + "\n");//启动红包页面if (launcherUiActivity != null) {XposedBridge.log("call method com.tencent.mm.bm.d b, start LuckyMoneyReceiveUI\n");Intent intent = new Intent();intent.putExtra("key_way", 1);intent.putExtra("key_native_url", string);intent.putExtra("key_username", asString);XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.tencent.mm.bg.d", loadPackageParam.classLoader), "b", new Object[]{launcherUiActivity, "luckymoney", ".ui.LuckyMoneyReceiveUI", intent});return;}XposedBridge.log("launcherUiActivity == null\n");}

技巧: 获取每个页面的关键类信息,可以通过DDMS进行进程追踪(动手google或者百度)或者通过UI工具去实现查找,当然这里我介绍一种最最最最不折磨人的方式各大应用市场搜TopActivity(神器啊!想了解这个的同学可以去gayhub找源码看)。

附:编译好的APK程序

写在最后
学之深,则越发觉得世界之大,你我皆如井底之蛙,奋斗不息,方达彼岸。
不定期更新博客,期待和大家一起进步。

利用Xposed秒抢微信红包相关推荐

  1. 如何写一个自动抢微信红包的程序

    春节临近,为避免错失土豪们的红包,动手写了一个自动抢微信红包的小程序,试了一下效果还不错.本程序适用于安卓4.1版本以上手机,不需要ROOT权限.现将程序的设计要点记录如下,供有兴趣的同行参考. 一. ...

  2. 用 Python 来全自动抢微信红包

    最近在做手机app自动化测试,想用python写个自动抢微信红包的程序,先在网上查了一下,发现抢红包教程要么是用itchat模块做到红包提醒功能,要么root手机后用Xposed框架,这两种方式都不是 ...

  3. Android通过辅助功能实现抢微信红包原理简单介绍

    简书文章:https://www.jianshu.com/p/e1099a94b979 附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧 ...

  4. python自动抢_Python+Appium实现自动抢微信红包

    前言 过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情. 于是我用python解决我们的手速问 ...

  5. xposed开发11 - 微信红包

    xposed开发11 - 微信红包 private static Activity launcherUIActivity = null;// 微信红包 hookClass = "com.te ...

  6. Android 实现自动抢微信红包

    原理 我们使用的还是安卓自带的辅助功能 AccessibilityService . 先来讲述以下原理,原理很简单,当页面发生变化的时候,搜索屏幕中的关键字,搜索到了就点开.这个原理在微信旧版本的自动 ...

  7. 教你如何抢微信红包!实验数据告诉你先抢后抢的区别有多大?

    16年暑期的时候有幸在老师的带动下和200多位同学一起在微信群里发红包,用大量的实际数据研究了微信红包背后的故事. 此片文章主要分析微信群中红包发放的数据,找到红包金额分布规律.时序分布规律以及每个人 ...

  8. 我用Python自动抢微信红包!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  9. python实现自动化抢微信红包功能_【Python】用Python实现微信自动化抢红包,再也不用担心抢不到红包了...

    1. 概述 刚刚收到了两个消息,一个好消息,一个坏消息. 先说好消息,好消息就是微信群里有人要发红包,开心~ 不过转念一想,前几次的红包一个都没抢到,这次???不由自主的叹了一口气 - 过了一会,内心 ...

  10. python自动抢微信红包源码_用Python实现微信自动化抢红包,再也不用担心抢不到红包了...

    1. 概述 刚刚收到了两个消息,一个好消息,一个坏消息. 先说好消息,好消息就是微信群里有人要发红包,开心~ 不过转念一想,前几次的红包一个都没抢到,这次???不由自主的叹了一口气 ... 过了一会, ...

最新文章

  1. Linux安装Nginx、Redis、django
  2. 迁移学习之ResNet50和ResNet101(图像识别)
  3. webpack打包生成的map文件_从这十几个方面优化你的 Webpack 配置
  4. 计算机考博哪个学校好考,管理学博士哪个学校好考
  5. mysql 横向排列,mysql横向转纵向、纵向转横向排列的方法
  6. Django请求响应对象
  7. c和java内存泄漏区别_内存溢出和内存泄漏的区别(转)
  8. 爬虫第四篇:html解析之xpath
  9. 小米4刷CM13系统
  10. 立即预约!Meet Qt Online中国来了
  11. 数据结构与算法java_数据结构与算法(Java语言版).pdf
  12. 量子计算机慕课,计算机组成原理-中国大学mooc-题库零氪
  13. python自动打开网页_python 自动批量打开网页的示例
  14. c51汇编语言如何定义全局变量_汇编语言程序访问C语言全局变量
  15. 使用频谱仪测试信号抗干扰实验
  16. 计算机程序员的英语词汇,计算机程序员常用英语词汇
  17. 饥荒服务器账号问题,求救,游侠平台的 饥荒服务器问题 请教高手指教下
  18. 微信开发者工具 当前系统代理不是安全代理,是否信任?问题之完美解决
  19. OCR手写数字识别什么软件好用?介绍一种
  20. 《巴菲特之道》精髓:巴菲特的股神进阶之路和投资方法

热门文章

  1. 如何开发一套完整的医疗远程会诊系统方案
  2. 图像处理经典算法及OpenCV程序
  3. oracle短表和长表的区别,人口普查长表哪些人填和短表有什么区别
  4. 卸载ie8的一些方法
  5. ActivityManager.getRunningTasks笔记
  6. 2015-5-23PDF的下载链接
  7. 弱口令检测 -- WebCrack v(1.1)
  8. UEFI的诞生与优势
  9. 读一本自己心爱的书,冒什么风险都是值得的
  10. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(一)之效果展示与关键技术简介