App Store Connect APIからアプリの売上情報を取り出して、slackに投げるプログラムを作ってみた。

#環境
MacOS Mojave(10.14.3)
Ruby 2.5.1
rails 5.2.2
rails apiモードでフォルダ作成済み
#手順
##0.必要なGemをインストール
```:Gemfile
gem 'slack-api'
gem 'jwt'
gem 'httparty', '~> 0.13.7'
gem 'zlib', '~> 0.1.0'
```
```
$ bundle install
```
##1.AppStoreConnectからアプリの情報を入手する
####1-1.キー情報を発行し、PRIVATE KEYファイルをlibフォルダ下に配置
以下の記事の通りに、キー情報（Issuer ID、キーID、PRIVATE KEY）を取得します。
https://qiita.com/kurikazu/items/135a791ba09121d7a534
ダウンロードしたPRIVATE KEYファイル(ファイル名.p8)はlibフォルダに配置します。

####1-2.トークンを発行し、変数に格納
Appleが提供しているAPIの叩き方です。
requireしているものは後で必要になるので、先に記述しておきます。

```ruby:application_controller.rb
class ApplicationController < ActionController::API
require 'httparty'
#API用
require 'base64'
require 'jwt'
#gzip解凍用
require 'zlib'
require 'stringio'

$now = DateTime.now
  def iOS
      issure_id = '[Issuer ID]欄に表示された文字列'
      key_id = '[キーID]欄に表示された文字列'
      private_key = OpenSSL::PKey.read(File.read(Rails.root.to_s + "/lib/ダウンロードしたPRIVATE KEYファイル名"))

      $token = JWT.encode(
        {
          iss: issure_id,
          exp: Time.now.to_i + 20 * 60,  # トークンの有効期限は20分以内とAppleが規定している
          aud: 'appstoreconnect-v1'      # audは appstoreconnect-v1 固定
        },
        private_key,
        'ES256', # 署名方式は ES256 固定
        header_fields = {
          kid: key_id
        }
      )
  end
end
```

####1-3.Httpartyを使ってAPIを叩く
```ruby:application_controller.rb
class ApplicationController < ActionController::API

  〜省略〜

  response = HTTParty.get 'https://api.appstoreconnect.apple.com/v1/salesReports', headers:{"Accept" => "application/a-gzip", :Authorization => "Bearer #{$token}"}, :query => {"filter[frequency]": "DAILY", "filter[reportDate]": $now.strftime('%Y-%m-%d'), "filter[reportSubType]" => "SUMMARY", "filter[reportType]" => "SALES", "filter[vendorNumber]" => "ベンダー番号"}
```
Queryパラメータの詳細はこちら
https://developer.apple.com/documentation/appstoreconnectapi/download_sales_and_trends_reports
####1-4.gzファイルを解凍し、変数に格納
```ruby:application_controller.rb
class ApplicationController < ActionController::API

  〜省略〜

   gz = Zlib::GzipReader.new(StringIO.new(response.body.to_s))
   data = gz.read
  end
end
```
これで、"data"にファイルが格納されました。
##2.Slackのトークンを作成する
####2-1.以下のサイトで、トークンを作成
https://api.slack.com/custom-integrations/legacy-tokens
"create token"を押すと、tokenカラムにそのルームのtokenが表示されます。
<img width="662" alt="スクリーンショット 2019-03-23 14.50.13.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/27e12064-f6ee-4444-fff3-bffab221e944.jpeg">

####2-2.config/initializersフォルダにファイルを作成
```config/initializers/slack_api.rb
require "slack"

Slack.configure do |config|
  config.token = "取得したトークン"
end
```
####2-3.Slack APIを使ってテキストを送信
```ruby:application_controller.rb
class ApplicationController < ActionController::API

  〜省略〜

  Slack.chat_postMessage(text: data, username: '任意のユーザーネーム', channel: '#チャンネル名')
end
```
テキストメッセージ欄に先ほどの変数"data"を入れ、完成です。
#全体像
```ruby:application_controller.rb
class ApplicationController < ActionController::API
require 'httparty'
#API用
require 'base64'
require 'jwt'
#gzip解凍用
require 'zlib'
require 'stringio'

$now = DateTime.now
  def iOS
      issure_id = '[Issuer ID]欄に表示された文字列'
      key_id = '[キーID]欄に表示された文字列'
      private_key = OpenSSL::PKey.read(File.read(Rails.root.to_s + "/lib/ダウンロードしたPRIVATE KEYファイル名"))

      $token = JWT.encode(
        {
          iss: issure_id,
          exp: Time.now.to_i + 20 * 60,  # トークンの有効期限は20分以内とAppleが規定している
          aud: 'appstoreconnect-v1'      # audは appstoreconnect-v1 固定
        },
        private_key,
        'ES256', # 署名方式は ES256 固定
        header_fields = {
          kid: key_id
        }
      )

   response = HTTParty.get 'https://api.appstoreconnect.apple.com/v1/salesReports', headers:{"Accept" => "application/a-gzip", :Authorization => "Bearer #{$token}"}, :query => {"filter[frequency]": "DAILY", "filter[reportDate]": $now.strftime('%Y-%m-%d'), "filter[reportSubType]" => "SUMMARY", "filter[reportType]" => "SALES", "filter[vendorNumber]" => "ベンダー番号"}
   gz = Zlib::GzipReader.new(StringIO.new(response.body.to_s))
   data = gz.read

   Slack.chat_postMessage(text: data, username: '任意のユーザーネーム', channel: '#チャンネル名')
  end
end
```
※ベンダーIDはiTunes connectの"売上とトレンド"で確認できます！
#参考

[Generating JWT Tokens for App Store Connect API](https://medium.com/xcblog/generating-jwt-tokens-for-app-store-connect-api-2b2693812a35)
[AppStoreConnect API 公式サイト/Download Sales and Trends Reports](https://developer.apple.com/documentation/appstoreconnectapi/download_sales_and_trends_reports)
[App Store Connect APIを利用してアプリ情報を取得する](https://qiita.com/kurikazu/items/135a791ba09121d7a534)
[Slack APIのTokenの取得・場所](https://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)
[Rails slack連携をしてみた]
(https://qiita.com/shizuma/items/19879ec0b5cc11ce1f79)
[How to decompress Gzip string in ruby?](https://stackoverflow.com/questions/1361892/how-to-decompress-gzip-string-in-ruby)