Trang 1 trên 2

Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: CN 15/06/2008 4:27 pm
gửi bởi hdn
Thủ thuật: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6
Tác giả: Sưu tầm
Mô tả: Sử dụng Y! Protocol để đăng nhập, gởi nhận tin nhắn Y!M trong VB6


Yêu cầu:
- Winsock
- YMSG12ENCRYPT.dll (http://www.esnips.com/doc/a8edf6cb-54c8 ... G12ENCRYPT)
Bài viết này không nói sâu về Yahoo Protocol và sử dụng nó như thế nào, mà chỉ nếu các bước để đăng nhập, gởi nhận tin nhắn.
về Yahoo! Protocol, các bạn có thể tham khảo tại đây
http://www.venkydude.com/articles/yahoo.htm
Đầu tiên, tạo 1 Standard EXE Project
ta cần 1 module để thực hiện công việc mã hóa, giải mã các gói tin gởi, nhận từ Yahoo.
nội dung module như sau:

Mã: Chọn hết

  1.  
  2. Option Explicit
  3. Private Declare Function YMSG12_ScriptedMind_Encrypt Lib "YMSG12ENCRYPT.dll" (ByVal username As String, ByVal Password As String, ByVal Seed As String, ByVal result_6 As String, ByVal result_96 As String, intt As Long) As Boolean
  4.  
  5. Public Function EncryptPassword(strID As String, strPassword As String, strChallange As String)
  6.     'encrypt password
  7.     Dim strEncrypted1 As String, strEncrypted2 As String
  8.     strEncrypted1 = String(50, vbNullChar): strEncrypted2 = String(50, vbNullChar)
  9.     Call YMSG12_ScriptedMind_Encrypt(strID, strPassword, strChallange, strEncrypted1, strEncrypted2, 1)
  10.     EncryptPassword = strEncrypted1 & ":" & strEncrypted2
  11. End Function
  12. Public Function ChrH(strString) As String
  13.     'hex to ascii
  14.     Dim A1
  15.     A1 = Split(strString, " ")
  16.     Dim i As Integer
  17.     For i = 0 To UBound(A1)
  18.         ChrH = ChrH & Chr("&H" & A1(i))
  19.         DoEvents
  20.     Next i
  21. End Function
  22. Public Function AscToHex(strString As String) As String
  23.     'ascii to hex
  24.     Dim i As Integer
  25.     For i = 1 To Len(strString)
  26.         If Len(Hex(Asc(Mid(strString, i, 1)))) = 1 Then
  27.             AscToHex = AscToHex & "0" & Hex(Asc(Mid(strString, i, 1)))
  28.         Else
  29.             AscToHex = AscToHex & Hex(Asc(Mid(strString, i, 1)))
  30.         End If
  31.         If i <> Len(strString) Then AscToHex = AscToHex & " "
  32.         DoEvents
  33.     Next i
  34. End Function
  35.  
  36. '````````````````````````````````````````````````````````````
  37.  
  38. 'Put a value up to 65535 into this, and get a 2 byte integer
  39. Public Function Word(ByVal lngVal As Long) As String
  40. 'by Xeon
  41.     Dim Lo As Single
  42.     Dim Hi As Single
  43.  
  44.     Lo = Fix(lngVal / 256)
  45.     Hi = lngVal Mod 256
  46.  
  47.     Word = Chr(Lo) & Chr(Hi)
  48. End Function
  49.  

Sau đó về lại Form1, gắn vào đó 1 đối tượng winsock, đặt tên gì cũng được (trong bài này đặt là Sock)
Cũng cần nói sơ qua về quá trình đăng nhập, gởi nhận tin nhắn trên cơ sở Y! Protocol
Đăng nhập:
Để bắt đầu quá trình đăng nhập, trước tiên, Y!M sẽ gởi 1 gói tin tới Server, gói tin như sau:
YMSG  W 1Ŕ€sundaxxxaŔ€

đại khái, nội dung gói tin này là: "Ê! server, tao sắp login đây!" B-)
Sau đó server sẽ trả về lại 1 gói tin:
YMSG , W ~* —1Ŕ€sundxxxaŔ€94Ŕ€3x0FCwY8xVwZSf90P.g5SA--Ŕ€

nội đung đại khái như: "Mày thích thì mày cứ việc login, nhưng khai ra tên tuổi mật khâu đây!" (:|
Sau đó thì Y!M sẽ gởi gói tin chứa username và mật khẩu để đăng nhập:
YMSG ] T 0Ŕ€sunxxxxxaŔ€6Ŕ€2D6hQasaMBO1hSakKjf0MA--Ŕ€96Ŕ€H12vBg.nio6BdDL98MQRnA--Ŕ€2Ŕ€1Ŕ€1Ŕ€sunxxxxxxŔ€

<= "Dạ, tên em là:...., mật khẩu em là:..." :)
Gởi tin nhắn:
Để gởi tin nhắn (sau khi đăng nhập), Y!M sẽ gởi đến server 1 gói tin như sau:
YMSG D ZUŞV~*
—1Ŕ€sunxxxxxŔ€5Ŕ€venkxxxxeŔ€14Ŕ€hiŔ€97Ŕ€0Ŕ€63Ŕ€;0Ŕ€64Ŕ€0Ŕ€1002Ŕ€1Ŕ€

<= "Ê mậy, gởi giúp tao đoạn tin này:.... tới thằng này:..." :-B
Nhận tin nhắn:
Khi có người gởi tin cho bạn, server sẽ "bắn" về Y!M của bạn 1 gói tin như sau:
YMSG A  ~* —5Ŕ€sundaxxxxŔ€4Ŕ€venkyxxxxŔ€14Ŕ€hi thereŔ€63Ŕ€;0Ŕ€64Ŕ€0Ŕ€97Ŕ€0Ŕ€

Đại khái là: "Êh thằng kia, có tin nhắn! ku:.... gởi cho mày, nội dung:..." :-w


Tất nhiên khi code thì ta không thể gởi trực tiếp những gói tin đọc hiểu chết như thế, mà phải qua một công đoạn gọi là: mã hóa - giải mã
đó là nhiệm vụ của cái module tạo ra ở đầu bài

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: CN 15/06/2008 4:35 pm
gửi bởi hdn
Việc gởi một gói tin như thế, code sẽ như thế này:

Mã: Chọn hết

  1.  
  2. Public Function SendPacket(lngCommand As Long, strStatus As String, strData As String) 'send a packet
  3.    
  4.     If Sock.State <> sckConnected Then Exit Function
  5.     Sock.SendData "YMSG" & _
  6.     ChrH("00 0D 00 00") & _
  7.     Word(Len(strData)) & Word(lngCommand) & _
  8.     strStatus & strSessionID & _
  9.     strData
  10. End Function
  11.  

khi nhận 1 gói tin, sự kiện DataArival của sock như sau:

Mã: Chọn hết

  1.  
  2. Private Sub Sock_DataArrival(ByVal bytesTotal As Long)
  3.     Dim strDatas As String
  4.     Sock.GetData strDatas
  5.     Call ParseData(strDatas)
  6. End Sub
  7.  

khi 1 gói tin được gửi đến, nội dung của nó sẽ có dạng đọc-hiểu-chết như ở trên ta vừa thấy, vì thế nên ta phải giải mã trước, rồi phân tích đoạn tin đó bằng hàm ParseData

