[VB.net] Porteo de la implementacion del api de WhatsApiNet WhatsApp WhatsAppAPI

Iniciado por 79137913, 29 Julio 2014, 23:49 PM

0 Miembros y 1 Visitante están viendo este tema.

chesteralex

Buen día,

Antes que nada agradecer las maravillosas aportaciones que hacen en el foro.

Tengo una duda con respecto al codigo que se esta agregando en este ejemplo, yo he seguido todo los pasos pero me nunca entra en la condicion:

Código (vbnet) [Seleccionar]
wa.Connect()
       Dim datFile As String = getDatFileName(WANum)
       Dim nextChallenge() As Byte
       If (File.Exists(datFile)) Then
           Dim foo As String = File.ReadAllText(datFile)
           nextChallenge = Convert.FromBase64String(foo)
       End If


No me encuentra el archivo y nunca se crea el .dat que dice según el debugger.
Estoy haciendo algo mal?, me falta algún paso?

Agradezco sus comentarios.

ChuchoVega

Cita de: findesemana en 12 Febrero 2015, 03:53 AM
Hola! Gracias por el tutorial! pero necesito un poco de ayuda..
He seguido los pasos pero me daba varios errores. Entonces empece a importar librerias hasta que me quedo un solo error en la linea:
   AddHandler wa.OnGetGroups, AddressOf wa_OnGetGroups
Pregunto: No tendras un ejemplo funcionando que puedas subir?
DE verdad me interesa el tema.. Gracias por tu ayuda de antemano..
PD estoy usando vb 2013

por favor por favor por favor  :huh:

Hola! findesemana, una pregunta, cuales fueron las librerías que empezaste a importar? a mi aun me sigue marcando algunos errores, si me pudieras decir cuales fueron las librerías que le agregaste te lo agradecería mucho.
!!

Eleкtro

Odio este tipo de APIs desarrolladas para .Net sin ningún tipo de documentación .Net (XML), simplemente llegan a dificultar el majeo manejo hasta imposibilitar la comprensión y la utilización de los miembros definidos en el interior de la librería debido a un desarrollo inapropiado/descuidado al no existir documentación visualizable ni accesible en tiempo de diseño (mediante IntelliSense, Object Inspector) para una plataforma en donde hay que cuidar ciertos detalles esenciales si publicas algo cómo esto para el público.

Tras descargarme el código fuente de la última versión de WhatsAppi.Net, desarrollado en C#, y analizarlo muy, muy por encima, he podido comprobar que consta de 508 miembros públicos sin documentar, la mayoría de las classes definidas (95%) usan muchos usings de NameSpaces que no se utilizan (es decir, son totalmente innecesarios), hay un total de 427 conflictos de convenciones de nombres que no se han corregido, hay varios formatos de Strings con cantidades incorrectas de parámetros (ej: String.Format("{0}", 0, 1) ), absolutamente TODOS los event-handlers están incorrectamente definidos (no utilizan la firma 'sender, e'), y lo más importante de todo, uno de sus miembros tiene una considerable fuga de recursos ya que no libera las instancias disposables de los miembros definidos en la Class 'KeyStream', todo esto entre otro tipo de fallos generales que se pueden comprobar con un análisis básico de código en VS.

Sinceramente, yo personalmente no recomiendo la utilización de ninguna librería que esté desarrollada de una manera tan descuidada, a menos que usar esa librería sea el úncio recurso viable que exista para llevar a cabo la tarea requerida (cosa que dezconozco).


Pero debido a la gran espectación que ha causado este tema ...este post (y también porque estaba un poco aburrido xD), me he tomado el tiempo de analizar, corregir, y actualizar el snippet de ejemplo que compartió el compañero @79137913 en el primer post, puesto que a muchos usuarios les ha sido dificil comprender la integración del código, o le han dado errores de algún tipo al intentar integrarlo.

Aunque por otro lado, debo confesar que yo NO utilizo WhatsApp, así que las mejoras/adaptaciones/modificaciones que he realizado en el código original, son modificaciones que he llevado a cabo bastante 'a ciegas' ya que no podré testear los resultados en un dispositivo.






