mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-03-01 00:35:36 +08:00
优化架构
This commit is contained in:
1 parent
3efed3defe
commit
43403202b5
6760 files changed
+33748
-554768
No files matched your search
@@ -0,0 +1,14 @@
|
||||
http_port = 8080
|
||||
|
||||
[hk4e]
|
||||
kcp_addr = "hk4e.flswld.com"
|
||||
kcp_port = 22103
|
||||
login_sdk_url = "https://api.flswld.com/api/v1/auth/login"
|
||||
|
||||
[logger]
|
||||
level = "DEBUG"
|
||||
method = "CONSOLE"
|
||||
track_line = true
|
||||
|
||||
[database]
|
||||
url = "mongodb://mongo:27017"
|
||||
@@ -0,0 +1,42 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"hk4e/common/config"
|
||||
"hk4e/dispatch/controller"
|
||||
"hk4e/dispatch/dao"
|
||||
"hk4e/logger"
|
||||
_ "net/http/pprof"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
filePath := "./application.toml"
|
||||
config.InitConfig(filePath)
|
||||
|
||||
logger.InitLogger("dispatch")
|
||||
logger.LOG.Info("dispatch start")
|
||||
|
||||
db := dao.NewDao()
|
||||
|
||||
_ = controller.NewController(db)
|
||||
|
||||
c := make(chan os.Signal, 1)
|
||||
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
|
||||
for {
|
||||
s := <-c
|
||||
logger.LOG.Info("get a signal %s", s.String())
|
||||
switch s {
|
||||
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
|
||||
logger.LOG.Info("dispatch exit")
|
||||
db.CloseDao()
|
||||
time.Sleep(time.Second)
|
||||
return
|
||||
case syscall.SIGHUP:
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
* binary
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 81 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 81 KiB |
@@ -0,0 +1,15 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDHPnAvEbJfMUwHXmRLiNDH1qFeGm0U/D6n7BjzEmJl5VtMKBZF
|
||||
hnz+aKsyMo9aAowi2Fe/6iWUuzcbnAJS+4iLUxaeqOdvPe5LuR3wQxHKGJ8XsDkH
|
||||
kt3T1operE1rpw9wX3xuUi0CA5aHqpC0ho0zMsk7nvxWQogv1G8uqcXmfQIDAQAB
|
||||
AoGBALElFmEC/vAbyFkU119A+T9z2GzuWeW6j4qFI3mZ8tpdnVqMmaCe/irDrNIo
|
||||
mcORWD7y0rHS4C7odQqbHoXhFXgXfrGJXcMu977uIxBKGj0UBz6YIciznk/8DrMo
|
||||
o3q6+SGsNj5zvlU8oY6cpfC663VoQb7VWveUGN4zshdnvyiRAkEA8nlq/LEuQPCj
|
||||
lp5wbUizJ3Uwll5N51N6Kzm1wRQ0vUtIzRK940lGMxlhihnJfifTColAnnzmWj/X
|
||||
dWIULqIc0wJBANJbrnq1iim9Jue0UOhQn6hV8vvWHgLjK7zuEsUPDqzxfhmpmBEh
|
||||
BwAaH3li6bGCbIfSJazs+LmNLB4YtMo6nW8CQAMtmjxjqiKJxOslen3ENSzwOUnP
|
||||
RKAilPhaEkrMlABjKzoc48ZF4Jis3X1s5xozNW3u7JznMDHAondUaMVPtKcCQG45
|
||||
9lp8aBJo+ErvlHm3TYHiz7kgwIcYzKFqStGRi0oaHM6LrJBFMyrdhWKQ7w3B3ubo
|
||||
ui872TU5gUWgApP5VOcCQQDDvU76TpLQ2v2LO8D0L/Ds+t6HdGcPpKvlAm/YQYHL
|
||||
X6Q435tFNbeWo3JzpGElb25zAQfXU5cvzYvg37f36iM6
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@@ -0,0 +1,5 @@
|
||||
{"remoteName": "blocks/00/22551915.blk", "md5": "0cf3d6b599d443c7cfa4a3e6189a7757", "fileSize": 3184}
|
||||
{"remoteName": "blocks/00/25060239.blk", "md5": "f3cf18d697e3380b2f833ccf2c7d4194", "fileSize": 3328}
|
||||
{"remoteName": "blocks/00/29342328.blk", "md5": "3b8e2c23e33ce92f68e40196c574ae94", "fileSize": 14103}
|
||||
{"remoteName": "blocks/00/32070509.blk", "md5": "4bf2a81d7565301269d1c90e14393045", "fileSize": 698}
|
||||
{"remoteName": "blocks/00/33067900.blk", "md5": "0b4d781c1633537d2fa4b4f0f567d2ca", "fileSize": 454}
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
GpkdCg00Ny4yNTMuNDMuMTA2ENasARoraHR0cHM6Ly9vc3VzYW9hc2VydmVyLnl1YW5zaGVuLmNvbS9yZWNoYXJnZToDVVNBQjlodHRwczovL2F1dG9wYXRjaGhrLnl1YW5zaGVuLmNvbS9jbGllbnRfZ2FtZV9yZXMvMi42X2xpdmVKPGh0dHBzOi8vYXV0b3BhdGNoaGsueXVhbnNoZW4uY29tL2NsaWVudF9kZXNpZ25fZGF0YS8yLjZfbGl2ZVKSAWh0dHBzOi8vd2Vic3RhdGljLXNlYS5ob3lvdmVyc2UuY29tL3lzL2V2ZW50L2ltLXNlcnZpY2UvaW5kZXguaHRtbD9pbV9vdXQ9ZmFsc2Umc2lnbl90eXBlPTImYXV0aF9hcHBpZD1pbV9jY3MmYXV0aGtleV92ZXI9MSZ3aW5fZGlyZWN0aW9uPXBvcnRyYWl0YggyLjZfbGl2ZXDZ7JoDkAGJxKoDmgFceyJyZW1vdGVOYW1lIjogImRhdGFfdmVyc2lvbnMiLCAibWQ1IjogIjFhNDQ1YWU0OGZiZGJlMDM4MzEyYmU4NjhmMjgxM2QyIiwgImZpbGVTaXplIjogNDQxNX2iAVt7InJlbW90ZU5hbWUiOiAiZGF0YV92ZXJzaW9ucyIsICJtZDUiOiAiZjY0NmZlY2FjMTA3ZDNlN2ZiNDdjOTA4OTIwMmQzZmYiLCAiZmlsZVNpemUiOiA1MTR9sgGBBgi9t5kDGuAFeyJyZW1vdGVOYW1lIjogInJlc192ZXJzaW9uc19leHRlcm5hbCIsICJtZDUiOiAiOWYwOTJjYTEzMDY3Y2FlNDMxMzQ5M2VlZDNkM2U5YWUiLCAiZmlsZVNpemUiOiA1MjY5NjZ9DQp7InJlbW90ZU5hbWUiOiAicmVzX3ZlcnNpb25zX21lZGl1bSIsICJtZDUiOiAiN2M5NDJlNzA0YTgwNGMyMTIyZmM2M2VlOTI4ZTcxNDgiLCAiZmlsZVNpemUiOiAyODU1NTB9DQp7InJlbW90ZU5hbWUiOiAicmVzX3ZlcnNpb25zX3N0cmVhbWluZyIsICJtZDUiOiAiZTM1ZjZkODUzZDA0Y2UwMjJhYzdjMzZkNDNmNDBlN2MiLCAiZmlsZVNpemUiOiAxMjIwMzZ9DQp7InJlbW90ZU5hbWUiOiAicmVsZWFzZV9y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 truncated
|
||||
@@ -0,0 +1 @@
|
||||
GpgdCgo4LjIwOS42Ni4xENWsARosaHR0cHM6Ly9vc2V1cm9vYXNlcnZlci55dWFuc2hlbi5jb20vcmVjaGFyZ2U6BGV1cm9COWh0dHBzOi8vYXV0b3BhdGNoaGsueXVhbnNoZW4uY29tL2NsaWVudF9nYW1lX3Jlcy8yLjZfbGl2ZUo8aHR0cHM6Ly9hdXRvcGF0Y2hoay55dWFuc2hlbi5jb20vY2xpZW50X2Rlc2lnbl9kYXRhLzIuNl9saXZlUpIBaHR0cHM6Ly93ZWJzdGF0aWMtc2VhLmhveW92ZXJzZS5jb20veXMvZXZlbnQvaW0tc2VydmljZS9pbmRleC5odG1sP2ltX291dD1mYWxzZSZzaWduX3R5cGU9MiZhdXRoX2FwcGlkPWltX2NjcyZhdXRoa2V5X3Zlcj0xJndpbl9kaXJlY3Rpb249cG9ydHJhaXRiCDIuNl9saXZlcNnsmgOQAdnsmgOaAVx7InJlbW90ZU5hbWUiOiAiZGF0YV92ZXJzaW9ucyIsICJtZDUiOiAiMWE0NDVhZTQ4ZmJkYmUwMzgzMTJiZTg2OGYyODEzZDIiLCAiZmlsZVNpemUiOiA0NDE1faIBW3sicmVtb3RlTmFtZSI6ICJkYXRhX3ZlcnNpb25zIiwgIm1kNSI6ICIxNzU0MmM3YmJhYzQ5YjkxMWRlMjlhOTYyNzU0YmQ2MSIsICJmaWxlU2l6ZSI6IDUxNH2yAYEGCL23mQMa4AV7InJlbW90ZU5hbWUiOiAicmVzX3ZlcnNpb25zX2V4dGVybmFsIiwgIm1kNSI6ICI5ZjA5MmNhMTMwNjdjYWU0MzEzNDkzZWVkM2QzZTlhZSIsICJmaWxlU2l6ZSI6IDUyNjk2Nn0NCnsicmVtb3RlTmFtZSI6ICJyZXNfdmVyc2lvbnNfbWVkaXVtIiwgIm1kNSI6ICI3Yzk0MmU3MDRhODA0YzIxMjJmYzYzZWU5MjhlNzE0OCIsICJmaWxlU2l6ZSI6IDI4NTU1MH0NCnsicmVtb3RlTmFtZSI6ICJyZXNfdmVyc2lvbnNfc3RyZWFtaW5nIiwgIm1kNSI6ICJlMzVmNmQ4NTNkMDRjZTAyMmFjN2MzNmQ0M2Y0MGU3YyIsICJmaWxlU2l6ZSI6IDEyMjAzNn0NCnsicmVtb3RlTmFtZSI6ICJyZWxlYXNlX3Jl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 truncated
|
||||
@@ -0,0 +1 @@
|
||||
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
|
||||
@@ -0,0 +1 @@
|
||||
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
|
||||
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEAz/fyfozlDIDWG9e3Lb29+7j3c66wvUJBaBWP10rB9HTE6prj
|
||||
fcGMqC9imr6zAdD9q+Gr1j7egvqgi3Da+VBAMFH92/5wD5PsD7dX8Z2f4o65Vk2n
|
||||
VOY8Dl75Z/uRhg0Euwnfrved69z9LG6utmlyv6YUPAflXh/JFw7Dq6c4EGeR+Kej
|
||||
FTwmVhEdzPGHjXhFmsVt9HdXRYSf4NxHPzOwj8tiSaOQA0jC4E4mM7rvGSH5GX6h
|
||||
ma+7pJnl/5+rEVM0mSQvm0m1XefmuFy040bEZ/6O7ZenOGBsvvwuG3TT4FNDNzW8
|
||||
Dw9ExH1l6NoRGaVkDdtrl/nFu5+a09Pm/E0ElwIDAQABAoIBAQCtH17Cck+KJQYX
|
||||
j29xqG4qykNUDawbILiKCMkBE7553Wq/UcjmuuR4bVnML8ucS3mgR/BgHV3l8vUK
|
||||
nxvqRx/oGZkWNazbiuwL+ThAblLWqrEmYuZVCoQcAnvkT8tIqDWz7fhDEuZnnkMz
|
||||
ZcATIZzgZUSa5IfP3u3rP+MrVbyaCdzJEeI0Yrv1XT+M5ddkKQrYgqC5kRiYi/Lj
|
||||
NcLJhqSVt8p37CdJx1PGHFjKKb4MZpANlNRgeTtWpGVfS0PJLzaiI1NyPSJv7xWZ
|
||||
gVhbK9+wQxqSG6KmZ4vpEvRI1zKiov5BsAFN+GfuD5mpn1Xo9CpzTfj/sO13VpHH
|
||||
+Mt80+yBAoGBAPYXVEcXug5zqkqXup4dp1S05saz1zWPhUhQm+CrbhgeTqpjngJJ
|
||||
EB79qMrGmyki0P/cGtbTcrHf8+i7gDlIGW0OMb4/jn4f5ACVD00iyvkHSGPn0Aim
|
||||
MoNOMbkGot7SkSnncwxXdawwDyTu2dofXuBr72+GYqgRAG52IuA0C0pRAoGBANhX
|
||||
p/UyW/htB27frKch/rTKQKm12kBV20AkkRUQUibiiQyWueWKs+5bVaW5R5oDIhWx
|
||||
qftJtnEFWUvWaTHpHsB/bpjS3CJ6WknqNbpa3QIScpV1uw8V+Etz/K2/ftjyZzFo
|
||||
nqc+Jud5364xFdIlOsRj9gZnK83Wcui6EFxAer5nAoGBAJzTzzSjLUHqejqhKR98
|
||||
nFeCFZPJpjuO5AxqunvaJAYgwlcZtueT8j8dvgTDvrvfYTu85CnFhNFQfFrzqspW
|
||||
ZUW3hwHL9R3xatboJ2Er7Bf5iSuJ3my0pXpCSbO1Q/QmUrZWtl3GGsqJsg0CXjkA
|
||||
RvFUN7ll9ddPRmwewykIYa2RAoGAcmKuWFNfE1O6WWIELH4p6LcDR3fyRI/gk+KB
|
||||
nyx48zxVkAVllrsmdYFvIGd9Ny4u6F9+a3HG960HULS1/ACxFMCL3lumrsgYUvp1
|
||||
m+mM7xqH4QRVeh14oZRa5hbY36YS76nMMMsI0Ny8aqJjUjADCXF81FfabkPTj79J
|
||||
BS3GeEMCgYAXmFIT079QokHjJrWz/UaoEUbrNkXB/8vKiA4ZGSzMtl3jUPQdXrVf
|
||||
e0ofeKiqCQs4f4S0dYEjCv7/OIijV5L24mj/Z1Q4q++S5OksKLPPAd3gX4AYbRcg
|
||||
PS4rUKl1oDk/eYN0CNYC/DYV9sAv65lX8b35HYhvXISVYtwwQu/+Yg==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEA02M1I1V/YvxANOvLFX8R7D8At40IlT7HDWpAW3t+tAgQ7sqj
|
||||
CeYOxiXqOaaw2kJhM3HT5nZll48UmykVq45Q05J57nhdSsGXLJshtLcTg9liMEoW
|
||||
61BjVZi9EPPRSnE05tBJc57iqZw+aEcaSU0awfzBc8IkRd6+pJ5iIgEVfuTluani
|
||||
zhHWvRli3EkAF4VNhaTfP3EkYfr4NE899aUeScbbdLFI6u1XQudlJCPTxaISx5Zc
|
||||
wM+nP3v242ABcjgUcfCbz0AY547WazK4bWP3qicyxo4MoLOoe9WBq6EuG4CuZQrz
|
||||
Knq8ltSxud/6chdg8Mqp/IasEQ2TpvY78tEXDQIDAQABAoIBAQC4uPsYk4AsSe75
|
||||
0Au6Dz7kSfIgdDhJ44AisvTmfLauMFZLtfxfjBDhCwTxuD7XnCZAxHm97Ty+AqSp
|
||||
Km/raQQsvtWalMhBqYanzjDYMRv2niJ1vGjm3WrQxBaEF+yOtvrZsK5fQTslqInI
|
||||
qknIQH7fgjazJ7Z28D18sYNj37qfFWSSymgFo+SoS/BKEr200lpRA/oaGXiHcyIO
|
||||
jJidP6b7UGes7uhMXUvLrfozmCsSqslxXO5Uk5XN/fWl4LxCGX7mpNfPZIT5YBSj
|
||||
HliFkNlxIjyJg8ORLGi82M2cuyxp39r93F6uaCjLtb+rdwlGur7npgXUkKfWQJf9
|
||||
WE7uar6BAoGBAPXIuIuYFFUhqNz5CKU014jZu6Ql0z5ZA08V84cTJcfLIK4e2rqC
|
||||
8DFTldA0FtVfOGt0V08H/x2pRChGOvUwGG5nn9Dqqh6BjByUrW4z2hnXzT3ZuSDh
|
||||
6eapiCB1jl9meJ0snhF2Ps/hqWGL2b3SkCCe90qVTzOVOeLO6YUCIOq9AoGBANws
|
||||
fQkAq/0xw8neRGNTrnXimvbS+VXPIF38widljubNN7DY5cIFTQJrnTBWKbuz/t9a
|
||||
J8QX6TFL0ci/9vhPJoThfL12vL2kWGYgWkWRPmqaBW3yz7Hs5rt+xuH3/7A5w5vm
|
||||
kEg1NZJgnsJ0rMUTu1Q6PM5CBg6OpyHY4ThBb8qRAoGAML8ciuMgtTm1yg3CPzHZ
|
||||
xZSZeJbf7K+uzlKmOBX+GkAZPS91ZiRuCvpu7hpGpQ77m6Q5ZL1LRdC6adpz+wkM
|
||||
72ix87d3AhHjfg+mzgKOsS1x0WCLLRBhWZQqIXXvRNCH/3RH7WKsVoKFG4mnJ9TJ
|
||||
LQ8aMLqoOKzSDD/JZM3lRWkCgYA8hn5Y2zZshCGufMuQApETFxhCgfzI+geLztAQ
|
||||
xHpkOEX296kxjQN+htbPUuBmGTUXcVE9NtWEF7Oz3BGocRnFrbb83odEGsmySXKH
|
||||
bUYbR/v2Ham638UOBevmcqZ3a2m6kcdYEkiH1MfP7QMRqjr1DI1qpfvERLLtOxGu
|
||||
xU5WAQKBgQCaVavyY6Slj3ZRQ7iKk9fHkge/bFl+zhANxRfWVOYMC8mD2gHDsq9C
|
||||
IdCp1Mg0tJpWLaGgyDM1kgChZYsff4jRxHC4czvAtoPSlxWXF2nL31qJ3vk2Zzzc
|
||||
a4GSHAInodXBrKstav5SIKosWKT2YysxgHlA9Sm2f4n09GjFbslEHg==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEAyaxqjPJP5+Innfv5IdfQqY/ftS++lnDRe3EczNkIjESWXhHS
|
||||
OljEw9b9C+/BtF+fO9QZL7Z742y06eIdvsMPQKdGflB26+9OZ8AF4SpXDn3aVWGr
|
||||
8+9qpB7BELRZI/Ph2FlFL4cobCzMHunncW8zTfMId48+fgHkAzCjRl5rC6XT0Yge
|
||||
6+eKpXmF+hr0vGYWiTzqPzTABl44WZo3rw0yurZTzkrmRE4kR2VzkjY/rBnQAbFK
|
||||
KFUKsUozjCXvSag4l461wDkhmmyivpNkK5cAxuDbsmC39iqagMt9438fajLVvYOv
|
||||
pVs9ci5tiLcbBtfB4Rf/QVAkqtTm86Z0O3e7DwIDAQABAoIBAQCyma226vTW35LE
|
||||
N5zXWuAg+hhcxk6bvofWMUMXKvGF/0vHPTMXlvuSkDeDNa4vBivneRthBNPMgb3q
|
||||
DuTWxrogQMOOI8ZdhY3DFexfDvcQD2anDJuSqSmg9Nd36q+yxk3xIoXB5Ilo23dd
|
||||
vTnJXHhsBNovv7zRLO134cAHFqDoKzt5EEHre0skUcn6HjHOek6c53jvpKr5LSrr
|
||||
iwx5gMuY/7ZSIUDo9WGY70qbQFGY6bOlX9x8uNjcFF+7SztEVQ+vhJ/+7EvwqaJr
|
||||
ysweo0l91TKM9WaMuwoucKeceVWuynEw6GGTw8UTLtltekLGe6bS8YxY8fVwnKkT
|
||||
RwJYwAJRAoGBAP2rhcfOA+1Ja37hUHKebfp9rHsex4+pGyt3Kdu7WdqOn4sexmya
|
||||
BuiHQcUchPDVla/ruQZ20+8LHgzBDo0m8sY7gpf715UV9NSVIRD0wu26SKRklOFz
|
||||
J4HBOwU9hBGLSnRUJzyvVlt5O7E9hAv61SCrvWBEcow2YnKNQLwvjMVJAoGBAMuG
|
||||
oSb3A/ulqtp2zpxVAclYe/bSItZZTOUWP6Vb4hOiHxIJ0n1H9ap6grOYkJ/Yn4gg
|
||||
yYzKm/noF1wXP7Rj/xOahnvMkzhGdmOabvE9LH5HwQTWxBBWTkZzgBbYtbg+J5MT
|
||||
cKqJaychSRjJj+xX+d90rtlSu/c27chlSRKAHXWXAoGAFTcIHDq9l1XBmL3tRXi8
|
||||
h+uExlM/q2MgM5VmucrEbAPrke4D+Ec1drMBLCQDdkTWnPzg34qGlQJgA/8NYX61
|
||||
ZSDK/j0AvaY1cKX8OvfNaaZftuf2j5ha4H4xmnGXnwQAORRkp62eUk4kUOFtLrdO
|
||||
pcnXL7rpvZI6z4vCszpi0okCgYEAp3lZEl8g/+oK9UneKfYpSi1tlGTGFevVwozU
|
||||
QpWhKta1CnraogycsnOtKWvZVi9C1xljwF7YioPY9QaMfTvroY3+K9DjM+OHd96U
|
||||
fB4Chsc0pW60V10te/t+403f+oPqvLO6ehop+kEBjUwPCkQ6cQ3q8xmJYpvofoYZ
|
||||
4wdZNnECgYBwG8Vrv7Z+kX9Zuh1FvcRoY57bYLU0cWW92SA3Nvi8pZOIEaLHrQyZ
|
||||
pvvaLIicR1m9+KsOAmii7ru0zL7KsrGW+5migQsaDi4gzahKQpad/R7MLKi/L53r
|
||||
Ymo0aZKARLHW82GbomQ0zxdRoo9vaqfGNpXkxyyt3k3GGDunmrskYw==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEAsJbFp3WcsiojjdQtVnTuvtawL2m4XxK93F6lCnFwcZqUP39t
|
||||
xFGGlrogHMqreyawIUN7E5shtwGzigzjW8Ly5CryBJpXP3ehNTqJS7emb+9LlC19
|
||||
Oxa1eQuUQnatgcsd16DPH7kJ5JzN3vXnhvUyk4Qficdmm0uk7FRaNYFi7EJs4xyq
|
||||
FTrp3rDZ0dzBHumlIeK1om7FNt6Nyivgp+UybO7kl0NLFEeSlV4S+7ofitWQsO5x
|
||||
YqKAzSzz+KIRQcxJidGBlZ1JN/g5DPDpx/ztvOWYUlM7TYk6xN3focZpU0kBzAw/
|
||||
rn94yW9z8jpXfzk+MvWzVL/HAcPy4ySwkay0NwIDAQABAoIBADzKWpawbVYEHaM4
|
||||
lLb7oCjAPXzE9zx7djLDvisfLCdfoINPedkoe52ty1o+BtRpWB7LXTY9pFic1FLE
|
||||
5wvyy6zyf8hH3ZsysqNhWFxhh4FnLmx/UGokAir+anaK5mYVJ1vQtxzjlV1HAbQs
|
||||
kRyrklKoHDdRFqiFXOwiib97oDNWhD+RxfyGwwJnynZZSXdLbLSiz/QHQNr/+Ufk
|
||||
KRBaxt0CfU7mOLZxoy6fNAxHdBcBJPHCyh+aDvEbix7nSncSU8Ju/48YJ8DrglbZ
|
||||
sXCYoA5Uz8NMDuaEMgoNWCFQVoEcRkEUoaH7BlWd3UUFRPnDZ1B4BmkrVoRE8a58
|
||||
3OqSwakCgYEA19wQUISXtpnmCrEZfbyZ6IwOy8ZCVaVUtbTjVa8UyfNglzzJG3yz
|
||||
cXU3X35v5/HNCHaXbG2qcbQLThnHBA+obW3RDo+Q49V84Zh1fUNH0ONHHuC09kB/
|
||||
/gHqzn/4nLf1aJ2O0NrMyrZNsZ0ZKUKQuVCqWjBOmTNUitcc8RpXZ8sCgYEA0W09
|
||||
POM/It7RoVGI+cfbbgSRmzFo9kzSp5lP7iZ81bnvUMabu2nv3OeGc3Pmdh1ZJFRw
|
||||
6iDM6VVbG0uz8g+f8+JT32XdqM7MJAmgfcYfTVBMiVnh330WNkeRrGWqQzB2f2Wr
|
||||
+0vJjU8CAAcOWDh0oNguJ1l1TSyKxqdL8FsA38UCgYEAudt1AJ7psgOYmqQZ+rUl
|
||||
H6FYLAQsoWmVIk75XpE9KRUwmYdw8QXRy2LNpp9K4z7C9wKFJorWMsh+42Q2gzyo
|
||||
HHBtjEf4zPLIb8XBg3UmpKjMV73Kkiy/B4nHDr4I5YdO+iCPEy0RH4kQJFnLjEcQ
|
||||
LT9TLgxh4G7d4B2PgdjYYTkCgYEArdgiV2LETCvulBzcuYufqOn9/He9i4cl7p4j
|
||||
bathQQFBmSnkqGQ+Cn/eagQxsKaYEsJNoOxtbNu/7x6eVzeFLawYt38Vy0UuzFN5
|
||||
eC54WXNotTN5fk2VnKU4VYVnGrMmCobZhpbYzoZhQKiazby/g60wUtW9u7xXzqOd
|
||||
M/428YkCgYBwbEOx1RboH8H+fP1CAiF+cqtq4Jrz9IRWPOgcDpt2Usk1rDweWrZx
|
||||
bTRlwIaVc5csIEE2X02fut/TTXr1MoXHa6s2cQrnZYq44488NsO4TAC26hqs/x/H
|
||||
bVOcX13gT26SYngAHHeh7xjWJr/KgIIwvcvgvoVs6lu7a8aLUvrOag==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEAxbbx2m1feHyrQ7jP+8mtDF/pyYLrJWKWAdEv3wZrOtjOZzeL
|
||||
GPzsmkcgncgoRhX4dT+1itSMR9j9m0/OwsH2UoF6U32LxCOQWQD1AMgIZjAkJeJv
|
||||
FTrtn8fMQ1701CkbaLTVIjRMlTw8kNXvNA/A9UatoiDmi4TFG6mrxTKZpIcTInvP
|
||||
EpkK2A7Qsp1E4skFK8jmysy7uRhMaYHtPTsBvxP0zn3lhKB3W+HTqpneewXWHjCD
|
||||
fL7Nbby91jbz5EKPZXWLuhXIvR1Cu4tiruorwXJxmXaP1HQZonytECNU/UOzP6GN
|
||||
Ldq0eFDE4b04Wjp396551G99YiFP2nqHVJ5OMQIDAQABAoIBAQDEeYZhjyq+avUu
|
||||
eSuFhOaIU4/ZhlXycsOqzpwJvzEz61tBSvrZPA5LSb9pzAvpic+7hDH94jX89+8d
|
||||
NfO7qlADsVNEQJBxuv2o1MCjpCRkmBZz506IBGU60Kt1j5kwdCEergTW1q375z4w
|
||||
l8f7LmSL2U6WvKcdojTVxohBkIUJ7shtmmukDi2YnMfe6T/2JuXDDL8rvIcnfr5E
|
||||
MCgPQs+xLeLEGrIJdpUy1iIYZYrzvrpJwf9EJL3D0e7jkpbvAQZ8EF9YhEizJhOm
|
||||
dzTqW4PgW2yUaHYd3q5QjiILy7AC+oOYoTZln3RfjPOxl+bYjeMOWlqkgtpPQkAE
|
||||
4I64w8RZAoGBAPLR44pEkmTdfIIF8ZtzBiVfDZ29bT96J0CWXGVzp8x6bSu5J5jl
|
||||
s7sP8DEcjGZ6vHsLGOvkcNxzcnR3l/5HOz6TIuvVuUm36b1jHltq1xZStjGeKZs1
|
||||
ihhJSu2lIA+TrK8FCRnKARJ0ughXGNZFItgeM230Sgjp2RL4ISXJ724XAoGBANBy
|
||||
S2RwNpUYvkCSZHSFnQM/jq1jldxw+0p4jAGpWLilEaA/8xWUnZrnCrPFF/t9llpb
|
||||
dTR/dCI8ntIMAy2dH4IUHyYKUahyHSzCAUNKpS0s433kn5hy9tGvn7jyuOJ4dk9F
|
||||
o1PIZM7qfzmkdCBbX3NF2TGpzOvbYGJHHC3ssVr3AoGBANHJDopN9iDYzpJTaktA
|
||||
VEYDWnM2zmUyNylw/sDT7FwYRaup2xEZG2/5NC5qGM8NKTww+UYMZom/4FnJXXLd
|
||||
vcyxOFGCpAORtoreUMLwioWJzkkN+apT1kxnPioVKJ7smhvYAOXcBZMZcAR2o0m0
|
||||
D4eiiBJuJWyQBPCDmbfZQFffAoGBAKpcr4ewOrwS0/O8cgPV7CTqfjbyDFp1sLwF
|
||||
2A/Hk66dotFBUvBRXZpruJCCxn4R/59r3lgAzy7oMrnjfXl7UHQk8+xIRMMSOQwK
|
||||
p7OSv3szk96hy1pyo41vJ3CmWDsoTzGs7bcdMl72wvKemRaU92ckMEZpzAT8cEMC
|
||||
cWKLb8yzAoGAMibG8IyHSo7CJz82+7UHm98jNOlg6s73CEjp0W/+FL45Ka7MF/lp
|
||||
xtR3eSmxltvwvjQoti3V4Qboqtc2IPCt+EtapTM7Wo41wlLCWCNx4u25pZPH/c8g
|
||||
1yQ+OvH+xOYG+SeO98Phw/8d3IRfR83aqisQHv5upo2Rozzo0Kh3OsE=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
��lt1L ��ܟ�.�\�pXP��"ƀ(�a���
|
||||
@@ -0,0 +1 @@
|
||||
OPrCJaJsJJJXI3$DQNduVQuB5s5jgf47mmABUJFZoKJUt5YcIt0wPCBcCCpuQ4dQz19rae5FeHYRpmb8WsjkIeEpAQi3uJlIgObMsL$Fmv1kPav7dDPBWKJuyFEOa2KpN1EGvWlJOqufR64SDYhIocM3HLT5VsLo$Bde3c2jsVPwygAGGcZU1rZCTaOo$2blfEMdpviC75gNDZzdGjAiOBahjs$!9fZKtNF2iI4UnGSE2aNXlIz9To8L9fSeA9mhJ2F0qTKa8UjxHiSurW0bSzloUUN83sT9UFBNz$c2IVIP!asMffifiTVmlb0MJ6jYUB!rMSR77SVmdNDlMRz1VnjR9xEENS1DnqUQSYq2JJAQJIZL6j4ABF!Dm5NisAf58vaRhY4Uz6zXEf$IZExmbToDsb49X6ATh7zZExCeddR8iDBFpdOAiveE0bO8pOgo!zYmt0$5sN8aJpDK10XbXkm21$Lvppj8gAV9SjUjT5j9luqok!PkTQS59zG1I$JSDzs1jkoaNTiO2LL0rJSHaTX2EMI4KUiMp1Tgpqsy$lSv89CVFg5AzODZX8TA5ne4lHT0aazfxQa354RHYRGe5OllgcuZVn88gWjmD3nUHtzhCpK0siGWqPvOlPX!OYUaJIFwaSy7v!K5Q2nX8qCjGAHeu1$hs0cdmn69r1pws0APbZ7BNm018poX7YxjiOBRV0tEKRcJbkKxad$t5dJIO9eJhKvk0l9xz8KjOF9u2NHhy5yQrHZWenJYDAIrmheIz2Q!vO7EePv2U6ACm5OJS8dDyWBMkFNuSoW4zv3RTIfdKw$!hd2bmSFQFic6jFNPeag53tpBPCiy3lNgIT0hgytmV9CBwZl!S$GzYOxv0buJ2P2Vvfah!bg4$nfAHKoHer4zTcYN4w3eSIBAOCKJW7uJ5Sk1uOcxVwBklzbN6l7m3Yhcyw44y76P7q$zeK4NuEpaK7izZTqVhhXL1piyu5A$lqWlkxCDbq0H3haa79hX0npzRphBlt7syl3UM2MNJS7ZgYYk76kNZSO!ZRaBz19phzewChIaE2Seub1h0U3JJI7PH1a5Ej6ozVaFUCSGvULtLeQeq!drnnvnqCfK4UZmbNYrHUPBMif2ttgHygUxSRQpMHx$tstSzESKn6XuQo4k!Fuiq5Du1ClQtPE$fgyYuzl4SDkw0RJYBY5dl227vyhKQzyxrSQQUQsKy08xM2LRZUymBp$oDiWBF4ZJv8iE5fDMuwbTRSfPX45uBKiDYSYcOXukcDeYYXturEpUD4VaC0RYF5KVBos1kTT2sQFq$cbkN9jiwmhBC7Yea6LEw64GOq67dlf$yvJmw5L8Sxb!Yd2u$PX2cQh4d19LpvkLTaqhofHmYP9agwBwxLQ4z4z93gkPmgKdGir40bV$nbDNcve6juK4Ct6R$Xid6nkdWM$9RWvQE7m7S7Rf5X8dWEHn86g6cLfi4saH5jOi1abRRYlBixuz3yiRQy!IOOvoH0RVqpamMy03xqGUscyuxjrTYhT1AMBmDaj$l9qgIMN3sS5EONMxMEFXvTo1!3vNCRhuahOt5bsN7WyLpiQiKb76onr8!j9l1QDwNm74OIXSQ2T1OgQeppxh3B5vkx4c8$t8$GfBCq4Q!dDZWu!PNdbRk2sWgGnD$OVXHJgvQZPkJPdQJSm7p85tlx3sh7vCDVBauxtbHz$iXqS5HIj8PX!ZmG20iYl5$H$ZA1e$nYfeD$rafvfJDYmKH9sgLPtP2N5LqNI6SIzrihs7U0ST7iTDzJrw9tMGLFrmtEZ!G8mlzMRBLUsTMFyTa5!r043dtVxSsNdcor2xkUhvJVjjnfuyNNmbd5GoxUxhoyqb0Xx5RuwGFevo!PEZ$FHiNjLzds0LXH20$6QXhWa2k9e4VOO6Far4iutjtXFf!qMQCpeBH2TcpGbbjjziBj$pKzCYhbLnUYL8lBN6sP381fn8MgT2M4WKAXm!N83VRULxtxx7spdeQKvM5Fx6CcMThAZXDOtcoqXMWXOaXt9sY6xSsnbq4ZvrPi8s4v17p95iCpNoJY2KZP4qiWgfcxir1iOYmWIU9$DCSb3jmJz6QzCVCdvy3XKLjropmAce89vi9U4W9v7abEwdKD1!4zdUBMlhRSLo3AX4uLpdDbc7!icy$tdFrrPhBV6VvZDoYXwYbCD91z6I$thUPyk50ct9MVx$dXRXEW8rpdVavkcuae1wOLgC36naRV$P3ciba8qoqFQqewxnhBdUi9rz33lo86lS6K6PPtOD!00D0SY9m48yyjUgqF9uYFq9tAXMoZZ6LruqS5WcVHcVEw6LocLJvyWZwy!8zKFtA5whK08PbAnz2BCTnM$$YPwssO!!$l5v1qz61VXerSg6V0$$eA1JyiZRF$0ErSFtwM51gnD7qXnlIMQ8krXmuUcWdbrvTKUOsY!6t8MfYvlPZDsJz$WaJDCT2TLHqjJRlGvr7CiBncg5S1!5hS6eQAhDw3fcw3ghO5fcIeDT!doP1E0W!MPbqSzWrrGXdYbtcfj5iqShrnDkizgD3E7q8zbBMa9kL3NaCBt2UP!jOULCeTIC3LxrSmhKCgHnhrsuyPaJg6e4jGr0n1Xj1K2gKybs4AIAOyAfEPqZEt$6WSrtp$3O
|
||||
@@ -0,0 +1,24 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID8zCCAtugAwIBAgIUYL/dZNSITnL3uvCDT62CVzoHeKMwDQYJKoZIhvcNAQEL
|
||||
BQAwgYgxCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTERMA8GA1UEBwwI
|
||||
U2hhbmdoYWkxDzANBgNVBAoMBmZsc3dsZDEPMA0GA1UECwwGZmxzd2xkMQ8wDQYD
|
||||
VQQDDAZmbHN3bGQxIDAeBgkqhkiG9w0BCQEWEWZsc3dsZEBmbHN3bGQuY29tMB4X
|
||||
DTIyMDQyNjE3MjYwN1oXDTMyMDQyMzE3MjYwN1owgYgxCzAJBgNVBAYTAkNOMREw
|
||||
DwYDVQQIDAhTaGFuZ2hhaTERMA8GA1UEBwwIU2hhbmdoYWkxDzANBgNVBAoMBmZs
|
||||
c3dsZDEPMA0GA1UECwwGZmxzd2xkMQ8wDQYDVQQDDAZmbHN3bGQxIDAeBgkqhkiG
|
||||
9w0BCQEWEWZsc3dsZEBmbHN3bGQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
||||
MIIBCgKCAQEAp4bjl/JavfVApTELsgNhGxwlXY+Z4SoVz8a+KVogdZf0fdMt62ob
|
||||
YMwg7mg9r5dUmfvfvHhtFjCjviR+sKkS6Dgfc+xwS2ap4DWNwk/7kpmDr/QYTqb9
|
||||
XO8kUAQ+zPxU0rfPE8KbdCvTlTh4opCMWde8C3BvWExNcKBgb132pHlZNwJTDs7G
|
||||
laa1T9aSoDz+I9qb91acKnWsDm9NumQ86L1pJgZ+DylzBkVAwTHbMgURLM6hGGmW
|
||||
RHaYKOnHb/s91YxgO1pN56IL6M2tZQuydt8pMC1Tt3z8yZR2nqAPVvF3j0U1Xh2+
|
||||
X9iKL9zAsCXgw+nQt/s9QWFP70Pr95hQ8wIDAQABo1MwUTAdBgNVHQ4EFgQU0HwJ
|
||||
oRLZWEVg9itEpy1VI04MefkwHwYDVR0jBBgwFoAU0HwJoRLZWEVg9itEpy1VI04M
|
||||
efkwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAK2vphvnVGONT
|
||||
GBdb8khlPGVf+2caAy5+LrgxX77wQy4aRO//e8r040awzkhN4C8eC2ozGLifzTKy
|
||||
zxNKWNp163c4v2i0PGx4gdAS7yfLMklUndntiV/uPdk4jZ7Vr4eTciN+Sf0FdUUR
|
||||
K7tpq0HNHrI6q+29B8Eq1ClkBYAmJqnHllu1EmpNReXkPOOaadpv2pjoJDmIWumI
|
||||
wCKs4uGZburgX9jBsFHuyRDYOkG+1OGL4zKZClMuEFNodOa3zm4WrBPzWM3WOBZ9
|
||||
uHLCXkRnce192OopnaytxEEoxuKCQ3lQZzrcuoz1wRfczTBh2pUU4YR1L6oBNuG+
|
||||
oC9MpDAcmw==
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEogIBAAKCAQEAp4bjl/JavfVApTELsgNhGxwlXY+Z4SoVz8a+KVogdZf0fdMt
|
||||
62obYMwg7mg9r5dUmfvfvHhtFjCjviR+sKkS6Dgfc+xwS2ap4DWNwk/7kpmDr/QY
|
||||
Tqb9XO8kUAQ+zPxU0rfPE8KbdCvTlTh4opCMWde8C3BvWExNcKBgb132pHlZNwJT
|
||||
Ds7Glaa1T9aSoDz+I9qb91acKnWsDm9NumQ86L1pJgZ+DylzBkVAwTHbMgURLM6h
|
||||
GGmWRHaYKOnHb/s91YxgO1pN56IL6M2tZQuydt8pMC1Tt3z8yZR2nqAPVvF3j0U1
|
||||
Xh2+X9iKL9zAsCXgw+nQt/s9QWFP70Pr95hQ8wIDAQABAoIBAD7rNHOO/HG3uO3R
|
||||
+9iB2Gi8K3R2SI7+pW6B8E3LocFIrvTK6cYu9dVnFT81O2XFamri5Gb+u8nHvtfd
|
||||
EQ/8kDNTUMzTEmHfTxH8Sx+dtpiau5DMFo0Dvsi2sGa1EXkflCQIEOgVARmilDbJ
|
||||
HNXBgFUF54RMWCVLkxInydBJ9CZVKUVgN5xmUTnLOEINbcn3V8d2aLwSYjECW5Gm
|
||||
22QzrA05dKvmc6Io776Sc2fNDnJHTkHMrxH+kQ+c2jnHLWvdMb3aCJh/4JDAF/Iq
|
||||
CZ6EsXBBYJ7C3ZRMata3LEgGU44L2oOZpUcd+RNldcvaBN8T86hxiyHddC9DC+AE
|
||||
+svJIgECgYEA3H2EBQeVDjJ6PGE/elHJwRyWWtb9xxd7hbJkDfqw+SMEX2pYKnf5
|
||||
tftXKbPY+U09Sm78Mbdac7W+O7IfD1e00/EDIcjdmq4S2CMGNtQ4GQxfxsFzg2LH
|
||||
ujtVtx/xuvCNQbgNOEXl+/127AQpSDkhPxD2Tm1WoH72UXS82Ydq9HMCgYEAwoHF
|
||||
ucrscqPRsg9AVb0UbecbJjRjQD+BudGmOkm0d/QCsjANRJYpSoQ9jP39uqYWlh4f
|
||||
JAe+H89UWdDTVtFWL14+//nLNqPeCAu70RYt+xajvGAWUCRYaZvECBQW5stzHnHv
|
||||
p2LG6TSyRbs10vBHxSkxgDe1Ng5+7jjJe09KkYECgYASu5c71ikTy7YW6yw5eDlr
|
||||
7sHXdeyZvaUA9ucJSQNAJ3l3odFbylWs4G3HXUBR7f4HFObYUnuc2RQQflGlPA5g
|
||||
81kQxcAOJDv1oQQmJGGfvy1j9Yua3gmaCPB/XndrKoTV0I1O+qFPh3lTFAdt22y3
|
||||
rvk+MIvrlt3WjdR9psOvgQKBgGOvhtq1uYD3nJ0ZW+uVQEcjTrLB3qwq4B2P6RWu
|
||||
eKORl2AjaGliXD8ojzMXaVajkKfXQDaDEVnUNHLjp6yzFOyp7LfcGd4jFcQh31xF
|
||||
dcNd0wTUahsgxX86qblKMoKOeq17z0uGQFN9AnDiha9aHi5Z8li4NFNEEqGc0QY1
|
||||
mQ4BAoGALmY+k+sL3jdjZ7XwJTuCfPka/UQP32osWzZMCvalts5I73Osyr9+o3sC
|
||||
gptDMTOmUIh6xxY2pshM6i6etKgyDA7r9utUe+w6pvMIrDG1uZva/2oj0jzQrRq5
|
||||
X9F3C/MJVMcVSI6Uk+rvBb8QtltKovbN/JX+nlKrIp2FDNuj8zg=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
@@ -0,0 +1,38 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"hk4e/logger"
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
func (c *Controller) headDataVersions(context *gin.Context) {
|
||||
context.Header("Content-Type", "application/octet-stream")
|
||||
context.Header("Content-Length", "514")
|
||||
context.Status(http.StatusOK)
|
||||
}
|
||||
|
||||
func (c *Controller) getDataVersions(context *gin.Context) {
|
||||
dataVersions, err := os.ReadFile("static/data_versions")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open data_versions error")
|
||||
return
|
||||
}
|
||||
context.Data(http.StatusOK, "application/octet-stream", dataVersions)
|
||||
}
|
||||
|
||||
func (c *Controller) headBlk(context *gin.Context) {
|
||||
context.Header("Content-Type", "application/octet-stream")
|
||||
context.Header("Content-Length", "14103")
|
||||
context.Status(http.StatusOK)
|
||||
}
|
||||
|
||||
func (c *Controller) getBlk(context *gin.Context) {
|
||||
blk, err := os.ReadFile("static/29342328.blk")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open 29342328.blk error")
|
||||
return
|
||||
}
|
||||
context.Data(http.StatusOK, "application/octet-stream", blk)
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"github.com/gin-gonic/gin"
|
||||
pb "google.golang.org/protobuf/proto"
|
||||
"hk4e/common/config"
|
||||
"hk4e/common/region"
|
||||
"hk4e/dispatch/dao"
|
||||
"hk4e/logger"
|
||||
"net/http"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type Controller struct {
|
||||
dao *dao.Dao
|
||||
regionListBase64 string
|
||||
regionCurrBase64 string
|
||||
signRsaKey []byte
|
||||
encRsaKeyMap map[string][]byte
|
||||
pwdRsaKey []byte
|
||||
}
|
||||
|
||||
func NewController(dao *dao.Dao) (r *Controller) {
|
||||
r = new(Controller)
|
||||
r.dao = dao
|
||||
r.regionListBase64 = ""
|
||||
r.regionCurrBase64 = ""
|
||||
regionCurr, regionList := region.InitRegion(config.CONF.Hk4e.KcpAddr, config.CONF.Hk4e.KcpPort)
|
||||
r.signRsaKey, r.encRsaKeyMap, r.pwdRsaKey = region.LoadRsaKey()
|
||||
regionCurrModify, err := pb.Marshal(regionCurr)
|
||||
if err != nil {
|
||||
logger.LOG.Error("Marshal QueryCurrRegionHttpRsp error")
|
||||
return nil
|
||||
}
|
||||
r.regionCurrBase64 = base64.StdEncoding.EncodeToString(regionCurrModify)
|
||||
regionListModify, err := pb.Marshal(regionList)
|
||||
if err != nil {
|
||||
logger.LOG.Error("Marshal QueryRegionListHttpRsp error")
|
||||
return nil
|
||||
}
|
||||
r.regionListBase64 = base64.StdEncoding.EncodeToString(regionListModify)
|
||||
r.runEngine()
|
||||
return r
|
||||
}
|
||||
|
||||
func (c *Controller) runEngine() {
|
||||
if config.CONF.Logger.Level == "DEBUG" {
|
||||
gin.SetMode(gin.DebugMode)
|
||||
} else {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
}
|
||||
go func() {
|
||||
engine := c.registerRouter()
|
||||
port := config.CONF.HttpPort
|
||||
addr := ":" + strconv.FormatInt(int64(port), 10)
|
||||
err := engine.Run(addr)
|
||||
if err != nil {
|
||||
logger.LOG.Error("gin run error: %v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (c *Controller) registerRouter() *gin.Engine {
|
||||
engine := gin.Default()
|
||||
{
|
||||
// 404
|
||||
engine.NoRoute(func(context *gin.Context) {
|
||||
logger.LOG.Info("no route find, fallback to fuck mhy, url: %v", context.Request.RequestURI)
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
context.Status(http.StatusNotFound)
|
||||
_, _ = context.Writer.WriteString("FUCK MHY")
|
||||
})
|
||||
}
|
||||
{
|
||||
// 调度
|
||||
// dispatchosglobal.yuanshen.com
|
||||
engine.GET("/query_security_file", c.query_security_file)
|
||||
engine.GET("/query_region_list", c.query_region_list)
|
||||
// osusadispatch.yuanshen.com
|
||||
engine.GET("/query_cur_region", c.query_cur_region)
|
||||
}
|
||||
{
|
||||
// 登录
|
||||
// hk4e-sdk-os.hoyoverse.com
|
||||
// 账号登录
|
||||
engine.POST("/hk4e_global/mdk/shield/api/login", c.apiLogin)
|
||||
// token登录
|
||||
engine.POST("/hk4e_global/mdk/shield/api/verify", c.apiVerify)
|
||||
// 获取combo token
|
||||
engine.POST("/hk4e_global/combo/granter/login/v2/login", c.v2Login)
|
||||
}
|
||||
{
|
||||
// BLK文件补丁下载
|
||||
// autopatchhk.yuanshen.com
|
||||
engine.HEAD("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/data_versions", c.headDataVersions)
|
||||
engine.GET("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/data_versions", c.getDataVersions)
|
||||
engine.HEAD("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/blocks/00/29342328.blk", c.headBlk)
|
||||
engine.GET("/client_design_data/2.6_live/output_6988297_84eeb1c18b/client_silence/General/AssetBundles/blocks/00/29342328.blk", c.getBlk)
|
||||
}
|
||||
{
|
||||
// 日志
|
||||
engine.POST("/sdk/dataUpload", c.sdkDataUpload)
|
||||
engine.GET("/perf/config/verify", c.perfConfigVerify)
|
||||
engine.POST("/perf/dataUpload", c.perfDataUpload)
|
||||
engine.POST("/log", c.log8888)
|
||||
engine.POST("/crash/dataUpload", c.crashDataUpload)
|
||||
}
|
||||
{
|
||||
// 返回固定数据
|
||||
// Windows
|
||||
engine.GET("/hk4e_global/mdk/agreement/api/getAgreementInfos", c.getAgreementInfos)
|
||||
engine.POST("/hk4e_global/combo/granter/api/compareProtocolVersion", c.postCompareProtocolVersion)
|
||||
engine.POST("/account/risky/api/check", c.check)
|
||||
engine.GET("/combo/box/api/config/sdk/combo", c.combo)
|
||||
engine.GET("/hk4e_global/combo/granter/api/getConfig", c.getConfig)
|
||||
engine.GET("/hk4e_global/mdk/shield/api/loadConfig", c.loadConfig)
|
||||
engine.POST("/data_abtest_api/config/experiment/list", c.list)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m2020030410/m2020030410-version.json", c.version10Json)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m2020030410/m2020030410-zh-cn.json", c.zhCN10Json)
|
||||
engine.GET("/geetestV2.html", c.geetestV2)
|
||||
// Android
|
||||
engine.POST("/common/h5log/log/batch", c.batch)
|
||||
engine.GET("/hk4e_global/combo/granter/api/getFont", c.getFont)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m202003049/m202003049-version.json", c.version9Json)
|
||||
engine.GET("/admin/mi18n/plat_oversea/m202003049/m202003049-zh-cn.json", c.zhCN9Json)
|
||||
engine.GET("/hk4e_global/combo/granter/api/compareProtocolVersion", c.getCompareProtocolVersion)
|
||||
// Android geetest
|
||||
engine.GET("/gettype.php", c.gettype)
|
||||
engine.GET("/get.php", c.get)
|
||||
engine.POST("/ajax.php", c.ajax)
|
||||
engine.GET("/ajax.php", c.ajax)
|
||||
engine.GET("/static/appweb/app3-index.html", c.app3Index)
|
||||
engine.GET("/static/js/slide.7.8.6.js", c.slideJs)
|
||||
engine.GET("/favicon.ico", c.faviconIco)
|
||||
engine.GET("/static/js/gct.e7810b5b525994e2fb1f89135f8df14a.js", c.js)
|
||||
engine.GET("/static/ant/style_https.1.2.6.css", c.css)
|
||||
engine.GET("/pictures/gt/a330cf996/a330cf996.webp", c.webp)
|
||||
engine.GET("/pictures/gt/a330cf996/bg/86f9db021.webp", c.bgWebp)
|
||||
engine.GET("/pictures/gt/a330cf996/slice/86f9db021.png", c.slicePng)
|
||||
engine.GET("/static/ant/sprite2x.1.2.6.png", c.sprite2xPng)
|
||||
}
|
||||
return engine
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/base64"
|
||||
"github.com/gin-gonic/gin"
|
||||
"hk4e/common/utils/endec"
|
||||
"hk4e/dispatch/entity/api"
|
||||
"hk4e/logger"
|
||||
"math"
|
||||
"net/http"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func (c *Controller) query_security_file(context *gin.Context) {
|
||||
file, err := os.ReadFile("static/security_file")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open security_file error")
|
||||
return
|
||||
}
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
_, _ = context.Writer.WriteString(string(file))
|
||||
}
|
||||
|
||||
func (c *Controller) query_region_list(context *gin.Context) {
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
_, _ = context.Writer.WriteString(c.regionListBase64)
|
||||
}
|
||||
|
||||
func (c *Controller) query_cur_region(context *gin.Context) {
|
||||
versionName := context.Query("version")
|
||||
response := "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw=="
|
||||
if len(context.Request.URL.RawQuery) > 0 {
|
||||
response = c.regionCurrBase64
|
||||
}
|
||||
reg, err := regexp.Compile("[0-9]+")
|
||||
if err != nil {
|
||||
logger.LOG.Error("compile regexp error: %v", err)
|
||||
return
|
||||
}
|
||||
versionSlice := reg.FindAllString(versionName, -1)
|
||||
version := 0
|
||||
for index := 0; index < len(versionSlice); index++ {
|
||||
v, err := strconv.Atoi(versionSlice[index])
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse client version error: %v", err)
|
||||
return
|
||||
}
|
||||
for i := 0; i < len(versionSlice)-1-index; i++ {
|
||||
v *= 10
|
||||
}
|
||||
version += v
|
||||
}
|
||||
if version >= 1000 {
|
||||
// 测试版本
|
||||
version /= 10
|
||||
}
|
||||
if version >= 275 {
|
||||
logger.LOG.Debug("do hk4e 2.8 rsa logic")
|
||||
if context.Query("dispatchSeed") == "" {
|
||||
rsp := &api.QueryCurRegionRspJson{
|
||||
Content: response,
|
||||
Sign: "TW9yZSBsb3ZlIGZvciBVQSBQYXRjaCBwbGF5ZXJz",
|
||||
}
|
||||
context.JSON(http.StatusOK, rsp)
|
||||
return
|
||||
}
|
||||
keyId := context.Query("key_id")
|
||||
encPubPrivKey, exist := c.encRsaKeyMap[keyId]
|
||||
if !exist {
|
||||
logger.LOG.Error("can not found key id: %v", keyId)
|
||||
return
|
||||
}
|
||||
regionInfo, err := base64.StdEncoding.DecodeString(response)
|
||||
if err != nil {
|
||||
logger.LOG.Error("decode region info error: %v", err)
|
||||
return
|
||||
}
|
||||
chunkSize := 256 - 11
|
||||
regionInfoLength := len(regionInfo)
|
||||
numChunks := int(math.Ceil(float64(regionInfoLength) / float64(chunkSize)))
|
||||
encryptedRegionInfo := make([]byte, 0)
|
||||
for i := 0; i < numChunks; i++ {
|
||||
from := i * chunkSize
|
||||
to := int(math.Min(float64((i+1)*chunkSize), float64(regionInfoLength)))
|
||||
chunk := regionInfo[from:to]
|
||||
pubKey, err := endec.RsaParsePubKeyByPrivKey(encPubPrivKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa pub key error: %v", err)
|
||||
return
|
||||
}
|
||||
privKey, err := endec.RsaParsePrivKey(encPubPrivKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa priv key error: %v", err)
|
||||
return
|
||||
}
|
||||
encrypt, err := endec.RsaEncrypt(chunk, pubKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa enc error: %v", err)
|
||||
return
|
||||
}
|
||||
decrypt, err := endec.RsaDecrypt(encrypt, privKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa dec error: %v", err)
|
||||
return
|
||||
}
|
||||
if bytes.Compare(decrypt, chunk) != 0 {
|
||||
logger.LOG.Error("rsa dec test fail")
|
||||
return
|
||||
}
|
||||
encryptedRegionInfo = append(encryptedRegionInfo, encrypt...)
|
||||
}
|
||||
signPrivkey, err := endec.RsaParsePrivKey(c.signRsaKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa priv key error: %v", err)
|
||||
return
|
||||
}
|
||||
signData, err := endec.RsaSign(regionInfo, signPrivkey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa sign error: %v", err)
|
||||
return
|
||||
}
|
||||
ok, err := endec.RsaVerify(regionInfo, signData, &signPrivkey.PublicKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("rsa verify error: %v", err)
|
||||
return
|
||||
}
|
||||
if !ok {
|
||||
logger.LOG.Error("rsa verify test fail")
|
||||
return
|
||||
}
|
||||
rsp := &api.QueryCurRegionRspJson{
|
||||
Content: base64.StdEncoding.EncodeToString(encryptedRegionInfo),
|
||||
Sign: base64.StdEncoding.EncodeToString(signData),
|
||||
}
|
||||
context.JSON(http.StatusOK, rsp)
|
||||
return
|
||||
} else {
|
||||
context.Header("Content-type", "text/html; charset=UTF-8")
|
||||
_, _ = context.Writer.WriteString(response)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,233 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"hk4e/logger"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// 返回固定数据
|
||||
|
||||
// GET https://hk4e-sdk-os.hoyoverse.com/hk4e_global/mdk/agreement/api/getAgreementInfos?biz_key=hk4e_global&country_code=CN&token=ZXN2RfKSVOLRBMsqQeHaSwL7gQYfUp1d&uid=222546880 HTTP/1.1
|
||||
func (c *Controller) getAgreementInfos(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"marketing_agreements\":[]}}")
|
||||
}
|
||||
|
||||
// POST https://hk4e-sdk-os.hoyoverse.com/hk4e_global/combo/granter/api/compareProtocolVersion? HTTP/1.1
|
||||
func (c *Controller) postCompareProtocolVersion(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"modified\":true,\"protocol\":{\"id\":0,\"app_id\":4,\"language\":\"zh-cn\",\"user_proto\":\"\",\"priv_proto\":\"\",\"major\":6,\"minimum\":1,\"create_time\":\"0\",\"teenager_proto\":\"\",\"third_proto\":\"\"}}}")
|
||||
}
|
||||
|
||||
// POST https://api-account-os.hoyoverse.com/account/risky/api/check? HTTP/1.1
|
||||
// POST https://api-account-os.hoyoverse.com/account/risky/api/check HTTP/1.1
|
||||
func (c *Controller) check(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
if strings.Contains(context.Request.RequestURI, "?") {
|
||||
// Windows
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":\"c8820f246a5241ab9973f71df3ddd791\",\"action\":\"\",\"geetest\":{\"challenge\":\"\",\"gt\":\"\",\"new_captcha\":0,\"success\":1}}}")
|
||||
} else {
|
||||
// Android
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":\"2b35f1421d4a4c7c9183184c6190027e\",\"action\":\"ACTION_GEETEST\",\"geetest\":{\"challenge\":\"616018607b6940f52fbd349004038686\",\"gt\":\"16bddce04c7385dbb7282778c29bba3e\",\"new_captcha\":1,\"success\":1}}}")
|
||||
}
|
||||
}
|
||||
|
||||
// GET https://sdk-os-static.hoyoverse.com/combo/box/api/config/sdk/combo?biz_key=hk4e_global&client_type=3 HTTP/1.1
|
||||
// GET https://sdk-os-static.hoyoverse.com/combo/box/api/config/sdk/combo?biz_key=hk4e_global&client_type=2 HTTP/1.1
|
||||
func (c *Controller) combo(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
clientType := context.Query("client_type")
|
||||
if clientType == "3" {
|
||||
// Windows
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"vals\":{\"email_bind_remind\":\"true\",\"disable_email_bind_skip\":\"false\",\"email_bind_remind_interval\":\"7\"}}}")
|
||||
} else if clientType == "2" {
|
||||
// Android
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"vals\":{\"email_bind_remind_interval\":\"7\",\"report_black_list\":\"{\\\"key\\\":[\\\"download_update_progress\\\"]}\",\"enable_bind_google_sdk_order\":\"false\",\"disable_email_bind_skip\":\"false\",\"email_bind_remind\":\"true\"}}}")
|
||||
}
|
||||
}
|
||||
|
||||
// GET https://hk4e-sdk-os-static.hoyoverse.com/hk4e_global/combo/granter/api/getConfig?app_id=4&channel_id=1&client_type=3 HTTP/1.1
|
||||
// GET https://hk4e-sdk-os-static.hoyoverse.com/hk4e_global/combo/granter/api/getConfig?app_id=4&channel_id=1&client_type=2 HTTP/1.1
|
||||
func (c *Controller) getConfig(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"protocol\":true,\"qr_enabled\":false,\"log_level\":\"INFO\",\"announce_url\":\"https://webstatic-sea.hoyoverse.com/hk4e/announcement/index.html?sdk_presentation_style=fullscreen\\u0026sdk_screen_transparent=true\\u0026game_biz=hk4e_global\\u0026auth_appid=announcement\\u0026game=hk4e#/\",\"push_alias_type\":2,\"disable_ysdk_guard\":false,\"enable_announce_pic_popup\":true}}")
|
||||
}
|
||||
|
||||
// GET https://hk4e-sdk-os-static.hoyoverse.com/hk4e_global/mdk/shield/api/loadConfig?client=3&game_key=hk4e_global HTTP/1.1
|
||||
// GET https://hk4e-sdk-os-static.hoyoverse.com/hk4e_global/mdk/shield/api/loadConfig?client=2&game_key=hk4e_global HTTP/1.1
|
||||
func (c *Controller) loadConfig(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
client := context.Query("client")
|
||||
if client == "3" {
|
||||
// Windows
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":6,\"game_key\":\"hk4e_global\",\"client\":\"PC\",\"identity\":\"I_IDENTITY\",\"guest\":false,\"ignore_versions\":\"\",\"scene\":\"S_NORMAL\",\"name\":\"原神海外\",\"disable_regist\":false,\"enable_email_captcha\":false,\"thirdparty\":[\"fb\",\"tw\"],\"disable_mmt\":false,\"server_guest\":false,\"thirdparty_ignore\":{\"fb\":\"\",\"tw\":\"\"},\"enable_ps_bind_account\":false,\"thirdparty_login_configs\":{\"tw\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800},\"fb\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800}}}}")
|
||||
} else if client == "2" {
|
||||
// Android
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":5,\"game_key\":\"hk4e_global\",\"client\":\"Android\",\"identity\":\"I_IDENTITY\",\"guest\":false,\"ignore_versions\":\"\",\"scene\":\"S_NORMAL\",\"name\":\"原神海外\",\"disable_regist\":false,\"enable_email_captcha\":false,\"thirdparty\":[\"gl\",\"fb\",\"tw\"],\"disable_mmt\":false,\"server_guest\":false,\"thirdparty_ignore\":{\"tw\":\"\",\"fb\":\"\",\"gl\":\"\"},\"enable_ps_bind_account\":false,\"thirdparty_login_configs\":{\"tw\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800},\"fb\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800},\"gl\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800}}}}")
|
||||
}
|
||||
}
|
||||
|
||||
// POST https://abtest-api-data-sg.hoyoverse.com/data_abtest_api/config/experiment/list HTTP/1.1
|
||||
func (c *Controller) list(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"success\":true,\"message\":\"\",\"data\":[{\"code\":1000,\"type\":2,\"config_id\":\"14\",\"period_id\":\"6036_99\",\"version\":\"1\",\"configs\":{\"cardType\":\"old\"}}]}")
|
||||
}
|
||||
|
||||
// GET https://webstatic-sea.hoyoverse.com/admin/mi18n/plat_oversea/m2020030410/m2020030410-version.json HTTP/1.1
|
||||
func (c *Controller) version10Json(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"version\":65}")
|
||||
}
|
||||
|
||||
// GET https://webstatic-sea.hoyoverse.com/admin/mi18n/plat_oversea/m2020030410/m2020030410-zh-cn.json HTTP/1.1
|
||||
func (c *Controller) zhCN10Json(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"accept\":\"接受\",\"account_deactive\":\"当前账号为注销中状态\",\"account_empty\":\"请输入手机号/邮箱\",\"account_login\":\"账号密码登录\",\"agree\":\"同意\",\"another_account\":\"登录其他账号\",\"back\":\"返回\",\"bind\":\"绑定\",\"bind_email\":\"绑定邮箱账号\",\"bind_email_oversea\":\"绑定邮箱\",\"bind_email_success\":\"绑定邮箱成功\",\"bind_request\":\"绑定中...\",\"cancel\":\"取消\",\"cancel_pay\":\"取消支付\",\"captcha_empty\":\"请输入短信验证码\",\"captcha_mail_empty\":\"请输入邮箱验证码\",\"captcha_success\":\"获取验证码成功,请注意查收。\",\"change_password_success\":\"修改密码成功\",\"check_network\":\"请检查网络超时络状态或刷新重试\",\"combo_download_downloading\":\"下载中…\",\"combo_download_failed_title\":\"下载失败\",\"combo_download_finish_content\":\"下载完成\",\"combo_download_pause\":\"暂停\",\"combo_download_speed\":\"下载速度%s,剩余时间%s\",\"combo_download_title\":\"下载完成\",\"combo_ensure_login\":\"确认登录\",\"combo_ensure_login_tips\":\"即将登录%s桌面版,请确认是本人操作\",\"combo_expired_qrcode\":\"过期的二维码\",\"combo_go_setting\":\"开启相机\",\"combo_invalid_qrcode\":\"无效的二维码\",\"combo_login_first\":\"请先登录\",\"combo_notice_auth_key_failed\":\"公告加载失败\",\"combo_platform_cancel\":\"取消\",\"combo_platform_ensure\":\"确认\",\"combo_platform_ensure_exit\":\"确认退出游戏\",\"combo_platform_ensure_logout\":\"确认登出账号\",\"combo_qrcode_failed\":\"登录失败,请稍后重试\",\"combo_qrcode_notice_permission\":\"请在设置-应用中,开启当前游戏的相机权限。\",\"combo_qrcode_notice_scan\":\"把二维码放入框内,即可自动扫描\",\"combo_qrcode_success\":\"登录成功\",\"combo_qrcode_title\":\"扫一扫\",\"combo_re_login\":\"请重新登录\",\"confirm_order\":\"确认订单中...\",\"continue_login\":\"继续登录\",\"continue_pay\":\"继续支付\",\"createOrder_failed\":\"创建订单失败\",\"currency\":\"¥\",\"delete_account_notice\":\"是否删除该账号的登录记录(不删除账号数据)\",\"delete_ensure\":\"确认删除\",\"determine_reactivate_account_or_not\":\"是否重新激活账号并登录\",\"email_empty\":\"请输入邮箱\",\"email_exist\":\"邮箱已存在,是否直接登录?\",\"email_register_tips\":\"邮箱未注册,是否前往注册?\",\"ensure\":\"确定\",\"ensure_back\":\"确认返回\",\"ensure_email\":\"确认注册的邮箱账号:\\\\n%s\",\"enter_game\":\"进入游戏\",\"epic_login_status_error\":\"登录失效,请重新启动游戏\",\"existing_account\":\"绑定已有账号\",\"exit\":\"退出\",\"fast_game\":\"快速游戏\",\"fatigue_reminder_tip\":\"%s,您连续玩游戏的时长已达%s小时,请注意休息\",\"forget_pwd\":\"忘记密码\",\"go_login\":\"前往登录\",\"go_pay\":\"确认支付\",\"go_register\":\"前往注册\",\"google_pc_finish_oauth\":\"我已授权\",\"google_pc_go_to_oauth\":\"前往 Google Play\",\"google_pc_http_server_error\":\"授权失败,请重试(请求出错)\",\"google_pc_oauth_back_tips\":\"进入游戏前需要在 Google Play 登录并授权,是否退出?\",\"google_pc_oauth_failed\":\"授权失败\",\"google_pc_oauth_message\":\"为保障您的游戏体验,进入游戏前需要在 Google Play 登录并勾选全部权限。\",\"google_pc_oauth_title\":\"登录\",\"google_pc_pay_cancle\":\"未支付\",\"google_pc_pay_finish\":\"已支付\",\"google_pc_pay_no_order_find\":\"暂时无法获悉付款结果,如果您已付款成功,稍后可以查看发货状态。\",\"google_pc_pay_result_tips\":\"请确认支付结果\",\"google_pc_permission_miss\":\"Google Play 权限不完整,请点击\\\"重新前往 Google Play\\\"登录并勾选全部权限\",\"google_pc_redo_oauth\":\"重新前往 Google Play\",\"google_pc_user_no_action\":\"请在 Google Play 登录并授权\",\"google_pc_web_operation_message\":\"已在浏览器打开 Google Play,若已授权成功请点击 “我已授权”。\",\"google_pc_web_operation_title\":\"请在浏览器登录\",\"guest_account\":\"游客用户\",\"guest_bind_email\":\"您正在绑定的邮箱账号:%s\",\"guest_bind_failed\":\"您的当前账号不是游客或者您还未登录\",\"guest_bind_phone_notice\":\"为保障数据安全,请绑定一个账号\",\"guest_bind_tips\":\"为保障数据安全,请绑定一个账号\",\"guest_login\":\"快速登录\",\"guest_login_request\":\"游客登录中...\",\"guest_login_tips\":\"游客用户,欢迎进入游戏\",\"guest_pay_error\":\"游客禁止支付\",\"http_time_out\":\"网络超时,请稍候再试\",\"http_unknow_host\":\"网络错误\",\"if_cancel_pay\":\"是否取消支付\",\"init_first\":\"请先初始化\",\"input_account\":\"输入手机号/邮箱\",\"input_code_number\":\"输入短Line truncated
|
||||
}
|
||||
|
||||
// GET https://account.hoyoverse.com/geetestV2.html HTTP/1.1
|
||||
func (c *Controller) geetestV2(context *gin.Context) {
|
||||
context.Header("Content-type", "text/html")
|
||||
_, _ = context.Writer.WriteString("<!DOCTYPE html><html lang=\"en\"><head></head><body></body></html>")
|
||||
}
|
||||
|
||||
// Android
|
||||
|
||||
// POST https://minor-api-os.hoyoverse.com/common/h5log/log/batch?topic=plat_explog_sdk_v2 HTTP/1.1
|
||||
func (c *Controller) batch(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"success\",\"data\":null}")
|
||||
}
|
||||
|
||||
// GET https://hk4e-sdk-os-static.hoyoverse.com/hk4e_global/combo/granter/api/getFont?app_id=4 HTTP/1.1
|
||||
func (c *Controller) getFont(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"fonts\":[]}}")
|
||||
}
|
||||
|
||||
// GET https://webstatic-sea.hoyoverse.com/admin/mi18n/plat_oversea/m202003049/m202003049-version.json HTTP/1.1
|
||||
func (c *Controller) version9Json(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"version\":62}")
|
||||
}
|
||||
|
||||
// GET https://webstatic-sea.hoyoverse.com/admin/mi18n/plat_oversea/m202003049/m202003049-zh-cn.json HTTP/1.1
|
||||
func (c *Controller) zhCN9Json(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"Google\":\"Google\",\"accept\":\"接受\",\"account_deactive\":\"当前账号为注销中状态\",\"account_empty\":\"请输入手机号/邮箱\",\"account_login\":\"账号密码登录\",\"agree\":\"同意\",\"another_account\":\"登录其他账号\",\"back\":\"返回\",\"bind\":\"绑定\",\"bind_confirm\":\"绑定\",\"bind_email\":\"绑定邮箱账号\",\"bind_email_oversea\":\"绑定邮箱\",\"bind_email_success\":\"绑定邮箱成功\",\"bind_request\":\"绑定中...\",\"bind_third_party_fail\":\"登录失败\",\"cancel\":\"取消\",\"cancel_pay\":\"取消支付\",\"captcha_empty\":\"请输入短信验证码\",\"captcha_mail_empty\":\"请输入邮箱验证码\",\"captcha_success\":\"获取验证码成功,请注意查收。\",\"change_password_success\":\"修改密码成功\",\"check_network\":\"请检查网络超时状态或刷新重试\",\"choose_file_upload_camera\":\"拍照\",\"choose_file_upload_cancel\":\"取消\",\"choose_file_upload_photos\":\"相册\",\"choose_file_upload_way\":\"添加方式\",\"combo_download_downloading\":\"下载中…\",\"combo_download_failed_title\":\"下载失败\",\"combo_download_finish_content\":\"下载完成\",\"combo_download_pause\":\"暂停\",\"combo_download_speed\":\"下载速度%s,剩余时间%s\",\"combo_download_title\":\"下载完成\",\"combo_ensure_login\":\"确认登录\",\"combo_ensure_login_tips\":\"即将登录%s桌面版,请确认是本人操作\",\"combo_expired_qrcode\":\"过期的二维码\",\"combo_go_setting\":\"开启相机\",\"combo_invalid_qrcode\":\"无效的二维码\",\"combo_login_first\":\"请先登录\",\"combo_notice_auth_key_failed\":\"公告加载失败\",\"combo_platform_cancel\":\"取消\",\"combo_platform_ensure\":\"确认\",\"combo_platform_ensure_exit\":\"确认退出游戏\",\"combo_platform_ensure_logout\":\"确认登出账号\",\"combo_qrcode_failed\":\"登录失败,请稍后重试\",\"combo_qrcode_goto_setting\":\"去设置\",\"combo_qrcode_notice_permission\":\"请在设置-应用中,开启当前游戏的相机权限。\",\"combo_qrcode_notice_scan\":\"把二维码放入框内,即可自动扫描\",\"combo_qrcode_success\":\"登录成功\",\"combo_qrcode_title\":\"扫一扫\",\"combo_re_login\":\"请重新登录\",\"confirm_order\":\"确认订单中...\",\"continue_login\":\"继续登录\",\"continue_pay\":\"继续支付\",\"createOrder_failed\":\"创建订单失败\",\"currency\":\"¥\",\"delete_account_notice\":\"是否删除该账号的登录记录(不删除账号数据)\",\"delete_ensure\":\"确认删除\",\"determine_reactivate_account_or_not\":\"是否重新激活账号并登录\",\"email_empty\":\"请输入邮箱\",\"email_exist\":\"邮箱已存在,是否直接登录?\",\"email_register_tips\":\"邮箱未注册,是否前往注册?\",\"ensure\":\"确定\",\"ensure_back\":\"确认返回\",\"ensure_email\":\"确认注册的邮箱账号:\\\\n%s\",\"enter_game\":\"进入游戏\",\"existing_account\":\"绑定已有账号\",\"exit\":\"退出\",\"facebook\":\"Facebook\",\"fast_game\":\"快速游戏\",\"fatigue_reminder_tip\":\"%s,您连续玩游戏的时长已达%s小时,请注意休息\",\"file_upload_setting_camera_tip\":\"请在设置-应用中开启相机权限,以正常使用拍照功能。\",\"file_upload_setting_cancel\":\"取消\",\"file_upload_setting_confirm\":\"去设置\",\"file_upload_setting_photos_tip\":\"请在设置-应用中开启储存空间权限,以正常使用图片上传功能。\",\"forget_pwd\":\"忘记密码\",\"go_login\":\"前往登录\",\"go_pay\":\"确认支付\",\"go_register\":\"前往注册\",\"guest\":\"游客\",\"guest_account\":\"游客用户\",\"guest_bind_account_notice\":\"为保障数据安全,请绑定一个账号\",\"guest_bind_email\":\"您正在绑定的邮箱账号:%s\",\"guest_bind_failed\":\"您的当前账号不是游客或者您还未登录\",\"guest_bind_phone_notice\":\"为保障数据安全,请绑定一个账号\",\"guest_login\":\"快速登录\",\"guest_login_request\":\"游客登录中...\",\"guest_login_tips\":\"游客用户,欢迎进入游戏\",\"guest_pay_error\":\"游客禁止支付\",\"http_time_out\":\"网络超时,请稍候再试\",\"http_unknow_host\":\"网络错误\",\"if_cancel_pay\":\"是否取消支付\",\"init_first\":\"请先初始化\",\"input_account\":\"输入手机号/邮箱\",\"input_code_number\":\"输入短信验证码\",\"input_email\":\"输入邮箱账号\",\"input_get_code\":\"获取\",\"input_mail_capture\":\"验证码\",\"input_mail_code\":\"输入邮箱验证码\",\"input_mi_email\":\"输入邮箱\",\"input_password\":\"输入密码\",\"input_password_ensure\":\"再次输入密码\",\"input_phone_number\":\"输入手机号注册/登录\",\"input_phone_number_bind\":\"输入手机号\",\"input_re_get_code\":\"重新获取\",\"install_wechat_first\":\"请先安装微信\",\"invaild_captcha\":\"请输入正确的短信验证码\",\"invaild_mail_captcha\":\"请输入正确Line truncated
|
||||
}
|
||||
|
||||
// GET https://hk4e-sdk-os.hoyoverse.com/hk4e_global/combo/granter/api/compareProtocolVersion?app_id=4&language=zh-cn&major=6&minimum=1&channel_id=1 HTTP/1.1
|
||||
func (c *Controller) getCompareProtocolVersion(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"modified\":false,\"protocol\":null}}")
|
||||
}
|
||||
|
||||
// Android GT
|
||||
|
||||
// GET https://api-na.geetest.com/gettype.php?gt=16bddce04c7385dbb7282778c29bba3e&t=1651516373584 HTTP/1.1
|
||||
func (c *Controller) gettype(context *gin.Context) {
|
||||
context.Header("Content-type", "text/javascript;charset=UTF-8")
|
||||
_, _ = context.Writer.WriteString("({\"status\": \"success\", \"data\": {\"type\": \"fullpage\", \"static_servers\": [\"static.geetest.com/\", \"dn-staticdown.qbox.me/\"], \"click\": \"/static/js/click.3.0.4.js\", \"pencil\": \"/static/js/pencil.1.0.3.js\", \"voice\": \"/static/js/voice.1.2.0.js\", \"fullpage\": \"/static/js/fullpage.9.0.9.js\", \"beeline\": \"/static/js/beeline.1.0.1.js\", \"slide\": \"/static/js/slide.7.8.6.js\", \"geetest\": \"/static/js/geetest.6.0.9.js\", \"aspect_radio\": {\"slide\": 103, \"click\": 128, \"voice\": 128, \"pencil\": 128, \"beeline\": 50}}})")
|
||||
}
|
||||
|
||||
// GET https://api-na.geetest.com/get.php?gt=16bddce04c7385dbb7282778c29bba3e&challenge=616018607b6940f52fbd349004038686&client_type=android&lang=zh-CN&client_type=android&pt=20&w=SVBBNggmYQj5x34VNcTu9ToZ%2F936VslgWYPwRMBw4J56VYFRpL%2FLI79YW6Xz84H6Vq8HDjXFH5Mp%0APS2PkdDEXQ%3D%3D%0A HTTP/1.1
|
||||
// GET https://api-na.geetest.com/get.php?is_next=true&mobile=true&product=embed&width=100%25&https=true>=16bddce04c7385dbb7282778c29bba3e&challenge=616018607b6940f52fbd349004038686&lang=zh-CN&type=slide3&api_server=api-na.geetest.com&timeout=10000&aspect_radio_voice=128&aspect_radio_slide=103&aspect_radio_beeline=50&aspect_radio_pencil=128&aspect_radio_click=128&voice=%2Fstatic%2Fjs%2Fvoice.1.2.0.js&beeline=%2Fstatic%2Fjs%2Fbeeline.1.0.1.js&pencil=%2Fstatic%2Fjs%2Fpencil.1.0.3.js&click=%2Fstatic%2Fjs%2Fclick.3.0.4.js&callback=geetest_1651516382362 HTTP/1.1
|
||||
func (c *Controller) get(context *gin.Context) {
|
||||
context.Header("Content-type", "text/javascript;charset=UTF-8")
|
||||
callback := context.Query("callback")
|
||||
if len(callback) == 0 {
|
||||
_, _ = context.Writer.WriteString("({\"status\": \"success\", \"data\": {\"theme\": \"wind\", \"theme_version\": \"1.5.8\", \"static_servers\": [\"static.geetest.com\", \"dn-staticdown.qbox.me\"], \"api_server\": \"api-na.geetest.com\", \"logo\": false, \"feedback\": \"\", \"c\": [12, 58, 98, 36, 43, 95, 62, 15, 12], \"s\": \"4958632c\", \"i18n_labels\": {\"copyright\": \"\\u7531\\u6781\\u9a8c\\u63d0\\u4f9b\\u6280\\u672f\\u652f\\u6301\", \"error\": \"\\u7f51\\u7edc\\u4e0d\\u7ed9\\u529b\", \"error_content\": \"\\u8bf7\\u70b9\\u51fb\\u6b64\\u5904\\u91cd\\u8bd5\", \"error_title\": \"\\u7f51\\u7edc\\u8d85\\u65f6\", \"fullpage\": \"\\u667a\\u80fd\\u68c0\\u6d4b\\u4e2d\", \"goto_cancel\": \"\\u53d6\\u6d88\", \"goto_confirm\": \"\\u524d\\u5f80\", \"goto_homepage\": \"\\u662f\\u5426\\u524d\\u5f80\\u9a8c\\u8bc1\\u670d\\u52a1Geetest\\u5b98\\u7f51\", \"loading_content\": \"\\u667a\\u80fd\\u9a8c\\u8bc1\\u68c0\\u6d4b\\u4e2d\", \"next\": \"\\u6b63\\u5728\\u52a0\\u8f7d\\u9a8c\\u8bc1\", \"next_ready\": \"\\u8bf7\\u5b8c\\u6210\\u9a8c\\u8bc1\", \"read_reversed\": false, \"ready\": \"\\u70b9\\u51fb\\u6309\\u94ae\\u8fdb\\u884c\\u9a8c\\u8bc1\", \"refresh_page\": \"\\u9875\\u9762\\u51fa\\u73b0\\u9519\\u8bef\\u5566\\uff01\\u8981\\u7ee7\\u7eed\\u64cd\\u4f5c\\uff0c\\u8bf7\\u5237\\u65b0\\u6b64\\u9875\\u9762\", \"reset\": \"\\u8bf7\\u70b9\\u51fb\\u91cd\\u8bd5\", \"success\": \"\\u9a8c\\u8bc1\\u6210\\u529f\", \"success_title\": \"\\u901a\\u8fc7\\u9a8c\\u8bc1\"}}})")
|
||||
} else {
|
||||
_, _ = context.Writer.WriteString(callback + "({\"gt\": \"16bddce04c7385dbb7282778c29bba3e\", \"challenge\": \"616018607b6940f52fbd349004038686is\", \"id\": \"a616018607b6940f52fbd349004038686\", \"bg\": \"pictures/gt/a330cf996/bg/86f9db021.jpg\", \"fullbg\": \"pictures/gt/a330cf996/a330cf996.jpg\", \"link\": \"\", \"ypos\": 56, \"xpos\": 0, \"height\": 160, \"slice\": \"pictures/gt/a330cf996/slice/86f9db021.png\", \"api_server\": \"https://api-na.geetest.com/\", \"static_servers\": [\"static.geetest.com/\", \"dn-staticdown.qbox.me/\"], \"mobile\": true, \"theme\": \"ant\", \"theme_version\": \"1.2.6\", \"template\": \"\", \"logo\": false, \"clean\": false, \"type\": \"multilink\", \"fullpage\": false, \"feedback\": \"\", \"show_delay\": 250, \"hide_delay\": 800, \"benchmark\": false, \"version\": \"6.0.9\", \"product\": \"embed\", \"https\": true, \"width\": \"100%\", \"c\": [12, 58, 98, 36, 43, 95, 62, 15, 12], \"s\": \"6c722c65\", \"so\": 0, \"i18n_labels\": {\"cancel\": \"\\u53d6\\u6d88\", \"close\": \"\\u5173\\u95ed\\u9a8c\\u8bc1\", \"error\": \"\\u8bf7\\u91cd\\u8bd5\", \"fail\": \"\\u8bf7\\u6b63\\u786e\\u62fc\\u5408\\u56fe\\u50cf\", \"feedback\": \"\\u5e2e\\u52a9\\u53cd\\u9988\", \"forbidden\": \"\\u602a\\u7269\\u5403\\u4e86\\u62fc\\u56fe\\uff0c\\u8bf7\\u91cd\\u8bd5\", \"loading\": \"\\u52a0\\u8f7d\\u4e2d...\", \"logo\": \"\\u7531\\u6781\\u9a8c\\u63d0\\u4f9b\\u6280\\u672f\\u652f\\u6301\", \"read_reversed\": false, \"refresh\": \"\\u5237\\u65b0\\u9a8c\\u8bc1\", \"slide\": \"\\u62d6\\u52a8\\u6ed1\\u5757\\u5b8c\\u6210\\u62fc\\u56fe\", \"success\": \"sec \\u79d2\\u7684\\u901f\\u5ea6\\u8d85\\u8fc7 score% \\u7684\\u7528\\u6237\", \"tip\": \"\\u8bf7\\u5b8c\\u6210\\u4e0b\\u65b9\\u9a8c\\u8bc1\", \"voice\": \"\\u89c6\\u89c9\\u969c\\u788d\"}, \"gct_path\": \"/static/js/gct.e7810b5b525994e2fb1f89135f8df14a.js\"})")
|
||||
}
|
||||
}
|
||||
|
||||
// POST https://api-na.geetest.com/ajax.php?gt=16bddce04c7385dbb7282778c29bba3e&challenge=616018607b6940f52fbd349004038686&client_type=android&lang=zh-CN HTTP/1.1
|
||||
// GET https://api-na.geetest.com/ajax.php?gt=16bddce04c7385dbb7282778c29bba3e&challenge=616018607b6940f52fbd349004038686is&lang=zh-CN&%24_BBF=3&client_type=web_mobile&w=PfYYA2GvlGseUHihdCmj)zaqrm25077bIOmGUGPIE9iZeyx(T)h29Wi5lCT0NnfqqmFbrfAey3fhYJPxTbEKFOufaGHcSWdzt9Yl6bhmRN1cAwJdMP1qGKbj9SaJ0O4BKqpug6XnYg76akehubqBadKqJHV(Ns8qs6b860IBfFr80xOLZaE5rxf3nKxbF49Hgi25jXIptXp5XCqfkK1alQiK0L(5k4lxKYQU1om)VpUT8QZoHsCNbb38v3Hg75rhcufPzlVMEXz81QbdUyewvMc0RETPTQoKT6yiHFDs81JAwUIXuPkESUNdThU(cVINr5mQugprlBdLniFKKpHdI4ll)F4JvbZjFrDZOU5JV)MsQ2r2gfr(8GVseuZxEy32L(9KI8vwCS(6I50MPPUK2MxmovU5CtqmlaPHbNIVYYTQpRrvteXTz6CNipIBb1J0ntaVERBD90Cb)wDNenv3bDbeFgtT8J5MqZXEYItUG5CsbLjf)eEZQrfxw6FZz3sB5ojzdjal(uw4XIjsCG9s3Z4Jzden8uB0yIJy4Zr(ZoO47)tCvqRsKNF(RgXadSj9tJDjP74p9Kg2dBO95(BRABSKBJe1DJkK9WgomUomOXmS0Dfg)d9N6svt0IZC47XpiLk(600fHQiHXhLRZveCuVbARzk9vsY1DfI4PvcQjHmt6dyPR8xhVp91agaK)wJ3f5CXs(hEAFtDIBsp4LIqt6FWe3)BNvMSl1Is(289vQLbGA1Fch4Y8Yju871Z4FpUhDTu)5EuqVUSB2I9okGM9sLusQxBCuRzJrYv61AU0GmxEfpOG0Wot3QZCIQtvOgHC)3BWgnH2r63)D9QsJioreDm8XXOVT3WaBpfBFZ6h9Sfa03)RNIAsFj)xCy4XlvU8d40873cdf12703609069897655331054c1e221a1578dac4a87711be90588f6709f07a05722392de452d8923508015d7241ec139a06eae32dc63263269e81d37297db69e21df57aeae15d9f57fb93846a083821bafc4e5d4eaa2d904e8e233cddfac0d94989af753680d09e4360f1ce4088172829608e5139862ae5ec7c5ec6f&callback=geetest_1651516385963 HTTP/1.1
|
||||
func (c *Controller) ajax(context *gin.Context) {
|
||||
context.Header("Content-type", "text/javascript;charset=UTF-8")
|
||||
callback := context.Query("callback")
|
||||
if len(callback) == 0 {
|
||||
_, _ = context.Writer.WriteString("{\"status\": \"success\", \"data\": {\"result\": \"slide\"}}")
|
||||
} else {
|
||||
_, _ = context.Writer.WriteString(callback + "({\"success\": 1, \"message\": \"success\", \"validate\": \"af90d1ba691970f759a3c60c908c1499\", \"score\": \"1\"})")
|
||||
}
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/static/appweb/app3-index.html?gt=16bddce04c7385dbb7282778c29bba3e&challenge=616018607b6940f52fbd349004038686&lang=zh-CN&title=&type=slide&api_server=api-na.geetest.com&static_servers=static.geetest.com,%20dn-staticdown.qbox.me&width=100%&timeout=10000&debug=false&aspect_radio_voice=128&aspect_radio_slide=103&aspect_radio_beeline=50&aspect_radio_pencil=128&aspect_radio_click=128&voice=/static/js/voice.1.2.0.js&slide=/static/js/slide.7.8.6.js&beeline=/static/js/beeline.1.0.1.js&pencil=/static/js/pencil.1.0.3.js&click=/static/js/click.3.0.4.js HTTP/1.1
|
||||
func (c *Controller) app3Index(context *gin.Context) {
|
||||
context.Header("Content-type", "text/html")
|
||||
_, _ = context.Writer.WriteString("<!doctype html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <meta name=\"renderer\" content=\"webkit\">\n <meta name=\"viewport\" id=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\"/>\n <title>请通过以下验证</title>\n <style>\n body {\n margin: 0;\n }\n .title {\n margin: 15px;\n font-size: 18px;\n line-height: 18px;\n height: 18px;\n }\n #log {\n margin: 10px;\n display: none;\n word-break: break-all;\n }\n\n #log.log {\n display: block;\n }\n\n #log p {\n }\n #loading {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: none;\n }\n </style>\n</head>\n<body>\n<div id=\"captcha\"></div>\n<div id=\"log\"></div>\n<div id=\"loading\">\n <svg version=\"1.1\" id=\"loader-1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"40px\" height=\"40px\" viewBox=\"0 0 50 50\" style=\"enable-background:new 0 0 50 50;\" xml:space=\"preserve\">\n <path fill=\"#c7c5c5\" d=\"M43.935,25.145c0-10.318-8.364-18.683-18.683-18.683c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615c8.072,0,14.615,6.543,14.615,14.615H43.935z\" transform=\"rotate(340 25 25)\">\n <animateTransform attributeType=\"xml\" attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\" dur=\"0.6s\" repeatCount=\"indefinite\"></animateTransform>\n </path>\n </svg>\n</div>\n<script>\n var debug = false;\n var setDebug = function () {\n debug = true;\n logEle.className = 'log';\n };\n var log = function (str) {\n if (!debug) {\n return;\n }\n var p = document.createElement('p');\n p.appendChild(document.createTextNode(str));\n logEle.insertBefore(p, logEle.firstChild);\n };\n var captcha = document.getElementById('captcha');\n var logEle = document.getElementById('log');\n var loadingEle = document.getElementById('loading');\n var head = document.getElementsByTagName('head')[0];\n var query = location.href.split('?')[1];\n\n if (!query) {\n setDebug();\n log('no query: ' + location.href);\n }\n\n var parse = function (str) {\n var args = {};\n var items = str.split('&');\n for (var i = 0, len = items.length; i < len; i = i + 1) {\n var temp = items[i].split('=');\n args[temp[0]] = temp[1];\n }\n return args;\n };\n\n\n var args = parse(query);\n\n if (args['title'] && args['title'] != \"\") {\n var h3 = document.createElement('h3');\n h3.className = 'title';\n h3.appendChild(document.createTextNode(decodeURIComponent(args['title'])));\n captcha.appendChild(h3);\n }\n\n if (!args['gt']\n || !args['challenge']\n || !args['type']\n || !args[args['type']]) {\n setDebug(true);\n log('args error: ' + query);\n }\n\n if (args['debug'] === 'true'\n || args['debug'] === '1') {\n setDebug(true);\n log(JSON.stringify(args));\n }\n if (debug) {\n window.startTime = (new Date()).getTime();\n }\n\n var config = {\n is_next: true,\n mobile: true,\n product: 'embed',\n width: '100%',\n https: location.protocol === 'https:'\n };\n\n for (var k in args) {\n if (args.hasOwnProperty(k) &&\n ['debug', 'title', 'static_servers', args['type']].indexOf(k) === -1) {\n config[k] = args[k];\n }\n }\n\n var js = args[args['type']];\n\n var static_servers = ['static.geetest.com', 'dn-staticdown.qbox.me'];\n if (args['static_servers']) {\n static_servers = args['static_servers'].replace(/ /g, '').split(',');\n }\n\n var errorHandler = function (err) {\n log('Error Ocurred.');\n try {\n if (typeof JSInterface !== 'undefined') {\n \tif (typeof JSInterface.gtError === 'function') {\n \tJSInterface.gtError();\n \t}\n\t if (typeof JSInterface.gt3Error === 'function') {\n\t \tJSInterface.gt3Error(JSON.stringify(err))\n\t }\n }\n loadingEle.style.display = 'none'\n } catch (e) {\n log(e.name + ': ' + e.message);\n }\n try {\n if (window.webkit\n && window.webkit.messageHandlers) {\n \terr = err || {};\n\t err.error = '1';\n\t var message = JSON.stringify(err);\n \tif (window.webkit.messageHandlers.gtError) {\n\t window.webkit.messageHandlers.Line truncated
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/static/js/slide.7.8.6.js HTTP/1.1
|
||||
func (c *Controller) slideJs(context *gin.Context) {
|
||||
context.Header("Content-type", "application/javascript")
|
||||
_, _ = context.Writer.WriteString("lTloj.$_AG=function(){var $_DBHEx=2;for(;$_DBHEx!==1;){switch($_DBHEx){case 2:return{$_DBHFa:function($_DBHGk){var $_DBHHK=2;for(;$_DBHHK!==14;){switch($_DBHHK){case 5:$_DBHHK=$_DBHIj<$_DBHJq.length?4:7;break;case 2:var $_DBIAz='',$_DBHJq=decodeURI('%0D%0F:w%037%13%0E%1CD9%06%5B%0FH%06y7N5%0D%7B%22%07%5C$%1CE%15Mv%13:x%15%0C%5B%22%16D%14X%19%60\\'S9%1BF%22\\'%E4%BC%96%E7%BA%92%E5%91%AD%E5%9B%B7%E8%B1%93%E7%9B%BD%E5%8F%B4%E6%94%BB%E4%B9%A4%E6%98%86%E5%86%AD%E6%94%89%E7%B1%8D%E5%9F%80%EF%BD%B3%E8%AF%9E%E4%BD%B0%E5%84%9C%E5%87%8B%E6%94%BB%E7%B0%92%E5%9E%A2%E5%8E%92%E6%94%89h%E5%89%BC%E6%97%99%E9%AA%A5%E8%AE%91\\'%12%14*c&\\'%12%14*o%1B\\'T$%06E5%18X%15%0D%5B1%0E%7F&%08N5\\'%12%14*%60%09\\'S3%19F%22%0DE%15%0F%5C%3E%1AB%22%06G%0E%1DW?%08w%17%1CS?%0CZ$YD.%18%5C9%0BS8IHp%0E_%25%0DF\\'YA%22%1DAp%18%16/%06J%25%14S%25%1Dwt&u%0F%10w%7F%1ES?GY8%09%E8%AF%81%E6%B0%89%E6%8B%8C%E9%94%B0%EF%BD%8AH%18%E8%AE%BC%E4%BE%B4%E6%8C%A8%E7%BC%81%E7%BA%A5%E7%95%B3%E9%81%91%EF%BD%B2%1B~%E6%A2%B9%E6%9F%93%E5%89%96%E5%A6%A2%E5%8C%BF%E6%96%A6%E4%BD%99%E5%85%93%E7%9B%8F%E9%84%A4%E7%BD%87%E5%8E%92%E6%94%89Q?%E5%93%A5J8%18Z\\'%0CG7%1Ch%E5%8B%AB%E8%BC%94%E4%B8%84~W%18%15%E5%B9%87%E5%8A%80%E5%8E%9D%E9%A7%B1h/%08%5D1C_&%08N5VA.%0BYk%1BW8%0C%1FdUc%20%05n%02%10%02%0A(h%12!d%1E#x%06%15w%7F=j%158w%0A(_%11,w%0A,kh%0Ew%22$%5E%11%1Ee%18\\'%5D#%1C%19(1C(%00u%08%04%5B%097a%1B%1ED%18+~r%03%5E%1D8h$%0BC5%1AB%15%0EL$?C\\'%05p5%18D%15%04Z7\\'R.%1DH9%15h(%08G&%18E%15%5BM%0E%1CD9%06%5B%0FH%06%7F7%1F%60Mh8%1D%5B9%17Q%15Mv%13;%60%157%00%0E%11_/%0DL%3E\\'C9%05%01%0E%1DY(%1CD5%17B%15Iw\\'%10R?%01w5%0BD$%1BvaI%05%15%E8%A6%AF%E8%A7%A0%E9%9B%8C%E7%A3%B4hkDw%E6%8A%86%E5%8B%91%E6%BB%A7%E5%9C%9C%E5%B1%AF%E6%82%85%E6%B4%BE%E5%9A%87%E5%83%B9%E6%AC%A8%E7%A0%87%E6%8B%95%E5%91%98\\'%06%15%1FH%3C%0CS%04%0Fw%05%0AS9*H%3C%15t*%0AB%15%0BD$%1Bw%E5%92%97%E5%92%9F%EF%BD%A8%E6%81%A1%E7%88%80%E5%90%AA%E4%BB%96%E6%8A%85%E5%9B%88kZ%09%E7%A6%82%E5%91%B7%E9%87%BB%E8%AE%9E7%E9%85%A4%E7%BC%BE%E5%8E%BB%E6%95%86,%1D%E6%9C%A0%E8%AE%BF%EF%BD%A3%E8%AF%81%E6%A2%8B%E6%9E%8C%E5%88%B4%E5%A6%9B%E5%8D%AF%E6%97%80%E4%BD%AB%E5%84%8C%E7%9A%AD%E9%84%9D%E7%BC%97%E5%8F%B4%E6%94%BB%0E%5D%EF%BD%98%E5%AE%80%E5%BA%A2%E7%95%B8%E8%AE%9E%E6%97%9F%E7%9B%940r%EF%BD%827%5B5%09Z*%0AL%0E%11W8&%5E%3E)D$%19L%22%0DO%15%E6%8A%BF%E5%8A%81%E5%B6%B6%E8%BF%80%E6%BB%A7%E5%9C%9C%E5%AF%A5%E6%88%B9%E4%B9%9A%E6%97%80%E6%8B%8A%E5%9A%B57%E4%BC%89%E7%BA%89%1B_%25%0Df%3E%E6%8F%9C%E5%8F%95%E7%9B%8F%E5%8E%AB%E6%95%99%E6%9D%99%E8%AE%96%EF%BC%AC%E5%8E%A1%E6%8F%8C%E5%8F%BE9%1D%E9%80%BF%E6%8A%A2%E5%98%81%E5%92%A5%146%7B%E5%84%88%E7%B5%89%EF%BC%A5%E5%B8%A6%E4%B9%AD%E9%9C%B6%E4%BE%96%E8%AE%A8%E5%85%9F%E5%AC%88%E5%9D%91%E4%BA%B8%E9%A0%BE%E9%9C%8B%E4%B8%84%0E%5Di%09%20d%0E%0DO;%0Cw%E5%84%A3%E9%96%94%E9%AA%BA%E8%AE%8A7Z%20%15_?7%0D%0F:s%227%5C%3E%1DS-%00G5%1Dh%E4%BD%AB%E7%BA%B0H%20%09S%25%0D%7D?%E6%8F%9C%E5%8F%95%E7%9B%8F%E5%8E%AB%E6%95%99%E6%9D%99%E8%AE%96%EF%BC%AC%E5%8E%A1%E6%8F%8C%E5%8F%BE9%1D%E9%80%BF%E6%8A%A2%E5%98%81%E5%92%A5%146%7B%E5%84%88%E7%B5%89%EF%BC%A5%E5%B8%A6%E4%B9%AD%E9%9C%B6%E4%BE%96%E8%AE%A8%E5%85%9F%E5%AC%88%E5%9D%91%E4%BA%B8%E9%A0%BE%E9%9C%8B%E4%B8%84%0E%1ES?!F%25%0BE%15%06G%3C%16W/7%E8%AF%9E%E5%84%A3%E9%96%94%E9%AA%BA%E8%AE%8A%E9%86%A4%E8%AF%BC%0E%0DY%0D%00Q5%1Dho6m%112h/%00_%0E%09C?%20D1%1ES%0F%08%5D1\\'_%25%19%5C$\\'%18%15%0EL$0%5B*%0EL%14%18B*7%061%13W3GY8%09%E8%AF%81%E6%B0%89%E6%8B%8C%E9%94%B0%EF%BD%8AH%18%E8%AE%BC%E4%BE%B4%E6%8C%A8%E7%BC%81%E7%BA%A5%E7%95%B3%E9%81%91%EF%BD%B2%1B~%E8%AE%8E%E8%81%A2%E7%B2%B0%E6%9F%A8%E9%AA%A5%E5%AF%88%E7%BC%A8%E5%AE%94%E6%9D%867J%22%1CW?%0Cl%3C%1C%5B.%07%5D%0E%11S%22%0EA$\\'F37N5%0Db%22%04L%0E%0BW%25%0DF=\\'Q.%1Dj?%17B.%11%5D%0E%1CD9%06%5B%0FH%06z7L%22%0BY96J?%1DS%15%0EL$4Y%25%1DA%0E%3ES.%1DL#%0Ds9%1BF%22\\'F$%1A%5D%0E%E7%95%88%E6%9E%B7%E9%AB%87%E6%8E%B9%E4%BE%B2%E6%8B%90%E6%9D%96%E6%94%99%E6%8D%8A7%07%7F%0CE.%1BJ1%15Z)%08J;Vho6k%1A%16h8%0CJp%E7%A6%AB%E7%9A%B2%E9%81%94%E5%BB%8F%E8%B6%AC%E8%BE%97YE(%06%5B5%5C%16%E7%9B%8F%E7%95%81%E6%88%9E%0E%5Di%08!%7C%0E%0AD(7%13p\\'Q.%1Dz5%1AY%25%0DZ%0E%0AB*%1D%5C#\\'C8%0C%5B%0F%1CD9%06%5B%0E%09D$%1DF3%16Z%15Mv#-O2%05L%0E%10%5B,7N5%0Dr*%1DL%0E%17C&%0BL%22\\'%12%14*n%17\\'%1B%15%06G5%0BD$%1Bw=%16X%22%1DF%22WQ.%0C%5D5%0ABe%0AF=V%5B$%07@$%16Dd%1AL%3E%1Dh8%0A%5B9%09B%15%E9%AB%A5%E8%AF%A8%E5%9A%AE%E7%88%BE%E5%8A%96%E8%BC%B6%E5%A5%98%E8%B4%8C%EF%BD%8AH%18%E8%AE%BC%E4%BE%B4%E6%8C%A8%E7%BC%81%E7%BA%A5%E7%95%B3%E9%81%91%EF%BD%B2%1B~%E8%AE%8E%E8%81%A2%E7%B2%B0%E6%9F%A8%E9%AA%A5%E5%AF%88%E7%BC%A8%E5%AE%94%E6%9D%867Z$%00Z.%1AA5%1CB%15%0C%5B%22%16D%14X%19e\\'U$%0DL%0E%E9%84%B4%E7%BD%98%E9%8D%A4%E8%AB%8Dw#%0DW(%02wo\\'S9%1BF%22&%07zYw%E6%9D%9D%E5%8B%98%E7%AB%99-%06%5B2%10R/%0CG%EF%BD%8AY%E8%AF%81%E8%80%9F%E7%B2%92%E6%9E%A8%E9%AB%9C%E5%AF%A1%E7%BD%A7%E5%AF%A9%E6%9D%A4w1\\'%12%14-j1\\'U\\'%0CH%22-_&%0CF%25%0Dh.%1B%5B?%0BizX%18%0E%11%5D%15%1DF%1C%16A.%1Bj1%0AS%15%0F@%3C%1CX*%04L%0E%1ES.%1DL#%0Di%15%05H%3E%1Eho6m%16%0Bho6m%15%0Bh(%01H%228B%15Tw%E9%84%9D%E7%BC%97%E9%94%AF%E8%AE%A47%5D5%0AB%15%1AE9%1AS%15Zw%E7%B7%A2%E7%B4%98%E4%B8%BB%E7Line truncated
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/favicon.ico HTTP/1.1
|
||||
func (c *Controller) faviconIco(context *gin.Context) {
|
||||
context.Header("Content-type", "image/x-icon")
|
||||
context.Status(http.StatusOK)
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/static/js/gct.e7810b5b525994e2fb1f89135f8df14a.js HTTP/1.1
|
||||
func (c *Controller) js(context *gin.Context) {
|
||||
context.Header("Content-type", "application/javascript")
|
||||
_, _ = context.Writer.WriteString("(function(){AJRnz.BHI=function(){var rEv=2;for(;rEv!==1;){switch(rEv){case 2:return{som:function(tUN){var uNW=2;for(;uNW!==14;){switch(uNW){case 5:uNW=vdi<wcl.length?4:7;break;case 2:var xjA='',wcl=decodeURI('%0D9/%02%05%17%3C%3E%22%22%03%0A%0D/)%07%122:4%22%07)824%20=)2%1D%1F==%1D%03%07%17%19%11%16:75*=%1E\\'%1677%17%0E%0A:1sZ)%06%16%10%02%20#%11%17%04%25%083%07%0D%0E/%0A%04t1((%14%041!%7D4C%1E9#6%22%0E%12:\\';3%0A%18:s5!C869?$%17Y7!?&%17%12t:)g%02W\\';3*C%16:7z#%0C%12\\'=%7D3C%04!#*(%11%03tt42%0F%1Bss;4C%03%3C6z!%0A%05\\'\\'z&%11%10!%3E?)%17Y%0A0(%22%02%031%0D.(0%03&:4%20=%06!6/%22C%1E\\'s?*%13%03-%0D%3E%22%01%023%0D?7=%1869?$%17)1+*(%11%03\\'%0D%04%18%04%14%20%0D%15%25%09%127\\'z7%11%18%20%3C.%3E%13%12t%3E;%3EC%18:?#g%01%12t24g,%15%3E693YW%0A%0D??%25%10%0A?%08%0F%02)%0A%0D95!%1B%0A%0D%04%20%04)&29%22=!%25%22%08%19=#%3C:)g%01%05;$)%22%11P\\'s3*%13%1B1%3E?)%17%16%20:5)C%182s%15%25%09%127\\'t$%11%125\\'?g%0A%04t2z4%0B%1E9s;)%07W0%3C?4%0DP%20s)2%13%07;!.g%02W\\'69(%0D%13t2(%20%16%1A1=.i=)%0A%0D;3%10%0F%0A%09%3E%1D3)%0D!%0B%14=)%03%12%090=%12:%22/%22%16%12%0A%0D%04%19%0F%12:4./=%10%134;%19%08%1A%13%03%04)%06%0F%20%0D*(%10%1E%20:5)=,;10%22%00%03t%1C8-%06%14%20%0E%04%19=)%20;?)=)%0A26+=%06!6(%3E=%1B5%20.%11%02%1B%0A%01%1F%14,;%02%16%1E%19%06%1B1%0D;#%07%1E%20:5)=%12&!55=%11!=93%0A%18:%0D%04#%06%06!6/%22=)0%3C73=\\'%11%1D%1E%0E-0%0A%3E/+%17%1E$?3$%02%03=%3C4%19;%22%18%05%04*%0A%130??%19=Zy%0D%04.%12-%0E%0D%1D%22%06%031%20.%19%00%1B12(%19%13%05;\\'53%1A%071%0D%04/1%1E%3E%0D)3%06%07%0A%0D)7%0F%1E%20%0D;*%07)%0A6;$%0B);&.4%0A%131%0D%04%19%00%168?%04%19N)%0A:4)%06%05');uNW=1;break;case 1:var vdi=0,yAn=0;uNW=5;break;case 4:uNW=yAn===tUN.length?3:9;break;case 8:vdi++,yAn++;uNW=5;break;case 3:yAn=0;uNW=9;break;case 9:xjA+=String.fromCharCode(wcl.charCodeAt(vdi)^tUN.charCodeAt(yAn));uNW=8;break;case 7:xjA=xjA.split('^');return function(AJd){var BDG=2;for(;BDG!==1;){switch(BDG){case 2:return xjA[AJd];break;}}};break;}}}('SZGcwT')};break;}}}();AJRnz.CLZ=function(){var CNd=2;for(;CNd!==1;){switch(CNd){case 2:return{Dmb:function EEB(Fxj,GFw){var HFN=2;for(;HFN!==10;){switch(HFN){case 4:IMU[(JcF+GFw)%Fxj]=[];HFN=3;break;case 13:KSB-=1;HFN=6;break;case 9:var LJw=0;HFN=8;break;case 8:HFN=LJw<Fxj?7:11;break;case 12:LJw+=1;HFN=8;break;case 6:HFN=KSB>=0?14:12;break;case 1:var JcF=0;HFN=5;break;case 2:var IMU=[];HFN=1;break;case 3:JcF+=1;HFN=5;break;case 14:IMU[LJw][(KSB+GFw*LJw)%Fxj]=IMU[KSB];HFN=13;break;case 5:HFN=JcF<Fxj?4:9;break;case 7:var KSB=Fxj-1;HFN=6;break;case 11:return IMU;break;}}}(16,4)};break;}}}();AJRnz.DUy=function(){return typeof AJRnz.BHI.som==='function'?AJRnz.BHI.som.apply(AJRnz.BHI,arguments):AJRnz.BHI.som;};AJRnz.EfW=function(){return typeof AJRnz.CLZ.Dmb==='function'?AJRnz.CLZ.Dmb.apply(AJRnz.CLZ,arguments):AJRnz.CLZ.Dmb;};function AJRnz(){}!function(){(function(t,e){var nsDE=AJRnz.DUy,mtCGEK=['qXEUs'].concat(nsDE),ojBj=mtCGEK[1];mtCGEK.shift();var pQaE=mtCGEK[0];typeof exports===ojBj(19)&&typeof module!==ojBj(3)?module[nsDE(20)]=e():typeof UwoC===ojBj(68)&&UwoC[nsDE(89)]?UwoC(nsDE(81),e):(t=typeof globalThis!==nsDE(3)?globalThis:t||self,t[nsDE(22)]=e());}(this,function(){var sTok=AJRnz.DUy,rOWZox=['vpvte'].concat(sTok),tBTs=rOWZox[1];rOWZox.shift();var upuN=rOWZox[0];'use strict';var e=sTok(10);function FHLl(e){var MYD=AJRnz.EfW()[0][14];for(;MYD!==AJRnz.EfW()[8][13];){switch(MYD){case AJRnz.EfW()[8][14]:var n=1;var r=tBTs(97);var i=tBTs(97);var o=tBTs(97);var e=e;function GacW(){var NNh=AJRnz.EfW()[0][14];for(;NNh!==AJRnz.EfW()[0][13];){switch(NNh){case AJRnz.EfW()[4][14]:try{if(e[sTok(8)][sTok(49)]){e[tBTs(34)]({\"\\u0070\\u006f\\u0073\\u0069\\u0074\\u0069\\u006f\\u006e\":n,\"\\u0069\\u006e\\u006e\\u0065\\u0072\":r,\"\\u006d\\u0069\\u0064\\u0064\\u006c\\u0065\":i,\"\\u006f\\u0075\\u0074\\u0073\\u0069\\u0064\\u0065\":o});}}catch(t){}NNh=AJRnz.EfW()[8][13];break;}}}return{\"\\u0063\\u0063\":GacW};break;}}}function Hwqs(e){var Osi=AJRnz.EfW()[4][14];for(;Osi!==AJRnz.EfW()[4][13];){switch(Osi){case AJRnz.EfW()[0][14]:var n=5;var r=tBTs(78);var i=tBTs(78);var o=tBTs(78);var e=e;function GacW(){var PZx=AJRnz.EfW()[4][14];for(;PZx!==AJRnz.EfW()[4][13];){switch(PZx){case AJRnz.EfW()[0][14]:try{if(e[tBTs(8)][tBTs(49)]){e[sTok(34)]({\"\\u0070\\u006f\\u0073\\u0069\\u0074\\u0069\\u006f\\u006e\":n,\"\\u0069\\u006e\\u006e\\u0065\\u0072\":r,\"\\u006d\\u0069\\u0064\\u0064\\u006c\\u0065\":i,\"\\u006f\\u0075\\u0074\\u0073\\u0069\\u0064\\u0065\":o});}}catch(t){}PZx=AJRnz.EfW()[8][13];break;}}}return{\"\\u0063\\u0063\":GacW};break;}}}function IEQg(e){var QZA=AJRnz.EfW()[8][14];for(;QZA!==AJRnz.EfW()[8][13];){switch(QZA){case AJRnz.EfW()[8][14]:var n=4;var r=tBTs(97);var i=sTok(78);var o=sTok(78);var e=e;function GacW(){var RpS=AJRnz.EfW()[8][14];for(;RpS!==AJRnz.EfW()[4][13];){switch(RpS){case AJRnz.EfW()[8][14]:try{if(e[sTok(8)][tBTs(49)]){e[sTok(34)]({\"\\u0070\\u006f\\u0073\\u0069\\u0074\\u0069\\u006f\\u006e\":n,\"\\u0069\\u006e\\u006e\\u0065\\u0072\":r,\"\\u006d\\u0069\\u0064\\u0064Line truncated
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/static/ant/style_https.1.2.6.css HTTP/1.1
|
||||
func (c *Controller) css(context *gin.Context) {
|
||||
context.Header("Content-type", "text/css")
|
||||
_, _ = context.Writer.WriteString(".geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window .geetest_loading .geetest_loading_icon,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider .geetest_slider_button,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider.geetest_move .geetest_slider_button,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider.geetest_move .geetest_slider_button:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_close,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_close:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_refresh_1,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_refresh_1:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_feedback,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_feedback:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_voice,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_voice:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel .geetest_copyright .geetest_logo{background-repeat:no-repeat;background-image:url('./sprite.1.2.6.png');_background-image:url('./sprite.1.2.6.gif')}@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 192dpi), (min-resolution: 1.5dppx){.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window .geetest_loading .geetest_loading_icon,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider .geetest_slider_button,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider.geetest_move .geetest_slider_button,.geetest_holder.geetest_mobile.geetest_ant .geetest_slider.geetest_move .geetest_slider_button:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_close,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_close:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_refresh_1,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_refresh_1:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_feedback,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_feedback:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_voice,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel a.geetest_voice:hover,.geetest_holder.geetest_mobile.geetest_ant .geetest_panel .geetest_copyright .geetest_logo{background-image:url('./sprite2x.1.2.6.png');_background-image:url('./sprite2x.1.2.6.gif')}}.geetest_holder.geetest_mobile.geetest_ant{position:relative;width:278px;touch-action:none}.geetest_holder.geetest_mobile.geetest_ant.geetest_embed{background-color:white}.geetest_holder.geetest_mobile.geetest_ant .geetest_absolute{position:absolute;left:0;top:0;width:100%;height:100%}.geetest_holder.geetest_mobile.geetest_ant .geetest_animate{-moz-transition:left .5s,-moz-transform .5s;-o-transition:left .5s,-o-transform .5s;-webkit-transition:left .5s,-webkit-transform .5s;transition:left .5s,transform .5s}.geetest_holder.geetest_mobile.geetest_ant .geetest_fade{-moz-transition:opacity .5s;-o-transition:opacity .5s;-webkit-transition:opacity .5s;transition:opacity .5s}.geetest_holder.geetest_mobile.geetest_ant *{font-family:\"PingFangSC-Regular\", \"Open Sans\", Arial, \"Hiragino Sans GB\", \"Microsoft YaHei\", \"STHeiti\", \"WenQuanYi Micro Hei\", SimSun, sans-serif;text-align:left}.geetest_holder.geetest_mobile.geetest_ant .geetest_wrap{width:100%;padding:3.237% 0 0 0;margin:0}.geetest_holder.geetest_mobile.geetest_ant .geetest_widget{margin:0 3.24%;width:93.53%;-moz-transition:padding-bottom .3s ease;-o-transition:padding-bottom .3s ease;-webkit-transition:padding-bottom .3s ease;transition:padding-bottom .3s ease}.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window{position:relative;left:0;top:0;height:0;width:100%;padding-bottom:61.54%;overflow:hidden}.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window a.geetest_link{font-size:0;display:block;height:100%;width:100%}.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window a.geetest_link .geetest_div_fullbg,.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window a.geetest_link .geetest_div_bg{background-color:#f2ece1}.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window a.geetest_link .geetest_div_fullbg div,.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window a.geetest_link .geetest_div_bg div{float:left;width:10px;height:50%}.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window a.geetest_link .geetest_slice{position:absolute;background-size:contain}.geetest_holder.geetest_mobile.geetest_ant .geetest_widget .geetest_window .geetest_flash::afterLine truncated
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/pictures/gt/a330cf996/a330cf996.webp HTTP/1.1
|
||||
func (c *Controller) webp(context *gin.Context) {
|
||||
context.Header("Content-type", "image/webp")
|
||||
file, err := os.ReadFile("static/a330cf996.webp")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open a330cf996.webp error")
|
||||
return
|
||||
}
|
||||
_, _ = context.Writer.Write(file)
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/pictures/gt/a330cf996/bg/86f9db021.webp HTTP/1.1
|
||||
func (c *Controller) bgWebp(context *gin.Context) {
|
||||
context.Header("Content-type", "image/webp")
|
||||
file, err := os.ReadFile("static/86f9db021.webp")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open 86f9db021.webp error")
|
||||
return
|
||||
}
|
||||
_, _ = context.Writer.Write(file)
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/pictures/gt/a330cf996/slice/86f9db021.png HTTP/1.1
|
||||
func (c *Controller) slicePng(context *gin.Context) {
|
||||
context.Header("Content-type", "image/png")
|
||||
file, err := os.ReadFile("static/86f9db021.png")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open 86f9db021.png error")
|
||||
return
|
||||
}
|
||||
_, _ = context.Writer.Write(file)
|
||||
}
|
||||
|
||||
// GET https://static.geetest.com/static/ant/sprite2x.1.2.6.png HTTP/1.1
|
||||
func (c *Controller) sprite2xPng(context *gin.Context) {
|
||||
context.Header("Content-type", "image/png")
|
||||
file, err := os.ReadFile("static/sprite2x.1.2.6.png")
|
||||
if err != nil {
|
||||
logger.LOG.Error("open sprite2x.1.2.6.png error")
|
||||
return
|
||||
}
|
||||
_, _ = context.Writer.Write(file)
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package controller
|
||||
|
||||
import "github.com/gin-gonic/gin"
|
||||
|
||||
// POST https://log-upload-os.mihoyo.com/sdk/dataUpload HTTP/1.1
|
||||
func (c *Controller) sdkDataUpload(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// GET http://log-upload-os.hoyoverse.com/perf/config/verify?device_id=dd664c97f924af747b4576a297c132038be239291651474673768&platform=2&name=DESKTOP-EDUS2DL HTTP/1.1
|
||||
func (c *Controller) perfConfigVerify(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// POST http://log-upload-os.hoyoverse.com/perf/dataUpload HTTP/1.1
|
||||
func (c *Controller) perfDataUpload(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// POST http://overseauspider.yuanshen.com:8888/log HTTP/1.1
|
||||
func (c *Controller) log8888(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
|
||||
// POST http://log-upload-os.hoyoverse.com/crash/dataUpload HTTP/1.1
|
||||
func (c *Controller) crashDataUpload(context *gin.Context) {
|
||||
context.Header("Content-type", "application/json")
|
||||
_, _ = context.Writer.WriteString("{\"code\":0}")
|
||||
}
|
||||
@@ -0,0 +1,271 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"github.com/gin-gonic/gin"
|
||||
appConfig "hk4e/common/config"
|
||||
"hk4e/common/utils/endec"
|
||||
"hk4e/common/utils/httpclient"
|
||||
"hk4e/common/utils/random"
|
||||
"hk4e/dispatch/entity/api"
|
||||
"hk4e/dispatch/entity/db"
|
||||
"hk4e/logger"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type SdkUserLoginReq struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
|
||||
type SdkUserLoginRsp struct {
|
||||
Code int32 `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
AccessToken string `json:"access_token"`
|
||||
RefreshToken string `json:"refresh_token"`
|
||||
Data struct {
|
||||
Uid int32 `json:"uid"`
|
||||
Username string `json:"username"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
func (c *Controller) apiLogin(context *gin.Context) {
|
||||
requestData := new(api.LoginAccountRequestJson)
|
||||
err := context.ShouldBindJSON(requestData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse LoginAccountRequestJson error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
encPwdData, err := base64.StdEncoding.DecodeString(requestData.Password)
|
||||
if err != nil {
|
||||
logger.LOG.Error("decode password enc data error: %v", err)
|
||||
return
|
||||
}
|
||||
pwdPrivKey, err := endec.RsaParsePrivKey(c.pwdRsaKey)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse rsa key error: %v", err)
|
||||
return
|
||||
}
|
||||
pwdDecData, err := endec.RsaDecrypt(encPwdData, pwdPrivKey)
|
||||
useAtAtMode := false
|
||||
if err != nil {
|
||||
logger.LOG.Debug("rsa dec error: %v", err)
|
||||
logger.LOG.Debug("password rsa dec fail, fallback to @@ mode")
|
||||
useAtAtMode = true
|
||||
} else {
|
||||
logger.LOG.Debug("password dec: %v", string(pwdDecData))
|
||||
useAtAtMode = false
|
||||
}
|
||||
|
||||
responseData := api.NewLoginResult()
|
||||
|
||||
var username string
|
||||
var password string
|
||||
if useAtAtMode {
|
||||
// 账号格式检查 用户名6-20字符 密码8-20字符 用户名和密码公用account字段 第一次出现的@@视为分割标识 username@@password
|
||||
if len(requestData.Account) > 20+20+2 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名或密码长度超限"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
if !strings.Contains(requestData.Account, "@@") {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名同密码均填写到用户名输入框,填写格式为:用户名@@密码,密码输入框填写任意字符均可"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
atIndex := strings.Index(requestData.Account, "@@")
|
||||
username = requestData.Account[:atIndex]
|
||||
password = requestData.Account[atIndex+2:]
|
||||
} else {
|
||||
username = requestData.Account
|
||||
password = string(pwdDecData)
|
||||
}
|
||||
|
||||
if len(username) < 6 || len(username) > 20 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名为6-20位字符"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
if len(password) < 8 || len(password) > 20 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "密码为8-20位字符"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
ok, err := regexp.MatchString("^[a-zA-Z0-9]{6,20}$", username)
|
||||
if err != nil || !ok {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "用户名只能包含大小写字母和数字"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
// SDK账号登陆
|
||||
sdkUserLoginRsp, err := httpclient.Post[SdkUserLoginRsp](appConfig.CONF.Hk4e.LoginSdkUrl, &SdkUserLoginReq{
|
||||
Username: username,
|
||||
Password: password,
|
||||
}, "")
|
||||
// TODO 测试账号
|
||||
{
|
||||
sdkUserLoginRsp = &SdkUserLoginRsp{
|
||||
Code: 0,
|
||||
Msg: "",
|
||||
AccessToken: "",
|
||||
RefreshToken: "",
|
||||
Data: struct {
|
||||
Uid int32 `json:"uid"`
|
||||
Username string `json:"username"`
|
||||
}{
|
||||
Uid: 267042405,
|
||||
Username: "FlourishingWorld",
|
||||
},
|
||||
}
|
||||
err = nil
|
||||
}
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-1"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
if sdkUserLoginRsp.Code != 0 {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = sdkUserLoginRsp.Msg
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
// 登录成功
|
||||
account, err := c.dao.QueryAccountByField("username", username)
|
||||
if err != nil {
|
||||
logger.LOG.Error("query account from db error: %v", err)
|
||||
return
|
||||
}
|
||||
if account == nil {
|
||||
// 注册一个原神account
|
||||
playerID, err := c.dao.GetNextYuanShenUid()
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-2"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
regAccount := &db.Account{
|
||||
Uid: uint64(sdkUserLoginRsp.Data.Uid),
|
||||
Username: username,
|
||||
PlayerID: playerID,
|
||||
Token: base64.StdEncoding.EncodeToString(random.GetRandomByte(24)),
|
||||
ComboToken: "",
|
||||
}
|
||||
_, err = c.dao.InsertAccount(regAccount)
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-3"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.Account.Uid = strconv.FormatInt(int64(regAccount.Uid), 10)
|
||||
responseData.Data.Account.Token = regAccount.Token
|
||||
responseData.Data.Account.Email = regAccount.Username
|
||||
} else {
|
||||
// 生产新的token
|
||||
account.Token = base64.StdEncoding.EncodeToString(random.GetRandomByte(24))
|
||||
_, err := c.dao.UpdateAccountFieldByFieldName("uid", account.Uid, "token", account.Token)
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-4"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.Account.Uid = strconv.FormatInt(int64(account.Uid), 10)
|
||||
responseData.Data.Account.Token = account.Token
|
||||
responseData.Data.Account.Email = account.Username
|
||||
}
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
}
|
||||
|
||||
func (c *Controller) apiVerify(context *gin.Context) {
|
||||
requestData := new(api.LoginTokenRequest)
|
||||
err := context.ShouldBindJSON(requestData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse LoginTokenRequest error: %v", err)
|
||||
return
|
||||
}
|
||||
uid, err := strconv.ParseInt(requestData.Uid, 10, 64)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse uid error: %v", err)
|
||||
return
|
||||
}
|
||||
account, err := c.dao.QueryAccountByField("uid", uid)
|
||||
if err != nil {
|
||||
logger.LOG.Error("query account from db error: %v", err)
|
||||
return
|
||||
}
|
||||
responseData := api.NewLoginResult()
|
||||
if account == nil || account.Token != requestData.Token {
|
||||
responseData.Retcode = -111
|
||||
responseData.Message = "账号本地缓存信息错误"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.Account.Uid = requestData.Uid
|
||||
responseData.Data.Account.Token = requestData.Token
|
||||
responseData.Data.Account.Email = account.Username
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
}
|
||||
|
||||
func (c *Controller) v2Login(context *gin.Context) {
|
||||
requestData := new(api.ComboTokenReq)
|
||||
err := context.ShouldBindJSON(requestData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("parse ComboTokenReq error: %v", err)
|
||||
return
|
||||
}
|
||||
data := requestData.Data
|
||||
if len(data) == 0 {
|
||||
logger.LOG.Error("requestData.Data len == 0")
|
||||
return
|
||||
}
|
||||
loginData := new(api.LoginTokenData)
|
||||
err = json.Unmarshal([]byte(data), loginData)
|
||||
if err != nil {
|
||||
logger.LOG.Error("Unmarshal LoginTokenData error: %v", err)
|
||||
return
|
||||
}
|
||||
uid, err := strconv.ParseInt(loginData.Uid, 10, 64)
|
||||
if err != nil {
|
||||
logger.LOG.Error("ParseInt uid error: %v", err)
|
||||
return
|
||||
}
|
||||
responseData := api.NewComboTokenRes()
|
||||
account, err := c.dao.QueryAccountByField("uid", uid)
|
||||
if account == nil || account.Token != loginData.Token {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "token错误"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
// 生成新的comboToken
|
||||
account.ComboToken = random.GetRandomByteHexStr(20)
|
||||
_, err = c.dao.UpdateAccountFieldByFieldName("uid", account.Uid, "comboToken", account.ComboToken)
|
||||
if err != nil {
|
||||
responseData.Retcode = -201
|
||||
responseData.Message = "服务器内部错误:-1"
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
return
|
||||
}
|
||||
responseData.Message = "OK"
|
||||
responseData.Data.OpenID = loginData.Uid
|
||||
responseData.Data.ComboID = "0"
|
||||
responseData.Data.ComboToken = account.ComboToken
|
||||
context.JSON(http.StatusOK, responseData)
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/pkg/errors"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
dbEntity "hk4e/dispatch/entity/db"
|
||||
"hk4e/logger"
|
||||
)
|
||||
|
||||
func (d *Dao) GetNextYuanShenUid() (uint64, error) {
|
||||
db := d.db.Collection("player_id_counter")
|
||||
find := db.FindOne(context.TODO(), bson.D{{"_id", "default"}})
|
||||
item := new(dbEntity.PlayerIDCounter)
|
||||
err := find.Decode(item)
|
||||
if err != nil {
|
||||
if err == mongo.ErrNoDocuments {
|
||||
item := &dbEntity.PlayerIDCounter{
|
||||
ID: "default",
|
||||
PlayerID: 100000001,
|
||||
}
|
||||
_, err := db.InsertOne(context.TODO(), item)
|
||||
if err != nil {
|
||||
return 0, errors.New("insert new PlayerID error")
|
||||
}
|
||||
return item.PlayerID, nil
|
||||
} else {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
item.PlayerID++
|
||||
_, err = db.UpdateOne(
|
||||
context.TODO(),
|
||||
bson.D{
|
||||
{"_id", "default"},
|
||||
},
|
||||
bson.D{
|
||||
{"$set", bson.D{
|
||||
{"PlayerID", item.PlayerID},
|
||||
}},
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return item.PlayerID, nil
|
||||
}
|
||||
|
||||
func (d *Dao) InsertAccount(account *dbEntity.Account) (primitive.ObjectID, error) {
|
||||
db := d.db.Collection("account")
|
||||
id, err := db.InsertOne(context.TODO(), account)
|
||||
if err != nil {
|
||||
return primitive.ObjectID{}, err
|
||||
} else {
|
||||
_id, ok := id.InsertedID.(primitive.ObjectID)
|
||||
if !ok {
|
||||
logger.LOG.Error("get insert id error")
|
||||
return primitive.ObjectID{}, nil
|
||||
}
|
||||
return _id, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dao) DeleteAccountByUsername(username string) (int64, error) {
|
||||
db := d.db.Collection("account")
|
||||
deleteCount, err := db.DeleteOne(
|
||||
context.TODO(),
|
||||
bson.D{
|
||||
{"username", username},
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return deleteCount.DeletedCount, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dao) UpdateAccountFieldByFieldName(fieldName string, fieldValue any, fieldUpdateName string, fieldUpdateValue any) (int64, error) {
|
||||
db := d.db.Collection("account")
|
||||
updateCount, err := db.UpdateOne(
|
||||
context.TODO(),
|
||||
bson.D{
|
||||
{fieldName, fieldValue},
|
||||
},
|
||||
bson.D{
|
||||
{"$set", bson.D{
|
||||
{fieldUpdateName, fieldUpdateValue},
|
||||
}},
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return updateCount.ModifiedCount, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dao) QueryAccountByField(fieldName string, fieldValue any) (*dbEntity.Account, error) {
|
||||
db := d.db.Collection("account")
|
||||
find, err := db.Find(
|
||||
context.TODO(),
|
||||
bson.D{
|
||||
{fieldName, fieldValue},
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result := make([]*dbEntity.Account, 0)
|
||||
for find.Next(context.TODO()) {
|
||||
item := new(dbEntity.Account)
|
||||
err := find.Decode(item)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result = append(result, item)
|
||||
}
|
||||
if len(result) == 0 {
|
||||
return nil, nil
|
||||
} else {
|
||||
return result[0], nil
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"context"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
"hk4e/common/config"
|
||||
"hk4e/logger"
|
||||
)
|
||||
|
||||
type Dao struct {
|
||||
client *mongo.Client
|
||||
db *mongo.Database
|
||||
}
|
||||
|
||||
func NewDao() (r *Dao) {
|
||||
r = new(Dao)
|
||||
clientOptions := options.Client().ApplyURI(config.CONF.Database.Url)
|
||||
client, err := mongo.Connect(context.TODO(), clientOptions)
|
||||
if err != nil {
|
||||
logger.LOG.Error("mongo connect error: %v", err)
|
||||
return nil
|
||||
}
|
||||
r.client = client
|
||||
r.db = client.Database("gate_hk4e")
|
||||
return r
|
||||
}
|
||||
|
||||
func (d *Dao) CloseDao() {
|
||||
err := d.client.Disconnect(context.TODO())
|
||||
if err != nil {
|
||||
logger.LOG.Error("mongo close error: %v", err)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package api
|
||||
|
||||
type ComboTokenReq struct {
|
||||
AppID int `json:"app_id"`
|
||||
ChannelID int `json:"channel_id"`
|
||||
Data string `json:"data"`
|
||||
Device string `json:"device"`
|
||||
Sign string `json:"sign"`
|
||||
}
|
||||
|
||||
type LoginTokenData struct {
|
||||
Uid string `json:"uid"`
|
||||
Token string `json:"token"`
|
||||
Guest bool `json:"guest"`
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package api
|
||||
|
||||
type ComboTokenRes struct {
|
||||
Message string `json:"message"`
|
||||
Retcode int `json:"retcode"`
|
||||
Data LoginData `json:"data"`
|
||||
}
|
||||
|
||||
type LoginData struct {
|
||||
AccountType int `json:"account_type"`
|
||||
Heartbeat bool `json:"heartbeat"`
|
||||
ComboID string `json:"combo_id"`
|
||||
ComboToken string `json:"combo_token"`
|
||||
OpenID string `json:"open_id"`
|
||||
Data string `json:"data"`
|
||||
FatigueRemind any `json:"fatigue_remind"`
|
||||
}
|
||||
|
||||
func NewComboTokenRes() (r *ComboTokenRes) {
|
||||
r = &ComboTokenRes{
|
||||
Message: "",
|
||||
Retcode: 0,
|
||||
Data: LoginData{
|
||||
AccountType: 1,
|
||||
Heartbeat: false,
|
||||
ComboID: "",
|
||||
ComboToken: "",
|
||||
OpenID: "",
|
||||
Data: "{\"guest\":false}",
|
||||
FatigueRemind: nil,
|
||||
},
|
||||
}
|
||||
return r
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package api
|
||||
|
||||
type LoginAccountRequestJson struct {
|
||||
Account string `json:"account"`
|
||||
Password string `json:"password"`
|
||||
IsCrypto bool `json:"is_crypto"`
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package api
|
||||
|
||||
type LoginResult struct {
|
||||
Message string `json:"message"`
|
||||
Retcode int `json:"retcode"`
|
||||
Data VerifyData `json:"data"`
|
||||
}
|
||||
|
||||
type VerifyData struct {
|
||||
Account VerifyAccountData `json:"account"`
|
||||
DeviceGrantRequired bool `json:"device_grant_required"`
|
||||
RealnameOperation string `json:"realname_operation"`
|
||||
RealpersonRequired bool `json:"realperson_required"`
|
||||
SafeMobileRequired bool `json:"safe_mobile_required"`
|
||||
}
|
||||
|
||||
type VerifyAccountData struct {
|
||||
Uid string `json:"uid"`
|
||||
Name string `json:"name"`
|
||||
Email string `json:"email"`
|
||||
Mobile string `json:"mobile"`
|
||||
IsEmailVerify string `json:"is_email_verify"`
|
||||
Realname string `json:"realname"`
|
||||
IdentityCard string `json:"identity_card"`
|
||||
Token string `json:"token"`
|
||||
SafeMobile string `json:"safe_mobile"`
|
||||
FacebookName string `json:"facebook_name"`
|
||||
TwitterName string `json:"twitter_name"`
|
||||
GameCenterName string `json:"game_center_name"`
|
||||
GoogleName string `json:"google_name"`
|
||||
AppleName string `json:"apple_name"`
|
||||
SonyName string `json:"sony_name"`
|
||||
TapName string `json:"tap_name"`
|
||||
Country string `json:"country"`
|
||||
ReactivateTicket string `json:"reactivate_ticket"`
|
||||
AreaCode string `json:"area_code"`
|
||||
DeviceGrantTicket string `json:"device_grant_ticket"`
|
||||
}
|
||||
|
||||
func NewLoginResult() (r *LoginResult) {
|
||||
r = &LoginResult{
|
||||
Message: "",
|
||||
Retcode: 0,
|
||||
Data: VerifyData{
|
||||
Account: VerifyAccountData{
|
||||
Uid: "",
|
||||
Name: "",
|
||||
Email: "",
|
||||
Mobile: "",
|
||||
IsEmailVerify: "0",
|
||||
Realname: "",
|
||||
IdentityCard: "",
|
||||
Token: "",
|
||||
SafeMobile: "",
|
||||
FacebookName: "",
|
||||
TwitterName: "",
|
||||
GameCenterName: "",
|
||||
GoogleName: "",
|
||||
AppleName: "",
|
||||
SonyName: "",
|
||||
TapName: "",
|
||||
Country: "CN",
|
||||
ReactivateTicket: "",
|
||||
AreaCode: "**",
|
||||
DeviceGrantTicket: "",
|
||||
},
|
||||
DeviceGrantRequired: false,
|
||||
RealnameOperation: "None",
|
||||
RealpersonRequired: false,
|
||||
SafeMobileRequired: false,
|
||||
},
|
||||
}
|
||||
return r
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package api
|
||||
|
||||
type LoginTokenRequest struct {
|
||||
Uid string `json:"uid"`
|
||||
Token string `json:"token"`
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package api
|
||||
|
||||
type QueryCurRegionRspJson struct {
|
||||
Content string `json:"content"`
|
||||
Sign string `json:"sign"`
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package db
|
||||
|
||||
import "go.mongodb.org/mongo-driver/bson/primitive"
|
||||
|
||||
type Account struct {
|
||||
ID primitive.ObjectID `bson:"_id,omitempty"`
|
||||
Uid uint64 `bson:"uid"`
|
||||
Username string `bson:"username"`
|
||||
PlayerID uint64 `bson:"playerID"`
|
||||
Token string `bson:"token"`
|
||||
ComboToken string `bson:"comboToken"`
|
||||
Forbid bool `bson:"forbid"`
|
||||
ForbidEndTime uint64 `bson:"forbidEndTime"`
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package db
|
||||
|
||||
type PlayerIDCounter struct {
|
||||
ID string `bson:"_id"`
|
||||
PlayerID uint64 `bson:"PlayerID"`
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package gm
|
||||
|
||||
type ForbidUserInfo struct {
|
||||
UserId uint32
|
||||
ForbidEndTime uint64
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"hk4e/dispatch/dao"
|
||||
"hk4e/dispatch/entity/gm"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
dao *dao.Dao
|
||||
}
|
||||
|
||||
// 用户密码改变
|
||||
func (f *Service) UserPasswordChange(uid uint32) bool {
|
||||
// dispatch登录态失效
|
||||
_, err := f.dao.UpdateAccountFieldByFieldName("uid", uid, "token", "")
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
// 游戏内登录态失效
|
||||
account, err := f.dao.QueryAccountByField("uid", uid)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if account == nil {
|
||||
return false
|
||||
}
|
||||
//convId, exist := f.getConvIdByUserId(uint32(account.PlayerID))
|
||||
//if !exist {
|
||||
// return true
|
||||
//}
|
||||
//f.kcpEventInput <- &net.KcpEvent{
|
||||
// ConvId: convId,
|
||||
// EventId: net.KcpConnForceClose,
|
||||
// EventMessage: uint32(kcp.EnetAccountPasswordChange),
|
||||
//}
|
||||
return true
|
||||
}
|
||||
|
||||
// 封号
|
||||
func (f *Service) ForbidUser(info *gm.ForbidUserInfo) bool {
|
||||
if info == nil {
|
||||
return false
|
||||
}
|
||||
// 写入账号封禁信息
|
||||
_, err := f.dao.UpdateAccountFieldByFieldName("uid", info.UserId, "forbid", true)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
_, err = f.dao.UpdateAccountFieldByFieldName("uid", info.UserId, "forbidEndTime", info.ForbidEndTime)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
// 游戏强制下线
|
||||
account, err := f.dao.QueryAccountByField("uid", info.UserId)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if account == nil {
|
||||
return false
|
||||
}
|
||||
//convId, exist := f.getConvIdByUserId(uint32(account.PlayerID))
|
||||
//if !exist {
|
||||
// return true
|
||||
//}
|
||||
//f.kcpEventInput <- &net.KcpEvent{
|
||||
// ConvId: convId,
|
||||
// EventId: net.KcpConnForceClose,
|
||||
// EventMessage: uint32(kcp.EnetServerKillClient),
|
||||
//}
|
||||
return true
|
||||
}
|
||||
|
||||
// 解封
|
||||
func (s *Service) UnForbidUser(uid uint32) bool {
|
||||
// 解除账号封禁
|
||||
_, err := s.dao.UpdateAccountFieldByFieldName("uid", uid, "forbid", false)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
Reference in new issue
Block a user