Merge branch 'master' of github.com:bbernhard/signal-cli-rest-api

This commit is contained in:
Bernhard B
2023-05-07 21:55:06 +02:00
3 changed files with 61 additions and 43 deletions

View File

@@ -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!

View File

@@ -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()})

View File

@@ -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
}