Code: Select all | Expand
#include "FiveWin.ch"#include "hbsocket.ch"function Main() local oWA := HB_WhatsApp():New() ? oWA:Connect() oWA:Login()return nilCLASS HB_WhatsApp DATA pSocket DATA cHost INIT "bin-short.whatsapp.net" DATA nPort INIT 5222 DATA cIP DATA aResArray DATA cMsg DATA _Incomplete_message METHOD New() METHOD Connect() METHOD Login() METHOD _Identify( cStr ) METHOD _Is_Full_Msg( cStr ) DESTRUCTOR Destroy()ENDCLASSMETHOD New() CLASS HB_WhatsApp ::cIP = hb_socketGetHosts( ::cHost )[ 1 ] ::pSocket = hb_socketOpen()return selfMETHOD Connect() CLASS HB_WhatsAppreturn hb_socketConnect( ::pSocket, { HB_SOCKET_AF_INET, ::cIP, ::nPort } )METHOD Login() CLASS HB_WhatsApp local cBuffer := Space( 1024 ), nLen, cV, cRcvdType ? hb_socketSend( ::pSocket, "WA" + Chr( 0x01 ) + Chr( 0 ) + Chr( 0 ) + ; Chr( 0x19 ) + Chr( 0xF8 ) + Chr( 0x05 ) + Chr( 0x01 ) + ; Chr( 0xA0 ) + Chr( 0x8A ) + Chr( 0x84 ) + Chr( 0xFC ) + ; Chr( 0x11 ) + "iPhone-2.6.9-5222" + ; Chr( 0 ) + Chr( 0x08 ) + Chr( 0xF8 ) + Chr( 0x02 ) + ; Chr( 0x96 ) + Chr( 0xF8 ) + Chr( 0x01 ) + Chr( 0xF8 ) + ; Chr( 0x01 ) + Chr( 0x7E ) + Chr( 0 ) + Chr( 0x07 ) + Chr( 0xF8 ) + ; Chr( 0x05 ) + Chr( 0x0F ) + Chr( 0x5A ) + Chr( 0x2A ) + ; Chr( 0xBD ) + Chr( 0xA7 ) ) ? nLen := hb_socketRecv( ::pSocket, @cBuffer ) cBuffer = SubStr( cBuffer, 1, nLen ) ::aResArray = HB_ATokens( cBuffer, Chr( 0 ) ) for each cV in ::aResArray cRcvdType = ::_Identify( cV ) ? cRcvdType do case case cRcvdType == "incomplete_msg" ::_incomplete_message = cV case cRcvdType == "msg" ::cMsg = ::parse_received_message( cV ) case cRcvdType == "account_info" ::accinfo = ::parse_account_info( cV ) case cRcvdType == "last_seen" ::lastseen = ::parse_last_seen( cV ) endcase nextreturn nilstatic function StartsWith( cStr, cCompare, nPos )return SubStr( cStr, nPos, Len( cCompare ) ) == cComparestatic function EndsWith( cStr, cCompare )return Right( cStr, Len( cCompare ) ) == cCompareMETHOD _Identify( cStr ) CLASS HB_WhatsApp local cMsg_identifier := Chr( 0x5D ) + Chr( 0x38 ) + Chr( 0xFA ) + Chr( 0xFC ) local cServer_delivery_identifier := Chr( 0x8C ) local cClient_delivery_identifier := Chr( 0x7F ) + Chr( 0xBD ) + Chr( 0xAD ) local cAcc_info_iden := Chr( 0x99 ) + Chr( 0xBD ) + Chr( 0xA7 ) + Chr( 0x94 ) local cLast_seen_ident := Chr( 0x48 ) + Chr( 0x38 ) + Chr( 0xFA ) + Chr( 0xFC ) local cLast_seen_ident2 := Chr( 0x7B ) + Chr( 0xBD ) + Chr( 0x4C ) + Chr( 0x8B ) if ! ::_is_full_msg( cStr ) return "incomplete_msg" elseif StartsWith( cStr, cMsg_identifier, 3 ) if EndsWith( cStr, cServer_delivery_identifier ) return "server_delivery_report" elseif EndsWith( cStr, cClient_delivery_identifier ) return "client_delivery_report" else return "msg" endif elseif StartsWith( cStr, cAcc_info_iden, 3 ) return "account_info" elseif StartsWith( cStr, cLast_seen_ident, 3 ) .and. cLast_seen_ident2 $ cStr return "last_seen" else return "other" endifreturn nilMETHOD _Is_Full_Msg( cStr ) CLASS HB_WhatsAppreturn Len( cStr ) == Asc( Left( cStr, 1 ) ) + 1METHOD Destroy() CLASS HB_WhatsApp HB_SocketShutDown( ::pSocket ) HB_SocketClose( ::pSocket ) ::pSocket = nilreturn nil