Compare commits
15 Commits
4c12a5927e
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| e346743cae | |||
| 5e83b1ace4 | |||
| 8b138cadda | |||
| 53061f1fd2 | |||
| 692bcc57ea | |||
| a7e57523fd | |||
| e8184e34b8 | |||
| 35e3d54ea3 | |||
| ec74632c02 | |||
| 385cb727a8 | |||
| 211b390d88 | |||
| 7105903ce8 | |||
| 54c29ad3b8 | |||
| f3dc9d74c7 | |||
| b15b408476 |
12
.drone.yml
12
.drone.yml
@@ -1,8 +1,6 @@
|
||||
|
||||
kind: pipeline
|
||||
type: exec
|
||||
name: default
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: amd64
|
||||
@@ -10,8 +8,14 @@ platform:
|
||||
steps:
|
||||
- name: build
|
||||
commands:
|
||||
- docker build .
|
||||
- docker-compose -p Crisp_Telegram_bot build
|
||||
|
||||
- name: run
|
||||
commands:
|
||||
- docker-compose up --build -d
|
||||
- docker-compose -p Crisp_Telegram_bot up -d
|
||||
when:
|
||||
status:
|
||||
- success
|
||||
branch:
|
||||
- master
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
FROM golang:alpine
|
||||
ADD . /app
|
||||
FROM golang:1.17-alpine
|
||||
COPY . /app
|
||||
WORKDIR /app
|
||||
RUN go get ; CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
|
||||
CMD ./Crisp_Telegram_bot
|
||||
CMD ["./Crisp_Telegram_bot"]
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ Will Support:
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Get your crisp API credentials from [Crisp API token generator](https://go.crisp.chat/account/token/)
|
||||
1. Get your crisp API credentials from [Crisp API token generator](https://go.crisp.chat/account/token/) FIXME
|
||||
1. Create a bot with [BotFather](https://t.me/botfather), save the token for later use.
|
||||
1. Build & Run.
|
||||
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
version: '3'
|
||||
services:
|
||||
crispbot:
|
||||
bot:
|
||||
build: .
|
||||
volumes:
|
||||
- /root/config.yml:/app/config.yml
|
||||
depends_on:
|
||||
- db
|
||||
db:
|
||||
image: redis
|
||||
|
||||
114
main.go
114
main.go
@@ -8,15 +8,14 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/crisp-im/go-crisp-api/crisp"
|
||||
"github.com/go-redis/redis"
|
||||
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/l0sted/Crisp_Telegram_bot/utils"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
var bot *tgbotapi.BotAPI
|
||||
var client *crisp.Client
|
||||
var redisClient *redis.Client
|
||||
|
||||
var config *viper.Viper
|
||||
|
||||
// CrispMessageInfo stores the original message
|
||||
@@ -35,89 +34,23 @@ func (s *CrispMessageInfo) UnmarshalBinary(data []byte) error {
|
||||
return json.Unmarshal(data, s)
|
||||
}
|
||||
|
||||
func contains(s []interface{}, e int64) bool {
|
||||
for _, a := range s {
|
||||
if int64(a.(int)) == e {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
//from tg to crisp
|
||||
func replyToUser(update *tgbotapi.Update) {
|
||||
if update.Message.ReplyToMessage == nil {
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "请回复一个消息")
|
||||
bot.Send(msg)
|
||||
return
|
||||
}
|
||||
|
||||
res, err := redisClient.Get(strconv.Itoa(update.Message.ReplyToMessage.MessageID)).Result()
|
||||
|
||||
if err != nil {
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "ERROR: "+err.Error())
|
||||
bot.Send(msg)
|
||||
return
|
||||
}
|
||||
|
||||
var msgInfo CrispMessageInfo
|
||||
err = json.Unmarshal([]byte(res), &msgInfo)
|
||||
|
||||
if err := json.Unmarshal([]byte(res), &msgInfo); err != nil {
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "ERROR: "+err.Error())
|
||||
bot.Send(msg)
|
||||
return
|
||||
}
|
||||
|
||||
if update.Message.Text != "" {
|
||||
client.Website.SendTextMessageInConversation(msgInfo.WebsiteID, msgInfo.SessionID, crisp.ConversationTextMessageNew{
|
||||
Type: "text",
|
||||
From: "operator",
|
||||
Origin: "chat",
|
||||
Content: update.Message.Text,
|
||||
})
|
||||
}
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "回复成功!")
|
||||
bot.Send(msg)
|
||||
}
|
||||
//from crisp to tg
|
||||
func sendMsgToAdmins(text string, WebsiteID string, SessionID string) {
|
||||
for _, id := range config.Get("admins").([]interface{}) {
|
||||
msg := tgbotapi.NewMessage(int64(id.(int)), text)
|
||||
msg.ParseMode = "Markdown"
|
||||
sent, _ := bot.Send(msg)
|
||||
|
||||
redisClient.Set(strconv.Itoa(sent.MessageID), &CrispMessageInfo{
|
||||
WebsiteID,
|
||||
SessionID,
|
||||
}, 12*time.Hour)
|
||||
log.Println(strconv.Itoa(sent.MessageID))
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
func main() {
|
||||
config = utils.GetConfig()
|
||||
|
||||
var chat_prefix = config.GetString("prefix")
|
||||
|
||||
log.Printf("Initializing Redis...")
|
||||
|
||||
redisClient = redis.NewClient(&redis.Options{
|
||||
Addr: config.GetString("redis.host"),
|
||||
Password: config.GetString("redis.password"),
|
||||
DB: config.GetInt("redis.db"),
|
||||
})
|
||||
|
||||
var err error
|
||||
|
||||
_, err = redisClient.Ping().Result()
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
|
||||
log.Printf("Initializing Bot...")
|
||||
|
||||
bot, err = tgbotapi.NewBotAPI(config.GetString("telegram.key"))
|
||||
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
@@ -130,7 +63,8 @@ func init() {
|
||||
log.Printf("Initializing Crisp Listner")
|
||||
client = crisp.New()
|
||||
// Set authentication parameters
|
||||
client.Authenticate(config.GetString("crisp.identifier"), config.GetString("crisp.key"))
|
||||
// client.Authenticate(config.GetString("crisp.identifier"), config.GetString("crisp.key"))
|
||||
client.AuthenticateTier("plugin", config.GetString("crisp.identifier"), config.GetString("crisp.key"))
|
||||
|
||||
// Connect to realtime events backend and listen (only to 'message:send' namespace)
|
||||
client.Events.Listen(
|
||||
@@ -146,19 +80,19 @@ func init() {
|
||||
|
||||
// Register handler on 'message:send/text' namespace
|
||||
reg.On("message:send/text", func(evt crisp.EventsReceiveTextMessage) {
|
||||
text := fmt.Sprintf(`(%s) *%s(%s): *%s`, chat_prefix, *evt.User.Nickname, *evt.User.UserID, *evt.Content)
|
||||
text := fmt.Sprintf(`%s *%s: *%s`, chat_prefix, *evt.User.Nickname, *evt.Content)
|
||||
sendMsgToAdmins(text, *evt.WebsiteID, *evt.SessionID)
|
||||
})
|
||||
|
||||
// Register handler on 'message:send/file' namespace
|
||||
reg.On("message:send/file", func(evt crisp.EventsReceiveFileMessage) {
|
||||
text := fmt.Sprintf(`(%s) *%s(%s): *[File](%s)`, chat_prefix, *evt.User.Nickname, *evt.User.UserID, evt.Content.URL)
|
||||
text := fmt.Sprintf(`%s *%s: *[File](%s)`, chat_prefix, *evt.User.Nickname, evt.Content.URL)
|
||||
sendMsgToAdmins(text, *evt.WebsiteID, *evt.SessionID)
|
||||
})
|
||||
|
||||
// Register handler on 'message:send/animation' namespace
|
||||
reg.On("message:send/animation", func(evt crisp.EventsReceiveAnimationMessage) {
|
||||
text := fmt.Sprintf(`(%s) *%s(%s): *[Animation](%s)`, chat_prefix, *evt.User.Nickname, *evt.User.UserID, evt.Content.URL)
|
||||
text := fmt.Sprintf(`%s *%s: *[Animation](%s)`, chat_prefix, *evt.User.Nickname, evt.Content.URL)
|
||||
sendMsgToAdmins(text, *evt.WebsiteID, *evt.SessionID)
|
||||
})
|
||||
},
|
||||
@@ -171,33 +105,7 @@ func init() {
|
||||
log.Fatal("Crisp listener error, check your API key or internet connection?")
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var updates tgbotapi.UpdatesChannel
|
||||
|
||||
log.Print("Start pooling")
|
||||
u := tgbotapi.NewUpdate(0)
|
||||
u.Timeout = 60
|
||||
|
||||
updates, _ = bot.GetUpdatesChan(u)
|
||||
|
||||
for update := range updates {
|
||||
if update.Message == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
log.Printf("%s %s: %s", update.Message.From.FirstName, update.Message.From.LastName, update.Message.Text)
|
||||
|
||||
switch update.Message.Command() {
|
||||
case "start":
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Blinkload Telegram 客服助手")
|
||||
msg.ParseMode = "Markdown"
|
||||
bot.Send(msg)
|
||||
}
|
||||
|
||||
if contains(config.Get("admins").([]interface{}), int64(update.Message.From.ID)) {
|
||||
// replyToUser(&update)
|
||||
}
|
||||
for {
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
}
|
||||
|
||||
1
test.html
Normal file
1
test.html
Normal file
@@ -0,0 +1 @@
|
||||
<script type="text/javascript">window.$crisp=[];window.CRISP_WEBSITE_ID="8635a202-94bb-49cc-a983-d69a45ca4be1";(function(){d=document;s=d.createElement("script");s.src="https://client.crisp.chat/l.js";s.async=1;d.getElementsByTagName("head")[0].appendChild(s);})();</script>
|
||||
@@ -18,10 +18,6 @@ func GetConfig() *viper.Viper {
|
||||
c.SetDefault("debug", true)
|
||||
c.SetDefault("admins", []interface{}{})
|
||||
|
||||
c.SetDefault("redis.host", "localhost:6379")
|
||||
c.SetDefault("redis.db", 0)
|
||||
c.SetDefault("redis.password", "")
|
||||
|
||||
c.SetDefault("crisp.identifier", "")
|
||||
c.SetDefault("crisp.key", "")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user