fork(1) download
  1. //【登録場所】 "V2C\script\system\post.js"
  2. //【内容】post.jsのまとめ
  3. //【備考】checkBeforeCreateThreadとcheckBeforePostの{}内で、行頭のコメント「//」を、利用する行ごとに解除することで、有効になります。
  4. //【更新日時】2013/12/11 爆サイへの書き込みを追加
  5. //【スクリプト】
  6. // ----- 次の行から -----
  7. function checkBeforeCreateThread(wp){
  8. var post = true;
  9. return post
  10. /* スレ立て時の機能を有効にしたい場合、下の各行頭//を削除してください */
  11. && uneiitaCautionByBoard(wp) //スレ立て時、特定の板、かつ、スレタイに特定のキーワードが含まれていたら警告する
  12. && replaceh(wp) //自動でURL先頭のhを文字参照(16進数)に置換する。(デフォルトはV2C提示版)
  13. && checkSimilarThread(wp) //スレ立て重複チェック
  14. };
  15.  
  16. function checkBeforePost(wp){
  17. var post = true;
  18. return post
  19. /* レス書き込み時の機能を有効にしたい場合、下の各行頭//を削除してください */
  20. // && escapeCharRef(wp) //文字参照をそのままスレッドに表示させる(&を&に置換する、デフォルトはV2C提示版の'スクリプト'と'レス表示スタイル')
  21. && replaceh(wp) //自動でURL先頭のhを文字参照(16進数)に置換する。(デフォルトはV2C提示版)
  22. // && removeh(wp) //自動でURL先頭のh抜きをする。(デフォルトはtwitter以外)
  23. && replaceTab(wp) //書き込み時に【TAB】に自動置換(デフォルトはスレタイが'ImageViewURLReplace','ReplaceStr','URLExec')
  24. // && closeWritePanel(wp) //書き込み後自動で閉じる(常に行う場合、メニューの設定で可能です。デフォルトはtwitter以外)
  25. // && checkBlankName(wp) //名前欄が空欄 or !ninja or !denki以外で警告(デフォルトはローカル板とtwitter以外)
  26. // && reloadBeforePost(wp) //書き込み前に更新して新着があれば書き込まない ※勢いのあるスレではそのまま書き込む(デフォルトはローカル板とtwitter以外)
  27. // && checkMoitaKotehan(wp) //モ娘(狼)で「名無し募集中。。。」で書き込むときは警告を出さず他の板だと警告を出す
  28. && uneiitaCautionByRes(wp) //運営板で書き込むと規制されると予測される場所の場合書き込み時に警告をだす
  29. && writeFutabaThread(wp) //ふたばちゃんねるに書き込む
  30. && writeBakusaiThread(wp) //爆サイに書き込む
  31. };
  32.  
  33. function checkSimilarThread(wp) {
  34. // ---------------------------------------------------------------
  35. // [設定] 類似比較で重複と判断する閾値(低いほど文字列一致度が高い)(Default = 2 ※Partの数値が違う程度の一致度)
  36. var threshold = 2;
  37. // [設定] キャンセル時に重複スレッドを開く
  38. var openSimilar = true;
  39. // [設定] 現在時刻のlimit_msecミリ時間前以前に立ったスレッドは重複判定から除外する(前スレ除外用)(Default = 86400000 1日前)
  40. var limit_msec = 86400000;
  41. // ---------------------------------------------------------------
  42. var bbs = wp.thread.bbs;
  43. if (bbs.twitter || wp.thread.local) { return true; }
  44. try {
  45. var newThreadName = String(wp.title);
  46. var newThreadNormedName = normalize(newThreadName);
  47. var oldThreadNormedName = '';
  48. var matches = newThreadNormedName.match(/\d+/g);
  49. if (matches != null) {
  50. var tmp = newThreadNormedName.split(matches[matches.length - 1]);
  51. var num = parseInt(matches[matches.length - 1]) - 1;
  52. oldThreadNormedName = tmp.join(num.toString());
  53. }
  54. var bd = wp.thread.board;
  55. var ss = v2c.readURL(bd.url + 'subject.txt');
  56. if (v2c.interrupted) { return false; }
  57. if (!ss) { throw 'subject.txtの取得に失敗(' + bd.url +')'; }
  58. var lines = ss.split('\n');
  59. var results = [];
  60. var limit = getMSec(new Date()) - limit_msec;
  61. for (var i = 0; i < lines.length; i++) {
  62. if (/^(\d+)\.(?:dat<>|cgi,)(.+) ?\((\d+)\)/.test(lines[i])) {
  63. var item = {'org' : String(RegExp.$2), 'score' : 9999, 'key' : RegExp.$1};
  64. var t = parseInt(item.key + '000');
  65. if (t < limit) { continue; }
  66. var tmp = normalize(item.org);
  67. item.score = levenshtein(newThreadNormedName, tmp);
  68. if (item.score <= threshold) {
  69. if (oldThreadNormedName === tmp) { continue; } // パートスレの前スレは除外
  70. results.push(item);
  71. }
  72. }
  73. }
  74. if (results.length <= 0) { return true; }
  75. results.sort(function(a, b) { return a.score - b.score; });
  76. var mes = '重複の可能性があるスレッドを見つけました。\nタイトル:' + results[0].org + '\nスレ立てする場合は「OK」を押して下さい';
  77. if (openSimilar) { mes += '\n「キャンセル」を押すと重複スレを開きます'; }
  78. var post = v2c.confirm(mes);
  79. if (openSimilar && !post) {
  80. if (bbs.is2ch || bbs.is2cheq) {
  81. v2c.openURL('http://' + bd.url.getHost() + '/test/read.cgi/' + bd.key + '/' + results[0].key + '/');
  82. } else if (bbs.shitaraba) {
  83. v2c.openURL(bd.url + '/' + results[0].key + '/');
  84. } else if (bbs.machi) {
  85. var tmp = String(bd.url).replace(/http:\/\/(\w+\.machi\.to)\/(\w+)\//i, 'http://$1/bbs/read.cgi/$2/' + results[0].key + '/');
  86. v2c.openURL(tmp);
  87. }
  88. }
  89. return post;
  90. } catch(e) {
  91. v2c.println('[post.js : checkSimilarThread()] エラー: ' + e);
  92. return v2c.confirm('post.jsのスレ立て重複確認の実行に失敗しました。本機能を無視してスレ立てする場合は「OK」を押して下さい');
  93. }
  94. function getMSec(date) {
  95. var yy = date.getYear();
  96. var mm = date.getMonth();
  97. var dd = date.getDate();
  98. if (yy < 2000) { yy += 1900; }
  99. return (new Date(yy, mm, dd)).getTime();
  100. }
  101. // スレタイの正規化
  102. function normalize(s1) {
  103. //カッコを削除
  104. s1 = s1.replace(/[\[\(\<【({<[《〔][^\]\)\>】)}」』>]》〕]+[\]\)\>】)}>]》〕]/g, ''); // カッコの種類の「『 はタイトルに使われる場合があるので除外
  105. //全角英数字を半角に
  106. s1 = s1.replace(/[!-~]/g, function(s) {
  107. return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
  108. });
  109. //半角英数字をと日本語以外は削除。小文字を大文字に
  110. s1 = s1.replace(/[^一-龠ぁ-んァ-ヴa-zA-Z0-9\r\n]/ig, '').toUpperCase();
  111.  
  112. var hanKana = ['ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'パ', 'ビ', 'ピ', 'ブ', 'プ', 'ベ', 'ペ', 'ボ', 'ポ', 'ヴ',
  113. 'ァ', 'ア', 'ィ', 'イ', 'ゥ', 'ウ', 'ェ', 'エ', 'ォ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ッ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ',
  114. 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ャ', 'ヤ', 'ュ', 'ユ', 'ョ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ワ', 'ヲ', 'ン', '。', '「', '」', '、', '・', 'ー', '゙', '゚'];
  115. var zenKana = 'ガギグゲゴザジズゼゾダヂヅデドバパビピブプベペボポヴァアィイゥウェエォオカキクケコサシスセソタチッツテトナニヌネノハヒフヘホマミムメモャヤュユョヨラリルレロワワヲン。「」、・ー゛゜';
  116. var zenHira = 'がぎぐげござじずぜぞだぢづでどばぱびぴぶぷべぺぼぽゔぁあぃいぅうぇえぉおかきくけこさしすせそたちっつてとなにぬねのはひふへほまみむめもゃやゅゆょよらりるれろわわをん。「」、・ー゛゜';
  117. //全角カタカナひらがなを半角カタカナに
  118. s1 = s1.replace(/[ぁ-んァ-ヴ「」、・ー゛゜]/g, function(s) {
  119. var n = zenKana.indexOf(s);
  120. if (n != -1) { return hanKana[n]; }
  121. n = zenHira.indexOf(s);
  122. if (n != -1) { return hanKana[n]; }
  123. return '';
  124. });
  125. return s1;
  126. }
  127. // 文字列の類似比較用距離関数
  128. function levenshtein(s1, s2) {
  129. // http://k...content-available-to-author-only...d.net
  130. // + original by: Carlos R. L. Rodrigues (http://w...content-available-to-author-only...l.com)
  131. // + bugfixed by: Onno Marsman
  132. // + revised by: Andrea Giammarchi (http://w...content-available-to-author-only...t.com)
  133. // + reimplemented by: Brett Zamir (http://b...content-available-to-author-only...r.me)
  134. // + reimplemented by: Alexander M Beedie
  135. // * example 1: levenshtein('Kevin van Zonneveld', 'Kevin van Sommeveld');
  136. // * returns 1: 3
  137.  
  138. if (s1 == s2) {
  139. return 0;
  140. }
  141.  
  142. var s1_len = s1.length;
  143. var s2_len = s2.length;
  144. if (s1_len === 0) {
  145. return s2_len;
  146. }
  147. if (s2_len === 0) {
  148. return s1_len;
  149. }
  150.  
  151. // BEGIN STATIC
  152. var split = false;
  153. try{
  154. split=!('0')[0];
  155. } catch (e){
  156. split=true; // Earlier IE may not support access by string index
  157. }
  158. // END STATIC
  159. if (split){
  160. s1 = s1.split('');
  161. s2 = s2.split('');
  162. }
  163.  
  164. var v0 = new Array(s1_len+1);
  165. var v1 = new Array(s1_len+1);
  166.  
  167. var s1_idx=0, s2_idx=0, cost=0;
  168. for (s1_idx=0; s1_idx<s1_len+1; s1_idx++) {
  169. v0[s1_idx] = s1_idx;
  170. }
  171. var char_s1='', char_s2='';
  172. for (s2_idx=1; s2_idx<=s2_len; s2_idx++) {
  173. v1[0] = s2_idx;
  174. char_s2 = s2[s2_idx - 1];
  175.  
  176. for (s1_idx=0; s1_idx<s1_len;s1_idx++) {
  177. char_s1 = s1[s1_idx];
  178. cost = (char_s1 == char_s2) ? 0 : 1;
  179. var m_min = v0[s1_idx+1] + 1;
  180. var b = v1[s1_idx] + 1;
  181. var c = v0[s1_idx] + cost;
  182. if (b < m_min) {
  183. m_min = b; }
  184. if (c < m_min) {
  185. m_min = c; }
  186. v1[s1_idx+1] = m_min;
  187. }
  188. var v_tmp = v0;
  189. v0 = v1;
  190. v1 = v_tmp;
  191. }
  192. return v0[s1_len];
  193. }
  194. }
  195.  
  196. function uneiitaCautionByBoard(wp) {
  197. var post = true;
  198. if (wp.thread.bbs.is2ch) {
  199. /* スレ立て時、特定の板、かつ、スレタイに特定のキーワードが含まれていたら警告する例 */
  200. if (wp.thread.board.key.match(/^(operate|operatex|sec2ch|sec2chd|saku2ch|saku|sakud)$/) && wp.title.text.match(/(警告|規制|雑談)/)) {
  201. post = v2c.confirm('運営板で「警告」、「規制」、「雑談」、いずれかのワードが\n含まれているスレタイを立てるとISP規制の対象となります。\n本当にスレ立てを行いますか?');
  202. }
  203. }
  204. return post;
  205. }
  206.  
  207. function uneiitaCautionByRes(wp) {
  208. var post = true;
  209. if (wp.thread.bbs.is2ch) {
  210. /* 特定の板、かつ、スレタイに特定のキーワードが含まれているスレッドに書き込む場合に警告する例 */
  211. if (wp.thread.board.key.match(/^(saku2ch|saku)$/) && wp.thread.title.match(/(開示|警告|規制|削除)/)) {
  212. post = v2c.confirm('運営板への書き込みは妨害とみなされた場合ISP規制の対象となります。\n本当に書き込みを行いますか?');
  213. }
  214. /* 特定の板に書き込む場合に警告する例 */
  215. if (wp.thread.board.key.match(/^(sec2ch)$/)) {
  216. post = v2c.confirm('運営板への書き込みは妨害とみなされた場合ISP規制の対象となります。\n本当に書き込みを行いますか?');
  217. }
  218. /* 特定の板、かつ、★持ちのレスに特定のキーワードが含まれているスレッドに書き込む場合に警告する例 */
  219. if (wp.thread.board.key.match(/^(operate|operatex|sec2ch|sec2chd|saku2ch|saku|sakud)$/)) {
  220. for (var i = 0; i < wp.thread.resCount; i++) {
  221. var res = wp.thread.getRes(i);
  222. if (res && res.name.match(/★/) && res.message.match(/(警告|規制|雑談)/)) {
  223. post = v2c.confirm('このスレッドには★持ちから警告が出されています。\n本当に書き込みを行いますか?');
  224. break;
  225. }
  226. }
  227. }
  228. }
  229. return post;
  230. }
  231.  
  232. function checkMoitaKotehan(wp) {
  233. var mes = '';
  234. var bbs = wp.thread.bbs;
  235. /* 設定 */
  236. var all = false; //常に有効にする場合 true
  237. /* 設定ここまで */
  238. if (
  239. all
  240. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  241. // || bbs.is2ch //BBSが2chの場合
  242. // || bbs.is2cheq //BBSが2ch互換板の場合
  243. // || bbs.shitaraba //BBSがしたらばの場合
  244. // || bbs.machi //BBSがまちBBSの場合
  245. // || bbs.twitter //BBSがTwitterの場合
  246. // || th.local //スレッドがローカル板の場合
  247. || !bbs.twitter //BBSがtwitter以外の場合
  248. /* 例ここまで */
  249. ) {
  250. var isBlank = wp.name.text.match(/^(!ninja|!denki|!nanja|!kab|!omikuji|!dama)?$/);
  251. var isNanasi= wp.name.text.match(/^名無し募集中。。。$/);
  252. var isMoBoard = ('morningcoffee' == wp.thread.board.key);
  253. if (isMoBoard) {
  254. mes = (!isBlank && !isNanasi)? '名前欄が空欄ではありません。\n書き込みを行いますか?' : '';
  255. } else {
  256. if (isNanasi) {
  257. v2c.println('nanasi');
  258. mes = '名前欄に「名無し募集中。。。」を使用しています。\n書き込みを行いますか?';
  259. } else if (!isBlank) {
  260. v2c.println('blank');
  261. mes = '名前欄が空欄ではありません。\n書き込みを行いますか?';
  262. }
  263. }
  264. }
  265. return (mes)? v2c.confirm(mes) : true;
  266. }
  267.  
  268. // 対象文字列のチェック
  269. function checkThStr(str, target) {
  270. var tlen, i;
  271. if ((tlen = target.length) > 0) {
  272. for (i=0; i<tlen; i++) {
  273. if (str.indexOf(target[i]) > 0) {
  274. return true;
  275. }
  276. }
  277. }
  278. return false;
  279. }
  280.  
  281. function escapeCharRef(wp) {
  282. /* 設定 */
  283. var all = false; //常に有効にする場合 true
  284. /* 設定ここまで */
  285.  
  286. var post = true;
  287. var th = wp.thread;
  288. var bbs = th.bbs;
  289. var url = th.board.url;
  290. var title = th.title;
  291. var ph = java.util.regex.Pattern.compile('&(#?\\w+;)');
  292. var targetTitle = ['スクリプト','レス表示スタイル'];
  293. if (
  294. all
  295. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  296. // || bbs.is2ch //BBSが2chの場合
  297. // || bbs.is2cheq //BBSが2ch互換板の場合
  298. // || bbs.shitaraba //BBSがしたらばの場合
  299. // || bbs.machi //BBSがまちBBSの場合
  300. // || bbs.twitter //BBSがTwitterの場合
  301. // || th.local //スレッドがローカル板の場合
  302. || bbs.is2cheq && url.path == '/v2cj/' && checkThStr(title, targetTitle)//V2C提示版でスレタイが”スクリプト”または”レス表示スタイル”の場合
  303. /* 例ここまで */
  304. ) {
  305. var mh = ph.matcher(wp.message.text);
  306. if (mh.find() && v2c.confirm('文字参照が含まれています\n文字参照をそのまま表示(&を&amp;に置換)しますか?')){
  307. if (post) wp.message.text = mh.replaceAll('&amp;$1');
  308. }
  309. }
  310. return post;
  311. };
  312.  
  313. function replaceh(wp) {
  314. /* 設定 */
  315. var all = false; //常に有効にする場合 true
  316. /* 設定ここまで */
  317.  
  318. var post = true;
  319. var th = wp.thread;
  320. var bbs = th.bbs;
  321. var url = th.board.url;
  322. var ph = java.util.regex.Pattern.compile('h(ttps?://)');
  323. if (
  324. all
  325. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  326. // || bbs.is2ch //BBSが2chの場合
  327. // || bbs.is2cheq //BBSが2ch互換板の場合
  328. // || bbs.shitaraba //BBSがしたらばの場合
  329. // || bbs.machi //BBSがまちBBSの場合
  330. // || bbs.twitter //BBSがTwitterの場合
  331. // || th.local //スレッドがローカル板の場合
  332. || bbs.is2cheq && url.path == '/v2cj/' //板がV2C提示版の場合
  333. /* 例ここまで */
  334. ) {
  335. var mh = ph.matcher(wp.message.text);
  336. if (mh.find()){
  337. // post = v2c.confirm('h抜きを行い書き込みますか?'); //確認する場合は行頭//を削除
  338. if (post) wp.message.text = mh.replaceAll('&#x68;$1');
  339. }
  340. }
  341. return post;
  342. };
  343.  
  344. function removeh(wp) {
  345. /* 設定 */
  346. var all = false; //常に有効にする場合 true
  347. /* 設定ここまで */
  348.  
  349. var post = true;
  350. var th = wp.thread;
  351. var bbs = th.bbs;
  352. var url = th.board.url;
  353. var ph = java.util.regex.Pattern.compile('h(ttps?://)');
  354. if (
  355. all
  356. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  357. // || bbs.is2ch //BBSが2chの場合
  358. // || bbs.is2cheq //BBSが2ch互換板の場合
  359. // || bbs.shitaraba //BBSがしたらばの場合
  360. // || bbs.machi //BBSがまちBBSの場合
  361. // || bbs.twitter //BBSがTwitterの場合
  362. // || th.local //スレッドがローカル板の場合
  363. || !bbs.twitter //BBSがtwitter以外の場合
  364. // || bbs.is2cheq && url.path == '/v2cj/' //板がV2C提示版の場合
  365. /* 例ここまで */
  366. ) {
  367. var mh = ph.matcher(wp.message.text);
  368. if (mh.find()){
  369. // post = v2c.confirm('h抜きを行い書き込みますか?'); //確認する場合は行頭//を削除
  370. if (post) wp.message.text = mh.replaceAll('$1');
  371. }
  372. }
  373. return post;
  374. };
  375.  
  376. function replaceTab(wp) {
  377. /* 設定 */
  378. var all = false; //常に有効にする場合 true
  379. /* 設定ここまで */
  380.  
  381. var post = true;
  382. var th = wp.thread;
  383. var bbs = th.bbs;
  384. var url = th.board.url;
  385. var title = th.title;
  386. var ph = java.util.regex.Pattern.compile('\\t');
  387. var targetTitle = ['ImageViewURLReplace','ReplaceStr','URLExec'];
  388. if (
  389. all
  390. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  391. // || bbs.is2ch //BBSが2chの場合
  392. // || bbs.is2cheq //BBSが2ch互換板の場合
  393. // || bbs.shitaraba //BBSがしたらばの場合
  394. // || bbs.machi //BBSがまちBBSの場合
  395. // || bbs.twitter //BBSがTwitterの場合
  396. // || th.local //スレッドがローカル板の場合
  397. || bbs.is2cheq && url.path == '/v2cj/' //板がV2C提示版の場合
  398. || checkThStr(title, targetTitle)//スレタイが'ImageViewURLReplace','ReplaceStr','URLExec'の場合
  399. /* 例ここまで */
  400. ) {
  401. var mh = ph.matcher(wp.message.text);
  402. if (mh.find() && v2c.confirm('Tab文字が含まれています\n【TAB】に置換しますか?')){
  403. if (post) wp.message.text = mh.replaceAll('【TAB】');
  404. }
  405. }
  406. return post;
  407. };
  408.  
  409. function closeWritePanel(wp) {
  410. /* 設定 */
  411. var all = false; //常に有効にする場合 true ※「設定→書き込み→書き込み後自動で閉じる」と同じ
  412. /* 設定ここまで */
  413.  
  414. var post = true;
  415. var th = wp.thread;
  416. var bbs = th.bbs;
  417. var url = th.board.url;
  418. if (
  419. all
  420. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  421. // || bbs.is2ch //BBSが2chの場合
  422. // || bbs.is2cheq //BBSが2ch互換板の場合
  423. // || bbs.shitaraba //BBSがしたらばの場合
  424. // || bbs.machi //BBSがまちBBSの場合
  425. // || bbs.twitter //BBSがTwitterの場合
  426. // || th.local //スレッドがローカル板の場合
  427. || !bbs.twitter //BBSがtwitter以外の場合
  428. /* 例ここまで */
  429. ) {
  430. wp.close();
  431. }
  432. return post;
  433. };
  434.  
  435. function reloadBeforePost(wp) {
  436. /* 設定 */
  437. var all = false; //常に有効にする場合 true
  438. var lowerBoundSpeed = 0;//スレの勢いの下限
  439. var upperBoundSpeed = 30000;//スレの勢いの上限 勢い下限と上限の間にあるスレのみ事前更新でチェックしてから書込する
  440. /* 設定ここまで */
  441.  
  442. var post = true;
  443. var th = wp.thread;
  444. var bbs = th.bbs;
  445. var url = th.board.url;
  446. if (
  447. all
  448. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  449. // || bbs.is2ch //BBSが2chの場合
  450. // || bbs.is2cheq //BBSが2ch互換板の場合
  451. // || bbs.shitaraba //BBSがしたらばの場合
  452. // || bbs.machi //BBSがまちBBSの場合
  453. // || bbs.twitter //BBSがTwitterの場合
  454. // || th.local //スレッドがローカル板の場合
  455. || (!th.local && !bbs.twitter) //スレッドがローカル板とtwitter以外の場合
  456. /* 例ここまで */
  457. ) {
  458. if (lowerBoundSpeed <= th.speed && th.speed <= upperBoundSpeed) {
  459. if (th.updateAndWait()) { //更新失敗ならfalseになる→falseの時はそのまま書きこむ
  460. post = th.newResCount == 0;
  461. }
  462. }
  463. }
  464. return post;
  465. };
  466.  
  467. function checkBlankName(wp) {
  468. /* 設定 */
  469. var all = false; //常に有効にする場合 true
  470. /* 設定ここまで */
  471.  
  472. var post = true;
  473. var th = wp.thread;
  474. var bbs = th.bbs;
  475. var url = th.board.url;
  476. var ph = java.util.regex.Pattern.compile('^(!ninja|!denki)?$');
  477. if (
  478. all
  479. /* 個別のBBS・板・スレッドなどで有効にしたい場合、下の例を参考に各行頭//を削除するなどしてください */
  480. // || bbs.is2ch //BBSが2chの場合
  481. // || bbs.is2cheq //BBSが2ch互換板の場合
  482. // || bbs.shitaraba //BBSがしたらばの場合
  483. // || bbs.machi //BBSがまちBBSの場合
  484. // || bbs.twitter //BBSがTwitterの場合
  485. // || th.local //スレッドがローカル板の場合
  486. || (!th.local && !bbs.twitter) //スレッドがローカル板とtwitter以外の場合
  487. /* 例ここまで */
  488. ) {
  489. var mh = ph.matcher(wp.name.text);
  490. if (!mh.find() && !v2c.confirm('名前欄が空欄ではありません。\n書き込みを行いますか?')){
  491. post = false;
  492. }
  493. }
  494. return post;
  495. };
  496.  
  497.  
  498. // [更新履歴 : 2013/11/23 削除キー入力不具合の修正
  499. function writeFutabaThread(wp) {
  500. if (wp.thread.url.toString().indexOf('2chan') < 0) {
  501. return true;
  502. }
  503.  
  504. var gui = new FutabaWriteForm(wp);
  505. gui.show();
  506.  
  507. return false;
  508. }
  509.  
  510. function impl_mouseListener()
  511. {
  512. this.mouseClicked = function(e) {};
  513. this.mouseEntered = function(e) {};
  514. this.mouseExited = function(e) {};
  515. this.mousePressed = function(e) {};
  516. this.mouseReleased= function(e) {
  517. if (javax.swing.SwingUtilities.isRightMouseButton(e)) {
  518. var c = e.getSource();
  519. showPopup(c, e.getX(), e.getY());
  520. e.consume();
  521. }
  522. };
  523. function showPopup(c, x, y)
  524. {
  525. with(JavaImporter(Packages.javax.swing.text.DefaultEditorKit,
  526. Packages.javax.swing.JPopupMenu, Packages.javax.swing.KeyStroke, java.awt.event.KeyEvent)) {
  527. var pmenu = new JPopupMenu();
  528. var am = c.getActionMap();
  529. addMenu(pmenu, "切り取り(X)", am.get(DefaultEditorKit.cutAction), 'X', KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK));
  530. addMenu(pmenu, "コピー(C)", am.get(DefaultEditorKit.copyAction), 'C', KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK));
  531. addMenu(pmenu, "貼り付け(V)", am.get(DefaultEditorKit.pasteAction), 'V', KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK));
  532. addMenu(pmenu, "すべて選択(A)", am.get(DefaultEditorKit.selectAllAction), 'A', KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK));
  533. pmenu.show(c, x, y);
  534. }
  535. }
  536. function addMenu(pmenu, text, action, mnemonic, ks)
  537. {
  538. if (action != null) {
  539. var mi = pmenu.add(action);
  540. if (text != null) mi.setText(text);
  541. if (mnemonic != 0) mi.setMnemonic(mnemonic);
  542. if (ks != null) mi.setAccelerator(ks);
  543. }
  544. }
  545. }
  546.  
  547. function FutabaWriteForm(wp)
  548. {
  549. var SwingGui = JavaImporter(java.awt,
  550. java.awt.event,
  551. Packages.javax.swing,
  552. Packages.javax.swing.event
  553. );
  554.  
  555. var frame = null;
  556. var nameTextField = null;
  557. var delKeyTextField = null;
  558. var mailTextField = null;
  559. var titleTextField = null;
  560. var attachmentFilePath = null;
  561. var mimeType = null;
  562. var textArea = null;
  563. var _wp = wp;
  564. var attachFlag = false;
  565.  
  566. var thUrl = wp.thread.url.toString().replaceAll('^http:\\/\\/(.+\\.2chan\\.net)\\/test\\/read.cgi\\/(\\w+)\\/(\\d+).*', 'http://$1/$2/res/$3.htm');
  567. var hr = v2c.createHttpRequest(thUrl);
  568. var html= hr.getContentsAsString();
  569.  
  570. if (html == null) { v2c.println('[post.js : FutabaWriteForm] HTMLの取得失敗。スレッドが寿命で消滅したかもしれません。'); }
  571.  
  572. attachFlag = (html.indexOf('<td><input type=file name=upfile size="') >= 0) ? true : false;
  573.  
  574. with (SwingGui) {
  575. with (frame = JFrame('レス送信モード')) {
  576. defaultCloseOperation = DISPOSE_ON_CLOSE;
  577. setSize(new Dimension(550, 380));
  578. setLayout(new BorderLayout());
  579. setResizable(false);
  580. setLocationRelativeTo(null);
  581. add(new createFormPanel());
  582. }
  583. }
  584.  
  585.  
  586. this.show = function() {
  587. frame.show();
  588. _wp.name.text = '';
  589. _wp.mail.text = '';
  590. _wp.message.text = '';
  591. //_wp.close();
  592. };
  593.  
  594. function reply()
  595. {
  596. var postUrl = _wp.thread.url.toString().replaceAll('^http:\\/\\/(.+\\.2chan\\.net)\\/test\\/read.cgi\\/(\\w+)\\/(\\d+).*', 'http://$1/$2/futaba.php?guid=on');
  597. var host = _wp.thread.url.toString().replaceAll('^http:\\/\\/(.+\\.2chan\\.net)\\/test\\/read.cgi\\/(\\w+)\\/(\\d+).*', '$1');
  598. var boundary = "ghj39458tu43";
  599.  
  600. var url = new java.net.URL(postUrl);
  601.  
  602. var conn = url.openConnection();
  603.  
  604. with (conn) {
  605. setDoOutput(true);
  606.  
  607. var cookie = 'namec=; uuc=1; posttime=' + (new Date()).getTime();
  608. setRequestProperty("Host", host);
  609. setRequestProperty("Cookie", cookie);
  610. setRequestProperty("Referer", thUrl);
  611. setRequestProperty("Content-Type", "multipart/form-data; boundary=-" + boundary);
  612. setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
  613. var matches = [];
  614. var mode_value = (/<input type=hidden name=mode value="(\w+)">/.test(html)) ? RegExp.$1 : '';
  615. var maxfsize_value = (/<input type=hidden name="MAX_FILE_SIZE" value="(\d+)">/.test(html)) ? RegExp.$1 : '';
  616. var hash = (/<input type=hidden id="hash" name="hash" value="([^"]*)">/.test(html)) ? RegExp.$1 : '';
  617. var isBaseForm = /<input type=hidden id="baseform" name="baseform" value="">/.test(html);
  618. var resto_value = (/<input type=hidden name=resto value="(\d+)">/.test(html)) ? RegExp.$1 : '';
  619. var dmode = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode();
  620. var resolution = dmode.getWidth() + 'x' + dmode.getHeight() + 'x' + dmode.getBitDepth();
  621. var caco = (function() {
  622. var caco = (/<script type="text\/javascript" src="(\/bin\/cachemt\d*\.php)">/.test(html)) ? RegExp.$1 : '';
  623. if (caco) {
  624. var hr = v2c.createHttpRequest(new java.net.URL('http://' + host + caco));
  625. var tmp = hr.getContentsAsString();
  626. caco = (/"([^"]*)"/.test(tmp)) ? RegExp.$1 : '';
  627. }
  628. return caco;
  629. })();
  630. function putd(boun, name, val) {
  631. return '---' + boun + '\r\n' +
  632. 'Content-Disposition: form-data; name="' + name + '"\r\n' +
  633. '\r\n' +
  634. val + '\r\n';
  635. }
  636.  
  637. var data = putd(boundary, 'mode', mode_value) +
  638. putd(boundary, 'MAX_FILE_SIZE', maxfsize_value);
  639. if (isBaseForm) { data += putd(boundary, 'baseform', ''); }
  640.  
  641. data += putd(boundary, 'pthb', caco) +
  642. putd(boundary, 'pthc', caco) +
  643. putd(boundary, 'pthd', '') +
  644. putd(boundary, 'flvr', '11.9.900') +
  645. putd(boundary, 'scsz', (function() {
  646. if (resolution) {
  647. return resolution;
  648. } else {
  649. return '';
  650. }
  651. })());
  652. if (hash) {
  653. data += putd(boundary, 'hash', hash);
  654. }
  655. data += putd(boundary, 'js', 'off');
  656.  
  657. data += putd(boundary, 'resto', resto_value);
  658. if (attachFlag) {
  659. data += putd(boundary, 'name', nameTextField.getText());
  660. }
  661. data += putd(boundary, 'email', mailTextField.getText());
  662. if (attachFlag) {
  663. data += putd(boundary, 'sub', titleTextField.getText());
  664. }
  665. data += putd(boundary, 'com', textArea.getText());
  666. with (JavaImporter(java.io)) {
  667. var dos = new DataOutputStream(getOutputStream());
  668.  
  669. if (attachFlag && attachmentFilePath) {
  670. var file = new File(attachmentFilePath);
  671. data += '---' + boundary + '\r\n' +
  672. 'Content-Disposition: form-data; name="upfile"; filename="' + file.getName() + '"\r\n' +
  673. 'Content-Type: ' + mimeType + '\r\n' +
  674. '\r\n';
  675. data = new java.lang.String(data);
  676. buf = data.getBytes("MS932");
  677. dos.write(buf, 0, buf.length);
  678. var fin = new BufferedInputStream(new FileInputStream(file));
  679. var buff = 0;
  680. while ((buff = fin.read()) != -1) {
  681. dos.write(buff);
  682. dos.flush();
  683. }
  684. dos.flush();
  685. fin.close();
  686.  
  687. data = '\r\n';
  688. }
  689.  
  690. data += putd(boundary, 'pwd', delKeyTextField.getText());
  691. data += '---' + boundary + '--\r\n';
  692. data = new java.lang.String(data);
  693. var buf = data.getBytes("MS932");
  694. dos.write(buf, 0, buf.length);
  695. dos.flush();
  696. dos.close();
  697.  
  698. // 削除キーの一時記憶
  699. v2c.putProperty('_FUTABA_WRITE_FORM_DELKEY_', delKeyTextField.getText());
  700.  
  701. var ins = getInputStream();
  702. var bReader = new BufferedReader(new InputStreamReader(ins));
  703.  
  704. var responseData = null;
  705. while ((responseData = bReader.readLine()) != null) {
  706. v2c.println(responseData);
  707. }
  708. ins.close();
  709.  
  710. }
  711.  
  712. }
  713. conn.disconnect();
  714. }
  715.  
  716. function createFormPanel()
  717. {
  718. with (SwingGui) {
  719. var p = new JPanel();
  720. with (p) {
  721. var gridBagLayout = new GridBagLayout();
  722.  
  723. gridBagLayout.columnWidths = [119, 83, 83, 83, 112, 83, 0];
  724. gridBagLayout.rowHeights = [40, 40, 40, 120, 40, 40, 0];
  725. gridBagLayout.columnWeights = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, java.lang.Double.MIN_VALUE];
  726. gridBagLayout.rowWeights = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, java.lang.Double.MIN_VALUE];
  727. setLayout(gridBagLayout);
  728.  
  729. if (attachFlag) {
  730. var nameLabel = new JLabel("\u306A\u307E\u3048");
  731. nameLabel.setHorizontalAlignment(SwingConstants.TRAILING);
  732. var gbc_nameLabel = new GridBagConstraints();
  733. gbc_nameLabel.fill = GridBagConstraints.BOTH;
  734. gbc_nameLabel.insets = new Insets(0, 0, 5, 5);
  735. gbc_nameLabel.gridx = 0;
  736. gbc_nameLabel.gridy = 0;
  737. add(nameLabel, gbc_nameLabel);
  738.  
  739. nameTextField = new JTextField();
  740. nameTextField.setText(_wp.name);
  741. nameTextField.setColumns(10);
  742. nameTextField.addMouseListener(new MouseListener(new impl_mouseListener()));
  743. var gbc_nameTextField = new GridBagConstraints();
  744. gbc_nameTextField.fill = GridBagConstraints.HORIZONTAL;
  745. gbc_nameTextField.insets = new Insets(0, 0, 5, 5);
  746. gbc_nameTextField.gridwidth = 2;
  747. gbc_nameTextField.gridx = 1;
  748. gbc_nameTextField.gridy = 0;
  749. add(nameTextField, gbc_nameTextField);
  750. }
  751.  
  752. var mailLabel = new JLabel("E-Mail");
  753. mailLabel.setHorizontalAlignment(SwingConstants.TRAILING);
  754. var gbc_mailLabel = new GridBagConstraints();
  755. gbc_mailLabel.fill = GridBagConstraints.BOTH;
  756. gbc_mailLabel.insets = new Insets(0, 0, 5, 5);
  757. gbc_mailLabel.gridx = 0;
  758. gbc_mailLabel.gridy = 1;
  759. add(mailLabel, gbc_mailLabel);
  760.  
  761. mailTextField = new JTextField();
  762. mailTextField.setText(_wp.mail);
  763. mailTextField.setColumns(10);
  764. mailTextField.addMouseListener(new MouseListener(new impl_mouseListener()));
  765. var gbc_mailTextField = new GridBagConstraints();
  766. gbc_mailTextField.gridwidth = 2;
  767. gbc_mailTextField.fill = GridBagConstraints.HORIZONTAL;
  768. gbc_mailTextField.insets = new Insets(0, 0, 5, 5);
  769. gbc_mailTextField.gridx = 1;
  770. gbc_mailTextField.gridy = 1;
  771. add(mailTextField, gbc_mailTextField);
  772.  
  773. if (attachFlag) {
  774. var titleLabel = new JLabel("\u984C\u540D");
  775. var gbc_titleLabel = new GridBagConstraints();
  776. gbc_titleLabel.anchor = GridBagConstraints.EAST;
  777. gbc_titleLabel.fill = GridBagConstraints.VERTICAL;
  778. gbc_titleLabel.insets = new Insets(0, 0, 5, 5);
  779. gbc_titleLabel.gridx = 0;
  780. gbc_titleLabel.gridy = 2;
  781. add(titleLabel, gbc_titleLabel);
  782.  
  783. titleTextField = new JTextField();
  784. titleTextField.addMouseListener(new MouseListener(new impl_mouseListener()));
  785. var gbc_titleTextField = new GridBagConstraints();
  786. gbc_titleTextField.gridwidth = 2;
  787. gbc_titleTextField.fill = GridBagConstraints.HORIZONTAL;
  788. gbc_titleTextField.insets = new Insets(0, 0, 5, 5);
  789. gbc_titleTextField.gridx = 1;
  790. gbc_titleTextField.gridy = 2;
  791. add(titleTextField, gbc_titleTextField);
  792. titleTextField.setColumns(10);
  793. }
  794.  
  795. var replyButton = new JButton("\u8FD4\u4FE1\u3059\u308B");
  796. with (replyButton) {
  797. addActionListener(function(e) {
  798. setEnabled(false);
  799. reply();
  800. frame.dispose();
  801. });
  802. }
  803. var gbc_replyButton = new GridBagConstraints();
  804. gbc_replyButton.fill = GridBagConstraints.BOTH;
  805. gbc_replyButton.insets = new Insets(0, 0, 5, 5);
  806. gbc_replyButton.gridx = 4;
  807. gbc_replyButton.gridy = 2;
  808. add(replyButton, gbc_replyButton);
  809.  
  810. var commentLabel = new JLabel("\u30B3\u30E1\u30F3\u30C8");
  811. var gbc_commentLabel = new GridBagConstraints();
  812. gbc_commentLabel.anchor = GridBagConstraints.EAST;
  813. gbc_commentLabel.fill = GridBagConstraints.VERTICAL;
  814. gbc_commentLabel.insets = new Insets(0, 0, 5, 5);
  815. gbc_commentLabel.gridx = 0;
  816. gbc_commentLabel.gridy = 3;
  817. add(commentLabel, gbc_commentLabel);
  818.  
  819. var scrollPane = new JScrollPane();
  820. var gbc_scrollPane = new GridBagConstraints();
  821. gbc_scrollPane.gridwidth = 4;
  822. gbc_scrollPane.fill = GridBagConstraints.BOTH;
  823. gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
  824. gbc_scrollPane.gridx = 1;
  825. gbc_scrollPane.gridy = 3;
  826. add(scrollPane, gbc_scrollPane);
  827.  
  828. textArea = new JTextArea();
  829. textArea.setText(_wp.message);
  830. textArea.addMouseListener(new MouseListener(new impl_mouseListener()));
  831. scrollPane.setViewportView(textArea);
  832.  
  833. if (attachFlag) {
  834. var attachmentLabel = new JLabel("\u6DFB\u4ED8File");
  835. attachmentLabel.setHorizontalAlignment(SwingConstants.TRAILING);
  836. var gbc_attachmentLabel = new GridBagConstraints();
  837. gbc_attachmentLabel.fill = GridBagConstraints.BOTH;
  838. gbc_attachmentLabel.insets = new Insets(0, 0, 5, 5);
  839. gbc_attachmentLabel.gridx = 0;
  840. gbc_attachmentLabel.gridy = 4;
  841. add(attachmentLabel, gbc_attachmentLabel);
  842.  
  843. var viewAttachFileLabel = new JLabel("\u30D5\u30A1\u30A4\u30EB\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
  844. var gbc_viewAttachFileLabel = new GridBagConstraints();
  845. gbc_viewAttachFileLabel.gridwidth = 3;
  846. gbc_viewAttachFileLabel.fill = GridBagConstraints.BOTH;
  847. gbc_viewAttachFileLabel.insets = new Insets(0, 0, 5, 5);
  848. gbc_viewAttachFileLabel.gridx = 2;
  849. gbc_viewAttachFileLabel.gridy = 4;
  850. add(viewAttachFileLabel, gbc_viewAttachFileLabel);
  851.  
  852. var attachmentButton = new JButton("\u53C2\u7167...");
  853. with(attachmentButton) {
  854. addActionListener(function(e) {
  855. var fc = new javax.swing.JFileChooser();
  856.  
  857. with (fc) {
  858. with (JavaImporter(javax.swing.filechooser)) {
  859. addChoosableFileFilter(new FileNameExtensionFilter("JPEG イメージ", "jpg", "jpeg"));
  860. addChoosableFileFilter(new FileNameExtensionFilter("GIF イメージ", "gif"));
  861. addChoosableFileFilter(new FileNameExtensionFilter("PNG イメージ", "png"));
  862. }
  863. if (showOpenDialog(frame) == APPROVE_OPTION) {
  864. var file = getSelectedFile();
  865. var matches = [];
  866. if (matches = /\.(gif|jpe?g|png)$/i.exec(file.getName())) {
  867. var name = file.getName();
  868. if (name.length() > 50) {
  869. name = name.substr(0, 40) + '...' + name.substr(-5, 5);
  870. }
  871. viewAttachFileLabel.setText(name);
  872. attachmentFilePath = file.getPath();
  873. mimeType = 'image/' + matches[1].toLowerCase();
  874. if (matches[1].toLowerCase() == 'jpg') { mimeType = 'image/jpeg'; }
  875. } else {
  876. v2c.println('[post.js: writeFutabaThread] GIF/JPG/PNG以外は添付できません。');
  877. }
  878. } else {
  879. viewAttachFileLabel.setText("\u30D5\u30A1\u30A4\u30EB\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
  880. attachmentFilePath = '';
  881. mimeType = 'application/octet-stream';
  882. }
  883. }
  884. });
  885. }
  886. var gbc_attachmentButton = new GridBagConstraints();
  887. gbc_attachmentButton.fill = GridBagConstraints.BOTH;
  888. gbc_attachmentButton.insets = new Insets(0, 0, 5, 5);
  889. gbc_attachmentButton.gridx = 1;
  890. gbc_attachmentButton.gridy = 4;
  891. add(attachmentButton, gbc_attachmentButton);
  892. }
  893.  
  894. var delKeyLabel = new JLabel("\u524A\u9664\u30AD\u30FC");
  895. delKeyLabel.setHorizontalAlignment(SwingConstants.TRAILING);
  896. var gbc_delKeyLabel = new GridBagConstraints();
  897. gbc_delKeyLabel.fill = GridBagConstraints.BOTH;
  898. gbc_delKeyLabel.insets = new Insets(0, 0, 0, 5);
  899. gbc_delKeyLabel.gridx = 0;
  900. gbc_delKeyLabel.gridy = 5;
  901. add(delKeyLabel, gbc_delKeyLabel);
  902.  
  903. //var fmt = new javax.swing.text.MaskFormatter("********");
  904. //fmt.setValidCharacters("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
  905. delKeyTextField = new JTextField();
  906. delKeyTextField.setColumns(8);
  907. delKeyTextField.enableInputMethods(false);
  908. var gbc_delKeyTextField = new GridBagConstraints();
  909. gbc_delKeyTextField.fill = GridBagConstraints.HORIZONTAL;
  910. gbc_delKeyTextField.insets = new Insets(0, 0, 0, 5);
  911. gbc_delKeyTextField.gridx = 1;
  912. gbc_delKeyTextField.gridy = 5;
  913. add(delKeyTextField, gbc_delKeyTextField);
  914.  
  915. delKeyTextField.setText(v2c.getProperty('_FUTABA_WRITE_FORM_DELKEY_'));
  916.  
  917. var delKeyDescriptionLabel = new JLabel("(\u524A\u9664\u7528\u3001\u82F1\u6570\u5B57\u3067\uFF18\u5B57\u4EE5\u5185)");
  918. var gbc_delKeyDescriptionLabel = new GridBagConstraints();
  919. gbc_delKeyDescriptionLabel.fill = GridBagConstraints.BOTH;
  920. gbc_delKeyDescriptionLabel.insets = new Insets(0, 0, 0, 5);
  921. gbc_delKeyDescriptionLabel.gridx = 2;
  922. gbc_delKeyDescriptionLabel.gridy = 5;
  923. add(delKeyDescriptionLabel, gbc_delKeyDescriptionLabel);
  924. }
  925. return p;
  926. }
  927. };
  928. }
  929.  
  930. function writeBakusaiThread(wp) {
  931. if (wp.thread.url.toString().indexOf('bakusai') < 0) {
  932. return true;
  933. }
  934.  
  935. var gui = new BakusaiWriteForm(wp);
  936. gui.show();
  937.  
  938. return false;
  939. }
  940.  
  941. function BakusaiWriteForm(wp)
  942. {
  943. var SwingGui = JavaImporter(java.awt,
  944. java.awt.event,
  945. Packages.javax.swing,
  946. Packages.javax.swing.event
  947. );
  948. var frame = null;
  949. var nameTextField = null;
  950. var delKeyTextField = null;
  951. var mailTextField = null;
  952. var tripTextField = null;
  953. var attachmentFilePath = null;
  954. var mimeType = null;
  955. var textArea = null;
  956. var _wp = wp;
  957. var attachFlag = false;
  958.  
  959. var thUrl = String(wp.thread.url.toString()).replace(/^http:\/\/bakusai\.com\/test\/read.cgi\/a(\d+)c(\d+)b(\d+)\/(\d+)\/.*/, 'http://b...content-available-to-author-only...i.com/thr_res/acode=$1/ctgid=$2/bid=$3/tid=$4/');
  960. var acode = RegExp.$1;
  961. var ctgid = RegExp.$2;
  962. var bid = RegExp.$3;
  963. var tid = RegExp.$4;
  964. var hr = v2c.createHttpRequest(thUrl);
  965. var html= hr.getContentsAsString();
  966. if (html == null) { v2c.println('[post.js : BakusaiWriteForm] HTMLの取得失敗。スレッドが寿命で消滅したかもしれません。'); }
  967.  
  968. var title = (/<title>([^\s]+) -/.test(html)) ? RegExp.$1 : '';
  969.  
  970. with (SwingGui) {
  971. with (frame = JFrame('『' + title + '』へのレス投稿')) {
  972. defaultCloseOperation = DISPOSE_ON_CLOSE;
  973. setSize(new Dimension(550, 380));
  974. setLayout(new BorderLayout());
  975. setResizable(false);
  976. setLocationRelativeTo(null);
  977. add(new createFormPanel());
  978. }
  979. }
  980.  
  981.  
  982. this.show = function() {
  983. frame.show();
  984. _wp.name.text = '';
  985. _wp.mail.text = '';
  986. _wp.message.text = '';
  987. //_wp.close();
  988. };
  989.  
  990. function reply()
  991. {
  992. var postUrl = 'http://b...content-available-to-author-only...i.com/thr_rp1/';
  993. var boundary = "ghj39458tu43";
  994.  
  995. var url = new java.net.URL(postUrl);
  996.  
  997. var conn = url.openConnection();
  998. with (conn) {
  999.  
  1000. setDoOutput(true);
  1001.  
  1002. setRequestProperty("Host", 'bakusai.com');
  1003. setRequestProperty("Referer", thUrl);
  1004. setRequestProperty("Content-Type", "multipart/form-data; boundary=-" + boundary);
  1005. setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
  1006. var matches = [];
  1007. var prof_flg = (/<input type="hidden" name="prof_flg"\s+value="([^"]+)"/.test(html)) ? RegExp.$1 : '';
  1008.  
  1009. function putd(boun, name, val) {
  1010. return '---' + boun + '\r\n' +
  1011. 'Content-Disposition: form-data; name="' + name + '"\r\n' +
  1012. '\r\n' +
  1013. val + '\r\n';
  1014. }
  1015. with (JavaImporter(java.io)) {
  1016. var dos = new DataOutputStream(getOutputStream());
  1017. var data = putd(boundary, 'bid', bid) +
  1018. putd(boundary, 'tid', tid) +
  1019. putd(boundary, 'ctgid', ctgid) +
  1020. putd(boundary, 'acode', acode) +
  1021. putd(boundary, 'tp', '1') +
  1022. putd(boundary, 'prof_flg', prof_flg) +
  1023. putd(boundary, 'name', nameTextField.getText()) +
  1024. putd(boundary, 'trip_pass', tripTextField.getText()) +
  1025. putd(boundary, 'mailaddr', mailTextField.getText()) +
  1026. putd(boundary, 'body', textArea.getText()) +
  1027. putd(boundary, 'del_path', delKeyTextField.getText());
  1028. data += '---' + boundary + '--\r\n';
  1029. data = new java.lang.String(data);
  1030. var buf = data.getBytes("MS932");
  1031. dos.write(buf, 0, buf.length);
  1032. dos.flush();
  1033. dos.close();
  1034.  
  1035. // 削除キーの一時記憶
  1036. v2c.putProperty('_BAKUSAI_WRITE_FORM_DELKEY_', delKeyTextField.getText());
  1037.  
  1038. var ins = getInputStream();
  1039. var bReader = new BufferedReader(new InputStreamReader(ins));
  1040.  
  1041. var responseData = null;
  1042. while ((responseData = bReader.readLine()) != null) {
  1043. v2c.println(responseData);
  1044. }
  1045. ins.close();
  1046. }
  1047. }
  1048. conn.disconnect();
  1049.  
  1050. }
  1051.  
  1052. function createFormPanel()
  1053. {
  1054. with (SwingGui) {
  1055. var p = new JPanel();
  1056. with (p) {
  1057. var gridBagLayout = new GridBagLayout();
  1058.  
  1059. gridBagLayout.columnWidths = [119, 83, 83, 83, 112, 83, 0];
  1060. gridBagLayout.rowHeights = [40, 40, 40, 120, 40, 40, 0];
  1061. gridBagLayout.columnWeights = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, java.lang.Double.MIN_VALUE];
  1062. gridBagLayout.rowWeights = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, java.lang.Double.MIN_VALUE];
  1063. setLayout(gridBagLayout);
  1064.  
  1065. var nameLabel = new JLabel("お名前");
  1066. nameLabel.setHorizontalAlignment(SwingConstants.TRAILING);
  1067. var gbc_nameLabel = new GridBagConstraints();
  1068. gbc_nameLabel.fill = GridBagConstraints.BOTH;
  1069. gbc_nameLabel.insets = new Insets(0, 0, 5, 5);
  1070. gbc_nameLabel.gridx = 0;
  1071. gbc_nameLabel.gridy = 0;
  1072. add(nameLabel, gbc_nameLabel);
  1073.  
  1074. nameTextField = new JTextField();
  1075. nameTextField.setText(_wp.name);
  1076. nameTextField.setColumns(10);
  1077. nameTextField.addMouseListener(new MouseListener(new impl_mouseListener()));
  1078. var gbc_nameTextField = new GridBagConstraints();
  1079. gbc_nameTextField.fill = GridBagConstraints.HORIZONTAL;
  1080. gbc_nameTextField.insets = new Insets(0, 0, 5, 5);
  1081. gbc_nameTextField.gridwidth = 2;
  1082. gbc_nameTextField.gridx = 1;
  1083. gbc_nameTextField.gridy = 0;
  1084. add(nameTextField, gbc_nameTextField);
  1085.  
  1086. var nameKeyDescriptionLabel = new JLabel("(全角8文字まで)");
  1087. var gbc_nameKeyDescriptionLabel = new GridBagConstraints();
  1088. gbc_nameKeyDescriptionLabel.fill = GridBagConstraints.BOTH;
  1089. gbc_nameKeyDescriptionLabel.insets = new Insets(0, 0, 0, 5);
  1090. gbc_nameKeyDescriptionLabel.gridx = 3;
  1091. gbc_nameKeyDescriptionLabel.gridy = 0;
  1092. add(nameKeyDescriptionLabel, gbc_nameKeyDescriptionLabel);
  1093.  
  1094. var mailLabel = new JLabel("E-Mail");
  1095. mailLabel.setHorizontalAlignment(SwingConstants.TRAILING);
  1096. var gbc_mailLabel = new GridBagConstraints();
  1097. gbc_mailLabel.fill = GridBagConstraints.BOTH;
  1098. gbc_mailLabel.insets = new Insets(0, 0, 5, 5);
  1099. gbc_mailLabel.gridx = 0;
  1100. gbc_mailLabel.gridy = 1;
  1101. add(mailLabel, gbc_mailLabel);
  1102.  
  1103. mailTextField = new JTextField();
  1104. mailTextField.setText(_wp.mail);
  1105. mailTextField.setColumns(10);
  1106. mailTextField.addMouseListener(new MouseListener(new impl_mouseListener()));
  1107. var gbc_mailTextField = new GridBagConstraints();
  1108. gbc_mailTextField.gridwidth = 2;
  1109. gbc_mailTextField.fill = GridBagConstraints.HORIZONTAL;
  1110. gbc_mailTextField.insets = new Insets(0, 0, 5, 5);
  1111. gbc_mailTextField.gridx = 1;
  1112. gbc_mailTextField.gridy = 1;
  1113. add(mailTextField, gbc_mailTextField);
  1114.  
  1115. var tripLabel = new JLabel("トリップ");
  1116. var gbc_tripLabel = new GridBagConstraints();
  1117. gbc_tripLabel.anchor = GridBagConstraints.EAST;
  1118. gbc_tripLabel.fill = GridBagConstraints.VERTICAL;
  1119. gbc_tripLabel.insets = new Insets(0, 0, 5, 5);
  1120. gbc_tripLabel.gridx = 0;
  1121. gbc_tripLabel.gridy = 2;
  1122. add(tripLabel, gbc_tripLabel);
  1123.  
  1124. tripTextField = new JTextField();
  1125. tripTextField.addMouseListener(new MouseListener(new impl_mouseListener()));
  1126. var gbc_tripTextField = new GridBagConstraints();
  1127. gbc_tripTextField.gridwidth = 2;
  1128. gbc_tripTextField.fill = GridBagConstraints.HORIZONTAL;
  1129. gbc_tripTextField.insets = new Insets(0, 0, 5, 5);
  1130. gbc_tripTextField.gridx = 1;
  1131. gbc_tripTextField.gridy = 2;
  1132. add(tripTextField, gbc_tripTextField);
  1133. tripTextField.setColumns(10);
  1134.  
  1135. var tripKeyDescriptionLabel = new JLabel("(全角8文字まで)");
  1136. var gbc_tripKeyDescriptionLabel = new GridBagConstraints();
  1137. gbc_tripKeyDescriptionLabel.fill = GridBagConstraints.BOTH;
  1138. gbc_tripKeyDescriptionLabel.insets = new Insets(0, 0, 0, 5);
  1139. gbc_tripKeyDescriptionLabel.gridx = 3;
  1140. gbc_tripKeyDescriptionLabel.gridy = 2;
  1141. add(tripKeyDescriptionLabel, gbc_tripKeyDescriptionLabel);
  1142.  
  1143. var replyButton = new JButton("同意して投稿する");
  1144. with (replyButton) {
  1145. addActionListener(function(e) {
  1146. setEnabled(false);
  1147. reply();
  1148. frame.dispose();
  1149. });
  1150. }
  1151. var gbc_replyButton = new GridBagConstraints();
  1152. gbc_replyButton.fill = GridBagConstraints.BOTH;
  1153. gbc_replyButton.insets = new Insets(0, 0, 5, 5);
  1154. gbc_replyButton.gridx = 4;
  1155. gbc_replyButton.gridy = 2;
  1156. add(replyButton, gbc_replyButton);
  1157.  
  1158. var commentLabel = new JLabel("コメント");
  1159. var gbc_commentLabel = new GridBagConstraints();
  1160. gbc_commentLabel.anchor = GridBagConstraints.EAST;
  1161. gbc_commentLabel.fill = GridBagConstraints.VERTICAL;
  1162. gbc_commentLabel.insets = new Insets(0, 0, 5, 5);
  1163. gbc_commentLabel.gridx = 0;
  1164. gbc_commentLabel.gridy = 3;
  1165. add(commentLabel, gbc_commentLabel);
  1166.  
  1167. var scrollPane = new JScrollPane();
  1168. var gbc_scrollPane = new GridBagConstraints();
  1169. gbc_scrollPane.gridwidth = 4;
  1170. gbc_scrollPane.fill = GridBagConstraints.BOTH;
  1171. gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
  1172. gbc_scrollPane.gridx = 1;
  1173. gbc_scrollPane.gridy = 3;
  1174. add(scrollPane, gbc_scrollPane);
  1175.  
  1176. textArea = new JTextArea();
  1177. textArea.setText(_wp.message);
  1178. textArea.getDocument().addDocumentListener(new DocumentListener() {
  1179. changedUpdate: function(e) {},
  1180. insertUpdate: function(e) {
  1181. var t = new java.lang.String(textArea.getText());
  1182. var len = (1500 - t.getBytes("MS932").length) / 2;
  1183. tripKeyDescriptionLabel.setText("<html>(全角750文字まで:残り<font color=red><b>全角" + len + "文字</b></font>)<br>掲示板あらし行為、URLの記載は一回で書込み禁止措置と致します。</html>");
  1184. },
  1185. removeUpdate: function(e) {
  1186. var t = new java.lang.String(textArea.getText());
  1187. var len = (1500 - t.getBytes("MS932").length) / 2;
  1188. tripKeyDescriptionLabel.setText("<html>(全角750文字まで:残り<font color=red><b>全角" + len + "文字</b></font>)<br>掲示板あらし行為、URLの記載は一回で書込み禁止措置と致します。</html>");
  1189. }
  1190. });
  1191. textArea.addMouseListener(new MouseListener(new impl_mouseListener()));
  1192. scrollPane.setViewportView(textArea);
  1193.  
  1194. var tripKeyDescriptionLabel = new JLabel("<html>(全角750文字まで:残り<font color=red><b>全角750文字</b></font>)<br>掲示板あらし行為、URLの記載は一回で書込み禁止措置と致します。</html>");
  1195. tripKeyDescriptionLabel.setVerticalAlignment(SwingConstants.TOP);
  1196. var gbc_tripKeyDescriptionLabel = new GridBagConstraints();
  1197. gbc_tripKeyDescriptionLabel.fill = GridBagConstraints.BOTH;
  1198. gbc_tripKeyDescriptionLabel.insets = new Insets(0, 0, 0, 5);
  1199. gbc_tripKeyDescriptionLabel.gridwidth = 4;
  1200. gbc_tripKeyDescriptionLabel.gridx = 1;
  1201. gbc_tripKeyDescriptionLabel.gridy = 4;
  1202. add(tripKeyDescriptionLabel, gbc_tripKeyDescriptionLabel);
  1203.  
  1204.  
  1205. var delKeyLabel = new JLabel("削除パス");
  1206. delKeyLabel.setHorizontalAlignment(SwingConstants.TRAILING);
  1207. var gbc_delKeyLabel = new GridBagConstraints();
  1208. gbc_delKeyLabel.fill = GridBagConstraints.BOTH;
  1209. gbc_delKeyLabel.insets = new Insets(0, 0, 0, 5);
  1210. gbc_delKeyLabel.gridx = 0;
  1211. gbc_delKeyLabel.gridy = 5;
  1212. add(delKeyLabel, gbc_delKeyLabel);
  1213.  
  1214. delKeyTextField = new JTextField();
  1215. delKeyTextField.setColumns(8);
  1216. delKeyTextField.enableInputMethods(false);
  1217. var gbc_delKeyTextField = new GridBagConstraints();
  1218. gbc_delKeyTextField.fill = GridBagConstraints.HORIZONTAL;
  1219. gbc_delKeyTextField.insets = new Insets(0, 0, 0, 5);
  1220. gbc_delKeyTextField.gridx = 1;
  1221. gbc_delKeyTextField.gridy = 5;
  1222. add(delKeyTextField, gbc_delKeyTextField);
  1223.  
  1224. delKeyTextField.setText(v2c.getProperty('_BAKUSAI_WRITE_FORM_DELKEY_'));
  1225.  
  1226. var delKeyDescriptionLabel = new JLabel("(半角英数4文字)");
  1227. var gbc_delKeyDescriptionLabel = new GridBagConstraints();
  1228. gbc_delKeyDescriptionLabel.fill = GridBagConstraints.BOTH;
  1229. gbc_delKeyDescriptionLabel.insets = new Insets(0, 0, 0, 5);
  1230. gbc_delKeyDescriptionLabel.gridx = 2;
  1231. gbc_delKeyDescriptionLabel.gridy = 5;
  1232. add(delKeyDescriptionLabel, gbc_delKeyDescriptionLabel);
  1233. }
  1234. return p;
  1235. }
  1236. };
  1237. }
  1238.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty