メモりメモる

ハトいエンジニアのアメリカ生活と技術のメモ。

自分自身コンテンツ化生活。VISAカードの履歴をTwitterに流してみた。

シリコンバレーでインターンをはじめて、2週間くらい経ちました。
こちらで生活していると、食事、買い物、色々なモノをクレジットカードで決済してしまう方が楽ということがわかりました。
しかし、使っている感覚を鈍らせてくれるのがクレジットカードの怖いところ。
お金を使いすぎてしまうことが心配でした。

そこで、VISAのギフトカードを買ってみました!
f:id:hatyone:20111230140236j:plain

  • Gift Cardとは

クレジットカード会社から発行されていて、クレジットカードのように使用出来るプリペイドカード。
VISAやアメリカンエクスプレスなど、様々なクレジットカード会社のカードがあります。
スーパーマーケットや薬局に売っていて、50〜500ドルなど入金したい分と手数料(アクティベーション・フィー)をレジで支払います。
購入したギフトカードに対して、後から追加入金したい場合はソーシャルセキュリティーナンバーが必要になるので少し大変です。


このクレジットカード。気軽にオンラインから利用履歴を見ることができます。
f:id:hatyone:20111230142437p:plain


そこで、クレジットカードの買い物履歴をツイートするスクリプトを書いてみました。
買い物した内容や価格がツイートされるので、無駄遣いを抑制することが出来るかもしれません。

f:id:hatyone:20111230144327p:plain


流れとしては、こんな感じです。

  • visaのサイトへログイン
  • クレジットカード情報をスクレイピング
  • 情報をjsonで取得
  • twitterで認証
  • ツイート


hatone/visatter -GitHub

use strict;
use warnings;
use utf8;

use HTTP::Cookies;
use HTTP::Request::Common;
use LWP::UserAgent;
use JSON::XS;
use Data::Dumper;
use Net::Twitter;
use Encode;

#クレジットカードの情報
my $card_number = "hogehoge";
my $security_code = "hogehoge";
my $formdata = {
    'CardNumber'    => $card_number,
    'SecurityCode'   => $security_code,
    'Last4OfPhone'    => 'hogehoge',
};

#twitterのauth情報
my $consumer_key = 'hoge';
my $consumer_key_secret = 'hoge';
my $access_token = 'hoge';
my $access_token_secret ='hoge';

my $ua = new LWP::UserAgent;
#fileopen(read)
my $file = 'visatter';
open(LOG, "<$file") or die "$!";
my $line = <LOG>;
close(LOG);
my $response = $ua->request(
    HTTP::Request::Common::POST(
        'https://mygift.giftcardmall.com/MyCard/',
        $formdata,
    )
);

# cookie_jar の生成、
# それから UAcookie (セッション情報)をセットする。
my $cookie_jar = HTTP::Cookies->new( autosave => 1 );
 $cookie_jar->extract_cookies( $response );

$ua->cookie_jar( $cookie_jar );

unless( $cookie_jar->as_string ){
    print "login failed.";
    exit;
}

#return $ua;
print "login ok\n";
my $res = $ua->post(
    "https://mygift.giftcardmall.com/TransactionHistory/_Index",
    {
        #none
    },
    "X-Requested-With" => "XMLHttpRequest"
);

my $res_json = decode_json($res->content);

#print $res_json->{data}[0]->{Description};
my $min_balance = $line;
foreach my $transaction (@{$res_json->{data}}){
    my $d = $transaction->{POSDate};
    $d =~ s/T/-/;
    $d =~ s/\./-/;
    my @sd = split(/-/,$d);

    my $res_s = "はとねが ".$transaction->{Description}.", ".$transaction->{MerchantCity}." ".$transaction->{MerchantState}." で ".$transaction->{Amount}." を".$transaction->{Type}."しました。"." #はとったー\n";

    $res_s =~ s/<.*>-//;
    $res_s =~ s/<\/.*>//;
    print encode('utf-8', $res_s);
   
    my $balance = $transaction->{Balance} || 0;
    $balance =~ s/\$//;
    if( (int($line) > int($balance)))
    {

        my $nt = Net::Twitter ->new (
                    traits => ['API::REST' ,'OAuth'],
                    consumer_key => $consumer_key,
                    consumer_secret => $consumer_key_secret,
                                                );
        $nt -> access_token($access_token);
        $nt -> access_token_secret($access_token_secret);
        if(int($balance) < int($min_balance)){
            $min_balance = $balance;
        }
        print "tweet!\n";
       
        my $res = $nt->update({status => $res_s });
   
    }

}
open(LOG, ">$file") or die "$!";
print LOG $min_balance;
close(LOG);
 
print "\n";