SQLの窓

2014年07月25日


Ruby(mechanize) で PHP からの JSON 経由でデータベース(MySQL)の値を取得

Ruby でデータベースの処理を直接するより、普通に PHP で処理して結果を mechanize で使うと簡単になります。PHP では 現在あらゆるデータベースに対してアクセスする為の情報が豊富なので、Windows 環境でほぼ困る事が無いので、Ruby をスクリプトとして運用で使うのは非常にメリットがあると思います。

json.php(MySQLにアクセスして JSONを返す)
<?php
header( "Content-Type: text/plain; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$server = 'localhost';
$db_name = 'lightbox';
$user = 'root';
$password = 'パスワード';

// 接続
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// クエリ
$result = $connect->query("select * from 社員マスタ where 社員コード = '0001'"); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// 読み出し
$row = $result->fetch_array(MYSQLI_BOTH);

// 開放
$result->close();

// 接続解除
$connect->close();

print json_encode($row);

?>


json_get.rb
#JSON 経由でデータベースの値を取得

require 'mechanize'

agent = Mechanize.new

agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
agent.follow_meta_refresh = true
agent.user_agent = 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'

page = agent.get("http://localhost/web/various/db_json/json.php")
obj = JSON.parse((page.body).force_encoding("utf-8"))

i = 0
while i < obj.length / 2
	print obj[i.to_s], "\n"
	i += 1
end

print obj["社員コード"],"\n"
print obj["氏名"],"\n"
print obj["フリガナ"],"\n"
print obj["所属"],"\n"
print obj["性別"],"\n"
print obj["作成日"],"\n"
print obj["更新日"],"\n"
print obj["給与"],"\n"
print obj["手当"],"\n"
print obj["管理者"],"\n"
print obj["生年月日"],"\n"




posted by lightbox at 2014-07-25 13:03 | Ruby | このブログの読者になる | 更新情報をチェックする

2014年07月18日


Ruby(Mechanize) : ココログギャラリー名の変更

Ruby 2.0.0-p481 を Windows にインストールしてコマンドプロンプトから処理しています。

昔同様の処理を行っていましたが、NIFTY のログインの仕様が変わっていました。また、agent.follow_meta_refresh を使って Mechanize がページを取得するようになっています。結局は、とても短い簡潔なコードで更新できました
# ココログのギャラリー名の変更

require 'mechanize'

agent = Mechanize.new

agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
agent.follow_meta_refresh = true
agent.user_agent = 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'

page = agent.get("https://sso.nifty.com/pub/login.cgi?service=cocologin&back=https%3a%2f%2fwww.cocolog-nifty.com%2fdispatch%2f&am=1.2.0")

# FORM に name 属性が設定されていたので、それで選択
form = page.form_with(:name => 'login')
form["username"] = "ユーザ"
form["password"] = "パスワード"
page = form.submit

# ギャラリー名の変更ページ
# set_id に番号をセット
page = agent.get("http://app.cocolog-nifty.com/t/app/gallery/configure?set_id=508074")

# FORM がひとつしか無かったので .first
form = page.forms.first
form["name"] = "ギャラリーA"
page = form.submit

print "update OK!"

以下は、昔さくらインターネットで動作していたコードです。

1) ENV の中は 環境変数( HTTP_* 等 )
2) sub は 1回 gsub は 全て
3) 式の改行は前の行に継続として演算子を残す
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"

require "cgi"
cgi = CGI.new

ENV['GEM_HOME']="/home/lightbox/gems"
$LOAD_PATH.push('/home/lightbox/lib')

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
#@nifty にログイン
page = agent.get("https://login.nifty.com/service/login")
form = page.forms.first
form["username"] = "ユーザID"
form["password"] = "パスワード"
page = form.submit

fp = open("./log_01.txt", "w")
fp.puts(page.body)
# 環境変数等を読みやすい形で出力
str = ENV.inspect
str = str.gsub(/,/,"\n")
fp.puts(str)
fp.close

# ************************************
# return : 
# <html><meta http-equiv="Refresh" content="0;URL=http://www.nifty.com/"></html>
# ************************************
print "login<br>"


# 対象ギャラリーの設定ページ
page = agent.get('http://app.cocolog-nifty.com/t/app/gallery/configure?set_id='+
	cgi['no'][0])
fp = open("./log_02.txt", "w")
fp.puts(page.body)
fp.close

# ************************************
# return : 
# <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
# <head>
# <meta http-equiv="Content-Type" content="text/html;charset=utf-8"></meta>
# <META
# 	HTTP-EQUIV="Refresh"
# 	CONTENT="0;URL=http://app.cocolog-nifty.com/t/app/gallery/configure?set_id=ギャラリー番号&amp;nwsThough=1"
# ></META>
# </head>
# <body>
# <!--result=ターゲット URL(CONTENTと同じ)-->
# </body>
# </html>
# ************************************
print "request target page<br>"

# 設定ページ
page = agent.get('http://app.cocolog-nifty.com/t/app/gallery/configure?set_id='+
	cgi['no'][0]+
	'&nwsThough=1')
fp = open("./log_03.txt", "w")
fp.puts(page.body)
fp.close

print "response real page<br>"

# 更新処理
form = page.forms.first
form["name"] = "_"+cgi['gn'][0]
form.submit
関連する記事


タグ:ruby Mechanize
posted by lightbox at 2014-07-18 10:59 | Ruby | このブログの読者になる | 更新情報をチェックする

2014年07月17日


Ruby : Seesaa の設定ページの「最新の情報に更新」ボタンを Ruby の mechanize で押す

コマンドプロンプトからのバッチ処理でテストしています。
( 32ビット Windows へのインストールは簡単に行えました )

概要

Seesaa では、一つのアカウントで複数のブログを作成できますが、ブログの設定を複数行う場合は結構面倒です。一度設定してしまえば、変更する機会はあまり多くはありませんが、それでも「設定」ページの最新の情報に更新はしばしば実行が必要になります

初期導入時で言えば、「設定」ページ以外にもいろいろ設定する場所も多く、一度に全て設定できるとしたら、Ruby の mechanize でしょう。

テストしてみるといとも簡単にできましたので、トップページ表示件数の更新部分も含めたサンプルです。
#Seesaa 設定ページの『最新の情報に更新』

require 'mechanize'

agent = Mechanize.new

agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
agent.follow_meta_refresh = true
agent.user_agent = 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'

page = agent.get("https://ssl.seesaa.jp/www/pages/welcome/login/input")
form = page.form_with(:name => 'authpost')
form["member__email"] = "メールアドレス"
form["password"] = "パスワード"
page = form.submit

# 対象ブログのページ
page = agent.get('https://blog.seesaa.jp/cms/home/switch?blog_id=ブログ番号')

# 設定ページ
page = agent.get('https://blog.seesaa.jp/pages/my/blog/settings/basics/edit/input')

form = page.form_with(:name => 'myform')

page = form.click_button(form.buttons[0])

# 以下は設定ページの「トップページ表示件数」の更新
#form["blog__index_page_cnt"] = "2"
#page = form.click_button(form.buttons[1])

print "seesaa : update : ok"

関連する記事


posted by lightbox at 2014-07-17 16:11 | Ruby | このブログの読者になる | 更新情報をチェックする

2010年06月07日


Ruby : 日本語の正規表現はバイナリで

Ruby 内で、日本語の正規表現を正しく動作させる為に、先頭に
#!/usr/local/bin/ruby -Ke

というような記述をすると良いと・・・言ってるのをみかけましたが、
対象文字列が SHIFT_JIS で書かれていて、ソースが EUC-JP ではどう
にもならなかったので、以下のように普通にバイナリ指定しました。

