Webページの情報を取得して、処理するプログラムを教えて下さい


例えば、以下のサイトで『今週金曜の21-23の参加人数が8人以上の場合、abc@gmail.comにメールで状況をお知らせ』するようなプログラムを作り、Windows標準のタスクスケジューラーに登録して毎週木曜に実行しようと考えています。
http://labola.jp/reserve/shop/769/menu/personal

VBscriptでHTMLを取得して、制御構文で作成できそうですが、私ではプログラムを作成できませんでした。そこで、①又は②のプログラムを作成又は教えて頂けますようお願いします。
①上記処理ができるVBscriptのコード
②他の最適なプログラムの作成(新たな環境の設定・インストールはあまりしたくありません)

(具体的な解決策のみにポイントを付与する予定です。よろしくお願い致します。)

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/02/02 07:27:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:braahmaNa No.1

回答回数23ベストアンサー獲得回数9

ポイント1000pt

こんな感じですかね。
下のプログラムをコピーしてShift-JISで保存。
ファイル名は何でも良いですが、拡張子をjsにして下さい(Jscriptなので)
ファイル最下部の「貴方のアドレス」と「貴方のパスワード」部分にGmailのアドレスとパスワードを入力。

これで動作しますが、現在は参加人数が0なのでメールは飛びません。
動作確認したい場合は、アドレスの少し上「最低参加人数」を8から変更して0とかにして下さい。

この下からコピー
↓↓




// ------------------ jQueryでスクレイピング ------------------



// 現在のページ内でjQueryを有効化する(スクレイピングしやすいように)
function ie_inject_jquery( ie ){

// 既に$があるか
//if( ie.document.$ ) return;

// script要素を新規作成
var elem_head = ie.document.getElementsByTagName('head')[0];
var elem_script = ie.document.createElement('script');
elem_script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js";
// https://developers.google.com/speed/libraries/devguide#jquery

// ロード完了時のイベントを定義
var load_complete = false;
elem_script.onload = function(){
load_complete = true;
};

// HEADにscriptタグを追加
elem_head.appendChild( elem_script );

// scriptのロード完了まで待つ
while( load_complete ){
WScript.Sleep( 500 );
}

// $を評価可能になるまで待つ
while( ! ie.document.parentWindow.$ ){
WScript.Sleep( 500 );
}

// WSHのグローバルで参照を定義
$ = ie.document.parentWindow.$;
//log("IEにjQuery注入完了");

return;
}

/*
// IE上でjQueryを使う
function $( s ){
return ie.document.parentWindow.$( s, ie.document );
}

↑ $.trim など様々な関数に対応したいので,
この関数は不要。

*/


// 遷移先の全ページ内でjQueryを有効化する
always_enable_JQuery = false;
function ie_enableJQuery(){
always_enable_JQuery = true;
}



// ------------------ IEの基本操作 ------------------



// IE起動
function getIE()
{
var ie = WScript.CreateObject("InternetExplorer.Application")
var url = "about:blank";
ie.Visible = false;
ie_goto_url( ie, url );
//log("ブラウザでのアクセスを開始します。");

return ie;
}


// IEがビジー状態の間待ちます
function ie_wait_while_busy( ie, _url )
{
var timeout_ms = 45 * 1000;
var step_ms = 100;
var total_waited_ms = 0;

while( ( ie.Busy ) || ( ie.readystate != 4 ) )
{
WScript.Sleep( step_ms );

// タイムアウトか?
total_waited_ms += step_ms;
if( total_waited_ms >= timeout_ms )
{
/*log(
"警告:タイムアウトのため,リロードします。("
+ ie.LocationURL
// http://blog.livedoor.jp/programlog/archives/298228.html
+ ")"
);*/

// どこかに移動中なら,そこへの移動を再試行
if( _url )
{
//log( _url + "への遷移を再試行");
ie_goto_url( ie, _url );
}
else
{
log( "リロード中");

// 移動先が明示されていなければリロード
ie.document.location.reload( true );
ie_wait_while_busy( ie );
}

break;
}
}

WScript.Sleep( 1000 )
}
// http://d.hatena.ne.jp/language_and_engineering/20100310/p1
// http://d.hatena.ne.jp/language_and_engineering/20100403/p1


// ページを移動
function ie_goto_url( ie, url ){
//log("アクセスします:" + url);
ie.Navigate( url );
ie_wait_while_busy( ie, url );
//log("ページを開きました。");

// IEで常にjQueryを使うか
if( always_enable_JQuery ){
ie_inject_jquery( ie );
}
}


// デバッグ用
function log(s){
WScript.Echo(s);
}

function send_gmail(msg){
// 「CDO.Message」オブジェクト生成
var cdoMsg = new ActiveXObject("CDO.Message");
// 送信元設定
cdoMsg.From = gmail_address;
// 送信先設定
cdoMsg.To = gmail_address;
// 題名設定
cdoMsg.Subject = "金曜フットサルの参加人数が" + min_num + "人以上です";
// 本文設定
cdoMsg.Textbody = msg;
// CDOオブジェクトコンフィグ用名前空間
var namespace = "http://schemas.microsoft.com/cdo/configuration/";
// 送信にネットワークを利用、「2」(cdoSendUsingPort)を設定
cdoMsg.Configuration.Fields.Item(namespace + "sendusing") = 2;
// SMTPサーバ設定
cdoMsg.Configuration.Fields.Item(namespace + "smtpserver") = "smtp.gmail.com";
// SMTPポート設定
cdoMsg.Configuration.Fields.Item(namespace + "smtpserverport") = 465;
// Basic認証、「1」(cdoBasic)を設定
cdoMsg.Configuration.Fields.Item(namespace + "smtpauthenticate") = 1;
// 認証ユーザ設定
cdoMsg.Configuration.Fields.Item(namespace + "sendusername") = gmail_address;
// 認証パスワード設定
cdoMsg.Configuration.Fields.Item(namespace + "sendpassword") = gmail_password;
// SSLを使用
cdoMsg.Configuration.Fields.Item(namespace + "smtpusessl") = true;

// コンフィグアップデート
cdoMsg.Configuration.Fields.Update();

// メール送信
cdoMsg.Send();

// 後処理
cdoMsg = null;
}

function main(){
// IE起動
var ie = getIE();
// 今後の遷移先の全ページ内でjQueryによるスクレイピングを有効化
ie_enableJQuery();

// 遷移
ie_goto_url( ie, "http://labola.jp/reserve/shop/769/menu/personal" );

// スクレイピング実行
var selector = "#layout_content > div > div > table > tbody tr";
var num_append = 0;
var msg = "";
$(selector).each(function(){
var tds = $(this).children().get();
if ( tds[0].innerText.indexOf('金') != -1){
num_append = parseInt(tds[3].innerText) - parseInt(tds[4].innerText);
if ( num_append >= min_num ){
msg = tds[0].innerText + " " + tds[1].innerText + "の参加人数は" + num_append + "人です";
send_gmail(msg);
return false;
}
}
return true;
});
ie.Quit();
ie = null;
}

// 最低参加人数
var min_num = 8;

// gmailのアドレスとパスワード。
var gmail_address = "貴方のアドレス";
var gmail_password = "貴方のパスワード";

// ------------------メイン処理 ------------------
main();

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません