1

我正在尝试使用 Google API 缩短 URL,但仅使用requests模块。

代码如下所示:

import requests

Key = "" # found in https://developers.google.com/url-shortener/v1/getting_started#APIKey

api = "https://www.googleapis.com/urlshortener/v1/url"

target = "http://www.google.com/"

def goo_shorten_url(url=target):
  payload = {'longUrl': url, "key":Key}
  r = requests.post(api, params=payload)

print(r.text)

当我运行 goo_shorten_url它返回:

 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Required",
    "locationType": "parameter",
    "location": "resource.longUrl"
   }

  ],
  "code": 400,
  "message": "Required"
 }

但是longUrl参数在那里!

我究竟做错了什么?

4

3 回答 3

1

首先,请确认在Google API Console中启用了“urlshortener api v1” 。

Content-Type需要作为标题。请data作为请求参数使用。修改后的样本如下。

修改样本:

import json
import requests

Key = "" # found in https://developers.google.com/url-shortener/v1/getting_started#APIKey

api = "https://www.googleapis.com/urlshortener/v1/url"

target = "http://www.google.com/"

def goo_shorten_url(url=target):
  headers = {"Content-Type": "application/json"}
  payload = {'longUrl': url, "key":Key}
  r = requests.post(api, headers=headers, data=json.dumps(payload))

print(r.text)

如果上述脚本不起作用,请使用访问令牌。范围是https://www.googleapis.com/auth/urlshortener。在使用访问令牌的情况下,示例脚本如下。

示例脚本:

import json
import requests

headers = {
    "Authorization": "Bearer " + "access token",
    "Content-Type": "application/json"
}
payload = {"longUrl": "http://www.google.com/"}
r = requests.post(
    "https://www.googleapis.com/urlshortener/v1/url",
    headers=headers,
    data=json.dumps(payload)
)
print(r.text)

结果 :

{
 "kind": "urlshortener#url",
 "id": "https://goo.gl/#####",
 "longUrl": "http://www.google.com/"
}

添加了 1:

在使用的情况下tinyurl.com

import requests

URL = "http://www.google.com/"
r = requests.get("http://tinyurl.com/" + "api-create.php?url=" + URL)
print(r.text)

添加 2:

如何使用 Python 快速入门

您可以使用Python 快速入门。如果您没有“google-api-python-client”,请安装它。安装后,请复制粘贴“步骤 3:设置示例”中的示例脚本,并将其创建为 python 脚本。修改点如下2部分。

一、范围

前 :

SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

后 :

SCOPES = 'https://www.googleapis.com/auth/urlshortener'

2. 脚本

前 :

def main():
    """Shows basic usage of the Google Drive API.

    Creates a Google Drive API service object and outputs the names and IDs
    for up to 10 files.
    """
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('drive', 'v3', http=http)

    results = service.files().list(
        pageSize=10,fields="nextPageToken, files(id, name)").execute()
    items = results.get('files', [])
    if not items:
        print('No files found.')
    else:
        print('Files:')
        for item in items:
            print('{0} ({1})'.format(item['name'], item['id']))

后 :

def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('urlshortener', 'v1', http=http)
    resp = service.url().insert(body={'longUrl': 'http://www.google.com/'}).execute()
    print(resp)

完成以上修改后,请执行示例脚本。您可以获得短网址。

于 2017-04-14T02:03:55.490 回答
0

我确信一个人不能只使用请求来使用 google api 来缩短 url。

下面我写了我最终得到的解决方案,

它可以工作,但它使用google api,这没问题,但我找不到太多关于它的文档或示例(没有我想要的那么多)。

要运行代码,请记住首先使用 google api for python 安装 pip install google-api-python-client,然后:

import json

from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

scopes = ['https://www.googleapis.com/auth/urlshortener']

path_to_json = "PATH_TO_JSON" 
#Get the JSON file from Google Api [Website]
(https://console.developers.google.com/apis/credentials), then:
# 1. Click on Create Credentials. 
# 2. Select "SERVICE ACCOUNT KEY". 
# 3. Create or select a Service Account and 
# 4. save the JSON file.   

credentials = ServiceAccountCredentials.from_json_keyfile_name(path_to_json, scopes)

short = build("urlshortener", "v1",credentials=credentials)

request = short.url().insert(body={"longUrl":"www.google.com"})
print(request.execute())

我改编自Google 的 Manual Page

它必须如此复杂(至少比我最初预期的要多)的原因是为了避免需要用户(在这种情况下为我)按下按钮(以确认我可以使用我的信息)的 OAuth2 身份验证。

于 2017-04-14T16:44:38.667 回答
0

由于问题不是很清楚,所以这个答案分为 4 个部分。

使用以下方法缩短 URL:

1. API 密钥。

2.访问令牌

3.服务帐号

4. TinyUrl 更简单的解决方案。


API 密钥

首先,请确认在Google API Console中启用了“urlshortener api v1” 。

Content-Type需要作为标题。请data作为请求参数使用。修改后的样本如下。

(尽管 API 手册说了什么,但似乎不起作用)。

修改样本:

import json
import requests

Key = "" # found in https://developers.google.com/url-shortener/v1/getting_started#APIKey

api = "https://www.googleapis.com/urlshortener/v1/url"

target = "http://www.google.com/"

def goo_shorten_url(url=target):
  headers = {"Content-Type": "application/json"}
  payload = {'longUrl': url, "key":Key}
  r = requests.post(api, headers=headers, data=json.dumps(payload))

print(r.text)

访问令牌:

如果上述脚本不起作用,请使用访问令牌。范围是https://www.googleapis.com/auth/urlshortener。在使用访问令牌的情况下,示例脚本如下。

Stackoverflow 中的这个答案显示了如何获取访问令牌:Link

示例脚本:

import json
import requests

headers = {
    "Authorization": "Bearer " + "access token",
    "Content-Type": "application/json"
}
payload = {"longUrl": "http://www.google.com/"}
r = requests.post(
    "https://www.googleapis.com/urlshortener/v1/url",
    headers=headers,
    data=json.dumps(payload)
)
print(r.text)

结果 :

{
 "kind": "urlshortener#url",
 "id": "https://goo.gl/#####",
 "longUrl": "http://www.google.com/"
}

使用服务帐号

为了避免用户需要接受 OAuth 身份验证(带有弹出屏幕等),有一种解决方案使用服务帐户在机器之间使用身份验证(如另一个建议的答案中所述)。

要运行这部分代码,请记住首先使用 google api for python 安装pip install google-api-python-client,然后:

import json

from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

scopes = ['https://www.googleapis.com/auth/urlshortener']

path_to_json = "PATH_TO_JSON" 
#Get the JSON file from Google Api [Website]
(https://console.developers.google.com/apis/credentials), then:
# 1. Click on Create Credentials. 
# 2. Select "SERVICE ACCOUNT KEY". 
# 3. Create or select a Service Account and 
# 4. save the JSON file.   

credentials = ServiceAccountCredentials.from_json_keyfile_name(path_to_json, scopes)

short = build("urlshortener", "v1",credentials=credentials)

request = short.url().insert(body={"longUrl":"www.google.com"})
print(request.execute())

改编自Google 的手册页

更简单:

在使用的情况下tinyurl.com

import requests

URL = "http://www.google.com/"
r = requests.get("http://tinyurl.com/" + "api-create.php?url=" + URL)
print(r.text)
于 2017-04-15T07:32:05.723 回答