2017-04-25 7 views
0

Google UrlShortener APIを使用してOAuth2とAPIキーを使用して履歴を取得しようとしています。私は200 OK応答を得ていますが、pagetokenやpageTokenをクエリパラメータとして使用して後続のページを取得しようとすると、常に同じnextPageTokenと同じページが表示されます。奇妙なことに、ブラウザベースのGoogle APIインタラクションは、pagetokenまたはpageTokenではなく、開始トークンを使用しますが、開始トークンを使用すると、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は使用しないでください。startトークンを使用してください。さらに、あなたは、urlencodingのためにPython 3に適したurlパーサーを使用する必要があります。

関連する問題