Sleipnir Script BBS



タイトル「画像BBSのURL抽出&保存」
カテゴリ: Sleipnir用スクリプト全般
記事No: 339 [関連記事]
投稿日: 2009/02/03(Tue) 21:49
投稿者由々識
URLhttp://yuyulab.hp.infoseek.co.jp/
/**********************************************************

	「画像BBSのURL抽出&保存」Ver. 1.06

					Produced by 由々識

画像掲示板の画像URLを抽出し、保存します。

**********************************************************/

/* 自分の環境に合わせ設定してください。*/

var defDir = '';	//ダウンロード先のフォルダのパス。
var ext = '.jpg .jpeg .gif .png .bmp';	//ダウンロードしたいファイルのURLの末尾。
var uwagaki = false;	//これを true にすると同名のファイルが存在しても上書き確認せずに上書き保存します。
var wait503 = 7500;	//ダウンロードの際、「503 Service Temporarily Unavailable」を返され場合の待機時間(ミリ秒)。

/*********************************************************/

var pnir, id, doc, SScript, ScriptName, PnirVer, PnirLang, AD, ActDoc, blnend, strDocList, strImgList, nid, ndoc, nwindow, ActDocURL, regext, DocReferrer, DocCookie, strdocTitle, arrImgList, imgListlen, i, num, charset, n, strHTMLlist, e;

SScript = (typeof(sleipnir) == 'object');

/* 現在の document を取得 */
if (SScript){
	WScript = sleipnir;
} else {
	pnir = new ActiveXObject("Sleipnir.API");
	id = pnir.GetDocumentID(pnir.ActiveIndex);
	doc = pnir.GetDocumentObject(id);
	PnirVer = pnir.Version;
	PnirLang = (PnirVer < 200) ? 'japanese' : pnir.GetProfileStringEx('General', 'Language', 'english', pnir.UserPath + 'setting\\user.ini');
	blnend = false;
}

ScriptName = WScript.ScriptName.replace(/\.[^\.]*$/, '');

/* ダイアログウィンドウを表示 */
function PopupDialogbox(d_text, d_time, d_type){
	var objWSHShell, n;
	objWSHShell = WScript.CreateObject("WScript.Shell");
	n = objWSHShell.Popup(d_text, d_time, ScriptName, d_type);
	objWSHShell = null;
	return(n);
}

/* 2連続beep音を鳴らす */
function ErrorBeep(ffreq){
	var fi;
	for (fi = 0; fi<ffreq; fi++){
		pnir.Beep();
		WScript.Sleep(100);
	}
}

/* 相対パスを絶対パス化 */
function UrlCorrect(base_url, lnkURL, fdocURL){
	var fbase_url, flnkURL;
	fbase_url = base_url.replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/, '');
	flnkURL = lnkURL;
	if ((/^[a-zA-Z]+\:\/\//).test(flnkURL)){
		return(flnkURL);	//絶対パスならそのまま返す。
	} else if ((/^\#/).test(flnkURL)){
		return(fdocURL.replace(/\#[\s\S]*$/, '') + flnkURL);	//ページ内移動の場合。
	} else {
		if ((/^\/\/[^\/\\]+/).test(flnkURL)){
			void (/^[a-zA-Z]+\:/).test(fbase_url);
			flnkURL = RegExp.lastMatch + flnkURL;
		} else if ((/^[\/]/).test(flnkURL)){
			void (/^[a-zA-Z]+\:[\/]+[^\/]+\//).test(fbase_url);
			flnkURL = RegExp.lastMatch + flnkURL.replace(/^\//, '');
		} else {
			flnkURL = fbase_url + flnkURL;
		}
		flnkURL = flnkURL.replace(/\/(?:\.\/)+/g, '\/');
		while ((/[^\/]\/[^\/]+\/\.\.\//).test(flnkURL)){
			flnkURL = flnkURL.replace(/([^\/]\/)[^\/]+\/\.\.\//, '$1');
		}
		return(flnkURL);
	}
}

/* HTMLをダウンロード */
function DownloadHTML() {
	var oXmlHttp, fstr, farglen, fURL, fURL2, fReferer, farrCookie, fi, fhttpmethod, fhttpsend, fstrCookie;
	farglen = Math.min(arguments.length, 3);
	switch (farglen){
		case 3:
			farrCookie = arguments[2];
		case 2:
			fReferer = arguments[1];
		case 1:
			fURL2 = fURL = arguments[0];
			break;
		default:
			return('');
	}
	if ((/^http[s]?\:\/\//).test(fURL)){
		oXmlHttp = new ActiveXObject("MSXML2.ServerXMLHTTP");
		if (fURL.search(/\tPOST$/) != -1){
			fhttpmethod = 'POST';
			fURL = fURL.replace(/\tPOST$/, '');
			fhttpsend = fURL.replace(/^[^\?]+[\?]?/, '');
			fURL = fURL.replace(/\?[\s\S]*$/, '');
		} else {
			fhttpmethod = 'GET';
			fhttpsend = '';
		}
		fURL = fURL.replace(/#[\s\S]*$/, '');
		try{
			oXmlHttp.open(fhttpmethod, fURL, true, "", "");
		} catch(e){
			return('');
		}
		if (farrCookie){
			farrCookie = CookieJudgment(farrCookie, fURL, ActDocURL);
		}
		if (farrCookie){
			fstrCookie = '';
			for (fi = 0; fi<farrCookie.length; fi++){
				fstrCookie += farrCookie[fi].replace(/\;[^\;]*/g,'') + '\; ';
			}
			oXmlHttp.setRequestHeader("Cookie", fstrCookie.replace(/\; $/, ''));
		}
		if (fReferer){
			fReferer = fReferer.replace(/#[\s\S]*$/, '');
			oXmlHttp.setRequestHeader("Referer", fReferer);
		}
		oXmlHttp.setRequestHeader("If-Modified-Since", ' ');
		oXmlHttp.setRequestHeader("Accept", 'image\/gif\, image\/x-xbitmap\, image\/jpeg\, image\/pjpeg\, application\/xaml+xml\, application\/vnd\.ms-xpsdocument\, application\/x-ms-xbap\, application\/x-ms-application\, application\/x-shockwave-flash\, \*\/\*');
		oXmlHttp.setRequestHeader("Content-Type", 'application/x-www-form-urlencoded');
		oXmlHttp.setRequestHeader("User-Agent", 'Mozilla\/4\.0 \(compatible\; MSIE 7\.0\; Windows NT 6\.0\; SLCC1\)');
		if ((/Shift_JIS|sjis/i).test(charset)){
			try {
				oXmlHttp.send(fhttpsend);
			} catch(error) {
				return('');
			}
			while (oXmlHttp.readyState < 2){WScript.Sleep(100);}
			fstatus = oXmlHttp.status;
			//pnir.OutputAddString(String(num) + '  ' + fstatus + '  ' + fURL2);
			if (fstatus == 503){
				oXmlHttp.abort();
				WScript.Sleep(wait503);
				fstr = DownloadHTML(fURL2, fReferer, farrCookie);
			} else if (fstatus == 200){
				while (oXmlHttp.readyState < 4){WScript.Sleep(100);}
				fstr = BinaryToText(oXmlHttp.responseBody, 'Shift_JIS');
			} else {
				oXmlHttp.abort();
				fstr = ''
			}
		} else {
			try {
				oXmlHttp.send(fhttpsend);
			} catch(error) {
				return('');
			}
			while (oXmlHttp.readyState < 2){WScript.Sleep(100);}
			fstatus = oXmlHttp.status;
			//pnir.OutputAddString(String(num) + '  ' + fstatus + '  ' + fURL2);
			if (fstatus == 503){
				oXmlHttp.abort();
				WScript.Sleep(wait503);
				fstr = DownloadHTML(fURL2, fReferer, farrCookie);
			} else if (fstatus == 200){
				while (oXmlHttp.readyState < 4){WScript.Sleep(100);}
				fstr = oXmlHttp.responseText;
			} else {
				oXmlHttp.abort();
				fstr = ''
			}
		}
		oXmlHttp = null;
		return(fstr);
	} else {
		return('');
	}
}

/* document.write から HTML を生成して置換 */
function DocumentWriteHTMLConvert(fstrHTML){
	var fstrBody, farrScriptTag, farrDocWrite, fScriptTaglen, fDocWritelen, fregspt, fregdoc, fregwrt, fi, fj, fstrTemp, e;
	fregspt = /<script[\s\S]+?<\/script>/ig;
	fregdoc = /document\.write(?:ln|)\([\s\S]+?\)\;/g;
	fregwrt = /document\.write(?:ln|)\(([\s\S]+?)\)\;/;
	if ((/<body[\s\S]+<\/body>/i).test(fstrHTML)){
		fstrBody = RegExp.lastMatch;
		farrScriptTag = new Array();
		farrScriptTag = fstrBody.match(fregspt);
		if (farrScriptTag){
			fScriptTaglen = farrScriptTag.length;
			for (fi=0; fi<fScriptTaglen; fi++){
				fstrTemp = '';
				farrDocWrite = new Array();
				farrDocWrite = farrScriptTag[fi].match(fregdoc);
				if (farrDocWrite){
					fDocWritelen = farrDocWrite.length;
					for (fj=0; fj<fDocWritelen; fj++){
						if (fregwrt.test(farrDocWrite[fj])){
							try {
								fstrTemp += eval(RegExp.$1);
							} catch(e) {
								//エラーが出たらなにもしない。
							}
						}
					}
					if (fstrTemp){
						fstrHTML = fstrHTML.replace(new RegExp(farrScriptTag[fi].replace(/[\\\r\n\t\f\b\v]/g, RegEscapeAdd).replace(/[\^\$\*\+\?\.\{\}\[\]\(\)\:\=\!\|\-]/g, '\\$&')), fstrTemp);
					}
				}
				farrDocWrite = null;
			}
		}
		farrScriptTag = null;
	}
	return(fstrHTML);
}

function RegEscapeAdd($0,$1,$2){
	return(($0 == '\\') ? '\\\\' : (($0 == '\r') ? '\\r' : (($0 == '\n') ? '\\n' : (($0 == '\t') ? '\\t' : (($0 == '\f') ? '\\f' : (($0 == '\b') ? '\\b' : '\\v'))))));
}

/* Cookieがリンク先で有効か判定 */
function CookieJudgment(farrCookie, fURL, fdocURL){
	var i, fCookielen, fCdomain, fCpath;
	fCookielen = farrCookie.length;
	if (farrCookie){
		for (i = 0; i<fCookielen; i++){
			fCdomain = ((/domain=([^\;\r\n ]*)/).test(farrCookie[i])) ? RegExp.$1 : fdocURL.replace(/^http[s]?\:\/\//i, '').replace(/\/[^\/]*/g, '');
			if (fURL.replace(/^http[s]?\:\/\//i, '').replace(/\/[^\/]*/g, '').indexOf(fCdomain) == -1){
				farrCookie.splice(i, 1);
				i--;
				fCookielen--;
			} else {
				if (farrCookie[i].search(/path=([^\;\r\n ]*)/) != -1){
					fCpath = RegExp.$1;
					if (fURL.replace(/^http[s]?\:\/\/[^\/]*/i, '').indexOf(fCpath) == -1){
						farrCookie.splice(i, 1);
						i--;
						fCookielen--;
					}
				}
			}
		}
	} else {
		return(null);
	}
	if (farrCookie && farrCookie.length == 0){farrCookie = null;}
	return(farrCookie);
}

/* URLから任意のHTMLヘッダを取得(戻り値は配列です) */
function GetRESPHeader(f_HeaderLabel, f_url, freferer){
	var oXmlHttp, farrTemp, re;
	oXmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
	oXmlHttp.open("HEAD", f_url.replace(/#[\s\S]*$/, ''), false, "", "");
	oXmlHttp.setRequestHeader("Referer", freferer.replace(/#[\s\S]*$/, ''));
	oXmlHttp.send();
	farrTemp = new Array();
	re = new RegExp('^' + f_HeaderLabel + ': [^\n]*$', 'gm');
	farrTemp = oXmlHttp.getAllResponseHeaders().match(re);
	if (farrTemp){
		farrTemp = farrTemp.join('\r\n').replace(new RegExp(f_HeaderLabel + ': ', 'g'), '').split('\r\n');
	}
	oXmlHttp = null;
	return(farrTemp);
}

/* ローカルに保存されているCookieからURLに該当するものを取得 */
function GetLocalCookie(fstrURL){
	var fso, objShell, objFolder, COOKIES, ForReading, TristateFalse, cookieFilelen, fi, fj, objTextStream, fName, fValue, fDP, arrCookie, num, strPath;
	COOKIES = 33;
	ForReading = 1;
	TristateFalse = 0;
	fso = new ActiveXObject("Scripting.FileSystemObject");
	objShell = WScript.CreateObject("Shell.Application");
	objFolder = objShell.Namespace(COOKIES);
	cookieFilelen = objFolder.Items().Count;
	arrCookie = new Array();
	num = -1;
	for (fi=0; fi<cookieFilelen; fi++){
		strPath = objFolder.Items().Item(fi).Path;
		if (strPath.search(/\.txt/) != -1){
			objTextStream = fso.OpenTextFile(objFolder.Items().Item(fi).Path, ForReading, false, TristateFalse);
			do {
				fName = objTextStream.ReadLine();
				fValue = objTextStream.ReadLine();
				fDP = objTextStream.ReadLine();
				if (fstrURL.indexOf(fDP) != -1){
					num++;
					arrCookie[num] = fName + '=' + fValue + '\; domain=' + fDP.replace(/([^\/])(\/[\s\S]*)$/, '$1') + '\; path=' + RegExp.$2;
				}
				for (fj=0; fj<6; fj++){
					objTextStream.SkipLine();
				}
			} while (!objTextStream.AtEndOfStream);
			objTextStream.Close();
		}
	}
	objTextStream = null;
	objFolder = null;
	objShell = null;
	fso = null;
	if (arrCookie.length == 0){arrCookie = null;}
	return(arrCookie);
}

/* HTML文字列からURLを抽出 */
function URLExtraction() {
	var farglen, fstr, fdocURL, freg6, freg8, fregrnc, farrAnchortag, fAnchortaglen, fbaseURL, fstrURL, fstrTemp, fi;
	farglen = Math.min(arguments.length, 2);
	switch (farglen){
		case 2:
			fdocURL = arguments[1];
		case 1:
			fstr = arguments[0];
			break;
		default:
			return('');
	}
	fstr = fstr.replace(/href[\s]=/ig, 'href=');
	freg6 = /<a\s(?:[^>]+[\s\"\'])?href=(?![\"\']?mailto\:|[\"\']?ftp\:|[\"\']?telnet\:|[\"\']?mms\:|[\"\']?rtsp\:|[\"\']?tel\:|[\"\']?javascript\:|[\"\']?news\:|[\"\']?file\:|[\"\']?\#[\"\' ])[^\\][^>]+>|<area\s(?:[^>]+[\s\"\'])?href=(?![\"\']?mailto\:|[\"\']?ftp\:|[\"\']?telnet\:|[\"\']?tel\:|[\"\']?javascript\:|[\"\']?news\:|[\"\']?file\:|[\"\']?\#[\"\' ])[^\\][^>]+>/ig;
	freg8 = /[\s\"\']href=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregrnc = /\r|\n|<\!--[^\!]+?<\/a>[^\!]*?-->/ig;
	farrAnchortag = new Array();
	farrAnchortag = fstr.replace(fregrnc, '').match(freg6);
	if (farrAnchortag){
		fAnchortaglen = farrAnchortag.length;
		fstrTemp = '';
		fbaseURL = BaseURL(fstr);
		if (fbaseURL){
			if (!fdocURL){
				fdocURL = fbaseURL;
			}
		} else {
			if (fdocURL){
				fbaseURL = fdocURL.replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/,'');
			}
		}
		for (fi = 0; fi<fAnchortaglen; fi++){
			if (freg8.test(farrAnchortag[fi])){
				fstrURL = (RegExp.$2 + RegExp.$3).replace(/\&amp\;/g, '\&');
				if (fdocURL){
					fstrURL = UrlCorrect(fbaseURL, fstrURL, fdocURL);
				}
				fstrTemp += fstrURL + '\r\n';
			}
		}
		fstrTemp = fstrTemp.replace(/\r\n$/,'');
		farrAnchortag = null;
		return(fstrTemp);
	} else {
		return('');
	}
}

/* HTML文字列から画像を抽出 */
function IMGTagExtraction(fstr, fdocURL){
	var freg6, freg8, fregrn, farrImagetag, fImagetaglen, fstrTemp, fbaseURL, fstrURL, fi;
	freg6 = /<IMG\s(?:[^>]+[\s\"\'])?src=(?![\"\']?mailto\:|[\"\']?ftp\:|[\"\']?telnet\:|[\"\']?mms\:|[\"\']?rtsp\:|[\"\']?tel\:|[\"\']?javascript\:|[\"\']?news\:|[\"\']?file\:|[\"\']?\#[\"\' ])[^\\][\s\S]+?>/ig;
	freg8 = /[\s\"\']src=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)( [^>]*|))>/i;
	fregrn = /\r|\n/ig;
	farrImagetag = new Array();
	farrImagetag = fstr.replace(fregrn, '').match(freg6);
	if (farrImagetag){
		fImagetaglen = farrImagetag.length;
		fstrTemp = '';
		fbaseURL = BaseURL(fstr);
		if (fbaseURL){
			if (!fdocURL){
				fdocURL = fbaseURL;
			}
		} else {
			if (fdocURL){
				fbaseURL = fdocURL.replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/,'');
			}
		}
		for (fi = 0; fi<fImagetaglen; fi++){
			if (freg8.test(farrImagetag[fi])){
				fstrURL = (RegExp.$2 + RegExp.$3);
				if (fstrURL.indexOf('\?') == -1 && regext.test(fstrURL)){
					if (fdocURL){
						fstrURL = UrlCorrect(fbaseURL, fstrURL, fdocURL);
					}
					fstrTemp += fstrURL + '\r\n';
				}
			}
		}
		fstrTemp = fstrTemp.replace(/\r\n$/,'');
		farrImagetag = null;
		return(fstrTemp);
	} else {
		return('');
	}
}

/* HTML文字列内から<BASE>タグのhref属性を抽出 */
function BaseURL(fstr){
	return((((/<BASE\s[^>]*href=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/ig).test(fstr.replace(/<BODY[\s\S]+<\/BODY>/i, ''))) ? RegExp.$2 + RegExp.$3 : '').replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/, ''));
}

/* URLリストから任意の拡張子へのリンクを抽出 */
function IMGLinkExtraction(fstrImgList){
	var farrURLLIst, fURLListlen, fstr, fi;
	farrURLLIst = new Array();
	farrURLLIst = fstrImgList.split('\r\n');
	fURLListlen = farrURLLIst.length;
	if (fURLListlen == 1 && !farrURLLIst[0]){fURLListlen = 0;}
	fstr = '';
	for (fi = 0; fi<fURLListlen; fi++){
		if (regext.test(farrURLLIst[fi].replace(/\tPOST$/, '').replace(/\?[\s\S]*$/, ''))){
			fstr += farrURLLIst[fi] + '\r\n';
		}
	}
	fstr = fstr.replace(/\r\n$/,'');
	farrURLLIst = null;
	return(fstr);
}

/* HTMLからFORMのURLを抽出 */
function FORMExtraction(fstrHTML, fdocURL){
	var fregfom, fregact, fregmtd, fregipt, fregnam, fregval, fregrnc, farrFORM, farript, fstrTemp, fFORMlen, fiptlen, fbaseURL, fi, fj, fstrURL, fstrmtd, fstrname, fstrvalue;
	fregfom = /<FORM\s[^>]+>[\s\S]+?<\/FORM(?:\s[^>]+)?>/ig;
	fregact = /[\s\"\']action=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregmtd = /[\s\"\']method=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregipt = /<input\s(?:[^>]+[\s\"\'])?(?:name=[^>]+?value|value=[^>]+?name)=[^>]+>/ig;
	fregnam = /[\s\"\']name=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregval = /[\s\"\']value=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregrnc = /\r|\n|<\!--[^\!]+?<\/a>[^\!]*?-->/ig;
	farrFORM = new Array();
	fstrTemp = '';
	farrFORM = fstrHTML.replace(fregrnc, '').match(fregfom);
	if (farrFORM){
		fFORMlen = farrFORM.length;
		fbaseURL = BaseURL(fstrHTML);
		if (!fbaseURL){
			fbaseURL = fdocURL.replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/,'');
		}
		for (fi = 0; fi<fFORMlen; fi++){
			if (fregact.test(farrFORM[fi])){
				fstrURL = RegExp.$2 + RegExp.$3;
				void fregmtd.test(farrFORM[fi]);
				fstrmtd = (fregmtd.test(farrFORM[fi])) ? (RegExp.$2 + RegExp.$3).toUpperCase() : 'GET';
				farript = new Array();
				farript = farrFORM[fi].match(fregipt);
				if (farript){
					fiptlen = farript.length;
					fstrURL += '\?';
					for (fj = 0; fj<fiptlen; fj++){
						if (fregnam.test(farript[fj])){
							fstrname = RegExp.$2 + RegExp.$3;
							fstrvalue = (fregval.test(farript[fj])) ? RegExp.$2 + RegExp.$3 : '';
							fstrURL += fstrname + '=' + fstrvalue + '\&';
						}
					}
					fstrURL = fstrURL.replace(/\&$/g, '').replace(/\?$/g, '');
				}
				fstrTemp += UrlCorrect(fbaseURL, fstrURL, fdocURL) + ((fstrmtd.indexOf('POST') != -1) ? '\tPOST' : '') + '\r\n';
				farript = null;
			}
		}
		fstrTemp = fstrTemp.replace(/\r\n$/,'');
		farrFORM = null;
		return(fstrTemp);
	} else {
		return('');
	}
}

/* HTMLからMETAタグの refresh のURLを抽出 */
function MetaExtraction(fstrHTML, fdocURL){
	var fregmet, fregcnt, fregrnc, farrMETA, fstrTemp, fMETAlen, fbaseURL, fi, fstrURL;
	fregmet = /<META\sHTTP-EQUIV=[\"\']?refresh[^>]+>/ig;
	fregcnt = /[\s\"\']CONTENT=(?:([\"\'])[0-9]+\;url\=([^\"\'>]+)\1[^>]*|[0-9]+\;url\=([^\"\' >]+)(?: [^>]*|))>/i;
	fregrnc = /\r|\n|<\!--[^\!]+?<\/a>[^\!]*?-->/ig;
	farrMETA = new Array();
	fstrTemp = '';
	farrMETA = fstrHTML.replace(fregrnc, '').replace(/<BODY[\s\S]+<\/BODY>/i, '').match(fregmet);
	if (farrMETA){
		fMETAlen = farrMETA.length;
		fbaseURL = BaseURL(fstrHTML);
		if (!fbaseURL){
			fbaseURL = fdocURL.replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/,'');
		}
		for (fi = 0; fi<fMETAlen; fi++){
			if (fregcnt.test(farrMETA[fi])){
				fstrURL = RegExp.$2 + RegExp.$3;
				fstrTemp += UrlCorrect(fbaseURL, fstrURL, fdocURL) + '\r\n';
			}
		}
		fstrTemp = fstrTemp.replace(/\r\n$/,'');
		return(fstrTemp);
	} else {
		return('');
	}
}

/* HTML内のFORMから次のページのURLを抽出 */
function NextDocFormExtraction(fstrHTML, fdocURL){
	var fregfom, fregact, fregmtd, fregipt, fregnam, fregval, fregrnc, farrFORM, farript, fstrTemp, fFORMlen, fiptlen, fbaseURL, fi, fj, fstrURL, fstrmtd, fstrname, fstrvalue;
	fregfom = /<FORM\s[^>]+>[\s\S]+?<\/FORM(?:\s[^>]+)?>/ig;
	fregact = /[\s\"\']action=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregmtd = /[\s\"\']method=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregipt = /<input\s(?:[^>]+[\s\"\'])?(?:name=[^>]+?value|value=[^>]+?name)=[^>]+>/ig;
	fregnam = /[\s\"\']name=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregval = /[\s\"\']value=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)(?: [^>]*|))>/i;
	fregrnc = /\r|\n|<\!--[^\!]+?<\/a>[^\!]*?-->/ig;
	farrFORM = new Array();
	fstrTemp = '';
	farrFORM = fstrHTML.replace(fregrnc, '').match(fregfom);
	if (farrFORM){
		fFORMlen = farrFORM.length;
		fbaseURL = BaseURL(fstrHTML);
		if (!fbaseURL){
			fbaseURL = fdocURL.replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/,'');
		}
		for (fi = 0; fi<fFORMlen; fi++){
			if (farrFORM[fi].search(/次|next|>>|≫|\&gt\;\&gt\;|\&raquo\;|\=\"[0-9]+\"/i) != -1){
				if (fregact.test(farrFORM[fi])){
					fstrURL = RegExp.$2 + RegExp.$3;
					void fregmtd.test(farrFORM[fi]);
					fstrmtd = (fregmtd.test(farrFORM[fi])) ? (RegExp.$2 + RegExp.$3).toUpperCase() : 'GET';
					farript = new Array();
					farript = farrFORM[fi].match(fregipt);
					if (farript){
						fiptlen = farript.length;
						fstrURL += '\?';
						for (fj = 0; fj<fiptlen; fj++){
							if (fregnam.test(farript[fj])){
								fstrname = RegExp.$2 + RegExp.$3;
								void fregval.test(farript[fj]);
								fstrvalue = (fregval.test(farript[fj])) ? RegExp.$2 + RegExp.$3 : '';
								fstrURL += fstrname + '=' + fstrvalue + '\&';
							}
						}
						fstrURL = fstrURL.replace(/\&$/g, '').replace(/\?$/g, '');
					}
					fstrTemp += UrlCorrect(fbaseURL, fstrURL, fdocURL) + ((fstrmtd.indexOf('POST') != -1) ? '\tPOST' : '') + '\r\n';
					farript = null;
				}
			}
		}
		fstrTemp = fstrTemp.replace(/\r\n$/,'');
		return(fstrTemp);
	} else {
		return('');
	}
}

/* HTML内のAnchorから次のページのURLを抽出 */
function NextDocAnchorExtraction(fstrHTML, fdocURL){
	var freg6, freg8, fregrnc, farrAnchortag, fAnchortaglen, fstrTemp, fbaseURL, fi, fstrURL, fstrAll, farrTemp, fTemplen;
	freg6 = /<a\s(?:[^>]+[\s\"\'])?href=(?![\"\']?mailto\:|[\"\']?ftp\:|[\"\']?telnet\:|[\"\']?mms\:|[\"\']?rtsp\:|[\"\']?tel\:|[\"\']?javascript\:|[\"\']?news\:|[\"\']?file\:|[\"\']?\#[\"\' ])[^\\][\s\S]+?>[\s\S]*?<\/a\s*>|<area\s(?:[^>]+[\s\"\'])?href=(?![\"\']?mailto\:|[\"\']?ftp\:|[\"\']?telnet\:|[\"\']?tel\:|[\"\']?javascript\:|[\"\']?news\:|[\"\']?file\:|[\"\']?\#[\"\' ])[^\\][^>]*>/ig;
	freg8 = /[\s\"\']href=(?:([\"\'])([^\"\'>]+)\1[^>]*|([^\"\' >]+)( [^>]*|))>/i;
	fregrnc = /\r|\n|<\!--[^\!]+?<\/a>[^\!]*?-->/ig;
	farrAnchortag = new Array();
	farrAnchortag = fstrHTML.replace(fregrnc, '').match(freg6);
	if (farrAnchortag){
		fAnchortaglen = farrAnchortag.length;
		fstrTemp = '';
		fstrAll = '';
		fbaseURL = BaseURL(fstrHTML);
		if (fbaseURL){
			if (!fdocURL){
				fdocURL = fbaseURL;
			}
		} else {
			if (fdocURL){
				fbaseURL = fdocURL.replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/,'');
			}
		}
		for (fi = 0; fi<fAnchortaglen; fi++){
			if (farrAnchortag[fi].search(/次|next|>>|≫|\&gt\;\&gt\;|\&raquo\;|>[\[]?[0-9]+[\]]?<\/a|>[\[]?all[\]]?<\/a/i) != -1 && freg8.test(farrAnchortag[fi])){
				fstrURL = (RegExp.$2 + RegExp.$3).replace(/\&amp\;/g, '\&');
				if (fdocURL){
					fstrURL = UrlCorrect(fbaseURL, fstrURL, fdocURL);
				}
				if (farrAnchortag[fi].search(/>[\[]?all[\]]?<\/a/i) != -1){
					if (fstrAll == ''){
						fstrAll = fstrURL;
					}
				} else {
					fstrTemp += fstrURL + '\r\n';
				}
			}
		}
		fstrTemp = fstrTemp.replace(/\r\n$/,'');
		farrAnchortag = null;
		if (fstrAll != ''){
			farrTemp = new Array();
			farrTemp = fstrTemp.split('\r\n');
			fTemplen = farrTemp.length;
			if (fTemplen == 1 && !farrTemp[0]){fTemplen = 0;}
			for (fi = 0; fi<fTemplen; fi++){
				if (strDocList.indexOf('\n' + farrTemp[fi] + '\n') == -1){
					strDocList += farrTemp[fi] + '\n';
				}
			}
			farrTemp = null;
			return(fstrAll);
		} else {
			return(fstrTemp);
		}
	} else {
		return('');
	}
}

/* ディレクトリ下判定 */
// 第1引数が第2引数のディレクトリ下にあれば true, そうでなければ false。
function DirectoryJudgment(fstrURL1, fstrURL2){
	var fstr2;
	fstr2 = fstrURL2.replace(/^[a-zA-Z]+\:[\/]+/, '').replace(/\?[\s\S]*$/, '').replace(/[^\/]+$/, '');
	return(fstrURL1.indexOf(fstr2) != -1);
}

/* URL,Referer,Cookie からファイルをダウンロードし、任意のパスに保存 */
function URLSaveAs(flnkURL, fReferer, fCookie, fPath){
	var oXmlHttp, stream, adTypeBinary, adSaveCreateOverwrite, adModeReadWrite, fURL, fhttpmethod, Fname, SFpath, SFtype, fstatus, farrLoCookie, farrCookie, fstrCookie, fi;
	fURL = flnkURL.replace(/\#[^\#]*$/, '');
	oXmlHttp = new ActiveXObject("MSXML2.ServerXMLHTTP");
	if (fURL.search(/\tPOST$/) != -1){
		fhttpmethod = 'POST';
		fURL = fURL.replace(/\tPOST$/, '').replace(/\?[\s\S]*$/, '');
	} else {
		fhttpmethod = 'GET';
	}
	oXmlHttp.open(fhttpmethod, fURL, true, "", "");
	farrLoCookie = new Array();
	farrLoCookie = GetLocalCookie(flnkURL);
	fstrCookie = '';
	if (farrLoCookie){
		for (fi = 0; fi<farrLoCookie.length; fi++){
			fstrCookie += farrLoCookie[fi].replace(/\;[^\;]*/g,'') + '\; ';
		}
	} else if (fCookie){
		farrCookie = new Array();
		farrCookie = CookieJudgment(fCookie, flnkURL, fReferer);
		if (farrCookie){
			for (fi = 0; fi<farrCookie.length; fi++){
				fstrCookie += farrCookie[fi].replace(/\;[^\;]*/g,'') + '\; ';
			}
		}
	}
	if (fstrCookie != ''){
		oXmlHttp.setRequestHeader("Cookie", fstrCookie.replace(/\; $/, ''));
	}
	oXmlHttp.setRequestHeader("Referer", fReferer);
	oXmlHttp.send();
	while (oXmlHttp.readyState < 2){WScript.Sleep(100);}
	fstatus = oXmlHttp.status;
	//pnir.OutputAddString(String(i + 1) + '  ' + fstatus + '  ' + flnkURL);
	if (fstatus == 200){
		adTypeBinary = 1;
		adSaveCreateOverwrite = 2;
		adModeReadWrite = 3;
		stream = new ActiveXObject("ADODB.stream");
		Fname = fURL.replace(/[^\/]*\//g, '').replace(/\?[\s\S]*$/, '').replace(/\.cgi$/, '\.htm');
		if (!Fname){
			Fname = 'index\.htm';
		}
		SFpath = fPath + Fname;
		if (!SFpath){
			oXmlHttp.abort();
		} else {
			while (oXmlHttp.readyState < 4){
				if (pnir.ShiftDown && pnir.CtrlDown && !pnir.AltDown){
					oXmlHttp.abort();
					return(false);
				}
				WScript.Sleep(100);
			}
			stream.type = adTypeBinary;
			stream.mode = adModeReadWrite;
			stream.open();
			stream.write(oXmlHttp.responseBody);
			stream.savetofile(SFpath, adSaveCreateOverwrite);
			stream.close();
		}
	} else if (fstatus == 503){
		stream = null;
		oXmlHttp = null;
		WScript.Sleep(wait503);
		return(URLSaveAs(flnkURL, fReferer, fCookie, fPath));
	}
	farrCookie = null;
	farrLoCookie = null;
	stream = null;
	oXmlHttp = null;
	return(true);
}

/* Imageフィルター */
//URL等から不要な画像を削除。
function IMGFilter(fstrImgList, fstrHTML, fdocURL, fblnDLink){
	var fregDURL, fregHTML, farrFilter, farrImgList, fImglen, fi, fj, fFilterlen;
	fregDURL = /^$/;
	fregHTML = /^$/;
	if (fregDURL.test(fdocURL) || fregHTML.test(fstrHTML)){return('');}
	farrFilter = new Array();
	//(DocumentURL, DocumentHTML, DirectLink, ImageURL, Leave)
	farrFilter[0] = new Array(undefined, /Powered by <a href=\"http\:\/\/www\.imgbbs\.jp\/">画像掲示板imgbbs\.jp<\/a> Engine/i, undefined, /\/img\/[0-9]+\./, true);
	farrFilter[1] = new Array(/imgbbs[0-9]+.artemisweb.jp/, undefined, undefined, /\/img\/l[0-9]+_/, true);
	farrFilter[2] = new Array(/joyful2ch\.cgi/, /<br>Edit\:<a href\=\'http\:\/\/www\.supra\.cx\/joyful2chMe\/index\.html\' target\=\'_top\'>KAZ\([0-9]+\)<\/a>/i, true, /\/img\/[0-9]+\./, true);
	farrFilter[3] = new Array(undefined, /<\!-- GazouBBS v[0-9]+\.[0-9]+ -->/, undefined, /\/(?:src|img)\//, true);
	farrFilter[4] = new Array(undefined, /<DIV ALIGN=\"RIGHT\"><B>FREE <A HREF\=\"http\:\/\/www\.big\.or\.jp\/~talk\/welcome\/welcome7\.cgi\">imgboard/i, undefined, /\/img-box\/img[0-9]+\./, true);
	farrFilter[5] = new Array(undefined, /<a href\=\"http\:\/\/zurubon\.strange-x\.com\/uploader\/\" target\=\"_blank\">ずるぽんあぷろだ/i, undefined, /\/img\//, true);
	farrFilter[6] = new Array(/^http\:\/\/freeup\.jp\/bbs\/\?id\=/, undefined, undefined, /\/upfile\/[0-9]+\./, true);
	farrFilter[7] = new Array(/^http\:\/\/imgb\.rentalcgi\.com\//, undefined, false, /http\:\/\/[a-z]\.rentalcgi\.com\/view/, true);
	farrFilter[8] = new Array(/^http\:\/\/[^\.\/\:]+\.[0-9]+\.bbs\.fc2\.com\//, undefined, undefined, /^http\:\/\/bbs[0-9]+\.fc2\.com\/\/bbs\/img\/_/, true);
	farrFilter[9] = new Array(/^http\:\/\/www\.akai-cup\.jp\/[^\/]+\/bbs\.cgi/, undefined, undefined, /^http\:\/\/www\.akai-cup\.jp\/[^\/]+\/bbsdata\/img\/[0-9]+\./, true);
	farrFilter[10] = new Array(/^http\:\/\/i-bbs\.sijex\.net\/image(?:Board|Disp)\.jsp\?id\=/, undefined, undefined, /^http\:\/\/image\.i-bbs\.sijex\.net\/bbs\/[^\/]+\/[0-9]+o\./, true);
	farrFilter[11] = new Array(undefined, /<a href=\"http\:\/\/sugachan\.dip\.jp\/download\/\" target=\"_blank\"><small>Sn Uploader<\/small>/, undefined, /\/(?:src|img)\/[^\/]+\.(?:bmp|jp[e]?g|gif|png)$/, true);
	farrFilter[12] = new Array(/http\:\/\/www\.anonib\.com\/_/, undefined, undefined, /\/images\/[0-9]+\/(?!_t)/, true);
	fFilterlen = farrFilter.length;
	farrImgList = new Array();
	farrImgList = fstrImgList.split('\r\n');
	fImglen = farrImgList.length;
	if (fImglen == 1 && !farrImgList[0]){return('');}
	for (fj = 0; fj<fFilterlen; fj++){
		if ((farrFilter[fj][0] == null || farrFilter[fj][0].test(fdocURL)) && (farrFilter[fj][1] == null || farrFilter[fj][1].test(fstrHTML)) && (farrFilter[fj][2] == null || !(fblnDLink ^ farrFilter[fj][2]))){
			for (fi = fImglen - 1; fi>=0; fi--){
				if (farrImgList[fi] != '' && (farrFilter[fj][3] == null || (farrFilter[fj][3].test(farrImgList[fi]) ^ farrFilter[fj][4]))){
					farrImgList[fi] = '';
				}
			}
		}
	}
	farrFilter = null;
	return(farrImgList.join('\r\n').replace(/^(?:\r\n)+|(?:\r\n)+$|\n\r/g, ''));
}

function LinkFilter(fstrNextDocList, fstrHTML, fdocURL){
	var fregDURL, fregHTML, farrFilter, farrNextDocList, fNextDocListlen, fi, fj, fFilterlen;
	fregDURL = /^$/;
	fregHTML = /^$/;
	if (fregDURL.test(fdocURL) || fregHTML.test(fstrHTML)){return('');}
	farrFilter = new Array();
	//(DocumentURL, DocumentHTML, LinkURL, Leave)
	farrFilter[0] = new Array(undefined, /Powered by <a href=\"http\:\/\/www\.imgbbs\.jp\/">画像掲示板imgbbs\.jp<\/a> Engine/i, /new\.html|bbs\.cgi/, false);
	farrFilter[1] = new Array(/imgbbs[0-9]+.artemisweb.jp/, undefined, /search\.html|\/m\/|edit\.cgi|mode=(?:res|del|add_confirm)/, false);
	farrFilter[2] = new Array(/joyful2ch\.cgi/, /<br>Edit\:<a href\=\'http\:\/\/www\.supra\.cx\/joyful2chMe\/index\.html\' target\=\'_top\'>KAZ\([0-9]+\)<\/a>/i, /joyful2ch-hi.cgi/, false);
	farrFilter[3] = new Array(undefined, /<\!-- GazouBBS v[0-9]+\.[0-9]+ -->/, /denview=(?:view|admin)|mode=(?:idelreq|dodelreq|usrdel|admin|regist)|c2s1\.html/, false);
	farrFilter[4] = new Array(undefined, /<DIV ALIGN="RIGHT"><B>FREE <A HREF=\"http\:\/\/www\.big\.or\.jp\/~talk\/welcome\/welcome7\.cgi\">imgboard/i, /mode\=(?:keitai|search|disp_admin)/, false);
	farrFilter[5] = new Array(undefined, /<a href\=\"http\:\/\/zurubon\.strange-x\.com\/uploader\/\" target\=\"_blank\">ずるぽんあぷろだ/i, /page\=[0-9]+/, false);
	farrFilter[6] = new Array(/^http\:\/\/freeup\.jp\/bbs\/\?id\=/, undefined, /mode\=new|(?:new|search|upfile|kaisetu)\.cgi/, false);
	farrFilter[7] = new Array(/^http\:\/\/imgb\.rentalcgi\.com\/bbs\//, undefined, /mode\=(res|find|admin|regist)/, false);
	farrFilter[8] = new Array(/^http\:\/\/[^\.\/\:]+\.[0-9]+\.bbs\.fc2\.com\//, undefined, /\?pos\=[0-9]+/, true);
	farrFilter[9] = new Array(/^http\:\/\/www\.akai-cup\.jp\/[^\/]+\/bbs\.cgi/, undefined, /mode\=edtin|pick\=on|wrt\=new/, false);
	farrFilter[10] = new Array(/^http\:\/\/i-bbs\.sijex\.net\/imageBoard\.jsp\?id\=/, undefined, /\&count\=[0-9]+$|imageDisp.jsp/, true);
	farrFilter[11] = new Array(undefined, /<a href=\"http\:\/\/sugachan\.dip\.jp\/download\/\" target=\"_blank\"><small>Sn Uploader<\/small>/, /upload\.cgi|\/src\/[^/\.]+\.(?!bmp|jpg|jpeg|gif|png)/, false);
	farrFilter[12] = new Array(/http\:\/\/www\.anonib\.com\/_/, undefined, /index.php\?(?:t\=[0-9]+|b\=1\&g\=[0-9]+)$/, true);
	fFilterlen = farrFilter.length;
	farrNextDocList = new Array();
	farrNextDocList = fstrNextDocList.split('\r\n');
	fNextDocListlen = farrNextDocList.length;
	if (fNextDocListlen == 1 && !farrNextDocList[0]){return('');}
	for (fj = 0; fj<fFilterlen; fj++){
		if ((farrFilter[fj][0] == null || farrFilter[fj][0].test(fdocURL)) && (farrFilter[fj][1] == null || farrFilter[fj][1].test(fstrHTML))){
			for (fi = fNextDocListlen - 1; fi>=0; fi--){
				if (farrNextDocList[fi] != '' && (farrFilter[fj][2] == null || (farrFilter[fj][2].test(farrNextDocList[fi]) ^ farrFilter[fj][3]))){
					farrNextDocList[fi] = '';
				}
			}
		}
	}
	farrFilter = null;
	return(farrNextDocList.join('\r\n').replace(/^(?:\r\n)+|(?:\r\n)+$|\n\r/g, ''));
}

/* Main1 */
function Main1(fdocURL, fDocReferrer){
	if (pnir.ShiftDown && pnir.CtrlDown && !pnir.AltDown){
		blnend = true;
	}
	if (!blnend && strDocList.indexOf('\n' + fdocURL.replace(/\tPOST$/, '').replace(/#[\s\S]*$/, '') + '\n') == -1){
		var farrImgList, fstrHTML, fstrLinkList, fstrImgList, fImglen, fi, farrNextDocList, fNextDocListlen, fregext, fregcgi, fstrTemp;
		pnir.AddressBarString = '解析中 ' + String(++num) + '  ' + fdocURL;
		/* ページ内のリンクから画像URLを抽出 */
		farrImgList = new Array();
		fstrHTML = DocumentWriteHTMLConvert(DownloadHTML(fdocURL, fDocReferrer, DocCookie));
		fstrLinkList = (URLExtraction(fstrHTML, fdocURL) + '\r\n' + FORMExtraction(fstrHTML, fdocURL) + '\r\n' + MetaExtraction(fstrHTML, fdocURL)).replace(/^\r\n|\r\n$|\n\r/g, '').replace(/\#[\s\S]*?$/gm, '');
		fstrImgList = IMGFilter(IMGLinkExtraction(fstrLinkList), fstrHTML, fdocURL, true);
		farrImgList = fstrImgList.split('\r\n');
		fImglen = farrImgList.length;
		if (fImglen == 1 && !farrImgList[0] || fdocURL.search(/http\:\/\/www\.anonib\.com\/_[^\/]+\/(?:index\.php\?b\=1\&g\=[0-9]+|)$/) != -1){fImglen = 0;}
		for (fi = 0; fi<fImglen; fi++){
			fstrTemp = farrImgList[fi].replace(/\tPOST$/, '');
			if (strImgList.indexOf('\n' + fstrTemp + '\n') == -1 && strImgList.indexOf('\n' + fstrTemp + '\tPOST\n') == -1){
				strImgList += farrImgList[fi] + '\n';
			}
		}
		farrImgList = null;
		/* ページ内の画像を抽出 */
		farrImgList = new Array();
		fstrImgList = IMGFilter(IMGTagExtraction(fstrHTML, fdocURL), fstrHTML, fdocURL, false);
		farrImgList = fstrImgList.split('\r\n');
		fImglen = farrImgList.length;
		if (fImglen == 1 && !farrImgList[0]){fImglen = 0;}
		for (fi = 0; fi<fImglen; fi++){
			fstrTemp = farrImgList[fi].replace(/\tPOST$/, '');
			if (strImgList.indexOf('\n' + fstrTemp + '\n') == -1 && strImgList.indexOf('\n' + fstrTemp + '\tPOST\n') == -1 && fstrTemp.search(/small|thum|nail|s[0-9]*\.(?:bmp|jp[e]?g|gif|png)$/i) == -1){
				strImgList += farrImgList[fi] + '\n';
			}
		}
		strDocList += fdocURL.replace(/\tPOST$/, '').replace(/#[\s\S]*$/, '') + '\n';
		/* 次のページを抽出して処理 */
		farrNextDocList = new Array();
		farrNextDocList = LinkFilter((NextDocFormExtraction(fstrHTML, fdocURL) + '\r\n' + NextDocAnchorExtraction(fstrHTML, fdocURL)).replace(/^\r\n|\r\n$|\n\r/g, '').replace(/\#[\s\S]*?$/gm, ''), fstrHTML, fdocURL).split('\r\n');
		fNextDocListlen = farrNextDocList.length;
		if (fNextDocListlen == 1 && !farrNextDocList[0]){fNextDocListlen = 0;}
		for (fi = 0; fi<fNextDocListlen; fi++){
			if (DirectoryJudgment(farrNextDocList[fi], fdocURL)){
				Main1(farrNextDocList[fi], fdocURL);
			}
		}
		farrNextDocList = null;
		/* ページ内のリンク先を処理 */
		fregext = /.+\.msi$|.+\.exe$|.+\.com$|.+\.bat$|.+\.cmd$|.+\.scr$|.+\.js$|.+\.vbs$|.+\.wsf$|.+\.jar$|.+\.pif$|.+\.pl$|.+\.reg$|.+\.zip$|.+\.lzh$|.+\.cab$|.+\.rar$|.+\.tgz$|.+\.bz2$|.+\.7z$|.+\.dgc$|.+\.sit$|.+\.iso$|.+\.pdf$|.+\.torrent$|.+\.si$|.+\.xpi$|.+\.vob$|.+\.avi$|.+\.mp[e]?g$|.+\.mp[ae]$|.+\.m1v$|.+\.mpv2$|.+\.mp2v$|.+\.mov$|.+\.r[am]$|.+\.ra[m]?$|.+\.rpm$|.+\.mk[av]$|.+\.dvr-ms$|.+\.as[fx]$|.+\.wvx$|.+\.wm[advxz]?$|.+\.wa[vx]$|.+\.cda$|.+\.mp[234]$|.+\.m3u$|.+\.mid[i]?$|.+\.rmi$|.+\.aif[cf]$|.+\.au$|.+\.snd$|.+\.bmp$|.+\.jp[e]?g$|.+\.gif$|.+\.png$|.+\.txt$|.+\.doc$|.+\.xls$/i;
		farrNextDocList = new Array();
		farrNextDocList = LinkFilter(fstrLinkList, fstrHTML, fdocURL).split('\r\n');
		fNextDocListlen = farrNextDocList.length;
		if (fNextDocListlen == 1 && !farrNextDocList[0]){fNextDocListlen = 0;}
		fregcgi = /\?[\s\S]*$/;
		for (fi = 0; fi<fNextDocListlen; fi++){
			if (!fregext.test(farrNextDocList[fi].replace(fregcgi, '')) && (DirectoryJudgment(farrNextDocList[fi], fdocURL) || farrNextDocList[fi].indexOf('http\:\/\/imgb\.rentalcgi\.com\/view\/') != -1 || farrNextDocList[fi].search(/http\:\/\/upld\.dip\.jp\/[^\/]+\/ref\//) != -1)){
				Main2(farrNextDocList[fi], fdocURL, 2);
			}
		}
		farrImgList = null;
		farrNextDocList = null;
	}
}

/* Main2 */
function Main2(fdocURL, fDocReferrer, flimit){
	if (pnir.ShiftDown && pnir.CtrlDown && !pnir.AltDown){
		blnend = true;
	}
	if (!blnend && flimit > 0 && strDocList.indexOf('\n' + fdocURL.replace(/\tPOST$/, '').replace(/#[\s\S]*$/, '') + '\n') == -1){
		var farrImgList, fstrHTML, fstrLinkList, fstrImgList, fImglen, fi, farrNextDocList, fNextDocListlen, fregext, fregcgi, fstrTemp;
		pnir.AddressBarString = '解析中 ' + String(++num) + '  ' + fdocURL;
		/* ページ内のリンクから画像URLを抽出 */
		farrImgList = new Array();
		fstrHTML = DocumentWriteHTMLConvert(DownloadHTML(fdocURL, fDocReferrer, DocCookie));
		fstrLinkList = (URLExtraction(fstrHTML, fdocURL) + '\r\n' + FORMExtraction(fstrHTML, fdocURL) + '\r\n' + MetaExtraction(fstrHTML, fdocURL)).replace(/^\r\n|\r\n$|\n\r/g, '').replace(/\#[\s\S]*?$/gm, '');
		fstrImgList = IMGFilter(IMGLinkExtraction(fstrLinkList), fstrHTML, fdocURL, true);
		farrImgList = fstrImgList.split('\r\n');
		fImglen = farrImgList.length;
		if (fImglen == 1 && !farrImgList[0] || fdocURL.search(/http\:\/\/www\.anonib\.com\/_[^\/]+\/(?:index\.php\?b\=1\&g\=[0-9]+|)$/) != -1){fImglen = 0;}
		for (fi = 0; fi<fImglen; fi++){
			fstrTemp = farrImgList[fi].replace(/\tPOST$/, '');
			if (strImgList.indexOf('\n' + fstrTemp + '\n') == -1 && strImgList.indexOf('\n' + fstrTemp + '\tPOST\n') == -1){
				strImgList += farrImgList[fi] + '\n';
			}
		}
		farrImgList = null;
		/* ページ内の画像を抽出 */
		farrImgList = new Array();
		fstrImgList = IMGFilter(IMGTagExtraction(fstrHTML, fdocURL), fstrHTML, fdocURL, false);
		farrImgList = fstrImgList.split('\r\n');
		fImglen = farrImgList.length;
		if (fImglen == 1 && !farrImgList[0]){fImglen = 0;}
		for (fi = 0; fi<fImglen; fi++){
			fstrTemp = farrImgList[fi].replace(/\tPOST$/, '');
			if (strImgList.indexOf('\n' + fstrTemp + '\n') == -1 && strImgList.indexOf('\n' + fstrTemp + '\tPOST\n') == -1 && fstrTemp.search(/small|thum|nail|s[0-9]*\.(?:bmp|jp[e]?g|gif|png)$/i) == -1){
				strImgList += farrImgList[fi] + '\n';
			}
		}
		strDocList += fdocURL.replace(/\tPOST$/, '').replace(/#[\s\S]*$/, '') + '\n';
		/* 次のページを抽出して処理 */
		farrNextDocList = new Array();
		farrNextDocList = LinkFilter((NextDocFormExtraction(fstrHTML, fdocURL) + '\r\n' + NextDocAnchorExtraction(fstrHTML, fdocURL)).replace(/^\r\n|\r\n$|\n\r/g, '').replace(/\#[\s\S]*?$/gm, ''), fstrHTML, fdocURL).split('\r\n');
		fNextDocListlen = farrNextDocList.length;
		if (fNextDocListlen == 1 && !farrNextDocList[0]){fNextDocListlen = 0;}
		for (fi = 0; fi<fNextDocListlen; fi++){
			if (DirectoryJudgment(farrNextDocList[fi], fdocURL)){
				Main2(farrNextDocList[fi], fdocURL, flimit);
			}
		}
		farrNextDocList = null;
		/* ページ内のリンク先を処理 */
		fregext = /.+\.msi$|.+\.exe$|.+\.com$|.+\.bat$|.+\.cmd$|.+\.scr$|.+\.js$|.+\.vbs$|.+\.wsf$|.+\.jar$|.+\.pif$|.+\.pl$|.+\.reg$|.+\.zip$|.+\.lzh$|.+\.cab$|.+\.rar$|.+\.tgz$|.+\.bz2$|.+\.7z$|.+\.dgc$|.+\.sit$|.+\.iso$|.+\.pdf$|.+\.torrent$|.+\.si$|.+\.xpi$|.+\.vob$|.+\.avi$|.+\.mp[e]?g$|.+\.mp[ae]$|.+\.m1v$|.+\.mpv2$|.+\.mp2v$|.+\.mov$|.+\.r[am]$|.+\.ra[m]?$|.+\.rpm$|.+\.mk[av]$|.+\.dvr-ms$|.+\.as[fx]$|.+\.wvx$|.+\.wm[advxz]?$|.+\.wa[vx]$|.+\.cda$|.+\.mp[234]$|.+\.m3u$|.+\.mid[i]?$|.+\.rmi$|.+\.aif[cf]$|.+\.au$|.+\.snd$|.+\.bmp$|.+\.jp[e]?g$|.+\.gif$|.+\.png$|.+\.txt$|.+\.doc$|.+\.xls$/i;
		farrNextDocList = new Array();
		farrNextDocList = LinkFilter(fstrLinkList, fstrHTML, fdocURL).split('\r\n');
		fNextDocListlen = farrNextDocList.length;
		if (fNextDocListlen == 1 && !farrNextDocList[0]){fNextDocListlen = 0;}
		fregcgi = /\?[\s\S]*$/;
		for (fi = 0; fi<fNextDocListlen; fi++){
			if (!fregext.test(farrNextDocList[fi].replace(fregcgi, '')) && (DirectoryJudgment(farrNextDocList[fi], fdocURL) || farrNextDocList[fi].indexOf('http\:\/\/imgb\.rentalcgi\.com\/view\/') != -1 || farrNextDocList[fi].search(/http\:\/\/upld\.dip\.jp\/[^\/]+\/ref\//) != -1)){
				Main2(farrNextDocList[fi], fdocURL, flimit - 1);
			}
		}
	}
}

/* ActiveDocumentClass */
function ActiveDocument(objDoc){
	this.getComplete = GetDocument(objDoc);
}

function GetDocument(objDoc){
	try {
		while (objDoc.activeElement.tagName.search(/FRAME$/i) != -1){
			objDoc = objDoc.activeElement.contentWindow.document;
		}
		return(true);
	}
	catch(error) {
		return(false);
	}
	finally {
		ActiveDocument.prototype.self = objDoc;
	}
}

function BinaryToText(fbuffer, fcharset){
	var stm, adTypeBinary, adTypeText;
	adTypeBinary = 1;
	adTypeText = 2;
	stm = new ActiveXObject("ADODB.Stream");
	stm.Type = adTypeBinary;
	stm.Open();
	stm.Write(fbuffer);
	stm.Position = 0;
	stm.Type = adTypeText;
	stm.Charset = fcharset;
	return (stm.ReadText());
}

if (SScript){
	if (sleipnir.API != null){
		sleipnir.CreateObject("WScript.Shell").Run('\"' + sleipnir.ScriptFullName + '\"');
	} else {
		void PopupDialogbox('このスクリプトを使用するには 「Sleipnirオプション|クライアント|全般」 の\r\n「スクリプトによるクライアントの操作を許可する」 にチェックを入れてください。\r\n\r\nなお、NT系のWindowsで上記操作を行うにはAdministrator権限が必要です。', 0, 16);
	}
} else {
	/* ウィンドウが開かれていない場合は機能説明を表示 */
	if (pnir.GetCount() == 0){
		void PopupDialogbox('〜機能説明〜\r\n\r\n アクティブなウィンドウのページを解析して\r\n 各ページから画像へのリンクのURLを抽出します。', 0, 64);
	} else if(doc != null){
		AD = new ActiveDocument(doc);
		if (AD.getComplete){
			ActDoc = AD.self;
			ActDocURL = ActDoc.URL;
			strDocList = '\n';
			strImgList = '\n';
			num = 0;
			charset = ActDoc.charset;
			ext = ext.replace(/[\\\^\$\*\+\?\.\{\}\[\]\(\)\:\=\!\|\-]/g, '\\$&').replace(/^[\s]+|[\s]+$/g, '').replace(/[\s]+/g, '\$\|') + '\$';
			regext = new RegExp();
			regext.compile(ext, "i");
			/* アクティブなページから Referrer を取得 */
			DocReferrer = ActDoc.referrer;
			if (!DocReferrer){
				DocReferrer = ActDocURL;
			}
			/* Cookie を取得 */
			DocCookie = GetLocalCookie(ActDocURL);
			if (!DocCookie){
				/* アクティブなページから Cookie を取得 */
				if (ActDocURL.search(/^http\:\/\/upld\.dip\.jp\//) != -1){
					DocCookie = GetRESPHeader("Set-Cookie", 'http\:\/\/upld\.dip\.jp\/agreement\.php\?answer=yes_18', 'http\:\/\/upld\.dip\.jp\/agreement\.php');
				} else if (ActDocURL.search(/^http\:\/\/moe\.homelinux\.net\//) != -1){
					DocCookie = GetRESPHeader("Set-Cookie", 'http\:\/\/moe\.homelinux\.net\/accept2\.php\?over18\=1\&accept\=\%82\%CD\%82\%A2', 'http\:\/\/moe\.homelinux\.net\/rule\.php');
				} else {
					DocCookie = (ActDocURL.search(/^http[s]?\:\/\//) != -1) ? GetRESPHeader("Set-Cookie", ActDocURL, DocReferrer) : null;
				}
			}
			/* Main1 */
			Main1(ActDocURL, DocReferrer);
			pnir.AddressBarString = pnir.URL;
			if (!blnend){
				if (strImgList == '\n'){
					void PopupDialogbox('画像ファイルは抽出できませんでした。', 0, 64);
				} else {
					/* 画像URLの抽出結果を新しいウィンドウで一覧表示 */
					strdocTitle = doc.title;
					if (!strdocTitle){
						strdocTitle = ActDocURL;
					}
					strHTMLlist = '';
					arrImgList = new Array();
					arrImgList = strImgList.replace(/^\n|\n$/g, '').split('\n');
					arrImgList.sort().reverse();
					imgListlen = arrImgList.length;
					for (i = 0; i<imgListlen; i++){
						strHTMLlist += '<A href=\"' + arrImgList[i].replace(/\tPOST$/, '') + '\"' + ((arrImgList[i].search(/\tPOST$/) != -1) ? ' httpmethod = \"POST\"' : '') + '>' + arrImgList[i].replace(/\tPOST$/, '') + '<\/A><BR\r\n>';
						if ((i + 1) % 100 == 0){
							strHTMLlist += String(i + 1) + ' 個<BR\r\n>';
						}
					}
					nid = pnir.NewWindow('about:blank',true);
					ndoc = pnir.GetDocumentObject(nid);
					nwindow = pnir.GetWindowObject(nid);
					ndoc.open();
					ndoc.writeln('<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN\">\r\n'
							+ '<!-- ' + ScriptName + ' -->\r\n'
							+ '<HTML lang=\"ja\"><HEAD>\r\n'
							+ '<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text\/html\; charset=UTF-16\">\r\n'
							+ '<META HTTP-EQUIV=\"Content-Style-Type\" CONTENT=\"text\/css\">\r\n'
							+ '<META NAME=\"Author\" CONTENT=\"yuyushiki\">');
					if (DocCookie){
						for (i = 0; i<DocCookie.length; i++){
							ndoc.writeln('<META HTTP-EQUIV=\"Set-Cookie\" CONTENT=\"' + DocCookie[i].replace(/\r|\n/g, '') + '\">');
						}
					}
					ndoc.writeln('<BASE target=\"_blank\">\r\n'
							+ '<LINK rev=\"made\" title=\"' + ((PnirLang == 'japanese') ? '配布元' : 'Script download site') + '\" href=\"http:\/\/yuyulab\.hp\.infoseek\.co\.jp\/index\.html\">\r\n'
							+ '<LINK rev=\"parent\" title=\"' + ((PnirLang == 'japanese') ? '抽出元' : 'Source page') + '\" href=\"' + ActDocURL + '\">\r\n'
							+ '<TITLE>' + strdocTitle + '<\/TITLE>\r\n'
							+ '<style type=\"text\/css\">\r\n'
							+ '<!--\r\n'
							+ 'BODY{font-family:\"MS PGothic\"\,sans-serif\; font-size:10pt\; background-color:\#CCCCFF\; color:black\; margin-left:10px\; margin-right:10px\;}\r\n'
							+ '-->\r\n'
							+ '<\/style>\r\n'
							+ '<\/HEAD>\r\n'
							+ '<BODY><DIV>'
							+ strHTMLlist
							+ '<\/DIV><\/BODY><\/HTML>');
					ndoc.close();
					if (PopupDialogbox(imgListlen + ' 個の画像URLが抽出されました。\r\n画像を今すぐダウンロードしますか?\r\n\r\n抽出結果リストに選択範囲があると、その画像だけダウンロードできます。', 0, 32 + 4) == 6){
						var sel_obj, fso, objFolder, objShell, SFpath, imgsrc, filename;
						try {
							sel_obj = ndoc.selection.createRange();	//選択範囲
						} catch(e) {
							sel_obj = null;
						}
						if (sel_obj && ndoc.selection.type != 'None' && sel_obj.htmlText){
							arrImgList = null;
							arrImgList = new Array();
							arrImgList = URLExtraction(sel_obj.htmlText).split('\r\n');
							imgListlen = arrImgList.length;
						}
						fso = new ActiveXObject("Scripting.FileSystemObject");
						if (defDir){
							objFolder = null;
						} else {
							objShell = WScript.CreateObject("Shell.Application");
							objFolder = objShell.BrowseForFolder(0, 'ファイルを保存するフォルダを指定して下さい。', 0x0040);
						}
						if (defDir || objFolder){
							SFpath = ((objFolder) ? objFolder.Items().Item().Path : defDir.replace(/[\/\\]+$/, '')) + '\\';
							/* ファイルをダウンロードし、任意のパスに保存 */
							for (i = 0; i<imgListlen; i++){
								if (pnir.ShiftDown && pnir.CtrlDown && !pnir.AltDown){
									void PopupDialogbox('ダウンロードを中止しました。', 10, 64);
									break;
								}
								pnir.AddressBarString = 'ダウンロード中  ' + String(i + 1) + ' \/ ' + imgListlen;
								imgsrc = arrImgList[i].replace(/\#[^\#]*$/, '');
								if (imgsrc.search(/^http/) != -1){
									filename = SFpath + imgsrc.replace(/[^\/]*\//g, '').replace(/\?[\s\S]*$/, '').replace(/\.cgi$/, '\.htm').replace(/\//g, '\\');
									if (!uwagaki && fso.FileExists(filename)){
										n = PopupDialogbox(filename.replace(/[^\\]*\\/g, '') + '\r\n\r\n は既に存在します。上書きしますか?', 0, 32 + 3);
										if (n == 7){
											continue;
										} else if (n != 6){
											break;
										}
									}
									if (!URLSaveAs(imgsrc, ActDocURL, DocCookie, SFpath)){break;}
								}
							}
							pnir.AddressBarString = pnir.URL;
						}
						objShell = null;
						objFolder = null;
					}
					arrImgList = null;
					nwindow = null;
					ndoc = null;
					nid = null;
				}
			}
			DocCookie = null;
			ActDoc = null;
		} else {
			ErrorBeep(2);
		}
		AD = null;
	}

	/* 終了処理 */
	doc = null;
	id = null;
	pnir = null;
}

- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 「画像BBSのURL抽出&保存」 【Sleipnir用スクリプト全般】 - 由々識 02/03-21:49 No.339


- Web Forum -   Modified by isso