AppSalesへの過去の売り上げ情報の取り込み

AppSales-Mobileに先日のRubyスクリプトでPCでバックアップしたファイルを取り込むためのコードを書いてみました。


1. AppSales-MobileのClasses/Controller/ReportManager.mの40行目あたりに次のコードを入れる。

 	NSString *path = [[NSBundle mainBundle] resourcePath];
	NSArray *filenames_ = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL];
	
	for (NSString *filename in filenames_) {
		if (![[filename pathExtension] isEqual:@"txt"]){
			continue;
		}
		NSString *fullPath = [path stringByAppendingPathComponent:filename];	
		NSString *text = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:NULL];
		Day* day = [[Day alloc] initWithCSV:text];
		if([filename length] == 14){	//MM_DD_YYYY.txt
			day.name = [NSString stringWithFormat:@"%@/%@/%@", [filename substringWithRange:NSMakeRange(0, 2)], [filename substringWithRange:NSMakeRange(3, 2)], [filename substringWithRange:NSMakeRange(6, 4)] ];
		}else{	//MM_DD_YYYY to MM_DD_YYYY.txt
			day.name = [NSString stringWithFormat:@"%@/%@/%@", [filename substringWithRange:NSMakeRange(14, 2)], [filename substringWithRange:NSMakeRange(17, 2)], [filename substringWithRange:NSMakeRange(20, 4)] ];
			day.isWeek = YES;
		}
		NSString *f = [[self docPath] stringByAppendingPathComponent:[day proposedFilename]];
		[NSKeyedArchiver archiveRootObject:day toFile:f];
	}

2. Resourcesにバックアップしたtxtをコピー。
3. 変更済みのAppSales-Mobileでいったん立ち上げる -> AppSales-MobileのDay形式のファイルがDocumentsディレクトリに作成されます
4. 変更されたAppSales-Mobileに、通常版のAppSales-Mobileを上書きして利用する

という手順で、いい感じにAppSales-Mobileを使えるかなぁ。

iTunes ConnectからSalesを取得するスクリプト

売り上げ推移を毎日記録しておきたいなぁと思ったので、iphoneアプリで稼げるのかさんで公開されているRubyスクリプトベースで、iTunes ConnectからSalesを取得するRubyスクリプトを自分用に作り直してみました。
AppSales-Mobileで見やすくiPhoneでチェックできるのですが、まぁ、自己満足みたいなものです。

特徴としては、

  • 今のiTunes Connectの今(2010/01/11)の構成に対応
  • リストからすべてのDaily/Weeklyのレポートをいったん取得
  • ダウンロード済みのファイルと内容の差異を確認して、異なればファイルに保存

するようにしたので、毎日実行しなくても大丈夫なはず。

require 'rubygems'
require 'mechanize'

####################
#itunes conncetアカウント
$id = 'foo'
$pass = 'bar'
####################
 
def login(agent)
  login_page = agent.get("https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa")
  login_form = login_page.forms[0]
  login_form['theAccountName'] = $id
  login_form['theAccountPW'] = $pass
  home = agent.submit(login_form)
end

def checkAndSave(filename, body)
  original = String.new filename
  i = 1
  while true do
    if(File.exist?(filename)) then
	  f = open filename
	  s = f.read
	  f.close
	  if(s == body) then
	    return
	  end
	  filename = "#{original}.#{i}"
	  i += 1
	else
      f = open(filename, "wb")
      f.write body
      f.close
	end
  end
end

def download(agent)
  sales_page = agent.get("https://itts.apple.com/cgi-bin/WebObjects/Piano.woa")
  sales_form = sales_page.forms[1]
  sales_form['11.9']='Summary'
  sales_form['11.11'] = 'Daily'
  sales_form['hiddenSubmitTypeName'] = 'ShowDropDown'
  
  download_page = agent.submit(sales_form)
  download_form = download_page.forms[1]
  download_form.field_with(:name => '11.13.1').options.each do |option|
    download_form['11.9']='Summary'
    download_form['11.11'] = 'Daily'
    download_form['11.13.1'] = option.value
    download_form['hiddenSubmitTypeName'] = 'Download'
    download_form['download'] = 'Download'
	filename = "#{option.text.gsub('/', '_').downcase}.txt"
	body = agent.submit(download_form).body
	checkAndSave(filename, body)
  end
  
  sales_page = agent.get("https://itts.apple.com/cgi-bin/WebObjects/Piano.woa")
  sales_form = sales_page.forms[1]
  sales_form['11.9']='Summary'
  sales_form['11.11'] = 'Weekly'
  sales_form['hiddenSubmitTypeName'] = 'ShowDropDown'
  
  download_page = agent.submit(sales_form)
  download_form = download_page.forms[1]
  download_form.field_with(:name => '11.15.1').options.each do |option|
    download_form['11.9']='Summary'
    download_form['11.11'] = 'Weekly'
    download_form['11.15.1'] = option.value
    download_form['hiddenSubmitTypeName'] = 'Download'
    download_form['download'] = 'Download'
	filename = "#{option.text.gsub('/', '_').downcase}.txt"
	body = agent.submit(download_form).body
	checkAndSave(filename, body)
  end
end

agent = WWW::Mechanize.new

login agent
download agent

$id = 'foo', $pass = 'bar'に自分のアカウントを設定し、事前に保存対象のディレクトリにcdして使ってください。また、事前にgemでMechanizeをインストールする必要があります。手元のWindows(Cygwin), Mac環境で動作しました。

PDIC Users Pageさんの英和,和英,英英辞典

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=346546622&mt=8iTunesで開く


辞書の追加方法で簡単に紹介させていただいた,PDIC Users Pageさんの辞書を試しました.

PDIC形式で,英和(PDEJ2005),和英(PDEDICT)そして,英英(PDWD1913)辞典を公開されています.


気づいた注意点:

  • 大文字/小文字を区別します.
  • 和英で「りんご」や「リンゴ」では引けず「林檎」で引く必要があった(pdicoの仕様で見出し語前方一致でのみ検索するため)

あけましておめでとうございます。

年末にSubmitしたpdicoのver1.0.1へのバージョンアップが無事にReady for Saleになりました。

Date User Status
December 31, 2009 13:54 Apple Ready for Sale
December 29, 2009 10:28 Apple In Review
December 28, 2009 20:43 kkatsuyoshi Waiting For Review

(*日時はいずれもPST)

前回はSubmitから5日間でReady for Sale, 今回はマイナーバージョンアップのためか、3日程度で通過しました。

今回のSubmitでわかったことは...

  • 晦日も稼働日
  • バージョンアップすると、古い方の(今回の場合ver1.0)Recent Activityが消える(Reviewにかかった日数などの情報が見れなくなる)
  • 売れてないアプリでも、区別せずレビューしてもらえる(多分)

対応iPhone OSについて!

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=346546622&mt=8iTunesで開く

iTunes App Store上では、条件として「iPhone OS 2.1以降」となっていますが、実際は「iPhone OS 3.0以降」が必要です。iTunes Connectの説明文にも追記しましたが、iTunes App Storeに書かれた要件欄の反映にはバイナリの差し替えが必要なため、しばらく時間がかかります。

→バイナリがver1.0.1に更新され、iTunes App Store上も3.0以降になりました。

updateをsubmit

pdicoのver1.0.1をiTunes Connectに送信しました。このブログにもあげた2点バグ修正とiPhone OSの要件の修正になります。

December 28, 2009 20:43にSubmitして、December 29, 2009 10:28にIn Review
年末なのに、素早い対応で嬉しい限りです!

デモムービーを作成しました。

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=346546622&mt=8iTunesで開く

実際にiPhone 3GS(実機)でpdicoを動作させた様子を、デモムービーとしてYouTubeに上げました。


  • pdicoの起動
  • 辞書の追加
    • 辞書の名称を入力
    • 指定されたアドレスへのPCのブラウザ(Safari)からのアクセス
    • PCのブラウザを利用した辞書ファイル(英辞郎)のアップロード
  • 追加された辞書の確認
  • 辞書の利用(apple, thankなどを引いたりしている様子)

などを撮影しました。どんな感じで動作するか見ていただけると幸いです。