Shamrock: 完成QQ收藏数据分析

This commit is contained in:
WhiteChi 2023-12-21 02:25:20 +08:00
parent 35c82fcc51
commit 5000453002
15 changed files with 883 additions and 0 deletions

View File

@ -0,0 +1,51 @@
package com.tencent.mobileqq.transfile;
public class HttpNetReq extends NetReq {
public static final int HTTP_GET = 0;
public static final int HTTP_POST = 1;
public IFlowDecoder decoder;
public DnsParseCallback mDnsParseCallback;
public boolean mHaveIpConnect;
public String mHostForHttpsVerify;
public int mHttpMethod;
public boolean mIsHostIP;
public boolean mIsHttps;
public boolean mIsPreStructPic;
public boolean mIsSync;
public boolean mNeedIpConnect;
public boolean mNeedNotReferer;
public boolean mNeedRedirectCallback;
public String mReqUrl;
public TimeoutParam mTimeoutParam;
public boolean mUseCmwapConnectionTypeFromDpc;
public String[] mWhiteListContentType;
public interface DecoderState {
public static final int STATE_END = 2;
public static final int STATE_INIT = 0;
public static final int STATE_RUNNING = 1;
}
public interface DnsParseCallback {
void end();
void start();
}
public interface IFlowDecoder {
byte[] decode(byte[] bArr);
boolean isFinish();
void reset();
}
public HttpNetReq() {
this.mHttpMethod = 0;
this.mNeedIpConnect = false;
this.mHaveIpConnect = false;
this.mNeedRedirectCallback = false;
this.mUseCmwapConnectionTypeFromDpc = false;
this.mNeedNotReferer = false;
}
}

View File

@ -0,0 +1,7 @@
package com.tencent.mobileqq.transfile;
public interface INetEngineListener {
void onResp(NetResp netResp);
void onUpdateProgeress(NetReq netReq, long j2, long j3);
}

View File

@ -0,0 +1,5 @@
package com.tencent.mobileqq.transfile;
public interface NetFailedListener {
void onFailed(NetResp netResp);
}

View File

@ -0,0 +1,89 @@
package com.tencent.mobileqq.transfile;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
public class NetReq {
public static final int PRIOTY_HIGH = 0;
public static final int PRIOTY_LOW = 2;
public static final int PRIOTY_NORMAL = 1;
public boolean bAcceptNegativeContentLength;
public int mBusiProtoType;
public INetEngineListener mCallback;
public boolean mCanPrintUrl;
public int mContinuErrorLimit;
public int mContinueConnReusedErrorLimit;
public long mDelayTime;
public long mEndDownOffset;
public long mExcuteTimeLimit;
public NetFailedListener mFailedListener;
public int mFileType;
public HostParseToIp mHostParseToIp;
public boolean mIsNetChgAsError;
public boolean mIsRenameInEngine;
public String mKey;
public String mMsgId;
public String mOutPath;
public OutputStream mOutStream;
public int mPrioty;
public Object mPrivate;
public HashMap<String, String> mReqProperties;
public NetResp mResp;
public byte[] mSendData;
public List<ServerAddr> mServerList;
public long mStartDownOffset;
public boolean mSupportBreakResume;
public String mTempPath;
public boolean mUseByteArrayPool;
public boolean mUseRaf;
private Object mUserData;
public long taskStartTime;
public interface HostParseToIp {
List<ServerAddr> getIpByHost(String str);
}
public NetReq() {
this.mStartDownOffset = 0L;
this.mEndDownOffset = 0L;
this.mIsRenameInEngine = true;
this.mDelayTime = 0L;
this.mExcuteTimeLimit = 480000L;
this.mContinuErrorLimit = 8;
this.mContinueConnReusedErrorLimit = 5;
this.mIsNetChgAsError = false;
this.mPrioty = 1;
this.mResp = null;
this.mCanPrintUrl = true;
this.bAcceptNegativeContentLength = true;
this.mUseByteArrayPool = false;
this.mKey = null;
this.taskStartTime = -1L;
this.mReqProperties = new HashMap<>();
}
public long getTaskCostTime() {
return System.currentTimeMillis() - taskStartTime;
}
public synchronized Object getUserData() {
return mUserData;
}
public boolean isWriteToFile() {
return this.mOutPath != null;
}
public boolean isWriteToStream() {
return this.mOutStream != null;
}
public boolean saveRecvDataInTransLayer() {
return this.mOutPath != null || this.mOutStream != null;
}
public synchronized void setUserData(Object obj) {
this.mUserData = obj;
}
}

View File

