Shamrock: feat 群打卡

This commit is contained in:
ikechan8370 2023-12-08 21:52:35 +08:00
parent 27791cc848
commit adb7b12c16
7 changed files with 325 additions and 1 deletions

View File

@ -21,6 +21,10 @@ public abstract class PBField<T> {
return new PBBytesField(byteStringMicro, false);
}
public static PBFloatField initFloat(float paramFloat) {
return new PBFloatField(paramFloat, false);
}
public static PBBoolField initBool(boolean z) {
return new PBBoolField(z, false);
}

View File

@ -0,0 +1,13 @@
package com.tencent.mobileqq.pb;
public class PBFloatField extends PBPrimitiveField<Float> {
public PBFloatField(float i2, boolean z) {
}
public int get() {
return 0;
}
public void set(int i2) {
}
}

View File

@ -0,0 +1,245 @@
package tencent.im.oidb.cmd0xeb7;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBFloatField;
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;
public class oidb_0xeb7 {
public static class ReqBody extends MessageMicro<ReqBody> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "signInStatusReq", "signInWriteReq" }, new Object[] { null, null }, ReqBody.class);
public StSignInStatusReq signInStatusReq = new StSignInStatusReq();
public StSignInWriteReq signInWriteReq = new StSignInWriteReq();
}
public static class RspBody extends MessageMicro<RspBody>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "signInStatusRsp", "signInWriteRsp" }, new Object[] { null, null }, RspBody.class);
public StSignInStatusRsp signInStatusRsp = new StSignInStatusRsp();
public StSignInWriteRsp signInWriteRsp = new StSignInWriteRsp();
}
public static class StSignInWriteRsp
extends MessageMicro<StSignInWriteRsp>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "ret", "doneInfo", "groupScore" }, new Object[] { null, null, null }, StSignInWriteRsp.class);
public SignInStatusDoneInfo doneInfo = new SignInStatusDoneInfo();
public SignInStatusGroupScore groupScore = new SignInStatusGroupScore();
public Ret ret = new Ret();
}
public static class StSignInStatusRsp
extends MessageMicro<StSignInStatusRsp>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34, 42, 50, 58, 66 }, new String[] { "ret", "base", "yesterday", "notInfo", "doneInfo", "groupScore", "mantleUrl", "backgroundUrl" }, new Object[] { null, null, null, null, null, null, "", "" }, StSignInStatusRsp.class);
public final PBStringField backgroundUrl = PBField.initString("");
public SignInStatusBase base = new SignInStatusBase();
public SignInStatusDoneInfo doneInfo = new SignInStatusDoneInfo();
public SignInStatusGroupScore groupScore = new SignInStatusGroupScore();
public final PBStringField mantleUrl = PBField.initString("");
public SignInStatusNotInfo notInfo = new SignInStatusNotInfo();
public Ret ret = new Ret();
public SignInStatusYesterdayFirst yesterday = new SignInStatusYesterdayFirst();
}
public static class SignInStatusYesterdayFirst
extends MessageMicro<SignInStatusYesterdayFirst>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "yesterdayFirstUid", "yesterdayWord", "yesterdayNick" }, new Object[] { "", "", "" }, SignInStatusYesterdayFirst.class);
public final PBStringField yesterdayFirstUid = PBField.initString("");
public final PBStringField yesterdayNick = PBField.initString("");
public final PBStringField yesterdayWord = PBField.initString("");
}
public static class SignInStatusNotInfo
extends MessageMicro<SignInStatusNotInfo>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "buttonWord", "signDescWordLeft", "signDescWordRight" }, new Object[] { "", "", "" }, SignInStatusNotInfo.class);
public final PBStringField buttonWord = PBField.initString("");
public final PBStringField signDescWordLeft = PBField.initString("");
public final PBStringField signDescWordRight = PBField.initString("");
}
public static class SignInStatusGroupScore
extends MessageMicro<SignInStatusGroupScore>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "groupScoreWord", "scoreUrl" }, new Object[] { "", "" }, SignInStatusGroupScore.class);
public final PBStringField groupScoreWord = PBField.initString("");
public final PBStringField scoreUrl = PBField.initString("");
}
public static class SignInStatusDoneInfo
extends MessageMicro<SignInStatusDoneInfo>
{
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34 }, new String[] { "leftTitleWrod", "rightDescWord", "belowPortraitWords", "recordUrl" }, new Object[] { "", "", "", "" }, SignInStatusDoneInfo.class);
public final PBRepeatField<String> belowPortraitWords = PBField.initRepeat(PBField.initString(""));
public final PBStringField leftTitleWrod = PBField.initString("");
public final PBStringField recordUrl = PBField.initString("");
public final PBStringField rightDescWord = PBField.initString("");
}
public static class StSignInRecordDaySigned extends MessageMicro<StSignInRecordDaySigned> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 13, 16, 26, 34 }, new String[] { "daySignedRatio", "dayTotalSignedUid", "daySignedPage", "daySignedUrl" }, new Object[] { Float.valueOf(0.0F), Integer.valueOf(0), null, "" }, StSignInRecordDaySigned.class);
public StDaySignedPage daySignedPage = new StDaySignedPage();
public final PBFloatField daySignedRatio = PBField.initFloat(0.0F);
public final PBStringField daySignedUrl = PBField.initString("");
public final PBInt32Field dayTotalSignedUid = PBField.initInt32(0);
}
public static class SignInStatusBase extends MessageMicro<SignInStatusBase> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "status", "currentTimeStamp" }, new Object[] { Integer.valueOf(0), Long.valueOf(0L) }, SignInStatusBase.class);
public final PBInt64Field currentTimeStamp = PBField.initInt64(0L);
public final PBEnumField status = PBField.initEnum(0);
}
public static class StSignInRecordRsp extends MessageMicro<StSignInRecordRsp> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34, 42, 50 }, new String[] { "ret", "base", "userRecord", "daySigned", "kingRecord", "level" }, new Object[] { null, null, null, null, null, null }, StSignInRecordRsp.class);
public SignInStatusBase base = new SignInStatusBase();
public StSignInRecordDaySigned daySigned = new StSignInRecordDaySigned();
public StSignInRecordKing kingRecord = new StSignInRecordKing();
public StViewGroupLevel level = new StViewGroupLevel();
public Ret ret = new Ret();
public StSignInRecordUser userRecord = new StSignInRecordUser();
}
public static class Ret extends MessageMicro<Ret> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 18 }, new String[] { "code", "msg" }, new Object[] { Integer.valueOf(0), "" }, Ret.class);
public final PBEnumField code = PBField.initEnum(0);
public final PBStringField msg = PBField.initString("");
}
public static class StSignInRecordUser extends MessageMicro<StSignInRecordUser> {
static final MessageMicro.FieldMap __fieldMap__;
public final PBInt64Field continueSignedDays = PBField.initInt64(0L);
public final PBInt64Field earliestSignedTimeStamp = PBField.initInt64(0L);
public final PBStringField groupName = PBField.initString("");
public final PBRepeatField<String> historySignedDays = PBField.initRepeat(PBField.initString(""));
public final PBInt32Field totalSignedDays = PBField.initInt32(0);
static {
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 16, 24, 32, 42, 50 }, new String[] { "totalSignedDays", "earliestSignedTimeStamp", "continueSignedDays", "historySignedDays", "groupName" }, new Object[] { Integer.valueOf(0), long_, long_, "", "" }, StSignInRecordUser.class);
}
}
public static class StDaySignedInfo extends MessageMicro<StDaySignedInfo> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32 }, new String[] { "uid", "uidGroupNick", "signedTimeStamp", "signInRank" }, new Object[] { "", "", Long.valueOf(0L), Integer.valueOf(0) }, StDaySignedInfo.class);
public final PBInt32Field signInRank = PBField.initInt32(0);
public final PBInt64Field signedTimeStamp = PBField.initInt64(0L);
public final PBStringField uid = PBField.initString("");
public final PBStringField uidGroupNick = PBField.initString("");
}
public static class StDaySignedPage extends MessageMicro<StDaySignedPage> {
static final MessageMicro.FieldMap __fieldMap__;
public final PBRepeatMessageField<StDaySignedInfo> infos = PBField.initRepeatMessage(StDaySignedInfo.class);
public final PBInt32Field offset = PBField.initInt32(0);
public final PBInt32Field total = PBField.initInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 16, 24 }, new String[] { "infos", "offset", "total" }, new Object[] { null, integer, integer }, StDaySignedPage.class);
}
}
public static class StKingSignedInfo extends MessageMicro<StKingSignedInfo> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32 }, new String[] { "uid", "groupNick", "signedTimeStamp", "signedCount" }, new Object[] { "", "", Long.valueOf(0L), Integer.valueOf(0) }, StKingSignedInfo.class);
public final PBStringField groupNick = PBField.initString("");
public final PBInt32Field signedCount = PBField.initInt32(0);
public final PBInt64Field signedTimeStamp = PBField.initInt64(0L);
public final PBStringField uid = PBField.initString("");
}
public static class StSignInStatusReq extends MessageMicro<StSignInStatusReq> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 34 }, new String[] { "uid", "groupId", "scene", "clientVersion" }, new Object[] { "", "", Integer.valueOf(0), "" }, StSignInStatusReq.class);
public final PBStringField clientVersion = PBField.initString("");
public final PBStringField groupId = PBField.initString("");
public final PBEnumField scene = PBField.initEnum(0);
public final PBStringField uid = PBField.initString("");
}
public static class StSignInWriteReq extends MessageMicro<StSignInWriteReq> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26 }, new String[] { "uid", "groupId", "clientVersion" }, new Object[] { "", "", "" }, StSignInWriteReq.class);
public final PBStringField clientVersion = PBField.initString("");
public final PBStringField groupId = PBField.initString("");
public final PBStringField uid = PBField.initString("");
}
public static class StViewGroupLevel extends MessageMicro<StViewGroupLevel> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "title", "url" }, new Object[] { "", "" }, StViewGroupLevel.class);
public final PBStringField title = PBField.initString("");
public final PBStringField url = PBField.initString("");
}
public static class StSignInRecordKing extends MessageMicro<StSignInRecordKing> {
static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 26, 34 }, new String[] { "yesterdayFirst", "topSignedTotal", "topSignedContinue", "kingUrl" }, new Object[] { null, null, null, "" }, StSignInRecordKing.class);
public final PBStringField kingUrl = PBField.initString("");
public final PBRepeatMessageField<StKingSignedInfo> topSignedContinue = PBField.initRepeatMessage(StKingSignedInfo.class);
public final PBRepeatMessageField<StKingSignedInfo> topSignedTotal = PBField.initRepeatMessage(StKingSignedInfo.class);
public StKingSignedInfo yesterdayFirst = new StKingSignedInfo();
}
}

View File

@ -47,6 +47,7 @@ import moe.fuqiuluo.proto.ProtoUtils
import moe.fuqiuluo.proto.asInt
import moe.fuqiuluo.proto.asUtf8String
import moe.fuqiuluo.proto.protobufOf
import moe.fuqiuluo.qqinterface.servlet.TicketSvc.getUin
import moe.fuqiuluo.qqinterface.servlet.entries.ProhibitedMemberInfo
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
@ -67,13 +68,16 @@ import moe.fuqiuluo.shamrock.tools.ifNullOrEmpty
import moe.fuqiuluo.shamrock.tools.putBuf32Long
import moe.fuqiuluo.shamrock.tools.slice
import moe.fuqiuluo.shamrock.utils.FileUtils
import moe.fuqiuluo.shamrock.utils.PlatformUtils
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher
import mqq.app.MobileQQ
import tencent.im.group.group_member_info
import tencent.im.oidb.cmd0x899.oidb_0x899
import tencent.im.oidb.cmd0x89a.oidb_0x89a
import tencent.im.oidb.cmd0x8a0.oidb_0x8a0
import tencent.im.oidb.cmd0x8fc.Oidb_0x8fc
import tencent.im.oidb.cmd0xeb7.oidb_0xeb7
import tencent.im.oidb.oidb_sso
import tencent.im.troop.honor.troop_honor
import java.lang.reflect.Method
@ -950,4 +954,27 @@ internal object GroupSvc: BaseSvc() {
Result.failure(Exception(body.jsonObject["em"].asStringOrNull))
}
}
suspend fun groupSign(groupId: Long): Result<String> {
val req = oidb_0xeb7.ReqBody()
val signInWriteReq = oidb_0xeb7.StSignInWriteReq()
signInWriteReq.groupId.set(groupId.toString())
signInWriteReq.uid.set(getUin())
var version = PlatformUtils.getClientVersion(MobileQQ.getContext())
version = version.replace("android", "").trimStart()
signInWriteReq.clientVersion.set(version)
req.signInWriteReq.set(signInWriteReq)
val buffer = sendOidbAW("OidbSvc.0xeb7", 3767, 1, req.toByteArray())
return if (buffer == null) {
Result.failure(Exception("操作失败"))
} else {
val body = oidb_sso.OIDBSSOPkg()
body.mergeFrom(buffer.slice(4))
val rsp = oidb_0xeb7.RspBody()
rsp.mergeFrom(body.bytes_bodybuffer.get().toByteArray())
val doneInfo = rsp.signInWriteRsp.doneInfo
LogCenter.log(rsp.toString(), Level.DEBUG)
Result.success("${doneInfo.leftTitleWrod.get()} ${doneInfo.rightDescWord.get()} ${doneInfo.belowPortraitWords.get().joinToString(" ")}")
}
}
}

