diff --git a/README.md b/README.md index c7c86db60..1404f04ec 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,8 @@ [](https://bintray.com/him188moe/mirai/mirai-core/) **[English](README-eng.md)** -**TIM PC 协议** 跨平台 QQ 协议支持库. -**纯 Kotlin 实现协议和支持框架. 目前可运行在 JVM 或 Android.** -部分协议来自网络上开源项目. +**TIM PC 和 QQ Android 协议** 跨平台 QQ 协议支持库. +**纯 Kotlin 实现协议和支持框架. 目前可运行在 JVM 或 Android.** **一切开发旨在学习,请勿用于非法用途** @@ -17,17 +16,6 @@ 在 [Project](https://github.com/mamoe/mirai/projects/1) 查看已支持功能和计划 在 [UpdateLog](https://github.com/mamoe/mirai/blob/master/UpdateLog.md) 查看版本更新记录 -## Contribution - -我们 (Mamoe, NaturalHG & Him188) 将会一直维护这个项目,除非遇到不可抗力因素。 - -我们欢迎一切形式的贡献。 -我们也期待有更多人能加入 Mirai 的开发。 - -若在使用过程中有任何疑问, 可提交 issue 或是邮件联系(support@mamoe.net). 我们希望 Mirai 变得更易用. - -您的 star 是对我们最大的鼓励(点击项目右上角); - ## Features #### mirai-core 通用 API 模块,请参考此模块调用 Mirai. @@ -46,9 +34,11 @@ QQ for Android (8.2.0 版本,2019 年 12 月)协议的实现,目前还 开发进度: - 完成 密码登录 (2020/1/23) -- 进行中 验证码登录 -- 进行中 消息解析 -- 进行中 图片上传下载 +- 完成 群消息解析 (2020/1/25) +- 进行中 免密登录 +- 进行中 图片验证码登录 +- 进行中 消息解析和发送 +- 进行中 图片上传和下载 ## Use directly **直接使用Mirai(终端环境/网页面板(将来)).** @@ -87,8 +77,19 @@ implementation("net.mamoe:mirai-core-timpc-android:VERSION") Android 上, Mirai 运行需使用 80M 内存. JVM 上需 120M-150M 内存 +## Contribution + +我们 (Mamoe, NaturalHG & Him188) 将会一直维护这个项目,除非遇到不可抗力因素。 + +我们欢迎一切形式的贡献。 +我们也期待有更多人能加入 Mirai 的开发。 + +若在使用过程中有任何疑问, 可提交 issue 或是邮件联系(support@mamoe.net). 我们希望 Mirai 变得更易用. + +您的 star 是对我们最大的鼓励(点击项目右上角); + ## Wiki -在 [Wiki](https://github.com/mamoe/mirai/wiki/Development-Guide---Kotlin) 中查看各类帮助 +在 [Wiki](https://github.com/mamoe/mirai/wiki/Development-Guide---Kotlin) 中查看各类帮助,如 API 示例。 ## Try @@ -115,9 +116,9 @@ bot.subscribeAlways<MemberPermissionChangedEvent> { ## Build Requirements -- Kotlin 1.3.61 -- JDK 8 -- Android SDK 29 +- Kotlin 1.3.61 +- JDK 8 (required) +- Android SDK 29 (for Android target, optional) #### Libraries used 感谢: diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt index 4c7d99cec..fd78149c7 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt @@ -9,10 +9,7 @@ import net.mamoe.mirai.data.OnlineStatus import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.network.protocol.packet.PacketLogger import net.mamoe.mirai.qqandroid.network.protocol.packet.Tlv -import net.mamoe.mirai.qqandroid.utils.Context -import net.mamoe.mirai.qqandroid.utils.DeviceInfo -import net.mamoe.mirai.qqandroid.utils.NetworkType -import net.mamoe.mirai.qqandroid.utils.SystemDeviceInfo +import net.mamoe.mirai.qqandroid.utils.* import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.cryptor.ECDH @@ -20,10 +17,7 @@ import net.mamoe.mirai.utils.cryptor.contentToString import net.mamoe.mirai.utils.cryptor.decryptBy import net.mamoe.mirai.utils.cryptor.initialPublicKey import net.mamoe.mirai.utils.getValue -import net.mamoe.mirai.utils.io.hexToBytes -import net.mamoe.mirai.utils.io.read -import net.mamoe.mirai.utils.io.readUShortLVByteArray -import net.mamoe.mirai.utils.io.readUShortLVString +import net.mamoe.mirai.utils.io.* import net.mamoe.mirai.utils.unsafeWeakRef /* @@ -86,8 +80,8 @@ internal open class QQAndroidClient( val context: Context by context.unsafeWeakRef() val bot: QQAndroidBot by bot.unsafeWeakRef() - var tgtgtKey: ByteArray = ByteArray(16) // generateTgtgtKey(device.guid) - val randomKey: ByteArray = ByteArray(16) // 加密使用 + var tgtgtKey: ByteArray = generateTgtgtKey(device.guid) + val randomKey: ByteArray = getRandomByteArray(16) var miscBitMap: Int = 184024956 // 也可能是 150470524 ? var mainSigMap: Int = 16724722 diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt index fbed60855..5a8feff8d 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt @@ -8,7 +8,7 @@ import net.mamoe.mirai.qqandroid.network.io.JceInput import net.mamoe.mirai.qqandroid.network.protocol.jce.RequestPacket import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.OnlinePush import net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket -//import net.mamoe.mirai.qqandroid.network.protocol.packet.login.SvcReqRegisterPacket +import net.mamoe.mirai.qqandroid.network.protocol.packet.login.StatSvc import net.mamoe.mirai.utils.DefaultLogger import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.cryptor.adjustToPublicKey @@ -50,6 +50,7 @@ internal val PacketLogger: MiraiLogger = DefaultLogger("Packet") @UseExperimental(ExperimentalUnsignedTypes::class) internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf( LoginPacket, + StatSvc.Register, OnlinePush.PbPushGroupMsg ) { diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt index 6a96bdd44..203338c54 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt @@ -59,7 +59,7 @@ internal class OnlinePush { permission = when { flags and 16 != 0 -> MemberPermission.ADMINISTRATOR flags and 8 != 0 -> MemberPermission.OWNER - flags and 0 != 0 -> MemberPermission.MEMBER + flags == 0 -> MemberPermission.MEMBER else -> { bot.logger.warning("判断群员权限失败") MemberPermission.MEMBER diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt index 4e13c2542..23e8af005 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt @@ -261,8 +261,8 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt // val ret = tlvMap[0x104]?.let { println(it.toUHexString()) } println() val question = tlvMap[0x165] ?: error("CAPTCHA QUESTION UNKNOWN") - when (question[18].toUHexString()) { - "36" -> { + when (question[18].toInt()) { + 0x36 -> { //图片验证 DebugLogger.debug("是一个图片验证码") bot.client.t104 = tlvMap[0x104]!!