Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
La Kiến Vinh Thao tác với Skype bằng giao diện đồ họa mặc dù khá dễ dùng, nhưng đôi lúc cần xử lý một số tác vụ tự động và liên quan đến nhiều users hơn như gửi cùng một tin cho nhiều người lại gây khó dễ và mất thời gian, ta có thể lập trình để mọi thứ tự động hóa dễ dàng hơn. Bản thân Skype có hỗ trợ điều này, đó là Skype4COM.dll.

Giới thiệu

Có những nhu cầu như gửi cùng 1 tin nhắn cho nhiều người trong Skype, hoặc tự động trả lời tin theo một tiêu chuẩn khi chúng ta không có mặt sử dụng Skype, hoặc lưu lại lịch sử chat để dễ dàng gửi đi, và điều này bản thân Skype chưa hỗ trợ. Nhưng Skype cho chúng ta 1 khả năng để có thể mở rộng một số tiện ích đó. Ngoài ra từ đó ta có thể thiết kế thêm 1 số như: tự động trả lời khách hàng, đăng tin tự động, và điển hình hơn là ta thấy được một số loại spam-bot quảng cáo đang xuất hiện trong khoảng thời gian gần đây trên Skype.

Trong bài viết này, tôi sẽ giới thiệu và cách lập trình với vài tính năng mà tôi đang dùng

  • Gửi yêu cầu cho các thành viên hàng loạt.
  • Tự động trả lời khi tôi vắng.
  • Tự động sao lưu cuộc trò chuyện lại khi chat với khách hàng.

Tiền đề bài viết

Với nhu cầu phân công việc cho các thành viên, tôi thường mất nhiều thời gian để copy tin nhắn cho nhiều người với cùng nội dung (chỉ thay đổi tên và một số thông tin), và tôi phải tìm một phương pháp gọn hơn, tôi nghĩ đến việc viết plug-in cho Skype của mình. Nay tôi chia sẻ lại để ai có cùng mục tiêu có thể sử dụng giải pháp này.

Đối tượng hướng đến

Trong bài viết này, tôi muốn biến nó trở thành một sản phẩm cho người sử dụng cuối, tuy nhiên có rất nhiều đặc tả cho mỗi người với mục đích sử dụng khác nhau rất nhiều, do đó, tôi chỉ có thể hướng đến đối tượng lập trình viên C#.NET, hy vọng các bạn có thể cùng tôi hỗ trợ được thêm nhiều ứng dụng cho từng người sử dụng cuối.

Ngoài ra, nếu bạn là giới văn phòng (người dùng cuối), bạn cũng đang đi tìm giải pháp cho công việc mình mà có liên quan đến tự động hóa trong Skype, hãy liên hệ với tôi, tôi có thể giúp bạn bằng một giá cực mềm cỡ một tách trà chiều.

Skype4COM

Skype4COM hay Skype4COM.dll được cài đặt sẵn cùng lúc khi bạn cài đặt Skype trên PC, nó được lưu mặc định theo đường dẫn sau (sau khi cài đặt Skype)

  • 32bit - C:\Program Files (x86)\Common Files\Skype
  • 64bit - C:\Program Files\Common Files\Skype

Hiện thực các tính năng

Tính năng cần hiện thực

  • Tạo đối tượng Skype và kết nối với ứng dụng Skype - Connect To Skype.
  • Gửi tin nhắn đến một người, một nhóm người - Send Message.
  • Nhận tin nhắn do người dùng gửi đến, trả lời tin nhắn - Auto Reply.
  • Lưu trữ toàn bộ tin nhắn - Save Message.

Môi trường

  • Project được tạo với Visual Studio 2015 Community. C#.NET.
  • Cần thiết Skype4COM.dll, được Skype đặt trong thư mục như trên.
  • Máy phải có cài đặt và đăng nhập Skype dành cho việc thử nghiệm.

Chuẩn bị cho project

Tạo project C#

Trong trường hợp của tôi là Windows Form Application và tạo giao diện cơ bản như bên dưới.

ss_1

Add Reference... Skype4COM.dll

  • Nếu là Skype 32bit thì bạn cần dùng C:\Program Files (x86)\Common Files\Skype\Skype4COM.dll
  • Nếu là Skype 64bit thì bạn cần dùng C:\Program Files\Common Files\Skype\Skype4COM.dll

