さくらインターネット : 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
	border=1
	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
  





yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[ruby]
claudebot
24/04/16 18:12:02
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube