Google URL Shortener API 总是返回与 pagetoken 相同的页面

Posted

技术标签:

【中文标题】Google URL Shortener API 总是返回与 pagetoken 相同的页面【英文标题】:Google URL Shortener API always returns same page with pagetoken 【发布时间】:2017-09-22 06:17:21 【问题描述】:

我正在尝试使用 Google UrlShortener API 通过 OAuth2 和 API 密钥检索历史记录。我收到 200 OK 响应,但是当我尝试使用 pagetoken 或 pageToken 作为查询参数获取后续页面时,我总是得到相同的 nextPageToken 和相同的结果页面。奇怪的是,基于浏览器的 Google API 交互使用 start-token 而不是 pagetoken 或 pageToken 但是当我使用 start-token 时我没有得到 200 OK。

如何使用 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)

【问题讨论】:

【参考方案1】:

固定代码如下:

# 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。此外,您需要使用适合 Python 3 的 url 解析器进行 urlencoding。

【讨论】:

以上是关于Google URL Shortener API 总是返回与 pagetoken 相同的页面的主要内容,如果未能解决你的问题,请参考以下文章

Google Shortener API限制

sh Bash:goo.gl#使用Google URL Shortener服务(http://goo.gl)缩短网址。

sh Bash函数在stdin上使用goo.gl URL缩短器。参见<https://developers.google.com/url-shortener/v1/getting_started

markdown URL Shortener

PHP PHP URL Shortener

SharePoint 2010 Url Shortener --SharePoint 2010 短URL生成器