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 :D.
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 :
Y!M 8
YSearchMenuWndClass -> IMClass -> YHTMLContainer -> Internet Explorer_Server (membaca pesan yang masuk)
YSearchMenuWndClass -> IMClass -> YIMInputWindow (membalas pesan)
Y!M 9
ATL:007C07F0 -> YHTMLContainer -> Internet Explorer_Server (membaca pesan yang masuk)
ATL:007C07F0 -> YIMInputWindow (membalas pesan)
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 :
1
2
3
4
5
6
7
;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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 :
1
HKEY_CLASSES_ROOT\ymsgr\shell\open\command
dan jika kita lihat nilai dari key tersebut lebih kurang seperti berikut :
1
“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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 :
1
2
3
4
5
6
7
8
9
10
11
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 :
Versi Y!M
Lawan chat sudah terdaftar Messenger List/belum
berikut cuplikannya
Berdasarkan gambar diatas kita bisa dengan mudah membuat fungsi untuk mendapatkan ymID.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
1
2
3
4
5
6
7
8
9
10
11
12
13
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 :
Versi Y!M
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
1
2
3
4
5
6
7
8
9
10
11
12
13
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 :)