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 | Comment(0) | 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 | Comment(0) | 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 | Comment(0) | 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月28日

さくらインターネットでRuby使ってmixiボイスで投稿する為に【その4】:PHPとの連携第一段階として、PHPの送り先(target)をRubyとする


さくらインターネット : Ruby+mechanize : mixi ボイスへの投稿を php と連携して行う


シリーズ4にしてやっと基礎段階のアプリケーションとしての実装です。
モノは(1)の時に既にできていて、まとめたり検証したり誤字脱字をチェックしたり。

▼ こちらの実装ページのソースコードが ▲
mixi ボイス投稿

構成としてはトップがフレームで、入力部分が PHP で表示部分が Ruby です。、
問い合わせ処理に最も適した方法で、入力データがずっと画面に残ってくれます。

出力は現時点では Ruby が直接やっていますが、実際は、Ruby の標準出力
を PHP が受け取って、PHP 側で加工しようと思っています。
例えば、出力を XML にすれば、WEB API として転用できますし、Ruby では
Ruby でしか出来ない飛び道具として設計するつもりです。

というか、Perl、ASP、PHP、JSP で、いいかげんもう新しいものはいらないというのが
正直な気持ちであると同時に、Perl の進化版である以上、Ruby だけでMVC は
無理があるのです。( その為のモジュールがありますが、同じ事です )

WEB 用に開発された、ASP.NET というものがありますが、その為に作られていても
使え無い物はやはり使え無いし、限られた時間の中で最高のパフォーマンスを出す
事を使命と考えた時に、Ruby は選択肢に入れるわけにはいかないのです。
( 飛び道具としてはたぶん最高のパフォーマンスを発揮しそうですけれど )

「ストレスなくプログラミングを楽しむことである」

というコンセプトが最優先ならば、かなりいいセン行ってます。
そこに「システム開発」なんぞという営利目的が入って来る場合、
誰も死地目指して行軍はしないのです。
正直、Java に次いで調査が困難を極めました。なかなか、完全に裏を取れないです。
70% くらいで当面前へは進めるのですが、経験上それでは後で痛い目に会うので
時間がかかっても、いつも95% くらいまでは調査をつづけるのですが・・・・
ラチあきませんでした。


ま、それはともかく。

Twitter は、API もはっきりしているので、
Ruby でやるか PHP でやるかは悩みどころです。




 

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

2009年11月26日

さくらインターネットでRuby使ってmixiボイスで投稿する為に【その3】:rubygems-1.3.5をインストールしてmechanizeをインストール後mixiボイスへアクセステスト

この前の記事
さくらインターネットでRuby使ってmixi ボイスで投稿する為に【その2】 : PuTTY ごった煮版 + FDclone 



さくらインターネット : Ruby : rubygems-1.3.5 のインストール( + mechanize ) 

PuTTY が使えるという前提ですが、この一連の作業でさくらのサーバ内の仮想ブラウザによって、いろいろなページに対するオートマチックなアクセスが可能になります。ログイン処理もオートマチックの中の一つのプロセスなので、通常では取得できない情報を抜き出す事が可能になります。

古くから VB の WebBrowser コントロールによって、リモートのページ上のテキスト情報を抜き出すといったアプリケーションはわりとポビュラーに作られて来ました。しかし、リモート側の仕様変更も時代の変化にあわせてに多かったので、そのたびに変更してビルドしてまで取得するようなデータも無かったですし、VB 側の変化も大きく様々な事情でそうそう手を出そうという領域では無かったのです。

3年くらい前、実際に VB で mixi 専用ブラウザを作って遊んでみたり、PHP で mixi の足跡データを取得 というプログラム作って、CRONから起動して足跡の統計データを取った事もありましたが、面倒なわりに役にたたないで終わっています( 自動ログイン処理とかはさすがに面倒だったので )

しかし、この mechanize を使うとそのへんは一挙に解決です。Perl でもあったようなのですが、調べた限り、https へのアクセスがはっきりしません( 面倒のようです )。で、こちらは普通に実装されていました。あらゆる場面を想定してテストはしていませんが、mixi に https でアクセスはできています。

となると、画像による認証投稿というハードル以外はたいてい超えてしまえると言う事ですから、WEB 上のデータの自動取得という「統計的な分野」で使っていけるのでは無いかと思っています。

とは言っても、当面やりたい事は、Twitter と mixi の同時投稿程度ですが・・・・・


インストールにあたっては、それなりにハードルがいくつかあります。
リンク先はそれをまとめてありますが、要点は数箇所です。
1) .cshrc に setenv RB_USER_INSTALL true が必要
2) GEM_HOME は、今後のインストール先(リポジトリ)を指定する
3) PuTTY から動いても、WEB上から動くとは限らない
4) デバッグは PuTTY から行う
5) .rb 内で、ENV['GEM_HOME'] を設定する
6) .rb 内で、$LOAD_PATH.push('/home/username/lib') を実行する
です。 それなりに正解を得るのには苦労しました。
posted by at 2009-11-26 20:42 | Ruby | このブログの読者になる | 更新情報をチェックする

2009年11月25日

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

この前の記事
さくらインターネットでRuby使ってmixi ボイスで投稿する為に【その1】 : PuTTY ごった煮版で SSH 接続
この次の記事
さくらインターネットでRuby使ってmixi ボイスで投稿する為に【その3】 : rubygems-1.3.5 をインストール
してmechanizeをインストール後mixiボイスへアクセステスト


Unix の開発で費やするコマンドラインでの作業時間はバカになりません。
当時FDclone では無く FU というソフトをビルトして使っていましたが、
FU は8年くらい前に Cygwin の Linux でも試しています。ですから、解る人には
解るのですが、Unix & Linux では、ソースからビルドするのは当たり前で、
特別な環境でないかぎり普通にビルドが成功します( 多少問題あってもなんとかエラーぐらいは消せます )

ですから、さくらインターネットで作業する目的が ruby のモジュールのビルドなのに、
自分の環境周りをほったらかしというのはおかしな話なので、(使わないけど) 導入しました。
これからも使うのならば、もっと詳しく解説するのですが、さわりだけです。


Fdclone_color


さくらインターネット : PuTTY ごった煮版 + FDclone



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

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

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

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

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


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

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

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

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

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


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX