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

  最終的には、ruby は プロセス呼び出しにする



関連する記事
さくらインターネット : PuTTY ごった煮版で SSH 接続
さくらインターネット : PuTTY ごった煮版 + FDclone
さくらインターネット : Ruby : rubygems-1.3.5 のインストール( + mechanize )


Ruby で WEB アプリを全て作るのは現実的ではありません。プロセス呼び出しとなると、呼び出し部分は
ブラットホーム依存になりますが、確実に小さなコードで済みます。PHP は、WEB アプリケーションに特化した
実績のある機能を多く持つので、ここではまず画面部分を PHP で作成し、FORM の ACTION に Ruby を
指定します。

この場合に限らず、Ruby 側では外部とのやりとりは通常の cgi で行うと誰でもメンテできるはずです。
また、機能が必ず部分的に特化されるはずなので、Ruby 自体もシンプルになるはずです。

Ruby の設計思想は「ストレスなくプログラミングを楽しむことである」だったと思いますので、
それは当然「省略」も意味します。いろいろな意味で、設計者や利用者が意図するしないにかかわらず、
最も Perl が得意とするところを引き継いでいるはずです。かつそれらは後でメンテできない原因の一つでもあります。

つまり、大勢で行うシステム開発ではかなりの確率で避けなければならないものです。

しかし、Perl 無しで WEB アプリは語れない

とは言うものの現実は、技術者の好奇心を刺激したり、窮地を脱出するツールだったりするのも事実で、
実際は無視せずにそれなりのアプローチを試みる必要は必ずあります





  画面定義



最終的に、Twitter に同時投稿したいので、フォームを二つ作成して、入力した内容を JavaScript で転送して
非表示のフォームを使って送信しています。

キャラクタセットは、UTF-8 でないと、ruby 内で変換が必要になるので使っていますが、プロセス呼び出しであれば
EUC-JP でも、SHIFT_JIS でも、渡す前に変換すれば良いので、最後は EUC-JP に変更予定です

この画面は フレームの一部で、実行の後表示が変更されませんので、
ユーザーとパスワードは常に残ったままになります。また、ページは SSL を使用します

▼ 実際の実装ページ
mixi ボイス投稿

※ 入力チェックは全く実装していません。
※ タブが入力できるテキスエリアは、ひな形を引き継いだだけで意味はありません

  
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=utf-8" />
<TITLE>mixi ボイス投稿</TITLE>
<STYLE type="text/css">
* {
	font-size: 12px;
}
.column {
	border-style:solid;
	border-width:1px;
	border-color:#000000;
	padding: 4px;
}
</STYLE>
<SCRIPT
	language="javascript"
	type="text/javascript"
	src="http://homepage2.nifty.com/lightbox/tabtextarea.js">
</SCRIPT>


<SCRIPT language="javascript" type="text/javascript">

// *********************************************************
// local class
// *********************************************************
function lbox_local() {
	this.checkForm = function( ) {

		document.getElementsByName("user1")[0].value = 
			document.getElementsByName("user2")[0].value;

		document.getElementsByName("pass1")[0].value = 
			document.getElementsByName("pass2")[0].value;

		document.getElementsByName("text1")[0].value = 
			document.getElementsByName("text2")[0].value;


		if ( !confirm( "サーバーへ送信しますか?   " ) ) {
			return false;
		}

		return true;
	}
}
// *********************************************************
// instance
// *********************************************************
var lbox = new lbox_local();

</SCRIPT>
</HEAD>
<BODY>
<FORM
	name="frm"
	method="POST"
	action="mixi_voice.rb"
	onSubmit='return lbox.checkForm();'
	target="Act"
	style='display:inline'
>
	<INPUT
		type="submit"
		name="send"
		value="投稿して生データを表示"
	>( mixi ボイスに投稿して、mechanize から戻された HTML をそのまま表示します )
	<INPUT
		type="hidden"
		name="user1"
		style='width:400px;'
	>
	<TEXTAREA name="text1" style='display:none'></TEXTAREA>
	<INPUT
		type="hidden"
		name="pass1"
		style='width:400px;'
	>
</FORM>

<FORM
	name="frm"
	method="POST"
	action="mixi_voice.rb"
	onSubmit='return lbox.checkForm();'
	target="Act"
	style='display:inline'
>
	<!--INPUT
		type="submit"
		name="send"
		value="送信"
	-->
<TABLE
	
	style='
		border-collapse:collapse;
		border-style:solid;
		border-width:1px;
		border-color:#000000;
		width:690px;
	'
>
<TR>
	<TD nowrap class="column">mixi ボイス投稿</TD>
	<TD class="column">
	</TD>
</TR>


<TR>
	<TD class="column">メールアドレス</TD>
	<TD class="column">
	<INPUT
		type="text"
		name="user2"
		style='width:400px;'
	>&nbsp;&nbsp;
	</TD>
</TR>
<TR>
	<TD class="column">パスワード</TD>
	<TD class="column">
	<INPUT
		type="password"
		name="pass2"
		style='width:400px;'
	>&nbsp;&nbsp;
	</TD>
</TR>



<TR>
	<TD class="column">テキストエリア</TD>
	<TD class="column">
		<TEXTAREA
			name="text2"
			cols="80"
			rows="15"
			onKeydown='SetTab()'
			onKeypress='SetTab2(event)'
		></TEXTAREA><br>
		<b>タブ入力が実装されています</b>
	</TD>
</TR>

</TABLE>
</FORM>

</BODY>
</HTML>
  



  Ruby のコード

特に特別なところはありません。
直感的なコーディングです。

HELP
Rubyリファレンスマニュアル Ruby 1.8.7版

※ mixi に対して http で呼び出していますが、https でも動作する事は確認しました

コード内のパスについては以下を参照して下さい
さくらインターネット : Ruby : rubygems-1.3.5 のインストール( + mechanize )

2010/05/02現在 : mixi_voice.rb
  
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"

require "cgi"
cgi = CGI.new

ENV['GEM_HOME']="/home/username/gems"

$LOAD_PATH.push('/home/username/lib')

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
#mixiにログイン
page = agent.get("http://mixi.jp/")
form = page.forms.first
form["email"] = cgi['user1'][0]
form["password"] = cgi['pass1'][0]
form.submit

#mixiエコーのページを取得
page = agent.get('http://mixi.jp/recent_voice.pl')
form = page.forms[1]
form["body"] = cgi['text1'][0]
#puts form["body"]
result = form.submit

print result.body
  

旧mixi_voice.rb
  
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"

require "cgi"
cgi = CGI.new

ENV['GEM_HOME']="/home/username/gems"

$LOAD_PATH.push('/home/username/lib')

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
#mixiにログイン
page = agent.get("http://mixi.jp/")
form = page.forms.first
form["email"] = cgi['user1'][0]
form["password"] = cgi['pass1'][0]
form.submit

#mixiエコーのページを取得
page = agent.get('http://mixi.jp/recent_echo.pl')
form = page.forms[1]
form["body"] = cgi['text1'][0]
result = form.submit

print result.body
  











  infoboard   管理者用   





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