11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DoCoMoの請求書をPDF保存

Last updated at Posted at 2013-11-17

DoCoMoのWEB請求書をPDF保存する。

docomo.rb
# !/usr/bin/env ruby
# coding: utf-8
$KCODE='u'         if  RUBY_VERSION.to_f < 1.9
require 'rubygems' if RUBY_VERSION.to_f < 1.9

module BillScraper

	class MyDoCoMo
		require 'pp'
		require 'mechanize'
		require 'nkf'
		require 'kconv'
		require 'scanf'
		class Mechanize::HTTP::Agent
			def post_connect uri, response, body_io # :yields: agent, uri, response, body
				@post_connect_hooks.each do |hook|
					begin
						hook.call self, uri, response, body_io
					ensure
						body_io.rewind
					end
				end
			end
		end
		attr_accessor :m
		def initialize( id=nil, password=nil )
			@m = Mechanize.new
			@m.user_agent_alias = 'Windows IE 7'
			@@id = id
			@@password = password
			self.enable_force_encoding
		end
		def enable_force_encoding
			@m.post_connect_hooks << lambda{|ua,uri,res,body_io|
				if res["Content-Type"] =~ /^text\/.*$/
					body =  NKF.nkf('-wxm0',body_io.read)
					body.gsub! /shift-jis/i,"utf-8"
					body_io.truncate body_io.pos
					body_io.rewind
					body_io.puts body
				end
			}

		end
		def disable_force_encoding
			@m.post_connect_hooks.clear
		end

		def login(id=nil,password=nil)
			id ||= @@id
			password ||= @@password
			@m.get "http://www.mydocomo.com/web/home/"
			@m.page.links_with( :text => "ログイン").first.click
			#@m.page.body = @m.page.body.toutf8
			@m.page.forms[0].fields_with(:name=>"MDCM_UID").first.value = id
			@m.page.forms[0].fields_with(:name=>"MDCM_PWD").first.value = password
			@m.page.forms[0].submit
			self.go_through_refresh_page
		end

		def go_through_refresh_page
			#クッションページ・リフレッシュがある。
			return unless @m.page.search("meta[http-equiv='refresh']").size>0
			redirect_to  =  @m.page.search("meta[http-equiv='refresh']").attr("content").to_s.split(/;/).last.scanf("url=%s").first
			redirect_to  =  URI.join(@m.page.uri.to_s,redirect_to)
			@m.get redirect_to
			#@m.page.body = m.page.body.toutf8
			@m.page.body
		end

		def ryokin_page
			@m.page.links_with( :text=>"ご利用料金の確認").first.click
			self.go_through_refresh_page
		end


		def ryokin_matome_page #一括請求ページ
			# 一括
			form = @m.page.forms_with(:name=>"form1").first
			form.fields_with(:name=>"root_GKFAGW001_DENWABANGOPULLDOWN").last.options[0].select
			form.action = form.action+"&root_GKFAGW001SubmitHyoujiPull="
			# puts form.action
			form.submit
			#puts m.page.body = m.page.body.tosjis
			#@m.page.body = m.page.body.toutf8
			@m.page.body
		end




		def latest_ryokin_meisai # go
			#直近で請求が確定している月
			table =  @m.page.search('table.new-amountclaimschedule').last
			year_month = table.search("tr th p.strong")[1]
			year_month = year_month.text()
			q =  table.search("tr img[alt='利用内訳']").first["onclick"][/setSeikyuNengtsu\('(\d+)'\)/, 1]
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKFAGW001SubmitShosaiUtiwake="
			form.fields_with(:name=>"root_GKFAGW001_HIBUTTONNENGETU").first.value = q
			# p q
			# exit
			form.submit
			@m.page.body = @m.page.body.toutf8
			year_month
		end

		def get_latest_meisai_pdf
			# 位置をリセット
			self.go_home
			#料金ページヘ
			self.ryokin_page
			self.ryokin_matome_page
			#取得可能な最新月
			y_m = self.latest_ryokin_meisai
			#
			#半角カナがフォームの値にあるので、変換すると化けるので、utf-8強制変換をオフ
			#
			self.disable_force_encoding
			#PDF ダウンロード リンク
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKFAGW001SubmitPdf="
			form.submit

			#doui() 同意する
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKHCGW001SubmitAgree="
			form.submit
			#ダウンロード
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKHCGW001SubmitAgree="
			form.action = form.action+"&BisAutoSubmissionREQUEST="
			form.submit

			#
			# utf-8強制変換をもとに戻す
			#
			self.enable_force_encoding
			return {"file_name" => "docomo-#{y_m}-meisai.pdf", "body"=> @m.page.body , "month" => y_m }
		end




		def get_latest_gaiyo_pdf
			# 位置をリセット
			self.go_home
			#料金ページヘ
			self.ryokin_page
			self.ryokin_matome_page
			#取得可能な最新月
			y_m = self.latest_ryokin_gaiyou


			self.disable_force_encoding # ⇐ 重要

			#PDF ダウンロード リンク
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKFBGW001SubmitPdf="

			form.submit
			#m.page.body = m.page.body.toutf8 unless RUBY_VERSION.to_f < 1.9

			#doui() 同意する
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKHCGW001SubmitAgree="
			form.submit
			#ダウンロード
			form = @m.page.forms_with( :name=>"form1")
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKHCGW001SubmitAgree="
			form.action = form.action+"&BisAutoSubmissionREQUEST="
			form.submit
			# 再び、強制変換オン
			self.enable_force_encoding
			return {"file_name" => "docomo-#{y_m}-gaiyo.pdf", "body"=> @m.page.body , "month" => y_m }
		end

		def latest_ryokin_gaiyou # go
			# 一括料金表示ページを解析
			#直近で請求が確定している月

			table =  @m.page.search('table.new-amountclaimschedule').last
			year_month = table.search("tr th p.strong")[1]
			year_month = year_month.text()
			q =  table.search("tr img[alt='お知らせ']").first["onclick"][/setSeikyuNengtsu\('(\d+)'\)/, 1]
			#puts q
			form = @m.page.forms_with(:name=>"form1").first
			form.action = form.action+"&root_GKFAGW001SubmitSeikyuGaiyou="
			form.fields_with(:name=>"root_GKFAGW001_HIBUTTONNENGETU").first.value = q
			form.submit
			#@m.page.body = @m.page.body.toutf8
			#puts @m.page.body

			year_month
		end






		def get_latest_pdf_download
			# 最新の料金の概要と明細をダウンロードして、1枚のPDFに結合する

			# 料金概要
			gaiyo = nil
			gaiyo = self.get_latest_gaiyo_pdf
			## # ファイル保存
			open(gaiyo["file_name"], "w"){|f| f.print gaiyo["body"] }

			#y_m = gaiyo["month"];
			gaiyo_path = gaiyo["file_name"]


			# 明細を取得する
			meisai = nil
			meisai = self.get_latest_meisai_pdf

			meisai_path = meisai["file_name"]

			# ファイルの保存
			open(meisai["file_name"], "w"){|f| f.print meisai["body"] }
			y_m = meisai["month"];

			out_path = "docomo-#{y_m}.pdf"


			#puts cmd = "/usr/bin/env pdftk #{gaiyo_path} #{meisai_path} cat output #{out_path} "
			`/usr/bin/env pdftk #{gaiyo_path} #{meisai_path} cat output #{out_path} `

			body = open(out_path).read

			File.unlink meisai_path
			File.unlink gaiyo_path
			File.unlink out_path
			return { "file_name"=> out_path, "month" => "#{y_m}", "body"=>body }
		end
		def go_home()
			@m.get "https://www.mydocomo.com/dcm/dfw/web/pub3/r/header/home.html"
			self.go_through_refresh_page
		end


	end

end

if $0 == __FILE__ then

# docomo = BillScraper::cMyDoCoMo.new "0901234567","password"
# docomo.login
end

使い方サンプルはブログに書いた

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?