mirror of
https://github.com/aljazceru/signal-cli-rest-api.git
synced 2025-12-24 01:54:22 +01:00
Merge branch 'master' of github.com:bbernhard/signal-cli-rest-api
This commit is contained in:
@@ -114,6 +114,8 @@ The Swagger API documentation can be found [here](https://bbernhard.github.io/si
|
||||
|
||||
[Running Signal Messenger REST API in Azure Web App for Containers](https://stefanstranger.github.io/2021/06/01/RunningSignalRESTAPIinAppService/) by [@stefanstranger](https://github.com/stefanstranger)
|
||||
|
||||
[Sending Signal Messages](https://blog.aawadia.dev/2023/04/24/signal-api/) by [@asad-awadia](https://github.com/asad-awadia)
|
||||
|
||||
## Advanced Settings
|
||||
There are a bunch of environmental variables that can be set inside the docker container in order to change some technical details. This settings are meant for developers and advanced users. Usually you do *not* need to change anything here - the default values are perfectly fine!
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gabriel-vasile/mimetype"
|
||||
@@ -93,15 +94,16 @@ type SendMessageV1 struct {
|
||||
}
|
||||
|
||||
type SendMessageV2 struct {
|
||||
Number string `json:"number"`
|
||||
Recipients []string `json:"recipients"`
|
||||
Message string `json:"message"`
|
||||
Base64Attachments []string `json:"base64_attachments" example:"<BASE64 ENCODED DATA>,data:<MIME-TYPE>;base64<comma><BASE64 ENCODED DATA>,data:<MIME-TYPE>;filename=<FILENAME>;base64<comma><BASE64 ENCODED DATA>"`
|
||||
Mentions []client.MessageMention `json:"mentions"`
|
||||
QuoteTimestamp *int64 `json:"quote_timestamp"`
|
||||
QuoteAuthor *string `json:"quote_author"`
|
||||
QuoteMessage *string `json:"quote_message"`
|
||||
QuoteMentions []client.MessageMention `json:"quote_mentions"`
|
||||
Number string `json:"number"`
|
||||
Recipients []string `json:"recipients"`
|
||||
Message string `json:"message"`
|
||||
Base64Attachments []string `json:"base64_attachments" example:"<BASE64 ENCODED DATA>,data:<MIME-TYPE>;base64<comma><BASE64 ENCODED DATA>,data:<MIME-TYPE>;filename=<FILENAME>;base64<comma><BASE64 ENCODED DATA>"`
|
||||
Sticker string `json:"sticker"`
|
||||
Mentions []client.MessageMention `json:"mentions"`
|
||||
QuoteTimestamp *int64 `json:"quote_timestamp"`
|
||||
QuoteAuthor *string `json:"quote_author"`
|
||||
QuoteMessage *string `json:"quote_message"`
|
||||
QuoteMentions []client.MessageMention `json:"quote_mentions"`
|
||||
}
|
||||
|
||||
type TypingIndicatorRequest struct {
|
||||
@@ -359,7 +361,13 @@ func (a *Api) SendV2(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
timestamps, err := a.signalClient.SendV2(req.Number, req.Message, req.Recipients, req.Base64Attachments,
|
||||
if req.Sticker != "" && !strings.Contains(req.Sticker, ":") {
|
||||
c.JSON(400, gin.H{"error": "Couldn't process request - please provide valid sticker delimiter"})
|
||||
return
|
||||
}
|
||||
|
||||
timestamps, err := a.signalClient.SendV2(
|
||||
req.Number, req.Message, req.Recipients, req.Base64Attachments, req.Sticker,
|
||||
req.Mentions, req.QuoteTimestamp, req.QuoteAuthor, req.QuoteMessage, req.QuoteMentions)
|
||||
if err != nil {
|
||||
c.JSON(400, Error{Msg: err.Error()})
|
||||
|
||||
@@ -60,9 +60,9 @@ func (g GroupLinkState) String() string {
|
||||
}
|
||||
|
||||
type MessageMention struct {
|
||||
Start int64 `json:"start"`
|
||||
Length int64 `json:"length"`
|
||||
Author string `json:"author"`
|
||||
Start int64 `json:"start"`
|
||||
Length int64 `json:"length"`
|
||||
Author string `json:"author"`
|
||||
}
|
||||
|
||||
type GroupEntry struct {
|
||||
@@ -122,11 +122,11 @@ type SendResponse struct {
|
||||
}
|
||||
|
||||
type About struct {
|
||||
SupportedApiVersions []string `json:"versions"`
|
||||
BuildNr int `json:"build"`
|
||||
Mode string `json:"mode"`
|
||||
Version string `json:"version"`
|
||||
Capabilities map[string][]string `json:"capabilities"`
|
||||
SupportedApiVersions []string `json:"versions"`
|
||||
BuildNr int `json:"build"`
|
||||
Mode string `json:"mode"`
|
||||
Version string `json:"version"`
|
||||
Capabilities map[string][]string `json:"capabilities"`
|
||||
}
|
||||
|
||||
type SearchResultEntry struct {
|
||||
@@ -290,11 +290,11 @@ func (s *SignalClient) Init() error {
|
||||
}
|
||||
|
||||
func (s *MessageMention) toString() string {
|
||||
return fmt.Sprintf("%d:%d:%s", s.Start, s.Length, s.Author)
|
||||
return fmt.Sprintf("%d:%d:%s", s.Start, s.Length, s.Author)
|
||||
}
|
||||
|
||||
func (s *SignalClient) send(number string, message string,
|
||||
recipients []string, base64Attachments []string, isGroup bool, mentions []MessageMention,
|
||||
recipients []string, base64Attachments []string, isGroup bool, sticker string, mentions []MessageMention,
|
||||
quoteTimestamp *int64, quoteAuthor *string, quoteMessage *string, quoteMentions []MessageMention) (*SendResponse, error) {
|
||||
|
||||
var resp SendResponse
|
||||
@@ -336,15 +336,16 @@ func (s *SignalClient) send(number string, message string,
|
||||
}
|
||||
|
||||
type Request struct {
|
||||
Recipients []string `json:"recipient,omitempty"`
|
||||
Message string `json:"message"`
|
||||
GroupId string `json:"group-id,omitempty"`
|
||||
Attachments []string `json:"attachment,omitempty"`
|
||||
Mentions []string `json:"mentions,omitempty"`
|
||||
QuoteTimestamp *int64 `json:"quote-timestamp,omitempty"`
|
||||
QuoteAuthor *string `json:"quote-author,omitempty"`
|
||||
QuoteMessage *string `json:"quote-message,omitempty"`
|
||||
QuoteMentions []string `json:"quote-mentions,omitempty"`
|
||||
Recipients []string `json:"recipient,omitempty"`
|
||||
Message string `json:"message"`
|
||||
GroupId string `json:"group-id,omitempty"`
|
||||
Attachments []string `json:"attachment,omitempty"`
|
||||
Sticker string `json:"sticker,omitempty"`
|
||||
Mentions []string `json:"mentions,omitempty"`
|
||||
QuoteTimestamp *int64 `json:"quote-timestamp,omitempty"`
|
||||
QuoteAuthor *string `json:"quote-author,omitempty"`
|
||||
QuoteMessage *string `json:"quote-message,omitempty"`
|
||||
QuoteMentions []string `json:"quote-mentions,omitempty"`
|
||||
}
|
||||
|
||||
request := Request{Message: message}
|
||||
@@ -356,24 +357,26 @@ func (s *SignalClient) send(number string, message string,
|
||||
for _, attachmentEntry := range attachmentEntries {
|
||||
request.Attachments = append(request.Attachments, attachmentEntry.toDataForSignal())
|
||||
}
|
||||
|
||||
request.Sticker = sticker
|
||||
if mentions != nil {
|
||||
request.Mentions = make([]string, len(mentions))
|
||||
for i, mention := range mentions {
|
||||
request.Mentions[i] = mention.toString()
|
||||
}
|
||||
request.Mentions = make([]string, len(mentions))
|
||||
for i, mention := range mentions {
|
||||
request.Mentions[i] = mention.toString()
|
||||
}
|
||||
} else {
|
||||
request.Mentions = nil
|
||||
request.Mentions = nil
|
||||
}
|
||||
request.QuoteTimestamp = quoteTimestamp
|
||||
request.QuoteAuthor = quoteAuthor
|
||||
request.QuoteMessage = quoteMessage
|
||||
if quoteMentions != nil {
|
||||
request.QuoteMentions = make([]string, len(quoteMentions))
|
||||
for i, mention := range quoteMentions {
|
||||
request.QuoteMentions[i] = mention.toString()
|
||||
}
|
||||
request.QuoteMentions = make([]string, len(quoteMentions))
|
||||
for i, mention := range quoteMentions {
|
||||
request.QuoteMentions[i] = mention.toString()
|
||||
}
|
||||
} else {
|
||||
request.QuoteMentions = nil
|
||||
request.QuoteMentions = nil
|
||||
}
|
||||
|
||||
rawData, err := jsonRpc2Client.getRaw("send", request)
|
||||
@@ -409,6 +412,11 @@ func (s *SignalClient) send(number string, message string,
|
||||
cmd = append(cmd, mention.toString())
|
||||
}
|
||||
|
||||
if sticker != "" {
|
||||
cmd = append(cmd, "--sticker")
|
||||
cmd = append(cmd, sticker)
|
||||
}
|
||||
|
||||
if quoteTimestamp != nil {
|
||||
cmd = append(cmd, "--quote-timestamp")
|
||||
cmd = append(cmd, strconv.FormatInt(*quoteTimestamp, 10))
|
||||
@@ -519,7 +527,7 @@ func (s *SignalClient) VerifyRegisteredNumber(number string, token string, pin s
|
||||
}
|
||||
|
||||
func (s *SignalClient) SendV1(number string, message string, recipients []string, base64Attachments []string, isGroup bool) (*SendResponse, error) {
|
||||
timestamp, err := s.send(number, message, recipients, base64Attachments, isGroup, nil, nil, nil, nil, nil)
|
||||
timestamp, err := s.send(number, message, recipients, base64Attachments, isGroup, "", nil, nil, nil, nil, nil)
|
||||
return timestamp, err
|
||||
}
|
||||
|
||||
@@ -538,7 +546,7 @@ func (s *SignalClient) getJsonRpc2Clients() []*JsonRpc2Client {
|
||||
return jsonRpc2Clients
|
||||
}
|
||||
|
||||
func (s *SignalClient) SendV2(number string, message string, recps []string, base64Attachments []string, mentions []MessageMention,
|
||||
func (s *SignalClient) SendV2(number string, message string, recps []string, base64Attachments []string, sticker string, mentions []MessageMention,
|
||||
quoteTimestamp *int64, quoteAuthor *string, quoteMessage *string, quoteMentions []MessageMention) (*[]SendResponse, error) {
|
||||
if len(recps) == 0 {
|
||||
return nil, errors.New("Please provide at least one recipient")
|
||||
@@ -569,7 +577,7 @@ func (s *SignalClient) SendV2(number string, message string, recps []string, bas
|
||||
|
||||
timestamps := []SendResponse{}
|
||||
for _, group := range groups {
|
||||
timestamp, err := s.send(number, message, []string{group}, base64Attachments, true, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions)
|
||||
timestamp, err := s.send(number, message, []string{group}, base64Attachments, true, sticker, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -577,7 +585,7 @@ func (s *SignalClient) SendV2(number string, message string, recps []string, bas
|
||||
}
|
||||
|
||||
if len(recipients) > 0 {
|
||||
timestamp, err := s.send(number, message, recipients, base64Attachments, false, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions)
|
||||
timestamp, err := s.send(number, message, recipients, base64Attachments, false, sticker, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user