2010年07月25日


自分用WEBサービス : PHP版 : Seesaa の設定の「更新」( Ruby よりやる事が多くなるのでおすすめできません )

設定データを直前のページから正規表現等で取り出して設定しないと汎用的なコード
にはなりません。正式 API では無いのでそこまでやっても、仕様が変更されるおそれが
あるので、そのへんを自動的にする Ruby が能力で勝っています。

このサンプルでは、自分の管理ページで実際に処理を行って、ieHTTPHeaders
でダンプしたものを直接貼り付けてテストしました。データは同時に更新されて
いましたので、「再構築」だけという選択肢は無いようです。

しかし、このサンプルでは、一連のブラウザの処理の代わりを行う方法の全てが
書かれており、いろいろな場面で利用可能なはずです。

※ CURLOPT_MAXREDIRS と CURLOPT_FOLLOWLOCATION はリダイレクト用です
※ CURLOPT_POSTFIELDS は、配列で渡すと URL エンコードしてくれます。
<?
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// *********************************************************
// curl 共通
// *********************************************************
$curl = curl_init();
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
// ***********************************************************
// クッキー等が自動的に受け渡しされるようにする
// ***********************************************************
curl_setopt($curl, CURLOPT_COOKIEFILE, './cookiefile.txt'); 
curl_setopt($curl, CURLOPT_COOKIEJAR, './cookiefile.txt'); 
curl_setopt($curl, CURLOPT_MAXREDIRS, 10); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

// *********************************************************
// まず最初のページを取得する
// *********************************************************
$seesaa_url = "https://ssl.seesaa.jp/pages/welcome/login/input";
curl_get( $seesaa_url, true );

// *********************************************************
// サインインする
// *********************************************************
$seesaa_url = "https://ssl.seesaa.jp/pages/welcome/login/input";
$seesaa_data = array();
$seesaa_data['member__email'] = 'メールアドレス';
$seesaa_data['member__password'] = 'パスワード';
curl_post( $seesaa_url, $seesaa_data, true );

// *********************************************************
// 設定ページの表示
// *********************************************************
$blog_id = "2181378";
$seesaa_url = "https://blog.seesaa.jp/pages/my/blog/home/?blog_id=$blog_id";
curl_get( $seesaa_url );

// *********************************************************
// 目的の更新
// *********************************************************
$seesaa_url = "https://blog.seesaa.jp/pages/my/blog/settings/basics/edit/input";
$seesaa_data = 'blog__title=WEB+%90E%90l&__tags-backuped=&__tags-changed=0&__tags=&__tag=&__tags-init-backuped=seesaa-no-val&blog__description=WEB%83T%83C%83g%8D%5C%92z%82%C9%95K%97v%82%C8%90E%90l%8C%7C%82%CC%8F%D0%89%EE&blog_category_id=41&blog__keywords=WEB%2CPHP%2Cjavascript%2C%83e%83N%83j%83J%83%8B%2C%8BZ%8Fp&blog__nickname=ユーザー&blog__auto_rebuild=0&blog__public=1&blog__sitemap=1&style__weather=&bookmark_service=yahoo&bookmark_service=livedoor&bookmark_service=hatena&blog_ext__post_twitter=1&twitter_setting__auto_post=0&twitter_setting__ap_format=&twitter_setting__ap_order=1&twitter_setting__ap_reply=1&twitter_setting__category_id=0&twitter_setting__ap_title_format=%3C%25+date+%7C+date_format%28%22%25Y%94N%25m%8C%8E%25d%93%FA%22%29+%25%3E%82%CC%82%C2%82%D4%82%E2%82%AB&url_shortener__service=Bitly&url_shortener__login=ユーザー&url_shortener__api_key=R_3a9ed6fb41c0d66a2fd5baa45157d037&blog__mailmag_text=1&blog__mailmag_html=1&blog__mailmag_summary=1&blog__ui_level=0&blog__alert_comment=1&blog__alert_tb=0&blog__alert_email=メールアドレス&blog__richtext=0&blog__index_page_cnt=3&blog__archives_page_cnt=3&blog__archives_page_sort=1&blog__category_page_cnt=3&blog__category_page_sort=1&blog_ext__category_article_cnt=20&blog__rss_body=1&blog_ext__upload_detail_page=1&blog_ext__mobile_pagerize_size=2048&blog_ext__common_header=0&blog_ext__cache_width_thumbnail=320&blog_ext__full_view_thumbnail=1&blog_ext__upload_panel_layout=0&blog_ext__amazon_trackingid=&blog_ext__use_trace_searcher=0&trace_searcher=yahoo&trace_searcher=amazon&trace_searcher=twitter&trace_searcher=blog&force_reload=%8E%C0%8Ds';
curl_post( $seesaa_url, $seesaa_data );

curl_close($curl);

// *********************************************************
// curl GET 処理
// *********************************************************
function curl_get( $target_url, $ssl_option=false ) {

	global $curl;

	curl_setopt($curl, CURLOPT_URL, $target_url);
	curl_setopt($curl, CURLOPT_POST, false);


	if ( $ssl_option ) {
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
	}

	$result = curl_exec($curl);

	return $result;

}

// *********************************************************
// curl POST 処理
// *********************************************************
function curl_post( $target_url, $postfields, $ssl_option=false ) {

	global $curl;

	curl_setopt($curl, CURLOPT_URL, $target_url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);

	if ( $ssl_option ) {
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
	}

	$result = curl_exec($curl);

	return $result;

}

?>
OK

関連する記事

自分用WEBサービス : Ruby による Seesaa の設定の「更新」
( つまり、最近アクセスされたページの再構築のようですが )

今回以下のソフトでテストしたのですが、思った以上に使いやすい事が解りました。
Cc_01
【ColorConsole 1.77】 コマンドプロンプト機能を拡張するタブウインドウを使ったWindows アプリケーション
posted by at 2010-07-25 23:31 | WEBサービス | このブログの読者になる | 更新情報をチェックする

レンタルサーバー用 MySQL 汎用メンテナンス


ブラウザでダウンロード
Mwin

かなり長い期間運用してきましたが、特に問題は出ていません。

フレームを3つ使ったページで、テーブル一覧よりデータを容易に参照するツールです。
更新は SQL を書く事によって実行できます。

※ SQL は mysql_query($sql) で実行しています。

特徴は、最低限のコードしか書いていない単純な内容です。
PHP 初心者でも容易に改造できるはずです。以下は、その中
の一応メインとなるデータ一覧を表示するコードです。
<?
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

require_once( "./mwin.php" );
?>

<HTML>
<HEAD>
<TITLE>PHP 雛形</TITLE>
<LINK rel="stylesheet" type="text/css" href="style.css">
<STYLE type="text/css">
</STYLE>
</HEAD>
<BODY id="body">

<?

if ( $_GET['type'] == '' ) {
	print mystr( "テーブルを選択するかクエリーを実行して下さい" );
	exit();
}

// 接続とDB選択
$link = mysql_connect($host, $user, $pass);
if ( !$link ) {
	print mystr( "接続エラー" );
	exit();
}
mysql_select_db( $db, $link );

// SQL の指定
if ( $_GET['type'] == '1' ) {
	$sql = "select * from `" . todbstr($_GET['table']) . "`";
}
if ( $_GET['type'] == '2' ) {
	$sql = todbstr($_GET['text']);
}
if ( $_GET['type'] == '3' ) {
	$sql = "SHOW COLUMNS FROM `" . todbstr($_GET['table']) . "`";
}
$result = mysql_query($sql);
if ( $result === TRUE ) {
	print mystr( "処理は実行されました<br>" );
	print $_GET['text'] . "<br>";
	exit();
}

// SQL のエラー処理
if (!$result) {
	print mystr( "SQLエラー<br>" );
	print dbstr(mysql_error());
	exit();
}

// 一覧作成
$nField = mysql_num_fields( $result );
print "<TABLE border='0' cellspacing='1' cellpadding='3'>\n";

print "<TR>\n";
print "	<TH nowrap></TH>\n";
for( $i = 0; $i < $nField; $i++ ) {
	$name = mysql_field_name ( $result, $i );
	print "	<TH nowrap>" . dbstr($name) . "</TH>\n";
}
print "</TR>\n";

$nCount = 0;
while ($row = mysql_fetch_row($result)) {
	print "<TR>\n";
	print "	<TD>" . ($nCount + 1) . "</TD>\n";
	for( $i = 0; $i < $nField; $i++ ) {
		$dwk = str_replace("<","&lt;",$row[$i]);
		$dwk = str_replace(">","&gt;",$dwk);
		print "	<TD>" . dbstr($dwk) . "</TD>\n";
	}
	print "</TR>\n";
	$nCount++;
	if ( $nCount >= $body_max ) {
		break;
	}
}
print "</TABLE>";

