Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+258
View File
@@ -0,0 +1,258 @@
package aiMate
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"net/http"
"strconv"
"strings"
"91porn-server/common/httputil"
"91porn-server/common/log"
)
const (
req_doman = "https://www.gpt4novel.com" //请求域名
access_doman = "https://www.saibolaopo.com/tg-login" //访问域名
get_token_url = "/api/dzmm/get-jwt-for-organization-subaccount" //获取用户登陆token
transfer_points_url = "/api/dzmm/transfer-all-user-credit-to-organization" //转出用户所有积分
get_points_url = "/api/dzmm/get-organization-user-balance" //获取用户积分
get_transactions_url = "/api/dzmm/get-user-credit-transactions" //获取用户消费记录
access_key = "c1c5f394-1a6a-4834-8ee8-cb2fb6325969" //密钥
organization_id = "65443ba4-480a-4c62-8276-f5380bccc739" //组织id
)
// 获取token请求参数
type GetTokenReq struct {
OrganizationId string `json:"organizationId"` // 组织id
OrganizationExternalId string `json:"organizationExternalId"` // 用户唯一iduuidv4
First_name string `json:"first_name"` // 用户名
Avatar_url string `json:"avatar_url"` // 用户头像
Bio string `json:"bio"` // 简介
CreditToUser float64 `json:"creditToUser"` // 转移给用户的积分数
Sign string `json:"sign"` // sign
}
// 获取token返回参数
type GetTokenResp struct {
StatusCode int `json:"statusCode"` // 状态码
Message string `json:"message"` // 描述
Error string `json:"error"` // 错误
Jwt string `json:"jwt"` // jwt
}
// 获取用户访问Ai女友的链接
func GetUserAccessAiUrl(uid uint64, uuid, name string, amount float64) (access_url string, err error) {
var (
//请求参数
req = GetTokenReq{
OrganizationId: organization_id,
OrganizationExternalId: uuid,
First_name: "91PORN-" + name,
Bio: "AiMate",
Avatar_url: "https://example.com/avatar.jpg",
CreditToUser: amount,
}
//返回参数
resp = GetTokenResp{}
//加密字符串
signStr = "avatar_url=" + req.Avatar_url + "&bio=" + req.Bio + "&creditToUser=" + strconv.FormatFloat(req.CreditToUser, 'f', -1, 64) + "&first_name=" + req.First_name + "&organizationExternalId=" + req.OrganizationExternalId + "&organizationId=" + req.OrganizationId + access_key
)
//参数加密
h := md5.New()
h.Write([]byte(signStr))
cipherStr := h.Sum(nil)
req.Sign = hex.EncodeToString(cipherStr)
//请求
url := req_doman + get_token_url
bodyStr, _ := json.Marshal(req)
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
if err != nil {
log.Error("GetUserAccessAiUrl POSTWithJResp ", log.Any("url", url), log.Any("uid", uid), log.E(err))
return
}
if code != http.StatusCreated {
log.Error("GetUserAccessAiUrl response status ", log.Any("code", code), log.Any("uid", uid))
if strings.Contains(resp.Message, "积分不足") {
err = fmt.Errorf("insufficient organization points")
return
}
err = fmt.Errorf("response status err")
return
}
//访问链接
access_url = access_doman + "?token=" + resp.Jwt
log.Info("GetUserAccessAiUrl success", log.Any("uid", uid))
return
}
// 划转积分请求参数
type TransferIntegralReq struct {
OrganizationId string `json:"organizationId"` // 组织id
SourceAccountId string `json:"sourceAccountId"` // 用户唯一iduuidv4
Note string `json:"note"` // 备注
Sign string `json:"sign"` // sign
}
// 划转积分返回参数
type TransferIntegralResp struct {
StatusCode int `json:"statusCode"` // 状态码
Message string `json:"message"` // 描述
Error string `json:"error"` // 错误
NewBalance float64 `json:"newBalance"` // 最新余额
TransferredAmount float64 `json:"transferredAmount"` // 划转余额
}
// 用户划转积分,从第三方转出用户所有积分
func UserAiTransferIntegral(uid uint64, uuid string) (transferredAmount float64, err error) {
var (
//请求参数
req = TransferIntegralReq{
SourceAccountId: uuid,
OrganizationId: organization_id,
Note: "transfer-user-all-integral",
}
//返回参数
resp = TransferIntegralResp{}
//加密字符串
signStr = "note=" + req.Note + "&organizationId=" + req.OrganizationId + "&sourceAccountId=" + req.SourceAccountId + access_key
)
//参数加密
h := md5.New()
h.Write([]byte(signStr))
cipherStr := h.Sum(nil)
req.Sign = hex.EncodeToString(cipherStr)
//请求
url := req_doman + transfer_points_url
bodyStr, _ := json.Marshal(req)
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
if err != nil {
log.Error("UserAiTransferIntegral POSTWithJResp ", log.Any("url", url), log.Any("uid", uid), log.E(err))
return
}
if code != http.StatusCreated {
log.Error("UserAiTransferIntegral response status ", log.Any("code", code), log.Any("uid", uid))
err = fmt.Errorf("response status err")
return
}
log.Info("UserAiTransferIntegral success", log.Any("uid", uid))
transferredAmount = resp.TransferredAmount
return
}
// 获取用户余额请求参数
type GetUserAiBalanceReq struct {
OrganizationId string `json:"organizationId"` // 组织id
ExternalUserId string `json:"externalUserId"` // 用户唯一iduuidv4
Sign string `json:"sign"` // sign
}
// 获取用户余额返回参数
type GetUserAiBalanceResp struct {
StatusCode int `json:"statusCode"` // 状态码
Message string `json:"message"` // 描述
Error string `json:"error"` // 错误
Balance float64 `json:"balance"` // 余额
}
// 获取用户余额
func GetUserAiBalance(uid uint64, uuid string) (balance float64, err error) {
var (
//请求参数
req = GetUserAiBalanceReq{
OrganizationId: organization_id,
ExternalUserId: uuid,
}
//返回参数
resp = GetUserAiBalanceResp{}
//加密字符串
signStr = "externalUserId=" + req.ExternalUserId + "&organizationId=" + req.OrganizationId + access_key
)
//参数加密
h := md5.New()
h.Write([]byte(signStr))
cipherStr := h.Sum(nil)
req.Sign = hex.EncodeToString(cipherStr)
//请求
url := req_doman + get_points_url
bodyStr, _ := json.Marshal(req)
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
if err != nil {
log.Error("GetUserAiBalanceReq POSTWithJResp ", log.Any("url", url), log.Any("uid", uid), log.E(err))
return
}
if code != http.StatusCreated && code != 0 {
log.Error("GetUserAiBalanceReq response status ", log.Any("code", code), log.Any("uid", uid))
err = fmt.Errorf("response status err")
return
}
log.Info("GetUserAiBalanceReq success", log.Any("uid", uid))
balance = resp.Balance
return
}
// 获取用户交易记录请求参数
type GetUserTransactionsReq struct {
OrganizationId string `json:"organizationId"` // 组织id
ExternalUserId string `json:"externalUserId"` // 用户唯一iduuidv4
Sign string `json:"sign"` // sign
}
// 获取用户交易记录返回参数
type GetUserTransactionsResp struct {
StatusCode int `json:"statusCode"` // 状态码
Message string `json:"message"` // 描述
Error string `json:"error"` // 错误
TotalCount int `json:"totalCount"` // 总条数
Transactions []TransactionsInfo `json:"transactions"` // 交易列表
}
// 用户交易记录对象
type TransactionsInfo struct {
OrderId int `json:"orderId"` // 订单Id
Credit_delta string `json:"credit_delta"` // 此次操作积分数
Post_credit string `json:"post_credit"` // 操作后剩余积分数
Created_at string `json:"created_at"` // 操作时间
Operation_type string `json:"operation_type"` // 操作类型
}
// 获取用户交易记录
func GetUserTransactions(uid uint64, uuid string) (totalCount int, list []TransactionsInfo, err error) {
var (
//请求参数
req = GetUserTransactionsReq{
OrganizationId: organization_id,
ExternalUserId: uuid,
}
//返回参数
resp = GetUserTransactionsResp{}
//加密字符串
signStr = "externalUserId=" + req.ExternalUserId + "&organizationId=" + req.OrganizationId + access_key
)
log.Info("GetUserTransactionsReq req", log.Any("signStr", signStr), log.Any("uid", uid))
//参数加密
h := md5.New()
h.Write([]byte(signStr))
cipherStr := h.Sum(nil)
req.Sign = hex.EncodeToString(cipherStr)
log.Info("GetUserTransactionsReq req", log.Any("params", req), log.Any("uid", uid))
//请求
url := req_doman + get_transactions_url
bodyStr, _ := json.Marshal(req)
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
if err != nil {
log.Error("GetUserTransactionsReq POSTWithJResp ", log.Any("url", url), log.Any("uid", uid), log.E(err))
return
}
if code != http.StatusCreated && code != 0 {
log.Error("GetUserTransactionsReq response status ", log.Any("code", code), log.Any("uid", uid), log.Any("resp", resp))
err = fmt.Errorf("response status err")
return
}
log.Info("GetUserTransactionsReq http", log.Any("resp", resp), log.Any("uid", uid))
totalCount = resp.TotalCount
list = resp.Transactions
return
}