Xposed第四課(微信篇) 朋友圈點贊(2)之好友列表
前面做了個小玩意,朋友圈點贊,缺點是隻能在當前介面臨時顯示,並且不能選擇好友,返回後在進去就沒有了,今天準備將聯絡人與朋友圈點贊功能關聯起來。
首先分析佈局結構
根據關鍵名稱進行查詢
BizContactEntranceView | AlphabetScrollBar |
---|---|
定位到了com.tencent.mm.ui.contact.AddressUI
有人想,你光找到這個有個軟用,資料庫你不找到怎麼去儲存到你自己的app裡面。 大家接著往下看,可能我程式碼有自己的想法,皮一下很開心O(∩_∩)O
先上程式碼
@Override
public void hookContact() {
XposedHelpers.findAndHookMethod("com.tencent.mm.ui.contact.AddressUI.a",
mClassLoader,
"coR",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Field oiy = XposedHelpers.findField(param.thisObject.getClass(), "oiy");
oiy.setAccessible(true);
LogUtils.i(oiy);
ListView oiyLv = (ListView) oiy.get(param.thisObject);
Class<?> mlvSuperClass = oiyLv.getClass().getSuperclass();
LogUtils.i(oiyLv);
XposedHelpers.findAndHookMethod(mlvSuperClass,
"setAdapter",
ListAdapter.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
final ListAdapter adapter = (ListAdapter) param.args[0];
LogUtils.i(adapter.toString());
XposedHelpers.findAndHookMethod(adapter.getClass(),
"getView",
int.class,
View.class,
ViewGroup.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
int position = (int) param.args[0];
final View view = (View) param.args[1];
final ViewGroup viewGroup = (ViewGroup) param.args[2];
LogUtils.i(position, view, viewGroup, JSON.toJSONString(adapter.getItem(position)), adapter.getItem(position).toString());
}
});
}
});
}
});
}
可以得到以下資訊
05-30 08:20:00.685 3223-3223/com.tencent.mm I/ContactImpl:
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.zed.xposed.demo.action.inter.impl.ContactImpl$1.afterHookedMethod(ContactImpl.java:39)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ private android.widget.ListView com.tencent.mm.ui.contact.AddressUI$a.oiy
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.zed.xposed.demo.action.inter.impl.ContactImpl$1.afterHookedMethod(ContactImpl.java:42)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ android.widget.ListView{10d02036 V.ED..CL ......ID 0,0-768,930 #7f10016e app:id/j8}
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
05-30 08:20:01.066 3223-3223/com.tencent.mm I/ContactImpl:
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.zed.xposed.demo.action.inter.impl.ContactImpl$1$1.beforeHookedMethod(ContactImpl.java:51)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ com.tencent.mm.ui.contact.a@2e2454f8
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
05-30 08:20:01.102 3223-3223/com.tencent.mm I/ContactImpl:
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.zed.xposed.demo.action.inter.impl.ContactImpl$1$1$1.beforeHookedMethod(ContactImpl.java:64)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = 0
│ args[1] = null
│ args[2] = android.widget.ListView{10d02036 VFED..CL ......ID 0,0-768,930 #7f10016e app:id/j8}
│ args[3] = {"fNU":49,"field_conRemark":"","field_deleteFlag":0,"field_descWordingId":"","field_nickname":"Aa 黃蓋","field_openImAppid":"","field_remarkDesc":"","field_showHead":65,"field_signature":"","field_username":"此處不顯示","field_verifyFlag":0,"field_weiboFlag":0,"key":"此處不顯示"}
│ args[4] = com.tencent.mm.storage.f@1ac21e2a
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
05-30 08:20:01.114 3223-3223/com.tencent.mm I/ContactImpl:
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.zed.xposed.demo.action.inter.impl.ContactImpl$1$1$1.beforeHookedMethod(ContactImpl.java:64)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = 1
│ args[1] = null
│ args[2] = android.widget.ListView{10d02036 VFED..CL ......ID 0,0-768,930 #7f10016e app:id/j8}
│ args[3] = {"fNU":66,"field_conRemark":"","field_deleteFlag":0,"field_descWordingId":"","field_nickname":"aLOL-代練-小客服","field_openImAppid":"","field_remarkDesc":"","field_showHead":65,"field_signature":"想要LOL代練可以私聊","field_username":"此處不顯示","field_verifyFlag":0,"field_weiboFlag":0,"key":"此處不顯示"}
│ args[4] = com.tencent.mm.storage.f@e76f385
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
這是部分資料,我接下來要做的就是要一次性載入全部資料儲存到自己的app 我們把上面的程式碼少位改造下
/**
* 直接取得聯絡人列表資料
*/
@Override
public void hookContact() {
XposedHelpers.findAndHookMethod("com.tencent.mm.ui.contact.AddressUI.a",
mClassLoader,
"coR",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Field oiy = XposedHelpers.findField(param.thisObject.getClass(), "oiy");
oiy.setAccessible(true);
LogUtils.i(oiy);
ListView oiyLv = (ListView) oiy.get(param.thisObject);
Class<?> mlvSuperClass = oiyLv.getClass().getSuperclass();
LogUtils.i(oiyLv);
XposedHelpers.findAndHookMethod(mlvSuperClass,
"setAdapter",
ListAdapter.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
final ListAdapter adapter = (ListAdapter) param.args[0];
LogUtils.i(adapter.toString());
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
WxContact contact = JSON.parseObject(JSON.toJSONString(adapter.getItem(i)), WxContact.class);
WxContact ct = WxContactDB.queryByUsername(mContext, contact.getField_username());
//先判斷是否已經存在了 在進行儲存
if (ct == null) {
LogUtils.i(JSON.toJSONString(contact));
WxContactDB.insertData(mContext, contact);
}
}
}
});
}
});
}
然後與朋友長按事件關聯 彈出一個聯絡人列表 進行選擇
改造後的程式碼如下
/**
* hook 朋友圈
*/
@Override
public void hookWxMoments() {
XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.sns.ui.bb",
mClassLoader,
"onCreate",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Field mat = XposedHelpers.findFieldIfExists(param.thisObject.getClass(), "mActivity");
final Activity mActivity = (Activity) mat.get(param.thisObject);
Field odm = XposedHelpers.findFieldIfExists(param.thisObject.getClass(), "odm");
ListView mlv = (ListView) odm.get(param.thisObject);
Class<?> mlvSuperClass = mlv.getClass().getSuperclass();
XposedHelpers.findAndHookMethod(mlvSuperClass,
"setAdapter",
ListAdapter.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
final ListAdapter adapter = (ListAdapter) param.args[0];
XposedHelpers.findAndHookMethod(adapter.getClass(),
"getView",
int.class,
View.class,
ViewGroup.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
final View view = (View) param.args[1];
if (view != null) {
//fl 第一個view是圖片 第二個view是朋友圈內容
final ViewGroup fl = (ViewGroup) view;
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
final List<WxContact> wxContacts = WxContactDB.queryAll(mContext);
LogUtils.i(JSON.toJSONString(wxContacts));
Dialog show = WxMomentContactDialog.instance(mActivity).build(wxContacts, new WxMomentContactDialog.CallBack() {
@Override
public void sure() {
final StringBuffer sb = new StringBuffer();
for (int i = 0; i < wxContacts.size(); i++) {
WxContact contact = wxContacts.get(i);
if (contact.isCheck()) {
sb.append(contact.getField_nickname());
sb.append(",");
}
}
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
String s = sb.toString();
if (fl != null && fl.getChildCount() > 1) {
LinearLayout msgLinear = (LinearLayout) fl.getChildAt(1);
for (int i = 0; i < msgLinear.getChildCount(); i++) {
View mc = msgLinear.getChildAt(i);
String resourceName = mContext.getResources().getResourceName(mc.getId());
if ("com.tencent.mm:id/de_".equals(resourceName)) {
ViewGroup vg = (ViewGroup) mc;
mc.setVisibility(View.VISIBLE);
if (vg.getChildCount() > 0) {
TextView likeView = (TextView) vg.getChildAt(0);
likeView.append(s);
} else {
TextView tv = new TextView(mContext);
tv.setText("");
tv.append(",");
tv.append(s);
tv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
vg.addView(tv);
}
}
}
}
}
});
}
});
show.show();
show.getWindow().setLayout(ViewUtil.dp2px(mActivity, 300f), ViewUtil.dp2px(mActivity, 400f));
return false;
}
});
}
}
});
}
});
}
});
}
效果圖如下
效果一 | 效果二 | 效果三 |
---|---|---|
有些不完美的地方,聯絡人需要點選下通訊錄才開始儲存資料 這個階段先做到聯絡人與點贊關聯,下次把點讚的聯絡人與朋友圈訊息關聯關係一起儲存起來。就可以做到下次在進去朋友圈可以看到上次點讚的。後面還可以進行取消以及其他操作
這次我把我用到的微信版本和genymotion的arm-transfer放進去了 所以體積變大了 哈哈
相關文章
- Xposed第四課(微信篇) 朋友圈點贊 (1)
- 28.qt quick-ListView高仿微信好友列表和聊天列表QTUIView
- 微擎 微贊 微盟 有贊 點點客微信介面對比哪個好
- 微信小程式--仿朋友圈Pro(內容釋出、點贊、評論、回覆評論)微信小程式
- 微信小程式實現點贊、取消點贊,和多項點選功能微信小程式
- 微信朋友圈
- 小白觀察:微信朋友圈@好友評論互動能力全量開放
- Android輔助許可權之微信自動評論與點贊Android
- 微信小程式第四篇 模板使用微信小程式
- Xposed快速入門例子(一)----- 拉黑好友
- 使用R語言分析微信好友R語言
- 如何利用Python網路爬蟲抓取微信好友數量以及微信好友的男女比例Python爬蟲
- vue實現對文章列表的點贊Vue
- 當 Python 遇到了你的微信好友Python
- (乾貨)微信小程式轉發好友微信小程式
- python itchat 爬取微信好友資訊Python
- 企業微信sdk呼叫,企業微信好友收發訊息
- 2019情人節發微信朋友圈說說 情人節發微信朋友圈情人節句子
- 2021微信公開課PRO最全亮點
- 微信小程式點贊、評論區域性重新整理微信小程式
- 微信小程式——計算2點之間的距離微信小程式
- 微信小程式-列表渲染微信小程式
- 實現高效能微信朋友圈
- 朋友圈分享動態吸引好友的方法
- 批次檢測微信單向好友,超實用!
- Python自動掃描出微信不是好友名單Python
- C與微信新玩法之儲存媒體資訊轉發給好友
- 為女朋友朋友圈自拍點贊,幽默又深情的方法
- 微信收藏拼長圖發朋友圈教程 微信怎麼拼圖?
- 2021微信公開課PRO最全亮點請收好
- 微信不新增好友也能聊天技巧 微信怎麼跟陌生人聊天?
- 微信小助手2.9.0:專為mac微信3.1.2發行!支援發朋友圈!Mac
- 微信有3000以上好友的人,更容易找工作
- 微信灰測朋友圈摺疊圖片功能
- 微信互刪好友聊天記錄還能恢復嗎
- 微信小遊戲好友排行榜快速開發教程遊戲
- 微信朋友圈發口令或被封號 微信永久封號新規是什麼?
- 微信小程式之小白教程系列 第一篇 微信小程式 — Hello World微信小程式