データベースを使用せずにアスタリスクで電話番号によって地域を決定する



全国で営業している多くの企業にとって、たとえば、関心のある地域でのマーケティングキャンペーンの効果を評価するために、各着信コールがどの地域から来たかを知ることは非常に重要です。 もちろん、コールセンターのオペレーターに毎回この情報を発信者に確認させることができますが、この情報を自動的に取得する方が便利です。
さらに、発信呼び出しを行うとき、クライアントが位置する地域の番号から呼び出すことが重要です。 もちろん、発信ルートを作成することはできますが、地域の数が3を超えると、モバイル番号を考慮しても、デザインは巨大です。

もちろん、このようなタスクの実装には、データベースを使用できます。また、MySQLを使用した実装に関する記事もハブにありますが、データベースの使用が不適切または不可能な場合があります。 したがって、データベースを使用せずに必要な機能を簡単に実装する例、すなわち、アスタリスク用の簡単なスクリプトと小さなダイヤルプランを以下に示します。この情報を活用して、興味のある情報を取得します。

www.rossvyaz.ru/activity/num_resurs/registerNumには、公式の更新された「ロシアのシステムおよび番号計画のレジストリからの抽出」が4つのボリュームで、コードの最初の数字で3、4、8、9あります。 csvをフォーマットし、それらを結合し、不要な空のフィールドを削除し、エンコードをUTF-8に変更し、すべてのスペースを「_」に置き換えます。これにより、後でbashスクリプトで作業しやすくなります。

ファイルは次のとおりです。

プレフィックス! 開始番号! 最終番号! 誰のものですか! 登録されている場所

999!9440000!9449999!"_""_"""!_
999!9450000!9459999!"_""_"""!_
999!9460000!9469999!"_""_"""!_
999!9470000!9479999!"_""_"""!_
999!9480000!9489999!"_""_"""!_
999!9490000!9499999!"_"""""!__//


それではbashスクリプトを書きましょう。 最初に、3桁のコードを使用して行を選択します。これは、毎回ファイル全体が非常に長い時間ループを実行するためです。 私のテストでは、1回の実行は4秒続き、現在のバージョンはすぐにではありませんがはるかに高速です

 #!/bin/bash #  DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #    FILE=9.csv #  NUM=$1 # ,    10-  PREF=${NUM:0:3} # MID=${NUM:3:11} #   lines="$( cat $DIR/$FILE | grep ^$PREF )" #        .   #      ,        ,         for str in $lines; #    do start=$( echo $str | cut -d '!' -f2 ) #      stop=$( echo $str | cut -d '!' -f3 ) if [ "$MID" -le "$stop" ]&&[ "$MID" -ge "$start" ] #      then reg=$( echo $str | cut -d '!' -f5 ) #   break #   fi done echo -n $reg #    exit 0 


エコー呼び出しの-nオプションに注意してください。 それがなければ、リージョンの名前に加えて、スクリプトの実行結果に改行が含まれることになりますが、これはまったく役に立ちません。

次に、スクリプトに実行の許可を与える必要があります
 chmod +x region.sh 


また、アスタリスクを実行するユーザーにスクリプトとデータファイルへのアクセス権を付与することを忘れないでください。

 chown asterisk:asterisk -R /path-to-script 


確認するには、コンソールから番号を指定してスクリプトを実行し、スクリプトが機能していることを確認します。

アスタリスクでの作業を続けています。 通常、スクリプトの実行に使用されるシステムアプリケーションは、私たちには適していません。実行ステータスではなく、スクリプトの結果が必要です。

したがって、SHELL関数を使用します。

 exten => 9999,n,Noop(${CALLERID(num)}) exten => 9999,n,Set(num=${CALLERID(num):1}) ;    11-,      exten => 9999,n,Set(__reg=${SHELL(/home/asterisk/region.sh ${num} )}) exten => 9999,n,Noop(${reg}) 


Gotoによる呼び出しを他のコンテキストおよびマクロに転送するときに継承されるように、先頭に2文字の「__」を持つ変数を割り当てることに注意してください。

呼び出し時のコンソールには、それぞれが表示されます

 Executing [9999@region] NoOp("SIP/123-00000026", "79063454647") in new stack -- Executing [9999@region] Set("SIP/123-00000026", "num=9063454647") in new stack -- Executing [9999@region] Set("SIP/123-00000026", "reg=_.") in new stack -- Executing [9999@region] NoOp("SIP/123-00000026", "_.") in new stack 


同様の方法で、各番号の通信オペレーターの名前を取得できます。スクリプトのフィールドのみを番号5でなく、番号4で受信する必要があります。
  reg=$( echo $str | cut -d '!' -f4 ) 


もちろん、スクリプト自体の実行がかなり長いため、負荷の高いシステムでこのようなソリューションを使用することはお勧めしませんが、場合によっては非常に便利です。

記事の著者: Centos-admin.ruシステム管理者-Alexey Dmitriev。

Source: https://habr.com/ru/post/J307478/


All Articles