search
LoginSignup
12
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

Organization

SurveyMonkeyのAPIでアンケート結果取得

はじめに

初めまして、k.s.ロジャースの西谷です。
先月は開発を進めていく中でSurveyMonkeyを利用する話があり、API周りを調査しておりました。
公式ドキュメントは充実しておりますが、日本語の記事がなく苦労した覚えがあったため、アンケート回答の取得方法について共有出来たらと思います。
※ SurveyMonkyのAPIを利用するにはプレミアプランが必要です。

間違い・助言等があればコメントにてお知らせいただけたらと思います。

SurveyMonkeyとは

SurveyMonkeyはアンケート管理システムで、Web上でアンケートの作成・収集・集計を一括で行うことが出来ます。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3237343637342f66626334313136302d666136342d313935322d326161652d6164626533366162323839652e706e67.png
このようにGUIからアンケートを作成できます。
アンケート作成後はメール・URL・SNSなどから送信することができます。

今回は画面で作成したアンケートに回答したときに、APIでシステム側に通知する仕組みを紹介したいと思います。

SurveyMonkeyのデータ構造

SurveyMonkeyのデータ構造は下図のようになっています。
APIからアンケートの内容とユーザの回答内容を知ることが出来ます。
image.png

アプリの登録

  1. 開発者画面Add a New Appから新規アプリを作成します。
    image.png

  2. 作成後、SETTINGS画面からScopesを設定します。
    image.png
    利用APIに応じて権限をRequiredに変更します。
    不足している場合はAPIでPermission Errorが出ますので、エラーを見てから変更でもいいかもしれません。

OAuth認証

登録アカウントの認証を行い、アクセストークンを取得します。

APIでアクセストークン取得

  1. 以下APIを実行します
    [GET] https://api.surveymonkey.com/oauth/authorize

    パラメータ
    response_type code
    redirect_uri SETTING画面のOAuth Redirect URL
    client_id SETTING画面のClient ID
  2. SurveyMonkeyにログインすると、redirect_uriにcodeが届きます。

  3. トークン発行のAPIを実行します

RESTクライアントでcodeの一部がエスケープされて認証失敗する場合があるのでご注意ください。
[POST] https://api.surveymonkey.com/oauth/token

{
    "client_id": {SETTING画面のClient ID},
    "client_secret": {SETTING画面のSecret},
    "code": {redirect_uriに届いたcode},
    "redirect_uri": {SETTING画面のOAuth Redirect URL},
    "grant_type":"authorization_code"   
}

成功すると以下のようなレスポンスが得られますので、access_tokenを保存します。

{
  "access_token": "hogehoge",
  "token_type": "bearer",
  "access_url": "https:\/\/api.surveymonkey.com",
  "expires_in": null
}

現時点(2019/2)では、SurveyMonkeyのアクセストークンは無期限であるが、有効期間が追加される可能性があります。

APIからアンケート結果収集

ログインしてアクセストークンを取得出来ましたので、アンケート取得について説明します。
取得手順の概要は以下になります。
1. 回答を収集するアンケートのIDを取得
2. アンケートに対してWebhookを登録
3. 回答があればコールバックを受け取り、APIから回答内容を取得

以降のAPIはリクエストのHeaderにAuthorization: Bearer アクセストークンを追加して実行します。

アンケートID取得

回答を収集するアンケートのIDのを取得します。
アンケートIDはブラウザから直接確認する方法はないため、APIで取得します。(DevToolsからは取得出来ます)

[GET] https://api.surveymonkey.net/v3/surveys

パラメータ デフォルト値
per_page 1ページに表示する数(最大1000) 50
page 表示ページ 1
title タイトルの絞り込み なし

レスポンスはこのようになります。
こちらのIDをWebhookに登録すればコールバックで回答を知ることが出来ます。

{
  "per_page": 50,
  "total": 100,
  "data": [
    {
      "href": "https:\/\/api.surveymonkey.net\/v3\/surveys\/12345",
      "nickname": "",
      "id": "12345",
      "title": "アンケート1"
    },
    {
      "href": "https:\/\/api.surveymonkey.net\/v3\/surveys\/67890",
      "nickname": "",
      "id": "67890",
      "title": "アンケート2"
    }
    (省略)
  ],
  "page": 1,
  "links": {
    "self": "https:\/\/api.surveymonkey.net\/v3\/surveys?page=1&per_page=50",
    "last": "https:\/\/api.surveymonkey.net\/v3\/surveys?page=20&per_page=50",
    "next": "https:\/\/api.surveymonkey.net\/v3\/surveys?page=2&per_page=50"
  }
}

Webhook登録

以下APIでWebhookの登録ができます。

[POST] https://api.surveymonkey.net/v3/webhooks

{
  "name": {Webhook名},
  "event_type": "response_completed",
  "object_type": "survey",
  "object_ids": [{アンケートID1}, {アンケートID2} ...],
  "subscription_url": {コールバック先}
}

201 Createdのレスポンスが帰ってこれば成功です。

注意点としては登録時にSurveyMonkeyからsubscription_urlに対して、HEADリクエストで疎通確認を行います。
ですので開発側で、subscription_urlのHEADで受信し、200 OKのレスポンスを返すように準備する必要があります。
PHPであれば以下のようなコードで大丈夫です。

public function head_index()
{
    return $this->response(null, $http_code = 200);
}

また、疎通確認のためにローカルで開発する場合はサーバを外部公開する必要があります。
ngrokを利用すると簡単にローカル環境を外部に公開できます。

コールバックから回答内容を取得

Webhook登録後、ユーザが回答完了後にSurveyMonkeyからsubscription_urlにPOSTのリクエストが送信されます。

{
    "event_datetime": "2019-01-01T00:00:00.000000+00:00",
    "resources": {
        "respondent_id": "123456789",
        "recipient_id": "0",
        "user_id": "123456789",
        "collector_id": "123456789",
        "survey_id": "123456789"
    },
    "name": "WebhookName",
    "object_id": "123456789",
    "filter_id": "123456789",
    "event_id": "123456789",
    "object_type": "response",
    "filter_type": "survey",
    "event_type": "response_completed"
}

次にresponseの内容を取得します。
[GET] https://api.surveymonkey.net/v3/collectors/{collector_id}/responses/{respondent_id}/details
レスポンスは長いので一部省略しますが、pagesの部分から回答が分かります。

"pages": [
    {
      "id": "12345", #page_id
      "questions": [
        {
          "id": "12345", #question_id, 
          "answers": [
            {
              "choice_id": "123456789"
            }
          ]
        }
      ]
    }
]

choice_idが分かりましたので、質問詳細を取得してchoice_idが一致するchoicesを探します。
[GET] https://api.surveymonkey.net/v3/surveys/{survey_id}/pages/{page_id}/questions/{question_id}

{
    (省略)
    "choices": [
      {
        "quiz_options": {
          "score": 0
        },
        "visible": true,
        "text": "回答1",
        "position": 1,
        "id": "123456789"
      },
      {
        "quiz_options": {
          "score": 0
        },
        "visible": true,
        "text": "回答2",
        "position": 2,
        "id": "987654321"
      },
      {
        "quiz_options": {
          "score": 0
        },
        "visible": true,
        "text": "回答3",
        "position": 3,
        "id": "192837465"
      }
    ]
    (省略)
}

この例の場合はユーザが回答1を選択したことがわかります。
後は自作システムに回答内容の保存、選択肢によって動作分岐などが出来ると思います。

おわりに

長くなりましたが、SurveyMonkeyのAPIでアンケート回答の取得方法を紹介させて頂きました。
もっとシンプル方法や間違いがあればご指摘頂けたらと思います。

Wantedlyでもブログ投稿してます

Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
12
Help us understand the problem. What are the problem?