x
This commit is contained in:
+5
-6
@@ -1,11 +1,8 @@
|
|||||||
# 使用Debian镜像作为基础镜像
|
|
||||||
FROM debian:11
|
FROM debian:11
|
||||||
|
|
||||||
# 将APT源更换为国内源(这里使用阿里云的源)
|
|
||||||
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
|
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
|
||||||
sed -i 's/security.debian.org/mirrors.aliyun.com\/debian-security/g' /etc/apt/sources.list
|
sed -i 's/security.debian.org/mirrors.aliyun.com\/debian-security/g' /etc/apt/sources.list
|
||||||
|
|
||||||
# 更新软件包索引并安装必要的工具
|
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
python3 \
|
python3 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
@@ -58,7 +55,9 @@ ENV PATH="/usr/local/sillyGirl/language/node:${PATH}"
|
|||||||
ENV SILLYGIRL_DATA_PATH=/usr/local/sillyGirl/
|
ENV SILLYGIRL_DATA_PATH=/usr/local/sillyGirl/
|
||||||
|
|
||||||
# 指定容器启动时要运行的命令
|
# 指定容器启动时要运行的命令
|
||||||
CMD ["/usr/local/sillyGirl/sillyGirl", "-t"]
|
# CMD ["/usr/local/sillyGirl/sillyGirl", "-t"]
|
||||||
|
|
||||||
# docker build -t my-sillygirl .
|
CMD ["/usr/local/sillyGirl/sillyGirl -t"]
|
||||||
# docker run -d --restart always --name my-sillygirl my-sillygirl
|
|
||||||
|
# docker build -t sillygirl .
|
||||||
|
# docker run -d --restart always --name sillygirl sillygirl
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ _*
|
|||||||
fanli_vip
|
fanli_vip
|
||||||
cable
|
cable
|
||||||
sillyplus.cache
|
sillyplus.cache
|
||||||
|
sillyplus.*
|
||||||
main
|
main
|
||||||
sillyplus.pid
|
sillyplus.pid
|
||||||
sillyGirl.pid
|
sillyGirl.pid
|
||||||
|
|||||||
@@ -1,96 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/aes"
|
|
||||||
"crypto/cipher"
|
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
)
|
|
||||||
|
|
||||||
func getJS(user, pass, title string) string {
|
|
||||||
baseURL := "http://aut.zhelee.cn/plugin/download"
|
|
||||||
queryParams := url.Values{}
|
|
||||||
queryParams.Set("title", title)
|
|
||||||
queryParams.Set("username", user)
|
|
||||||
queryParams.Set("password", pass)
|
|
||||||
queryParams.Set("version", "1")
|
|
||||||
|
|
||||||
u, err := url.Parse(baseURL)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
u.RawQuery = queryParams.Encode()
|
|
||||||
|
|
||||||
urlStr := u.String()
|
|
||||||
method := "POST"
|
|
||||||
|
|
||||||
client := &http.Client{}
|
|
||||||
req, err := http.NewRequest(method, urlStr, nil)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
res, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(res.Body)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
// fmt.Println(string(body))
|
|
||||||
return string(body)
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
user := "test1234"
|
|
||||||
pass := "test1234"
|
|
||||||
title := "hook"
|
|
||||||
plaintext := getJS(user, pass, title)
|
|
||||||
key := getKey("test1234")
|
|
||||||
panic(key)
|
|
||||||
decrypted, err := decrypt(string(plaintext), []byte(key))
|
|
||||||
// 打印解密后的数据
|
|
||||||
fmt.Println(err)
|
|
||||||
fmt.Printf("解密后的数据:%s\n", decrypted)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getKey(user string) string {
|
|
||||||
t := user + "killsillygirltodeath109times"
|
|
||||||
if len(t) > 32 {
|
|
||||||
return t[:32]
|
|
||||||
}
|
|
||||||
// if len(t) > 24 {
|
|
||||||
// return t[:24]
|
|
||||||
// }
|
|
||||||
// return t[:16]
|
|
||||||
return t[:24]
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用AES-CBC模式进行解密
|
|
||||||
func decrypt(encrypted string, key []byte) (string, error) {
|
|
||||||
block, err := aes.NewCipher(key)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
ciphertext, err := base64.StdEncoding.DecodeString(encrypted)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
iv := ciphertext[:aes.BlockSize]
|
|
||||||
ciphertext = ciphertext[aes.BlockSize:]
|
|
||||||
decrypter := cipher.NewCBCDecrypter(block, iv)
|
|
||||||
decrypted := make([]byte, len(ciphertext))
|
|
||||||
decrypter.CryptBlocks(decrypted, ciphertext)
|
|
||||||
return string(decrypted), nil
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
/**
|
|
||||||
* @title 怪兽插件下载
|
|
||||||
* @create_at 2022-07-04 16:05:44
|
|
||||||
* @description 🐒仅供学习,访问傻妞地址下载:http://${ app.ip }:${ app.port ?? "8080"}/api/fuckatm?title=hook&username=username&password=password
|
|
||||||
* @author 佚名
|
|
||||||
* @version v1.0.0
|
|
||||||
* @http GET /api/fuckatm
|
|
||||||
* @encrypt true
|
|
||||||
* @form {key: "autMan.title", "title": "默认标题", required: true, tooltip: "请求参数title为空时"}
|
|
||||||
* @form {key: "autMan.username", "title": "默认用户", required: true, tooltip: "请求参数username为空时"}
|
|
||||||
* @form {key: "autMan.password", "title": "默认密码", required: true, tooltip: "请求参数password为空时"}
|
|
||||||
*/
|
|
||||||
|
|
||||||
const plt = s.getPlatform()
|
|
||||||
const autMan = Bucket("autMan")
|
|
||||||
const base_url = "http://aut.zhelee.cn/plugin/"
|
|
||||||
|
|
||||||
class AESCipher {
|
|
||||||
constructor(key) {
|
|
||||||
this.key = key;
|
|
||||||
}
|
|
||||||
decrypt(encrypt) {
|
|
||||||
const encryptBuffer = Buffer.from(encrypt, 'base64');
|
|
||||||
const decipher = crypto.createDecipheriv('aes-256-cbc', this.key, encryptBuffer.slice(0, 16));
|
|
||||||
let decrypted = decipher.update(encryptBuffer.slice(16).toString('hex'), 'hex', 'utf8');
|
|
||||||
decrypted += decipher.final('utf8');
|
|
||||||
return decrypted;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
if (req) {
|
|
||||||
let title = req.query("title")
|
|
||||||
if (!title) {
|
|
||||||
title = autMan.title ?? ""
|
|
||||||
}
|
|
||||||
if (!title) {
|
|
||||||
res.send("title不为空")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let username = req.query("username")
|
|
||||||
if (!username) {
|
|
||||||
username = autMan.username ?? ""
|
|
||||||
}
|
|
||||||
if (!username) {
|
|
||||||
res.send("username不为空")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let password = req.query("password")
|
|
||||||
if (!password) {
|
|
||||||
password = autMan.password ?? ""
|
|
||||||
}
|
|
||||||
if (!password) {
|
|
||||||
res.send("password不为空")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let { body } = request({
|
|
||||||
url: base_url + "download?" + strings.encodeQueryString({
|
|
||||||
title,
|
|
||||||
username,
|
|
||||||
password,
|
|
||||||
version: "1",
|
|
||||||
dataType: "text"
|
|
||||||
}),
|
|
||||||
method: "POST",
|
|
||||||
})
|
|
||||||
console.log("==",body)
|
|
||||||
let key = username + "killsillygirltodeath109times"
|
|
||||||
key = Buffer.from(key)
|
|
||||||
key = key.length() > 32 ? key.slice(0, 32) : key.slice(0, 24)
|
|
||||||
let cipher = new AESCipher(key.toString())
|
|
||||||
res.send(cipher.decrypt(body))
|
|
||||||
let resp = request({
|
|
||||||
url: base_url + "remove?" + strings.encodeQueryString({
|
|
||||||
title: title,
|
|
||||||
username: username,
|
|
||||||
password: password,
|
|
||||||
version: "1",
|
|
||||||
}),
|
|
||||||
method: "POST",
|
|
||||||
})
|
|
||||||
console.log("remove", resp.body)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
||||||
+13
-13
@@ -124,19 +124,19 @@ func initNodePlugins() {
|
|||||||
} else {
|
} else {
|
||||||
// fmt.Println("非插件目录", event.Name)
|
// fmt.Println("非插件目录", event.Name)
|
||||||
}
|
}
|
||||||
// tf := event.Name + "/node_modules/sillygirl.d.ts"
|
tf := event.Name + "/node_modules/sillygirl.d.ts"
|
||||||
// ti := event.Name + "/demo.main.js"
|
ti := event.Name + "/demo.main.js"
|
||||||
// if _, err := os.Stat(tf); err != nil {
|
if _, err := os.Stat(tf); err != nil {
|
||||||
// os.Mkdir(event.Name+"/node_modules", 0700)
|
os.Mkdir(event.Name+"/node_modules", 0700)
|
||||||
// os.WriteFile(tf, []byte(typeat), 0700)
|
os.WriteFile(tf, []byte(typeat), 0700)
|
||||||
// }
|
}
|
||||||
// go func() {
|
go func() {
|
||||||
// time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
// if _, err := os.Stat(ti); err != nil {
|
if _, err := os.Stat(ti); err != nil {
|
||||||
// os.Mkdir(event.Name+"/node_modules", 0700)
|
os.Mkdir(event.Name+"/node_modules", 0700)
|
||||||
// os.WriteFile(ti, []byte(defaultScript(plugin_name)), 0700)
|
os.WriteFile(ti, []byte(defaultScript(plugin_name)), 0700)
|
||||||
// }
|
}
|
||||||
// }()
|
}()
|
||||||
} else if plugin_index {
|
} else if plugin_index {
|
||||||
// fmt.Println("增加插件", event.Name)
|
// fmt.Println("增加插件", event.Name)
|
||||||
// RemNodePlugin(plugin_name)
|
// RemNodePlugin(plugin_name)
|
||||||
|
|||||||
@@ -116,7 +116,6 @@ func (sg *SillyGirlService) SenderListen(stream srpc.SillyGirlService_SenderList
|
|||||||
var persistent bool
|
var persistent bool
|
||||||
ctx := stream.Context()
|
ctx := stream.Context()
|
||||||
|
|
||||||
defer fmt.Println("已关闭,", "===")
|
|
||||||
for {
|
for {
|
||||||
req, err := stream.Recv()
|
req, err := stream.Recv()
|
||||||
// fmt.Println("req", string(utils.JsonMarshal(req)))
|
// fmt.Println("req", string(utils.JsonMarshal(req)))
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ func getPaterner(uuid, path string) (string, string, bool) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, f := range ls { //同源
|
for _, f := range ls { //同源
|
||||||
if f.Address == address && (f.Title == path || f.UUID == path) {
|
if f.Address == address && (f.Title == path || f.UUID == path) {
|
||||||
data = plugins.GetBytes(f.UUID)
|
data = plugins.GetBytes(f.UUID)
|
||||||
|
|||||||
+1
-2
@@ -7,7 +7,6 @@ import (
|
|||||||
"embed"
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@@ -132,7 +131,7 @@ func initWeb() {
|
|||||||
}
|
}
|
||||||
if is_index {
|
if is_index {
|
||||||
var data []byte
|
var data []byte
|
||||||
data, err = ioutil.ReadAll(file)
|
data, err = io.ReadAll(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
// _ "github.com/cdle/sillyplus/adapters/qq"
|
// _ "github.com/cdle/sillyplus/adapters/qq"
|
||||||
@@ -65,10 +66,10 @@ func main() {
|
|||||||
}
|
}
|
||||||
if t {
|
if t {
|
||||||
// core.Logs.Info("Terminal机器人已连接")
|
// core.Logs.Info("Terminal机器人已连接")
|
||||||
scanner := bufio.NewScanner(os.Stdin)
|
|
||||||
a := &core.Factory{}
|
a := &core.Factory{}
|
||||||
a.Init("terminal", "default", nil)
|
a.Init("terminal", "default", nil)
|
||||||
i := 0
|
i := 1
|
||||||
a.SetIsAdmin(func(s string) bool {
|
a.SetIsAdmin(func(s string) bool {
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
@@ -81,24 +82,27 @@ func main() {
|
|||||||
// fmt.Println(`do action: ` + string(utils.JsonMarshal(m)))
|
// fmt.Println(`do action: ` + string(utils.JsonMarshal(m)))
|
||||||
// return ""
|
// return ""
|
||||||
// })
|
// })
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
for {
|
||||||
|
input, err := reader.ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
core.Logs.Error(err)
|
||||||
|
a.Destroy()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
input = strings.TrimSpace(input)
|
||||||
|
|
||||||
for scanner.Scan() {
|
|
||||||
data := scanner.Text()
|
|
||||||
s := &core.CustomSender{
|
s := &core.CustomSender{
|
||||||
// Type: "terminal",
|
|
||||||
// Message: string(data),
|
|
||||||
// Admin: true,
|
|
||||||
F: a,
|
F: a,
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
s.SetFsps(&common.FakerSenderParams{
|
s.SetFsps(&common.FakerSenderParams{
|
||||||
Content: data,
|
Content: input,
|
||||||
MessageID: fmt.Sprint(i),
|
MessageID: fmt.Sprint(i),
|
||||||
})
|
})
|
||||||
s.SetContent(data)
|
|
||||||
core.Messages <- s
|
core.Messages <- s
|
||||||
|
// 在这里可以根据输入执行相应的逻辑
|
||||||
}
|
}
|
||||||
core.Logs.Info("Terminal机器人异常,请检查运行环境设置,如果是docker环境,请附加-it参数")
|
|
||||||
} else {
|
} else {
|
||||||
// core.Logs.Info("Terminal机器人不可用,运行带-t参数即可启用")
|
// core.Logs.Info("Terminal机器人不可用,运行带-t参数即可启用")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user