Mã: Chọn hết

  1.  
  2. Private Function ParseData(strData As String)
  3.     Dim A1, A2, A3, A4, A5, A6
  4.     If Len(strData) < 20 Then Exit Function
  5.     Select Case AscToHex(Mid(strData, 11, 2)) 'grab command
  6.    
  7.         Case "00 06" 'incoming message
  8.             A1 = InStr(1, strData, ChrH("31 C0 80"))
  9.             A2 = InStr(A1 + 3, strData, ChrH("C0 80"))
  10.             A3 = Mid(strData, A1 + 3, A2 - A1 - 3) 'username
  11.        
  12.             A4 = InStr(1, strData, ChrH("C0 80 31 34 C0 80"))
  13.             A5 = InStr(A4 + 6, strData, ChrH("C0 80"))
  14.             A6 = Mid(strData, A4 + 6, A5 - A4 - 6) 'message
  15.            
  16.             MsgBox A3 & " says " & A6, vbInformation, "Message"
  17.        
  18.         Case "00 4C" 'replied to inital login command
  19.        
  20.             SendPacket 87, ChrH("00 00 00 00"), ChrH("31 C0 80") & txtID.Text & ChrH("C0 80")
  21.        
  22.         Case "00 55" 'logged in
  23.                    
  24.             lblStatus.Caption = "Status: Logged In"
  25.            
  26.         Case "00 57" 'replied with challange for login
  27.        
  28.             Dim strChallange As String, Encrypted As Variant
  29.             A1 = InStr(1, strData, ChrH("39 34 C0 80")) 'challange start
  30.             A2 = InStr(A1 + 4, strData, ChrH("C0 80")) 'challange finish
  31.             strChallange = Mid$(strData, A1 + 4, A2 - A1 - 4)  'grab the challange
  32.            
  33.             Encrypted = Split(EncryptPassword(txtID.Text, txtPassword.Text, strChallange), ":", 2)  'encrypt password with challange
  34.            
  35.             SendPacket 84, ChrH("5A 55 AA 55"), ChrH("36 C0 80") & Encrypted(0) & ChrH("C0 80 39 36 C0 80") & _
  36.             Encrypted(1) & ChrH("C0 80 30 C0 80") & txtID.Text & ChrH("C0 80 32 C0 80") & _
  37.             txtID.Text & ChrH("C0 80 32 C0 80 31 C0 80 31 C0 80") & txtID.Text & _
  38.             ChrH("C0 80 32 34 34 C0 80 35 32 34 32 32 33 C0 80 31 33 35 C0 80 37 2C 30 2C 30 2C 34 32 36 C0 80 31 34 38 C0 80 33 36 30 C0 80 35 39 C0 80 42 09 35 6C 72 66 63 63 6C 31 6B 68 65 68 39 26 62 3D 32 C0 80")
  39.        
  40.         Case Else
  41.     End Select
  42. End Function
  43.  

việc xử lý cho từng trường hợp cũng trong này luôn.
đầu tiên là lấy ra phần thông tin xác định của từng gói tin (sau khi đã được chuyển từ mã ASCII sang HEX): AscToHex(Mid(strData, 11, 2))
nếu phần xác định đó là "00 06" thì tức là có tin nhắn gửi tới
nếu là "00 4C" tức là server bảo mình cứ việc login, nhưng phải khai tên tuổi mật khẩu
nếu là "00 55" tức là đã đăng nhập thành công
nếu là "00 57" thì sau đó ta phải gởi username và password cho nó

mã nguồn của 1 chương trình login và gởi nhận tin nhắn đơn giản, bạn có thể tải tại đây:
http://pscode.com/Upload_PSC/ftp/Y_Logi ... 212005.zip

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: CN 15/06/2008 8:43 pm
gửi bởi truongphu
phùùùùùù! đọc xong lại ko hiểu gì ráo :)) :-O
Mong hdn làm thêm mấy cái command và textbox gì gì đó, đóng gói cho bà con load về test thử
háo hức chờ mong
=D> =D>

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Hai 16/06/2008 12:09 am
gửi bởi hdn
Cháu cũng vừa làm xong :D
test.jpg

test2.jpg

Download:
YPtest.rar
Mã nguồn
(57.85 KiB) Đã tải 1234 lần

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Ba 05/08/2008 8:43 am
gửi bởi FVS
Mình có thắc mắc thía này: không hỉu sao khi run bằng VB thì thấy báo lỗi thiếu file YMSG12ENCRYPT.dll (mặc dù file này có nằm trong thư mục dự án và đúng tên). Còn hay hơn nữa là khi dịch ra .EXE thì lại chạy ngon lành mà không cần thay đổi gì cả. Ai bik giải thích giùm mình với!

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Ba 05/08/2008 9:20 am
gửi bởi DungCoi
FVS đã viết:Mình có thắc mắc thía này: không hỉu sao khi run bằng VB thì thấy báo lỗi thiếu file YMSG12ENCRYPT.dll (mặc dù file này có nằm trong thư mục dự án và đúng tên). Còn hay hơn nữa là khi dịch ra .EXE thì lại chạy ngon lành mà không cần thay đổi gì cả. Ai bik giải thích giùm mình với!

