Mô tả chi tiết giao thức YMSG

Một phần của tài liệu XÂY DỰNG HỆ THỐNG DỊCH VỤ GIÁ TRỊ GIA TĂNG TRÊN NỀN DỊCH VỤ NHẮN TIN TỨC THÌ QUA HỆ THỐNG TIN NHẮN TỨC THÌ (Trang 31)

Tuy có thay đổi theo phiên bản giao thức, nhưng thứ tự thực hiện trong giao thức YMSG vẫn được giữ nguyên (từ phiên bản 9 đến phiên bản 15) theo Hình 3. 6: Giao thức YMSG dưới đây:

Hình 3. 6: Giao thức YMSG

3.2.1. Verify

Đây là tính hiệu đầu tiên của client (Yahoo Messenger) gửi cho server. Cấu trúc của gói tin như sau:

Hình 3. 7: Cấu trúc gói tin Verify

• 4 byte đầu luôn là YMSG

• 2 byte tiếp là phiên bản 0x000F = 15

• 4 byte tiếp là độ dài trường DATA (hiện tại bằng 0) • 2 byte tiếp là mã dịch vụ. 0x004C là dịch vụ Verify

• 4 byte tiếp là mã trạng thái (0x00000000 tương ứng available) • 4 byte tiếp là session, lúc này server chưa gửi session

Gói tin hồi đáp từ server `

Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x004C 0x00000000

0x000F 0x00000000

Hình 3. 8: Gói tin Verify hồi đáp từ Server

• 4 byte đầu luôn là YMSG

• 2 byte tiếp là phiên bản 0x000F = 15

• 4 byte tiếp là độ dài trường DATA (hiện tại bằng 0) • 2 byte tiếp là mã dịch vụ. 0x004C là dịch vụ Verify

• 4 byte tiếp là mã trạng thái (0x00000001 tương ứng mã trả lời của server) • 4 byte tiếp là session, lúc này server chưa gửi session

3.2.2. Xác thực (Authentication )

Gói tin tiếp theo gửi từ Client là gói tin yêu cầu xác thực. Nội dung gói tin gồm có user’s Yahoo id, hoặc thông tin định danh tới Yahoo id này. Gói xác thực có một cặp khóa/ giá trị.

Server trả lời lại một challenge string. Client sẽ băm username và password với challenge string và gửi lại cho Server trong gói tin AUTH_RESP.

` Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x004C 0x00000001

0x000F 0x00000000

Và dưới là hình ảnh chụp màn hình gói tin Authentication được bắt bởi chương trình Wireshark

Hình 3. 10: Ảnh chụp gói tin Authentication

• 4 byte đầu luôn là YMSG

• 2 byte tiếp là phiên bản 0x000F = 15

• 4 byte tiếp là độ dài trường DATA (hiện tại bằng 0x0A = 10) • 2 byte tiếp là mã dịch vụ. 0x0057 là dịch vụ Authentication • 4 byte tiếp là mã trạng thái (0x00000000)

• 4 byte tiếp là session, lúc này session chưa có • Trường Data lúc này có 1 cặp key:value • 1:yb_v1 (nick yahoo)

Server sẽ trả lời bằng gói tin sau: Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x0057 0x00000000

0x000F 0x0000000A

0x00000000

1:yahoo id

Bên dưới là ảnh chụp màn hình gói tin Authentication ACK được bắt bởi chương trình Wireshark

Hình 3. 12: Ảnh chụp gói tin Authentication ACK

• 4 byte đầu luôn là YMSG

• 2 byte tiếp là phiên bản 0x000F = 15

• 4 byte tiếp là độ dài trường DATA (hiện tại bằng 0x64 = 100) • 2 byte tiếp là mã dịch vụ. 0x0057 là dịch vụ Authentication • 4 byte tiếp là mã trạng thái (0x000000001 là mã server hồi đáp) • 4 byte tiếp là session, 0x00542FCA

• Trường Data lúc này có 3 cặp key:value

o 1:yb_v1 (nick yahoo)

o 94:8*p/n+a/z+j^(l-(x/p&p)*4%t&(z/r&… (chuỗi challenge)

o 13:2 (một giá trị vô nghĩa ?)

Sau khi bắt được gói tin AuthenticationACK, sẽ thực hiện việc băm mật khẩu với chuỗi challenge mà server vừa gửi. Thuật toán băm mật khẩu cũng là một thuật toán đóng. Rất may là đã có sẵn một thư viện viết về thuật toán này.

Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x0057 0x00000001 0x000F 0000 0x00000064 0x00542FCA 1:Yahoo id 94: Chuỗi MD5 Challenge 13:2

Ảnh dưới là gói tin Authentication Response được bắt bởi Wireshark

Hình 3. 14: Ảnh chụp gói tin Authentication Response

• 4 byte đầu luôn là YMSG

• 2 byte tiếp là phiên bản 0x000F = 15

• 4 byte tiếp là độ dài trường DATA (hiện tại bằng 0xB0 = 176)

• 2 byte tiếp là mã dịch vụ. 0x0054 là dịch vụ Authentication Response • 4 byte tiếp là mã trạng thái (0x00000000C)

• 4 byte tiếp là session, 0x0053BFC3 • Trường Data lúc này có 7 cặp key:value

o 6:A=6p;J=ad;J=8n,X=68,V=7B,V=Em,Z=j6;M=jm;E=A8;L=ae, (giá trị băm thứ

nhất)

Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x0054 0x0000000C

0x000F

0000 0x000000B0

0x0053BFC3

6: Chuỗi băm mật khẩu 1 96: Chuỗi băm mật khẩu 2 0:Yahoo id

2:1

1:Yahoo id 244:524223

135:8.1.0.249 (phiên bản Yahoo client) 148:300

o 96:R=hh;h=g0,K=fF,F=9b,W=m9,V=eh,r=59,Q=F3;K=0j,A=pc; (giá trị băm thứ

2)

o 0:yb_v1

o 2:1 (không hiểu ý nghĩa)

o 1:yb_v1

o 244:524223 (không hiểu ý nghĩa)

o 135:8.1.0.249 (Phiên bản Client. Nếu thay bằng phiên bản client 7.1.0.249 thì

quá trình này cũng không thành công)

o 148:300 (không hiểu ý nghĩa)

Trên thực tế, gói tin Authentication Response có thể chứa nhiều thông tin. Tùy theo từng phiên bản mà những thông tin gửi kèm là khác nhau. Những thông tin đưa lên đây là những thông tin bắt buộc phải có, và đủ để cho quá trình đăng nhập thành công.

Có một số trường trong giao thức Yahoo không có ý nghĩa, hoặc mang một ý nghĩa sâu xa nào đó, tuy nhiên nếu thiếu thì server sẽ từ chối gói tin khi nhận được.

3.2.3. Gửi /nhận tin nhắn

Ảnh chụp gói tin Message bắt bằng Wireshark

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

Y M S G 0x0006 0x5A55AA56 0x000F 0000 0x000000B0 0x0053BFC3 1:Yahoo id 5:Yahoo id nhận tin nhắn 14:Nội dung tin nhắn 97:1

63:0 64:0 1002:1

Hình 3. 16: Ảnh chụp gói tin Message

• 4 byte đầu luôn là YMSG

• 2 byte tiếp là phiên bản 0x000F = 15

• 4 byte tiếp là độ dài trường DATA (hiện tại bằng 0x50 = 80) • 2 byte tiếp là mã dịch vụ. 0x0006 là dịch vụ Message

• 4 byte tiếp là mã trạng thái (0x5A55AA56 là trạng thái ẩn) • 4 byte tiếp là session, 0x0053BFC3

• Trường Data lúc này có 7 cặp key:value

o 1:yb_v1 (nick yahoo )

o 5:ninja_qbonline (nick yahoo người nhận)

o 14:hello world :D (thông điệp)

o 97:1 (không hiểu ý nghĩa )

o 63:;0(không hiểu ý nghĩa )

o 64:0(không hiểu ý nghĩa )

o 1002:1(không hiểu ý nghĩa )

Thực chất của việc hai người chat với nhau đó chính là người thứ nhất gửi tin nhắn đến server, server gửi lại tin nhắn đó đến người thứ hai và ngược lại. Vì thế gói tin khi nhận tin nhắn không khác gì lắm so với gói tin lúc gửi tin nhắn (chỉ khác ở trường mã trạng thái).

3.2.4. Gửi chú ý bắt đầu/dừng việc đánh máy

Khi người dùng gõ vào nội dung chat, Yahoo Client sẽ tự động gửi gói tin báo việc này về Server. Server sẽ gửi lại Yahoo Client bên kia.

Hình 3. 17: Cấu trúc gói tin Notify, Hình 3. 18: Ảnh chụp gói tin Notify được bắt bằng Wireshark.

3.2.5. Logoff

Mỗi khi có người trong friendlist logoff thì Yahoo Server gửi một gói tin theo định dạng sau:

Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x0002 0x00000001 0x000F 0000 0x0000000A 0x0054F22E 1:Yahoo id Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x004b 0x00000016

0x000F

0000 0x00000064

0x0052FCA

4: Yahoo id gửi tin 5: Yahoo id nhận tin

13: 1 hoặc 0 là bắt đầu hay dừng việc đánh máy 14: <space>

49: TYPING

Hình 3. 17: Cấu trúc gói tin Notify

Ảnh chụp gói tin Logoff trên thực tế bằng wireshark.

Hình 3. 20: Ảnh chụp gói tin Logoff

3.2.7. Thêm bạn

Gói tin được gửi tới Yahoo Server khi muốn thêm một người bạn mới vào danh sách bạn (friendlist) có định dạng như sau:

Và dưới là ảnh chụp gói tin Add Buddy được bắt bằng Wireshark Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x0083 0x00000000

0x000F

0000 0x00000082

0x005BAE40

65: Nhóm muốn add người bạn này vào 216: Tên

254: Họ 1:Nick yahoo

7:Nick yahoo mình muốn thêm vào

Khi việc thêm nick Yahoo thành công, Server sẽ gửi trả lại một gói tin thông báo việc này thành công. Gói tin server gửi về khá giống với gói tin lúc gửi cho server chỉ khác ở chỗ status của gói tin này là 0x00000001. Trong chương trình Yahoo bot không quan tâm lắm đến gói tin mà server trả về (trong trường hợp này) chỉ quan tâm đến các gói tin có service code là 0x0006 (những gói tin message).

3.2.8. Xóa nick trong danh sách bạn

Khi muốn xóa nick nào đó trong friendlist thì cần gửi một gói tin có định dạng như hình dưới đến server:

Hình dưới là ảnh chụp gói tin Remove Buddy bắt bằng Wireshark

Hình 3. 24: Ảnh chụp gói tin Remove Buddy

Cũng tương tự như việc thêm một nick vào friendlist, Server cũng sẽ gửi trả lại một gói tin chỉ khác gói tin gửi cho Server ở mã trạng thái (status code).

Y M S G

2 Byte 2 Byte 2 Byte 2 Byte 2 Byte

0x0084 0x00000000

0x000F

0000 0x0000002B

0x005BAE40

65: nhóm chưa nick cần xóa 1: Yahoo id

7:Yahoo id bị xóa

3.3. Phân tích thiết kế module Yahoo bot

3.3.1. Ngôn ngữ

Ngôn ngữ mà chúng tôi quyết định chọn là Python[9], một ngôn ngữ thông dịch, dễ học và dễ viết.

Python là một ngôn ngữ lập trình hướng đối tượng, chạy được trên nhiều hệ điều hành phổ biến hiện nay như Windows, Linux, Unix, Mac, đơn giản như các shellscript nhưng thực sự là ngôn ngữ để phát triển ngôn ngữ bậc rất cao (very-high-level-language). Python cho phép chia nhỏ chương trình thành các module (tương tự java) mà có thể chạy độc lập không cần chương trình gốc.

Đây là một ngôn ngữ dạng thông dịch (interpreter language), do vậy không phải tốn thời gian để biên dịch, liên kết..., mà chỉ viết và chạy.

Cú pháp của Python rõ ràng và ngắn gọn hơn nhiều so với C/C++, được đánh giá là ngôn ngữ có số lần gõ phím ít nhất khi viết chương trình tương tự với các ngôn ngữ khác như C/C++, Java ...

Ngôn ngữ Python được phát triển theo GNU, hoàn toàn miễn phí và là mã nguồn mở. Có nghĩa là có thể dùng Phython để phát triển các ứng dụng mà không cần phải trả bất kỳ một chi phí nào[10].

3.3.2. Cấu trúc của moduleMain Program Main Program PkgHandler Text  cmd, args YMSG IM-CMD -Doit Return text -Autorun(im) Auto_run Config.txt  cmd(s) Yahoo! SERVER Yahoo! SERVER … Internet Internet CSDLCSDL … .. .. Service

Module sẽ bao gồm 4 phần chính

YMSG

Thực thi giao thức YMSG, giúp TCat giao tiếp với người sử dụng thông qua Yahoo, cũng như nhận các thông tin từ họ. Khi đăng nhập thành công. YMSG sẽ gọi

PkgHandler lên.

PkgHandler

Chuyên lắng nghe các yêu cầu từ người sử dụng. Khi có một yêu cầu đến, lập tức phân tích yêu cầu, gọi ra những module cần thiết.

IM-CMD

Là một giao diện (interface) cung cấp hai hàm chính là doit và auto_run. Các dịch vụ (ví dụ như nhắc việc, translate, weather) phải thực thi giao diện này. Điều này có nghĩa là các dịch vụ là những phần nhỏ, có hai hàm doit và auto_run. Tiêu chí để viết các dịch vụ là càng đơn giản càng tốt. Vì TCat sẽ chạy nhiều dịch vụ khác nhau. Nếu mỗi dịch vụ đều yêu cầu cấp phát tài nguyên lớn, tốn nhiều băng thông mạng thì TCat sẽ chạy rất chậm.

Auto_run

Là tiến trình tự động chạy, cung cấp các dịch vụ một cách chủ động (các dịch vụ nhắc việc, báo thức..).

3.3.3. Tiến trình thực hiện

Chương trình chính khi khởi động sẽ tự động gọi hai đối tượng YMSG và Autorun. Sau đó tiến trình truyền tham số Y!ID và Y!Password cho YMSG để YMSG đăng nhập. Sau khi đăng nhập thành công, YMSG sẽ tự động gọi PkgHandler. PkgHandler sẽ lắng nghe các gói tin đến, xóa những gói tin không cần thiết, chỉ xử lý các gói tin có mã là YAHOO_SERVICE_CHATMSG. Sau khi bắt được gói tin, PkgHandler sẽ tiến hành việc phân tích gói tin dựa vào ký tự <dấu cách>.

Ví dụ

/translate en vi hello

Dịch vụ được viết sao cho đảm bảo tính đơn giản. Trong dịch vụ phải thực thi giao diện IMCMD, nói cách khác thì phải có hai hàm đặc biệt là hàm doit auto_run. Hàm doit

nhận hai tham số chính là chuỗi tham số và nick Yahoo gửi:

def doit (args, sender): args: chuỗi tham số do người dùng đưa vào sender: nick Yahoo của người dùng

Hàm doit trả về một chuỗi. PkgHandler sẽ gửi lại cho người yêu cầu nội dung mà hàm

doit trả về thông qua YMSG. Bản thân PkgHandler chỉ lắng nghe các gói tin đến. Nếu muốn gửi một thông điệp đến người dùng nào đó, PkgHandler phải yêu cầu YMSG

gửi.

Hàm doit từ dữ liệu đầu vào của người dùng, tùy mỗi loại mà có những cách xử lý khác nhau. Có thể sẽ kết nối CSDL hoặc phân tích các RSS trên Internet để lấy về nội dung cần trả.

Hàm auto_run là hàm được gọi từ tiến trình Autorun. Tiến trình Autorun sẽ được kích hoạt trong chương trình chính. Khi khởi động, tiến trình Autorun sẽ đọc file config.txt. Trong file config.txt này sẽ liệt kê các dịch vụ muốn thực hiện chế độ chạy tự động. Tiến trình Autorun sẽ lần lượt gọi các dịch vụ này thông qua hàm auto_run(im). (là một hàm trong giao diện IMCMD). Với im là một thể hiện (instance) của YMSG. Hàm auto_run của dịch vụ sẽ tự xử lý dữ liệu (bằng nhiều cách) sau đó gửi tin nhắn thông qua biến im.

Đa phần các dịch vụ cung cấp chế độ chạy tự động (auto_run) đều không tự động xử lý dữ liệu. Bởi vì nếu tự xử lý dữ liệu thì sẽ rất tốn tài nguyên. Vì vậy, việc xử lý và lưu trữ dữ liệu đều được thực hiện ở hệ thống bên ngoài (có thể làm một nhà cung cấp dịch vụ nào đó hoặc tự xây dựng các hàm cung cấp dịch vụ).

3.4. Tổng quan giao thức Google Talk

Hình 3. 26 Cấu trúc module Gtalk bot

Main Program RegisterHandler( "message",contro ller) XMPP IM-CMD -Doit Return text -Autorun(im) Auto_run Config.txt  cmd(s) Talk.Google.Com Talk.Google.Com Service Service Internet Internet CSDLCSDL Controlle r Service Service

3.4.1. Các bước kết nối

Google Talk sử dụng giao thức XMPP (Extensible Messaging and Presence Protocol) để xác thực, trình diễn và nhắn tin. Chỉ cẩn viết một ứng dụng sử dụng giao thức theo chuẩn XMPP và kết nối đến Server của Google Talk là có thể đăng nhập vào.

XMPP trước kia còn được biết đến với một tên khác là Jabber. Giao thức XMPP IM được mô tả chi tiết trong RFC 3921 [11].

XMPP cung cấp nhiều thư viện cho hầu hết các ngôn ngữ lập trình hiện nay trong đó có Python[12].

Để kết nối vào Server Google Talk theo giao thức XMPP thì phải cài tiến hành việc cài đặt thư viện. Ở đây chúng tôi sử dụng thư viện XMPPPY.

Kết nối đến server Google Talk:

self.conn=xmpp.Client(‘gmail.com’)

conres=self.conn.connect(server=(‘talk.google.com’, 5233) )

Để xác thực:

authres=self.conn.auth(user, password)

Đăng ký sự kiện khi nhận được một message:

self.conn.RegisterHandler("message", self.controller)

trong đó self.controller là một hàm có hai tham số là conn, message. Để gửi thông điệp:

conn.send(xmpp.protocol.Message(tojid,text))

3.4.2. Cấu trúc module

Ở chương trình chính sẽ sử dụng biến xmpp là một thể hiện của XMPP, khai báo các tham số cho dùng để đăng nhập. Sau đó gọi hàm

RegisterHandler("message",controller)

Hàm này là một hàm đặc biệt của xmpp. Hàm này dùng để đăng ký hàm xử lý sự kiện khi nhận thông điệp. Ở trên là đăng ký cho hàm controller để xử lý sự kiện nhận thông điệp.

Hàm controller có cấu trúc như sau:

def controller (self,conn,mess):

Biến conn là Client, dùng để gửi thông điệp conn.send().

Biến mess là thông điệp nhận được. Dùng hàm sau để lấy ra người gửi thông điệp:

text = message.getBody() user = message.getFrom()

Hàm controller sẽ xử lý các text nhận được từ người dùng, phân tích chuỗi nhập text mà người dùng gửi đến để tìm ra dịch vụ thích hợp.

Ví dụ

/news vnexpress

Dịch vụ cần gọi là news. Khi gọi dịch vụ cần cung cấp một tham số là vnexpress.

Cũng giống như cấu trúc module Yahoo bot . Dịch vụ được viết sao cho đảm bảo tính đơn giản. Trong dịch vụ phải thực thi giao diện IMCMD, nói cách khác thì phải có hai hàm đặc biệt là hàm doit auto_run. Hàm doit nhận hai tham số chính là chuỗi tham số và nick Google Talk gửi.

def doit (args, sender): args: chuỗi tham số do người dùng đưa vào sender: nick Google Talk của người dùng

Hàm doit trả về một chuỗi. Controller sẽ nhận chuỗi đó sau đó gửi cho người dùng thông qua biến XMPP. Bản thân Controller không phải là một tiến trình, hoặc một thread (luồng) đặc biệt, đơn giản chỉ là một hàm bắt sự kiện nhận gói tin mesage.

Hàm doit từ dữ liệu đầu vào của người dùng, tùy mỗi loại mà có những cách xử lý khác nhau. Có thể sẽ kết nối CSDL hoặc parse các RSS trên Internet để lấy về nội dung cần trả.

Hàm auto_run là hàm được gọi từ tiến trình Autorun. Tiến trình Autorun sẽ được kích hoạt trong chương trình chính. Khi khởi động, tiến trình Autorun sẽ đọc file config.txt. Trong file config.txt này sẽ liệt kê các dịch vụ muốn thực hiện chế độ chạy tự động. Tiến trình Autorun sẽ lần lượt gọi các dịch vụ này thông qua hàm auto_run(im). (là một

Một phần của tài liệu XÂY DỰNG HỆ THỐNG DỊCH VỤ GIÁ TRỊ GIA TĂNG TRÊN NỀN DỊCH VỤ NHẮN TIN TỨC THÌ QUA HỆ THỐNG TIN NHẮN TỨC THÌ (Trang 31)

Tải bản đầy đủ (DOC)

(89 trang)
w