Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
Mirai
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
Mirai
Commits
d19216a6
Commit
d19216a6
authored
Sep 13, 2019
by
Him188moe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated
parent
e3c23b35
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
204 additions
and
54 deletions
+204
-54
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/MessageChain.kt
...ain/java/net/mamoe/mirai/message/defaults/MessageChain.kt
+2
-2
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/PlainText.kt
...c/main/java/net/mamoe/mirai/message/defaults/PlainText.kt
+6
-4
mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
.../main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
+70
-4
mirai-core/src/main/java/net/mamoe/mirai/network/handler/BotSession.kt
...c/main/java/net/mamoe/mirai/network/handler/BotSession.kt
+14
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ClientPacket.kt
.../main/java/net/mamoe/mirai/network/packet/ClientPacket.kt
+5
-15
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
...c/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerPacket.kt
.../main/java/net/mamoe/mirai/network/packet/ServerPacket.kt
+45
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Session.kt
...e/src/main/java/net/mamoe/mirai/network/packet/Session.kt
+2
-2
mirai-core/src/main/java/net/mamoe/mirai/network/packet/VerificationCode.kt
...n/java/net/mamoe/mirai/network/packet/VerificationCode.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/AddContact.kt
.../java/net/mamoe/mirai/network/packet/action/AddContact.kt
+1
-1
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendFriendMessagePacket.kt
...ai/network/packet/action/ClientSendFriendMessagePacket.kt
+2
-2
mirai-core/src/main/java/net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
.../net/mamoe/mirai/network/packet/image/UploadGroupImage.kt
+41
-3
mirai-core/src/main/java/net/mamoe/mirai/utils/ImageNetworkUtils.java
...rc/main/java/net/mamoe/mirai/utils/ImageNetworkUtils.java
+14
-18
No files found.
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/MessageChain.kt
View file @
d19216a6
...
@@ -2,7 +2,7 @@ package net.mamoe.mirai.message.defaults
...
@@ -2,7 +2,7 @@ package net.mamoe.mirai.message.defaults
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.utils.lazy
Output
import
net.mamoe.mirai.utils.lazy
Encode
import
org.intellij.lang.annotations.MagicConstant
import
org.intellij.lang.annotations.MagicConstant
import
java.util.*
import
java.util.*
import
java.util.stream.Collectors
import
java.util.stream.Collectors
...
@@ -71,7 +71,7 @@ class MessageChain : Message {
...
@@ -71,7 +71,7 @@ class MessageChain : Message {
return
this
return
this
}
}
override
fun
toByteArray
():
ByteArray
=
lazy
Output
{
override
fun
toByteArray
():
ByteArray
=
lazy
Encode
{
stream
().
forEach
{
message
->
stream
().
forEach
{
message
->
it
.
write
(
message
.
toByteArray
())
it
.
write
(
message
.
toByteArray
())
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/message/defaults/PlainText.kt
View file @
d19216a6
...
@@ -2,7 +2,9 @@ package net.mamoe.mirai.message.defaults
...
@@ -2,7 +2,9 @@ package net.mamoe.mirai.message.defaults
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.Message
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.message.MessageId
import
net.mamoe.mirai.utils.lazyOutput
import
net.mamoe.mirai.network.packet.writeLVByteArray
import
net.mamoe.mirai.network.packet.writeLVString
import
net.mamoe.mirai.utils.lazyEncode
/**
/**
* @author Him188moe
* @author Him188moe
...
@@ -14,12 +16,12 @@ class PlainText(private val text: String) : Message() {
...
@@ -14,12 +16,12 @@ class PlainText(private val text: String) : Message() {
return
text
return
text
}
}
override
fun
toByteArray
():
ByteArray
=
lazy
Output
{
section
->
override
fun
toByteArray
():
ByteArray
=
lazy
Encode
{
section
->
section
.
writeByte
(
this
.
type
)
section
.
writeByte
(
this
.
type
)
section
.
write
VarByteArray
(
lazyOutput
{
child
->
section
.
write
LVByteArray
(
lazyEncode
{
child
->
child
.
writeByte
(
0
x01
)
child
.
writeByte
(
0
x01
)
child
.
write
Var
String
(
this
.
text
)
child
.
write
LV
String
(
this
.
text
)
})
})
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
View file @
d19216a6
...
@@ -18,9 +18,13 @@ import net.mamoe.mirai.message.defaults.MessageChain
...
@@ -18,9 +18,13 @@ import net.mamoe.mirai.message.defaults.MessageChain
import
net.mamoe.mirai.network.BotNetworkHandler.*
import
net.mamoe.mirai.network.BotNetworkHandler.*
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.action.*
import
net.mamoe.mirai.network.packet.action.*
import
net.mamoe.mirai.network.packet.image.ServerTryUploadGroupImageFailedPacket
import
net.mamoe.mirai.network.packet.image.ServerTryUploadGroupImageResponsePacket
import
net.mamoe.mirai.network.packet.image.ServerTryUploadGroupImageSuccessPacket
import
net.mamoe.mirai.network.packet.login.*
import
net.mamoe.mirai.network.packet.login.*
import
net.mamoe.mirai.task.MiraiThreadPool
import
net.mamoe.mirai.task.MiraiThreadPool
import
net.mamoe.mirai.utils.*
import
net.mamoe.mirai.utils.*
import
java.awt.image.BufferedImage
import
java.io.Closeable
import
java.io.Closeable
import
java.net.DatagramPacket
import
java.net.DatagramPacket
import
java.net.DatagramSocket
import
java.net.DatagramSocket
...
@@ -301,7 +305,7 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
...
@@ -301,7 +305,7 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
private
lateinit
var
loginIP
:
String
private
lateinit
var
loginIP
:
String
private
var
tgtgtKey
:
ByteArray
=
getRandomByteArray
(
16
)
private
var
tgtgtKey
:
ByteArray
=
getRandomByteArray
(
16
)
private
var
tlv0105
:
ByteArray
=
lazy
Output
{
private
var
tlv0105
:
ByteArray
=
lazy
Encode
{
it
.
writeHex
(
"01 05 00 30"
)
it
.
writeHex
(
"01 05 00 30"
)
it
.
writeHex
(
"00 01 01 02 00 14 01 01 00 10"
)
it
.
writeHex
(
"00 01 01 02 00 14 01 01 00 10"
)
it
.
writeRandom
(
16
)
it
.
writeRandom
(
16
)
...
@@ -560,14 +564,24 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
...
@@ -560,14 +564,24 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
internal
var
gtk
:
Int
=
0
internal
var
gtk
:
Int
=
0
private
val
addFriendSessions
=
Collections
.
synchronizedCollection
(
mutableListOf
<
AddFriendSession
>())
private
val
addFriendSessions
=
Collections
.
synchronizedCollection
(
mutableListOf
<
AddFriendSession
>())
private
val
uploadImageSessions
=
Collections
.
synchronizedCollection
(
mutableListOf
<
UploadImageSession
>())
override
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
override
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
when
(
packet
)
{
when
(
packet
)
{
is
ServerCanAddFriendResponsePacket
->
{
is
ServerCanAddFriendResponsePacket
->
{
this
.
addFriend
Sessions
.
forEach
{
this
.
uploadImage
Sessions
.
forEach
{
it
.
onPacketReceived
(
packet
)
it
.
onPacketReceived
(
packet
)
}
}
}
}
is
ServerTryUploadGroupImageSuccessPacket
->
{
ImageNetworkUtils
.
postImage
(
packet
.
uKey
.
toUHexString
(),
)
}
is
ServerTryUploadGroupImageFailedPacket
->
{
}
is
ServerTryUploadGroupImageResponsePacket
.
Encrypted
->
distributePacket
(
packet
.
decrypt
(
sessionKey
))
else
->
{
else
->
{
}
}
}
}
...
@@ -581,7 +595,7 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
...
@@ -581,7 +595,7 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
fun
addFriend
(
qqNumber
:
Long
,
message
:
Lazy
<
String
>
=
lazyOf
(
""
)):
CompletableFuture
<
AddFriendResult
>
{
fun
addFriend
(
qqNumber
:
Long
,
message
:
Lazy
<
String
>
=
lazyOf
(
""
)):
CompletableFuture
<
AddFriendResult
>
{
val
future
=
CompletableFuture
<
AddFriendResult
>()
val
future
=
CompletableFuture
<
AddFriendResult
>()
val
session
=
AddFriendSession
(
qqNumber
,
future
,
message
)
val
session
=
AddFriendSession
(
qqNumber
,
future
,
message
)
addFriend
Sessions
.
add
(
session
)
uploadImage
Sessions
.
add
(
session
)
session
.
sendAddRequest
();
session
.
sendAddRequest
();
return
future
return
future
}
}
...
@@ -590,6 +604,58 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
...
@@ -590,6 +604,58 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
}
}
private
inner
class
UploadImageSession
(
private
val
group
:
Long
,
private
val
future
:
CompletableFuture
<
AddFriendResult
>,
private
val
image
:
BufferedImage
)
:
Closeable
{
lateinit
var
id
:
ByteArray
fun
onPacketReceived
(
packet
:
ServerPacket
)
{
if
(!
::
id
.
isInitialized
)
{
return
}
when
(
packet
)
{
is
ServerCanAddFriendResponsePacket
->
{
if
(!(
packet
.
idByteArray
[
2
]
==
id
[
0
]
&&
packet
.
idByteArray
[
3
]
==
id
[
1
]))
{
return
}
when
(
packet
.
state
)
{
ServerCanAddFriendResponsePacket
.
State
.
FAILED
->
{
future
.
complete
(
AddFriendResult
.
FAILED
)
close
()
}
ServerCanAddFriendResponsePacket
.
State
.
ALREADY_ADDED
->
{
future
.
complete
(
AddFriendResult
.
ALREADY_ADDED
)
close
()
}
ServerCanAddFriendResponsePacket
.
State
.
REQUIRE_VERIFICATION
->
{
sendPacket
(
ClientAddFriendPacket
(
bot
.
account
.
qqNumber
,
qq
,
sessionKey
))
}
ServerCanAddFriendResponsePacket
.
State
.
NOT_REQUIRE_VERIFICATION
->
{
}
}
}
}
}
override
fun
sendRequest
()
{
}
override
fun
close
()
{
uploadImageSessions
.
remove
(
this
)
}
}
private
inner
class
AddFriendSession
(
private
inner
class
AddFriendSession
(
private
val
qq
:
Long
,
private
val
qq
:
Long
,
private
val
future
:
CompletableFuture
<
AddFriendResult
>,
private
val
future
:
CompletableFuture
<
AddFriendResult
>,
...
@@ -638,7 +704,7 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
...
@@ -638,7 +704,7 @@ class BotNetworkHandler(private val bot: Bot) : Closeable {
}
}
override
fun
close
()
{
override
fun
close
()
{
addFriend
Sessions
.
remove
(
this
)
uploadImage
Sessions
.
remove
(
this
)
}
}
}
}
}
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/handler/BotSession.kt
0 → 100644
View file @
d19216a6
package
net.mamoe.mirai.network.handler
import
net.mamoe.mirai.Bot
import
net.mamoe.mirai.network.BotNetworkHandler
/**
* @author Him188moe
*/
data class
BotSession
(
val
bot
:
Bot
,
val
sessionKey
:
ByteArray
,
val
networkHandler
:
BotNetworkHandler
)
{
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ClientPacket.kt
View file @
d19216a6
...
@@ -113,7 +113,7 @@ fun DataOutputStream.encryptAndWrite(byteArray: ByteArray, key: ByteArray) {
...
@@ -113,7 +113,7 @@ fun DataOutputStream.encryptAndWrite(byteArray: ByteArray, key: ByteArray) {
}
}
fun
DataOutputStream
.
encryptAndWrite
(
key
:
ByteArray
,
encoder
:
(
ByteArrayDataOutputStream
)
->
Unit
)
{
fun
DataOutputStream
.
encryptAndWrite
(
key
:
ByteArray
,
encoder
:
(
ByteArrayDataOutputStream
)
->
Unit
)
{
this
.
write
(
TEA
.
encrypt
(
ByteArrayDataOutputStream
().
let
{
encoder
(
it
);
it
.
toByteArray
()
}
,
key
))
this
.
write
(
TEA
.
encrypt
(
ByteArrayDataOutputStream
().
also
(
encoder
).
toByteArray
()
,
key
))
}
}
@ExperimentalUnsignedTypes
@ExperimentalUnsignedTypes
...
@@ -204,7 +204,7 @@ fun Int.toLByteArray(): ByteArray = byteArrayOf(
...
@@ -204,7 +204,7 @@ fun Int.toLByteArray(): ByteArray = byteArrayOf(
)
)
@ExperimentalUnsignedTypes
@ExperimentalUnsignedTypes
fun
Int
.
toUHexString
(
separator
:
String
=
" "
):
String
=
this
.
toByteArray
().
toU
ByteArray
().
toU
HexString
(
separator
)
fun
Int
.
toUHexString
(
separator
:
String
=
" "
):
String
=
this
.
toByteArray
().
toUHexString
(
separator
)
internal
fun
md5
(
str
:
String
):
ByteArray
=
MessageDigest
.
getInstance
(
"MD5"
).
digest
(
str
.
toByteArray
())
internal
fun
md5
(
str
:
String
):
ByteArray
=
MessageDigest
.
getInstance
(
"MD5"
).
digest
(
str
.
toByteArray
())
...
@@ -237,21 +237,11 @@ fun DataOutputStream.writeGroup(groupIdOrGroupNumber: Long) {
...
@@ -237,21 +237,11 @@ fun DataOutputStream.writeGroup(groupIdOrGroupNumber: Long) {
this
.
write
(
groupIdOrGroupNumber
.
toUInt
().
toByteArray
())
this
.
write
(
groupIdOrGroupNumber
.
toUInt
().
toByteArray
())
}
}
fun
DataOutputStream
.
write
Var
ByteArray
(
byteArray
:
ByteArray
)
{
fun
DataOutputStream
.
write
LV
ByteArray
(
byteArray
:
ByteArray
)
{
this
.
writeShort
(
byteArray
.
size
)
this
.
writeShort
(
byteArray
.
size
)
this
.
write
(
byteArray
)
this
.
write
(
byteArray
)
}
}
fun
DataOutputStream
.
writeVarString
(
str
:
String
)
{
fun
DataOutputStream
.
writeLVString
(
str
:
String
)
{
this
.
writeVarByteArray
(
str
.
toByteArray
())
this
.
writeLVByteArray
(
str
.
toByteArray
())
}
fun
DataOutputStream
.
writeVarShort
(
short
:
Int
)
{
this
.
writeByte
(
0
x02
)
this
.
writeShort
(
short
)
}
fun
DataOutputStream
.
writeVarInt
(
int
:
Int
)
{
this
.
writeByte
(
0
x04
)
this
.
writeInt
(
int
)
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerEvent.kt
View file @
d19216a6
...
@@ -19,7 +19,7 @@ import java.util.zip.GZIPInputStream
...
@@ -19,7 +19,7 @@ import java.util.zip.GZIPInputStream
*
*
* @author Him188moe
* @author Him188moe
*/
*/
open
class
ServerEventPacket
(
input
:
DataInputStream
,
val
packetId
:
ByteArray
,
val
eventIdentity
:
ByteArray
)
:
ServerPacket
(
input
)
{
abstract
class
ServerEventPacket
(
input
:
DataInputStream
,
val
packetId
:
ByteArray
,
val
eventIdentity
:
ByteArray
)
:
ServerPacket
(
input
)
{
@PacketId
(
"00 17"
)
@PacketId
(
"00 17"
)
class
Raw
(
input
:
DataInputStream
,
private
val
packetId
:
ByteArray
)
:
ServerPacket
(
input
)
{
class
Raw
(
input
:
DataInputStream
,
private
val
packetId
:
ByteArray
)
:
ServerPacket
(
input
)
{
@ExperimentalUnsignedTypes
@ExperimentalUnsignedTypes
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/ServerPacket.kt
View file @
d19216a6
...
@@ -7,6 +7,7 @@ import net.mamoe.mirai.network.packet.action.ServerSendGroupMessageResponsePacke
...
@@ -7,6 +7,7 @@ import net.mamoe.mirai.network.packet.action.ServerSendGroupMessageResponsePacke
import
net.mamoe.mirai.network.packet.login.*
import
net.mamoe.mirai.network.packet.login.*
import
net.mamoe.mirai.utils.*
import
net.mamoe.mirai.utils.*
import
java.io.DataInputStream
import
java.io.DataInputStream
import
java.io.EOFException
/**
/**
* @author Him188moe
* @author Him188moe
...
@@ -169,7 +170,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
...
@@ -169,7 +170,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
return
this
.
decryptBy
(
keyHex1
.
hexToBytes
(),
keyHex2
.
hexToBytes
())
return
this
.
decryptBy
(
keyHex1
.
hexToBytes
(),
keyHex2
.
hexToBytes
())
}
}
private
fun
decryptAsByteArray
(
key
:
ByteArray
):
ByteArray
{
fun
decryptAsByteArray
(
key
:
ByteArray
):
ByteArray
{
input
.
goto
(
14
)
input
.
goto
(
14
)
return
TEA
.
decrypt
(
input
.
readAllBytes
().
cutTail
(
1
),
key
)
return
TEA
.
decrypt
(
input
.
readAllBytes
().
cutTail
(
1
),
key
)
}
}
...
@@ -257,4 +258,47 @@ fun <N : Number> DataInputStream.readShortAt(position: N): Short {
...
@@ -257,4 +258,47 @@ fun <N : Number> DataInputStream.readShortAt(position: N): Short {
return
this
.
readShort
();
return
this
.
readShort
();
}
}
@ExperimentalUnsignedTypes
@JvmSynthetic
fun
DataInputStream
.
gotoWhere
(
matcher
:
UByteArray
):
DataInputStream
{
return
this
.
gotoWhere
(
matcher
.
toByteArray
())
}
/**
* 去往下一个含这些连续字节的位置
*/
@Throws
(
EOFException
::
class
)
fun
DataInputStream
.
gotoWhere
(
matcher
:
ByteArray
):
DataInputStream
{
require
(
matcher
.
isNotEmpty
())
loop
@
do
{
val
byte
=
this
.
readByte
()
if
(
byte
==
matcher
[
0
])
{
//todo mark here
for
(
i
in
1
until
matcher
.
size
)
{
val
b
=
this
.
readByte
()
if
(
b
!=
matcher
[
i
])
{
continue
@
loop
//todo goto mark
}
return
this
}
}
}
while
(
true
)
}
/*
@Throws(EOFException::class)
fun DataInputStream.gotoWhere(matcher: ByteArray) {
require(matcher.isNotEmpty())
do {
val byte = this.readByte()
if (byte == matcher[0]) {
for (i in 1 until matcher.size){
}
}
} while (true)
}*/
fun
ByteArray
.
cutTail
(
length
:
Int
):
ByteArray
=
this
.
copyOfRange
(
0
,
this
.
size
-
length
)
fun
ByteArray
.
cutTail
(
length
:
Int
):
ByteArray
=
this
.
copyOfRange
(
0
,
this
.
size
-
length
)
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/Session.kt
View file @
d19216a6
...
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
...
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.utils.ByteArrayDataOutputStream
import
net.mamoe.mirai.utils.ByteArrayDataOutputStream
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.TEA
import
net.mamoe.mirai.utils.getRandomByteArray
import
net.mamoe.mirai.utils.getRandomByteArray
import
net.mamoe.mirai.utils.lazy
Output
import
net.mamoe.mirai.utils.lazy
Encode
import
java.io.DataInputStream
import
java.io.DataInputStream
import
java.net.InetAddress
import
java.net.InetAddress
...
@@ -85,7 +85,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, private val d
...
@@ -85,7 +85,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, private val d
527
->
{
527
->
{
input
.
goto
(
63
)
input
.
goto
(
63
)
sessionKey
=
input
.
readNBytes
(
16
)
sessionKey
=
input
.
readNBytes
(
16
)
tlv0105
=
lazy
Output
{
tlv0105
=
lazy
Encode
{
it
.
writeHex
(
"01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00"
)
it
.
writeHex
(
"01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00"
)
input
.
goto
(
dataLength
-
122
)
input
.
goto
(
dataLength
-
122
)
it
.
write
(
input
.
readNBytes
(
56
))
it
.
write
(
input
.
readNBytes
(
56
))
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/VerificationCode.kt
View file @
d19216a6
...
@@ -163,7 +163,7 @@ class ServerVerificationCodeWrongPacket(input: DataInputStream, dataSize: Int, p
...
@@ -163,7 +163,7 @@ class ServerVerificationCodeWrongPacket(input: DataInputStream, dataSize: Int, p
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"00 BA 31"
)
@PacketId
(
"00 BA 31"
)
open
class
ServerVerificationCodeTransmissionPacket
(
input
:
DataInputStream
,
private
val
dataSize
:
Int
,
private
val
packetId
:
ByteArray
)
:
ServerVerificationCodePacket
(
input
)
{
abstract
class
ServerVerificationCodeTransmissionPacket
(
input
:
DataInputStream
,
private
val
dataSize
:
Int
,
private
val
packetId
:
ByteArray
)
:
ServerVerificationCodePacket
(
input
)
{
lateinit
var
captchaSectionN
:
ByteArray
lateinit
var
captchaSectionN
:
ByteArray
lateinit
var
verificationToken
:
ByteArray
//56bytes
lateinit
var
verificationToken
:
ByteArray
//56bytes
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/AddContact.kt
View file @
d19216a6
...
@@ -111,7 +111,7 @@ class ServerAddGroupResponsePacket(input: DataInputStream) : ServerAddContactRes
...
@@ -111,7 +111,7 @@ class ServerAddGroupResponsePacket(input: DataInputStream) : ServerAddContactRes
/**
/**
* 添加好友/群的回复
* 添加好友/群的回复
*/
*/
open
class
ServerAddContactResponsePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
abstract
class
ServerAddContactResponsePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
class
Raw
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
class
Raw
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/action/ClientSendFriendMessagePacket.kt
View file @
d19216a6
...
@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.packet.action
...
@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.packet.action
import
net.mamoe.mirai.message.defaults.MessageChain
import
net.mamoe.mirai.message.defaults.MessageChain
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.utils.lazy
Output
import
net.mamoe.mirai.utils.lazy
Encode
import
java.io.DataInputStream
import
java.io.DataInputStream
/**
/**
...
@@ -29,7 +29,7 @@ class ClientSendFriendMessagePacket(
...
@@ -29,7 +29,7 @@ class ClientSendFriendMessagePacket(
it
.
writeHex
(
"37 0F"
)
it
.
writeHex
(
"37 0F"
)
it
.
writeQQ
(
botQQ
)
it
.
writeQQ
(
botQQ
)
it
.
writeQQ
(
targetQQ
)
it
.
writeQQ
(
targetQQ
)
it
.
write
(
md5
(
lazy
Output
{
md5Key
->
md5Key
.
writeQQ
(
targetQQ
);
md5Key
.
write
(
sessionKey
)
}))
it
.
write
(
md5
(
lazy
Encode
{
md5Key
->
md5Key
.
writeQQ
(
targetQQ
);
md5Key
.
write
(
sessionKey
)
}))
it
.
writeHex
(
"00 0B"
)
it
.
writeHex
(
"00 0B"
)
it
.
writeRandom
(
2
)
it
.
writeRandom
(
2
)
it
.
writeTime
()
it
.
writeTime
()
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/image/
ClientGetGroupImageIDPacket
.kt
→
mirai-core/src/main/java/net/mamoe/mirai/network/packet/image/
UploadGroupImage
.kt
View file @
d19216a6
...
@@ -4,16 +4,19 @@ import net.mamoe.mirai.network.packet.*
...
@@ -4,16 +4,19 @@ import net.mamoe.mirai.network.packet.*
import
net.mamoe.mirai.utils.toByteArray
import
net.mamoe.mirai.utils.toByteArray
import
net.mamoe.mirai.utils.writeUVarInt
import
net.mamoe.mirai.utils.writeUVarInt
import
java.awt.image.BufferedImage
import
java.awt.image.BufferedImage
import
java.io.DataInputStream
/**
/**
* 查询群消息的 image id.
* 请求上传图片. 将发送图片的 md5, size.
* That is, 查询服务器上是否有这个图片, 有就返回 id, 没有就需要上传
* 服务器返回以下之一:
* - 服务器已经存有这个图片 [ServerTryUploadGroupImageFailedPacket]
* - 服务器未存有, 返回一个 key 用于客户端上传 [ServerTryUploadGroupImageSuccessPacket]
*
*
* @author Him188moe
* @author Him188moe
*/
*/
@PacketId
(
"03 88"
)
@PacketId
(
"03 88"
)
@ExperimentalUnsignedTypes
@ExperimentalUnsignedTypes
class
ClientGetGroupImageIDPacket
(
class
Client
Try
GetGroupImageIDPacket
(
private
val
bot
:
Long
,
private
val
bot
:
Long
,
private
val
sessionKey
:
ByteArray
,
private
val
sessionKey
:
ByteArray
,
private
val
group
:
Long
,
private
val
group
:
Long
,
...
@@ -85,6 +88,41 @@ class ClientGetGroupImageIDPacket(
...
@@ -85,6 +88,41 @@ class ClientGetGroupImageIDPacket(
}
}
}
}
abstract
class
ServerTryUploadGroupImageResponsePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
class
Encrypted
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
fun
decrypt
(
sessionKey
:
ByteArray
):
ServerTryUploadGroupImageResponsePacket
{
val
data
=
this
.
decryptAsByteArray
(
sessionKey
)
if
(
data
.
size
==
239
)
{
return
ServerTryUploadGroupImageSuccessPacket
(
data
.
dataInputStream
()).
setId
(
this
.
idHex
)
}
return
ServerTryUploadGroupImageFailedPacket
(
data
.
dataInputStream
())
}
}
}
/**
* 服务器未存有图片, 返回一个 key 用于客户端上传
*/
class
ServerTryUploadGroupImageSuccessPacket
(
input
:
DataInputStream
)
:
ServerTryUploadGroupImageResponsePacket
(
input
)
{
lateinit
var
uKey
:
ByteArray
@ExperimentalUnsignedTypes
override
fun
decode
()
{
uKey
=
this
.
input
.
gotoWhere
(
ubyteArrayOf
(
0
x42u
,
0
x80u
,
0
x01u
)).
readNBytes
(
128
)
}
}
/**
* 服务器已经存有这个图片
*/
class
ServerTryUploadGroupImageFailedPacket
(
input
:
DataInputStream
)
:
ServerTryUploadGroupImageResponsePacket
(
input
)
{
override
fun
decode
()
{
}
}
fun
main
()
{
fun
main
()
{
println
(
0
xff
)
println
(
0
xff
)
...
...
mirai-core/src/main/java/net/mamoe/mirai/utils/ImageNetworkUtils.java
View file @
d19216a6
package
net.mamoe.mirai.utils
;
package
net.mamoe.mirai.utils
;
import
org.apache.commons.httpclient.util.HttpURLConnection
;
import
org.apache.commons.httpclient.util.HttpURLConnection
;
import
org.jsoup.Connection
;
import
org.jsoup.Jsoup
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.net.URL
;
import
java.net.URL
;
/**
* @author NaturalHG
*/
public
class
ImageNetworkUtils
{
public
class
ImageNetworkUtils
{
public
static
void
postImage
(
String
u
key
,
int
fileSize
,
String
g_uin
,
String
groupCode
,
byte
[]
img
)
{
public
static
void
postImage
(
String
u
KeyHex
,
int
fileSize
,
String
qqNumber
,
String
groupCode
,
byte
[]
img
)
throws
IOException
{
//http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc&ukey=” + 删全部空 (ukey) + “&filesize=” + 到文本 (fileSize) + “&range=0&uin=” + g_uin + “&groupcode=” + Group
//http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc&ukey=” + 删全部空 (ukey) + “&filesize=” + 到文本 (fileSize) + “&range=0&uin=” + g_uin + “&groupcode=” + Group
StringBuilder
builder
=
new
StringBuilder
(
"http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc"
);
StringBuilder
builder
=
new
StringBuilder
(
"http://htdata2.qq.com/cgi-bin/httpconn?htcmd=0x6ff0071&ver=5515&term=pc"
);
builder
.
append
(
"&ukey="
)
builder
.
append
(
"&ukey="
)
.
append
(
u
key
.
trim
())
.
append
(
u
KeyHex
.
trim
())
.
append
(
"&filezise="
).
append
(
fileSize
)
.
append
(
"&filezise="
).
append
(
fileSize
)
.
append
(
"&range="
).
append
(
"0"
)
.
append
(
"&range="
).
append
(
"0"
)
.
append
(
"&uin="
).
append
(
g_uin
)
.
append
(
"&uin="
).
append
(
qqNumber
)
.
append
(
"&groupcode="
).
append
(
groupCode
);
.
append
(
"&groupcode="
).
append
(
groupCode
);
try
{
HttpURLConnection
conn
=
(
HttpURLConnection
)
new
URL
(
builder
.
toString
()).
openConnection
();
HttpURLConnection
conn
=
(
HttpURLConnection
)
new
URL
(
builder
.
toString
()).
openConnection
();
conn
.
setRequestProperty
(
"User-agent"
,
"QQClient"
);
conn
.
setRequestProperty
(
"User-agent"
,
"QQClient"
);
conn
.
setRequestProperty
(
"Content-length"
,
""
+
fileSize
);
conn
.
setRequestProperty
(
"Content-length"
,
""
+
fileSize
);
conn
.
setRequestMethod
(
"POST"
);
conn
.
setRequestMethod
(
"POST"
);
conn
.
getOutputStream
().
write
(
img
);
conn
.
getOutputStream
().
write
(
img
);
conn
.
connect
();
conn
.
connect
();
System
.
out
.
println
(
conn
.
getResponseCode
());
System
.
out
.
println
(
conn
.
getResponseCode
());
System
.
out
.
println
(
conn
.
getResponseMessage
());
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment