Manganalisa source code mesin penjawab otomatis Y!M versi 8, 9 & 10

Posted by Kamarudin • 7 minute read • Comments

Kalo pada artikel sebelumnya kita sudah mengetahui bagaimana cara menganalisa bagian-bagian penting program Y!M untuk mendapatkan informasi yang kita butuhkan guna membuat program mesin penjawab otomatis Y!M ini maka pada artikel kali ini kita akan membahas full semua source code penting untuk membuat aplikasi ini.

Sebenarnya saya sudah lama ingin mengupload source code ini tapi berhubung waktu itu baru support untuk Y!M 8 saya jadi males nguploadnya, tapi setelah melakukan sedikit penyesuaian untuk mendukung Y!M 9 dan 10 akhirnya saya bisa dengan tenang mengupload source code ini :grin:.

Seperti pada artikel sebelumnya untuk melanjutkan pembahasan ini kita harus mengetahui urutan windows parent->anak baik untuk membaca pesan yang masuk atau membalasnya.

Berikut adalah urutannya :

  1. Y!M 8

    • YSearchMenuWndClass ->  IMClass -> YHTMLContainer -> Internet Explorer_Server (membaca pesan yang masuk)
    • YSearchMenuWndClass ->  IMClass -> YIMInputWindow (membalas pesan)
  2. Y!M 9

    • ATL:007C07F0 -> YHTMLContainer -> Internet Explorer_Server (membaca pesan yang masuk)
    • ATL:007C07F0 -> YIMInputWindow (membalas pesan)
  3. Y!M 10

    • CConvWndBase -> YHTMLContainer -> Internet Explorer_Server (membaca pesan yang masuk)
    • CConvWndBase -> YIMInputWindow (membalas pesan)

Telihat ada sedikit perbedaan nama class/window untuk Y!M 8, 9 dan 10 dan jika Anda lupa bagaimana cara untuk mendapatkan informasi tersebut silahkan mampir kesini dulu.

Karena aplikasi kita kali ini akan mendukung 3 versi Y!M otomatis kita harus mempunyai sebuah fungsi untuk mengecek versi Y!M yang terinstall di komputer, salah satu cara termudah untuk mendapatkan informasi tersebut adalah via registry windows dan setelah melakukan sedikit investigasi saya mendapatkan lokasi berikut di registry windows :

;Y!M 8 dan 9
Key : HKEY_LOCAL_MACHINE\SOFTWARE\Yahoo\pager
Name : ProductVersion

;Y!M 10
Key : HKEY_CURRENT_USER\Software\yahoo\pager
Name : Version

Fungsinya akan terlihat seperti berikut :

Private Function getYMVersion() As String
    Dim ymVersion       As String
    Dim arrYMVersion()  As String

    'cek key Y!M 8 dan 9
    ymVersion = getFromWindowsRegistry(HKEY_LOCAL_MACHINE, "SOFTWARE\Yahoo\pager", "ProductVersion")

    'Y!M 10
    'jika pengecekan key Y!M versi 8 dan 9 masih kosong coba cek key Y!M 10
    If Not (Len(ymVersion) > 0) Then ymVersion = getFromWindowsRegistry(HKEY_CURRENT_USER, "Software\yahoo\pager", "Version")

    If Len(ymVersion) > 0 Then
        arrYMVersion = Split(ymVersion, ".") ' ex : 10.0.0.1102, kita ambil mayor versionnya aja = 10
    Else
        ReDim arrYMVersion(0)
    End If

    getYMVersion = arrYMVersion(0)
End Function

Cara yang kedua dengan memanfaatkan registry berikut :

HKEY_CLASSES_ROOT\ymsgr\shell\open\command

dan jika kita lihat nilai dari key tersebut lebih kurang seperti berikut :

"C:\Program Files\Yahoo!\Messenger\YahooMessenger.exe" %1

Loh mana informasi versi Y!Mnya ? Versi Y!Mnya bisa langsung kita dapatkan dari file YahooMessenger.exe jadi dengan cara kedua ini kita membutuhkan referensi Microsoft Scripting Runtime untuk membuat fungsi getYMVersion.

Private Function getYMVersion() As String
    Dim fso             As Scripting.FileSystemObject
    Dim YMExe           As String
    Dim arrYMVersion()  As String

    YMExe = getFromWindowsRegistry(HKEY_CLASSES_ROOT, "ymsgr\shell\open\command", "") 'output -> "C:\Program Files\Yahoo!\Messenger\YahooMessenger.exe" %1
    YMExe = Replace(YMExe, " %1", "") 'hapus karakter spasi+%1
    YMExe = Replace(YMExe, Chr(34), "") 'hapus karakter petik "

    If Len(YMExe) > 0 Then
        Set fso = New Scripting.FileSystemObject
        arrYMVersion = Split(fso.GetFileVersion(YMExe), ".") ' ex : 10.0.0.1102, kita ambil mayor versionnya aja = 10
        Set fso = Nothing

    Else
        ReDim arrYMVersion(0)
    End If

    getYMVersion = arrYMVersion(0)
End Function

Dari 2 fungsi getYMVersion tersebut terserah Anda mau menggunakan yang mana, yang jelas hasilnya sama. Selanjutnya kita tinggal panggil fungsi tersebut seperti berikut :

Public Sub Main()
    Dim ymVersion   As String

    ymVersion = getYMVersion
    If Not (Len(ymVersion) > 0) Then
        MsgBox "Y!M belum terinstall, aplikasi tidak bisa dilanjutkan", vbExclamation, "Peringatan"
        End
    End If

    'TODO : tampilkan form utama disini
End Sub

Oke sampai disini kita sudah punya fungsi pengecekan versi Y!M langkah berikutnya adalah mendapatkan ymID yang sedang chat dengan kita.

Informasi ymID ini nanti digunakan untuk memudahkan kita memparsing pesan yang masuk.

Satu-satunya cara yang saat ini saya ketahui untuk mendapatkan informasi ymID adalah dengan membaca informasi Title Bar Y!M, tetapi informasi Title Bar ini tidak fix tergantung kondisi berikut :

  1. Versi Y!M
  2. Lawan chat sudah terdaftar Messenger List/belum

berikut cuplikannya

Berdasarkan gambar diatas kita bisa dengan mudah membuat fungsi untuk mendapatkan ymID.

Private Function getYMID(ByVal hwndYMMainClass As Long) As String
    Dim titleBar        As String
    Dim ymID            As String
    Dim arrTitleBar()   As String
    Dim pos             As Long

    titleBar = String$(100, Chr$(0))
    GetWindowText hwndYMMainClass, titleBar, 100
    titleBar = Left$(titleBar, InStr(titleBar, Chr$(0)) - 1)

    If InStr(1, titleBar, " (") > 0 Then 'lawan chat terdaftar di Messenger List
        'ex YM8    : KoKom Armag3d0n (k4m4r82) - Instant Message
        '   YM9/10 : KoKom Armag3d0n (k4m4r82)

        arrTitleBar = Split(titleBar, " (")
        ymID = arrTitleBar(0)

    Else
        Select Case ymVersion
            Case "8" 'ex : KoKom Armag3d0n - Instant Message
                arrTitleBar = Split(titleBar, " - ")
                ymID = arrTitleBar(0)

            Case "9", "10" 'ex : KoKom Armag3d0n
                ymID = titleBar
        End Select
    End If

    getYMID = ymID
End Function

Contoh penggunaan fungsi getYMID

Private Sub cmdGetYMID_Click()
    Dim hwndYMMainClass     As Long
    Dim ymID                As String

    Select Case ymVersion
        Case "8": hwndYMMainClass = FindWindow("YSearchMenuWndClass", vbNullString)
        Case "9": hwndYMMainClass = FindWindow("ATL:007C07F0", vbNullString)
        Case "10": hwndYMMainClass = FindWindow("CConvWndBase", vbNullString)
    End Select

    ymID = getYMID(hwndYMMainClass)
    MsgBox "YM ID : " & ymID
End Sub

Fungsi berikutnya yang akan kita buat adalah fungsi untuk membaca pesan yang masuk, kondisinya juga sama seperti Title Bar informasinya tidak fix tergantung :

  1. Versi Y!M

  2. Lawan chat sudah terdaftar Messenger List/belum

Kalo penasaran lihat gambar berikut :

Contoh beberapa variasi pesan yang masuk setelah dibaca di program

Terlihat dengan jelas perbedaan antara Y!M 8 dan Y!M 9/10 pada saat pembacaan pesan yang masuk, dimana untuk Y!M 9 dan 10 menambahkan informasi tanggal dan jam pesan masuk.

Berikut adalah fungsi untuk menghandle semua variasi tersebut.

