数ヶ月前、私の友人から、着信通話の録音の問題の解決を手伝ってほしいと頼まれました。 必要なものはすべて利用可能であったか、提供することが約束されていました。

興味があれば、私のPython実装の経験とcatの下のコード。
友人がコンピューター機器の技術サポートとメンテナンスを提供します。 従業員の仕事の性質は旅行です。 個別のディスパッチャはありません。すべてのコールは従業員自身が受信して保存します。 従業員が電話に出られない(外出中、クライアントとの対話で)場合、または従業員がクライアントから苦情を受け取る場合(要求されたすべてのことをしなかった、またはしなかった)があります。 このような状況は「解決」する必要があります。 一般に、彼はなんらかの方法で、ディスパッチャを雇わずにコールの受信を集中化する必要がありました。
友人と一緒に、すべてのインシデントと変更が記録され、
ITIL要件に従って管理されます。 easla.comを使用した自動プロセス。 欠けていたのは呼び出しだけでした。
挑戦する
本格的なコールセンターについては話していませんでした。 コール分析は「事後」に実行されます。 したがって、要件は簡単でした。
- データベースに通話情報を記録する(番号、日付、継続時間)
- コールステータスの記録(応答済み、未応答、通話中)
- 会話を録音します。
easla.comが提供するデータベースでは、「Call」オブジェクトとすべての必要な属性がすでに作成されています。 ステータスのみがネゴシエートされます。 彼らは、電話口座でお金がなくなった場合に備えて、「不可能」というステータスを追加しました。
解決策
まず第一に、彼らはあなたがまだ都市番号を取得し、着信通話を処理するためにアスタリスクサーバーをアップグレードすることにお金を費やす必要があることに同意しました。 ローカルIPテレフォニープロバイダーから番号を購入し、アスタリスクサーバーを既存のハードウェアを使用して別の仮想サーバーにアップロードしました。 アスタリスクでは、サーバーはセルラーアシスタントへのすべての着信の転送を構成したため、ディスパッチャーになりました。
TwistedをFastAGIサーバーとして使用することが決定されました。これは、完全な呼び出しに関する情報を受信し、SOAPを介してeasla.comに情報を送信します。 すべての手順は
、システム
管理者のマニュアルに記載され
ています 。
会話は
MixMonitorコマンドを使用して記録され、ファイル名として$ {UNIQUEID}変数を使用します。
会話の最後に、会話を停止し、制御をFastAGIサーバーに転送します。
exten => h,1,StopMixMonitor
exten => h,n,AGI(agi://127.0.0.1:4573)
FastAGIは
starpyライブラリを使用してプロトコルを実装しました。 コールの継続時間に関する情報は、CDRレコードを通じて取得されます。 必要な情報をすべて個別のストリームで受信した後、easla.comに書き込みます。
通話情報を取得する def fastAgiMain( agi ): sequence = fastagi.InSequence()
アスタリスクがコール制御を返した後、wavをmp3に変換し、easla.comに情報を送信し始めることができます。 ここでは、多くのマニュアルで提案されているように、変換にMixMonitorを使用しない理由を説明する必要があります。 MixMonitorはサードパーティのアプリケーションを個別のプロセスとして起動し、アプリケーションが完了したことをFastAGIに通知しません。また、呼び出し情報が送信されるまでにmp3ファイルにアクセスできなくなる可能性があります。 変換には、
pydubライブラリが
使用され、SOAPクライアントとして
泡立ちます。
送ります def sendCallInfo(callid, callduration, wav_file ,status): raw_params = { 'incoming_call_number': callid, 'incoming_call_time': callduration,} if status: if status == 'ANSWER': raw_params['status'] = 'incoming_call_answered' if status == 'BUSY': raw_params['status'] = 'incoming_call_busy' if status == 'NOANSWER': raw_params['status'] = 'incoming_call_unanswered' if status == 'CANCEL': raw_params['status'] = 'incoming_call_unanswered' if status == 'CONGESTION': raw_params['status'] = 'incoming_call_congestion' url = 'http://easla.com/user/soap' client = Client(url) client.service.login('login','password') call_management_proc = client.service.getProcess('call_management') incoming_call_def = client.service.getObjectdef(call_management_proc, 'incoming_call', 0) keyval_array = client.factory.create('KeyValuesPairSoapArray')
モジュールは、運用の最初の週に実行できました。 最初は、口座に十分な資金がなかったため、ステータスが「Impossible」のコールの登録を確認しました。 その後、アカウントを補充し、他のステータスのコールの登録を確認しました。
着信呼び出しのレジストリは次のようになります。

コール登録の開始後、登録されたコールの加入者を決定し、登録されたコールに基づいてインシデントを作成する機能を追加できました。
そのような解決策が誰かに役立つなら、私はうれしいです。