-
Notifications
You must be signed in to change notification settings - Fork 0
/
sms.go
94 lines (75 loc) · 2.84 KB
/
sms.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package sms
import (
"fmt"
"net/http"
"net/url"
"os"
"regexp"
"strings"
)
//Verificacellulare si assicura che il cellulare inserito sia nel formato corretto
func Verificacellulare(CELLULARE string) (ok bool) {
re := regexp.MustCompile(`^\+39[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$`)
return re.MatchString(CELLULARE)
}
//Quanto sono compliant con almeno alcune delle 12 best practices di GO!
//https://talks.golang.org/2013/bestpractices.slide#1
func recuperavariabile(variabile string) (result string, err error) {
if result, ok := os.LookupEnv(variabile); ok && len(result) != 0 {
return result, nil
}
return "", fmt.Errorf("la variabile %s non esiste o è vuota", variabile)
}
//Inviasms invia sms via Twilio
func Inviasms(to, body string) (result string) {
//Recupera il numero di Twilio dallla variabile d'ambiente
TWILIONUMBER, err := recuperavariabile("TWILIONUMBER")
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
}
//Recupera l'accountsid di Twilio dallla variabile d'ambiente
accountSid, err := recuperavariabile("TWILIOACCOUNTSID")
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
}
//Recupera il token supersegreto dalla variabile d'ambiente
authToken, err := recuperavariabile("TWILIOAUTHTOKEN")
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
}
//TODO vedere se riesce a prendere anche le variabili da ambiente windows...
//...ma anche no! :)
//Crea la URL necessaria per richiamare la funzionalità degli SMS di Twilio
urlStr := "https://api.twilio.com/2010-04-01/Accounts/" + accountSid + "/Messages.json"
//Valorizza i campi per l'invio del SMS
v := url.Values{}
v.Set("To", to) //Esempio: "+393357291532"
v.Set("From", TWILIONUMBER) //Esempio "+17372041296"
v.Set("Body", body)
//impacchettiamo tutte le variabile insieme
rb := *strings.NewReader(v.Encode())
//Creiamo un client http
client := &http.Client{}
//Creiamo la http request da inviare dopo
req, err := http.NewRequest("POST", urlStr, &rb)
if err != nil {
fmt.Fprintln(os.Stderr, "OH noooo! Qualcosa è andata storta nel creare la richiesta", err.Error())
}
//Utiliziamo l'autenticazione basic
req.SetBasicAuth(accountSid, authToken)
//Inseriamo un po' di headers come piacciono a Twilio
req.Header.Add("Accept", "application/json")
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
//Finalmente inviamo la request e salviamo la http response
resp, err := client.Do(req)
if err != nil {
fmt.Fprintln(os.Stderr, "OH noooo! Qualcosa è andata storta nell'inviare la richiesta", err)
}
//controlliamo che ha da dire la response
//Restituisce codice e significato, se ricevi 201 CREATED allora è ok.
//fmt.Println(resp.Status)
//Usciamo con zero che significa tutto ok!
//a quanto pare un exit qui ammazza anche la funzione padre che lo ha chiamato...
//os.Exit(0)
return resp.Status
}