2017-04-25 1 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-token을 사용하십시오. 또한 urlencoding을 위해 Python 3에 적합한 url 파서를 사용해야합니다.

관련 문제