Hoặc bạn có thể tự tìm kiếm xem Skype đặt file đó ở đâu, trong trường hợp cập nhật bài viết ở lần gần nhất tôi nhận thấy nó đã được cập nhật lại tại đường dẫn sau: C:\Program Files (x86)\Common Files\Skype\Skype4COM.dll qua 1 độc giả giấu tên đã gợi ý về sự thay đổi này.

Lưu ý rằng tại thời điểm gần nhất cập nhật bài viết này thì Skype đặt Skype4COM.dll theo các đường dẫn trên, tương lai khi Skype phát triển các phiên bản mới, các thay đổi có thể sẽ xảy ra như họ sửa tên thư viện, đặt lại Skype4COM.dll tại thư mục khác hoặc hủy bỏ cả các thư viện này. Khi đó, bạn cần tìm hiểu thêm tại trang chính thức của Skype.

Cách tạo project C# Windows Form Application và cách Add Reference... - đọc thêm bài Add Reference Trong C# (Visual Studio) để có thêm chi tiết.

Trong trường hợp của tôi, và khá là thông thường, chúng ta dùng Skype4COM.dll 32bit.

Phần codes

Để sử dụng các đối tượng, phương thức giao tiếp với Skype bạn cần sử dụng namespace trong Skype4COM.dll. Bạn thêm dòng khai báo sau vào những nơi bạn cần dùng.

using SKYPE4COMLib;

Hiện thực các tính năng

Tạo đối tượng Skype và kết nối với ứng dụng Skype - Connect To Skype

Ta có button Connect To Skype và ta sẽ sử dụng button này để khởi tạo và kết nối đến Skype.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using SKYPE4COMLib;

namespace StdioSkype
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private Skype m_skype;

        private void btnConnectToSkype_Click(object sender, EventArgs e)
        {
            m_skype = new Skype();
            m_skype.Attach(7, false);
        }
    }
}
  • Dòng 22: Thêm 1 thuộc tính Skype m_skype.
  • Dòng 23 - 27: Xử lý sự kiện click vào button Conntect To Skype bằng cách khởi tạo đối tượng Skype và sau đó tương tác vào port của ứng dụng Skype (port số 7).

 Build thử chương trình, và nhấn vào button Connect To Skype, phía bên Skype sẽ phát hiện và hỏi người sử dụng có cho phép ứng dụng của chúng ta nhúng vào Skype hay không, nếu bạn muốn (trong trường hợp này là muốn) thì ta nhấn vào nút Allow access trong ứng dụng Skype.

ss_2

Gửi tin nhắn đến một người, một nhóm người - Send Message

Trong đối tượng m_skype có phương thức SendMessage nhằm gửi tin nhắn đến một SkypeId cụ thể.

ChatMessage SendMessage(string Username, string Text);

Tham số UsernameSkypeId của người mà ta muốn gửi, tham số Text là nội dung cần gửi. Lưu ý, với Username được kế thừa từ Windows Live sẽ có dạng live:username thì ta bắt buộc phải ghi đúng như vậy, thay vì chỉ ghi username.

Giả sử button Send Message ta thêm phần xử lý sự kiện khi click là gửi tin đến nhiều người, ta sẽ code như sau

private void btnSendMessage_Click(object sender, EventArgs e)
{
    string[] users = new string[] { "kevinla.trainer",
                                    "developer.stdio",
                                    "live:ryenguyen7411",
                                    "live:nguyennghia1995",
                                    "live:khoinguyen1312" };

    for (int i = 0; i < users.Length; i++)
    {
        m_skype.SendMessage(users[i], "Hello, the message is sent from STDIO BOT!");
    }
}

Build lại project > "Connect To Skype" > "Send Message" để thử nghiệm. Tôi không muốn spam bạn bè mình, nên tôi không có screenshot trong trường hợp này, và các bạn cũng không nên lạm dụng điều này, nếu không muốn bạn bè cho bạn vào Block-List.

Nhận tin nhắn do người dùng gửi đến, trả lời tin nhắn - Auto Reply

Nhấn vào button Auto Reply (phải chắc chắn rằng trước đó bạn đã "Connect To Skype". Chương trình sẽ tiến hành lắng nghe các "động tĩnh" từ Skype và khi có sự kiện tin nhắn đến, nó sẽ tiến hành gửi phản hồi cho người gửi tin nhắn.

Code cho phần đăng ký sự kiện sau khi click vào button Auto Reply

private void btnAutoReply_Click(object sender, EventArgs e)
{
    m_skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(ProcessSkypeIncomingMessage);
}

Viết thêm phương thức ProcessSkypeIncomingMesseage, phương thức này sẽ tự động được gọi khi Skype nhận được tin nhắn (bao gồm tin do bạn gửi đi hoặc tin do bạn bè gửi lại).

private void ProcessSkypeIncomingMessage(ChatMessage msg, TChatMessageStatus status)
{
    if (msg.Body != null && status == TChatMessageStatus.cmsReceived)
    {
        string message = "Hello, I am Kevin La, I am busy now. ";
        message += "Leaving a message and I will response ASAP.";

        m_skype.SendMessage(msg.Sender.Handle, message + "\n. You just say: " + msg.Body);
    }
}
  • Dòng 3: kiểm tra xem trạng thái tin nhắn đã nhận xong chưa "TChatMessageStatus status" và kiểm tra xem thông tin người gửi đến có nội dung không "msg.Body != null"
  • Dòng 7: Nếu mọi thứ đã ổn (thỏa dòng 3), ta tiến hành gửi tin nhắn đến cho đối phương, SkypeId của đối phương được lưu trong đối tượng msg là msg.Sender.Handle. Ngoài ra, msg.Body chính là nội dung tin nhắn mà đối phương đã gửi cho chúng ta, bạn có thể sử dụng tin nhắn này, để phân tích ngữ nghĩa để tìm phương án trả lời phù hợp.

Sau khi code thêm đoạn trên, bạn tiến hành Build lại project > "Connect To Skype" > "Auto Reply" và chờ bạn bè gửi tin nhắn đến và xem kết quả.

ss_3

Lưu ý: nếu đối phương sử dụng các SkypeId không thuần Skype mà thông qua tài khoản Windows Live hoặc Facebook thì có thể sẽ có trục trặc xảy ra trong việc nhận tin nhắn (tức là có thể Skype4COM sẽ không nhận được thông điệp này).

Lưu trữ toàn bộ tin nhắn - Save Message

Việc lưu trữ tin nhắn khá đơn giản, ta chỉ việc lưu trữ toàn bộ tin nhắn.

Thêm một thuộc tính là private string m_history = ""; để lưu trữ tin nhắn. Thêm code vào hàm ProcessSkypeIncomingMesseage để tiến hành lưu trữ khi có tin nhắn đến hoặc đi.

Cấu trúc lưu trữ cho 1 tin nhắn bạn có thể tự định nghĩa, trong trường hợp tôi dùng cấu trúc như sau:

  • Tin nhắn gửi từ chúng ta đến bạn: [ME]->[Friend_SkypeId]->[Message]
  • Tin nhằn gửi từ bạn đến chúng ta: [Friend_SkypeId]->[ME]->[Message]

Tương tự như chức năng Auto Reply, ta cần đăng ký xử lý sự kiện lắng nghe các thông điệp đang gửi vào Skype. Khi click vào button Save Message ta sẽ đăng ký hàm xử lý này.

private void btnSaveMessasge_Click(object sender, EventArgs e)
{
    m_skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(ProcessSkypeRecordMessage);
}

Viết hàm xử lý này, chủ yếu hàm này sẽ làm nhiệm vụ lưu trữ các tin nhắn bao gồm tin đến và tin đi như cấu trúc phía trên.

private void ProcessSkypeRecordMessage(ChatMessage msg, TChatMessageStatus status)
{
    // FOR RECORDING MESSAGE
    if (msg.Body != null && status == TChatMessageStatus.cmsReceived)
    {
        m_history += "[" + msg.Sender.Handle + "]->" + "[ME]->" + "[" + msg.Body + "]\n";
    }
    if (msg.Body != null && status == TChatMessageStatus.cmsSent)
    {
        m_history += "[ME]->" + "[" + msg.Chat.Adder.Handle + "]->" + "[" + msg.Body + "]\n";
    }
}

Lúc này, bộ nhớ đã lưu trữ được các thông điệp ta gửi và nhận thông qua m_history. Ta có thể thiết kế thêm tính năng lưu trữ vào file nếu cần thiết.

  • TChatMessageStatus.cmsReceived nhận dạng tin được gửi đến và TChatMessageStatus.cmsSent nhận dạng cho việc tin gửi đi.
  • msg.Sender.Handle là SkypeId của người gửi đi. và msg.Chat.Adder.Handle lưu SkypeId của người nhận.

Download chương trình hoàn chỉnh

STDIOSkype_VS2015.zip

Nếu project có yêu cầu cần Add Reference... dll, bạn có thể làm lại bước Add Reference... và chỉ đến Skype4COM.dll như trên.

THẢO LUẬN
ĐÓNG