Skip to content

Commit 16fecb5

Browse files
author
root
committed
initial commit
1 parent f7cab15 commit 16fecb5

File tree

1,364 files changed

+73248
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,364 files changed

+73248
-0
lines changed

ReadMe.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# go-whatsapp-rest-API
2+
go-whatsapp-rest-APIis a Go library for the WhatsApp web which use Swagger as api interface
3+
Sessions are stored in MYSQL
4+
5+
The API support the following
6+
7+
​/profile​/scanqr [Scan the QR code via the browser]
8+
​/profile​/phone​/isconnected
9+
​/profile​/phone​/connect
10+
​/profile​/phone​/disconnect
11+
​/profile​/logout
12+
​/profile​/me
13+
​/profile​/hook​/set
14+
​/profile​/contacts
15+
​/send​/ack​/read
16+
​/send​/text
17+
​/send​/location
18+
​/send​/image
19+
​/send​/video
20+
​/send​/audio
21+
​/send​/audiorecord
22+
​/send​/vcard
23+
​/send​/link
24+
​/send​/doc
25+
26+
Web Hooks
27+
/notify​/logout
28+
/notify​/receive
29+
/notify​/connectivity
30+
/message​/text
31+
/message​/image
32+
/message​/video
33+
/message​/audio
34+
/message​/doc
35+
/message​/contact
36+
/power​/battery
37+
/message​/location
38+
/message​/livelocation
39+
40+
The API is built on [go-whatsapp], but it does not support the MD right now, any PL is welcome
41+
42+
[go-whatsapp]: https://github.com/Rhymen/go-whatsapp
43+
44+
# Prerequisites
45+
46+
- [GoLang](https://golang.org/doc/install) Runtime environment
47+
- [MYSQL](https://www.mysql.com/downloads/)
48+
- [PM2](https://pm2.keymetrics.io/) install using command
49+
wget -qO- https://getpm2.com/install.sh | bash
50+
51+
52+
Build:
53+
- Build it for x86 architecture and linux os
54+
55+
```sh
56+
cd wa-api
57+
sh build.sh
58+
```
59+
60+
Run:
61+
- Copy wa-api executable to your server
62+
- Copy static folder for docs
63+
- Change the url to point to deployement server in static/qrcode/index.js for qr to work
64+
- Create a MySql DB eg
65+
```
66+
mysql -u root -p
67+
create database wapidb;
68+
```
69+
Run the server using pm2 with yout db user and password
70+
```
71+
pm2 start ./wa-api -- --port {Port Name} --dburl {DBUSER:DBPASSWORD@/DBNAME} --fromMe --timeout 60
72+
Eg :
73+
pm2 start ./wa-api -- --dburl beshoo_wapidb:_5,v3NaE+0Os@/beshoo_wapidb --fromMe --timeout 60
74+
```
75+
76+
### Available Flags
77+
78+
| Flag | Function | Default|
79+
| ------ | ------ |--------|
80+
| port | The port on which the server will run | 3000 |
81+
| dburl | Database access url |The sytem will not persist any session|
82+
| fromMe | If the hook should recieve message from your own number | false|
83+
| timeout | The time in seconds, API should wait before droping the connection while QR scan and session restored | 5 |

api/number.go

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
package api
2+
3+
import (
4+
"encoding/json"
5+
"time"
6+
7+
"bitbucket.org/rockyOO7/wa-api/gen/models"
8+
"bitbucket.org/rockyOO7/wa-api/gen/restapi/operations/number"
9+
wa "bitbucket.org/rockyOO7/wa-api/whatsapp"
10+
"github.com/go-openapi/runtime/middleware"
11+
"github.com/go-openapi/strfmt"
12+
log "github.com/sirupsen/logrus"
13+
)
14+
15+
//
16+
func HasWhatApp(params number.HasWhatsAppParams) middleware.Responder {
17+
errorText := ""
18+
sessionID := params.SessionID.String()
19+
handler, ok := wa.Connections[sessionID]
20+
if !ok {
21+
errorText = "Invalid Session Id"
22+
return number.NewHasWhatsAppDefault(500).WithPayload(&models.Error{
23+
Code: 500,
24+
Message: &errorText,
25+
})
26+
}
27+
phoneNumber := params.PhoneNumber
28+
value, err := handler.Wac.Exist(wa.WidJidFromNumber(phoneNumber))
29+
30+
if err != nil {
31+
errorText = err.Error()
32+
return number.NewHasWhatsAppDefault(500).WithPayload(&models.Error{
33+
Code: 500,
34+
Message: &errorText,
35+
})
36+
}
37+
38+
response := <-value
39+
var resp map[string]interface{}
40+
if err = json.Unmarshal([]byte(response), &resp); err != nil {
41+
errorText = err.Error()
42+
return number.NewHasWhatsAppDefault(500).WithPayload(&models.Error{
43+
Code: 500,
44+
Message: &errorText,
45+
})
46+
}
47+
hasNumber := false
48+
49+
if int(resp["status"].(float64)) != 200 {
50+
hasNumber = false
51+
}
52+
if int(resp["status"].(float64)) == 200 {
53+
hasNumber = true
54+
}
55+
return number.NewHasWhatsAppOK().WithPayload(&number.HasWhatsAppOKBody{
56+
HasWhatsApp: &hasNumber,
57+
})
58+
59+
}
60+
61+
//
62+
func IsOnline(params number.IsOnlineParams) middleware.Responder {
63+
errorText := ""
64+
sessionID := params.SessionID.String()
65+
handler, ok := wa.Connections[sessionID]
66+
if !ok {
67+
errorText = "Invalid Session Id"
68+
return number.NewIsOnlineDefault(500).WithPayload(&models.Error{
69+
Code: 500,
70+
Message: &errorText,
71+
})
72+
}
73+
phoneNumber := params.PhoneNumber
74+
value, err := handler.Wac.SubscribePresence(wa.WidJidFromNumberC(phoneNumber))
75+
if err != nil {
76+
errorText = err.Error()
77+
return number.NewIsOnlineDefault(500).WithPayload(&models.Error{
78+
Code: 500,
79+
Message: &errorText,
80+
})
81+
}
82+
response := <-value
83+
var resp map[string]interface{}
84+
if err = json.Unmarshal([]byte(response), &resp); err != nil {
85+
errorText = err.Error()
86+
return number.NewIsOnlineDefault(500).WithPayload(&models.Error{
87+
Code: 500,
88+
Message: &errorText,
89+
})
90+
}
91+
log.Infof("Online Status %v", resp)
92+
if int(resp["status"].(float64)) != 200 {
93+
errorText = "Presence failed"
94+
return number.NewIsOnlineDefault(500).WithPayload(&models.Error{
95+
Code: 500,
96+
Message: &errorText,
97+
})
98+
}
99+
time.Sleep(1 * time.Second)
100+
// online := handler.OnlineNumbers[phoneNumber]
101+
online := handler.IsOnline(phoneNumber)
102+
103+
log.Infof("Number %v is %v", phoneNumber, online)
104+
return number.NewIsOnlineOK().WithPayload(&number.IsOnlineOKBody{
105+
IsOnline: &online.IsOnline,
106+
LastSeen: online.LastSeen,
107+
})
108+
}
109+
110+
//
111+
func GetChats(params number.GetChatsParams) middleware.Responder {
112+
errorText := ""
113+
sessionID := params.SessionID.String()
114+
handler, ok := wa.Connections[sessionID]
115+
if !ok {
116+
errorText = "Invalid Session Id"
117+
return number.NewIsOnlineDefault(500).WithPayload(&models.Error{
118+
Code: 500,
119+
Message: &errorText,
120+
})
121+
}
122+
phoneNumber := params.PhoneNumber
123+
if params.NumberOfMessages > 300 {
124+
errorText = "Max 300 messages allowed at one time"
125+
return number.NewIsOnlineDefault(500).WithPayload(&models.Error{
126+
Code: 500,
127+
Message: &errorText,
128+
})
129+
}
130+
if params.NumberOfMessages < 2 {
131+
errorText = "Min 2 messages allowed at one time"
132+
return number.NewIsOnlineDefault(500).WithPayload(&models.Error{
133+
Code: 500,
134+
Message: &errorText,
135+
})
136+
}
137+
chunk := int(params.NumberOfMessages)
138+
// chunk := int(params.NumberOfMessages) - 1
139+
chats := wa.GetChatHistory(handler.Wac, &sessionID, phoneNumber, chunk, params.BeforeMessageID, params.FromMe)
140+
return number.NewGetChatsOK().WithPayload(chats)
141+
}
142+
143+
144+
145+
146+
func GetAvatar(params number.GetAvatarParams) middleware.Responder {
147+
148+
type ThumbURL struct {
149+
EURL string `json:"eurl"`
150+
Tag string `json:"tag"`
151+
Status int64 `json:"status"`
152+
}
153+
154+
errorText := ""
155+
sessionID := params.SessionID.String()
156+
number_url := params.PhoneNumber
157+
handler, ok := wa.Connections[sessionID]
158+
if !ok {
159+
errorText = "Invalid Session Id"
160+
return number.NewGetAvatarDefault(500).WithPayload(&models.Error{
161+
Code: 500,
162+
Message: &errorText,
163+
})
164+
}
165+
166+
if handler.Wac == nil {
167+
errorText = "Invalid Wac"
168+
return number.NewGetAvatarDefault(500).WithPayload(&models.Error{
169+
Code: 500,
170+
Message: &errorText,
171+
})
172+
}
173+
174+
175+
jid := wa.WidJidFromNumber(number_url)
176+
thumbChan, err := handler.Wac.GetProfilePicThumb(jid)
177+
if err != nil {
178+
errorText = err.Error()
179+
return number.NewGetAvatarDefault(500).WithPayload(&models.Error{
180+
Code: 500,
181+
Message: &errorText,
182+
})
183+
}
184+
thumb := <-thumbChan
185+
thumbnail := ThumbURL{}
186+
err = json.Unmarshal([]byte(thumb), &thumbnail)
187+
if err != nil {
188+
errorText = err.Error()
189+
return number.NewGetAvatarDefault(500).WithPayload(&models.Error{
190+
Code: 500,
191+
Message: &errorText,
192+
})
193+
}
194+
url := ""
195+
if thumbnail.Status != 404 {
196+
url = thumbnail.EURL
197+
}
198+
199+
return number.NewGetAvatarOK().WithPayload(&models.Profile{
200+
PhoneNumber: &number_url,
201+
ProfilePic: strfmt.URI(url),
202+
})
203+
204+
}
205+

0 commit comments

Comments
 (0)