mysql_free_result($result);

// 接続解除
mysql_close($link);


?>

</BODY>
</HTML>



posted by at 2010-07-25 20:51 | ツール | このブログの読者になる | 更新情報をチェックする

自分用WEBサービス : Ruby による Seesaa の設定の「更新」( つまり、最近アクセスされたページの再構築のようですが )

1) キャラクタセット を UTF-8 にすること
  ( 但し、日本語がコメントのみの場合は SHIFT_JIS でも良い )
2) テキスト改行コード を LF にする事
3) サーバーのファイルのパーミッションを Perl と同様に実行可能にする事 ( 例: 755 )
4) .htaccess に以下追加
AddHandler cgi-script .rb

page.forms[1] の該当フォームの位置が Seesaa の仕様変更で変わる可能性が
あるので注意して下さい( 過去に一度変わりました )
具体的には、HTML を <FORM でサーチして、該当番号を [1] としてセットします
( 最初のフォームは 0 です。)
cgi.params['user'].to_s で、URL の user=メールアドレス を受けます。 ( URL エンコードして下さい ) cgi.params['pass'].to_s でパスワードを受けるので、SSL 対応のページ を使う必要があります。 cgi.params['id'].to_s は、ブログの番号なので管理画面のブログ一覧の 各 URL の最後の部分から取り出して下さい ※ Mechanize の最新バージョンは名前空間が変更されていますが、 ※ 再インストールが面倒なので使っていません。
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"

# 標準エラー出力の出力先を標準出力に変更
$stderr = $stdout

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
agent.open_timeout = 600
agent.read_timeout = 600

#seesaa にログイン
page = agent.get("https://ssl.seesaa.jp/pages/welcome/login/input")
form = page.forms.first
form["member__email"] = cgi.params['user'].to_s
form["member__password"] = cgi.params['pass'].to_s
form.submit

# 対象ブログのページ
page = agent.get('https://blog.seesaa.jp/pages/my/blog/home/?blog_id='+cgi.params['id'].to_s )
# 設定ページ
page = agent.get('https://blog.seesaa.jp/pages/my/blog/settings/basics/edit/input')

form = page.forms[1]
page = form.click_button(form.buttons[0])
print "seesaa : " + cgi.params['id'].to_s + " : update : completed<br>"


関連する記事

さくらインターネット : Ruby : rubygems-1.3.5 のインストール( + mechanize )
land.to で ruby に mechanize をインストール


タグ:ruby
posted by at 2010-07-25 16:35 | WEBサービス | このブログの読者になる | 更新情報をチェックする

一応WEBサービス : 指定位置でレジストリを開くスクリプトのダウンロード

以下のようにリンクを作成するだけで、目的のスクリプトをダウンロードできます。

自分のサイトに置けば、いちいちダウンロードせずにそのまま「開く」で実行でき
ますので、そのような運用がより便利だと思います。

システム環境変数
http://toolbox.winofsql.jp/reg_open.php?name=ファイル名&path=レジストリのパス

※ ファイル名はダウンロードする時のファイル名
※ レジストリのパスは、URL エンコードが必要です

<?
header( "Content-Type: application/octet-stream" );
header( "Content-disposition: attachment; filename={$_GET['name']}.vbs" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}


$vbs = <<<EOD
strParam = "{$_POST['path']}"

' レジストリ書き込み用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2")

' レジストリエディタが最後に開いていたキーの登録を行います
strPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\LastKey"
if GetOSVersion() >= 6 then
	strRegPath = "コンピュータ\\" & strParam
else
	strRegPath = "マイ コンピュータ\\" & strParam
end if

' 既に regedit が実行中の場合はいったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = 'regedit.exe'") 
For Each objProcess in colProcessList
	' 最後のウインドウの位置とサイズを保存する為の終わらせ方
	WshShell.AppActivate("レジストリ エディタ")
	Wscript.Sleep(500)
	WshShell.SendKeys ("%{F4}")
	Wscript.Sleep(500)
	' 上記終わらせ方が失敗した時の強制終了
	on error resume next
	objProcess.Terminate() 
	on error goto 0
Next 

WshShell.RegWrite "HKCU\" & strPath, strRegPath, "REG_SZ"

' レジストリエディタを起動します
Call WshShell.Run( "regedit.exe" )
' レジストリエディタが終わるまで待つ場合は以下のようにします
' Call WshShell.Run( "regedit.exe", , True )

REM **********************************************************
REM OS バージョンの取得
REM **********************************************************
Function GetOSVersion()

	Dim colTarget,str,aData,I,nTarget

	Set colTarget = objWMIService.ExecQuery( _
		 "select Version from Win32_OperatingSystem" _
	)
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function

EOD;

print str_replace("\n","\r\n", $vbs);

?>

関連するページ

めんどくさいフォルダを開く


posted by at 2010-07-25 01:38 | WEBサービス | このブログの読者になる | 更新情報をチェックする

2010年07月14日


VB.net : SkyDrive にファイルをアップロード( 経過処理付き / SkyDrive .Net API Client )

VB.net : SkyDrive にファイルをアップロード( SkyDrive .Net API Client )
の発展版です。

WebDAV があまりにも使えないので、パッチ処理するにはこれしか選択肢がありません。
そこで、実用になるようにイベントを付加しました。ログオンに時間がかかるので、
これを繰り返すのは現実的で無く、この中で複数のファイルの処理をするのが良いので、
それは次に機会にゆだねるつもりで今回も exe は同梱していません

実行は以下のようになり、コンソール上で経過の表示は改行しません
vb.net>sd.exe
処理を開始します
ログオンしています....
アップロード処理を開始します....
100% 1656470/1656470
処理が終了しました
Imports HgCo.WindowsLive.SkyDrive

Module MyModule

' ********************************************************
' http://skydriveapiclient.codeplex.com/license から
' 1) HgCo.WindowsLive.SkyDriveWebClient.dll
' 2) HgCo.WindowsLive.SkyDriveWebClient.XML
' 3) HtmlAgilityPack.dll
' をダウンロードしてディレクトリ内に置いて下さい
' ********************************************************
Sub Main()

	Dim wcSkyDrive As SkyDriveWebClient = New SkyDriveWebClient()

	' SkyDrive としては、50 M までの大きさのファイルをアップロード
	' できるはずですが、ある程度の大きさでタイムアウトが発生するので
	' 指定しています( ミリ秒 )
	wcSkyDrive.Timeout = 600000

	Dim myWebFolder As WebFolderInfo

	Console.WriteLine("処理を開始します")

	Try
		Console.WriteLine("ログオンしています....")
		wcSkyDrive.LogOn("ユーザー", "パスワード")

		' WEB 上からあらかじめ、ルートに ソフトウェア というディレクトリを作成しています
		' ★ 実際のアクセス許可と一致させる必要があるようです
		' ★ 一致して無くても処理は最後までやって、アップロードできないようです
		' 1) プライベート指定
		myWebFolder = WebFolderInfo.CreateRootWebFolderInstance("ソフトウェア", WebFolderItemShareType.Private)
		' 2) パブリック指定
		'myWebFolder = WebFolderInfo.CreateRootWebFolderInstance("ソフトウェア", WebFolderItemShareType.Public)

		' 未確認
		' MyNetwork
		' PeopleSelected

		' アップロード

		AddHandler wcSkyDrive.UploadWebFileProgressChanged, AddressOf UploadProgressCallback

		Console.WriteLine("アップロード処理を開始します....")
		wcSkyDrive.UploadWebFile("c:\WinOfSql102.lzh", myWebFolder)
		Console.WriteLine()
		Console.WriteLine("処理が終了しました")

	Catch ex As Exception
		Console.WriteLine(ex)
	End Try

End Sub

' ********************************************************
' アップロードした経過を改行せずに同じ場所に表示
' ********************************************************
Sub UploadProgressCallback( sender As Object, e As UploadWebFileProgressChangedEventArgs )

	Dim x As Integer = Console.CursorLeft
	Dim y As Integer = Console.CursorTop

	Console.WriteLine( "                              " )
	Console.CursorLeft = x
	Console.CursorTop = y

	if e.BytesSent <> 0 and e.TotalBytesToSent then
		Console.WriteLine( Math.Floor(e.BytesSent * 100 / e.TotalBytesToSent).ToString() + "% " + _
		 e.BytesSent.ToString() + "/" + e.TotalBytesToSent.ToString() )
	end if

	Console.CursorLeft = x
	Console.CursorTop = y

End Sub 


End Module



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

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

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

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

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


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

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

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

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

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