Documentation ¶
Overview ¶
Package whatsapp provides a developer API to interact with the WhatsAppWeb-Servers.
Index ¶
- Constants
- Variables
- func CheckCurrentServerVersion() ([]int, error)
- func Download(url string, mediaKey []byte, appInfo MediaType, fileLength int) ([]byte, error)
- func GetLiveLocationProto(msg LiveLocationMessage) *proto.WebMessageInfo
- func GetLocationProto(msg LocationMessage) *proto.WebMessageInfo
- func ParseProtoMessage(msg *proto.WebMessageInfo) interface{}
- type AudioMessage
- type AudioMessageHandler
- type Chat
- type ChatListHandler
- type Conn
- func (wac *Conn) AddHandler(handler Handler)
- func (wac *Conn) AddMember(jid string, participants []string) (<-chan string, error)
- func (wac *Conn) AdminTest() (bool, error)
- func (wac *Conn) Chats() (*binary.Node, error)
- func (wac *Conn) Contacts() (*binary.Node, error)
- func (wac *Conn) CreateGroup(subject string, participants []string) (<-chan string, error)
- func (wac *Conn) Disconnect() (Session, error)
- func (wac *Conn) Emoji() (*binary.Node, error)
- func (wac *Conn) Exist(jid string) (<-chan string, error)
- func (wac *Conn) GetClientVersion() []int
- func (wac *Conn) GetGroupMetaData(jid string) (<-chan string, error)
- func (wac *Conn) GetProfilePicThumb(jid string) (<-chan string, error)
- func (wac *Conn) GetStatus(jid string) (<-chan string, error)
- func (wac *Conn) GroupAcceptInviteCode(code string) (jid string, err error)
- func (wac *Conn) GroupInviteLink(jid string) (string, error)
- func (wac *Conn) IsConnected() bool
- func (wac *Conn) IsLoggedIn() bool
- func (wac *Conn) IsLoginInProgress() bool
- func (wac *Conn) LeaveGroup(jid string) (<-chan string, error)
- func (wac *Conn) LoadChatMessages(jid string, count int, messageId string, owner bool, after bool, ...) error
- func (wac *Conn) LoadFullChatHistory(jid string, chunkSize int, pauseBetweenQueries time.Duration, ...)
- func (wac *Conn) LoadFullChatHistoryAfter(jid string, messageId string, chunkSize int, pauseBetweenQueries time.Duration, ...)
- func (wac *Conn) LoadMediaInfo(jid, messageId, owner string) (*binary.Node, error)
- func (wac *Conn) LoadMessages(jid string, count int) (*binary.Node, error)
- func (wac *Conn) LoadMessagesAfter(jid, messageId string, fromMe bool, count int) (*binary.Node, error)
- func (wac *Conn) LoadMessagesBefore(jid, messageId string, fromMe bool, count int) (*binary.Node, error)
- func (wac *Conn) Login(qrChan chan<- string) (Session, error)
- func (wac *Conn) LoginWithRetry(qrChan chan<- string, maxRetries int) (Session, error)
- func (wac *Conn) Logout() error
- func (wac *Conn) Presence(jid string, presence Presence) (<-chan string, error)
- func (wac *Conn) Read(jid, id string) (<-chan string, error)
- func (wac *Conn) RemoveAdmin(jid string, participants []string) (<-chan string, error)
- func (wac *Conn) RemoveHandler(handler Handler) bool
- func (wac *Conn) RemoveHandlers()
- func (wac *Conn) RemoveMember(jid string, participants []string) (<-chan string, error)
- func (wac *Conn) Restore() error
- func (wac *Conn) RestoreWithSession(session Session) (_ Session, err error)
- func (wac *Conn) Search(search string, count, page int) (*binary.Node, error)
- func (wac *Conn) Send(msg interface{}) (string, error)
- func (wac *Conn) SetAdmin(jid string, participants []string) (<-chan string, error)
- func (wac *Conn) SetClientName(long, short, version string) error
- func (wac *Conn) SetClientVersion(major int, minor int, patch int)
- func (wac *Conn) SubscribePresence(jid string) (<-chan string, error)
- func (wac *Conn) UpdateGroupDescription(jid, description string) (<-chan string, error)
- func (wac *Conn) UpdateGroupSubject(subject string, jid string) (<-chan string, error)
- func (wac *Conn) Upload(reader io.Reader, appInfo MediaType) (downloadURL string, mediaKey []byte, fileEncSha256 []byte, fileSha256 []byte, ...)
- func (wac *Conn) UploadProfilePic(image, preview []byte) (<-chan string, error)
- type Contact
- type ContactListHandler
- type ContactMessage
- type ContactMessageHandler
- type ContextInfo
- type DocumentMessage
- type DocumentMessageHandler
- type ErrConnectionClosed
- type ErrConnectionFailed
- type Handler
- type ImageMessage
- type ImageMessageHandler
- type Info
- type JsonMessageHandler
- type LiveLocationMessage
- type LiveLocationMessageHandler
- type LocationMessage
- type LocationMessageHandler
- type MediaConn
- type MediaType
- type MessageInfo
- type MessageOffsetInfo
- type MessageStatus
- type PhoneInfo
- type Presence
- type RawMessageHandler
- type Session
- type StickerMessage
- type StickerMessageHandler
- type Store
- type SyncHandler
- type TextMessage
- type TextMessageHandler
- type VideoMessage
- type VideoMessageHandler
Constants ¶
const ( Error MessageStatus = 0 Pending = 1 ServerAck = 2 DeliveryAck = 3 Read = 4 Played = 5 )
Variables ¶
var ( ErrAlreadyConnected = errors.New("already connected") ErrAlreadyLoggedIn = errors.New("already logged in") ErrInvalidSession = errors.New("invalid session") ErrLoginInProgress = errors.New("login or restore already running") ErrNotConnected = errors.New("not connected") ErrInvalidWsData = errors.New("received invalid data") ErrInvalidWsState = errors.New("can't handle binary data when not logged in") ErrConnectionTimeout = errors.New("connection timed out") ErrMissingMessageTag = errors.New("no messageTag specified or to short") ErrInvalidHmac = errors.New("invalid hmac") ErrInvalidServerResponse = errors.New("invalid response received from server") ErrServerRespondedWith404 = errors.New("server responded with status 404") ErrMediaDownloadFailedWith404 = errors.New("download failed with status code 404") ErrMediaDownloadFailedWith410 = errors.New("download failed with status code 410") ErrLoginTimedOut = errors.New("login timed out") ErrBadRequest = errors.New("400 (bad request)") ErrUnpaired = errors.New("401 (unpaired from phone)") ErrAccessDenied = errors.New("403 (access denied)") ErrLoggedIn = errors.New("405 (already logged in)") ErrReplaced = errors.New("409 (logged in from another location)") ErrNoURLPresent = errors.New("no url present") ErrFileLengthMismatch = errors.New("file length does not match") ErrInvalidHashLength = errors.New("hash too short") ErrTooShortFile = errors.New("file too short") ErrInvalidMediaHMAC = errors.New("invalid media hmac") )
Functions ¶
func CheckCurrentServerVersion ¶
CheckCurrentServerVersion is based on the login method logic in order to establish the websocket connection and get the current version from the server with the `admin init` command. This can be very useful for automations in which you need to quickly perceive new versions (mostly patches) and update your application so it suddenly stops working.
func GetLiveLocationProto ¶
func GetLiveLocationProto(msg LiveLocationMessage) *proto.WebMessageInfo
func GetLocationProto ¶
func GetLocationProto(msg LocationMessage) *proto.WebMessageInfo
func ParseProtoMessage ¶
func ParseProtoMessage(msg *proto.WebMessageInfo) interface{}
Types ¶
type AudioMessage ¶
type AudioMessage struct { Info MessageInfo Length uint32 Type string Content io.Reader Ptt bool ContextInfo ContextInfo // contains filtered or unexported fields }
AudioMessage represents a audio message. Unexported fields are needed for media up/downloading and media validation. Provide a io.Reader as Content for message sending.
func (*AudioMessage) Download ¶
func (m *AudioMessage) Download() ([]byte, error)
Download is the function to retrieve media data. The media gets downloaded, validated and returned.
type AudioMessageHandler ¶
type AudioMessageHandler interface { Handler HandleAudioMessage(message AudioMessage) }
The AudioMessageHandler interface needs to be implemented to receive audio messages dispatched by the dispatcher.
type ChatListHandler ¶
* The ChatListHandler interface needs to be implemented to apply custom actions to chat lists dispatched by the dispatcher.
type Conn ¶
type Conn struct { Info *Info Store *Store ServerLastSeen time.Time Proxy func(*http.Request) (*url.URL, error) // contains filtered or unexported fields }
Conn is created by NewConn. Interacting with the initialized Conn is the main way of interacting with our package. It holds all necessary information to make the package work internally.
func NewConn ¶
Creates a new connection with a given timeout. The websocket connection to the WhatsAppWeb servers get´s established. The goroutine for handling incoming messages is started
func NewConnWithProxy ¶
func NewConnWithProxy(timeout time.Duration, proxy func(*http.Request) (*url.URL, error)) (*Conn, error)
NewConnWithProxy Create a new connect with a given timeout and a http proxy.
func (*Conn) AddHandler ¶
AddHandler adds an handler to the list of handler that receive dispatched messages. The provided handler must at least implement the Handler interface. Additionally implemented handlers(TextMessageHandler, ImageMessageHandler) are optional. At runtime it is checked if they are implemented and they are called if so and needed.
func (*Conn) CreateGroup ¶
func (*Conn) Disconnect ¶
func (*Conn) GetClientVersion ¶
GetClientVersion returns WhatsApp client version
func (*Conn) GetGroupMetaData ¶
func (*Conn) GetProfilePicThumb ¶
TODO: filename? WhatsApp uses Store.Contacts for these functions functions probably shouldn't return a string, maybe build a struct / return json check for further queries
func (*Conn) GroupAcceptInviteCode ¶
func (*Conn) IsConnected ¶
func (*Conn) IsLoggedIn ¶
func (*Conn) IsLoginInProgress ¶
func (*Conn) LoadChatMessages ¶
func (wac *Conn) LoadChatMessages(jid string, count int, messageId string, owner bool, after bool, handlers ...Handler) error
LoadChatMessages is useful to "scroll" messages, loading by count at a time if handlers == nil the func will use default handlers if after == true LoadChatMessages will load messages after the specified messageId, otherwise it will return message before the messageId
func (*Conn) LoadFullChatHistory ¶
func (wac *Conn) LoadFullChatHistory(jid string, chunkSize int, pauseBetweenQueries time.Duration, handlers ...Handler)
LoadFullChatHistory loads full chat history for the given jid chunkSize = how many messages to load with one query; if handlers == nil the func will use default handlers; pauseBetweenQueries = how much time to sleep between queries
func (*Conn) LoadFullChatHistoryAfter ¶
func (wac *Conn) LoadFullChatHistoryAfter(jid string, messageId string, chunkSize int, pauseBetweenQueries time.Duration, handlers ...Handler)
LoadFullChatHistoryAfter loads all messages after the specified messageId useful to "catch up" with the message history after some specified message
func (*Conn) LoadMediaInfo ¶
func (*Conn) LoadMessages ¶
func (*Conn) LoadMessagesAfter ¶
func (*Conn) LoadMessagesBefore ¶
func (*Conn) Login ¶
Login is the function that creates a new whatsapp session and logs you in. If you do not want to scan the qr code every time, you should save the returned session and use RestoreWithSession the next time. Login takes a writable channel as an parameter. This channel is used to push the data represented by the qr code back to the user. The received data should be displayed as an qr code in a way you prefer. To print a qr code to console you can use: github.com/Baozisoftware/qrcode-terminal-go Example login procedure:
wac, err := whatsapp.NewConn(5 * time.Second) if err != nil { panic(err) } qr := make(chan string) go func() { terminal := qrcodeTerminal.New() terminal.Get(<-qr).Print() }() session, err := wac.Login(qr) if err != nil { fmt.Fprintf(os.Stderr, "error during login: %v\n", err) } fmt.Printf("login successful, session: %v\n", session)
func (*Conn) LoginWithRetry ¶
func (*Conn) Logout ¶
Logout is the function to logout from a WhatsApp session. Logging out means invalidating the current session. The session can not be resumed and will disappear on your phone in the WhatsAppWeb client list.
func (*Conn) RemoveAdmin ¶
func (*Conn) RemoveHandler ¶
RemoveHandler removes a handler from the list of handlers that receive dispatched messages.
func (*Conn) RemoveHandlers ¶
func (wac *Conn) RemoveHandlers()
RemoveHandlers empties the list of handlers that receive dispatched messages.
func (*Conn) RemoveMember ¶
func (*Conn) Restore ¶
//TODO: GoDoc RestoreWithSession is the function that restores a given session. It will try to reestablish the connection to the WhatsAppWeb servers with the provided session. If it succeeds it will return a new session. This new session has to be saved because the Client and Server-Token will change after every login. Logging in with old tokens is possible, but not suggested. If so, a challenge has to be resolved which is just another possible point of failure.
func (*Conn) SetClientName ¶
SetClientName sets the long and short client names that are sent to WhatsApp when logging in and displayed in the WhatsApp Web device list. As the values are only sent when logging in, changing them after logging in is not possible.
func (*Conn) SetClientVersion ¶
SetClientVersion sets WhatsApp client version Default value is 0.4.2080
func (*Conn) SubscribePresence ¶
func (*Conn) UpdateGroupDescription ¶
func (*Conn) UpdateGroupSubject ¶
type ContactListHandler ¶
* The ContactListHandler interface needs to be implemented to applky custom actions to contact lists dispatched by the dispatcher.
type ContactMessage ¶
type ContactMessage struct { Info MessageInfo DisplayName string Vcard string ContextInfo ContextInfo }
ContactMessage represents a contact message.
type ContactMessageHandler ¶
type ContactMessageHandler interface { Handler HandleContactMessage(message ContactMessage) }
The ContactMessageHandler interface needs to be implemented to receive contact messages dispatched by the dispatcher.
type ContextInfo ¶
type ContextInfo struct { QuotedMessageID string //StanzaId QuotedMessage *proto.Message Participant string IsForwarded bool }
ContextInfo represents contextinfo of every message
type DocumentMessage ¶
type DocumentMessage struct { Info MessageInfo Title string PageCount uint32 Type string FileName string Thumbnail []byte Content io.Reader ContextInfo ContextInfo // contains filtered or unexported fields }
DocumentMessage represents a document message. Unexported fields are needed for media up/downloading and media validation. Provide a io.Reader as Content for message sending.
func (*DocumentMessage) Download ¶
func (m *DocumentMessage) Download() ([]byte, error)
Download is the function to retrieve media data. The media gets downloaded, validated and returned.
type DocumentMessageHandler ¶
type DocumentMessageHandler interface { Handler HandleDocumentMessage(message DocumentMessage) }
The DocumentMessageHandler interface needs to be implemented to receive document messages dispatched by the dispatcher.
type ErrConnectionClosed ¶
func (*ErrConnectionClosed) Error ¶
func (e *ErrConnectionClosed) Error() string
type ErrConnectionFailed ¶
type ErrConnectionFailed struct {
Err error
}
func (*ErrConnectionFailed) Error ¶
func (e *ErrConnectionFailed) Error() string
type Handler ¶
type Handler interface {
HandleError(err error)
}
The Handler interface is the minimal interface that needs to be implemented to be accepted as a valid handler for our dispatching system. The minimal handler is used to dispatch error messages. These errors occur on unexpected behavior by the websocket connection or if we are unable to handle or interpret an incoming message. Error produced by user actions are not dispatched through this handler. They are returned as an error on the specific function call.
type ImageMessage ¶
type ImageMessage struct { Info MessageInfo Caption string Thumbnail []byte Type string Content io.Reader ContextInfo ContextInfo // contains filtered or unexported fields }
ImageMessage represents a image message. Unexported fields are needed for media up/downloading and media validation. Provide a io.Reader as Content for message sending.
func (*ImageMessage) Download ¶
func (m *ImageMessage) Download() ([]byte, error)
Download is the function to retrieve media data. The media gets downloaded, validated and returned.
type ImageMessageHandler ¶
type ImageMessageHandler interface { Handler HandleImageMessage(message ImageMessage) }
The ImageMessageHandler interface needs to be implemented to receive image messages dispatched by the dispatcher.
type JsonMessageHandler ¶
The JsonMessageHandler interface needs to be implemented to receive json messages dispatched by the dispatcher. These json messages contain status updates of every kind sent by WhatsAppWeb servers. WhatsAppWeb uses these messages to built a Store, which is used to save these "secondary" information. These messages may contain presence (available, last see) information, or just the battery status of your phone.
type LiveLocationMessage ¶
type LiveLocationMessage struct { Info MessageInfo DegreesLatitude float64 DegreesLongitude float64 AccuracyInMeters uint32 SpeedInMps float32 DegreesClockwiseFromMagneticNorth uint32 Caption string SequenceNumber int64 JpegThumbnail []byte ContextInfo ContextInfo }
LiveLocationMessage represents a live location message
func GetLiveLocationMessage ¶
func GetLiveLocationMessage(msg *proto.WebMessageInfo) LiveLocationMessage
type LiveLocationMessageHandler ¶
type LiveLocationMessageHandler interface { Handler HandleLiveLocationMessage(message LiveLocationMessage) }
The LiveLocationMessageHandler interface needs to be implemented to receive live location messages dispatched by the dispatcher.
type LocationMessage ¶
type LocationMessage struct { Info MessageInfo DegreesLatitude float64 DegreesLongitude float64 Name string Address string Url string JpegThumbnail []byte ContextInfo ContextInfo }
LocationMessage represents a location message
func GetLocationMessage ¶
func GetLocationMessage(msg *proto.WebMessageInfo) LocationMessage
type LocationMessageHandler ¶
type LocationMessageHandler interface { Handler HandleLocationMessage(message LocationMessage) }
The LocationMessageHandler interface needs to be implemented to receive location messages dispatched by the dispatcher.
type MessageInfo ¶
type MessageInfo struct { Id string RemoteJid string SenderJid string FromMe bool Timestamp uint64 PushName string Status MessageStatus Source *proto.WebMessageInfo }
MessageInfo contains general message information. It is part of every of every message type.
type MessageOffsetInfo ¶
type MessageStatus ¶
type MessageStatus int
type RawMessageHandler ¶
type RawMessageHandler interface { Handler HandleRawMessage(message *proto.WebMessageInfo) }
* The RawMessageHandler interface needs to be implemented to receive raw messages dispatched by the dispatcher. Raw messages are the raw protobuf structs instead of the easy-to-use structs in TextMessageHandler, ImageMessageHandler, etc..
type Session ¶
type Session struct { ClientId string ClientToken string ServerToken string EncKey []byte MacKey []byte Wid string }
Session contains session individual information. To be able to resume the connection without scanning the qr code every time you should save the Session returned by Login and use RestoreWithSession the next time you want to login. Every successful created connection returns a new Session. The Session(ClientToken, ServerToken) is altered after every re-login and should be saved every time.
type StickerMessage ¶
type StickerMessage struct { Info MessageInfo Type string Content io.Reader ContextInfo ContextInfo // contains filtered or unexported fields }
StickerMessage represents a sticker message.
func (*StickerMessage) Download ¶
func (m *StickerMessage) Download() ([]byte, error)
type StickerMessageHandler ¶
type StickerMessageHandler interface { Handler HandleStickerMessage(message StickerMessage) }
The StickerMessageHandler interface needs to be implemented to receive sticker messages dispatched by the dispatcher.
type SyncHandler ¶
type TextMessage ¶
type TextMessage struct { Info MessageInfo Text string ContextInfo ContextInfo }
TextMessage represents a text message.
type TextMessageHandler ¶
type TextMessageHandler interface { Handler HandleTextMessage(message TextMessage) }
The TextMessageHandler interface needs to be implemented to receive text messages dispatched by the dispatcher.
type VideoMessage ¶
type VideoMessage struct { Info MessageInfo Caption string Thumbnail []byte Length uint32 Type string Content io.Reader GifPlayback bool ContextInfo ContextInfo // contains filtered or unexported fields }
VideoMessage represents a video message. Unexported fields are needed for media up/downloading and media validation. Provide a io.Reader as Content for message sending.
func (*VideoMessage) Download ¶
func (m *VideoMessage) Download() ([]byte, error)
Download is the function to retrieve media data. The media gets downloaded, validated and returned.
type VideoMessageHandler ¶
type VideoMessageHandler interface { Handler HandleVideoMessage(message VideoMessage) }
The VideoMessageHandler interface needs to be implemented to receive video messages dispatched by the dispatcher.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
crypto package contains cryptographic functions and servers as a support package for github.com/Rhymen/go-whatsapp.
|
crypto package contains cryptographic functions and servers as a support package for github.com/Rhymen/go-whatsapp. |
cbc
CBC describes a block cipher mode.
|
CBC describes a block cipher mode. |
curve25519
In cryptography, Curve25519 is an elliptic curve offering 128 bits of security and designed for use with the elliptic curve Diffie–Hellman (ECDH) key agreement scheme.
|
In cryptography, Curve25519 is an elliptic curve offering 128 bits of security and designed for use with the elliptic curve Diffie–Hellman (ECDH) key agreement scheme. |
hkdf
HKDF is a simple key derivation function (KDF) based on a hash-based message authentication code (HMAC).
|
HKDF is a simple key derivation function (KDF) based on a hash-based message authentication code (HMAC). |
examples
|
|