2016-03-12 4 views
0

Я пытаюсь использовать API-интерфейс HubSpot для получения «Все предложения».Итерация через JSON в Python с использованием OFFSET

В API конечная точка: https://api.hubapi.com/deals/v1/deal/all?hapikey=demo

JSON возвращается, как выглядит это ...

{ 
    "deals": [ 
     { 
      "portalId": 62515, 
      "dealId": 18039629, 
      "isDeleted": false, 
      "associations": { 
       "associatedVids": [], 
       "associatedCompanyIds": [], 
       "associatedDealIds": [] 
      }, 
      "properties": { 
       "dealname": { 
        "value": "Company", 
        "timestamp": 1457040864519, 
        "source": "API", 
        "sourceId": null 
       }, 
       "amount": { 
        "value": "10", 
        "timestamp": 1457040864519, 
        "source": "API", 
        "sourceId": null 
       }, 
       "closedate": { 
        "value": "", 
        "timestamp": 1457040864519, 
        "source": "API", 
        "sourceId": null 
       }, 
       "hubspot_owner_id": { 
        "value": "11626092", 
        "timestamp": 1457046177648, 
        "source": "SALESFORCE", 
        "sourceId": null 
       }, 
       "hs_lastmodifieddate": { 
        "value": "1457046177662", 
        "timestamp": 1457046177662, 
        "source": "CALCULATED", 
        "sourceId": null 
       }, 
       "hubspot_owner_assigneddate": { 
        "value": "1457046177648", 
        "timestamp": 1457046177648, 
        "source": "SALESFORCE", 
        "sourceId": null 
       }, 
       "num_associated_contacts": { 
        "value": "0", 
        "timestamp": 0, 
        "source": "CALCULATED", 
        "sourceId": null 
       }, 
       "hs_createdate": { 
        "value": "1457040864535", 
        "timestamp": 1457040864535, 
        "source": null, 
        "sourceId": null 
       }, 
       "createdate": { 
        "value": "1457040864535", 
        "timestamp": 1457040864535, 
        "source": null, 
        "sourceId": null 
       }, 
       "hs_salesforceopportunityid": { 
        "value": "00628000007nRyuAAE", 
        "timestamp": 1457046177648, 
        "source": "SALESFORCE", 
        "sourceId": null 
       } 
      }, 
      "imports": [] 
     }, 
     { 
      "portalId": 62515, 
      "dealId": 18040854, 
      "isDeleted": false, 
      "associations": { 
       "associatedVids": [], 
       "associatedCompanyIds": [], 
       "associatedDealIds": [] 
      }, 
      "properties": { 
       "dealname": { 
        "value": "5678", 
        "timestamp": 1457042290572, 
        "source": "API", 
        "sourceId": null 
       }, 
       "amount": { 
        "value": "750000.0", 
        "timestamp": 1457042290572, 
        "source": "API", 
        "sourceId": null 
       }, 
       "closedate": { 
        "value": "", 
        "timestamp": 1457042290572, 
        "source": "API", 
        "sourceId": null 
       }, 
       "hs_lastmodifieddate": { 
        "value": "1457042290592", 
        "timestamp": 1457042290592, 
        "source": "CALCULATED", 
        "sourceId": null 
       }, 
       "num_associated_contacts": { 
        "value": "0", 
        "timestamp": 0, 
        "source": "CALCULATED", 
        "sourceId": null 
       }, 
       "hs_createdate": { 
        "value": "1457042290592", 
        "timestamp": 1457042290592, 
        "source": null, 
        "sourceId": null 
       }, 
       "createdate": { 
        "value": "1457042290592", 
        "timestamp": 1457042290592, 
        "source": null, 
        "sourceId": null 
       } 
      }, 
      "imports": [] 
     } 
    ], 
    "hasMore": true, 
    "offset": 1467187 
} 

И я понимаю, что если hasMore==true, то вы должны захватить offset и включить его в другой API вызывает примерно следующее: https://api.hubapi.com/deals/v1/deal/all?hapikey=demo&offset=1467187

И продолжайте делать это до hasMore==false.

Я использую следующий код, чтобы извлечь первый кусок JSON с API:

import requests 

url = "https://api.hubapi.com/deals/v1/deal/all" 

querystring = {"hapikey":"demo"} 

headers = { 
    'cache-control': "no-cache" 
    } 

response = requests.request("GET", url, headers=headers, params=querystring) 

print(response.text) 

Итак ... мой вопрос заключается в том, что теперь я получаю мой JSON, как я:

1) Считайте один кусок JSON
2) Если hasMore==true затем пойти и сделать # 1 снова
3) ELSEIF hasMore==false затем объединить все JSON из ВСЕХ итераций # 1 выше, в один большой формат JSON
4) возвращает значение из № 3

Любая помощь пожалуйста?

ответ

2

Рабочий раствор

import json 
import requests 

url = "https://api.hubapi.com/deals/v1/deal/all" 

querystring = {"hapikey":"demo"} 

headers = { 
    'cache-control': "no-cache" 
    } 

all_deals = [] 

response = requests.request("GET", url, headers=headers, params=querystring).json() 

for deal in response['deals']: 
    all_deals.append(deal) 

hasMore = response['hasMore'] 
offset = response['offset'] 

while hasMore: 

    querystring = { 
     "hapikey":"demo", 
     "offset":offset 
     } 
    response = requests.request("GET", url, headers=headers, params=querystring).json() 

    for deal in response['deals']: 
     all_deals.append(deal) 

    hasMore = response['hasMore'] 
    offset = response['offset'] 

print(json.dumps(all_deals)) 
+0

у были очень близки. сделал некоторые изменения, и это прекрасно работает ... – gotmike

+1

Рад, что это работает для вас. Я немного изменил ваши изменения, так как 'response2/3' на самом деле не нужны. Вы можете повторно использовать одну и ту же переменную. –

+0

уверенная вещь, не беспокойтесь ... спасибо тонну за решение! – gotmike