第2回 Zendesk APIとRailsでチケット管理してみよう − 連載 Zendeskで顧客サポート

`別サイトで2014/4/23に投稿した記事です。別サイト閉鎖につき、移転しました。情報が古い可能性があるので、ご注意ください。`

## やること
第1回でご紹介した通り、Zendeskはブラウザから使えますが、Zendesk APIを利用すると、Webサイトと連携することができます。
今回は、Ruby on Railsを使って、Zendesk APIにアクセスし、Zendeskのチケットを表示してみます。

## 今回使うgem
Rails(Ruby)からZendesk APIにアクセスするために、Zendeskから"[zendesk_api](https://github.com/zendesk/zendesk_api_client_rb)"gemが提供されています。

READMEに設定方法が書かれているので、ざっくりご覧ください。

## Ruby on Railsで実装してみよう
### 準備
    rails new zendesk_api_with_rails
    cd zendesk_api_with_rails

### Zendesk APIのgemを追加
Gemfile に↓を追加して、

```
gem 'zendesk_api'
```

インストールします。

    bundle install

### Zendesk APIにアクセスに必要な情報を集める
APIアクセスには、ユーザ名/パスワードかユーザ名/APIトークンのいずれかを使います。
今回は、ユーザ名/APIトークンでアクセスしてみます。

* Zendeskにログインして、
* 「管理」ー「チャネル」ー「API」をクリックし、
* 「トークンアクセス」を有効にして、APIトークンします。
* すぐ下にcurlコマンドが表示されているので、「YOUR_TOKEN」の部分を自分用のAPIトークンに入れ替えて、ターミナルで実行してみてください。

    curl -u xxx@example.com/token:YOUR_TOKEN https://xxx.zendesk.com/api/v2/users/me.json

#### Zendesk APIクライアント用ファイルを追加
Zendesk APIクライアントを取得するため、config/initializersに、zendesk_api_init.rbを作成します。

いろいろ書いてありますが、設定するのはENV['...']がある3箇所だけです。

```
class ZendeskApiInit
  def self.client
    @client ||= ZendeskAPI::Client.new do |config|
      # Mandatory:

      config.url = ENV['ZENDESK_URL'] # e.g. https://mydesk.zendesk.com/api/v2

      # Basic / Token Authentication
      config.username = ENV['ZENDESK_USERNAME']

      # Choose one of the following depending on your authentication choice
      config.token = ENV['ZENDESK_TOKEN']
      # config.password = "your zendesk password"

      # OAuth Authentication
      # config.access_token = "your OAuth access token"

      # Optional:

      # Retry uses middleware to notify the user
      # when hitting the rate limit, sleep automatically,
      # then retry the request.
      config.retry = true

      # Logger prints to STDERR by default, to e.g. print to stdout:
      require 'logger'
      config.logger = Logger.new(STDOUT)

      # Changes Faraday adapter
      # config.adapter = :patron

      # Merged with the default client options hash
      # config.client_options = { :ssl => false }

      # When getting the error 'hostname does not match the server certificate'
      # use the API at https://yoursubdomain.zendesk.com/api/v2
    end
  end
end
```

#### 環境変数を設定
zendesk_api_init.rbで使用する環境変数を設定します。環境変数はENV['xxx']を使って、アクセスできます。

```
# Zendesk
export ZENDESK_USERNAME=xxx
export ZENDESK_TOKEN=xxx
export ZENDESK_URL=https://xxx.zendesk.com/api/v2
```

.bash_profile 辺りに上記の環境変数を設定しておくと便利です。

設定後、

    source ~/.bash_profile

コマンドを実行して、追加した環境変数を有効にするのをお忘れなく。

#### Zendesk APIクライアントの動作確認

    rails console
    > client = ZendeskApiInit.client # クライアントを作成
    > client.tickets.first # 最初に作成したチケットを取得する

### ブラウザからチケットを表示
ブラウザからチケットを表示するために、コントローラとビューを追加します。

#### コントローラとビューを追加
コントローラzendesk_tickets_controller.rbを作成し、indexメソッドを追加します。

```
class ZendeskTicketsController < ApplicationController
  def index
    @tickets = ZendeskApiInit.client.tickets.page(1).per_page(10) # 10チケットを取得して、最初の1ページ目を表示。pageメソッドが表示されるページで、per_pageメソッドがページに表示するデータ数。
  end
end
```

apps/viewsにzendesk_ticketsディレクトリを作成し、index.html.erbを作成します。

```
<h1>ZendeskTickets#index</h1>

<table>
  <thead>
    <tr>
      <th>Id</th>
      <th>Subject</th>
      <th>Description</th>
      <th>Created at</th>
    </tr>
  </thead>

  <tbody>
    <% @tickets.each do |ticket| %>
      <tr>
        <td><%= ticket.id %></td>
        <td><%= ticket.subject %></td>
        <td><%= ticket.description %></td>
        <td><%= ticket.created_at %></td>
      </tr>
    <% end %>
  </tbody>
</table>
```

### ルーティングの設定
config/routes.rb に ルーティング設定をします。

```
get "zendesk_tickets/index"
```

#### チケット一覧を確認
[http://localhost:3000/zendesk_tickets/index](http://localhost:3000/zendesk_tickets/index)にアクセスしてみましょう！

＊scaffold.css.scssをコピーしてくると、見た目がややマシになります（笑

#### 個別チケット確認のために、コントローラとビューを更新・追加
コントローラzendesk_tickets_controller.rbを作成し、showメソッドを追加します。

```
def show
  @ticket = ZendeskApiInit.client.tickets.find(id: params[:id])
end
```

個別チケットページに遷移しやすいように、indexページのSubjectにリンクを設置します。

```
<% @tickets.each do |ticket| %>
  <tr>
    <td><%= ticket.id %></td>
    <td><%= link_to ticket.subject, "/zendesk_tickets/#{ticket.id}" %></td>
    <td><%= ticket.description %></td>
    <td><%= ticket.created_at %></td>
  </tr>
<% end %>
```

### ルーティングの設定
config/routes.rb に showメソッドへのルーティングを設定します。

```
get "zendesk_tickets/:id" => "zendesk_tickets#show"
```

#### チケット作成の確認
[http://localhost:3000/zendesk_tickets/index](http://localhost:3000/zendesk_tickets/index)にアクセスして、Subjectをクリックしてみましょう！

＊チケットが存在していなければ、もちろん、表示されません。
その場合は、チケットを作成してから試してみてください。

## まとめ
うまく動いたでしょうか？

本当は、チケットの作成までやるつもりでしたが、結構長くなってきたので、一旦終わりにします。
あとは、[zendesk_api gemのREADME](https://github.com/zendesk/zendesk_api_client_rb)を参考にやってみてください。

Zendesk APIによって、Zendeskで蓄積した電話やメールなどの顧客対応履歴を、Webサイトの動きに反映できます。 また逆方向に、Webサイトでの顧客の行動（サポート依頼、苦情、資料請求など）を、Zendeskのチケットとして蓄積することもできます。

クラウド以前は、こういうことをするのはなかなか大変なことでしたが、今ではZendesk APIを叩けば、チケットデータを出し入れできます。本当にすごい時代になったものです。

どのように活用して、お客さんに価値を提供できるか、考えてみてはいかがでしょうか。

## サンプルコードのダウンロード
上記のサンプルコードは、Githubよりダウンロードできます。

[https://github.com/fuji3zpg/zendesk_api_show_tickets](https://github.com/fuji3zpg/zendesk_api_show_tickets)

## 参考情報
* Railsの実装周りは、"[zendesk_api](https://github.com/zendesk/zendesk_api_client_rb)"gemのREADME・Wiki・テストコードが参考になります。
* Zendesk APIの公式記事は、Zendesk APIに関する概説があります。
ググってみたら、"zendesk_api_client_rb"gemに関する情報は↓のZendesk公式API以外にはほぼない感じでした。なので、英語ですが、まずはこのページをじっくり読むのがいいと思います。

[http://developer.zendesk.com/documentation/rest_api/introduction.html](http://developer.zendesk.com/documentation/rest_api/introduction.html)