Techioz Blog

Ruby の Google PeopleApi - CreateContact メソッドの引数が無効です

概要

「google-api-client」 gem を使用して、Ruby アプリケーションから Google People API に接続しています。 https://github.com/googleapis/google-api-ruby-client

他のメソッド(list_person_connections、get_people、delete_person_contact、update_person_contact)はなんとか動作しましたが、Google People APIのcreateContact(create_person_contact)メソッドを動作させることができません。

投稿を送信した後、次のエラーが表示されます。

400 Caught error badRequest: Request contains an invalid argument.

これは、名前フィールドのみを含む連絡先を作成するサンプル コードです (実際には、本文に email パラメーターとphoneNumbers パラメーターも送信したいと思いますが、同じエラーが返されるため、ここでは最も単純な例を示します)。

require 'google/apis/content_v2'
require "google/apis/people_v1"
require "googleauth"
require "googleauth/stores/file_token_store"
require "fileutils"
require 'google/apis/people_v1'
require 'google/api_client/client_secrets'

client_secrets = Google::APIClient::ClientSecrets.load 'credentials.json'
auth_client = client_secrets.to_authorization
auth_client.update!(
    :scope => ['https://www.googleapis.com/auth/contacts', 'https://www.googleapis.com/auth/contacts.other.readonly'],
    :redirect_uri => 'http://localhost:3102/oauth2callback',
    :client_id => 'MY CLIENT ID',
    :client_secret => 'MY CLIENT SECRET',
    #:authorization_uri => 'https://accounts.google.com/o/oauth2/auth',
    :additional_parameters => {"access_type" => "offline", "include_granted_scopes" => "true"})
auth_uri = auth_client.authorization_uri.to_s

auth_client.code = 'THE AUTH CODE'
auth_client.fetch_access_token!
people = Google::Apis::PeopleV1::PeopleServiceService.new
people.authorization = auth_client

body = {:names => [{:givenName => "TEST"}]}
people.create_person_contact(body, person_fields: 'names')

問題は最後の 2 行だけです。呼び出されると、これを本文とともに送信します。

Sending HTTP post https://people.googleapis.com/v1/people:createContact?personFields=names

そして、何を変更しても上記のエラーが返されます。 ドキュメントでは、これとまったく同じコードを実際に試してテストすることができ、動作します。

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://developers.google.com/people/api/rest/v1/people/createContact?authuser=2&apix=true&apix_params=%7B%22personFields%22%3A%22names%22%2C%22resource%22%3A%7B%22names%22%3A%5B%7B%22givenName%22%3A%22TEST%22%7D%5D%7D%7D

私と同じようにリクエスト本文のフォームに記入し、EXECUTE を押すと、200 OK の応答が返されます。

無効な引数がわかりません。これは、私が update_person_contact メソッドで実行していることとまったく同じであり、機能します。

インターネットで検索しましたが、同様の問題を抱えている人は見つかりません。ドキュメントには多くのことが書かれていません: https://www.rubydoc.info/github/google/google-api-ruby-client/Google% 2FApis%2FPeopleV1%2FPeopleServiceService:create_person_contact

誰か私を助けてくれる考えはありますか? ありがとう。

解決策

ほぼ諦めかけた後、CURL オプションを試してみることにしました。そこで、上にリンクした「この API を試してみる」ページからそれをコピーし、Ruby コードに翻訳しました。

curl --request POST \
  'https://people.googleapis.com/v1/people:createContact?personFields=names' \
  --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"names":[{"givenName":"TEST"}]}' \
  --compressed

そして、あなたは何を知っていますか?出来た。

したがって、この gem はこの特定のケースでは機能しないと思います (念のため言っておきますと、google-api-client v: 0.42.2 および 0.43.0 です)。しかし、同じ問題の解決策を見つけるためにここに来たのであれば、 、これが私にとってうまくいったので、お役に立てば幸いです。

(これは私のコードの最後の 2 行を置き換えます):

require 'net/http'
    require 'uri'
    require 'json'

    uri = URI.parse("https://people.googleapis.com/v1/people:createContact?personFields=names")
    request = Net::HTTP::Post.new(uri)
    request.content_type = "application/json"
    request["Authorization"] = "Bearer #{people.authorization.access_token}"
    request["Accept"] = "application/json"
    request.body = JSON.dump({
                                 "names" => [
                                     {
                                         "givenName" => "TEST"
                                     }
                                 ],
                                 "emailAddresses" => [
                                     {
                                         "value" => "[email protected]"
                                     }
                                 ],
                                 "phoneNumbers" => [
                                     {
                                         "value" => "12345678"
                                     }
                                 ]
                             }
    )

    req_options = {
        use_ssl: uri.scheme == "https",
    }

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end

    response.code
    response.body

理想的ではありませんが、今日はうまくいきました。

編集:これを書いた後、本文には正しいフィールドがあるため、「personFields」パラメータさえも役に立たないことに気づきました。

私の回答を見るとわかるように、URI の「名前」フィールドを呼び出しただけですが、これら 3 つのフィールドはすべて、保存後の新しい連絡先 (名前、電子メール、電話番号) に正しく存在していました。したがって、これもおそらく役に立たない/オプションです。