Проблема с публикацией данных в API CMA Fuelfinder Великобритании [закрыто]Python

Программы на Python
Ответить
Anonymous
 Проблема с публикацией данных в API CMA Fuelfinder Великобритании [закрыто]

Сообщение Anonymous »

Правительство Великобритании запустило схему Fuel Finder, согласно которой каждая заправочная станция в Великобритании должна сообщать цены на топливо в течение 30 минут после их замены на заправочных станциях. Подробности API опубликованы здесь.
Справочник по API представления цен находится здесь, и я приложил скриншот:
Изображение

Изображение

Я зарегистрировал свою заправочную станцию и пытаюсь использовать API для отправки изменений цен на топливо в тестовой среде.
Мне удалось запросить и получить токен доступа, но когда я пытаюсь опубликовать некоторые данные о ценах на топливо с приведенной ниже полезной нагрузкой (я удалил site_id, я получаю статус ответа 400).

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

{
"source_type": "API",
"stations": [
{
"site_id": "************",
"price_submission_timestamp": "2026-01-22 13:41:00",
"price_change_effective_timestamp": "2026-01-22 13:41:00",
"reported_within_30_min": true,
"prices": [
{
"fuel_type": "E10",
"price": 137.9
},
{
"fuel_type": "B7",
"price": 123.7
}
]
}
]
}
со следующими ответами

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

HEADERS: {'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJraW5kIjoic2VjcmV0IiwiY2xpZW50X2lkIjoiWjljNzRXTXBkTlk2TXppNnF1bTA5VDZXYkJYSldFcngiLCJtZnRfaWQiOiIzYWU0NTlmOS05YjY5LTQzNWYtOGM1ZS1hZGRmMzUxZDc5ZjgiLCJzdWIiOiJaOWM3NFdNcGROWTZNemk2cXVtMDlUNldiQlhKV0VyeCIsImF1ZCI6Im9hdXRoIiwiaWF0IjoxNzY5MTU1OTUyLCJleHAiOjE3NjkxNTk1NTJ9.lIKHbI0aNxld5j_8wRgdip48FgMu1Uv2nEc9eVquCzw'}

Status: 400

Response: {"success":false,"data":{"success":false,"data":{"success":false,"statusCode":400,"error":["Request payload contains one or more invalid fields."]},"message":["Request payload contains one or more invalid fields."],"error":{"code":400,"details":["Request payload contains one or more invalid fields."]}},"message":{"code":400,"details":["Request payload contains one or more invalid fields."]},"error":{"code":400,"details":{"code":400,"details":["Request payload contains one or more invalid fields."]}}}

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

Traceback (most recent call last):
File "G:\My Drive\Pycharm Projects\CMA Fuel Finder\oauth2_work.py", line 82, in 
price_update = submit_prices(token["data"]["access_token"])
File "G:\My Drive\Pycharm Projects\CMA Fuel Finder\oauth2_work.py", line 70, in submit_prices
response.raise_for_status()
~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "C:\Users\Gary\AppData\Local\Programs\Python\Python313\Lib\site-packages\requests\models.py", line 1026, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://stg.fuel-finder.ics.gov.uk/api/v1/pfs/fuel-prices
Я использую тестовый сценарий (без конфиденциальных данных):

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

import os
import requests
import json
import gt_functions2 as gtf
from colorama import Fore
from colorama import just_fix_windows_console
just_fix_windows_console()

# Get data API authentication details
TOKEN_URL = "https://stg.fuel-finder.ics.gov.uk/api/v1/oauth/generate_secret_token"
PRICE_UPDATE_URL = "https://stg.fuel-finder.ics.gov.uk/api/v1/pfs/fuel-prices"

def get_access_token():
data = {
"grant_type": "client_credentials",
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
}

response = requests.post(TOKEN_URL, json=data)
response.raise_for_status()  # raises an error for bad responses
token_data = response.json()
#return token_data["data"]["access_token"]
return token_data

def submit_prices(access_token):
data = {
"source_type": "API",
"stations": [
{
"site_id": FUEL_FINDER_ID,
"price_submission_timestamp": gtf.get_fuelfinder_timestamp(),
#"price_submission_timestamp": "2025-11-30T11:33:59Z",
"price_change_effective_timestamp":  gtf.get_fuelfinder_timestamp(),
#"price_change_effective_timestamp": "2025-11-30T11:33:59Z",
"reported_within_30_min": True,
"prices": [
{"fuel_type": "E10", "price": 137.9},
{"fuel_type": "B7",  "price": 123.7}
]
}
]
}

headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json"
}

response = requests.post(PRICE_UPDATE_URL, json=data, headers=headers)
print("PAYLOAD:", json.dumps(data, indent=2))
print("HEADERS:", headers)
print("Status:", response.status_code)
print("Response:", response.text)
response.raise_for_status()

return response.json()

if __name__ == "__main__":
print()
print(Fore.YELLOW + "Requesting access token...")
print()
token = get_access_token()

if token["success"]:
print("Received token OK")
price_update = submit_prices(token["data"]["access_token"])
Моя полезная нагрузка выглядит идентично полезной нагрузке в примере, за исключением временных меток и моего собственного site_id, поэтому я не могу понять, в чем может быть проблема.
Я пытался обратиться к издателю API за поддержкой, однако
все, что я получаю, это автоматические электронные письма с подтверждением билетов, но больше ничего.

Подробнее здесь: https://stackoverflow.com/questions/798 ... finder-api
Ответить

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

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

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

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

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