Twitterにパケット代を投稿するpacketterを、My SoftBankがリニューアルしたのでまた更新

以前作ったpacketterだけど、My SoftBankがリニューアルして、ログイン方法がかわったりhtmlが変わったりしたので、直した。

packetterってなに?

カンタンに言うと、SoftBankのパケット代(パケット定額で割引される前の、使ったデータを元に算出してる金額)を自動的にTwitterにポストするRubyのプログラム。

まあ詳しくは以前の記事を参照。

packetter.rb

#!/usr/bin/ruby -Ku

require 'rubygems'
require 'mechanize'
require 'nkf'
require 'open-uri'
require 'net/http'
require 'erb'

load File.join(File.dirname(__FILE__), 'config.rb')

# logger
#require 'logger'
#Mechanize.log = Logger.new('packetter.txt')
#Mechanize.log.level = Logger::DEBUG

# setup
puts 'setup...'
agent = Mechanize.new
agent.follow_meta_refresh = true
agent.user_agent = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A345 Safari/525.20'

# login
puts 'login...'
agent.get('https://my.softbank.jp/msb/d/top')
agent.page.forms.first.field_with(:name => 'msn').value = $my_softbank[:user_id]
agent.page.forms.first.field_with(:name => 'password').value = $my_softbank[:password]
agent.page.forms.first.click_button

# jumo to mainmenu
puts 'jump to mainmenu...'
agent.get('https://my.softbank.jp/msb/d/webLink/doSend/WCO010000')

# jump to bill_before_fixed
puts 'jump to bill_before_fixed...'
agent.get('https://bl11.my.softbank.jp/wco/billBeforeFixed/WCO020')

# get contents
td = agent.page.search('form[@name="billBeforeFixedActionForm"]').inner_text.gsub(/[\r\n]/, '')

# date
td =~ /([0-9]+[0-9]+)/
date = $1
puts "date : #{date}"

# packet fee
list = td.scan(/通信料.+?([0-9,]+)/)
fee = 0
list.each do |item|
  fee += item[0].gsub(/,/, '').to_i
end
fee = "#{fee.to_s.gsub(/(.*\d)(\d\d\d)/, '\1,\2')}"
puts "packet fee : #{fee}"

# latest file
latest_file = File.join(File.dirname(__FILE__), 'latest')

# load latest and compare
if File.exist?(latest_file)
  puts 'load latest...'
  f = open(latest_file)
  latest = f.read.chomp
  f.close

  # compare
  fee_new = fee.delete(',').to_i
  fee_old = latest.delete(',').to_i
  fee_diff = fee_new - fee_old
  if fee_diff < 0
    diff = ''
  else
    diff = " (+#{fee_diff.to_s.gsub(/(.*\d)(\d\d\d)/, '\1,\2')}円)"
  end
  puts "diff : #{diff}"
end

# save latest
f = File.open(latest_file, 'w')
f.puts fee
f.close

# post
puts 'post...'
Net::HTTP.version_1_2
Net::HTTP.start('twitter.com', 80) do |http|
  req = Net::HTTP::Post.new('/statuses/update.xml')
  req.basic_auth $twitter[:user_id], $twitter[:password]
  req.body = 'status=' + ERB::Util.u("#{date}までのSoftBankパケット通信料 : #{fee}#{diff} http://tinyurl.com/packetter")
  res = http.request(req)
end

puts 'finished.'

config.rb

$my_softbank = {
  :user_id => '09099999999',
  :password => 'p@ssw0rd',
}

$twitter = {
  :user_id => 'twitter_user_id',
  :password => 'p@ssw0rd',
}

以前のバージョンとは設定内容が変わった。My SoftBank側が電話番号とパスワードでログインするようになったので、それに合わせた。

事前にMy SoftBankのサイトで新しいログインアカウントに移行する手続きをやっておく必要があるよ。

メモ

まだ数日間しかテストしてないので、時期によってはバグがあるかも。2ヶ月分の料金が見れるようになったタイミングや、月またぎのところが自信ない。

Windowsだと文字化けするから、さくらインターネットで動かすことに

作ってるときはMacだったんだけど、うちの運用環境はWindowsの常時稼働PC。ところが、これをWindowsで動かすと、htmlをパースして中身を取り出すところで文字化け(正確にいうと、文字と文字の間に半角カナの「ツ」が入ってムチャクチャになる現象)が起きて、どうにもならない感じ。非常に困った。誰か助けて欲しい。

そこで、さくらインターネットレンタルサーバにこのスクリプトを置いてそっちで動かすことにした。さくらインターネット上にRubyGemsをインストールしてMechanizeを入れたり、環境変数を設定してcronを仕込んだりするので結構苦労したけど、ググりながらがんばったら無事にできた。