// --------------------------------------------------------------------------- // 同一URLで画像取得する為の複数の正規表現が必要な場合に対応するオブジェクト // searchRegex : URLの正規表現 (ImageViewURLReplace.datの最初の項目「検索文字列1」に相当) // preLoadUrl : スクリプト内で一時的に読み込むWebページURL (ImageViewURLReplace.datで動作制御パラメータに$EXTRACTを指定した場合のTAB区切りの3番目の項目「リファラ文字列」に相当 ) function switcher(u, cx, searchRegex, preLoadUrl) { var self = this; if (typeof searchRegex == 'string' || searchRegex instanceof String) { searchRegex = new RegExp(searchRegex); } var _u = u; var _cx= cx; var _searchRegex = searchRegex; var _preLoadUrl = String(u).replace(searchRegex, preLoadUrl); v2c.println(_preLoadUrl); var regexes = []; var referer = ''; // addは複数回登録でき、ヒットするまで登録された順に検索する (通常はこれではなく下のadd又はaddRepOnlyを使用して下さい) // searchRegexOnPage : preLoadUrlのソース内からマッチさせる正規表現 (ImageViewURLReplace.datのTAB区切りの最後の項目「検索文字列2」に相当) // 文字列をがなし( '' )の場合はsearchRegex(検索文字列1)が対象になる // replaceStrOnPage : searchRegexOnPageを画像URLに置換する文字列 (ImageViewURLReplace.datのTAB区切りの2番目の項目「補正文字列」に相当) // searchRegexOnPageの文字列をがなし( '' )の場合はsearchRegex(検索文字列1)の正規表現を元にマッチさせる this.addEx = function (searchRegexOnPage, replaceStrOnPage ) { if (typeof searchRegexOnPage == 'string' || searchRegexOnPage instanceof String) { searchRegexOnPage = new RegExp(searchRegexOnPage); } regexes.push({reg: searchRegexOnPage, rep: replaceStrOnPage}); }; // preLoadUrlを読込み、そのソース内からマッチさせて画像URLを得る (ImageViewURLReplace.datの$EXTRACTを指定した場合と同等) // searchRegexOnPage : preLoadUrlのソース内からマッチさせる正規表現 (ImageViewURLReplace.datのTAB区切りの最後の項目「検索文字列2」に相当) // replaceStrOnPage : searchRegexOnPageを画像URLに置換する文字列 (ImageViewURLReplace.datのTAB区切りの2番目の項目「補正文字列」に相当) this.add = function(searchRegexOnPage, replaceStrOnPage) { self.addEx(searchRegexOnPage, replaceStrOnPage); }; // searchRegex(検索文字列1)を置換して画像URLとして扱う (ImageViewURLReplace.datの$EXTRACTを指定しない場合と同等) // 必ずヒットするはずなので一番最後にaddして下さい // replaceStr : searchRegexを画像URLに置換する文字列 this.addRepOnly = function(replaceStr) { self.addEx('', replaceStr); }; // 画像URLを開くときのリファラURLをセットする(setRefererXXXのいずれかは最後に指定したものだけ反映される) // refererUrl : リファラURL文字列 this.setReferer = function(refererUrl) { referer = refererUrl; }; // 画像URLを開くときのリファラURLをpreLoadUrlのソース内から正規表現で得る。(setRefererXXXのいずれかは最後に指定したものだけ反映される) // refererRegexOnPage: preLoadUrlのソース内から画像取得時に使用するリファラ文字列をマッチサせる正規表現 // refererRegexOnPageの文字列が無し( '' )の場合はsearchRegex(検索文字列1)が対象になる // refererReplaceOnPage : refererRegexOnPageをリファラ文字列に置換する文字列。 // refererRegexOnPageの文字列が無し( '' )の場合はsearchRegex(検索文字列1)の正規表現を元にマッチさせる // referer***OnPageが両方共が文字列無し( '' )の場合はリファラ文字列をセットしない this.setRefererOnPage = function(refererRegexOnPage, refererReplaceOnPage) { if (refererRegexOnPage && (typeof refererRegexOnPage == 'string' || refererRegexOnPage instanceof String)) { refererRegexOnPage = new RegExp(refererRegexOnPage); } referer = {reg: refererRegexOnPage, rep: refererReplaceOnPage}; }; // 画像URLを開くときのリファラURLsearchRegex(検索文字列1)を置換して得る。(setRefererXXXのいずれかは最後に指定したものだけ反映される) // replaceStr : searchRegexをリファラURLに置換する文字列 this.setRefererRepOnly = function(replaceStr) { referer = {reg: '', rep: replaceStr}; }; // 検索開始してヒットしたら画像URLを返す this.exec = function() { var s1 = ''; var loadfunc = function() { var u = '', stmp = ''; if (arguments.length > 0 && arguments[0] != null) { u = arguments[0]; } else { u = _preLoadUrl; } if (typeof u == 'string' || u instanceof String) { u = new java.net.URL(u); } var req = v2c.createHttpRequest(u); req.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0"); req.setRequestProperty("Accept-Language", "ja,en-us;q=0.7,en;q=0.3"); req.setRequestProperty("Accept-Encoding", "gzip, deflate"); req.setRequestProperty("Host", u.getHost()); stmp = String(req.getContentsAsString()); if (req.responseCode == 200) { return stmp; } else if (req.responseCode == 302) { return loadfunc(req.getResponseHeader('Location')); } else { self.printlnLog('Webページが読み込めませんでした。({0})', u); return ''; } }; var ret = ''; for (var i = 0; i < regexes.length; i++) { var item = regexes[i]; if (item.reg) { if (!s1) { if (!(s1 = loadfunc())) { self.printlnLog('検索に失敗しました。checkURLを見直して下さい。'); return ''; } } if (ret = item.reg.exec(s1)) { ret = ret[0].replace(item.reg, item.rep); break; } } else { if (ret = _searchRegex.exec(String(_u))) { ret = ret[0].replace(_searchRegex, item.rep); break; } } } if (referer) { if (typeof referer == 'object') { var tmp = ''; if (referer.reg && referer.rep) { if (!s1) { if (!(s1 = loadfunc())) { self.printlnLog('検索に失敗しました。checkURLを見直して下さい。'); return ''; } } if (tmp = referer.reg.exec(s1)) { referer = tmp[0].replace(referer.reg, referer.rep); } } else if (referer.reg == '' && referer.rep) { if (tmp = _searchRegex.exec(String(_u))) { referer = tmp[0].replace(_searchRegex, regerer.rep); } } } if (referer && (typeof referer == 'string' || referer instanceof String)) { cx.setRequestProperty('Referer', referer); } } return ret; }; this.printlnLog = function(format /*, ...*/) { var scriptName = v2c.getScriptSubFile('dummy').getParentFile().getName(); var message = format.replace(/\{(\d)\}/g, function(m, c) { return arguments[parseInt(c) + 1]; }); v2c.println("[" + scriptName + ".js] " + message); }; } // --------------------------------------------------------------------------- function checkURL(u,cx) { var tinami = new switcher(u, cx, 'http://tinami\\.jp/\\w{4}', '$&'); tinami.add('src="(http://img\\.tinami\\.com/illust\\d/(?:L/)?[^"]+\\.(?:jpe?g|png|gif|bmp))', '$1'); tinami.setRefererOnPage('"og:url"\\scontent="(http://www\\.tinami\\.com/view/\\d+)', '$1'); cx.applyImageViewURLReplace = false; return tinami.exec(); }