このほうが確実のような気がします。
というか、Ruby は飛び道具という認識しか無いので動作する事が
大前提で、WEB アプリケーションは他の言語にまかせたほうがいい
と思います。

以下は、Seesaa の投稿処理です。
# **********************************************************
# Seesaa 処理関数
# $agent はグローバル変数
# **********************************************************
def seesaaAction(blog_id,blog_nm,opt) 


	# ブログ選択
	page = $agent.get($seesaa_select_blog + blog_id)
	# アクセス解析デフォルトページ( ページ別 )
	page = $agent.get($seesaa_access_default)

	# 合計の 訪問者数 と ページビュー を取得する正規表現( m は "." が改行にマッチ )
	/log\-total\-text.+log\-total\-num">.+?>(.+?)<.+log\-total\-num">.+?>(.+?)</m =~ page.body
	# Ruby 側確認用表示
	$ucnt = $1
	$vcnt = $2

	if opt == '1' then
		# 実際のアクセス数の計算用
		page = $agent.get($seesaa_access_os)
		# SHIFT_JIS で不明の先頭コードである \x95 を処理
		/log\-total\-num">(.+?)<.+?\x95.+?align="right".+?nbsp;(.+?)</m =~ page.body

		$realcnt = ($1.to_i-$2.to_i).to_s
	else
		$realcnt = 0.to_s
	end

	print blog_nm + "   " +  $ucnt + "/" + $vcnt + "<br>\n"
	print "realaccess : " +  $realcnt + "<br>\n"

	# DB 更新用 php 呼び出し
	$agent.get($seesaa_dbupdate+blog_id+'&ucnt='+$ucnt+'&vcnt='+$vcnt+'&realcnt='+$realcnt)


end

# **********************************************************
# Seesaa 定数
# **********************************************************
$seesaa_select_blog	= "https://blog.seesaa.jp/pages/my/blog/home/?blog_id="
$seesaa_access_default	= "https://blog.seesaa.jp/pages/my/blog/access_log/report/index?log_type=file"
$seesaa_access_os	= "https://blog.seesaa.jp/pages/my/blog/access_log/report/index?log_type=os"
$seesaa_dbupdate	= "http://.../seesaa_create_log.php?blog_id="


関連する記事

Ruby+Mechanize : Seesaaアクセス解析情報


タグ:トラブル
posted by lightbox at 2010-06-07 20:27 | Ruby | このブログの読者になる | 更新情報をチェックする

2010年02月06日


Mechanize : クラスのメソッドをオーバライドしてヘッダーを送れるようにしてiPhoneとしてサーバに認識させる

このサンプルの処理では、iPhone である必要は無いのですがあくまで
サンプルとして処理されています。実際は、Seesaa の自分のブログを
呼び出して、iPhone 用のページが返される事を確認しました

post メソッドは元々のメソッドのコードからファイルアップロード
の機能を省いてヘッダーを渡すようにしただけです。

post_form は、元々ヘツダーを渡せるのですが、プライベートメソッド
なのでこのような使い方になります。
#!/usr/local/bin/ruby
print "Content-type: text/html; Charset=shift_jis\n\n"

# エラーを出力する為の処理
$stderr = $stdout

# Ruby 本体をWEBアプリとして使う時の為の定義
# ( ここでは使っていません )
require "cgi"
cgi = CGI.new
require 'uri'

# さくらインターネットで WWW::Mechanize をインストールして
# 利用するのに必要だった定義
ENV['GEM_HOME']="/home/lightbox/gems"
$LOAD_PATH.push('/home/lightbox/lib')

require 'rubygems'
require 'mechanize'
# **********************************************************
# 処理本体
# **********************************************************

# WWW::Mechanize の post メソッドをオーバーライド
# ※ ファイルのアップロードは使わないので削除しています
# ※ カスタムヘッダーを渡せるようにしています
class WWW::Mechanize 
	def post(url, query= {}, headers = {}) 
		node = {} 
		# Create a fake form 
		class << node 
			def search(*args); []; end 
		end 
		node['method'] = 'POST' 
		node['enctype'] = 'application/x-www-form-urlencoded' 
 
		form = Form.new(node) 
		query.each { |k,v| 
			form.fields << Form::Field.new(k.to_s,v) 
		} 
		post_form(url, form, headers) 
	end 
end 

agent = WWW::Mechanize.new

# 呼び出しタイムアウト設定
# ( \ で継続行 )
agent.open_timeout \
	= 60 * 10
# ( = 演算子で継続行 )
agent.read_timeout =
	60 * 10

url = 'WEBアプリケーションのURL'
fld = {}
fld['SendButton'] = '一括'
fld['CommandField'] = 'パスワード'
fld['mid'] = 'CprogBase'

custom_header = {}
custom_header['User-Agent'] = 
'Mozilla/5.0 ' \
'(iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us)' \
' AppleWebKit/528.18 ' \
'(KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16'

page = agent.post(url, fld, custom_header)

print "ok"

関連する記事

Ruby : 自作WEBアプリケーションの呼び出しに使って機能を拡張する




タグ:ruby Mechanize
posted by lightbox at 2010-02-06 16:40 | Ruby | このブログの読者になる | 更新情報をチェックする

Ruby : 自作WEBアプリケーションの呼び出しに使って機能を拡張する

Ruby の Mechanize を使って自分が作った WEBアプリケーションの機能拡張を比較的簡単に実装できます。この例のアプリケーションの処理がある分類毎なので、それをある程度一括で処理してしまおうというものです。運用上の処理として、対象が多くなると手作業では大変になりますので、利用してみました。

注意するのは、この場合サーバから Perl の cgi を呼び出すので、あまり大量の処理を行うとサーバーに負荷をかけすぎる事になるので、注意して数を調整する配慮は必要となります。

ここで指定しているタイムアウトは、CPU の負荷では無く、一回の呼び出しがネットワークなのでそのタイムアウトになります。

ここで利用している agent.post は、標準のメソッドですが、これを拡張する方法もあります。

※ 以下のサンプルコードでは、継続行の使い方のガイドラインも示しています
#!/usr/local/bin/ruby
print "Content-type: text/html; Charset=shift_jis\n\n"

# エラーを出力する為の処理
$stderr = $stdout

# Ruby 本体をWEBアプリとして使う時の為の定義
# ( ここでは使っていません )
require "cgi"
cgi = CGI.new
require 'uri'

# さくらインターネットで WWW::Mechanize をインストールして
# 利用するのに必要だった定義
ENV['GEM_HOME']="/home/lightbox/gems"
$LOAD_PATH.push('/home/lightbox/lib')

require 'rubygems'
require 'mechanize'
# **********************************************************
# 処理本体
# **********************************************************

agent = WWW::Mechanize.new

# 呼び出しタイムアウト設定
# ( \ で継続行 )
agent.open_timeout \
	= 60 * 10
# ( = 演算子で継続行 )
agent.read_timeout =
	60 * 10

# ループ処理用配列
mid = [ 
'CprogBase' \
,'CommonSpec' 
]

# 以下だと継続行はいりません
mid = [ 
'CprogBase',
'CommonSpec' 
]

p mid
print "<br>"

# 配列の要素ぶんの繰り返し処理
(mid.length).times { |i|
	agent.post('WEBアプリケーションのURL', 
		{ 
			'SendButton' => '一括', 
			'CommandField' => 'パスワード', 
			'mid' => mid[i] 
		})
	print "#{mid[i]}<br>"
}

print "ok"

関連する記事

Mechanize : クラスのメソッドをオーバライド
してヘッダーを送れるようにしてiPhoneとしてサーバに認識させる




タグ:ruby Mechanize
posted by lightbox at 2010-02-06 15:19 | Ruby | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり