2013年01月19日


Seesaa に VBScript でログインする

HTTP でアクセスするオブジェクトは、サーバー用クライアント用と二つありますが、現時点ではサーバー用が優れているように思われます。この場合(記事下のサンプルコード)は、おそらくクライアント用では動かないと思いますが、少なくともタイムアウトの設定が可能なのは、サーバー用です。

経験上、クッキーの処理はオブジェクトが自動的に引き継いでいるようなので、このサンプルではクッキーの処理はありません。しかし、WEB サービスのシステムとして突然 URL にアクセスしても拒否されるので( Seesaa では、POST する場合は事前に表示されたページのキーが必要です )正規表現での処理が必要になります。

これが理由で、ページの HTML 構成が変更されると、この手のアプリケーションは動かなくなるので注意が必要です。( 今回を含めて過去に2回変更しています )

実際のブラウザで処理してネットワークの情報を読み、どのような情報が必要かは各ブラウザの開発者用ツールを使って確認しますが、IE のそれは役に立たないので注意して下さい。Google Chrome か Firefox を使うと良いです。

POST する場合は、HTTP ヘッダに "application/x-www-form-urlencoded" を送るのは HTTP の仕様なので必ず必要ですが、POST も通常の POST 以外に "multipart/form-data; boundary=xxxxxxx" というバイナリデータを送る事が可能な仕様もあります。そのあたりの仕様はなかなか解りづらいですが、ここでは説明していません。

Seesaa のシステムも人間の作ったアプリケーションなので、完璧では無いので、この手のアプリで対応しようとする場合、首をかしげるような時もありますが、だいたいにおいて『結果オーライ』で深く考えないほうがいいと思います。あと、システム的な不明点もあり、どうしてもこのサンプルで返ってくるページが utf-8 ではなく SHIFT_JIS でかえって来ます。しかし、次の処理には関係無いので『ログイン』としてはこれで OK であると思います。

テキストファイルへの書き込みは、取得したページを確認できるようにする為で処理とは直接関係はありません。
' ***********************************************************
' サーバーオブジェクトの準備
' ***********************************************************
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

' ***********************************************************
' 正規表現用
' ***********************************************************
Set regEx = New RegExp
' ***********************************************************
' ページ書き込み用
' ***********************************************************
Set Fs = CreateObject( "Scripting.FileSystemObject" )

' ログインページの取得
Call objHTTP.Open("GET","https://ssl.seesaa.jp/auth",False)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send()

' ページ全体
strPage = objHTTP.responseText

' 書き込み専用(2)で、存在しない場合は作成(True)
Set OutObj = Fs.OpenTextFile( "page_login.html", 2, True )
OutObj.Write objHTTP.responseText
OutObj.Close

' 投稿用のキーを取得
regEx.IgnoreCase = True
regEx.Global = True
regEx.Pattern = "authpost""><input value=""([^""]+)"""
Set Matches = regEx.Execute( strPage )
For Each Match in Matches
	strPostKey = Match.SubMatches(0)
	Exit For
Next

Wscript.Echo strPostKey

' ***********************************************************
' ログイン用の情報
' ***********************************************************
' Seesaa のログインユーザ( メールアドレス )
emailData = ""
' Seesaa のログインパスワード
passData = ""
' 対象となるブログの ID
blogData = ""

' ***********************************************************
' ログイン ( POST )
' ***********************************************************
' ログイン URL
Call objHTTP.Open("POST","https://ssl.seesaa.jp/auth",False)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
strData = ""
strData = strData & "aXt=" & strPostKey
strData = strData & "&email=" & emailData
strData = strData & "&password=" & passData
strData = strData & "&return_to=http%3A%2F%2Fblog.seesaa.jp%2F"
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
Call objHTTP.Send(strData)

Set OutObj = Fs.OpenTextFile( "page_login_after.html", 2, True )
OutObj.Write objHTTP.responseText
OutObj.Close

関連する記事

Seesaa ブログのエクスポートを呼び出して全てをバックアップするスクリプト

VBScript で Seesaaブログへ禁止ワード一括登録( アップロード )




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

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

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

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

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


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

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

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

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

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