mirror of
https://github.com/whitechi73/OpenShamrock.git
synced 2024-08-14 05:12:17 +00:00
Compare commits
2 Commits
5000453002
...
df25b0bc76
Author | SHA1 | Date | |
---|---|---|---|
df25b0bc76 | |||
d07eea7766 |
@ -41,10 +41,6 @@ public class ErrMsg implements Cloneable, Parcelable {
|
|||||||
readFromParcel(parcel);
|
readFromParcel(parcel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object clone() {
|
|
||||||
return super.clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override // android.os.Parcelable
|
@Override // android.os.Parcelable
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1,255 +0,0 @@
|
|||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,5 @@
|
|||||||
package moe.fuqiuluo.qqinterface.servlet
|
package moe.fuqiuluo.qqinterface.servlet
|
||||||
|
|
||||||
import android.text.TextUtils
|
|
||||||
import com.tencent.mobileqq.app.QQAppInterface
|
import com.tencent.mobileqq.app.QQAppInterface
|
||||||
import com.tencent.mobileqq.transfile.HttpNetReq
|
import com.tencent.mobileqq.transfile.HttpNetReq
|
||||||
import com.tencent.mobileqq.transfile.INetEngineListener
|
import com.tencent.mobileqq.transfile.INetEngineListener
|
||||||
@ -8,9 +7,13 @@ import com.tencent.mobileqq.transfile.NetReq
|
|||||||
import com.tencent.mobileqq.transfile.NetResp
|
import com.tencent.mobileqq.transfile.NetResp
|
||||||
import com.tencent.mobileqq.transfile.ServerAddr
|
import com.tencent.mobileqq.transfile.ServerAddr
|
||||||
import com.tencent.mobileqq.transfile.api.IHttpEngineService
|
import com.tencent.mobileqq.transfile.api.IHttpEngineService
|
||||||
import io.netty.buffer.ByteBuf
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
|
import moe.fuqiuluo.proto.protobufMapOf
|
||||||
import moe.fuqiuluo.shamrock.helper.Level
|
import moe.fuqiuluo.shamrock.helper.Level
|
||||||
import moe.fuqiuluo.shamrock.helper.LogCenter
|
import moe.fuqiuluo.shamrock.helper.LogCenter
|
||||||
|
import moe.fuqiuluo.shamrock.tools.EMPTY_BYTE_ARRAY
|
||||||
|
import moe.fuqiuluo.shamrock.tools.toInnerValuesString
|
||||||
|
import moe.fuqiuluo.shamrock.utils.DeflateTools
|
||||||
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
|
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
|
||||||
import mqq.manager.TicketManager
|
import mqq.manager.TicketManager
|
||||||
import oicq.wlogin_sdk.request.Ticket
|
import oicq.wlogin_sdk.request.Ticket
|
||||||
@ -18,59 +21,179 @@ import oicq.wlogin_sdk.request.WtTicketPromise
|
|||||||
import oicq.wlogin_sdk.tools.ErrMsg
|
import oicq.wlogin_sdk.tools.ErrMsg
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
|
import kotlin.coroutines.resume
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QQ收藏相关接口
|
* QQ收藏相关接口
|
||||||
*/
|
*/
|
||||||
internal object QFavSvc: BaseSvc() {
|
internal object QFavSvc: BaseSvc() {
|
||||||
private const val VI = 27
|
private val SERVER_LIST = listOf(ServerAddr().also {
|
||||||
|
it.isIpv6 = false
|
||||||
|
it.mIp = "collector.weiyun.com"
|
||||||
|
it.port = 80
|
||||||
|
})
|
||||||
|
private const val VT = 27
|
||||||
|
private const val VERSION = 12820
|
||||||
private const val APPID = 30244
|
private const val APPID = 30244
|
||||||
private const val SUB_APPID = 538116905
|
private const val SUB_APPID = 538116905
|
||||||
|
private const val MAJOR_VERSION = 8
|
||||||
|
private const val MINOR_VERSION = 9
|
||||||
|
private var seq = 1
|
||||||
|
|
||||||
fun sendWeiyunReq() {
|
suspend fun addRichMediaMsg(
|
||||||
|
uin: Long,
|
||||||
|
name: String,
|
||||||
|
groupId: Long = 0,
|
||||||
|
groupName: String = "",
|
||||||
|
time: Long = System.currentTimeMillis(),
|
||||||
|
content: String
|
||||||
|
): Result<NetResp> {
|
||||||
|
val data = protobufMapOf {
|
||||||
|
it[1] = mapOf(
|
||||||
|
20009 to mapOf(
|
||||||
|
1 to mapOf(
|
||||||
|
/**
|
||||||
|
* 1 => bid
|
||||||
|
* 2 => category
|
||||||
|
* 3 => author
|
||||||
|
* 4 => create_time
|
||||||
|
* 5 => sequence
|
||||||
|
* 6 => biz_key
|
||||||
|
* 7 => biz_data_list
|
||||||
|
* 8 => share_url
|
||||||
|
* 9 => original_app_id
|
||||||
|
* 10 => custom_group_id
|
||||||
|
* 506 => modify_time
|
||||||
|
* 507 => qzone_ugc_key
|
||||||
|
*/
|
||||||
|
1 to 1, // bid
|
||||||
|
2 to 1, // category
|
||||||
|
3 to mapOf( // author
|
||||||
|
1 to if (groupId == 0L) 1 else 2, // type
|
||||||
|
2 to uin, // num_id
|
||||||
|
3 to name, // str_id
|
||||||
|
4 to groupId, // group_id
|
||||||
|
5 to groupName // group_name
|
||||||
|
),
|
||||||
|
4 to time - 2000, // create_time
|
||||||
|
5 to time - 1000, // sequence
|
||||||
|
9 to 0, // original_app_id
|
||||||
|
10 to 0 // custom_group_id
|
||||||
|
),
|
||||||
|
2 to mapOf(
|
||||||
|
/**
|
||||||
|
* 1 => title
|
||||||
|
* 2 => sub_title
|
||||||
|
* 3 => brief
|
||||||
|
* 4 => pic_list
|
||||||
|
* 5 => content_type
|
||||||
|
* 6 => original_uri
|
||||||
|
* 7 => publisher
|
||||||
|
* 8 => rich_media_version
|
||||||
|
*/
|
||||||
|
3 to content,
|
||||||
|
5 to 1
|
||||||
|
),
|
||||||
|
3 to mapOf(
|
||||||
|
/**
|
||||||
|
* 1 => rich_media
|
||||||
|
* 2 => raw_data
|
||||||
|
* 3 => biz_data_list
|
||||||
|
* 4 => pic_list
|
||||||
|
* 5 => file_list
|
||||||
|
*/
|
||||||
|
2 to content
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}.toByteArray()
|
||||||
|
return sendWeiyunReq(20009, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun sendWeiyunReq(cmd: Int, body: ByteArray): Result<NetResp> {
|
||||||
|
return suspendCancellableCoroutine {
|
||||||
val httpNetReq = HttpNetReq()
|
val httpNetReq = HttpNetReq()
|
||||||
httpNetReq.userData = null
|
httpNetReq.userData = null
|
||||||
(httpNetReq as NetReq).mCallback = object: INetEngineListener {
|
httpNetReq.mCallback = object: INetEngineListener {
|
||||||
override fun onResp(netResp: NetResp) {
|
override fun onResp(netResp: NetResp) {
|
||||||
|
if (netResp.mHttpCode != 200 && netResp.mResult != 0 && netResp.mErrDesc.isNullOrEmpty()) {
|
||||||
|
netResp.mErrDesc = netResp.mRespProperties["User-ErrMsg"]
|
||||||
|
}
|
||||||
|
it.resume(Result.success(netResp))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onUpdateProgeress(netReq: NetReq, j2: Long, j3: Long) {
|
override fun onUpdateProgeress(netReq: NetReq, curr: Long, final: Long) {}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
val pSKey = getWeiYunPSKey()
|
val pSKey = getWeiYunPSKey()
|
||||||
httpNetReq.mHttpMethod = 1
|
LogCenter.log(pSKey)
|
||||||
httpNetReq.mSendData = byteArrayOf()
|
httpNetReq.mHttpMethod = HttpNetReq.HTTP_POST
|
||||||
val byteArrayOutputStream = ByteArrayOutputStream()
|
httpNetReq.mSendData = DeflateTools.gzip(packData(packHead(cmd, pSKey), body))
|
||||||
httpNetReq.mOutStream = byteArrayOutputStream
|
httpNetReq.mOutStream = ByteArrayOutputStream()
|
||||||
httpNetReq.mStartDownOffset = 0L
|
httpNetReq.mStartDownOffset = 0L
|
||||||
httpNetReq.mReqProperties["Cookie"] = String.format("uin=%s;vt=%d;vi=%s;appid=%d", app.longAccountUin, VI, APPID,)
|
httpNetReq.mReqProperties["Shamrock"] = "true"
|
||||||
|
httpNetReq.mReqProperties["Cookie"] = String.format("uin=%s;vt=%d;vi=%s;appid=%d", app.currentAccountUin, VT, pSKey, APPID)
|
||||||
httpNetReq.mReqProperties["host"] = "collector.weiyun.com"
|
httpNetReq.mReqProperties["host"] = "collector.weiyun.com"
|
||||||
httpNetReq.mReqProperties["Range"] = "bytes=" + httpNetReq.mStartDownOffset + "-"
|
httpNetReq.mReqProperties["Range"] = "bytes=0-"
|
||||||
|
httpNetReq.mReqProperties["Content-Length"] = httpNetReq.mSendData.size.toString()
|
||||||
httpNetReq.mReqProperties["Accept-Encoding"] = "gzip"
|
httpNetReq.mReqProperties["Accept-Encoding"] = "gzip"
|
||||||
httpNetReq.mReqProperties["Content-Encoding"] = "gzip"
|
httpNetReq.mReqProperties["Content-Encoding"] = "gzip"
|
||||||
httpNetReq.mPrioty = 1
|
httpNetReq.mPrioty = 1
|
||||||
|
httpNetReq.mReqUrl = "https://collector.weiyun.com/collector.fcg"
|
||||||
|
httpNetReq.mServerList = SERVER_LIST
|
||||||
val service = AppRuntimeFetcher.appRuntime
|
val service = AppRuntimeFetcher.appRuntime
|
||||||
.getRuntimeService(IHttpEngineService::class.java, "qqfav")
|
.getRuntimeService(IHttpEngineService::class.java, "qqfav")
|
||||||
httpNetReq.mReqUrl = "https://collector.weiyun.com"
|
|
||||||
httpNetReq.mServerList = emptyList()
|
|
||||||
service.sendReq(httpNetReq)
|
service.sendReq(httpNetReq)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun packHead(cmd: Int, pskey: String): ByteArray {
|
||||||
|
/**
|
||||||
|
* 1 => uin
|
||||||
|
* 2 => seq
|
||||||
|
* 3 => type
|
||||||
|
* 4 => cmd
|
||||||
|
* 5 => appid
|
||||||
|
* 6 => version
|
||||||
|
* 7 => nettype
|
||||||
|
* 8 => clientip
|
||||||
|
* 9 => encrypt
|
||||||
|
* 10 => keytype
|
||||||
|
* 11 => encryptkey
|
||||||
|
* 14 => major_version
|
||||||
|
* 15 => minor_version
|
||||||
|
* 101 => retcode
|
||||||
|
* 102 => retmsg
|
||||||
|
* 103 => promptmsg
|
||||||
|
* 111 => total_space
|
||||||
|
* 112 => used_space
|
||||||
|
*/
|
||||||
|
return protobufMapOf {
|
||||||
|
it[1] = app.longAccountUin
|
||||||
|
it[2] = seq++ // seq
|
||||||
|
it[3] = 1 // type
|
||||||
|
it[4] = cmd
|
||||||
|
it[5] = APPID
|
||||||
|
it[6] = VERSION // VERSION
|
||||||
|
it[7] = 3 // nettype
|
||||||
|
it[10] = 27 // keytype
|
||||||
|
it[11] = pskey
|
||||||
|
it[14] = MAJOR_VERSION
|
||||||
|
it[15] = MINOR_VERSION
|
||||||
|
}.toByteArray()
|
||||||
|
}
|
||||||
|
|
||||||
private fun packData(head: ByteArray, body: ByteArray): ByteArray {
|
private fun packData(head: ByteArray, body: ByteArray): ByteArray {
|
||||||
val buf = ByteBuffer.allocateDirect(100)
|
val len = 16 + head.size + body.size
|
||||||
|
val buf = ByteBuffer.allocate(len)
|
||||||
buf.putInt(SUB_APPID)
|
buf.putInt(SUB_APPID)
|
||||||
buf.putShort(1)
|
buf.putShort(1)
|
||||||
buf.putInt(16 + head.size + body.size)
|
buf.putInt(len)
|
||||||
buf.putInt(body.size)
|
buf.putInt(body.size)
|
||||||
buf.putShort(0)
|
buf.putShort(0)
|
||||||
buf.put(head)
|
buf.put(head)
|
||||||
buf.put(body)
|
buf.put(body)
|
||||||
val ret = buf.array()
|
return buf.array()
|
||||||
buf.clear()
|
|
||||||
return ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getWeiYunPSKey(): String {
|
private fun getWeiYunPSKey(): String {
|
||||||
|
@ -64,6 +64,7 @@ internal object HTTPServer {
|
|||||||
guildAction()
|
guildAction()
|
||||||
testAction()
|
testAction()
|
||||||
requestRouter()
|
requestRouter()
|
||||||
|
fav()
|
||||||
if (ShamrockConfig.isDev()) {
|
if (ShamrockConfig.isDev()) {
|
||||||
qsign()
|
qsign()
|
||||||
obtainProtocolData()
|
obtainProtocolData()
|
||||||
|
@ -51,6 +51,9 @@ internal object ActionManager {
|
|||||||
// WEATHER
|
// WEATHER
|
||||||
GetWeatherCityCode, GetWeather,
|
GetWeatherCityCode, GetWeather,
|
||||||
|
|
||||||
|
// FAV
|
||||||
|
FavAddRichMediaMsg,
|
||||||
|
|
||||||
// OTHER
|
// OTHER
|
||||||
GetDeviceBattery, DownloadFile
|
GetDeviceBattery, DownloadFile
|
||||||
).forEach {
|
).forEach {
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
package moe.fuqiuluo.shamrock.remote.action.handlers
|
||||||
|
|
||||||
|
import kotlinx.serialization.json.JsonElement
|
||||||
|
import moe.fuqiuluo.qqinterface.servlet.QFavSvc
|
||||||
|
import moe.fuqiuluo.shamrock.remote.action.ActionSession
|
||||||
|
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
|
||||||
|
import moe.fuqiuluo.shamrock.tools.EmptyJsonString
|
||||||
|
|
||||||
|
internal object FavAddRichMediaMsg: IActionHandler() {
|
||||||
|
override suspend fun internalHandle(session: ActionSession): String {
|
||||||
|
val uin = session.getLong("user_id")
|
||||||
|
val nickName = session.getString("nick")
|
||||||
|
val groupName = session.getStringOrNull("groupName") ?: ""
|
||||||
|
val groupId = session.getLongOrNull("group_id") ?: 0L
|
||||||
|
val time = session.getLongOrNull("time") ?: System.currentTimeMillis()
|
||||||
|
val content = session.getString("content")
|
||||||
|
return invoke(uin, nickName, time, content, groupName, groupId, session.echo)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend operator fun invoke(
|
||||||
|
uin: Long,
|
||||||
|
nickName: String,
|
||||||
|
time: Long = System.currentTimeMillis(),
|
||||||
|
content: String,
|
||||||
|
groupName: String = "",
|
||||||
|
groupId: Long = 0L,
|
||||||
|
echo: JsonElement = EmptyJsonString
|
||||||
|
): String {
|
||||||
|
QFavSvc.addRichMediaMsg(uin, nickName,
|
||||||
|
time = time,
|
||||||
|
content = content,
|
||||||
|
groupName = groupName,
|
||||||
|
groupId = groupId
|
||||||
|
).onSuccess {
|
||||||
|
return if (it.mHttpCode == 200 && it.mResult == 0) {
|
||||||
|
ok("成功", echo)
|
||||||
|
} else {
|
||||||
|
logic(it.mErrDesc, echo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ok("请求已提交", echo)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun path(): String = "fav.add_rich_media_msg"
|
||||||
|
|
||||||
|
override val requiredParams: Array<String> = arrayOf("user_id", "nick", "content")
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package moe.fuqiuluo.shamrock.remote.api
|
||||||
|
|
||||||
|
import io.ktor.http.ContentType
|
||||||
|
import io.ktor.server.application.call
|
||||||
|
import io.ktor.server.response.respondText
|
||||||
|
import io.ktor.server.routing.Routing
|
||||||
|
import moe.fuqiuluo.shamrock.remote.action.handlers.FavAddRichMediaMsg
|
||||||
|
import moe.fuqiuluo.shamrock.remote.action.handlers.GetFriendList
|
||||||
|
import moe.fuqiuluo.shamrock.remote.action.handlers.GetFriendSystemMsg
|
||||||
|
import moe.fuqiuluo.shamrock.remote.action.handlers.GetStrangerInfo
|
||||||
|
import moe.fuqiuluo.shamrock.remote.action.handlers.IsBlackListUin
|
||||||
|
import moe.fuqiuluo.shamrock.tools.fetchOrNull
|
||||||
|
import moe.fuqiuluo.shamrock.tools.fetchOrThrow
|
||||||
|
import moe.fuqiuluo.shamrock.tools.getOrPost
|
||||||
|
|
||||||
|
// fav.add_rich_media_msg
|
||||||
|
|
||||||
|
fun Routing.fav() {
|
||||||
|
getOrPost("/fav/add_rich_media_msg") {
|
||||||
|
val uin = call.fetchOrThrow("user_id").toLong()
|
||||||
|
val nickName = call.fetchOrThrow("nick")
|
||||||
|
val time = call.fetchOrNull("time")?.toLong() ?: System.currentTimeMillis()
|
||||||
|
val content = call.fetchOrThrow("content")
|
||||||
|
val groupName = call.fetchOrNull("groupName") ?: ""
|
||||||
|
val groupId = call.fetchOrNull("group_id")?.toLong() ?: 0L
|
||||||
|
call.respondText(FavAddRichMediaMsg(uin, nickName, time, content, groupName, groupId), ContentType.Application.Json)
|
||||||
|
}
|
||||||
|
}
|
@ -31,8 +31,11 @@ internal class HookForDebug: IAction {
|
|||||||
.getRuntimeService(IHttpEngineService::class.java, "all")
|
.getRuntimeService(IHttpEngineService::class.java, "all")
|
||||||
httpEngineService.javaClass.hookMethod("sendReq").before {
|
httpEngineService.javaClass.hookMethod("sendReq").before {
|
||||||
if (it.args[0] is HttpNetReq) {
|
if (it.args[0] is HttpNetReq) {
|
||||||
LogCenter.log("已记录一个IHttpEngineService请求")
|
|
||||||
val req = it.args[0] as HttpNetReq
|
val req = it.args[0] as HttpNetReq
|
||||||
|
if (req.mReqProperties["Shamrock"] == "true") {
|
||||||
|
return@before
|
||||||
|
}
|
||||||
|
LogCenter.log("已记录一个IHttpEngineService请求")
|
||||||
if (req.mReqUrl == null || req.mReqUrl.isBlank()) {
|
if (req.mReqUrl == null || req.mReqUrl.isBlank()) {
|
||||||
val host = req.mReqProperties["host"] ?: "collector.weiyun.com"
|
val host = req.mReqProperties["host"] ?: "collector.weiyun.com"
|
||||||
req.mReqUrl = "http://$host"
|
req.mReqUrl = "http://$host"
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
package moe.fuqiuluo.shamrock.xposed.actions
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.os.Process
|
||||||
|
import moe.fuqiuluo.shamrock.helper.LogCenter
|
||||||
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
|
internal class ListenShamrockUpdate: IAction {
|
||||||
|
override fun invoke(ctx: Context) {
|
||||||
|
val intent = IntentFilter()
|
||||||
|
intent.addAction("android.intent.action.PACKAGE_ADDED")
|
||||||
|
intent.addAction("android.intent.action.PACKAGE_REMOVED")
|
||||||
|
intent.addAction("android.intent.action.PACKAGE_REPLACED")
|
||||||
|
intent.addDataScheme("package")
|
||||||
|
|
||||||
|
ctx.registerReceiver(Companion, intent)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object: BroadcastReceiver() {
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
when (intent.action) {
|
||||||
|
"android.intent.action.PACKAGE_ADDED",
|
||||||
|
"android.intent.action.PACKAGE_REMOVED",
|
||||||
|
"android.intent.action.PACKAGE_REPLACED" -> {
|
||||||
|
val packageName = intent.data?.schemeSpecificPart
|
||||||
|
if (packageName == "moe.fuqiuluo.shamrock") {
|
||||||
|
LogCenter.log("Shamrock更新, QQ已经自我销毁。")
|
||||||
|
Process.killProcess(Process.myPid())
|
||||||
|
exitProcess(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -23,6 +23,7 @@ object ActionLoader {
|
|||||||
InitRemoteService::class, // 创建HTTP API
|
InitRemoteService::class, // 创建HTTP API
|
||||||
NoBackGround::class, // 反QQ后台模式
|
NoBackGround::class, // 反QQ后台模式
|
||||||
GuidLock::class,
|
GuidLock::class,
|
||||||
|
ListenShamrockUpdate::class
|
||||||
)
|
)
|
||||||
|
|
||||||
// 先从APP拉取配置文件,再执行其他操作
|
// 先从APP拉取配置文件,再执行其他操作
|
||||||
|
Reference in New Issue
Block a user