環境
MacOS Mojave(10.14.3)
Ruby 2.5.1
rails 5.2.2
rails apiモードでフォルダ作成済み
手順
0.必要なGemをインストール
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しているものは後で必要になるので、先に記述しておきます。
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を叩く
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ファイルを解凍し、変数に格納
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が表示されます。
2-2.config/initializersフォルダにファイルを作成
require "slack"
Slack.configure do |config|
config.token = "取得したトークン"
end
2-3.Slack APIを使ってテキストを送信
class ApplicationController < ActionController::API
〜省略〜
Slack.chat_postMessage(text: data, username: '任意のユーザーネーム', channel: '#チャンネル名')
end
テキストメッセージ欄に先ほどの変数"data"を入れ、完成です。
全体像
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
AppStoreConnect API 公式サイト/Download Sales and Trends Reports
App Store Connect APIを利用してアプリ情報を取得する
Slack APIのTokenの取得・場所
[Rails slack連携をしてみた]
(https://qiita.com/shizuma/items/19879ec0b5cc11ce1f79)
How to decompress Gzip string in ruby?