1

私はプロジェクトに取り組んでおり、その一部には、python スクリプトからプロジェクトの Google Fusion Table に行を挿入することが含まれます。私は過去数日間、それを行う方法を理解しようとしましたが、公式には混乱しています.

私の調査では、API にアクセスするには Oauth 2.0 を使用する必要があることが示されているようです。そうすることで、アクセストークンを正常に取得できますが、リフレッシュトークンを正常に取得できないようです。これが、Fusion Table へのアクセスを Python コードと正常に統合する能力を妨げるかどうかはわかりません。

私が抱えている2番目の問題は、テーブルに行を挿入するコードを正確に理解していないことです。私が見つけた資料のほとんどは、非推奨の 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のGETではなくPOSTを作成することになっていることはわかっていますが、それを行うためにコードで何を変更する必要があるのか​​ わかりません。ノブでごめんなさい。

2回目の編集:

これを長くして申し訳ありませんが、これまでに到達した場所を示すことが適切だと思います. ライブラリ リクエストに切り替えたところ、多少は楽になりましたが、まだ 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."
 }
}
4

1 に答える 1

1

アプリケーションでGoogleAPIへのオフラインアクセスが必要な場合、認証コードのリクエストにはaccess_typeパラメータを含める必要があります。このパラメータの値はオフラインです。

https://developers.google.com/accounts/docs/OAuth2WebServer#offline

grant_type次に、更新トークンを使用してアクセストークンを取得するには、値を含むPOSTリクエストを送信しますrefresh_token

基本的に、SQLが機能する方法は、SQLステートメントのサブセットを使用してPOST要求を送信することです。https://www.googleapis.com/fusiontables/v1/query?sql=STATEMENT_HERE

参照する

https://developers.google.com/fusiontables/docs/v1/reference/query https://developers.google.com/fusiontables/docs/v1/sql-reference

編集:

データパラメータなしで使用しているためurllib2、デフォルトでGETになります。requestsこれを修正するには、メソッド(またはなどhttplib)を明示的に指定できる別のHTTPライブラリを使用するか、次のようにする必要があります。

query = "INSERT INTO %s(EXAMPLE_COL1,EXAMPLE_COL2) VALUES"\
        "('EXAMPLE_INFO1','EXAMPLE_INFO2')" % table_id # Single quotes
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request('https://www.google.com/fusiontables/api/query?%s' % \
    (urllib.urlencode({'access_token': access_token,
                       'sql': query})),
    headers={'Content-Length':0})      # Manually set length to avoid 411 error
request.get_method = lambda: 'POST'    # Change HTTP request method
response = opener.open(request).read()
print response

注意すべき重要事項:

  1. モンキーパッチを適用して、必要な処理を実行します(本文が空の場合は、POSTします)。そうでない場合は、を受け取りHTTP Error 400: HTTP GET can only be used for SELECT queriesます。

  2. 本体がないことを手動で指定します(Content-Lengthis 0)。そうでない場合はを受け取りHTTP Error 411: Length Requiredます。

  3. クエリを介して文字列を送信するには、内部に一重引用符を含む二重引用符を使用するか、内部引用符をエスケープする必要があります。言い換えれば、"INSERT INTO %s(EXAMPLE_COL1,EXAMPLE_COL2) VALUES(EXAMPLE_INFO1,EXAMPLE_INFO2)" % table_id動作しません。

    前の行を使用しようとすると、次のようになります。HTTP Error 400: Parse error near 'SOME_STRING' (line X, position Y)

urllib2を使用したメソッドの変更については、以下を参照してください。

PythonでHTTPPUTを実行する方法はありますか

于 2013-03-10T20:51:12.233 に答える