Primero, antes de mostrar la actualización del código, comentaré algunos fallos (que considero bastante graves) que ustedes deberán tener en cuenta si utilizan el código original que compartió el amigo @79137913 sin hacerle ninguna modificación adicional.

Por orden de importancia/gravedad:

1.
Código (vbnet,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26) [Seleccionar]
   Public Sub InitWA(ByVal NickName As String, Optional ByVal debug As Boolean = False)
      WAPass = File.ReadAllText(My.Application.Info.DirectoryPath & "\WAPASS.txt")
      wa = New WhatsApp(WANum, WAPass, NickName, debug)
      AddHandler wa.OnLoginSuccess, AddressOf wa_OnLoginSuccess
      AddHandler wa.OnLoginFailed, AddressOf wa_OnLoginFailed
      AddHandler wa.OnGetMessage, AddressOf wa_OnGetMessage
      AddHandler wa.OnGetMessageReceivedClient, AddressOf wa_OnGetMessageReceivedClient
      AddHandler wa.OnGetMessageReceivedServer, AddressOf wa_OnGetMessageReceivedServer
      AddHandler wa.OnNotificationPicture, AddressOf wa_OnNotificationPicture
      AddHandler wa.OnGetPresence, AddressOf wa_OnGetPresence
      AddHandler wa.OnGetGroupParticipants, AddressOf wa_OnGetGroupParticipants
      AddHandler wa.OnGetLastSeen, AddressOf wa_OnGetLastSeen
      AddHandler wa.OnGetTyping, AddressOf wa_OnGetTyping
      AddHandler wa.OnGetPaused, AddressOf wa_OnGetPaused
      AddHandler wa.OnGetMessageImage, AddressOf wa_OnGetMessageImage
      AddHandler wa.OnGetMessageAudio, AddressOf wa_OnGetMessageAudio
      AddHandler wa.OnGetMessageVideo, AddressOf wa_OnGetMessageVideo
      AddHandler wa.OnGetMessageLocation, AddressOf wa_OnGetMessageLocation
      AddHandler wa.OnGetMessageVcard, AddressOf wa_OnGetMessageVcard
      AddHandler wa.OnGetPhoto, AddressOf wa_OnGetPhoto
      AddHandler wa.OnGetPhotoPreview, AddressOf wa_OnGetPhotoPreview
      AddHandler wa.OnGetGroups, AddressOf wa_OnGetGroups
      AddHandler wa.OnGetSyncResult, AddressOf wa_OnGetSyncResult
      AddHandler wa.OnGetStatus, AddressOf wa_OnGetStatus
      AddHandler wa.OnGetPrivacySettings, AddressOf wa_OnGetPrivacySettings
      AddHandler WhatsAppApi.Helper.DebugAdapter.Instance.OnPrintDebug, AddressOf Instance_OnPrintDebug
      wa.Connect()
      Dim datFile As String = getDatFileName(WANum)
      Dim nextChallenge() As Byte
      If (File.Exists(datFile)) Then
          Dim foo As String = File.ReadAllText(datFile)
          nextChallenge = Convert.FromBase64String(foo)
      End If
      wa.Login(nextChallenge)
      ProcessChat(wa)
  End Sub


Por cada vez que se llame al método 'InitWA', éste AÑADIRÁ (que no reemplazará) los listeners de los eventos especificados en el código, ya que en ningún momento se está comprobando si un evento está ya siendo escuchado, ni tampoco se están eliminando handlers anteriores con el uso de la declaración 'RemoveHandler', esto ocasionaría un comportamiento anormal en en los event-handlers definidos en el código.

Hay que tenerlo MUY en cuenta por ejemplo al desconectar (wa.Disconnect), y volver a llamar al método 'InitWa', por cada vez que se hiciera eso...


2.
Citar
Código (vbnet,3,5) [Seleccionar]
   Public Sub OnGetMedia(file As String, url As String, data() As Byte)
      My.Computer.FileSystem.WriteAllBytes(String.Format("preview_{0}.jpg", file), data, False)
      Dim WA_WC As New WebClient
      WA_WC.DownloadFileAsync(New Uri(url), file, 0)
  End Sub

La aplicación que utilice este método, incrementará el consumo RAM indefinidamente según la cantidad de veces que se instancie el WebClient, ya que la instancia del WebClient jamás se llega a liberar.


3.
Citar
Código (vbnet,4,5) [Seleccionar]
   Public Function SendWA(ByVal MSG As String, Num As String) As Boolean
      Dim usrMan As New WhatsUserManager()
      Dim tmpUser = usrMan.CreateUser(Num, "User")
      wa.SendMessage(Num, MSG)
      Return True
  End Function

La función realmente no cumple ninguna utilidad, ya que en cualquier circunstancia siempre devolverá verdadero.

Lo que habría que tratar de devolver es Verdadero si el mensaje se envia, y Falso en caso contrario,
además, quizas ni siquiera haya que fijarse en devolver True o False, ya que la función "WhatsAppApi.SendMessage" devuelve una cadena de texto cuyo contenido desconozco, pero quizás contnega detalles sobre la validación de la operación ("Succes" o "Fail"), no lo se, ya que no puedo comprobarlo sin WhatsApp (y no voy a hacerle Reflection al ensamblado solo para descubrir que valor de texto envia dicha función).


4.
Citar
Código (vbnet,2) [Seleccionar]
   Public Sub wa_OnGetMessageLocation(from As String, id As String, lon As Double, lat As Double, url As String, name As String, preview() As Byte)
      File.WriteAllBytes(String.Format("{0}{1end sub.jpg", lat, lon), preview)
  End Sub

El formato es erroneo, ya que el segundo parámetro está abierto, por lo tanto la longitud (lon) no se tendrá en cuenta en el formato del texto.






El código original estaba bastante vb6-estilizado, aunque es algo comprensible viniendo de un programador experimentado en VB6, por otro lado yo no acepto el uso de los wrappers de VB6 en .Net, y la estructurización del código era un poco "arreu" (descuidado) cómo decimos en mi tierra.

Por lo demás, he respetado mayormente el funcionamiento y la sintaxis del snippet original de @79137913.

¿Qué es lo que he hecho?
  • Corregir los errores mencionados arriba.
  • Corregir todas las convenciones de nombres en los miembros del código original (métodos y parámetros mal nombrados) para facilitarle la tarea de búsqueda/identificación al compiler.
     También he corregido aquellas definiciones de nombres que podían resultar en ambiguaciones (ej: file),
     pues quiero recordarles que algunas palabras reservadas cómo "'type', 'from', es preferible "escaparlas" al definirlas como nombres de variables,
     y otros nombres como "file", al importar el espacio de nombres "System.IO.File", directamente es preferible evitar ese tipo de nombramientos ambiguos y utilizar algo más específico (ej: fileObj, fileName, filePath, etc).
  • Añadir los Imports de los Namespaces requeridos para el uso del código, por los problemas que algunos usuarios han tenido con eso.
  • Traslación de Módulo a Clase.
  • Implementación de la interfáz IDisposable, para liberar la instancia de WhatsApp (WA) correctamente.
  • Implementación de una excepción específica, 'WALoginFailedException', que sustituye a la terminación de ejecución en el método 'OnLoginFailed' del código original.
  • Documentar todos los miembros del código. Aunque sigue siendo una documentación MUY incompleta a falta de documentación oficial por parte de los desarrolladores de la API para .Net.

¿Cómo utilizarlo?
Esteticamente el código modificado es diferente, pero su utilización es practicamente igual al código original,
especifiquen sus datos en las propiedades "Number", "Password" y/o "PasswordFilepath";
el método original 'InitWa' ha sido reemplazado por el nuevo método 'Initializecomponent';
el método original 'ProcessChat' ha sido reemplazado por el nuevo método 'ProcessChatAsync', y el nuevo método 'ProcessChat' ahora es sincrónico;
el método original 'SendWA' ha sido reemplazado por el nuevo método 'SendMessage' para enviar un mensaje, y el nuevo método 'TestMessage' para testear un mensaje con un usuario temporal.

Ejemplo de uso:

Código (vbnet) [Seleccionar]
Public Class TestForm

   Private wa As WhatsAppHelper

   Private Sub Test()

       Me.wa = New WhatsAppHelper(nickName:="", [debug]:=False)

       Using wa

           Debug.WriteLine(Me.wa.Number)
           Debug.WriteLine(Me.wa.Password)
           Debug.WriteLine(Me.wa.TextEncoding.ToString)

           wa.ProcessChatAsync()
           wa.SendMessage(msg:="mensaje", num:="num")

       End Using

   End Sub

End Class







Espero que a alguien le sirva este código para despejar mejor las dudas, tengan en cuenta que esto no lo he desarrollado para mi, yo odio WhatsApp y ni lo tengo ni lo uso, este código es con la única intención de intentar ayudarles, pero si tienen alguna duda o error al usarlo entonces será mejor que la consulten con el compañero @79137913 y no conmigo, porque, vuelvo a repetir, no puedo testear las modificaciones que hice (ni el ejemplo de uso que compartí).

Source:
Código (vbnet) [Seleccionar]
#Region " Option statements "

Option Explicit On
Option Strict On
Option Infer Off

#End Region

#Region " Imports "

Imports System.IO
Imports System.Linq
Imports System.Net
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks

Imports WhatsAppApi
Imports WhatsAppApi.Account
Imports WhatsAppApi.Helper
Imports WhatsAppApi.Response
Imports WhatsAppApi.ApiBase

#End Region

#Region " WhatsAppHelper "

''' <summary>
''' Class WhatsAppHelper.
''' This class cannot be inherited.
''' </summary>
Public NotInheritable Class WhatsAppHelper : Implements IDisposable

#Region " Objects "

   ''' <summary>
   ''' The <see cref="WhatsAppApi.WhatsApp"/> instance.
   ''' </summary>
   Private WithEvents wa As WhatsApp

   ''' <summary>
   ''' </summary>
   Private WithEvents waDebugger As DebugAdapter

#End Region

#Region " Properties "

   ''' <summary>
   ''' Gets the...
   ''' </summary>
   ''' <value>.</value>
   Public ReadOnly Property Number As String
       Get
           Return "5492236685519"
       End Get
   End Property

   ''' <summary>
   ''' Gets the...
   ''' </summary>
   ''' <value>.</value>
   Public ReadOnly Property PasswordFilepath As String
       Get
           Return Path.Combine(Application.StartupPath, "WAPASS.txt")
       End Get
   End Property

   ''' <summary>
   ''' Gets the...
   ''' </summary>
   ''' <value>.</value>
   Public ReadOnly Property Password As String
       Get

           Try
               Return File.ReadAllText(Me.PasswordFilepath, Me.TextEncoding)

           Catch ex As FileNotFoundException
               Throw New FileNotFoundException("WhatsApp password file not found.", Me.PasswordFilepath)

           Catch ex As Exception
               Throw

           End Try

       End Get
   End Property

   ''' <summary>
   ''' Gets the...
   ''' </summary>
   ''' <value>.</value>
   Public ReadOnly Property TextEncoding As Encoding
       Get
           Return Encoding.Default
       End Get
   End Property

#End Region

#Region " Exceptions "

   ''' <summary>
   ''' Exception that is thrown when WhatsApp login has failed.
   ''' </summary>
   <Serializable>
   Public NotInheritable Class WALoginFailedException : Inherits Exception

       ''' <summary>
       ''' Initializes a new instance of the <see cref="WALoginFailedException"/> class.
       ''' </summary>
       Public Sub New()
           MyBase.New("WhatsApp Login Failed")
       End Sub

       ''' <summary>
       ''' Initializes a new instance of the <see cref="WALoginFailedException"/> class.
       ''' </summary>
       ''' <param name="message">The message that describes the error.</param>
       Public Sub New(message As String)
           MyBase.New(message)
       End Sub

   End Class

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="WhatsAppHelper"/> class.
   ''' </summary>
   ''' <param name="nickName">.</param>
   ''' <param name="debug">.</param>
   Public Sub New(ByVal nickName As String,
                  Optional ByVal debug As Boolean = False)

       Me.InitializeComponent(nickName, debug)

   End Sub

   ''' <summary>
   ''' Prevents a default instance of the <see cref="WhatsApp"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

#End Region

#Region " Private Methods "

   ''' <summary>
   ''' </summary>
   ''' <param name="nickName">.</param>
   ''' <param name="debug">.</param>
   Private Sub InitializeComponent(ByVal nickName As String,
                                   Optional ByVal debug As Boolean = False)

       Me.wa = New WhatsApp(Me.Number, Me.Password, nickName, debug)
       Me.waDebugger = DebugAdapter.Instance
       Me.wa.Connect()

       Dim datFile As String = Me.GetDatFileName(Me.Number)
       Dim nextChallenge As Byte() = Nothing

       If File.Exists(datFile) Then
           Dim text As String = File.ReadAllText(datFile, Me.TextEncoding)
           nextChallenge = Convert.FromBase64String(text)
       End If

       Me.wa.Login(nextChallenge)

   End Sub

   ''' <summary>
   ''' </summary>
   ''' <param name="pn">.</param>
   ''' <returns>.</returns>
   Private Function GetDatFileName(ByVal pn As String) As String

       Dim filename As String = String.Format("{0}.next.dat", pn)
       Return Path.Combine(Application.StartupPath, filename)

   End Function

   ''' <summary>
   ''' </summary>
   ''' <param name="filename">.</param>
   ''' <param name="url">The url to download.</param>
   ''' <param name="data">.</param>
   Private Sub DownloadMedia(ByVal filename As String,
                             ByVal url As String,
                             ByVal data As Byte())

       File.WriteAllBytes(String.Format("preview_{0}.jpg", filename), data)

       Dim waClient As New WebClient
       Try
           Using waClient
               waClient.DownloadFileAsync(New Uri(url), filename, 0)
           End Using

       Catch ex As Exception
           Throw

       Finally
           If waClient IsNot Nothing Then
               waClient.Dispose()
           End If

       End Try

   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' </summary>
   ''' <param name="msg">.</param>
   ''' <param name="num">.</param>
   ''' <returns>.</returns>
   Public Function SendMessage(ByVal msg As String,
                               ByVal num As String) As String

       Return wa.SendMessage([to]:=num, txt:=msg)

   End Function

   ''' <summary>
   ''' </summary>
   ''' <param name="msg">.</param>
   ''' <param name="num">.</param>
   ''' <returns><c>true</c> if successfull, <c>false</c> otherwise.</returns>
   Public Function TestMessage(ByVal msg As String,
                               ByVal num As String) As Boolean

       Dim tmpUser As WhatsUser = New WhatsUserManager().CreateUser(num, "User")

       Try
           wa.SendMessage([to]:=num, txt:=msg)

       Catch ex As Exception
           Return False

       End Try

       Return True

   End Function

   ''' <summary>
   ''' </summary>
   Public Sub ProcessChatAsync()

       Task.Factory.StartNew(Sub()
                                 Me.ProcessChat(Me.wa)
                             End Sub)

   End Sub

   ''' <summary>
   ''' </summary>
   Public Sub ProcessChat()

       While Me.wa IsNot Nothing

           Try
               Me.wa.PollMessages()

           Catch ex As Exception
               ' Throw

           End Try

           Thread.Sleep(millisecondsTimeout:=100)

       End While

   End Sub

#End Region

#Region " Event-Handlers "

   ''' <summary>
   ''' Handles the OnGetPrivacySettings event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="settings">.</param>
   Private Sub WA_OnGetPrivacySettings(ByVal settings As Dictionary(Of VisibilityCategory, VisibilitySetting)) _
   Handles wa.OnGetPrivacySettings

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetStatus event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="form">.</param>
   ''' <param name="type">.</param>
   ''' <param name="name">.</param>
   ''' <param name="status">.</param>
   Private Sub WA_OnGetStatus(ByVal form As String,
                              ByVal type As String,
                              ByVal name As String,
                              ByVal status As String) _
   Handles wa.OnGetStatus

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetSyncResult event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="index">.</param>
   ''' <param name="sid">.</param>
   ''' <param name="existingUsers">.</param>
   ''' <param name="failedNumbers">.</param>
   Private Sub WA_OnGetSyncResult(ByVal index As Integer,
                                  ByVal sid As String,
                                  ByVal existingUsers As Dictionary(Of String, String),
                                  ByVal failedNumbers As String()) _
   Handles wa.OnGetSyncResult

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetGroups event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="groups">.</param>
   Private Sub WA_OnGetGroups(ByVal groups As WaGroupInfo()) _
   Handles wa.OnGetGroups

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetPhotoPreview event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="data">.</param>
   Private Sub WA_OnGetPhotoPreview(ByVal [from] As String,
                                    ByVal id As String,
                                    ByVal data As Byte()) _
   Handles wa.OnGetPhotoPreview

       Try
           File.WriteAllBytes(String.Format("preview_{0}.jpg", [from]), data)

       Catch ex As Exception
           Throw

       End Try

   End Sub

   ''' <summary>
   ''' Handles the OnGetPhoto event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="data">.</param>
   Private Sub WA_OnGetPhoto(ByVal [from] As String,
                             ByVal id As String,
                             ByVal data As Byte()) _
   Handles wa.OnGetPhoto

       Try
           File.WriteAllBytes(String.Format("{0}.jpg", [from]), data)

       Catch ex As Exception
           Throw

       End Try

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessageVcard event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="name">.</param>
   ''' <param name="data">.</param>
   Private Sub WA_OnGetMessageVcard(ByVal [from] As String,
                                    ByVal id As String,
                                    ByVal name As String,
                                    ByVal data As Byte()) _
   Handles wa.OnGetMessageVcard

       Try
           File.WriteAllBytes(String.Format("{0}.vcf", name), data)

       Catch ex As Exception
           Throw

       End Try

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessageLocation event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="lon">.</param>
   ''' <param name="lat">.</param>
   ''' <param name="url">.</param>
   ''' <param name="name">.</param>
   ''' <param name="preview">.</param>
   Private Sub WA_OnGetMessageLocation(ByVal [from] As String,
                                       ByVal id As String,
                                       ByVal lon As Double,
                                       ByVal lat As Double,
                                       ByVal url As String,
                                       ByVal name As String,
                                       ByVal preview() As Byte) _
   Handles wa.OnGetMessageLocation

       Try
           File.WriteAllBytes(String.Format("{0}{1}end sub.jpg", lat, lon), preview)

       Catch ex As Exception
           Throw

       End Try

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessageVideo event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="filename">.</param>
   ''' <param name="fileSize">.</param>
   ''' <param name="url">.</param>
   ''' <param name="preview">.</param>
   Private Sub WA_OnGetMessageVideo(ByVal [from] As String,
                                    ByVal id As String,
                                    ByVal filename As String,
                                    ByVal fileSize As Integer,
                                    ByVal url As String,
                                    ByVal preview As Byte()) _
   Handles wa.OnGetMessageVideo

       Me.DownloadMedia(filename, url, preview)

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessageAudio event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="filename">.</param>
   ''' <param name="filesize">.</param>
   ''' <param name="url">.</param>
   ''' <param name="preview">.</param>
   Private Sub WA_OnGetMessageAudio(ByVal [from] As String,
                                    ByVal id As String,
                                    ByVal filename As String,
                                    ByVal filesize As Integer,
                                    ByVal url As String,
                                    ByVal preview As Byte()) _
   Handles wa.OnGetMessageAudio

       Me.DownloadMedia(filename, url, preview)

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessageImage event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="filename">.</param>
   ''' <param name="size">.</param>
   ''' <param name="url">.</param>
   ''' <param name="preview">.</param>
   Private Sub WA_OnGetMessageImage(ByVal [from] As String,
                                    ByVal id As String,
                                    ByVal filename As String,
                                    ByVal size As Integer,
                                    ByVal url As String,
                                    ByVal preview As Byte()) _
   Handles wa.OnGetMessageImage

       Me.DownloadMedia(filename, url, preview)

   End Sub

   ''' <summary>
   ''' Handles the OnGetPaused event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   Private Sub WA_OnGetPaused(ByVal [from] As String) _
   Handles wa.OnGetPaused

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetTyping event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   Private Sub WA_OnGetTyping(ByVal [from] As String) _
   Handles wa.OnGetTyping

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetLastSeen event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="lastseen">.</param>
   Private Sub WA_OnGetLastSeen(ByVal [from] As String,
                               ByVal lastseen As Date) _
   Handles wa.OnGetLastSeen

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessageReceivedServer event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   Private Sub WA_OnGetMessageReceivedServer(ByVal [from] As String,
                                             ByVal id As String) _
   Handles wa.OnGetMessageReceivedServer

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessageReceivedClient event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   Private Sub WA_OnGetMessageReceivedClient(ByVal [from] As String,
                                             ByVal id As String) _
   Handles wa.OnGetMessageReceivedClient

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetGroupParticipants event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="gjid">.</param>
   ''' <param name="jids">.</param>
   Private Sub WA_OnGetGroupParticipants(ByVal gjid As String,
                                         ByVal jids As String()) _
   Handles wa.OnGetGroupParticipants

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetPresence event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="from">.</param>
   ''' <param name="type">.</param>
   Private Sub WA_OnGetPresence(ByVal [from] As String,
                                ByVal type As String) _
   Handles wa.OnGetPresence

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnNotificationPicture event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="type">.</param>
   ''' <param name="jid">.</param>
   ''' <param name="id">.</param>
   Private Sub WA_OnNotificationPicture(ByVal [type] As String,
                                        ByVal jid As String,
                                        ByVal id As String) _
   Handles wa.OnNotificationPicture

       ' Put your code here.

   End Sub

   ''' <summary>
   ''' Handles the OnGetMessage event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="node">.</param>
   ''' <param name="from">.</param>
   ''' <param name="id">.</param>
   ''' <param name="name">.</param>
   ''' <param name="message">.</param>
   ''' <param name="receiptSent">.</param>
   Private Sub WA_OnGetMessage(ByVal node As ProtocolTreeNode,
                               ByVal [from] As String,
                               ByVal id As String,
                               ByVal name As String,
                               ByVal message As String,
                               ByVal receiptSent As Boolean) _
   Handles wa.OnGetMessage

       Dim number As String = [from].Split("@"c).First

   End Sub

   ''' <summary>
   ''' Handles the OnLoginFailed event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="data">The data.</param>
   Private Sub WA_OnLoginFailed(ByVal data As String) _
   Handles wa.OnLoginFailed

       Throw New WALoginFailedException

   End Sub

   ''' <summary>
   ''' Handles the OnLoginSuccess event of the <see cref="WA"/> instance.
   ''' </summary>
   ''' <param name="phoneNumber">.</param>
   ''' <param name="data">.</param>
   Private Sub WA_OnLoginSuccess(ByVal phoneNumber As String,
                                 ByVal data As Byte()) _
   Handles wa.OnLoginSuccess

       ' next password
       Dim sdata As String = Convert.ToBase64String(data)

       Try
           File.WriteAllText(Me.GetDatFileName(Me.Number), sdata)

       Catch ex As Exception
           Throw

       End Try

   End Sub

   ''' <summary>
   ''' Handles the OnPrintDebug event of the <see cref="waDebugger"/> instance.
   ''' </summary>
   ''' <param name="value">.</param>
   Private Sub Instance_OnPrintDebug(ByVal value As Object) _
   Handles waDebugger.OnPrintDebug

       Debug.Print(value.ToString)

   End Sub

#End Region

#Region " IDisposable "

   ''' <summary>
   ''' To detect redundant calls when disposing.
   ''' </summary>
   Private isDisposed As Boolean = False

   ''' <summary>
   ''' Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
   ''' </summary>
   Public Sub Dispose() Implements IDisposable.Dispose
       Me.Dispose(isDisposing:=True)
       GC.SuppressFinalize(obj:=Me)
   End Sub

   ''' <summary>
   ''' Releases unmanaged and - optionally - managed resources.
   ''' </summary>
   ''' <param name="isDisposing">
   ''' <c>true</c> to release both managed and unmanaged resources;
   ''' <c>false</c> to release only unmanaged resources.
   ''' </param>
   Protected Sub Dispose(ByVal isDisposing As Boolean)

       If Not Me.IsDisposed Then

           If isDisposing Then

               Try
                   Me.wa.Disconnect()
                   Me.wa = Nothing
                   Me.waDebugger = Nothing

               Catch ex As Exception
                   Throw

               End Try

           End If

       End If

       Me.isDisposed = True

   End Sub

