This commit is contained in:
filimonov 2024-02-08 19:37:47 +07:00
parent 73d4ae393e
commit f79efa2951

View File

@ -5,7 +5,7 @@ import json
import datetime import datetime
import requests import requests
from pymongo import MongoClient from pymongo import MongoClient
import time
db_connection = MongoClient("mongodb://mongodb:Cc03Wz5XX3iI3uY3@mongo") db_connection = MongoClient("mongodb://mongodb:Cc03Wz5XX3iI3uY3@mongo")
@ -16,25 +16,19 @@ phoneNAnswer = db_base["phone-n-answer"]
phoneRecallTrue = db_base["phone-recall-true"] phoneRecallTrue = db_base["phone-recall-true"]
phoneRecallFalse = db_base["phone-recall-false"] phoneRecallFalse = db_base["phone-recall-false"]
phoneLog = db_base["phone-log"] phoneLog = db_base["phone-log"]
phoneDebug = db_base["phone-debug"]
coll_userkey = db_base['userkey'] coll_userkey = db_base['userkey']
mkt_phones = ['83912051046', '83912051045'] mkt_phones = ['83912051046', '83912051045']
IgnoreList = ['83919865589', '83912051046', '83912051045', '84950213944', '84951252791', '83919865589', IgnoreList = ['83919865589', '83912051046', '83912051045', '84950213944', '84951252791', '83919865589',
'84951183750', '89919237009', '89919241441', '89919863883', '89919505445', '89919398228', '89919500798'] '84951183750', '89919237009', '89919241441', '89919863883', '89919505445', '89919398228', '89919500798']
# Stats: # Stats:
# 0 - ответили # 0 - ответили
# 1 - не приняли # 1 - не приняли
# 2 - перезвонили успешно # 2 - перезвонили успешно
# 4 - Перезвонили неуспешно # 4 - Перезвонили неуспешно
def WriteLog(desc, data, ex = None):
try:
log = {"dt": datetime.datetime.now(),"desc": desc, "data": data, "ex":ex }
phoneLog.insert_one(log)
except Exception as e:
print("!!!", e)
def main(): def main():
@ -44,44 +38,78 @@ def main():
channel.queue_declare(queue='incoming-dev') channel.queue_declare(queue='incoming-dev')
print("RUN")
def callback(ch, method, properties, body: bytearray): def callback(ch, method, properties, body: bytearray):
try: try:
# Парсим строку # Парсим строку
srcJson = json.loads(str(body.decode('utf-8')).replace("\'", "\"")) srcJson = json.loads(str(body.decode('utf-8')).replace("\'", "\""))
srcJson["time"] = datetime.datetime.fromtimestamp( srcJson["time"] = datetime.datetime.fromtimestamp(
srcJson["time"]).strftime('%Y-%m-%d %H:%M:%S') srcJson["time"]).strftime('%Y-%m-%d %H:%M:%S')
# Определяем направление соединения # Определяем направление соединения
# Отсекаем лишние события по признаку длиины номера # Отсекаем лишние события по признаку длиины номера
if srcJson['to'] in mkt_phones and srcJson['direction'] == "incoming" and srcJson['state'] == "HANGUP" and srcJson not in IgnoreList: if srcJson['to'] in mkt_phones and srcJson['direction'] == "incoming" and srcJson['state'] == "HANGUP" and srcJson not in IgnoreList and int(srcJson['duration']) > 30:
# Формируем словарь для загрузки
upd = {
"_id": srcJson['uuid'],
"client": srcJson['from'],
"operator": srcJson['to'],
"time": srcJson['time']
}
if srcJson.get("recordUrl", False): if srcJson.get("recordUrl", False):
# Запись бывает только у принятых вызовов, поэтому сразу добавляем в базу # Запись бывает только у принятых вызовов, поэтому сразу добавляем в базу
try: try:
WriteLog("Add Phone Answer", srcJson) upd["recordUrl"] = srcJson["recordUrl"]
phoneAnswer.insert_one(srcJson) phoneAnswer.insert_one(upd)
phoneNAnswer.delete_many({"client": srcJson["from"]})
except Exception as e: except Exception as e:
WriteLog("Add Phone Answer", srcJson, e) pass
else: else:
# Добавляем запись только в том случае если ранее номер отсутствовал, # Добавляем запись только в том случае если ранее номер отсутствовал,
# В противном случае обновляем запись # В противном случае обновляем запись
try: try:
WriteLog("Add Phone Non Answer", srcJson) phoneNAnswer.update_one(filter={'client': srcJson['from']}, update={
phoneNAnswer.update_one(filter={'from': srcJson['from']}, update={'$set': srcJson}, upsert=True) '$set': upd}, upsert=True)
except Exception as e: except Exception as e:
WriteLog("Add Phone Non Answer", srcJson, e) pass
if srcJson['direction'] == "external" and srcJson['state'] == "START":
phoneNAnswer.update_one({"client": srcJson["to"]}, {"currstate": "calling"})
if srcJson['state'] == "HANGUP" and srcJson['direction'] == "external": # Парсим исходящие звонки только в том случае если продолжительность разговора более 40 секунд
if phoneNAnswer.count_documents({"from": srcJson["to"]}) > 0: if srcJson['state'] == "HANGUP" and srcJson['direction'] == "external" and int(srcJson['duration']) > 30:
phoneNAnswer.delete_one(filter = {"from": srcJson["to"]}) # Обработка запускается только в том случае если в базе пропущенных есть записи
if phoneNAnswer.count_documents({"client": srcJson["to"]}) > 0:
# Удаляем запись из списка пропушеных
phoneNAnswer.delete_many(
filter={"client": {'$regex': srcJson["to"]}})
# формируем данные для загрузки
ins = {
"_id": srcJson["uuid"],
"client": srcJson["to"],
"operator": srcJson["from"],
"time": srcJson["time"],
"currstate": srcJson["from"]
}
# Если запись разговора есть то записываем считаем что дозвонились
if srcJson.get("recordUrl", False): if srcJson.get("recordUrl", False):
phoneRecallTrue.insert_one(srcJson) ins["recordUrl"] = srcJson["recordUrl"]
phoneRecallFalse.delete_one(filter = {"to": srcJson["to"]}) try:
# Добавляем в таблицу дозвонились успешно и удаляем по маске из недозвонившихся
phoneRecallTrue.insert_one(ins)
phoneRecallFalse.delete_one(
filter={"client": {'$regex': srcJson["to"]}})
except Exception as e:
print(2, e)
else: else:
phoneRecallFalse.insert_one(srcJson) try:
except: phoneRecallFalse.insert_one(ins)
print(e.with_traceback) except:
print(2, e)
except Exception as e:
print("!!!!!!!", e)
channel.basic_consume( channel.basic_consume(
queue='incoming-dev', on_message_callback=callback, auto_ack=True) queue='incoming-dev', on_message_callback=callback, auto_ack=True)
@ -146,10 +174,10 @@ def main():
# except Exception as e: # except Exception as e:
# print(e) # print(e)
# except Exception as e: # except Exception as e:
# print(e.with_traceback) # print(e.with_traceback)
# print(e) # print(e)
# exit() # exit()
# channel.basic_consume( # channel.basic_consume(
# queue='incoming-dev', on_message_callback=callback, auto_ack=False) # queue='incoming-dev', on_message_callback=callback, auto_ack=False)