العلامة النجمية + AMI + Python

بصراحة ، فكرت لفترة طويلة ما إذا كنت ستنشر هذه المواد. بالنسبة لأولئك الذين يعرفون كيفية العمل مع AMI Asterisk ، لا يوجد شيء مثير للاهتمام هنا. بالنسبة لأولئك الذين بدأوا للتو في فعل شيء ما ، من غير المحتمل أن يفهموا رمزي (على الرغم من أنني حاولت الكتابة بوضوح). أعلق تعليقات مثل: "لماذا تستخدم هبر لملاحظاتك؟". من ناحية أخرى ، يمكن أن يكون النص الموضح تحت القطع نقطة البداية لشخص ما. لا يقوم البرنامج النصي بأي شيء سوى أنه يرسل جميع الأحداث من AMI إلى وحدة التحكم ويمكنه تصفيتها. على سبيل المثال ، أعرض في وحدة التحكم جميع المكالمات التي تقع في أي من سياقات "zadarma-in" أو "sibseti_in". إذا كنت مهتما ، أسأل تحت القطع:

كانت هناك مهمة في الوقت الفعلي للنظر في أي من المكالمات التي وردت من المكالمة ، والأزرار في ivr التي ضغط عليها المستخدم ، والذي رد على المكالمة ، إلخ. لفترة طويلة كنت أرغب في محاولة العمل مع AMI من Python ، قبل ذلك كان لدي خبرة صغيرة من Bash ثم تنظيم مكالمة مرة أخرى.

بعد البحث عن العديد من المكتبات الجاهزة ، أدركت بسرعة أنه لا توجد واحدة منها تناسبني. ونتيجة لذلك ، تم اختراع "دراجته" الخاصة على شكل نص يرسل جميع المعلومات من AMI إلى json. يتم استخدام مكتبات Python القياسية. زائد هو أنه في هذا النموذج من السهل تلقي وتحليل أي أحداث وعدم فقدان الرابط لمكالمة معينة.

يطبع النص الأول فقط تلك الأحداث التي تقع في أي من سياقات "zadarma in" أو "sibseti_in".

البرنامج النصي№1
import telnetlib import json import re ## HOST = "192.168.10.10" PORT = "5038" user = "zabbix" password = "password" ## tn = telnetlib.Telnet(HOST,PORT) tn.write("Action: login".encode('ascii') + b"\n") username = "Username: " + user tn.write(username.encode('ascii') + b"\n") passWord = "Secret: " + password string_NOW = '' string_out = '' cd = 0 tn.write(passWord.encode('ascii') + b"\n\n") def telnet_for_string(string): global string_out string_out_def = '' for mes in string: try: if string[mes]['Context'] == 'zadarma-in' or string[mes]['Context'] == 'sibseti_in' or string[mes]['Context'] == 'IVR': Uniqueid = string[mes]['Uniqueid'] CallerIDNum = string[mes]['CallerIDNum'] Exten = string[mes]['Exten'] CallerIDName = string[mes]['CallerIDName'] try: Digit = string[mes]['Digit'] except KeyError: Digit = '' # if Exten == 's' or Exten == 'h': # Exten = '' # Context = string[mes]['Context'] string_out_def = json.dumps({'Uniqueid': Uniqueid, 'CallerIDNum':CallerIDNum, 'CallerIDName':CallerIDName, 'Exten':Exten, 'Digit':Digit}) # print(string_out_def) except UnboundLocalError: 1+1 except KeyError: 1+1 # print(string_out_def) if string_out_def: if string_out_def != string_out: print(string_out_def) string_out = string_out_def while True: string = '' event_string = '' elements_string = '' c = 0 read_some = tn.read_some() #    AMI string = read_some.decode('utf8', 'replace').replace('\r\n', '#') #        # # print(string) #       if not string.endswith('##'): string_NOW = string_NOW + string # print('1 --->',string_NOW) #   ,      #  ,          $, #       #, -      if string.endswith('##'): string_NOW = string_NOW + string string_NOW = string_NOW.replace('##', '$') #      $ string_NOW = string_NOW.replace('\n', '#') #    # string_NOW = string_NOW.replace('\r', '#') #    # string_NOW = string_NOW.replace('"', '') #   string_NOW = string_NOW.replace('\\', '') #    # print('string_NOW -->',string_NOW) # print() #      ..         events = re.findall(r'[AZ][\w]+:\s[^$]+', string_NOW) for event in events: c+=1 # print('event ---> ',event) event_elements = re.findall(r'[AZ][\w]+:\s[^#]+', event) #       for element in event_elements: element = '\"' + element.replace(': ', '\": "') + '\", '#    # print('element', element) elements_string = elements_string + element #   ,   # event_string = event_string + '\"' + elements_string.split(':')[1].split(',')[0].replace('"','') + '\": ' + '{' + elements_string + '}' # print(elements_string) # print(str(elements_string.split(':')[1].split(',')[0])) #      json: event_string = event_string + '\"' + str(c) + '\": ' + '{' + elements_string + '}' event_string = event_string.replace('}{', '},{') #     event_string = event_string.replace(', }', '}, ') # event_string = '{' + event_string + '}' event_string = event_string.replace('}, }', '}}') #     json,       json,      # json,         . try: parsed_string = json.loads(event_string) except json.decoder.JSONDecodeError: print('#############################################', '\n\n\n') print(event_string, '\n\n\n') print(string_NOW, '\n\n\n') print('#############################################', '\n\n\n') # print(event_string) # print(parsed_string['1']) #      "telnet_for_string",       . telnet_for_string(parsed_string) string_NOW = '' #   


والنص الثاني ، الذي يكتب جميع الأحداث إلى وحدة التحكم ، بالنظر إلى كلا النصين ، يصبح من الواضح ما يجب تغييره لتحقيق النتيجة المرجوة. إذا لم يكن الأمر واضحًا تمامًا ، فأنت بحاجة إلى تحليل json "string [mes]" في الوظيفة "def telnet_for_string (string)":

البرنامج النصي رقم 2
 import telnetlib import time import json import re ## HOST = "192.168.10.10" PORT = "5038" user = "zabbix" password = "password" ## tn = telnetlib.Telnet(HOST,PORT) tn.write("Action: login".encode('ascii') + b"\n") username = "Username: " + user tn.write(username.encode('ascii') + b"\n") passWord = "Secret: " + password string_NOW = '' string_out = '' tn.write(passWord.encode('ascii') + b"\n\n") def telnet_for_string(string): for mes in string: print(string[mes]) while True: # time.sleep(0.1) string = '' event_string = '' elements_string = '' c = 0 read_some = tn.read_some() string = read_some.decode('utf8', 'replace').replace('\r\n', '#') # print(string) if not string.endswith('##'): string_NOW = string_NOW + string if string.endswith('##'): string_NOW = string_NOW + string string_NOW = string_NOW.replace('##', '$') string_NOW = string_NOW.replace('\n', '#') string_NOW = string_NOW.replace('\r', '#') string_NOW = string_NOW.replace('"', '') string_NOW = string_NOW.replace('\\', '') events = re.findall(r'[AZ][\w]+:\s[^$]+', string_NOW) for event in events: c+=1 event_elements = re.findall(r'[AZ][\w]+:\s[^#]+', event) for element in event_elements: element = '\"' + element.replace(': ', '\": "') + '\", ' elements_string = elements_string + element event_string = event_string + '\"' + str(c) + '\": ' + '{' + elements_string + '}' event_string = event_string.replace('}{', '},{') event_string = event_string.replace(', }', '}, ') event_string = '{' + event_string + '}' event_string = event_string.replace('}, }', '}}') try: parsed_string = json.loads(event_string) except json.decoder.JSONDecodeError: print('#############################################', '\n\n\n') print(event_string, '\n\n\n') print(string_NOW, '\n\n\n') print('#############################################', '\n\n\n') telnet_for_string(parsed_string) string_NOW = '' 

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


All Articles