#End Region

End Class

#End Region


Saludos!








79137913

HOLA!!!

@Elektro:
Muy bueno que hayas modificado el codigo, me alegra mucho, en cuanto a el codigo no es mas que un porteo de su version en c# casi textual.

Es cierto que tiene una forma muy de vb6 aunque no es mi estructura, intento respetar los lenguajes.

Confirmo que tu codigo funciona correctamente.

Este post me alienta a revivir una vieja app, que si no te importa, me gustaria que luego revisaras a ver que te parece, estoy empezando a programarla recien si queres mas info contactame por priv.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Eleкtro

Cita de: 79137913 en 27 Febrero 2015, 18:15 PMConfirmo que tu codigo funciona correctamente.

Me alegra saberlo, realmente lo hice todo "a ciegas" y tenia esa duda de que al final no sirviera de mucho xD.


Cita de: 79137913 en 27 Febrero 2015, 18:15 PMEste post me alienta a revivir una vieja app, que si no te importa, me gustaria que luego revisaras a ver que te parece, estoy empezando a programarla recien si queres mas info contactame por priv.

jajaja, no hace falta ni que menciones de que app se trata, te estoy leyendo la mente, y creo que a todos los usuarios de elhacker.net nos gustará poder ver esa gran herramienta actualizada, de hecho hace tiempo pensé en hacer una versión .Net de tu programa, pero me desmotivé bastante porque... bueno, porque la app ya existe y es funcional en VB6 así que me pareció un poco tontería el tratar de reinventarla en .Net xD, y tampoco quería que pareciese que intentaba arrebatarte ningún mérito, así que lo mejor es que lo hagas tú, y yo te ayudo si quieres y si lo necesitases, por supuesto.

