Android反编译看看手Q口令红包的实现原理

2019-12-10 19:07:55王振洲

发现第一个方法似乎就直接发请求了,看来只要调用到这里,就是可以领红包了。那最初又是如何来这里的呢?我们搜索对PasswdRedBagManager内这两个方法的引用找到BaseChatPie.java:

 

public PasswdRedBagManager f25190a;
...
public class EnterForSend implements OnKeyListener, OnEditorActionListener {
  ...
  // 这里从方法名判断是每次输入点击发送后调用
  public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
    if (i != BaseChatPie.dr) {
      return false;
    }
    String obj = this.a.f25220a.getText().toString();
    if (obj.length() > 0) {
      // 调用了外部类的下述方法
      long[] a = this.a.a(obj);
      // 再进行消息发送
      SendMsgParams sendMsgParams = new SendMsgParams();
      sendMsgParams.b = this.a.dL;
      sendMsgParams.a = this.a.dJ;
      sendMsgParams.c = this.a.dN;
      sendMsgParams.f26863c = this.a.dL;
      ...
    }
    return true;
  }
}

// 这里调用了那2个openPasswdRedBagxxx方法
public long[] m5613a(String str) {
  long[] jArr = null;
  // 非匿名模式才会继续尝试匹配口令红包,原来里里外外都做了判断
  if (!AnonymousChatHelper.a().a(this.f25174a.a)) {
    if (TextUtils.isEmpty(this.f25269d) || !str.equals(this.f25278e)) {
      // 使用密码打开
      jArr = this.f25190a.a(this.f25174a, str);
    } else {
      // 使用redPacketId直接打开
      jArr = this.f25190a.b(this.f25174a, this.f25269d);
    }
    // 无意义的打log打点啥的,华丽丽地无视吧
    if (jArr != null && jArr[s] == 1) {
      this.f25269d = QunUppUploadTask.QunUppAppId;
      this.f25278e = QunUppUploadTask.QunUppAppId;
      this.f25228a.sendEmptyMessage(dz);
      if (QLog.isColorLevel()) {
        QLog.d(PasswdRedBagManager.a, u, "passwdredbags result[0]=" + jArr[s] + ",result[1]=" + jArr[t] + ",send str=" + str);
      }
    }
  } else if (QLog.isColorLevel()) {
    QLog.d(PasswdRedBagManager.a, u, "current is in Anonymous, dont search passwdredbags");
  }
  return jArr;
}

可见每次我们输入消息发送时,都发生了判断,会去查询是不是红包口令,如果是则直接发请求拿红包然后继续,否则直接当做普通消息继续发送。所以如果想要做自动抢红包的话,其实只要直接在收到消息时,调用PasswdRedBagManager的open方法即可,连模拟UI、生成请求、发送消息都不用了,我们再也不用昧着良心说口令了。顺便我们还看到了手机QQ确实喜欢用Activity,这里的红包弹框也是一个单独的Activity,而且请求是发送到手Q红包那边去的,看来还分业务线。