我正在开发一个项目,其中一部分涉及从 python 脚本将行插入到项目的 Google Fusion Table 中。在过去的几天里,我一直在试图弄清楚如何做到这一点,我对此感到困惑。
我的研究似乎表明我需要使用 Oauth 2.0 来访问 API。这样做我可以成功获得访问令牌,但我似乎无法成功获得刷新令牌。我不确定这是否会妨碍我成功地将对我的 Fusion Table 的访问与我的 Python 代码集成的能力。
我遇到的第二个问题是我真的不明白如何在我的表中插入一行代码。我在上面找到的大部分材料都来自已弃用的 Fusion Tables SQL API,我并不完全理解新的做法。
我是这类事情的初学者,非常感谢任何帮助我的方向!
编辑:所以到目前为止我工作的代码如下所示:
client_id = "<client_i>"
client_secret = "<client_secret>"
table_id = "<table_id>"
access_token = ""
refresh_token = "<refresh_token>"
# the refresh token is used to request a new access token
data = urllib.urlencode({
'client_id': client_id,
'client_secret': client_secret,
'refresh_token': refresh_token,
'grant_type': 'refresh_token'})
request = urllib2.Request(
url='https://accounts.google.com/o/oauth2/token',
data=data)
request_open = urllib2.urlopen(request)
response = request_open.read()
request_open.close()
tokens = json.loads(response)
access_token = tokens['access_token']
# Read the table
request_read = urllib2.Request(
url='https://www.google.com/fusiontables/api/query?%s' % \
(urllib.urlencode({'access_token': access_token,
'sql': 'SELECT * FROM table_id'})))
request_open = urllib2.urlopen(request_read)
response = request_open.read()
request_open.close()
print response
还有我尝试在表中插入新行的代码:
date = str(datetime.now().date())
time = str(datetime.now().time())
query = 'INSERT INTO table_id (Date,Time,Saskatoon,Regina,MeadowLake)VALUES(date,time,60.01,60.02,59.99)'
data = urllib2.Request(
url='https://www.google.com/fusiontables/api/query?%s' % \
(urllib.urlencode({'access_token': access_token,
'sql': query})))
request_open = urllib2.urlopen(data)
当我运行这个时,我得到
HTTP 错误 400:HTTP GET 只能用于选择查询。
我知道我应该为 INSERT 制作 POST 而不是 GET,我只是不确定我的代码需要更改哪些内容才能实现。对不起,我是菜鸟。
第二次编辑:
很抱歉让这个时间更长,但我觉得展示我到目前为止所取得的成就是恰当的。我切换到图书馆请求,事情变得更容易了,但是我仍然没有成功发布 POST。我用于导入行的新代码如下:
def importRows(self):
print 'IMPORT ROWS'
date = str(datetime.now().date())
time = str(datetime.now().time())
data = {'Date': date,
'Time': time,
'Saskatoon': '60.01',
'Regina': '59.95'}
url = 'https://www.googleapis.com/upload/fusiontables/v1/tables/%s/import/%s' % \
(tableid, self.params) # self.params is access token
importRow = requests.post(url, params=data)
print importRow.status_code
print importRow.text
这给了我
400
{
"error": {
"errors": [
{
"domain": "fusiontables",
"reason": "badImportInputEmpty",
"message": "Content is empty."
}
],
"code": 400,
"message": "Content is empty."
}
}