Un saludo!








gusontop

Cita de: chesteralex en 14 Febrero 2015, 00:46 AM
Buen día,

Antes que nada agradecer las maravillosas aportaciones que hacen en el foro.

Tengo una duda con respecto al codigo que se esta agregando en este ejemplo, yo he seguido todo los pasos pero me nunca entra en la condicion:

Código (vbnet) [Seleccionar]
wa.Connect()
       Dim datFile As String = getDatFileName(WANum)
       Dim nextChallenge() As Byte
       If (File.Exists(datFile)) Then
           Dim foo As String = File.ReadAllText(datFile)
           nextChallenge = Convert.FromBase64String(foo)
       End If


No me encuentra el archivo y nunca se crea el .dat que dice según el debugger.
Estoy haciendo algo mal?, me falta algún paso?

Agradezco sus comentarios.

A mi me esta pasando lo mismo y no consigo que realize en envio del mensaje. ¿Podeis ayudarnos?
Gracias.

79137913

HOLA!!!

Eso es por que no tenes el archivo next challenge en la carpeta del ejecutable.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

gusontop

Claro que no tengo el archivo Next Challenge, pero de donde lo saco o como se genera.

Gracias por responder tan pronto.

ChuchoVega

Cita de: gusontop en  5 Marzo 2015, 18:42 PM
Claro que no tengo el archivo Next Challenge, pero de donde lo saco o como se genera.

Gracias por responder tan pronto.

Gusontop, tengo el mismo problema es lo único que me hace falta para poder hechar a andar la APP, ojala y esto lo puedan responder rápido, de igual manera si encuentro como se debe hacer eso del archivo Next Challenge lo posteo.

79137913

HOLA!!!

Chicos les confirmo la razon por la cual el programa no entra en ese if es por que su archivo nextchallenge no existe,  puede haber 2 razones para esto, la primera es que ustedes cambiaron el numero de telefono o que ustedes nunca enviaron un mensaje.

En caso que sea la primera borren el archivo nextchallenge obsoleto, vuelvan a generar la clave e intenten de nuevo.

En caso que sea la seguda es programa no necesita del archivo next challenge la primera vez por que el next challenge estaria en blanco. Yo supongo y solo supogo, si ustedes estan usando un numero que en algun momento tuvo whatsapp lamento informarles que el nextchallenge no lo pueden obtener por estos medios, ya que sino seria muy simple hackear el whatsapp de cualquiera con esos simples pasos. Para crear la contraseña deben si o si usar un numero virgen en whatsapp.(o un numero que siempre ha usado WART.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*