3

私はこれに少し取り組んできましたが、このブロックを通過できないようです。

v3 API を使用してサービスを作成し、ユーザー固有のデータを取得することはできますが、プレイリストを追加しようとするとエラーが発生し、回避できないようです。

--EDIT-- JSON 化された文字列の代わりにオブジェクトを渡すと機能します。

json_obj = {'snippet':{'title':title}}
#json_str = json.dumps(json_obj)
playlist = self.service.playlists().insert(part='snippet, status', body=json_obj)
playlist.execute()

これは私に次のようなものを与えます:

リクエスト ヘッダー:

{'Authorization': u'Bearer TOKEN',
 'accept': 'application/json',
 'accept-encoding': 'gzip, deflate',
 'content-length': '73',
 'content-type': 'application/json',
 'user-agent': 'google-api-python-client/1.0'}

リクエスト本文:

'"{\\"snippet\\":{\\"title\\":\\"2013newTest\\"}}"'

応答ヘッダー:

{'cache-control': 'private, max-age=0',
 'content-type': 'application/json; charset=UTF-8',
 'date': 'Tue, 08 Jan 2013 01:40:13 GMT',
 'expires': 'Tue, 08 Jan 2013 01:40:13 GMT',
 'server': 'GSE',
 'status': '400',
 'transfer-encoding': 'chunked',
 'x-content-type-options': 'nosniff',
 'x-frame-options': 'SAMEORIGIN',
 'x-xss-protection': '1; mode=block'}

応答本文:

'{"error": {
   "errors": [
     {"domain": "youtube.parameter",
      "reason": "missingRequiredParameter",
      "message": "No filter selected.", 
      "locationType": "parameter",
      "location": ""}
             ],
  "code": 400,
  "message": "No filter selected."}}'

その結果、ライブラリが生成する応答は次のとおりです。

Traceback (most recent call last):
  File "playlist.py", line 190, in <module>
    yt_pl.add_playlist('2013newTest')
  File "playlist.py", line 83, in add_playlist
    playlist.execute()
  File "oauth2client/util.py", line 121, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "apiclient/http.py", line 693, in execute
    raise HttpError(resp, content, uri=self.uri)
apiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2C+status&key=[KEY] returned "No filter selected.">

誰かが同じエラーを起こしている場所を見つけることができた唯一のものは、漠然と関連しているだけで、C# にありました。Python で v3 を使用してプレイリストを追加できた人はいますか?

4

1 に答える 1

3

送信されるペイロードは、bodyJSON にシリアル化できるオブジェクトである必要があります。

これはJsonModel 、リクエスト本文に使用されるデフォルトに、serialize常にdumpsjson へのメソッドがあるためです。

class JsonModel(BaseModel):
  ...
  def serialize(self, body_value):
    if (isinstance(body_value, dict) and 'data' not in body_value and
        self._data_wrapper):
      body_value = {'data': body_value}
    return simplejson.dumps(body_value)

したがって、既に JSON でシリアライズされた文字列を渡すと、二重にシリアライズされます。

例えば:

>>> json.dumps({'a': 'b'})
'{"a": "b"}'
>>> json.dumps('{"a": "b"}')
'"{\\"a\\": \\"b\\"}"'

これは、本質的にリクエスト本文に何が起こったのかです:

'"{\\"snippet\\":{\\"title\\":\\"2013newTest\\"}}"'

修正できるように、あなたを迷わせたドキュメントをいくつか指摘していただけますか?

于 2013-01-08T02:52:54.457 に答える