SQLの窓 イラストAC フリー素材

2014年07月25日

Ruby(mechanize) で PHP からの JSON 経由で値を取得

以下は、MySQL にアクセスして json_encode で連想配列を JSON に変換して text/plain で返しています。

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);

?>

MYSQLI_BOTH で行データを読み込んでいるので、結果には 数字をキーとした配列と 文字をキーとした配列が混在しています。

Ruby で パースした場合、JSON 文字列なので、数字のキーは文字列扱いになるので、Ruby でループ処理する場合は、to_s が必要です。

force_encoding("utf-8") は、mechanize で返される文字列が、バイナリなので Ruby に対して文字コードを理解させる必要があります。これは、文字列自体には変更は起こらず、Ruby 内で問題が解決されるようにする処理です。

ここでは、実際の日本語コードは使用されていませんが、一般的に mechanize で返されるページは日本語が含まれたバイナリデータです。ページが UTF-8 ならば、force_encoding("utf-8") を実行します。

※ json_encode で、JSON_UNESCAPED_UNICODE を使うと、日本語が含まれます
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 at 2014-07-25 13:01 | Ruby | このブログの読者になる | 更新情報をチェックする

2014年07月24日

Ruby(mechanize) でバイナリファイルをアップロード

WEB 側で、php を使用して、Ruby(mechanize) からは put メソッドを実行します
#バイナリ PUT

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'

st = File.stat("winofsql.png")

page = agent.put("http://winofsql.jp/put/put.php",File.open("winofsql.png").read(st.size), {"Content-Length" => "#{st.size}" })
print page.body

# コンソールに日本語を表示したい場合は、以下のように記述します
# print (page.body).force_encoding("utf-8")

関連する記事

VBscript(または JScript) で簡単にバイナリファイルをアップロードする

PHP のコードは以下のようになっています
<?
session_start();
$id = session_id();


$fp = fopen( "php://input", "r" );
$wfp = fopen( "image/$id.png", "w" );

while( $ret = fread( $fp, 4096 ) ) {

	fwrite( $wfp, $ret );

}

fclose($wfp);
fclose($fp);


print $id . ".png\n";
?>
で画像が保存されました
PHP 側は、utf-8n ですが、コマンドプロンプトは shift_jis なので、以下のようにして実行します

ruby upload.rb > result

そうすると、result は、UTF-8N になるので、エディタで正しく結果を知る事ができます


関連する記事


タグ:ruby
posted by at 2014-07-24 22:40 | Ruby | このブログの読者になる | 更新情報をチェックする

2014年07月17日

Ruby(mechanize) 使ってmixi 経由で Twitter へ投稿する( もちろん mixi にも投稿されます )

Ruby(mechanize) 使ってmixi と Twitter へのログインテスト

ログインはどちらもうまくいきましたが、さすがに Twitter での投稿はうまくいきませんでした。そこで、ページの内部が単純な mixi のつぶやきに投稿して、その時に Twiiter にも投稿のチェックを付けて送りました。

mixi は、euc-jp ですが、ソースは utf-8 にしないとエラーが出ます
#mixi のつぶやきに投稿して、Twitter にも投稿

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://mixi.jp/")

form = page.forms[0]
form["email"] = "メールアドレス"
form["password"] = "パスワード"
page = form.submit

page = agent.get("http://mixi.jp/list_voice.pl")

form = page.forms[10]
form["twitter_sync"] = "1"
form["body"] = "Ruby(mechanize)で、Twitterに直接投稿できそうにないので、mixi経由で投稿"

page = form.submit

print page.body

関連する記事


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

2014年07月16日

Ruby(mechanize) 使ってmixi と Twitter へのログインテスト

ログインに成功するという事は、テキストの投稿等の一般的なブラウザの操作はなんとかなるという事です。

Ruby(mechanize)は、数年前に、さくらのサーバーにインストールして使っていましたが、いつのまにか動作しなくなっていました。特に重要なものも無く放置していましたが、Windows にインストールするのは簡単である事がわかり、テストを行いました。

1) Ruby for Windows のインストール( 但しテストはしたのは32ビット )
2) mechanize のインストール
※ インストールされた『Ruby コマンドプロンプトを開く』を実行
※ gem install mechanize を実行
#mixiにログイン
print "Content-type: text/html\n\n"

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://mixi.jp/")

form = page.forms[0]
form["email"] = "ユーザ"
form["password"] = "パスワード"
page = form.submit

page = agent.get("https://mixi.jp/")

print page.body

#Twitterにログイン
print "Content-type: text/html\n\n"

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://twitter.com/")

form = page.forms[1]
form["session[username_or_email]"] = "ユーザ"
form["session[password]"] = "パスワード"
page = form.submit