thực ra ví dụ bận để source ở vị trí E:\DungCoi
thì thực ra khi Run bằng VB6 thì nó chẳng hề tạo file gì trong thư mục ấy đâu hay check gì trong thưc mực DungCoi đâu, nó xét path lúc này của nó là nơi bạn cài VB6 ấy (C:\Programs file...)

Như vậy, muốn nó khỏi cần biên dịch để chạy ngon thì copy thư viện ấy vào thư mục cài VB6.
:D

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Ba 05/08/2008 9:25 am
gửi bởi FVS
à, cảm ơn rất nhìu

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Ba 05/08/2008 11:51 am
gửi bởi anton
bài viết rất bổ ích! :)

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Ba 05/08/2008 12:47 pm
gửi bởi anton
:| chết thật, sao cái DLL này ko add vào VB.NET dc :((

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Ba 05/08/2008 4:01 pm
gửi bởi hdn
Đặt nó vào cùng thư mục rồi khai báo thôi chứ đâu phải add vô project :| chưa thử với VB.NET, nhưng chắc chắn là làm được :D

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Năm 07/08/2008 2:16 pm
gửi bởi caotri270119
sao không tạo chức năng gửi file và nhận file cho chương trình dzậy anh. nếu mà thêm chức năng đóa nữa thì chương trình đó làm bản thương mại được rồi đó. ;) ;) ;)

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Năm 07/08/2008 3:27 pm
gửi bởi hdn
chịu thôi, :D vẫn chưa làm được

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Năm 07/08/2008 3:27 pm
gửi bởi giongto35
XÀi DLL của họ sao làm thương mại được :))

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Sáu 08/08/2008 7:42 am
gửi bởi FVS
Chỉ thêm c/n gửi file thôi thì đã được gì đâu mà thương mại hay không. Trong CLBVB cũng có một cái source về yahoo, có thêm mấy chức năng khác đấy, vào đây nè: viewtopic.php?f=33&t=632&p=3251&hilit=yahoo+clone#p3251

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Sáu 08/08/2008 9:42 am
gửi bởi DungCoi
@Huy : Trên PSC có ít nhất 2 source về vấn đề send file qua YM rồi đó em :D

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Bảy 09/08/2008 1:29 pm
gửi bởi caotri270119
anh hdn ơi, anh cho em coi cái code chương trình Yahoo của anh được không? không phải là cái code đơn giản anh pose lên đâu nha, mà là cái code của chương trình mà anh đã gửi hình lên đóa

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Bảy 09/08/2008 4:47 pm
gửi bởi hdn
Chương trình mình gửi hình lên là cái code mình post lên đó. Cái YPtest đó bạn :D

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: CN 28/09/2008 7:31 am
gửi bởi NoName_NoLove
sao cái DLL này ko add vào VB.NET dc bạn nào biết hay chỉ giứp.thank you

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: T.Bảy 04/04/2009 11:02 pm
gửi bởi Cpro
Sau đó về lại Form1, gắn vào đó 1 đối tượng winsock, đặt tên gì cũng được (trong bài này đặt là Sock)
Cũng cần nói sơ qua về quá trình đăng nhập, gởi nhận tin nhắn trên cơ sở Y! Protocol

cho em hỏi,Cái kiểu dữ liệu của biến sock là kiểu gì thế,nếu chuyển nó sang C++ thì biến đó có kiểu dữ liệu là gì,tại sao kiểu dữ liệu của biến sock lại không có được khai báo trong code vậy

Re: Đăng nhập - Gởi - Nhận tin nhắn Y!M với VB6

Đã gửi: CN 12/04/2009 10:09 am
gửi bởi hdn
Sock ko phải là biến mà là một đối tượng, nó đảm nhận việc kết nối vào ra với một máy khác (ở đây là Y!M Server), dữ liệu truyền đi của nó là các gói tin thông qua giao thức TCP/IP, và chức năng gởi gói tin của sock là một hàm nằm trong đối tượng đó