Permalink
Browse files

ヒストリカルレポート収集機能実装

ヒストリカルレポート収集機能実装。データベースアクセスにPDO利用。ソースコード整理。
  • Loading branch information...
rutoru committed Apr 20, 2014
1 parent e299deb commit c2e239d0a4db1ffd2c24eaec1ffe2c9ae4e00d32
Showing with 649 additions and 122 deletions.
  1. +52 −0 ActionUrl.php
  2. +31 −0 Conf.php
  3. +29 −53 Database.php
  4. +43 −14 README.md
  5. +56 −0 exit_enqueue.php
  6. +59 −0 guidance.php
  7. +85 −50 index.php
  8. +1 −0 information.xml
  9. +30 −0 operator_queue.php
  10. +51 −0 status_callback.php
  11. +94 −0 twilio_minicc_SQLs.sql
  12. +10 −5 wait.php
  13. +34 −0 webclient-twiml.php
  14. +74 −0 webclient.php
View
@@ -0,0 +1,52 @@
<?php
/**
* Action URL Class(Create Twilio Action URL)
* <Enqueue>`タグのaction URLを基本認証付きで作成
*
* @author rutoru
* @package Twilio-MiniCC
* @GitHub https://github.com/rutoru/Twilio-MiniCC
*/
class ActionUrl {
/**
* Constants for Action URL
*/
const URI = "http://";
const ID = "";
const PASS = "";
const DOMAIN = "";
const FILELOC =/hoge/“;
/**
* Object Variables
*/
private $url;
/**
* Constructor (Action URL)
*
*/
public function __construct()
{
// Create Enqueue Action URL
$this->url = self::URI.self::ID.":".self::PASS."@".self::DOMAIN.self::FILELOC;
}
/**
* Getter - Return Action URL
*
* @param String PHP File Name
* @return String Action URL
*
*/
public function getUrl($file)
{
return $this->url.$file;
}
}
View
@@ -0,0 +1,31 @@
<?php
/**
* Configuration Class
* 設定を一元管理するクラス
*
* @author rutoru
* @package Twilio-MiniCC
* @GitHub https://github.com/rutoru/Twilio-MiniCC
*/
class Conf {
/**
* Twilio Account Information
*/
// Set your Twilio API credentials here
const ACCOUNT_SID = '';
const ACCOUNT_TOKEN = '';
// Set your Twilio Application Sid here
const APP_SID = '';
/**
* Constants
*/
const DEBUG = false;
const QUEUE = "";
const METHOD = "POST";
const LANG = "ja-jp";
const MOH_LONG = "http://com.twilio.sounds.music.s3.amazonaws.com/MARKOVICHAMP-Borghestral.mp3";
const MOH_SHORT = "";
}
View
@@ -1,83 +1,59 @@
<?php
/**
* Databaseクラス
* Database Class(Create PDO Object)
* データベース接続のためのPDOオブジェクトを作成
*
* @author rutoru
* @package Twilio-MiniCC
* @GitHub https://github.com/rutoru/Twilio-MiniCC
*/
class Database {
/**
* DB接続用定数
* Constants for Enqueue Action
*/
const DBHOST = "";
const DBHOST = "localhost";
const DBNAME = "";
const DBUSER = "";
const DBPASS = "";
const DBPASS = "";
/**
* オブジェクト変数
* Object Variables
*/
private $mysqli; // mysqliオブジェクトが格納
private $pdo;
/**
* コンストラクタ(mysqliオブジェクトを作成)
* Constructor (Create POD Object)
*
*/
public function __construct()
{
$this->mysqli = new mysqli(self::DBHOST, self::DBUSER, self::DBPASS, self::DBNAME);
if ($this->mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error;
}
}
/**
* デストラクタ(DB接続クローズ)
*
*/
public function __destruct()
{
$this->mysqli->close();
}
/**
* DB接続クローズ
*
*/
public function close()
{
$this->mysqli->close();
// Create PDO Object
$this->pdo =
new PDO(
"mysql:dbname=".self::DBNAME.";host=".self::DBHOST.";charset=utf8",
self::DBUSER,
self::DBPASS,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
)
);
}
/**
* 検索結果行数取得
* Getter - Return PDO Object
*
* @return PDO Object
*
* @param string $query SQL文(SELECT)
* @return 結果行数
*/
function queryRowsMysql($query)
public function getPdo()
{
$result = $this->mysqli->query($query)->num_rows;
return $result;
return $this->pdo;
}
/**
* サニタイジング
*
* @param string $var filter_input後のサニタイジング対象文字列
* @return サイニタイジング後の文字列
*/
function sanitizeString($var)
{
// filter_inputされている前提のため、以下コメントアウト
// $var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return $this->mysqli->real_escape_string($var);
}
}
}
View
@@ -1,22 +1,42 @@
Twilio-MiniCC
======================
[Twilio](http://twilio.kddi-web.com) を使ったミニコールセンターシステムです。
Ver.2でヒストリカルレポート収集機能を実装しました。
概要
------
### 機能概要 ###
[Twilio](http://twilio.kddi-web.com) を使ったコールセンターシステムで、以下の機能を実装しています。
[Twilio](http://twilio.kddi-web.com) を使ったコールセンターシステムで、以下の機能を実装しています。Ver.2からヒストリカルレポート収集機能を実装し、プログラムの作りも大幅に変更しています。
+ 音声自動応答(IVR)
+ 音声ガイダンス
+ キューイング(待ち順番アナウンス付き)
+ ヒストリカルレポート収集(Ver.2以降)
### 電話をかけるお客様から見た動き ###
お客様がある電話番号に電話をかけると、お問い合わせは1を、最新の製品情報をお聞きになりたい場合は2を押すように求められます。1を押したら、オペレータに接続します。オペレータ不在時はキューに入ります。お客様の待ちの順番をアナウンスした後、保留音が流れます。オペレータが準備でき次第、オペレータに接続します。2を押したら、製品情報ガイダンスが流れます。1,2以外が押されたら再度入力が求められます。10秒待っても何の入力も無い場合、あるいはお客様がPB信号を送ることができない場合は、オペレータにつなぎます。
### 電話を受けるオペレータ(エージェント)から見た動き ###
オペレータは、お客様と同じ電話番号に電話します。発信者番号がDB検索され、オペレータだと判定されれば、オペレータは待ち受け用のキューに入り、お客様の電話を受けることになります。
<<<<<<< HEAD
### ヒストリカルレポート収集 ###
以下の3カ所でヒストリカルレポートを収集します。
MySQLのテーブルに格納されます。レポートの参照は、MySQLの色々なツールで可能だと思います。Ver.2では、データベース設計が十分ではありません。
+ お客様側キュー(Enqueue)から出た時 … お客様がキューから出る際の情報です。QueueResultを取得できるので、キューに入った後にお客様が電話を切った(放棄呼)の情報を取得することができます。コールセンターで放棄呼がどれだけ発生しているのかを把握することは極めて重要になります。Twilio-MiniCCでは、`exit_enqueue.php`で実装され、データは`enqueue_data`テーブルに格納されます。
+ オペレータ側キュー(Queue)から出た時 … オペレータが応答した際の情報です。`guidance.php`で実装され、データは`queue_data`テーブルに格納します。
+ 通話終了時 ... 「StatusCallback」です。StatusCallbackは通話終了後に非同期で発生するリクエストで、通話に関する情報を収集しデータベースに書き込みを行うことができます。デフォルトはオフ。Twilioの設定画面から「電話番号」をクリックした後、 「Optional Voice Settings」をクリック。表示される「Status Callback URL」に作成したプログラムを設定する必要があります。`status_callback.php` で実装され、データは`statuscallback_data`テーブルに格納されます。
=======
>>>>>>> FETCH_HEAD
### シーケンス ###
入電からキューに入るまでのシーケンスです。
[![Sequence][image]](https://www.flickr.com/photos/40853659@N06/13815287663)
[image]: https://farm3.staticflickr.com/2914/13815287663_1176bee04a.jpg "Sequence"
インストール
------
### PHPとPHP Helperライブラリのインストール ###
@@ -26,29 +46,33 @@ PHPで実装されています。PHPが必要です。Twilioからインター
MySQLでオペレータかどうかの認証を行います。MySQLのインストールを行ってください。開発バージョンは5.1を使いました。
データベース(名前任意)を作成し、ユーザ(名前任意)に権限を付与します。
テーブルを作成します。
CREATE TABLE operators (
telnum varchar(20),
PRIMARY KEY (telnum)) ENGINE InnoDB;
オペレータにしたい電話機の電話番号をINSERTしてください。
`twilio_minicc_SQLs.php`を使って、テーブルを作成します。
オペレータにしたい電話機の電話番号を、operatorsテーブルにINSERTしてください。
### Twilio-MiniCC PHPファイル/XMLファイル配置 ###
Twilio-MiniCCのPHPファイル/XMLファイルを配置します。インターネットでアクセス可能である必要があります。
+ index.php
+ Database.php
+ wait.php
+ information.xml
#### 共通クラス ####
+ `Database.php` ... DB接続でPDOオブジェクトを作成するクラスです。
+ `Conf.php` ... 共通設定をクラス定数にまとめたクラスです。
+ `ActionUrl.php` ... `<Enqueue>`タグのaction URLを基本認証付きで作成します。
#### 個別PHP/XMLファイル ####
+ `index.php` ... Twilio-MiniCCの処理の中心です。
+ `operator_queue.php` … オペレータをキューに入れます。`<Redirect>`タグにより、繰り返し電話を取ります。
+ `wait.php` … お客様がキューイング中にガイダンスを流します。
+ `guidance.php` … オペレータが応答した際に、お客様側にガイダンスを流します。また、そのときの情報を、`queue_data`テーブルに格納します。
+ `exit_enqueue.php` … お客様がキューから出る際の情報を、`enqueue_data`テーブルに格納します。キューに入った後にお客様が電話を切った(放棄呼)場合、`QueueResult``hangup`として記録されます。何もレスポンスが無いとオペレータから切断したときエラーメッセージになるため、空のTwiMLを出力します。
+ `status_callback.php` … 通話終了後に情報を、`statuscallback_data`テーブルに格納します。
+ `information.xml` … お客様に音声で情報を提供するXMLファイルです。
Database.phpの定数部分は使用環境に合わせてください(データベース名等です)。
それぞれのファイルの意味等は実際のソースコードを見てください。参照サイトも含め、コメントも出来る限り入れました。
共通クラスの定数部分は使用環境に合わせてください(データベース名等)。
### セキュリティ設定 ###
TwilioはApacheのBasic認証に対応しています。Twilio-MiniCCを設置するフォルダに、Basic認証設定することをオススメします。
### Twilio設定 ###
#### index.php ####
[Twilioにログイン](https://jp.twilio.com/login/kddi-web)し、「電話番号」をクリックします。Twilio-MiniCCを起動させたい電話番号をクリックし、「Request URL」を編集します。以下のように記載します。
http://A:B@C/D/index.php
@@ -58,6 +82,11 @@ TwilioはApacheのBasic認証に対応しています。Twilio-MiniCCを設置
+ `C`: Webサーバのドメイン名
+ `D`: Twilio-MiniCCを置いた場所
#### status_callback.php ####
同じく、「電話番号」をクリックした後、 「Optional Voice Settings」をクリック。表示される「Status Callback URL」に、index.phpと同じ書式で設置します。
http://A:B@C/D/status_callback.php
以上で終わりです。
ライセンス
View
@@ -0,0 +1,56 @@
<?php
/**
* ミニコールセンターサービスでQueue(Enqueue)から出た後にデータ収集するexit_enqueue.php
* お客様がキューから出る際の情報を`enqueue_data`テーブルに格納
*
* @author rutoru
* @package Twilio-MiniCC
* @GitHub https://github.com/rutoru/Twilio-MiniCC
*/
// DB接続クラス
require_once 'Database.php';
// 設定クラス
require_once 'Conf.php';
// Twilio Helperライブラリ(index.phpと同じ場所にServicesフォルダが存在する前提)
require_once 'Services/Twilio.php';
try{
// INSERT
$db = new Database();
$stmt = $db->getPdo()->prepare(
'INSERT INTO `enqueue_data`(`CallSid`, `From`, `To`, `CallStatus`, `ApiVersion`, `Direction`, `ForwardedFrom`, `CallerName`, `QueueResult`, `QueueSid`, `QueueTime`, `Time`)'
. ' VALUES (:CallSid,:From,:To,:CallStatus,:ApiVersion,:Direction,:ForwardedFrom,:CallerName,'
. ':QueueResult,:QueueSid,:QueueTime,NOW())');
// Standard Parameters
$stmt->bindValue(':CallSid', filter_input(INPUT_POST,'CallSid'));
$stmt->bindValue(':From', filter_input(INPUT_POST,'From'));
$stmt->bindValue(':To', filter_input(INPUT_POST,'To'));
$stmt->bindValue(':CallStatus', filter_input(INPUT_POST,'CallStatus'));
$stmt->bindValue(':ApiVersion', filter_input(INPUT_POST,'ApiVersion'));
$stmt->bindValue(':Direction', filter_input(INPUT_POST,'Direction'));
$stmt->bindValue(':ForwardedFrom', filter_input(INPUT_POST,'ForwardedFrom'));
$stmt->bindValue(':CallerName', filter_input(INPUT_POST,'CallerName'));
// Queue Parameters
$stmt->bindValue(':QueueResult', filter_input(INPUT_POST,'QueueResult'));
$stmt->bindValue(':QueueSid', filter_input(INPUT_POST,'QueueSid'));
$stmt->bindValue(':QueueTime', filter_input(INPUT_POST,'QueueTime'));
$stmt->execute();
} catch (Exception $e) {
// デバッグモード時はエラーメッセージ表示
// 運用時はデータ取得に失敗しても、オペレータに接続
if(Conf::DEBUG){
echo $e->getMessage();
}
}
// Twimlオブジェクト作成
$response = new Services_Twilio_Twiml();
// TwiML作成
// 何もレスポンスが無いとオペレータから切断したときエラーメッセージになるため
print $response;
Oops, something went wrong.

0 comments on commit c2e239d

Please sign in to comment.