Задать вопрос
mal1kov
@mal1kov
Притворись дураком 5 минут, чем быть им всю жизнь.

Как проверить JSON на обновления?

Сам JSON я получаю через requests и сохраняю в файл, но надо сохранить только новый объект внутри JSON и вывести его в консоль.

Пример JSON

{
  "jsonrpc": "2.0",
  "id": "fbad5793-e89e-45c4-9f3f-4b324bc82ba3",
  "result": [
    {
      "id": "60831f62a40a2eb3973c9df3",
      "account": [
        {
          "name": "transaction",
          "title": "����� ����",
          "value": "1315"
        }
      ],
      "air": "185784234",
      "cancel_time": 0,
      "cancelled_at": null,
      "check_number": 1315,
      "created_at": "2021-04-23T19:26:34.607Z",
      "currency": 860,
      "detail": null,
      "error": null,
      "is_adaptive": false,
      "is_adaptive_batch": false,
      "is_adaptive_chunk": false,
      "is_corporate": false,
      "is_refund": false,
      "is_refundable": false,
      "refund": null,
      "refund_receipts": [],
      "refunded_receipt": null,
      "rrn": "111400433419",
      "stan": "148864",
      "state": 4,
      "state_code": "paid",
      "tid": "97006627",
      "viewed": false
    },
    {
      "id": "8da31f62a40a2eb3973c9df3",
      "account": [
        {
          "name": "transaction",
          "title": "����� ����",
          "value": "1314"
        }
      ],
      "air": "185784234",
      "cancel_time": 0,
      "cancelled_at": null,
      "check_number": 1314,
      "created_at": "2021-04-23T19:26:34.607Z",
      "currency": 860,
      "detail": null,
      "error": null,
      "is_adaptive": false,
      "is_adaptive_batch": false,
      "is_adaptive_chunk": false,
      "is_corporate": false,
      "is_refund": false,
      "is_refundable": false,
      "refund": null,
      "refund_receipts": [],
      "refunded_receipt": null,
      "rrn": "111400433419",
      "stan": "148864",
      "state": 4,
      "state_code": "paid",
      "tid": "97006627",
      "viewed": false
    }
  ]
}

Каждый объект хранится в result.
В интернете ничего годного не нашёл.
У самого API нет такого метода, например как в Telegram Bot API - getUpdates, поэтому придётся реализовать самому.
Есть ли какая-то библиотека? Как получить обновления и каким способом лучше реализовать?

upd: Каждый объект и каждый запрос имеют ID.
ID каждого объекта больше предыдущего на 1.

upd2: Если делать запросы слишком часто, то можно получить бан на API
  • Вопрос задан
  • 206 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
upd: Каждый объект и каждый запрос имеют ID.
ID каждого объекта больше предыдущего на 1.


Помнить самый большой из id уже возвращавшихся, при каждом запросе проверять, нет ли id больше запомненного. Запросы делать с определёнными интервалами (sleep), чтобы их число в единицу времени не превышало лимитов (наприммер, если разрешено максимум 10 запросов в минуту, то нужно сделать интервал не меньше 6 секунд).

Между прочим, getUpdates в библиотеках telegram используют примерно так же. Более того Bot API позволяет указать в параметре offset нужный id, чтобы в ответ вернулись только более новые.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@o5a
Не совсем понятно, в чем собственно вопрос? Как сравнить 2 полученных результата json? Или как делать запрос с интервалом?
Если объекты уникальный по id, то можно получить список (множество) идентификаторов одного запроса и другого, затем найти отличия id и по ним вывести нужные результаты из нового запроса.
ids = {result['id'] for result in data['result']}
print(ids)

для json из примера получится
{'8da31f62a40a2eb3973c9df3', '60831f62a40a2eb3973c9df3'}

Допустим новый json пришел с доп. id (new_ids)
{'8da31f62a40a2eb3973c9df3', '60831f62a40a2eb3973c9df3', '60831f62a40a2eb3973c9df5'}

Соответственно получаем список новых id:
diff_ids = new_ids - ids
И по ним уже выводим данные:
news = [result for result in new_data['result'] if result['id'] in diff_ids]

где new_data это новый запрос json
Ответ написан
Комментировать
yupiter7575
@yupiter7575
Python программист
while True:
    sleep(60)
    pass
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы