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
~ 35 ~
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 và 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
~ 36 ~
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",contr oller) XMPP IM-CMD -Doit Return text -Autorun(im) Auto_run Config.txt cmd(s) Talk.Google.Com Service Service Internet CSDL Controller Service Service
~ 37 ~
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
~ 38 ~
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ệpconn.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 và 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
~ 39 ~
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 XMPP. 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
~ 40 ~
CHƯƠNG 4. GIAO DIỆN WEB
4.1. Tổng quan về Web
World Wide Web, gọi tắt là Web hoặc WWW là một không gian thông tin toàn cầu mà mọi người có thể truy nhập (đọc và viết) qua các máy tính được kết nối với mạng
Internet. Thuật ngữ này thường được hiểu nhầm là từ đồng nghĩa với chính thuật ngữ Internet. Nhưng Web thực ra chỉ là một trong các dịch vụ chạy trên Internet, chẳng hạn như dịch vụ thư điện tử, truyền file FTP. Web được phát minh và đưa vào sử dụng vào khoảng năm 1990, 1991 bởi viện sĩ Viện Hàn lâm Anh Tim Berners-Lee và Robert Cailliau (Bỉ) tại CERN, Geneva, Switzerland[13].
Các tài liệu trên World Wide Web được lưu trữ trong một hệ thống siêu văn bản (hypertext), đặt tại các máy tính trong mạng Internet. Người dùng phải sử dụng một chương trình gọi là trình duyệt web (web browser) để hiển thị siêu văn bản. Người
dùng nhập thông tin tại ô địa chỉ (address), rồi sau đó chương trình sẽ tự động gửi thông tin đến máy chủ (web server) và hiển thị trên màn hình máy tính của người xem. Hoạt động truy tìm theo các siêu liên kết thường được gọi là duyệt Web.
Web cung cấp giao diện xử lý đơn giản, việc thiết kế Web cũng không tốn nhiều chi phí và đặc biệt hiện nay, Web đã trở nên phổ biến trên thế giới và cả ở Việt Nam.
Mục đích của chúng tôi khi xây dựng module Web là cung cấp cho người sử dụng một
giao diện đơn giản, giúp người sử dụng thao tác dễ dàng với TCat. Đồng thời, ứng
dụng Web sẽ đến với người dùng nhanh hơn. Vì đa phần ở máy người sử dụng đều đã
có cài đặt sẵn trình duyệt web, người sử dụng muốn thao tác với TCat, đơn giản chỉ
việc gõ địa trang Web trên thanh địa chỉ.
Thao tác đơn giản, đến với người sử dụng nhanh, chi phí phát triển có thể chấp nhận được. Các ứng dụng trên web đa phần đều là mã nguồn mở, được sự hỗ trợ của cộng đồng mã nguồn mở. Vì thế phát triển ứng dụng Web là một trong những chiến lược
quan trọng.
Hơn nữa, theo như phân tích ở chương hai, chúng tôi dùng WEB làm cầu nối giữa các
úng dụng chạy trên Desktop (các dịch vụ của IM, SMS) với CSDL. Vì vậy phần WEB đóng vai trò rất quan trọng trong TCat.
~ 41 ~
4.2. Ngôn ngữ
Có khá nhiều ngôn ngữ Web phía Server phổ biến hiện này như ASP.NET, JSP,
PHP… Chúng tôi quyết định chọn ngôn ngữ phía Server là PHP.
PHP là một ngôn ngữ lập trình kịch bản hay một loại mã lệnh chủ yếu được dùng để
phát triển các ứng dụng viết cho máy chủ, mã nguồn mở, dùng cho mục đích tổng
quát. PHP rất thích hợp với web và có thể dễ dàng nhúng vào trang HTML. Do được
tối ưu hóa cho các ứng dụng web, tốc độ nhanh, nhỏ gọn, cú pháp giống C và Java, dễ
học và thời gian xây dựng sản phẩm tương đối ngắn hơn so với các ngôn ngữ khác nên
PHP đã nhanh chóng trở thành một ngôn ngữ lập trình web phổ biến nhất thế giới.
Hơn nữa, cộng đồng mã nguồn mở viết bằng PHP là rất rộng lớn. Mã lệnh viết bằng PHP đơn giản và dễ hiểu, phát triển WEB trên PHP chúng tôi mong nhận được sự hỗ
trợ của cộng đồng mã nguồn mở.
Về cơ sở dữ liệu, chúng tôi quyết định chọn hệ quản trị cơ sở dữ liệu MySQL.
MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới và được các
nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng. MySQL là cơ sở dữ
liệu tốc độ cao, ổn định và dễ sử dụng, có tính khả chuyển, hoạt động trên nhiều hệ điều hành cung cấp một hệ thống lớn các hàm tiện ích rất mạnh. Với tốc độ và tính bảo
mật cao, MySQL rất thích hợp cho các ứng dụng có truy cập CSDL trên Internet. MySQL miễn phí hoàn toàn cho nên có thể tải về MySQL từ trang chủ và có nhiều
phiên bản cho các hệ điều hành khác nhau: phiên bản Win32 cho các hệ điều hành dòng Windows, Linux, Mac OS X, Unix, FreeBSD, NetBSD, Novell NetWare, SGI Irix, Solaris, SunOS, ...
PHP-MySQL là sự kết hợp rất được ưa chuộng trên thế giới, tính bảo mật khá cao,
chạy ổn định và rất nhanh.
4.3. Thiết kết CSDL
Cơ sở dữ liệu đều được tập trung ở phần WEB
Bảng User gồm các trường
- Id: khóa chính, là định danh của người sử dụng
~ 42 ~ - Password: Mật khẩu đăng nhập
- Email: địa chỉ email
- GroupId: Định danh nhóm làm việc
- Money: Số tiền hiện tại trong tài khoản
Bảng FriendList gồm
- ID: định danh.
- Name: tên người bạn.
- YahooNick: nick Yahoo.
- GtalkNick: Nick Gtalk.
- PhoneNumber: Số điện thoại.
- Accept: Đồng ý nằm trong danh sách bạn hay không? Nếu người này đồng ý thì
trường Accept có giá trị là Y hoặc G hoặc F hoặc cả 3 tương ứng với các trường hợp người này đồng ý trên nick Yahoo, Gtalk hay ở điện thoại
- Owner: Chủ sở hữu.
Bảng Bot gồm
- Id là một chuỗi số xác định định danh của các con bot. Chỉ có các con bot có id
truong này mới được phép hoạt động
- ActiveTime: Thời gian kết nối gần đây nhất, hệ thống sẽ căn cứ vào thời gian
kết nối này để kết luận con bot này hiện có đang online hay không.
Bảng Group
- Id: Định danh
- Group name: Tên nhóm
Bảng GroupACL
- Id: định danh
- GroupId: Định danh của nhóm
- Service code: mã dịch vụ
~ 43 ~ Bảng Service
- ServiceCode: mã dịch vụ
- Description: Mô tả về dịch vụ
Mối liên hệ của các bảng được thể hiện giống hình dưới:
Hình 4. 1 Mối liên hệ giữa các bảng trong CSDL
Mối quan hệ giữa các bảng
- Mỗi User chỉ thuộc một Group. Một Group có thể có nhiều User.
- Mỗi Friend chỉ thuộc một User. Một User có thể có nhiều Friend.
- Mỗi GroupACL chứa một Service và một Group
Mỗi User sẽ có một trường là GroupId. Đó là định danh của nhóm có User đó.
Mối Friend sẽ có một trường là OwnerId. Đó là định danh của User. Cho biết người bạn này thuộc User nào.
Group ACL là sự kết hợp của quan hệ nhiều - nhiều giữa 2 bảng Group và Service.
GroupACL đặc trưng cho quyền truy cập của một nhóm vào các dịch vụ. Một nhóm có
thể truy cập vào nhiều dịch vụ và ngược lại, một dịch vụ có thể được nhiều nhóm cho
~ 44 ~
4.4. Thiết kế module
Như đã nói ở phần đầu chương hai, Phần WEB là một trong những phần khá quan
trọng, làm nên kết cấu của TCat do các phần IM, hoặc SMS đều có các dịch vụ liên kết với cơ sở dữ liệu thông qua WEB. Nói một cách khác thì phần WEB chính là cầu
nối giữa các dịch vụ với CSDL chính của TCat. Bởi vậy phần WEB không những
cung cấp một giao diện đồ họa cho các xử lý của người sử dụng mà còn có thêm các dịch vụ Web tương thích với các dịch vụ được viết bởi SMS hay IM.
Cấu trúc cơ bản của module như sau:
Điểm vào duy nhất là file index.php và index2.php. File index.php đọc biến
action và sẽ load những dịch vụ có tên trùng với biến action nằm trong thư mục
modules. Có một vài dịch vụ đặc biệt như đăng ký nick, đăng nhập được
chuyển ra ngoài. File index2.php được sử dụng cho các dịch vụ liên kết. Các
dịch vụ liên kết truy cập vào file index2.php để tránh các đoạn HTML không
cần thiết.
Thư mục moudules chứa toàn bộ các file dịch vụ sẽ được thực thi. File
index.php sẽ gọi các moudle tùy theo biến action đưa vào. Nếu truy cập trực
tiếp các moudule thì sẽ bị báo lỗi.
Các thư viện được sử nằm trong thư mục lib và gồm có:
o DebugHelper là một thư viện mã nguồn mở dùng để kiểm tra các lỗi
của chương trình. Nếu có một lỗi nào đó (có thể là warning, notice..) thì DebugHelper sẽ hiển thị số dòng bị lỗi để tiện xử lý. Cơ chế hiện
thị lỗi của DebugHelper giống kiểu của Java, vì vậy giúp quét lỗi dễ dàng hơn, thuận tiện hơn. Nếu không có DebugHelper thì mỗi lần có
lỗi, php chỉ in ra dòng bị lỗi (mà không in ra quá trình sinh ra lỗi, điều này khiến việc debug trở nên khó khăn).
o MyDB.php là thư viện do chúng tôi tự viết nên, cung cấp các phương
thức truy nhập CSDL dễ dàng hơn. Chỉ cần tạo ra một đối tượng MyDB sau đó thực thi một số phương thức có sẵn. Điều này rất tiện
dụng và có hiệu quả cao hơn so với việc viết các hàm kết nối php với mysql thông thường.
~ 45 ~
$db = new MYDB($cfg['db.host'], $cfg['db.user'],
$cfg['db.passwd']);
$db->setdb($cfg['db.dbname']);
Để thực hiện một truy vấn dùng:
$db->query(“Select * from User”);
Để lấy kết quả trả về dùng các phương thức sau:
while ($row = $db->getNext()) {
//Các lệnh thực thi trên biến $row
}
o Function.php là thư viện do chúng tôi tự thiết kế nên cung cấp các
hàm giúp quá trình viết code được nhanh hơn. Các hàm được cung
cấp thuộc ba nhóm chính:
Nhóm hàm cung cấp các chức năng xử lý các biến. ví dụ như
các hàm getVar(), postVar() … giúp lấy biến. Để đảm bảo tính
bảo mật thì không nên dùng trực tiếp luôn biến từ $_POST
hay $_GET mà các biến này phải qua xử lý để lấy ra đúng dữ
liệu cần.
Nhóm hàm cung cấp các chức năng về HTML hoặc javascript.
Ví dụ như các hàm jsRedirect() dùng để chuyển trang bằng
javascript.
Nhóm hàm cung cấp các chức năng thao tác trên CSDL: Có