Как реализовать метод POST для API контроллера Unifi в Grafana, используя источник данных Infinity?Python

Программы на Python
Anonymous
Как реализовать метод POST для API контроллера Unifi в Grafana, используя источник данных Infinity?

Сообщение Anonymous »

Вопрос:
Я успешно реализовал метод GET API контроллера Unifi в Grafana, используя источник данных Infinity. Однако я столкнулся с трудностями при использовании метода POST.
Вот мой текущий код сервера Python Flask, который обрабатывает вход в систему и извлекает данные с помощью методов GET и POST:

Код: Выделить всё

import requests
from requests.exceptions import SSLError, RequestException

app = Flask(__name__)

# Disable SSL warnings from urllib3
requests.packages.urllib3.disable_warnings()

# Constants for API endpoints and credentials
LOGIN_URL = "https://unifi.website.com/api/login"
DEVICE_STATS_URL = "https://unifi.website.com/api/s/lp0csd81/stat/device"
STA_STATS_URL = "https://unifi.website.com/api/s/lp0csd81/stat/sta"
USERNAME = "username"
PASSWORD = "password"

def perform_login():
login_payload = {
"strict": True,
"password": PASSWORD,
"remember": True,
"username": USERNAME
}
login_headers = {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
}

try:
response = requests.post(LOGIN_URL, headers=login_headers, json=login_payload, verify=False)
response.raise_for_status()
return response.cookies.get_dict() if response.status_code == 200 else None

except (SSLError, RequestException) as err:
print(f"Error occurred: {err}")
return None

@app.route('/fetch_device_stats', methods=['GET'])
def fetch_device_stats():
cookies = perform_login()
if cookies:
csrf_token = cookies.get('csrf_token', '')
unifises = cookies.get('unifises', '')
headers = {
'Accept': 'application/json, text/plain, */*',
'X-Csrf-Token': csrf_token,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Cookie': f'csrf_token={csrf_token}; unifises={unifises}'
}

try:
response = requests.get(DEVICE_STATS_URL, headers=headers, verify=False)
response.raise_for_status()
return jsonify(response.json()) if response.status_code == 200 else f"Failed to fetch device stats. Status code: {response.status_code}"

except RequestException as err:
print(f"Error occurred: {err}")
return f"Request Exception occurred: {err}"

return "Login failed. Unable to fetch device stats."

@app.route('/fetch_sta_stats', methods=['POST'])
def fetch_sta_stats():
cookies = perform_login()
if cookies:
csrf_token = cookies.get('csrf_token', '')
unifises = cookies.get('unifises', '')
headers = {
'Accept': 'application/json, text/plain, */*',
'X-Csrf-Token': csrf_token,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Cookie': f'csrf_token={csrf_token}; unifises={unifises}'
}

try:
response = requests.post(STA_STATS_URL, headers=headers, verify=False)
response.raise_for_status()
return jsonify(response.json()) if response.status_code == 200 else f"Failed to fetch STA stats. Status code: {response.status_code}"

except RequestException as err:
print(f"Error occurred: {err}")
return f"Request Exception occurred: {err}"

return "Login failed. Unable to fetch STA stats."

if __name__ == '__main__':
app.run(debug=True)
Я дошел до того, что хочу использовать метод POST API Unifi Controller. Я увидел полезную нагрузку запроса со следующей структурой
Вот как она выглядит

Код: Выделить всё

{
"macs": ["b2:1c:b6:25:76:41"]
}
с дополнительной информацией

Код: Выделить всё

0: "b2:1c:b6:25:76:41"
Журнал ошибок источника данных Grafana Infinity
Изображение

Следует ли мне создать собственную полезную нагрузку в этом формате, чтобы использовать ее в качестве временного ряда, но на основе MAC-адресов? Как мне следует структурировать полезную нагрузку запроса и интегрировать ее с Grafana, используя источник данных Infinity, чтобы добиться этого?
Будем очень признательны за любые рекомендации или примеры!
Дополнительный контекст:
  • Я использую Grafana с источником данных Infinity. Метод GET
    просто реализовать, но метод POST вызывает проблемы.
    Я хочу визуализировать данные на основе MAC-адресов в формате временных рядов
    .
  • Gunicorn в Flask Server
Заранее благодарим за помощь!

Подробнее здесь: https://stackoverflow.com/questions/786 ... g-infinity

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