mirror of
				https://github.com/eryajf/chatgpt-dingtalk.git
				synced 2025-10-31 11:36:17 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			193 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package public
 | ||
| 
 | ||
| import (
 | ||
| 	"crypto/hmac"
 | ||
| 	"crypto/sha256"
 | ||
| 	"encoding/base64"
 | ||
| 	"fmt"
 | ||
| 	"io/ioutil"
 | ||
| 	"os"
 | ||
| 	"strings"
 | ||
| 	"time"
 | ||
| 	"unicode/utf8"
 | ||
| )
 | ||
| 
 | ||
| // 将内容写入到文件,如果文件名带路径,则会判断路径是否存在,不存在则创建
 | ||
| func WriteToFile(path string, data []byte) error {
 | ||
| 	tmp := strings.Split(path, "/")
 | ||
| 	if len(tmp) > 0 {
 | ||
| 		tmp = tmp[:len(tmp)-1]
 | ||
| 	}
 | ||
| 
 | ||
| 	err := os.MkdirAll(strings.Join(tmp, "/"), os.ModePerm)
 | ||
| 	if err != nil {
 | ||
| 		return err
 | ||
| 	}
 | ||
| 	err = ioutil.WriteFile(path, data, 0755)
 | ||
| 	if err != nil {
 | ||
| 		return err
 | ||
| 	}
 | ||
| 	return nil
 | ||
| }
 | ||
| 
 | ||
| // JudgeGroup 判断群ID是否在白名单
 | ||
| func JudgeGroup(s string) bool {
 | ||
| 	if len(Config.AllowGroups) == 0 {
 | ||
| 		return true
 | ||
| 	}
 | ||
| 	for _, v := range Config.AllowGroups {
 | ||
| 		if v == s {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| // JudgeOutgoingGroup 判断群ID是否在为outgoing白名单
 | ||
| func JudgeOutgoingGroup(s string) bool {
 | ||
| 	if len(Config.AllowOutgoingGroups) == 0 {
 | ||
| 		return true
 | ||
| 	}
 | ||
| 	for _, v := range Config.AllowOutgoingGroups {
 | ||
| 		if v == s {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| // JudgeUsers 判断用户是否在白名单
 | ||
| func JudgeUsers(s string) bool {
 | ||
| 	// 优先判断黑名单,黑名单用户返回:不在白名单
 | ||
| 	if len(Config.DenyUsers) != 0 {
 | ||
| 		for _, v := range Config.DenyUsers {
 | ||
| 			if v == s {
 | ||
| 				return false
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 	// 白名单配置逻辑处理
 | ||
| 	if len(Config.AllowUsers) == 0 {
 | ||
| 		return true
 | ||
| 	}
 | ||
| 	for _, v := range Config.AllowUsers {
 | ||
| 		if v == s {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| // JudgeAdminUsers 判断用户是否为系统管理员
 | ||
| func JudgeAdminUsers(s string) bool {
 | ||
| 	// 如果secret或者用户的userid都为空的话,那么默认没有管理员
 | ||
| 	if len(Config.AppSecrets) == 0 || s == "" {
 | ||
| 		return false
 | ||
| 	}
 | ||
| 	// 如果没有指定,则没有人是管理员
 | ||
| 	if len(Config.AdminUsers) == 0 {
 | ||
| 		return false
 | ||
| 	}
 | ||
| 	for _, v := range Config.AdminUsers {
 | ||
| 		if v == s {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| // JudgeVipUsers 判断用户是否为VIP用户
 | ||
| func JudgeVipUsers(s string) bool {
 | ||
| 	// 如果secret或者用户的userid都为空的话,那么默认不是VIP用户
 | ||
| 	if len(Config.AppSecrets) == 0 || s == "" {
 | ||
| 		return false
 | ||
| 	}
 | ||
| 	// 管理员默认是VIP用户
 | ||
| 	for _, v := range Config.AdminUsers {
 | ||
| 		if v == s {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	// 如果没有指定,则没有人是VIP用户
 | ||
| 	if len(Config.VipUsers) == 0 {
 | ||
| 		return false
 | ||
| 	}
 | ||
| 	for _, v := range Config.VipUsers {
 | ||
| 		if v == s {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| func GetReadTime(t time.Time) string {
 | ||
| 	return t.Format("2006-01-02 15:04:05")
 | ||
| }
 | ||
| 
 | ||
| func CheckRequestWithCredentials(ts, sg string) (clientId string, pass bool) {
 | ||
| 	clientId, pass = "", false
 | ||
| 	credentials := Config.Credentials
 | ||
| 	if credentials == nil || len(credentials) == 0 {
 | ||
| 		return "", true
 | ||
| 	}
 | ||
| 	for _, credential := range Config.Credentials {
 | ||
| 		stringToSign := fmt.Sprintf("%s\n%s", ts, credential.ClientSecret)
 | ||
| 		mac := hmac.New(sha256.New, []byte(credential.ClientSecret))
 | ||
| 		_, _ = mac.Write([]byte(stringToSign))
 | ||
| 		if base64.StdEncoding.EncodeToString(mac.Sum(nil)) == sg {
 | ||
| 			return credential.ClientID, true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return
 | ||
| }
 | ||
| 
 | ||
| func CheckRequest(ts, sg string) bool {
 | ||
| 	appSecrets := Config.AppSecrets
 | ||
| 	// 如果没有指定或者outgoing类型机器人下使用,则默认不做校验
 | ||
| 	if len(appSecrets) == 0 || sg == "" {
 | ||
| 		return true
 | ||
| 	}
 | ||
| 	// 校验appSecret
 | ||
| 	for _, secret := range appSecrets {
 | ||
| 		stringToSign := fmt.Sprintf("%s\n%s", ts, secret)
 | ||
| 		mac := hmac.New(sha256.New, []byte(secret))
 | ||
| 		_, _ = mac.Write([]byte(stringToSign))
 | ||
| 		if base64.StdEncoding.EncodeToString(mac.Sum(nil)) == sg {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| // JudgeSensitiveWord 判断内容是否包含敏感词
 | ||
| func JudgeSensitiveWord(s string) bool {
 | ||
| 	if len(Config.SensitiveWords) == 0 {
 | ||
| 		return false
 | ||
| 	}
 | ||
| 	for _, v := range Config.SensitiveWords {
 | ||
| 		if strings.Contains(s, v) {
 | ||
| 			return true
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| // SolveSensitiveWord 将敏感词用 🚫 占位
 | ||
| func SolveSensitiveWord(s string) string {
 | ||
| 	for _, v := range Config.SensitiveWords {
 | ||
| 		if strings.Contains(s, v) {
 | ||
| 			return strings.Replace(s, v, printStars(utf8.RuneCountInString(v)), -1)
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return s
 | ||
| }
 | ||
| 
 | ||
| // 将对应敏感词替换为 🚫
 | ||
| func printStars(num int) string {
 | ||
| 	s := ""
 | ||
| 	for i := 0; i < num; i++ {
 | ||
| 		s += "🚫"
 | ||
| 	}
 | ||
| 	return s
 | ||
| }
 | 