Private Function getYMMessage(ByVal hwndYMMainClass As Long) As String
    Dim hwndIMClass         As Long
    Dim hwndYHTMLContainer  As Long
    Dim hwndIEServer        As Long

    Dim ymID                As String
    Dim msg                 As String

    Dim arrMsg()            As String
    Dim arrValidMsg()       As String
    Dim validMsg            As String
    Dim i                   As Long

    Select Case ymVersion
        Case "8"
            'urutkan kelas yg harus dilalui untuk membaca pesan yang masuk
            'YSearchMenuWndClass ->  IMClass -> YHTMLContainer -> Internet Explorer_Server

            If hwndYMMainClass <> 0 Then
                ymID = getYMID(hwndYMMainClass)

                hwndIMClass = FindWindowEx(hwndYMMainClass, 0&, "IMClass", vbNullString)
                hwndYHTMLContainer = FindWindowEx(hwndIMClass, 0&, "YHTMLContainer", vbNullString)
                hwndIEServer = FindWindowEx(hwndYHTMLContainer, 0&, "Internet Explorer_Server", vbNullString)

                msg = getIEText(hwndIEServer)

                arrMsg = Split(msg, Chr(10))
                For i = LBound(arrMsg) To UBound(arrMsg)
                    If Len(arrMsg(i)) > 0 Then
                        If Left(arrMsg(i), Len(ymID) + 2) = ymID & ": " Then
                            arrValidMsg = Split(arrMsg(i), ": ")
                            validMsg = arrValidMsg(UBound(arrValidMsg))
                            Exit For
                        End If
                    End If
                Next i

                validMsg = Replace(validMsg, Chr(13), "")
                getYMMessage = validMsg
            End If

        Case "9", "10"
            'urutkan kelas yg harus dilalui untuk membaca pesan yang masuk
            'Y!M 9  : ATL:007C07F0 -> YHTMLContainer -> Internet Explorer_Server
            'Y!M 10 : CConvWndBase -> YHTMLContainer -> Internet Explorer_Server

            If hwndYMMainClass <> 0 Then
                ymID = getYMID(hwndYMMainClass)

                hwndYHTMLContainer = FindWindowEx(hwndYMMainClass, 0&, "YHTMLContainer", vbNullString)
                hwndIEServer = FindWindowEx(hwndYHTMLContainer, 0&, "Internet Explorer_Server", vbNullString)

                msg = getIEText(hwndIEServer)

                arrMsg = Split(msg, Chr(10))
                For i = LBound(arrMsg) To UBound(arrMsg)
                    If Len(arrMsg(i)) > 0 Then
                        If Left(arrMsg(i), Len(ymID) + 2) = ymID & " (" Then
                            arrValidMsg = Split(arrMsg(i), "): ")
                            validMsg = arrValidMsg(UBound(arrValidMsg))
                            Exit For
                        End If
                    End If
                Next i

                validMsg = Replace(validMsg, Chr(13), "")
                getYMMessage = validMsg
            End If

        Case Else
            'silahkan coba sendiri versi ym yg lain
    End Select
End Function

Contoh penggunaan fungsi getYMMessage

Private Sub cmdGetYMMessage_Click()
    Dim hwndYMMainClass     As Long
    Dim ymMessage           As String

    Select Case ymVersion
        Case "8": hwndYMMainClass = FindWindow("YSearchMenuWndClass", vbNullString)
        Case "9": hwndYMMainClass = FindWindow("ATL:007C07F0", vbNullString)
        Case "10": hwndYMMainClass = FindWindow("CConvWndBase", vbNullString)
    End Select

    ymMessage = getYMMessage(hwndYMMainClass)
    MsgBox "Pesan masuk : " & ymMessage
End Sub

Fungsi terakhir adalah fungsi untuk mengirim pesan ke lawat chat

Private Sub YMChatSend(ByVal hwndYMMainClass As Long, ByVal msgToSend As String)
    Dim hwndIMClass         As Long
    Dim hwndYIMInputWindow  As Long

    Select Case ymVersion
        Case "8"
            'urutkan kelas yg harus dilalui untuk membalas pesan yang masuk
            'YSearchMenuWndClass ->  IMClass -> YIMInputWindow

            If hwndYMMainClass <> 0 Then
                hwndIMClass = FindWindowEx(hwndYMMainClass, 0&, "IMClass", vbNullString)
                hwndYIMInputWindow = FindWindowEx(hwndIMClass, 0&, "YIMInputWindow", vbNullString)
            End If

        Case "9", "10"
            'urutkan kelas yg harus dilalui untuk membalas pesan yang masuk
            'Y!M 9  : ATL:007C07F0 -> YIMInputWindow
            'Y!M 10 : CConvWndBase -> YIMInputWindow
            If hwndYMMainClass <> 0 Then hwndYIMInputWindow = FindWindowEx(hwndYMMainClass, 0&, "YIMInputWindow", vbNullString)
    End Select

    If hwndYIMInputWindow <> 0 Then
        Call SendMessageByString(hwndYIMInputWindow, WM_SETTEXT, 0&, msgToSend)
        Call SendMessage(hwndYIMInputWindow, WM_KEYDOWN, VK_RETURN, 0&) 'otomatis menekan tombol Send
    End If
End Sub

Contoh penggunaan fungsi ymChatSend

Private Sub cmdSendMessage_Click()
    Dim hwndYMMainClass     As Long
    Dim msg                 As String

    Select Case ymVersion
        Case "8": hwndYMMainClass = FindWindow("YSearchMenuWndClass", vbNullString)
        Case "9": hwndYMMainClass = FindWindow("ATL:007C07F0", vbNullString)
        Case "10": hwndYMMainClass = FindWindow("CConvWndBase", vbNullString)
    End Select

    msg = "Hallo bro gue udah selesai nih nGebuatin mesin penjawab otomatis Y!Mnya" & vbCrLf & _
          "Tinggal maem-maemnya ya !!!"
    Call ymChatSend(hwndYMMainClass, msg)
End Sub

Akhirnya selesai juga :) dan potongan kode diatas sudah saya susun menjadi program sederhana dengan kasus “Tes Bahasa Inggris” yang bisa didownload disini.

Kalo males download kita lihat  aja trailernya :)

Selamat mencoba :blush:

Comments