page = agent.get("https://twitter.com/")

print page.body


重要なのは、agent インスタンスの設定です
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'
1) SSL の設定( 証明書チェックを無視 )
2) META 要素でのリフレッシュに対応( 最近では主流のようです )
3) ブラウザの User Agent の設定( 適当にすると、モバイル扱いになる )

処理は、http ヘッダ無しでコマンドプロンプトから実行してもいいですし、http ヘッダ有りで AN HTTP Server で処理してもいいです。

関連する記事


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

2010年03月12日

land.toで動作保証はありませんが、最近の新しいサーバー(Linux)ではmechanizeをインストールできます


land.to で ruby に mechanize をインストール
仕様 - Land.to非公式QandA で cgi 経由のシェルが使える事を知ったので、
やってみるとできました。但し昔の unix サーバーではソフトウェアが足りないらしくて
エラーが出ました。Ruby のバージョンとかが仕様の表記と違っていたので、全てのサーバー
が一様では無い可能性があるので、チェックしてそれぞれのバージョンを合わせる必要が
あります。

そもそも、mechanize が大幅なバージョンアップしていますし、Ruby に依存しますから
バージョン合わせは重要です。



関連する記事


posted by at 2010-03-12 06:12 | Ruby | このブログの読者になる | 更新情報をチェックする

2010年01月10日

Ruby:とにかく目的を達成する為に基本的で解りにくい部分の整理


Ruby : PHP や Perl が解る人がとにかく Ruby


やはり、結論から言えば、Ruby で WEB アプリケーションを作ろうとは思いません。
PHP でできる事をわざわざ Ruby でする理由はどこにも無いのですが、ブラウザの
かわりをする Mechanize は、例えば、Twitter の面倒な 認証 API を利用しなくとも
投稿できてしまうわけですから。

ただ、ドキュメントが整備されていないので、とても単純な事がなかなか見つからないです。
WEB を調べればすこしづつあきらかになりますが、どれも全体を把握しようという文書ばかりで、
とにかく必要な部分という優先順位を明確にしたアプリケーション作成用の文書がみあたりません。

で、その第一弾です。






posted by at 2010-01-10 04:27 | Ruby | このブログの読者になる | 更新情報をチェックする

2009年12月03日

さくらインターネットでRuby使ってmixiボイスで投稿する為に【その6】:PHPからRubyを呼び出す場合は素直にHTTPで呼び出しましょう(外部じゃ無いですけど)


さくらインターネット : PHP から Ruby の呼び出し


HTTP で呼んだほうが安定しているというのは、プロセスとサーバーでの優先度やメモリの
使い方も雲泥の差でしょうから、同一場所とは言え、HTTP で WWW サーバーを介して
行うほうが筋は通ってるなぁ・・・と良く考えると思いました。

file_get_contents で呼び出す方法は WEB 上のサンプルを参考にしたのですが、
そのコードはPOST 呼び出しなのに、URL のパラメータとして渡していて、最初動きませんでした。
もともと、「おかしいよなぁ」と思ってマニュアル調べると違ってました。

そういえば、PHP はある方法を使っていると、どちらから来ても使えます。
でも、PHP 以外じゃ当然使え無い( PHP でも普通は無理 ) ので注意して下さい。


現時点では、$result を直接 print していますが、この中の情報を加工して表示する事になります。

 

posted by at 2009-12-03 22:12 | Ruby | このブログの読者になる | 更新情報をチェックする

2009年11月25日

さくらインターネットでRuby使ってmixiボイスで投稿する為に【その1】:PuTTYごった煮版でSSH接続



Ruby は飛び道具なんで、ずっとほったらかしてたのですが、mixi ボイスを Twitter から埋め尽くす
マイミクが居るので、ちょっと興味持って調べたらアプリでクッキーを保持してセッション継続したまま
やりとりできるのが解って始めたのですが、解説するには順序があるのでこれからです。

▼ すでに完成しているアプリはこちら( まだ実用段階では無いですが )
mixi ボイス投稿

いずれ、Twitter と同時投稿できるようにして、下のフレームでそれぞれのリスト表示をするというふうに
するつりですが、まずは実装の初期段階はクリアしたのでまとめています。

とにかく、ローカル(Windows)でできても仕方無いので、リモートでさくらへログインしなければ
なりません。コマンドラインの操作は嫌いですが( 十数年前に Unix の開発経験はあります )
仕方ないのでひさしぶりに Unix です。あんのじょう、vi が必要ですが、操作方法は綺麗さっぱり
忘れています。最低限必要なものを集めてまとめています。



さくらインターネット : PuTTY ごった煮版で SSH 接続




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

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

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

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

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


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

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

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

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

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