質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

[Gsuite] Groups Setting APIを実行すると結果がNULLで帰ってくる

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 175

Reiku

score 36

前提・実現したいこと

GsuiteのGroups Setting APIを使い、Googleグループの設定情報を取得したい。

■ 前提
・PHPプログラムのバッチ処理として実装したい(not Webアプリケーション)
・PHP用のapi-clientを利用

# composer show -i
firebase/php-jwt          v5.2.0 A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.
google/apiclient          v2.4.1 Client library for Google APIs
google/apiclient-services v0.137 Client library for Google APIs
google/auth               v1.9.0 Google Auth Library for PHP
guzzlehttp/guzzle         5.3.4  Guzzle is a PHP HTTP client library and framework for building RESTful web service clients
guzzlehttp/psr7           1.6.1  PSR-7 message implementation that also provides common utility methods
guzzlehttp/ringphp        1.1.1  Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.
guzzlehttp/streams        3.0.0  Provides a simple abstraction over streams of data
monolog/monolog           1.25.4 Sends your logs to files, sockets, inboxes, databases and various web services
phpseclib/phpseclib       2.0.27 PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.
psr/cache                 1.0.1  Common interface for caching libraries
psr/http-message          1.0.1  Common interface for HTTP messages
psr/log                   1.1.3  Common interface for logging libraries
ralouphie/getallheaders   2.0.5  A polyfill for getallheaders.
react/promise             v2.8.0 A lightweight implementation of CommonJS Promises/A for PHP


・Oauth認証はサービスアカウントを利用しています。

発生している問題・エラーメッセージ

認証エラー等はなく、APIから実行結果は帰ってくるのですが、
値がすべてNULLで帰ってきます。なぜでしょうか・・・

# php test.php 
object(Google_Service_Groupssettings_Groups)#72 (64) {
  ["allowExternalMembers"]=>
  NULL
  ["allowGoogleCommunication"]=>
  NULL
  ["allowWebPosting"]=>
  NULL
  ["archiveOnly"]=>
  NULL
  ["customFooterText"]=>
  NULL
  ["customReplyTo"]=>
  NULL
  ["customRolesEnabledForSettingsToBeMerged"]=>
  NULL
  ["defaultMessageDenyNotificationText"]=>
  NULL
  ["description"]=>
  NULL
  ["email"]=>
  NULL
  ["enableCollaborativeInbox"]=>
  NULL
  ["favoriteRepliesOnTop"]=>
  NULL
  ["includeCustomFooter"]=>
  NULL
  ["includeInGlobalAddressList"]=>
  NULL
  ["isArchived"]=>
  NULL
  ["kind"]=>
  NULL
  ["maxMessageBytes"]=>
  NULL
  ["membersCanPostAsTheGroup"]=>
  NULL
  ["messageDisplayFont"]=>
  NULL
  ["messageModerationLevel"]=>
  NULL
  ["name"]=>
  NULL
  ["primaryLanguage"]=>
  NULL
  ["replyTo"]=>
  NULL
  ["sendMessageDenyNotification"]=>
  NULL
  ["showInGroupDirectory"]=>
  NULL
  ["spamModerationLevel"]=>
  NULL
  ["whoCanAdd"]=>
  NULL
  ["whoCanAddReferences"]=>
  NULL
  ["whoCanApproveMembers"]=>
  NULL
  ["whoCanApproveMessages"]=>
  NULL
  ["whoCanAssignTopics"]=>
  NULL
  ["whoCanAssistContent"]=>
  NULL
  ["whoCanBanUsers"]=>
  NULL
  ["whoCanContactOwner"]=>
  NULL
  ["whoCanDeleteAnyPost"]=>
  NULL
  ["whoCanDeleteTopics"]=>
  NULL
  ["whoCanDiscoverGroup"]=>
  NULL
  ["whoCanEnterFreeFormTags"]=>
  NULL
  ["whoCanHideAbuse"]=>
  NULL
  ["whoCanInvite"]=>
  NULL
  ["whoCanJoin"]=>
  NULL
  ["whoCanLeaveGroup"]=>
  NULL
  ["whoCanLockTopics"]=>
  NULL
  ["whoCanMakeTopicsSticky"]=>
  NULL
  ["whoCanMarkDuplicate"]=>
  NULL
  ["whoCanMarkFavoriteReplyOnAnyTopic"]=>
  NULL
  ["whoCanMarkFavoriteReplyOnOwnTopic"]=>
  NULL
  ["whoCanMarkNoResponseNeeded"]=>
  NULL
  ["whoCanModerateContent"]=>
  NULL
  ["whoCanModerateMembers"]=>
  NULL
  ["whoCanModifyMembers"]=>
  NULL
  ["whoCanModifyTagsAndCategories"]=>
  NULL
  ["whoCanMoveTopicsIn"]=>
  NULL
  ["whoCanMoveTopicsOut"]=>
  NULL
  ["whoCanPostAnnouncements"]=>
  NULL
  ["whoCanPostMessage"]=>
  NULL
  ["whoCanTakeTopics"]=>
  NULL
  ["whoCanUnassignTopic"]=>
  NULL
  ["whoCanUnmarkFavoriteReplyOnAnyTopic"]=>
  NULL
  ["whoCanViewGroup"]=>
  NULL
  ["whoCanViewMembership"]=>
  NULL
  ["internal_gapi_mappings":protected]=>
  array(0) {
  }
  ["modelData":protected]=>
  array(0) {
  }
  ["processed":protected]=>
  array(0) {
  }
}

該当のソースコード

<?php
// read api-client
require_once '[PATH_TO_LIB]/vendor/autoload.php';
// Service Account Credential
putenv('GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_CREDENTIAL_DIR]/service-account.json');

# --------------------------------------
# Set API client.
# --------------------------------------

$client = new Google_Client();

// set Application Name
$client->setApplicationName("google_group_setting_api");

// set Credential
$client->useApplicationDefaultCredentials();

// set Scope
$client->setScopes(array(
        'https://www.googleapis.com/auth/apps.groups.settings'
));
// set User (AdminUser)
$client->setSubject('[Auth UserAccount]');

# ---------------------------------------
# construct the service object.
# --------------------------------------

$service = new Google_Service_Groupssettings($client);

# -------------------------------------
# Get Group Setting
# -------------------------------------

$groupKey = "[Group MailAddress]";

$settings = $service->groups->get($groupKey);

var_dump($settings);

?>

試したこと

公式リファレンスのAPI Explorerから同様のAPIをOAuthで認証し、実行すると、
正しく結果を取得することができました。
現在、サービスアカウントを利用していることが原因の線も調査しています。

補足情報(FW/ツールのバージョンなど)

・OS / PHPバージョン

# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
# php -v
PHP 5.4.16 (cli) (built: Nov  1 2019 16:04:20) 
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

自己解決しました。
どうやら、実行結果をjsonで帰ってくるように指定しないと、正しく結果が取得できないようです。

// [重要] jsonで帰ってくるように指定
$optParams = ["alt" => "json"];

$groupKey = "[Group MailAddress]";

$settings = $service->groups->get($groupKey$optParams);

var_dump($settings);

結局GoogleのPHPライブラリを解読する形になりましたが、
decodeHttpResponce関数内で、
戻り値の型を指定された場合にjson_decodeを行っています。

// vendor/google/apiclient/src/Google/Http/REST.php
// line103~
  public static function decodeHttpResponse(
      ResponseInterface $response,
      RequestInterface $request = null,
      $expectedClass = null
  ) {
    $code = $response->getStatusCode();
    // retry strategy
    if (intVal($code) >= 400) {
      // if we errored out, it should be safe to grab the response body
      $body = (string) $response->getBody();

      // Check if we received errors, and add those to the Exception for convenience
      throw new Google_Service_Exception($body, $code, null, self::getResponseErrors($body));
    }

    // Ensure we only pull the entire body into memory if the request is not
    // of media type
    $body = self::decodeBody($response, $request);
    if ($expectedClass = self::determineExpectedClass($expectedClass, $request)) {
      $json = json_decode($body, true);
      return new $expectedClass($json);
    }
    return $response;
  }

何も指定していない場合、xml形式でレスポンスが返ってきて、
それをjson_decodeに突っ込むことで処理ができずにNULLになっていたようです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る