2017-04-25 148 views
0

我試圖使用Google UrlShortener API來檢索OAuth2和API密鑰的歷史記錄。我得到了200 OK響應,但是當我嘗試使用pagetoken或pageToken作爲查詢參數獲取後續頁面時,我總是獲得相同的nextPageToken和相同的結果頁面。奇怪的是,基於瀏覽器的Google API交互使用start-token而不是pagetoken或pageToken,但是當我使用start-token時,我沒有收到200 OK。Google URL Shortener API總是返回與pagetoken相同的頁面

如何獲取分頁以使用UrlShortener API?

這裏是我的代碼:

import requests 
import json 
import time 
import settings 

from oauth2client.client import OAuth2WebServerFlow 
from oauth2client.tools import run_flow 
from oauth2client.file import Storage 

def history(): 
    """Look up a user's history""" 
    flow = OAuth2WebServerFlow(client_id=settings.OAUTH2_CLIENT_ID, 
           client_secret=settings.CLIENT_SECRET, 
           scope='https://www.googleapis.com/auth/urlshortener', 
           redirect_uri='http://127.0.0.1:5000/callback') 

    storage = Storage('creds.data') 

    credentials = run_flow(flow, storage) 

    print("access_token: {}".format(credentials.access_token)) 

    headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer {}'.format(credentials.access_token)} 
    raw_url = 'https://www.googleapis.com/urlshortener/v1/url/history' 
    url = raw_url + '?key={}'.format(settings.API_KEY) 
    r = requests.get(url=url, headers=headers) 

    if r.ok: 
     output = "The history is {}.".format(r.json()) 
     print(output) 

     if 'nextPageToken' in r.json().keys(): 
      morePages = True 
      npt = r.json()['nextPageToken'] 

     r_paged = None 
     while morePages: 
      time.sleep(2) 
      url = raw_url + '?pagetoken={}&key={}'.format(npt, settings.API_KEY) 
      r_paged = requests.get(url=url, headers=headers) 
      if r_paged.ok: 
       if 'nextPageToken' in r_paged.json().keys(): 
        npt = r_paged.json()['nextPageToken'] 
        morePages = True 
       else: 
        morePages = False 
        break 
       output = "The history is {}.".format(r_paged.json()) 
       print(output) 
      else: 
       output = "Invalid request. Status code = {}, json = {}".format(r_paged.status_code, r_paged.json()) 
       print(output) 
    else: 
     output = "Invalid request. Status code = {}, json = {}".format(r.status_code, r.json()) 
     print(output) 

回答

0

固定碼如下:

# New import: 
import urllib.parse 

# // snip 
       time.sleep(2) 
       f = {'start-token':npt, 'key': settings.API_KEY} 
       formatted = '?' + urllib.parse.urlencode(f) 
       url = raw_url + formatted 
       r_paged = requests.get(url=url, headers=headers) 
# // snip 

基本上忽略的文檔。不要使用pageToken,請使用開始令牌。此外,您需要使用適用於Python 3的url解析器進行urlencoding。