I) Giới thiệu về Twilio
Twilio là dịch vụ cho phép bạn xây dựng ứng dụng liên quan đến việc gửi và nhận các tin nhắn và cuộc gọi trên điện thoại. Trong bài viết này, mình sẽ tạo ra một ứng dụng trả lời điện thoại tự động đơn giản với Twilio.
Để bắt đầu, chúng ta cần đăng ký một tài khoản trên trang chủ Twilio.
Sau khi đăng ký được tài khoản, bạn có thể đăng ký số điện thoại cho ứng dụng của mình. Vời tài khoản dùng thử miễn phỉ, bạn chỉ được sử dụng một số điện thoại. Nếu muốn sử dụng nhiều hơn bạn phải chọn những số điện thoại đang thuộc dạng thử nghiệm(beta). (Tại thời điểm bài viết, Twilio chưa cung cấp số điện thoại tại Việt Nam)
Vào màn hình quản lý số điện thoại, sẽ hiện ra danh sách các số điện thoại mà tài khoản bạn đang sở hữu:
Click vào số điện thoại, sẽ hiện ra bảng cấu hình dành cho số điện thoại đó. Bảng cấu hình gồm hai phần chính: phần dành cho gọi điện(Voice) và nhắn tin (Messaging). Mỗi phần đếu có thể chọn ba kiểu cấu hình: URL, TwiMLApp, hoặc SIP Trunking.
Trong bài viết lần này, chúng ta sẽ sử dụng cấu hình bằng URL. Để cấu hình bằng URL, có ba thông tin chính cần cung cấp:
Request URL: Mỗi lần có một cuộc gọi hay tin nhắn đến số điện thoại mà bạn đang cấu hình, Twilio sẽ rửi request đến đường dẫn này.
Fallback URL: Nếu thất bại trong việc gửi request đến URL ở trên, Twilio sẽ gửi request đến đường dẫn này.
**Status Callback URL: **Khi kết thúc một cuộc gọi đến số điện thoại bạn đang cấu hình, Twilio sẽ gửi request đến đường dẫn này.
Chúng ta có thể lựa chọn phương thức gửi request là POST hay GET.
Để tương tác với request mà Twilo gửi đến, chúng ta cần trả về một response mang định dạng XML, với các lệnh chỉ dẫn đặc trưng của Twilo, được gọi là TwiML. Dựa trên đó, Twilio sẽ xử lý để đưa ra các câu trả lời tự động tương tác với người gọi.
Hướng dẫn chi tiết về TwiML có thể tham khảo tại: https://www.twilio.com/docs/api/twiml
II) Tạo một ứng dụng trả lời điện thoại tự động
Phần này, chúng ta sẽ thử tạo một ứng dụng trả lời điện thoại tự động. Chúng ta có thể sử dụng bất kì ngôn ngữ gì, miễn là trả về định dạng theo TwiML. Tại bài viết này, mình sẽ sử dụng PHP với framework là FuelPHP.
Bước 1: Định nghĩa “twilio/sdk” trong file composer.json, rồi chạy lệnh composer install
Bước 2: Viết Controller để nhận request từ Twilio và trả về TwiML, Nhập url đến controller đó vào **Request URL **trong phần cấu hình số điện thoại trên Twilio.
Ví dụ chúng ta viết một đoạn lệnh để trả về lời chào cũng như hỏi người dùng nhập số tuổi của mình:
play("assets/welcome.mp3"); $gather = $twiml_res->gather(array('finishOnKey' => '#', 'timeout' => 15)); $gather->say("How old are you?", array('language' => "en-GB")); $this->response->body($twiml_res); $this->response->set_header('Content-Type', 'application/xml'); return $this->response; } } Có hai lựa chọn để đưa ra câu trả lời tự động cho người dùng. Lựa chọn thứ nhất là câu lệnh **play: **cho phép Twilio bật lại một file âm thanh mà chúng ta đã ghi âm từ trước (trong ví dụ là file welcome.mp3). Lựa chọn thứ hai là câu lệnh **say**, sử dụng phần mềm phát âm tự động của Twilio. Để thu thập câu trả lời của người dùng, chúng ta dùng câu lệnh **gather. **Ở ví dụ trên, người dùng có thể kết thúc việc nhập bằng cách ấn vào dấu chữ #(finishOnKey) hoặc đợi hết 15 giây (timeout). Chi tiết về việc tạo ra TwiML từ php, mọi người tham khảo có thể tham khảo ở đây: [http://twilio-php.readthedocs.org/en/latest/index.html](http://twilio-php.readthedocs.org/en/latest/index.html) **Bước 3:** Sau khi người dùng nhập câu trả lời, Twilio sẽ tiếp tục gửi thêm một request đến dường dẫn của controller phía trên. Câu trả lời của người dùng ứng với yêu cầu gather có thể lấy ra từ tham số “Digits” của request. Ngoài ra để phân biệt giữa các cuộc gọi với nhau bạn có thể sử dụng tham số “CallSid”, để lấy số điện thoại người dùng bạn có thể sử dụng tham số “From” trong request. Chi tiết hơn về những tham số mà Twilio gửi trong mỗi lần request, mọi người có thể tham khảo ở link sau: [https://www.twilio.com/docs/api/twiml/twilio_request](https://www.twilio.com/docs/api/twiml/twilio_request) Chúng ta sửa lại Controller đã tạo ra từ bước 2: call_id = $call_id; $call_record->status = 0; $call_record->customer_tel = \Input::post("From", null); $call_record->save(); $twiml_res->play("assets/welcome.mp3"); $gather = $twiml_res->gather(array('finishOnKey' => '#', 'timeout' => 15)); $gather->say("How old are you?", array('language' => "en-GB")); $this->response->body($twiml_res); $this->response->set_header('Content-Type', 'application/xml'); } else { if ($call_record == 0) { $input_digit = \Input::post("Digits", 0); $call_record->age = $input_digit; $call_record->status = 1; $call_record->save(); $twiml_res->say("Thank you!", array('language' => "en-GB")); $this->response->body($twiml_res); $this->response->set_header('Content-Type', 'application/xml'); } } return $this->response; } } Trình tự thực hiện ở ví dụ trên: Lấy ID độc nhất của cuộc gọi từ request mà Twilio gửi đến -> Kiểm tra ID đó có tồn tại trong CSDL không, chia ra làm hai trường hợp: Nếu không có thông tin ID trong CSDL chứng tỏ đây là request đầu tiên mà Twilio gửi đến liên quan đến cuộc gọi này -> Lưu trữ thông tin cuộc gọi vào CSDL -> Trả về response dạng TwiML để Twilo bật đoạn ghi âm câu chào và phát âm câu hỏi về tuổi người dùng Nếu có thông tin ID trong CSDL -> Kiểm tra status của nó -> Nếu status bằng 0, chứng tỏ là đây là request thứ hai của cuộc gọi mà Twilio gửi đến, trong đó có thông tin tuổi của người dùng -> Lưu thông tin vào bản ghi liên quan đến cuộc gọi -> Trả về response dạng TwiML để cám ơn người dùng. **Bước 4: **Viết một controller để nhận request kết thúc cuộc gọi từ Twilio gửi đến. Nhập url đến controller đó vào **Status Callback URL**** **trong phần cấu hình số điện thoại trên Twilio. status == 1) { $age_record = \Model_Age::create($call_record); $age_record->save(); } $call_record->delete(); \DB::commit_transaction(MASTER); return; } catch (\Exception $e) { \Log::error("Exception occured. Message : ".$e->getMessage()); \DB::rollback_transaction(MASTER); return; } } } Trình tự thực hiện ở ví dụ trên: Lấy ID độc nhất của cuộc gọi từ request mà Twilio gửi đến -> Kiểm tra ID đó có tồn tại trong CSDL không -> Nếu có tồn tại, kiểm tra xem status có bằng 1 hay không -> Nếu status bằng 1, chứng tỏ thông tin về tuổi người dùng đã lấy được -> Chuyển bản ghi sang bảng lưu trữ các thông tin cuộc gọi đã hoàn thành. Qua các bước trên, chúng ta đã có một ứng dụng vô cùng đơn giản cho phép trả lời tự động và lưu lại thông tin của người gọi điện. Qua các link tham khảo, mọi người có thể tự tìm hiểu và xây dựng những ứng dụng phức tạp hơn.