View File

@ -31,7 +31,7 @@ internal object ActionManager {
// GroupActions
ModifyTroopName, LeaveTroop, KickTroopMember, BanTroopMember, SetGroupWholeBan, SetGroupAdmin,
ModifyTroopMemberName, SetGroupUnique, GetTroopHonor, GroupPoke, SetEssenceMessage, DeleteEssenceMessage,
GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, SendGroupNotice,
GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, SendGroupNotice, SendGroupSign,
// MSG ACTIONS
SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendPrivateForwardMessage, SendGroupMessage, SendPrivateMessage,

View File

@ -0,0 +1,30 @@
package moe.fuqiuluo.shamrock.remote.action.handlers
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.GroupSvc
import moe.fuqiuluo.qqinterface.servlet.MsgSvc
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.shamrock.tools.EmptyJsonString
internal object SendGroupSign: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val groupId = session.getLong("group_id")
return invoke(groupId, session.echo)
}
suspend operator fun invoke(groupId: Long, echo: JsonElement = EmptyJsonString): String {
val ret = GroupSvc.groupSign(groupId)
return if (ret.isSuccess) {
ok(ret.getOrNull() ?: "", echo)
} else {
logic(ret.exceptionOrNull()?.message ?: "", echo)
}
}
override val requiredParams: Array<String> = arrayOf("group_id")
override fun path(): String = "send_group_sign"
}

View File

@ -140,4 +140,9 @@ fun Routing.troopAction() {
call.respondText(SendGroupNotice(groupId, text, image), ContentType.Application.Json)
}
getOrPost("/send_group_sign") {
val groupId = fetchOrThrow("group_id").toLong()
call.respondText(SendGroupSign(groupId), ContentType.Application.Json)
}
}