Преобразовать полезную нагрузку в PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Преобразовать полезную нагрузку в Python

Сообщение Anonymous »

Я пытаюсь проанализировать эту полезную нагрузку, используя Python, единый метод, используя, например, _.now (), замена переменных запроса работает нормально, но он сбой, когда используется цепочка метода: т.е. _.dateformat (_. Теперь () , 'Yyyy-mm-dd') или _.adddays (_. Now (), 2) .
it Следует обрабатывать несколько методов: поддерживает несколько вложенных вызовов функций, таких как {{_.dateformat (_. AddDays (_. now (), 2), 'yyyy-mm-dd')}} < /code>
рекурсивное отображение : работает над глубоко вложенными словарями и списками. {{$ req.user.name}} , {{$ req.email}}
он должен иметь возможность обрабатывать системные VAR, такие как {{_.sys_var}} < /p>
{
"Variables": "MY_VAR:MY_VALUE",
"IsActive": true,
"CreatedAt": "2025-02-19T10:52:39.7507357Z",
"Title": "test 2",
"WebhookTrigger": "",
"Id": "c1991231-08fe-4f8d-aee9-a9cddcd4f2a0",
"Requests": [
{
"Id": "1",
"Label": "Webhook Trigger",
"Url": "",
"Method": "POST",
"Headers": null,
"Payload": null,
"Children": [
{
"Id": "1",
"Label": "New Request",
"Url": "https://example.com",
"Method": "POST",
"Headers": "MY-HEADER:{{_.SYSTEM_VAR}}",
"Payload": {
"param1": "{{$req.name}}",
"param2": "{{$req.id}}",
"param3": "{{_.now()}}",
"param4": "{{$req.address.city}}",
"param5": "{{$req.address.country}}",
"param6": "{{$req.address.road.name}}",
"param7": "{{$req.address.road.post.code}}"
},
"Children": [{
"Id": "2",
"Label": "New Request",
"Url": "https://example.com",
"Method": "POST",
"Headers": "MY-HEADER:MY_VALUE",
"Payload": {
"param1": "{{$req.name}}",
"param2": "{{$req.id}}",
"param3": "{{_.now()}}",
"param5": "{{_.dateFormat(_.now(), 'YYYY-DD-MM')}}"
}
}]
}
]
}
]
}
< /code>
Вот код Python: < /p>
import re
from functools import reduce
from datetime import datetime, timedelta

def get_nested_value(data, keys):
try:
return reduce(lambda d, key: d.get(key, '') if isinstance(d, dict) else '', keys, data)
except Exception:
return ''

# Mock system variables and functions
system_vars = {
"now": lambda: datetime.now(),
"dateFormat": lambda dt, fmt: dt.strftime(fmt),
"addDays": lambda dt, days: dt + timedelta(days=int(days))
}

def evaluate_expression(expression, responses, req_vars, system_vars):
def resolve_function_call(match):
try:
func_call = match.group(0)
match_result = re.match(r"(\w+)\((.*?)\)", func_call)
if not match_result:
return ''
func_name, args_str = match_result.groups()
args = []

if args_str:
for arg in args_str.split(','):
arg = arg.strip()
if arg.startswith('_.'):
arg = evaluate_expression(arg, responses, req_vars, system_vars)
elif arg in system_vars:
arg = system_vars[arg]()
args.append(arg)

return str(system_vars[func_name](*args)) if func_name in system_vars else ''
except Exception as e:
return f"[Error: {str(e)}]"

while '(' in expression and ')' in expression:
expression = re.sub(r"(\w+)\((.*?)\)", resolve_function_call, expression)

parts = expression.split('.')
if parts[0] == '_': # System variable
return str(system_vars.get(parts[1], '')) if len(parts) > 1 else ''
elif parts[0] == '$req': # Request variable
return str(get_nested_value(req_vars, parts[1:]) or '')
else: # Response variable
try:
parent_index = int(parts[0]) - 1
response_keys = parts[2:]
return str(get_nested_value(responses[parent_index]['response'].json(), response_keys) or '')
except (IndexError, ValueError):
return ''
return ''

def replace_placeholders(value, responses, req_vars, system_vars):
def resolve(match):
expr = match.group(1).strip()
return str(evaluate_expression(expr, responses, req_vars, system_vars)) if expr else ''

if isinstance(value, str):
while '{{' in value and '}}' in value:
value = re.sub(r'\{\{(.*?)\}\}', resolve, value)
elif isinstance(value, dict):
return {k: replace_placeholders(v, responses, req_vars, system_vars) for k, v in value.items()}
elif isinstance(value, list):
return [replace_placeholders(v, responses, req_vars, system_vars) for v in value]
return value


Подробнее здесь: https://stackoverflow.com/questions/794 ... -in-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»