awsを使ってiOSアプリのダウンロード数を自動取得してslackに連携してみた
チームで開発を行っていると、開発管理者から今日のダウンロードどのくらい?と聞かれることがあります。
特にiOS実装担当者が一人しかいないと、一旦脳内コードのキャッシュを消去して
itunesconnectにログインして、sales and trendを見にいく...
でも年をとると一度別のタスクに従事すると再度元のプログラム脳状態に戻るのに時間がかかってしまいます。
これは無駄ですよね。
なので、聞かれて調べる前に自動でダウンロード数を更新する方法をご紹介します。
最近のスタートアップだと、slackを使っているチームも多いと思うので
今回はアプリのインストール数を定期的にslackに投稿する方法をご紹介します。
aws経由で投稿する理由は、いわずもがなcronを使いたいからなのですが、
一定の条件さえクリアすればどれでも大丈夫です。
なので、今回は細かいawsの使い方などは解説しません。あしからず。
その唯一の条件が、javaが実行できるかどうかです。
確認のためjavaと入力してください。
[ec2-user@ip-172-31-4-212 ~]$ java 使用方法: java [-options] class [args...] ...以下省略
となればjavaの環境があるのでそのままで大丈夫です。
-bash: java: コマンドが見つかりません or command not found
みたいな感じになったらjava がないのでここらへんからインストールをしてください。
次に必要なのがapple公式のコマンドラインツールAutoingestionのダウンロードです。
Autoingestionについてはこちらから取得できます。
2015年7月最新時点で、9ページ目にあるAutoingestion.classを適当な場所にダウンロードしてください。
まずは、端末上での取得できるかの確認をします。
ダウンロードしたディレクトリに移動してautoingestion.propertiesというファイルを開いて以下のように入力します。
userID = *********** password = *****************
それぞれitunesconnectにログインするときのアイパスになります。
terminalを開いて先ほどAutoingestion.classをダウンロードした場所にカレントディレクトリを移動して、以下を実行します。
java Autoingestion autoingestion.properties ************ Sales Daily Summary 20150707
*****はverdor idと呼ばれる、デベロッパーごとに割り振られる8から始まるidになります。
こちらもちょくちょく表示場所が変わるのですが、
2015年7月最新時点で、以下の場所に表示されています(ログイン状態で開いてください。)
以下のように返ってきたら成功です。
5862238 Sales Daily Summary 20150702 S_D_85862238_20150702.txt.gz File Downloaded Successfully
以下、aws側の設定を行います。
まずsshでターミナルからログインします。
ssh -i ~/.ssh/****.pem ec2-user@xx.xx.xx.xx
※
vi ~/.ssh/config で予めHost nameなどを設定しておけばこんな長ったらしいのを入力する必要はありません。
ログインしたら、端末でやったのと同じようにjavaの環境があるか確認してください。
以下もjavaがインストールされている前提でお話しします。
まずローカル環境にダウンロードしたAutoingestion.class及びAutoingestion.propertiesのディレクトリをawsに保存します。
(ローカルにあるAutoingestionディレクトリをscpコマンドでawsに保存する方法)
sudo scp -i ~/.ssh/****.pem -r Autoingestion ec2-user@54.64.146.48:/path/you/want/to/download
※ ****(鍵)とpathは適宜置き換えてください。
できれば上記、pathはcronなどで自動実行できるタスクの位置に保存してください。それか、あとでmvコマンドで移動させて上げる必要があります。
RoRを使っているのであれば、projectFile/lib/tasks/の直下などであればrakeタスクを定期実行する時にやりやすいです。
もちろん、cakeなどの他のプラットフォームでも実行できますが、
(若干オーバースペックですが)せっかくなので今回はRoRを使うことにします。
では、先ほど端末上で実行したjava Autoingestion..をaws上で実行するシェルスクリプトを書きましょう
日時などは常に更新する必要があるので、ここらへんを可変にして随時適切な値が入るようにします。
X日前の入力が入るようにしています。適宜変えてお使いください。
このshellはAutoingestionを保存した場所においてやるといろいろ楽ちんです。
# iTunes ConnectのID VENDOR_ID=********** # 取得したいデータ・タイプ TYPE="Sales Daily Summary" # 取得したいデータの日付 DATE=`date --date="X days ago" +"%Y%m%d"` echo $DATE # 取得したZipファイル名 FILENAME_COMPRESSED="S_D_"$VENDOR_ID"_"$DATE".txt.gz" # Zipファイル解凍後のテキストファイル FILENAME="S_D_"$VENDOR_ID"_"$DATE".txt" #圧縮ファイルのダウンロード java Autoingestion autoingestion.properties $VENDOR_ID Sales Daily Summary $DATE #ダウンロードファイルの解凍 gunzip $FILENAME_COMPRESSED
定期実行するためRoR上でcronの設定を行うために
Gemfileに以下を入力します。
gem 'whenever', :require => false gem 'slack-api'
Gemfileを保存して閉じたあと
bundle update
を実行して更新してください。
wheneverの更新がうまく行くと
プロジェクトファイル/config/schedule.rbに以下を追加します。
every 1.day, at: '8:40 am' do rake "slack:send_message" end
これは毎日8時40分にslack.rakeファイルにあるsend_messageを実行するという意味です。
schedule.rbを入力して保存した後、ターミナル上で以下実行をしてcronを更新するのを忘れないでください。
whenever -i
cronを更新させたら、shell scriptを実行させるため、
crontab -e
と入力してcron設定ファイルを開きます。
すると、
40 8 * * * /bin/bash -l -c 'cd /home/ec2-user/rails/hoge && RAILS_ENV=production bundle exec rake slack:send_message --silent >> log/cron.log 2>> log/error.log'
などとなっていると思いますが、この前に
35 8 * * * /bin/sh /home/ec2-user/rails/hoge/lib/tasks/doAutoingestion.sh
などと入力してあげると毎日8時35分にshell scriptが実行されるようになります。
今までを整理すると
毎日8時35分に「java Autoingestion ...」を実行して前日のアプリインストール情報ファイルをダウンロードして、その五分後にslack.rakeのsend_messageブロックを実行するようにしました。
最後にsend_messageを作成して、shell scriptでダウンロードしたファイルの内容を集計します。
rubyに慣れている人は以下読まないでいいですw
私自身rubyに親しくないため、かなり汚いコードです、なので、自分でできる人は極力自分で良いように集計してください。
それでは、
vim lib/tasks/slack.rake
を実行してrakeファイルを作成してください。
(もちろん、エディタはvimじゃなくても大丈夫です)
以下入力してください(AとBの2つのアプリがある場合)。
task :send_message1 => :environment do |t, args| message = "install速報(ios)" channel = "#ios" num_of_A = 0 #アプリAインストール数 num_of_B = 0 #アプリBインストール数 sku_of_A = "A" sku_of_A = "B" today = (Date.today - 2).to_time todayYYYYMMDD = today.strftime("%Y%m%d") p todayYYYYMMDD filename = "lib/tasks/S_D_85862238_#{todayYYYYMMDD}.txt" line_num = 0 text=File.open(filename).read text.gsub!(/\r\n?/, "\n") text.each_line do |line| which_of_sku = "NULL" word = text word_num = 0 line.gsub!(/\t/, "\n") line.each_line do |word| if ( line_num != 0) then if(word_num == 2) then which_of_sku = word.gsub!(/\n/, "") end if ( word_num == 7) then num_of_install = word.gsub!(/\n/, "") p "#{line_num}行目のインストール数:#{which_of_sku} #{num_of_install}" if (which_of_sku == sku_of_A) then num_of_A += (num_of_install.to_i) p "A : #{num_of_A}" elsif (which_of_sku == sku_of_B) then num_of_B += (num_of_install.to_i) p "B : #{num_of_B}" end #if (which_of_sku == sku_of_A) then end #if ( word_num == 7) then word_num += 1 end #if ( line_num != 0) then end #line.each_line do |word| line_num+=1 end # text.each_line do |line| result = "最新インストール状況:#{todayYYYYMMDD}集計結果: A=#{num_of_A}, B=#{num_of_B}" p result Slack.configure do |config| config.token = "*********************************************************************" end Slack.chat_postMessage(icon_url: "適当なアイコンのurlをセットしてください", username: "iOS速報ちゃんねる" , channel: channel, text: result) end
どうですか、汚いでしょう。ここで晒すには恥ずかしすぎるコードなのですが、
objective-cしか書いたことない私にはこれっぽっちが限界なので、
学習コストとして恥をかきます。
だれか詳しい人がいたら、もっと簡単に書けるよ的な指摘を頂けると助かります。
コード中の
config.token = *********************************************************************
は、トークンコードによってslack-apiがどのスラックチームなのかを判断するために必要な箇所で
こちらから取得してください。
もし朝の8時40分までに待てない人はターミナル上で
/bin/sh doAutoingestion.sh rake slack:send_message
で実行を確認してみましょう。
圧縮ファイルがダウンロードできるかと思います。
発展系として、app storeのレビューを自動取得することもできますし、slackで、昨日のアプリダウンロード数を聞いたら自動的に返信してくれるbotや投稿したメッセージをアプリユーザーにプッシュ通知で投げてくれるbotもありますので、よかったら調べてみてください。