@ -0,0 +1,72 @@
package com.tencent.mobileqq.transfile;
import java.util.HashMap;
public class NetResp {
public static final String KEY_FIRST_USE_IP = "firstserverip";
public static final String KEY_RAW_REQ_HTTP_HEADER = "param_reqHeader";
public static final String KEY_RAW_RESP_HTTP_HEADER = "param_rspHeader";
public static final String KEY_REASON = "netresp_param_reason";
public static final String KEY_USE_SERVER_IP = "serverip";
public static final String KEY_USE_URL = "param_url";
public static final int RESULT_DOWNLOADING = 3;
public static final int RESULT_FAIL = 1;
public static final int RESULT_NOT_SET = 2;
public static final int RESULT_OK = 0;
public long inQueueCost;
public long mConsumeTime;
public int mErrCode;
public String mErrDesc;
public int mHttpCode;
public long mLastReqStartTime;
public int mRedirectCount;
public long mRedirectTime;
public NetReq mReq;
public byte[] mRespData;
public HashMap<String, String> mRespProperties;
public int mResult;
public long mTotalBlockLen;
public long mTotalFileLen;
public int mTryTime;
public long mWrittenBlockLen;
public long reqCost;
public NetResp(NetReq netReq) {
this.mResult = 2;
this.mTotalFileLen = 0L;
this.mTotalBlockLen = 0L;
this.mWrittenBlockLen = 0L;
this.mConsumeTime = 0L;
this.mTryTime = 0;
this.mRespProperties = new HashMap<>();
this.mRedirectCount = 0;
this.mRedirectTime = 0L;
this.reqCost = 0L;
this.inQueueCost = 0L;
this.mReq = netReq;
this.mLastReqStartTime = System.currentTimeMillis();
}
public void reset() {
this.mResult = 2;
this.mErrCode = 0;
this.mErrDesc = "";
this.mHttpCode = 0;
this.mTotalFileLen = 0L;
this.mTotalBlockLen = 0L;
this.mWrittenBlockLen = 0L;
this.mConsumeTime = 0L;
this.mTryTime = 0;
this.mRespData = null;
this.mRespProperties.clear();
}
public void setResult(int i2, int i3, String str, HashMap<String, String> hashMap) {
this.mResult = i2;
this.mErrCode = i3;
this.mErrDesc = str;
if (hashMap != null) {
this.mRespProperties.putAll(hashMap);
}
}
}

View File

@ -0,0 +1,72 @@
package com.tencent.mobileqq.transfile;
public class TimeoutParam {
public static final int TIMEOUT_STEP = 2000;
private int connectTimeoutBias;
public int connectTimeoutFor2G;
public int connectTimeoutFor3G;
public int connectTimeoutForWifi;
public int readTimeoutFor2G;
public int readTimeoutFor3G;
public int readTimeoutForWifi;
public TimeoutParam() {
this.readTimeoutFor2G = 40000;
this.readTimeoutFor3G = 30000;
this.readTimeoutForWifi = 20000;
this.connectTimeoutFor2G = 20000;
this.connectTimeoutFor3G = 15000;
this.connectTimeoutForWifi = 10000;
this.connectTimeoutBias = 0;
}
public void adjustConnectTimeout(int i2) {
this.connectTimeoutBias = i2 * 2000;
}
public int getConnectTimeout(int i2) {
if (i2 != 1) {
if (i2 == 3) {
return this.connectTimeoutFor3G + this.connectTimeoutBias;
}
if (i2 != 4 && i2 != 5) {
return this.connectTimeoutFor2G + this.connectTimeoutBias;
}
}
return this.connectTimeoutForWifi + this.connectTimeoutBias;
}
public int getReadTimeout(int i2) {
if (i2 != 1) {
if (i2 == 3) {
return this.readTimeoutFor3G;
}
if (i2 != 4 && i2 != 5) {
return this.readTimeoutFor2G;
}
}
return this.readTimeoutForWifi;
}
//public TimeoutParam clone() {
// IPatchRedirector iPatchRedirector = $redirector_;
// return (iPatchRedirector == null || !iPatchRedirector.hasPatch((short) 4)) ? new TimeoutParam(this) : (TimeoutParam) iPatchRedirector.redirect((short) 4, (Object) this);
//}
TimeoutParam(TimeoutParam timeoutParam) {
this.readTimeoutFor2G = 40000;
this.readTimeoutFor3G = 30000;
this.readTimeoutForWifi = 20000;
this.connectTimeoutFor2G = 20000;
this.connectTimeoutFor3G = 15000;
this.connectTimeoutForWifi = 10000;
this.connectTimeoutBias = 0;
this.readTimeoutFor2G = timeoutParam.readTimeoutFor2G;
this.readTimeoutFor3G = timeoutParam.readTimeoutFor3G;
this.readTimeoutForWifi = timeoutParam.readTimeoutForWifi;
this.connectTimeoutFor2G = timeoutParam.connectTimeoutFor2G;
this.connectTimeoutFor3G = timeoutParam.connectTimeoutFor3G;
this.connectTimeoutForWifi = timeoutParam.connectTimeoutForWifi;
}
}

View File

@ -0,0 +1,15 @@
package com.tencent.mobileqq.transfile.api;
import com.tencent.mobileqq.transfile.NetReq;
import com.tencent.mobileqq.transfile.NetResp;
import mqq.app.api.IRuntimeService;
@Deprecated
public interface IHttpEngineService extends IRuntimeService {
void cancelReq(NetReq netReq);
void sendReq(NetReq netReq);
NetResp sendReqSync(NetReq netReq);
}

View File

@ -0,0 +1,14 @@
package com.tencent.mobileqq.transfile.api;
import com.tencent.mobileqq.qroute.QRouteApi;
import com.tencent.mobileqq.transfile.NetReq;
public interface IOldHttpEngineProcessor extends QRouteApi {
//void cancelMsg(HttpMsg httpMsg);
void cancelReq(NetReq netReq);
//int sendMsg(HttpMsg httpMsg);
void sendReq(NetReq netReq);
}

View File

@ -3,6 +3,7 @@ package mqq.manager;
import android.content.Context; import android.content.Context;
import oicq.wlogin_sdk.request.Ticket; import oicq.wlogin_sdk.request.Ticket;
import oicq.wlogin_sdk.request.WtTicketPromise;
public interface TicketManager extends Manager { public interface TicketManager extends Manager {
String getA2(String uin); String getA2(String uin);
@ -15,6 +16,8 @@ public interface TicketManager extends Manager {
String getPskey(String uin, String domain); String getPskey(String uin, String domain);
Ticket getPskey(String str, long j2, String[] strArr, WtTicketPromise wtTicketPromise);
String getPt4Token(String uin, String domain); String getPt4Token(String uin, String domain);
String getSkey(String uin); // 假的Skey String getSkey(String uin); // 假的Skey

View File

@ -0,0 +1,11 @@
package oicq.wlogin_sdk.request;
import oicq.wlogin_sdk.tools.ErrMsg;
public interface WtTicketPromise {
void Done(Ticket ticket);
void Failed(ErrMsg errMsg);
void Timeout(ErrMsg errMsg);
}

View File

@ -0,0 +1,122 @@
package oicq.wlogin_sdk.tools;
import android.os.Parcel;
import android.os.Parcelable;
public class ErrMsg implements Cloneable, Parcelable {
public static final Parcelable.Creator<ErrMsg> CREATOR = new Parcelable.Creator<ErrMsg>() { // from class: oicq.wlogin_sdk.tools.ErrMsg.1
@Override // android.os.Parcelable.Creator
public ErrMsg createFromParcel(Parcel parcel) {
return new ErrMsg(parcel);
}
@Override // android.os.Parcelable.Creator
public ErrMsg[] newArray(int i2) {
return new ErrMsg[i2];
}
};
private String message;
private String otherinfo;
private String title;
private int type;
private int version;
public ErrMsg() {
this.version = 0;
this.type = 0;
//this.title = InternationMsg.a(InternationMsg.MSG_TYPE.MSG_0);
//this.message = InternationMsg.a(InternationMsg.MSG_TYPE.MSG_1);
this.otherinfo = "";
}
public ErrMsg(int i2, int i3, String str, String str2, String str3) {
this.version = i2;
this.type = i3;
this.title = str;
this.message = str2;
this.otherinfo = str3;
}
private ErrMsg(Parcel parcel) {
readFromParcel(parcel);
}
public Object clone() {
return super.clone();
}
@Override // android.os.Parcelable
public int describeContents() {
return 0;
}
public String getMessage() {
return this.message;
}
public String getOtherinfo() {
return this.otherinfo;
}
public String getTitle() {
return this.title;
}
public int getType() {
return this.type;
}
public int getVersion() {
return this.version;
}
public void readFromParcel(Parcel parcel) {
this.version = parcel.readInt();
this.type = parcel.readInt();
this.title = parcel.readString();
this.message = parcel.readString();
this.otherinfo = parcel.readString();
}
public void setMessage(String str) {
this.message = str;
}
public void setOtherinfo(String str) {
this.otherinfo = str;
}
public void setTitle(String str) {
this.title = str;
}
public void setType(int i2) {
this.type = i2;
}
public void setVersion(int i2) {
this.version = i2;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("(");
int i2 = this.version;
sb.append(i2 < 0 ? Integer.valueOf(i2) : Integer.toString(i2));
sb.append(")(");
int i3 = this.type;
sb.append(i3 < 0 ? Integer.valueOf(i3) : Integer.toString(i3));
sb.append(")[");
String sb2 = sb.toString();
return sb2 + this.title + "]" + this.message + "[" + this.otherinfo + "]";
}
@Override // android.os.Parcelable
public void writeToParcel(Parcel parcel, int i2) {
parcel.writeInt(this.version);
parcel.writeInt(this.type);
parcel.writeString(this.title);
parcel.writeString(this.message);
parcel.writeString(this.otherinfo);
}
}

View File

@ -0,0 +1,255 @@
package moe.fuqiuluo.qqinterface.entries.pb;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBoolField;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBInt32Field;
import com.tencent.mobileqq.pb.PBInt64Field;
import com.tencent.mobileqq.pb.PBRepeatField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public class WeiyunCommonMessage {
public static class MsgHead extends MessageMicro<MsgHead> {
public static final int ReqMsg = 1;
public static final int RspMsg = 2;
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 40, 48, 56, 66, 72, 80, 90, 112, 120, 808, 818, 826, 888, 896}, new String[]{"uin", "seq", "type", "cmd", "appid", "version", "nettype", "clientip", "encrypt", "keytype", "encryptkey", "major_version", "minor_version", "retcode", "retmsg", "promptmsg", "total_space", "used_space"}, new Object[]{0L, 0, 0, 0, 0, 0, 0, "", 0, 0, ByteStringMicro.EMPTY, 0, 0, 0, "", "", 0L, 0L}, MsgHead.class);
public final PBInt64Field uin = PBField.initInt64(0);
public final PBUInt32Field seq = PBField.initUInt32(0);
public final PBUInt32Field type = PBField.initUInt32(0);
public final PBUInt32Field cmd = PBField.initUInt32(0);
public final PBInt32Field appid = PBField.initInt32(0);
public final PBInt32Field version = PBField.initInt32(0);
public final PBInt32Field nettype = PBField.initInt32(0);
public final PBStringField clientip = PBField.initString("");
public final PBInt32Field encrypt = PBField.initInt32(0);
public final PBInt32Field keytype = PBField.initInt32(0);
public final PBBytesField encryptkey = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBInt32Field major_version = PBField.initInt32(0);
public final PBInt32Field minor_version = PBField.initInt32(0);
public final PBInt32Field retcode = PBField.initInt32(0);
public final PBStringField retmsg = PBField.initString("");
public final PBStringField promptmsg = PBField.initString("");
public final PBUInt64Field total_space = PBField.initUInt64(0);
public final PBUInt64Field used_space = PBField.initUInt64(0);
}
public static class AddRichMediaCollectionMsgReq extends MessageMicro<AddRichMediaCollectionMsgReq> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 32}, new String[]{"comm_info", "summary", "content", "need_share_url"}, new Object[]{null, null, null, Boolean.FALSE}, AddRichMediaCollectionMsgReq.class);
public CollectCommonInfo comm_info = new CollectCommonInfo();
public RichMediaSummary summary = new RichMediaSummary();
public RichMediaContent content = new RichMediaContent();
public final PBBoolField need_share_url = PBField.initBool(false);
}
public static class RichMediaContent extends MessageMicro<RichMediaContent> {
static final MessageMicro.FieldMap __fieldMap__;
public RichMedia rich_media = new RichMedia();
public final PBBytesField raw_data = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBRepeatField<ByteStringMicro> biz_data_list = PBField.initRepeat(PBBytesField.__repeatHelper__);
public final PBRepeatMessageField<PicInfo> pic_list = PBField.initRepeatMessage(PicInfo.class);
public final PBRepeatMessageField<FileInfo> file_list = PBField.initRepeatMessage(FileInfo.class);
static {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 34, 42}, new String[]{"rich_media", "raw_data", "biz_data_list", "pic_list", "file_list"}, new Object[]{null, byteStringMicro, byteStringMicro, null, null}, RichMediaContent.class);
}
}
public static class FileInfo extends MessageMicro<FileInfo> {
static final MessageMicro.FieldMap __fieldMap__;
public final PBUInt32Field category;
public final PBBytesField md5;
public final PBBytesField sha1;
public final PBUInt32Field src = PBField.initUInt32(0);
public final PBUInt64Field uid = PBField.initUInt64(0);
public final PBUInt32Field bid = PBField.initUInt32(0);
public final PBStringField fid = PBField.initString("");
public final PBStringField name = PBField.initString("");
public final PBUInt64Field size = PBField.initUInt64(0);
static {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 34, 42, 48, 58, 66, 72}, new String[]{"src", "uid", "bid", "fid", "name", "size", "md5", "sha1", "category"}, new Object[]{0, 0L, 0, "", "", 0L, byteStringMicro, byteStringMicro, 0}, FileInfo.class);
}
public FileInfo() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.md5 = PBField.initBytes(byteStringMicro);
this.sha1 = PBField.initBytes(byteStringMicro);
this.category = PBField.initUInt32(0);
}
}
public static class RichMedia extends MessageMicro<RichMedia> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"sections"}, new Object[]{null}, RichMedia.class);
public final PBRepeatMessageField<Section> sections = PBField.initRepeatMessage(Section.class);
}
public static class Section extends MessageMicro<Section> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"items"}, new Object[]{null}, Section.class);
public final PBRepeatMessageField<Item> items = PBField.initRepeatMessage(Item.class);
}
public static class Item extends MessageMicro<Item> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26, 34}, new String[]{"item_type", "parag", "anchor", "pic_info"}, new Object[]{0, null, null, null}, Item.class);
public final PBUInt32Field item_type = PBField.initUInt32(0);
public Paragraph parag = new Paragraph();
public Anchor anchor = new Anchor();
public PicInfo pic_info = new PicInfo();
}
public static class Anchor extends MessageMicro<Anchor> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18}, new String[]{"url", "desc"}, new Object[]{"", ""}, Anchor.class);
public final PBStringField url = PBField.initString("");
public final PBStringField desc = PBField.initString("");
}
public static class Paragraph extends MessageMicro<Paragraph> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18}, new String[]{"content", "style"}, new Object[]{"", null}, Paragraph.class);
public final PBStringField content = PBField.initString("");
public Style style = new Style();
}
public static class Style extends MessageMicro<Style> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 34}, new String[]{"color", "font_family", "font_weight", "font_size"}, new Object[]{"#FFFFFF", "", "normal", ""}, Style.class);
public final PBStringField color = PBField.initString("#FFFFFF");
public final PBStringField font_family = PBField.initString("");
public final PBStringField font_weight = PBField.initString("normal");
public final PBStringField font_size = PBField.initString("");
}
public static class RichMediaSummary extends MessageMicro<RichMediaSummary> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 34, 40, 50, 58, 64}, new String[]{"title", "sub_title", "brief", "pic_list", "content_type", "original_uri", "publisher", "rich_media_version"}, new Object[]{"", "", "", null, 0, "", "", 0}, RichMediaSummary.class);
public final PBStringField title = PBField.initString("");
public final PBStringField sub_title = PBField.initString("");
public final PBStringField brief = PBField.initString("");
public final PBRepeatMessageField<PicInfo> pic_list = PBField.initRepeatMessage(PicInfo.class);
public final PBUInt32Field content_type = PBField.initUInt32(0);
public final PBStringField original_uri = PBField.initString("");
public final PBStringField publisher = PBField.initString("");
public final PBUInt32Field rich_media_version = PBField.initUInt32(0);
}
public static class PicInfo extends MessageMicro<PicInfo> {
static final MessageMicro.FieldMap __fieldMap__;
public final PBUInt32Field height;
public final PBBytesField md5;
public final PBStringField name;
public final PBStringField note;
public Author owner;
public final PBStringField pic_id;
public final PBBytesField sha1;
public final PBUInt32Field size;
public final PBUInt32Field type;
public final PBStringField uri = PBField.initString("");
public final PBUInt32Field width;
static {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18, 26, 34, 42, 48, 56, 64, 72, 82, 90}, new String[]{"uri", "md5", "sha1", "name", "note", "width", "height", "size", "type", "owner", "pic_id"}, new Object[]{"", byteStringMicro, byteStringMicro, "", "", 0, 0, 0, 0, null, ""}, PicInfo.class);
}
public PicInfo() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.md5 = PBField.initBytes(byteStringMicro);
this.sha1 = PBField.initBytes(byteStringMicro);
this.name = PBField.initString("");
this.note = PBField.initString("");
this.width = PBField.initUInt32(0);
this.height = PBField.initUInt32(0);
this.size = PBField.initUInt32(0);
this.type = PBField.initUInt32(0);
this.owner = new Author();
this.pic_id = PBField.initString("");
}
}
public static final class CollectCommonInfo extends MessageMicro<CollectCommonInfo> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 26, 32, 40, 50, 58, 66, 72, 80, 4048, 4058}, new String[]{"bid", "category", "author", "create_time", "sequence", "biz_key", "biz_data_list", "share_url", "original_app_id", "custom_group_id", "modify_time", "qzone_ugc_key"}, new Object[]{0, 0, null, 0L, 0L, "", ByteStringMicro.EMPTY, "", 0, 0, 0L, ""}, CollectCommonInfo.class);
public final PBUInt32Field bid = PBField.initUInt32(0);
public final PBUInt32Field category = PBField.initUInt32(0);
public Author author = new Author();
public final PBUInt64Field create_time = PBField.initUInt64(0);
public final PBUInt64Field sequence = PBField.initUInt64(0);
public final PBStringField biz_key = PBField.initString("");
public final PBRepeatField<ByteStringMicro> biz_data_list = PBField.initRepeat(PBBytesField.__repeatHelper__);
public final PBStringField share_url = PBField.initString("");
public final PBUInt32Field original_app_id = PBField.initUInt32(0);
public final PBUInt32Field custom_group_id = PBField.initUInt32(0);
public final PBUInt64Field modify_time = PBField.initUInt64(0);
public final PBStringField qzone_ugc_key = PBField.initString("");
}
public static final class Author extends MessageMicro<Author> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 26, 32, 42}, new String[]{"type", "num_id", "str_id", "group_id", "group_name"}, new Object[]{0, 0L, "", 0L, ""}, Author.class);
public final PBUInt32Field type = PBField.initUInt32(0);
public final PBUInt64Field num_id = PBField.initUInt64(0);
public final PBStringField str_id = PBField.initString("");
public final PBUInt64Field group_id = PBField.initUInt64(0);
public final PBStringField group_name = PBField.initString("");
}
public static class ReqMsgBody extends MessageMicro<ReqMsgBody> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{96010, 160002, 160010, 160018, 160026, 160034, 160042, 160050, 160058, 160066,
160074, // 11
160082, 160090, 160098, 160106, 160114, 160122, 160130, 160138, 160146, 160154, 160162, 160170, 160178, 160186, 160194, 160202, 160210, 160218, 160226}, new String[]{
"WeiyunShareAddReq_body",
"GetCollectionListMsgReq_body",
"GetCollectionContentMsgReq_body",
"DelCollectionMsgReq_body",
"AddTextCollectionMsgReq_body",
"AddLinkCollectionMsgReq_body",
"AddGalleryCollectionMsgReq_body",
"AddAudioCollectionMsgReq_body",
"AddFileCollectionMsgReq_body",
"AddLocationCollectionMsgReq_body", // 10
"AddRichMediaCollectionMsgReq_body", // 11
"FastUploadResourceMsgReq_body", "GetCollectionCountByCatetoryMsgReq_body", "ModCollectionMsgReq_body", "GetCollectionFullInfoMsgReq_body", "ApplyDownloadFileMsgReq_body", "GetCollectionSummaryMsgReq_body", "GetCompatibleCollectionInfoMsgReq_body", "GetCollectorUserFileInfoReq_body", "GetFilePreviewInfoReq_body", "AddHighQualityAudioCollectionMsgReq_body", "GetCollectorUserInfoReq_body", "GetCustomGroupMsgReq_body", "AddCustomGroupMsgReq_body", "ModCustomGroupMsgReq_body", "DelCustomGroupMsgReq_body", "ModCollectionGroupMsgReq_body", "GetCollectionGroupListMsgReq_body", "BatchWeiyunShareAddReq_body", "AddVideoCollectionMsgReq_body"}, new Object[]{null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, ReqMsgBody.class);
//public WeiyunCommonMessage$WeiyunShareAddReq WeiyunShareAddReq_body = new WeiyunCommonMessage$WeiyunShareAddReq();
//public WeiyunCommonMessage$GetCollectionListMsgReq GetCollectionListMsgReq_body = new WeiyunCommonMessage$GetCollectionListMsgReq();
//public WeiyunCommonMessage$GetCollectionContentMsgReq GetCollectionContentMsgReq_body = new WeiyunCommonMessage$GetCollectionContentMsgReq();
//public WeiyunCommonMessage$DelCollectionMsgReq DelCollectionMsgReq_body = new WeiyunCommonMessage$DelCollectionMsgReq();
//public WeiyunCommonMessage$AddTextCollectionMsgReq AddTextCollectionMsgReq_body = new WeiyunCommonMessage$AddTextCollectionMsgReq();
//public WeiyunCommonMessage$AddLinkCollectionMsgReq AddLinkCollectionMsgReq_body = new WeiyunCommonMessage$AddLinkCollectionMsgReq();
//public WeiyunCommonMessage$AddGalleryCollectionMsgReq AddGalleryCollectionMsgReq_body = new WeiyunCommonMessage$AddGalleryCollectionMsgReq();
//public WeiyunCommonMessage$AddAudioCollectionMsgReq AddAudioCollectionMsgReq_body = new WeiyunCommonMessage$AddAudioCollectionMsgReq();
//public WeiyunCommonMessage$AddFileCollectionMsgReq AddFileCollectionMsgReq_body = new WeiyunCommonMessage$AddFileCollectionMsgReq();
//public WeiyunCommonMessage$AddLocationCollectionMsgReq AddLocationCollectionMsgReq_body = new WeiyunCommonMessage$AddLocationCollectionMsgReq();
public AddRichMediaCollectionMsgReq AddRichMediaCollectionMsgReq_body = new AddRichMediaCollectionMsgReq();
//public WeiyunCommonMessage$FastUploadResourceMsgReq FastUploadResourceMsgReq_body = new WeiyunCommonMessage$FastUploadResourceMsgReq();
//public WeiyunCommonMessage$GetCollectionCountByCatetoryMsgReq GetCollectionCountByCatetoryMsgReq_body = new MessageMicro<WeiyunCommonMessage$GetCollectionCountByCatetoryMsgReq>() { // from class: com.qqfav.protocal.WeiyunCommonMessage$GetCollectionCountByCatetoryMsgReq
// static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16}, new String[]{"bid", "category_list"}, new Object[]{0, 0}, WeiyunCommonMessage$GetCollectionCountByCatetoryMsgReq.class);
// public final PBUInt32Field bid = PBField.initUInt32(0);
// public final PBRepeatField<Integer> category_list = PBField.initRepeat(PBUInt32Field.__repeatHelper__);
//};
//public WeiyunCommonMessage$ModCollectionMsgReq ModCollectionMsgReq_body = new WeiyunCommonMessage$ModCollectionMsgReq();
//public WeiyunCommonMessage$GetCollectionFullInfoMsgReq GetCollectionFullInfoMsgReq_body = new MessageMicro<WeiyunCommonMessage$GetCollectionFullInfoMsgReq>() { // from class: com.qqfav.protocal.WeiyunCommonMessage$GetCollectionFullInfoMsgReq
// static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10}, new String[]{"cid_list"}, new Object[]{""}, WeiyunCommonMessage$GetCollectionFullInfoMsgReq.class);
// public final PBRepeatField<String> cid_list = PBField.initRepeat(PBStringField.__repeatHelper__);
//};
//public WeiyunCommonMessage$ApplyDownloadFileMsgReq ApplyDownloadFileMsgReq_body = new WeiyunCommonMessage$ApplyDownloadFileMsgReq();
//public WeiyunCommonMessage$GetCollectionSummaryMsgReq GetCollectionSummaryMsgReq_body = new WeiyunCommonMessage$GetCollectionSummaryMsgReq();
//public WeiyunCommonMessage$GetCompatibleCollectionInfoMsgReq GetCompatibleCollectionInfoMsgReq_body = new WeiyunCommonMessage$GetCompatibleCollectionInfoMsgReq();
//public WeiyunCommonMessage$GetCollectorUserFileInfoReq GetCollectorUserFileInfoReq_body = new WeiyunCommonMessage$GetCollectorUserFileInfoReq();
//public WeiyunCommonMessage$GetFilePreviewInfoReq GetFilePreviewInfoReq_body = new WeiyunCommonMessage$GetFilePreviewInfoReq();
//public WeiyunCommonMessage$AddAudioCollectionMsgReq AddHighQualityAudioCollectionMsgReq_body = new WeiyunCommonMessage$AddAudioCollectionMsgReq();
//public WeiyunCommonMessage$GetCollectorUserInfoReq GetCollectorUserInfoReq_body = new WeiyunCommonMessage$GetCollectorUserInfoReq();
//public WeiyunCommonMessage$GetCustomGroupMsgReq GetCustomGroupMsgReq_body = new WeiyunCommonMessage$GetCustomGroupMsgReq();
//public WeiyunCommonMessage$AddCustomGroupMsgReq AddCustomGroupMsgReq_body = new WeiyunCommonMessage$AddCustomGroupMsgReq();
//public WeiyunCommonMessage$ModCustomGroupMsgReq ModCustomGroupMsgReq_body = new WeiyunCommonMessage$ModCustomGroupMsgReq();
//public WeiyunCommonMessage$DelCustomGroupMsgReq DelCustomGroupMsgReq_body = new WeiyunCommonMessage$DelCustomGroupMsgReq();
//public WeiyunCommonMessage$ModCollectionGroupMsgReq ModCollectionGroupMsgReq_body = new WeiyunCommonMessage$ModCollectionGroupMsgReq();
//public WeiyunCommonMessage$GetCollectionGroupListMsgReq GetCollectionGroupListMsgReq_body = new WeiyunCommonMessage$GetCollectionGroupListMsgReq();
//public WeiyunCommonMessage$BatchWeiyunShareAddReq BatchWeiyunShareAddReq_body = new WeiyunCommonMessage$BatchWeiyunShareAddReq();
//public WeiyunCommonMessage$AddVideoCollectionMsgReq AddVideoCollectionMsgReq_body = new WeiyunCommonMessage$AddVideoCollectionMsgReq();
}
}

View File

@ -1,8 +1,95 @@
package moe.fuqiuluo.qqinterface.servlet package moe.fuqiuluo.qqinterface.servlet
import android.text.TextUtils
import com.tencent.mobileqq.app.QQAppInterface
import com.tencent.mobileqq.transfile.HttpNetReq
import com.tencent.mobileqq.transfile.INetEngineListener
import com.tencent.mobileqq.transfile.NetReq
import com.tencent.mobileqq.transfile.NetResp
import com.tencent.mobileqq.transfile.ServerAddr
import com.tencent.mobileqq.transfile.api.IHttpEngineService
import io.netty.buffer.ByteBuf
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import mqq.manager.TicketManager
import oicq.wlogin_sdk.request.Ticket
import oicq.wlogin_sdk.request.WtTicketPromise
import oicq.wlogin_sdk.tools.ErrMsg
import java.io.ByteArrayOutputStream
import java.nio.ByteBuffer
/** /**
* QQ收藏相关接口 * QQ收藏相关接口
*/ */
internal object QFavSvc: BaseSvc() { internal object QFavSvc: BaseSvc() {
private const val VI = 27
private const val APPID = 30244
private const val SUB_APPID = 538116905
fun sendWeiyunReq() {
val httpNetReq = HttpNetReq()
httpNetReq.userData = null
(httpNetReq as NetReq).mCallback = object: INetEngineListener {
override fun onResp(netResp: NetResp) {
}
override fun onUpdateProgeress(netReq: NetReq, j2: Long, j3: Long) {
}
}
val pSKey = getWeiYunPSKey()
httpNetReq.mHttpMethod = 1
httpNetReq.mSendData = byteArrayOf()
val byteArrayOutputStream = ByteArrayOutputStream()
httpNetReq.mOutStream = byteArrayOutputStream
httpNetReq.mStartDownOffset = 0L
httpNetReq.mReqProperties["Cookie"] = String.format("uin=%s;vt=%d;vi=%s;appid=%d", app.longAccountUin, VI, APPID,)
httpNetReq.mReqProperties["host"] = "collector.weiyun.com"
httpNetReq.mReqProperties["Range"] = "bytes=" + httpNetReq.mStartDownOffset + "-"
httpNetReq.mReqProperties["Accept-Encoding"] = "gzip"
httpNetReq.mReqProperties["Content-Encoding"] = "gzip"
httpNetReq.mPrioty = 1
val service = AppRuntimeFetcher.appRuntime
.getRuntimeService(IHttpEngineService::class.java, "qqfav")
httpNetReq.mReqUrl = "https://collector.weiyun.com"
httpNetReq.mServerList = emptyList()
service.sendReq(httpNetReq)
}
private fun packData(head: ByteArray, body: ByteArray): ByteArray {
val buf = ByteBuffer.allocateDirect(100)
buf.putInt(SUB_APPID)
buf.putShort(1)
buf.putInt(16 + head.size + body.size)
buf.putInt(body.size)
buf.putShort(0)
buf.put(head)
buf.put(body)
val ret = buf.array()
buf.clear()
return ret
}
private fun getWeiYunPSKey(): String {
val pskey = (app.getManager(QQAppInterface.TICKET_MANAGER) as TicketManager)
.getPskey(app.currentAccountUin, 16L, arrayOf("weiyun.com"), WeiYunPSKeyPromise)
return if (pskey != null) pskey.getPSkey("weiyun.com") else ""
}
private object WeiYunPSKeyPromise: WtTicketPromise {
override fun Done(ticket: Ticket) {
LogCenter.log("Fav: getPskeyPromise: done", Level.DEBUG)
}
override fun Failed(errMsg: ErrMsg) {
LogCenter.log("Fav: getPskeyPromise: failed, $errMsg", Level.DEBUG)
}
override fun Timeout(errMsg: ErrMsg) {
LogCenter.log("Fav: getPskeyPromise: timeout, $errMsg", Level.DEBUG)
}
}
} }

View File

@ -196,3 +196,46 @@ internal fun Any.toInnerValuesString(): String {
builder.append("=======================>\n") builder.append("=======================>\n")
return builder.toString() return builder.toString()
} }
internal fun Any.toInnerValuesString(clz: Class<*>): String {
val builder = StringBuilder()
builder.append(clz.canonicalName)
builder.append("========>\n")
clz.declaredFields.forEach {
if (!Modifier.isStatic(it.modifiers)) {
if (!it.isAccessible) {
it.isAccessible = true
}
builder.append(it.name)
builder.append(" = ")
when (val v = it.get(this)) {
null -> builder.append("null")
is ByteArray -> builder.append(v.toHexString())
is Map<*, *> -> {
builder.append("{\n\t")
v.forEach { key, value ->
builder.append("\t")
builder.append(key)
builder.append(" = ")
builder.append(value)
builder.append("\n")
}
builder.append("}")
}
is List<*> -> {
builder.append("[\n\t")
v.forEach { value ->
builder.append("\t")
builder.append(value)
builder.append("\n")
}
builder.append("]")
}
else -> builder.append(v)
}
builder.append("\n")
}
}
builder.append("=======================>\n")
return builder.toString()
}

View File

@ -1,9 +1,46 @@
package moe.fuqiuluo.shamrock.xposed.actions package moe.fuqiuluo.shamrock.xposed.actions
import android.content.Context import android.content.Context
import com.tencent.mobileqq.profilecard.api.IProfileProtocolService
import com.tencent.mobileqq.qroute.QRoute
import com.tencent.mobileqq.qroute.QRouteApi
import com.tencent.mobileqq.transfile.HttpNetReq
import com.tencent.mobileqq.transfile.NetReq
import com.tencent.mobileqq.transfile.api.IHttpEngineService
import com.tencent.mobileqq.transfile.api.IOldHttpEngineProcessor
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.tools.hookMethod
import moe.fuqiuluo.shamrock.tools.toInnerValuesString
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import mqq.app.MobileQQ
internal class HookForDebug: IAction { internal class HookForDebug: IAction {
override fun invoke(ctx: Context) { override fun invoke(ctx: Context) {
// MessageHelper.hookSendMessageOldChannel() // MessageHelper.hookSendMessageOldChannel()
val oldHttpEngineProcessor = QRoute.api(IOldHttpEngineProcessor::class.java)
oldHttpEngineProcessor.javaClass.hookMethod("sendReq").before {
if (it.args[0] is HttpNetReq) {
LogCenter.log("已记录一个IOldHttpEngineProcessor请求")
val req = it.args[0] as HttpNetReq
if (req.mReqUrl.startsWith("https://")) {
req.mReqUrl = req.mReqUrl.replace("https://", "http://")
}
}
}
val httpEngineService = AppRuntimeFetcher.appRuntime
.getRuntimeService(IHttpEngineService::class.java, "all")
httpEngineService.javaClass.hookMethod("sendReq").before {
if (it.args[0] is HttpNetReq) {
LogCenter.log("已记录一个IHttpEngineService请求")
val req = it.args[0] as HttpNetReq
if (req.mReqUrl == null || req.mReqUrl.isBlank()) {
val host = req.mReqProperties["host"] ?: "collector.weiyun.com"
req.mReqUrl = "http://$host"
} else if (req.mReqUrl.startsWith("https://")) {
req.mReqUrl = req.mReqUrl.replace("https://", "http://")
}
}
}
} }
} }