はてなキーワード: Not Foundとは
「ヤングエースUP」って漫画サイトがあるんだけど最近仕様変更した関係でカドコミに移行したのよね
で多分これが問題なんだろうね
なのに昨日からはてなブックマークに謎の「あなたが1番目にブックマークした「作品一覧」ヤングエースUP記事が注目されてる」として30ブクマ、100ブクマ毎に通知が来まくってて
確認したら去年のブックマークないしブコメが集中してて今頃30ブクマになったとか100ブクマになったとかじゃないものまで唐突にその表示で通知が来るようになった
そもそもカドコミを直接ブクマしてもタイトル画面がURLのまま(初ブクマ時はタイトルが漫画タイトルで登録されるのに時間経過でURL表示になったりそのURLからアクセスしてもNot Foundになったりする)ではてなブックマーク自体がカドコミに対応してないのが丸わかりな中でこんな嫌がらせみたいな通知が今頃になって頻繁に来るのは本当に迷惑なので早く治して欲しい
そしてどうせならカドコミを直接ブクマ出来るようにして欲しいよね
最近別の漫画サイトのファイアクロスも直接ブクマ出来なくなってるし早急な仕様変更が求められてると思うんだよね
はてなブックマークの増田一覧の、さらに「すべて」(1 user)をチェックしている希有な人向けのユーザースクリプトを公開します。
https://b.hatena.ne.jp/site/anond.hatelabo.jp/?sort=eid
// ==UserScript== // @name Hatena Bookmark Anond Filter // @namespace https://b.hatena.ne.jp/site/anond.hatelabo.jp/ // @description はてなブックマークの『はてな匿名ダイアリー』の記事のうち、指定したNGワードが含まれる投稿を非表示にします。 // @match https://b.hatena.ne.jp/site/anond.hatelabo.jp/* // @grant none // @version 2.0.2026.02.27.0021 // ==/UserScript== (function(){ const SCRIPTID = 'HatenaBookmarkAnondFilter'; console.time(SCRIPTID); const CLASSNAME = 'filtered';/*フィルタ該当要素*/ const CHECKED = 'checked';/*二重チェック回避フラグ*/ const ONCE = 1, AP = 2, INTERVAL = 3;/*適用タイミング*/ const NGWORDS = {/* 合計100ポイントで非表示判定(ただし1つの記事内で同じワードが複数使われても1度しか加算しない) */ '100': [/*即NG確定ワード*/ 'dorawii', 'あおやまちゃん', 'アオヤマチャン', 'ボスマン', '電気通信大学たいてい', 'なんぴょん', 'れめくん', 'れめきゅん', 'えめくん', 'るまさん', '眠りの民', 'リュックサック野郎', 'boushi_inst', 'hakaikami', 'Rekyu', 'iloveootaku_2', 'osaka-sirokichi',/*電気通信大学たいてい鉄道研究会れめくん(頻出)*/ /*A-G*/'a9w8ru6fqyxqfv9', 'admirail_togo', 'akibakko6348', 'alf1974al', 'amatukiseiru', 'anapgoeson', 'aoi_mizuho', 'asapgoeson', 'asupgoeson', 'b6jbpsji91ieigt', 'bmi22yo', 'boushi_instrail', 'boushi_ob', 'buscholarx', 'bw0531', 'chihiro_love415', 'circlecavok', 'disney1007cla', 'dora22sibuya', 'donkotrain', 'ecotosk', 'electlone', 'factomodachi', 'fft_dareka', 'gmhtcyznf_abc', 'goesonanap', 'gyudon_honmono', /*H-N*/'h13_yokohama', 'h2twi', 'H2TWR', 'hamaishogo1111', 'haru_mofumoffu', 'hermitv8', 'hirabiscus', 'hinolovelove', 'hnmk0127_03', 'inaken17_', 'inte235dy', 'ixtabes', 'jamcombatge', 'kawachiasukanew', 'kaoru_ai1991', 'keio9730F', 'kiha2228', 'koreanlabsfc', 'koyounoyooko', 'kqlex1500', 'kunugiyamaosake', 'kurakamasan', 'kurotamaxxx', 'kt_ruma_1372', 'kt_up_date', 'lightningreen77', 'luckyyusha', 'mamadoll_kun', 'matya_uec', 'michee_n', 'minamihinawot', 'miniminicot', 'minori0151', 'mizunyanpanda', 'monkichi_22', 'mugen_08i', 'mukoroku651', 'nakano6409', 'nanpyong', 'new_oer', 'nimouec', 'NoName_thUFO', 'norannnde', /*O-U*/'oreizmmiporin', 'orenotanoshimi', 'osaka_sirokichi', 'papepoco', 'pasotokon', 'pm95uq', 'portrail', 'reme_kun', 'ruin_2002', 'rx00shiratama03', 's03_amurtk2731', 'sacchan03110319', 'sacchanenjoy', 'seisu_bot', 'senanana_cos', 'shinano_115', 'shineleaf1372', 'Shirasagi494', 'shop_bullet', 'shurimpy', 'soroisoroi', 'sui_pm95uq', 'sweidan821858', 'taiyaki_level2', 'takao_straight5', 'taking0000', 'tarotaromusic1', 'tc201_501', 'thomas_returnee', 'tocarbarn', 'tokusatsu_fan_0', 'toshikimiyazaki', 'train_magician', 'tx9y2cpwdz27255', 'u2fap5u4zw57811', 'uec15take', 'uecdaisuki', 'UECert', 'uecrail', /*V-Z_0-9*/'vampire_mio', 'vbdmnwefknmxsdm', 'vp20th', 'wafue', 'wakasato_', 'walkingniwatori', 'wataameexpress', 'ya4975349616894', 'yayoiulc', 'ymbk_arisa', 'yms_uec16', 'yuuya_1104_uec', '__________ob', '_chocorail_', '_doitforthewin_', '_toeshin', '_unigmo', '100mph_no_yuuki', '16887y', '169_D51_protect', '205musashino', '2969364x', '2rtkvn34il2783', '36kyo', '86lilxw1', 'テクウヨ', '自己放尿', ' ーーーーーーーー', 'https://anond.hatelabo.jp/20260107144223',/*AI問答貼り付け増田*/ '†噛み締めて行こうな†', '困難女性(コンジョ)', '困難女性(コンジョ)', 'コンジョ自警団', 'raiselysite.com',/*英文スパム*/ ], '90': [/*ほぼNG*/ 'megalodon.jp', '鉄道研究会', '鉄研', '通勤特快', '不正乗車', 'こども料金', '性慾', '穢い', 'エッタ', 'オソソ', 'キセル', 'uec', ], '10': [/*NG*/ '電気通信大学', '電通大', '駿河台大学', '大学院', '学生課', '教務課', '朝鮮語', '北朝鮮', '統合失調症', ], }; const sites = { 'prefix': [ ['selector', '(modifier)', '(css)', '(REPEAT)'], ], 'https://b.hatena.ne.jp/site/anond.hatelabo.jp/': [ ['section.entrylist-unit li.js-keyboard-selectable-item', li => {li.querySelector('li.entrylist-contents-category > a').textContent = li.dataset.matches}, `.${CLASSNAME}{display: none;}`, AP], ], }; const rules = sites[Object.keys(sites).find(prefix => location.href.startsWith(prefix))]; if(rules === undefined) return console.log(SCRIPTID, 'Not found any sites.'); const scores = Object.keys(NGWORDS).map(Number).reverse();/*数値インデックス順に取り出されたkeysを逆順にして100から並べ直す*/ const filter = function(selector, modifier){/*各要素に対してNGワード判定して、該当したら追加でmodifierも適用する*/ document.querySelectorAll(selector).forEach(e => { if(e.dataset[CHECKED]) return; e.dataset[CHECKED] = 'true'; const text = e.textContent.toLowerCase(); let total = 0, matches = []; for(const score of scores){ for(const word of NGWORDS[String(score)]){ if(text.includes(word.toLowerCase())){ total += score; matches.push(word); if(total >= 100){ e.classList.add(CLASSNAME); e.dataset.matches = matches.join(', '); if(modifier) modifier(e); return; } } } } }); }; /* ONCE(一括適用) */ rules.forEach(rule => { const [selector, modifier, css] = rule; console.log(SCRIPTID, 'ONCE:', selector); filter(selector, modifier); if(css){ const style = document.createElement('style'); style.dataset.script = SCRIPTID; style.type = 'text/css'; style.textContent = css; document.head.appendChild(style); } }); /* AP(AutoPagerize) */ rules.filter(rule => rule[3] === AP).forEach(rule => { const [selector, modifier] = rule; document.addEventListener('GM_AutoPagerizeNextPageLoaded', e => { console.log(SCRIPTID, 'AP:', selector); filter(selector, modifier); }); }); /* INTERVAL */ rules.filter(rule => rule[3] === INTERVAL).forEach(rule => { const [selector, modifier] = rule; setInterval(function(){ console.log(SCRIPTID, 'INTERVAL:', selector); filter(selector, modifier); }, 1000); }); console.timeEnd(SCRIPTID); })();
/* Hatena Bookmark Anond Filter */ .filtered{ display: block !important;/*上書き*/ opacity: .25 !important; } .filtered:hover{ opacity: .75 !important; } .filtered li.entrylist-contents-category{ background: red !important; font-weight: bold; }
検索用: はてなブックマーク はてブ はてな匿名ダイアリー 増田 スパム キーワード NGワード フィルター ミュート 非表示 削除 隠す ブロック ユーザースクリプト ユーザースタイル hatena bookmark anond spam keywords ngwords filter mute hide hidden display none block userscript JavaScript js css style
| 投稿日 | 記事リンク | 記事をブクマしていたが後に削除されたアカウント |
| 2025年05月27日 | ウクライナ戦争に参加した日本人義勇兵達の絶望の未来 - 76users | mgdothe |
| 2025年05月30日 | ここ6~7年前から反社属性のオタク界隈関係者増えすぎじゃね? - 31users | mgdothe |
| 2025年06月26日 | すまん、AIって全然使えなくね? - 547users | mgdothe parisbird |
| 2025年06月30日 | すまん、AIってやっぱ有料でも使えんし格差拡大するだけじゃね?危険じゃね? - 53users | parisbird |
| 2025年07月02日 | AIが技術的に根本から全く使えない3つの理由 - 58users | parisbird |
| 2025年07月16日 | SNS界隈やエンタメ界隈ってもはや低強度紛争状態だよな - 5users | mgdothe parisbird |
| 2025年08月25日 | 政治にお熱な事は大いに結構だが、オタク界隈に関わるんじゃねえ - 2users | mgdothe parisbird |
| 2025年08月28日 | ネット辞めたほうがQOL爆上がりすると気づいた、もう楽になろうぜ - 395users | mgdothe parisbird |
| 2025年09月03日 | ウクライナに消えたぼくのフレンド - 154users | mgdothe parisbird |
| 2025年09月04日 | ある日本人義勇兵の死~敗北者たちの黄昏~ - 11users | mgdothe parisbird |
| 2025年09月07日 | IT企業経営者の兄が首を吊って自殺した - 341users | mgdothe parisbird cvtte56 |
| 2025年09月11日 | 子供がいじめを受けた、家庭のすべてが崩壊した - 6users | mgdothe parisbird cvtte56 akuaku-88 |
| 2025年09月11日 | 親族(15)がまさかの補導でパ〇活やってたことが判明【追記】 - 30users | mgdothe parisbird cvtte56 akuaku-88 |
| 2025年09月16日 | 友人のIT企業社長が逮捕されてから人生終了するまでの話 - 54users | mgdothe parisbird GUNIT-011 |
| 2025年09月18日 | 疑問なんだがITエンジニアってDV癖のあるやつ多いの?【補記】 - 219users | mgdothe parisbird GUNIT-011 |
| 2025年09月19日 | 妹夫婦が性交渉の不一致で離婚することになった(ま~たIT系かい…) - 269users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年09月22日 | 発狂されそうだけど、純粋に人間としてつまらんのよ増田は - 260users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年09月22日 | 妹夫婦が性交渉の不一致で離婚危機だったが落し所が見つかった - 12users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年09月27日 | 20代末から40歳まで11~2年しかないのに何で気が付かなかったの? - 347users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年09月29日 | 婚活での虚しい嘘成功例、ハッキリ言って憐れである - 196users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年09月30日 | すまん、非モテ中年達はテロリストにでもなりたいの? - 115users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年09月30日 | いや、マジであんだけイキってて20歳末~40歳までお前ら何してたの? - 8users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月01日 | 太字長文説教増田、ガチで予言者だろコイツ - 36users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月01日 | ぶっちゃけ日本のIT技術者のレベルが元々低いだけだよね① - 501users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月04日 | 海外でITエンジニアをしていた時に予言された事通りに業界がなってる - 538users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月06日 | 追記:2025年-俺達が信じたITの夢の果てにて - 52users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月07日 | 割とマジで発達障害がITに向いてるって誰が言いだしたんだ? - 131users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月09日 | 一生食えるスキルがない?何でITエンジニアになんかなったの? - 69users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月13日 | ネット民が恋愛できないのってぶっちゃけ日本の国策なんだが - 66users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月15日 | お前らの雲より高い恋愛願望叶える方法って真面目にテロしかなくね? - 119users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月17日 | 増田が大好きななろう系が衰退してる理由 - 79users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月18日 | なろう系(カクヨムだの亜種含む)の層の人たちってこんなのだから - 44users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月18日 | 正直ああいう人たちは恋愛脳じゃなくて「家族コンプレックス」だよね - 121users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月20日 | 「日本のITは国に潰された!」👈そりゃ潰されるだろこんな業界 - 21users | mgdothe parisbird GUNIT-011 dorohedorone |
| 2025年10月30日 | アラフォー元特殊作戦群、ハッキリ言って人生終わっている - 241users | sft98 shotshow megapic gjchang PJ-F16 pmpan67 |
| 2025年10月31日 | やっぱり俺ら陸自の特戦群は日本人のオモチャ扱いか、人権ないんか - 168users | quiet001 burn-burnag1 bva-wwx gjchang PJ-F16 pmpan67 |
| 2025年12月23日 | 国際勝共連合のテロリストだった父との思い出 - 524users | jack-o89 jaxfg4 |
| 2025年12月24日 | 父の活動について追記:質問と回答① - 4users | jack-o89 jaxfg4 |
| 2025年12月25日 | 国際勝共連合のテロリストだった父の「秘密戦争」① - 16users | jack-o89 jaxfg4 nanonanosts dorochangku hondeman egkun |
| 2026年01月04日 | 1980年代でアメリカ傭兵スクールに行った話 - 7users | dainabookskun necnectua egkun |
| 2026年01月10日 | ネット商売して目立ってる人たちって「ヤクザ化」していく不思議 - 6users | dainabookskun necnectua gopic egkun |
| 2026年01月11日 | アメリカでITエンジニアからテロリストになった兄の話 - 420users | dainabookskun necnectua gopic |
| 2026年01月11日 | アメリカでITエンジニアからテロリストになった兄の話 追記 - 153users | gopic |
| 2026年01月11日 | アメリカでITエンジニアからテロリストになった兄の話 追記2 - 143users | gopic |
| 2026年01月22日 | 元ITエンジニアの兄がまたテロリストになってしまった - 5users | dainabookskun necnectua gopic |
Not Foundにこういうことするとお前も消されるぞ
一度投稿したうえで別タブを開いてプログラム的(fetch)に送信してその別タブが閉じられる仕組み。
// ==UserScript==
// @name PGP未署名検出と別タブ自動編集
// @namespace http://tampermonkey.net/
// @version 1.0
// @description PGP署名がない投稿を自動編集ページへ誘導
// @match https://anond.hatelabo.jp/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM.openInTab
// ==/UserScript==
(function () {
'use strict';
const body = document.getElementById('entry-page');
if (!body) return;
const titleText = document.title;
if (!titleText.includes('dorawii')) return;
const pgpRegex = /BEGIN.*PGP(?: SIGNED MESSAGE| SIGNATURE)?/;
const preElements = document.querySelectorAll('div.body pre');
let hasPgpSignature = false;
for (const pre of preElements) {
if (pgpRegex.test(pre.textContent)) {
hasPgpSignature = true;
break;
}
}
if (hasPgpSignature) return;
const editLink = document.querySelector('a.edit');
const childTab = GM.openInTab(editLink.href, { active: false, insert: true, setParent: true });
})();
// ==UserScript==
// @name 編集ページ処理と自動送信・閉じ
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 編集ページで署名処理と送信、タブ自動閉じ
// @match https://anond.hatelabo.jp/dorawii_31/edit?id=*
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_notification
// @connect localhost
// ==/UserScript==
(async function () {
'use strict';
const shouldRun = await GM_getValue('open-tab-for-edit', '0');
const textareaId = 'text-body';
const textarea = document.getElementById(textareaId);
if (!textarea) return;
const content = textarea.value;
const pgpSignatureRegex = /-----BEGIN PGP SIGNED MESSAGE-----[\s\S]+?-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/;
if (pgpSignatureRegex.test(content)) {
console.log('[PGPスクリプト] 署名が検出されたためそのまま送信します');
return;
}
const httpRequest = (url, data) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: 'POST',
url: url,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: `value=${encodeURIComponent(data)}`,
onload: function (response) {
resolve(response.responseText);
},
onerror: function (error) {
reject(error);
}
});
});
};
// textarea の値を取得
// 1. 現在のページのURLからURLオブジェクトを作成
const currentUrl = new URL(window.location.href);
// 2. ベースとなる部分 (例: "https://anond.hatelabo.jp") を取得
const origin = currentUrl.origin;
// 3. 'id' パラメータの値 (例: "20250610184705") を取得
const idValue = currentUrl.searchParams.get('id');
// 4. ベース部分とIDを結合して、目的のURL文字列を生成
// idValueが取得できた場合のみ実行する
let newUrl = null;
if (idValue) {
newUrl = `${origin}/${idValue}`;
}
// 5. 生成されたURLを変数に代入し、コンソールに出力して確認
console.log(newUrl);
const valueToSend = newUrl;
try {
const signatureText = await httpRequest('http://localhost:12345/run-batch', valueToSend);
console.log('バッチ応答:', signatureText);
if (!signatureText.includes('BEGIN PGP SIGNED MESSAGE')) {
alert('PGP署名がクリップボードに見つかりませんでした。');
return;
}
const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n';
textarea.value = newText;
console.log('[PGPスクリプト] 署名を貼り付けました。送信を再開します。');
const form = document.forms.edit;
const newForm = form.cloneNode(true);
form.replaceWith(newForm);
newForm.addEventListener('submit', async (e) => {
e.preventDefault(); // HTML標準のsubmitをキャンセル
const bodyText = textarea?.value || '';
// reCAPTCHA トークンの取得
const recaptchaToken = await new Promise((resolve) => {
grecaptcha.enterprise.ready(() => {
grecaptcha.enterprise.execute('hoge', { action: 'EDIT' })
.then(resolve);
});
});
// POSTするデータの構築
const formData = new FormData(newForm);
formData.set('body', bodyText);
formData.set('recaptcha_token', recaptchaToken);
formData.set('edit', '1');
try {
const response = await fetch(newForm.action, {
method: 'POST',
body: formData,
credentials: 'same-origin'
});
if (response.ok) {
console.log('送信成功');
window.close();
} else {
console.error('送信失敗', response.status);
}
} catch (err) {
console.error('送信中にエラーが発生', err);
}
});
// プログラム的に送信トリガー
newForm.dispatchEvent(new Event('submit', { bubbles: true }));
} catch (e) {
console.error('バッチ呼び出し失敗:', e);
}
})();
const http = require('http'); const { exec } = require('child_process'); const querystring = require('querystring'); const server = http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.method === 'POST' && req.url === '/run-batch') { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { const parsed = querystring.parse(body); const value = parsed.value || 'default'; // 値を引数としてバッチに渡す exec(`C:\\Users\\hoge\\Desktop\\makesign.bat "${value}"`, { encoding: 'utf8' }, (err, stdout, stderr) => { if (err) { res.writeHead(500); res.end('Error executing batch: ' + stderr); } else { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end(stdout.trim()); } }); }); } else { res.writeHead(404); res.end('Not found'); } }); server.listen(12345, () => { console.log('Batch server running at http://localhost:12345/'); });
@echo off setlocal enabledelayedexpansion :: 署名するファイル名 set "infile=%~1" set outfile=%TEMP%\pgp_output.asc :: 以前の出力があれば削除 if exist "%outfile%" del "%outfile%" :signloop :: AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える) start "" /b "C:\Users\hoge\Documents\AutoHotkey\autopass.ahk" :: PGPクリア署名を作成 echo %infile% | gpg --yes --clearsign --output "%outfile%" :: 署名が成功していればループを抜ける if exist "%outfile%" ( goto postprocess ) else ( timeout /t 1 > nul goto signloop ) :postprocess powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content '%outfile%' -Raw; Write-Output ($header + \"`r`n\" + $body + $footer)" powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content 'signed.asc' -Raw; Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)" endlocal exit /b
#Persistent #SingleInstance ignore SetTitleMatchMode, 2 WinWaitActive, pinentry SendInput password Sleep 100 SendInput {Enter} ExitApp
動けばいいという考えで作っているので余分なコードも含んでいるかもしれない。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20250613185036 -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEv1FQAKCRBwMdsubs4+ SHHkAQDUOLgBcdji2T6MJ7h/vlMdFfGlWAzNdXijjE1gIuEPywEAiMNMZqhrMmtl c7UqRuggNJ/UTa5xTIcKp622+7jJQQg= =Lgkl -----END PGP SIGNATURE-----
ようやく(ほぼ)すべてが自動化された。
あとはローカルサーバーの起動をスタートアップに設定する(方法をAIに聞いて指示に従う)だけの消化試合。
署名時要求してくるパスワードを自動入力するahkファイルはドキュメントのAutoHotkey配下に置いた。
バッチファイル(make.sign.bat)はデスクトップに置いた。
#Persistent #SingleInstance ignore SetTitleMatchMode, 2 WinWaitActive, pinentry SendInput お前のパスワード Sleep 100 SendInput {Enter} ExitApp
// run-batch-server.js const http = require('http'); const { exec } = require('child_process'); const server = http.createServer((req, res) => { if (req.url === '/ping') { res.writeHead(200); res.end('pong'); } else if (req.url === '/run-batch') { exec('C:\\Users\\you\\Desktop\\makesign.bat', (err) => { res.writeHead(200); res.end(err ? 'Error' : 'OK'); }) ; } else { res.writeHead(404); res.end('Not found'); } }); server.listen(12345, () => { console.log('Batch server running at http://localhost:12345/'); });
@echo off setlocal enabledelayedexpansion :: ミリ秒単位のUTC時刻を取得 for /f %%a in ('powershell -nologo -command "[int64]::Parse((Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmssfff'))"') do set timestamp=%%a :: 署名するファイル名 set infile=%TEMP%\pgp_input.txt set outfile=%TEMP%\pgp_output.asc :: 以前の出力があれば削除 if exist "%outfile%" del "%outfile%" :: タイムスタンプを原文として保存 echo %timestamp% > "%infile%" :signloop :: AutoHotkeyでパスフレーズ入力(gpgがパスワード要求するダイアログが出た場合に備える) start "" /b "C:\Users\infini\Documents\AutoHotkey\autopass.ahk" :: PGPクリア署名を作成 gpg --yes --clearsign --output "%outfile%" "%infile%" :: 署名が成功していればループを抜ける if exist "%outfile%" ( echo [INFO] 署名成功 goto postprocess ) else ( echo [WARN] 署名失敗、再試行します… timeout /t 1 > nul goto signloop ) :postprocess :: PowerShellで余計な改行なしに |< をつけてクリップボードにコピー powershell -nologo -command ^ "$header = '>|'; $footer = '|<'; $body = Get-Content '%outfile%' -Raw; Set-Clipboard -Value ($header + \"`r`n\" + $body + $footer)" echo Done. signed.asc created and clipboard updated (no extra blank line). endlocal exit /b
// ==UserScript== // @name PGP署名自動付加スクリプト(GM_xmlhttpRequest版) // @namespace http://tampermonkey.net/ // @version 1.0 // @description 投稿前にPGP署名を付けてから送信(fetch未使用) // @match https://anond.hatelabo.jp/dorawii_31/edit* // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_notification // / @connect localhost // ==/UserScript== (function () { 'use strict'; const submitId = 'submit-button'; const textareaId = 'text-body'; const localServer = 'http://localhost:12345/run-batch'; const pgpSignatureRegex = /-----BEGIN PGP SIGNED MESSAGE-----[\s\S]+?-----BEGIN PGP SIGNATURE-----[\s\S]+?-----END PGP SIGNATURE-----/; const httpRequest = (url) => { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: url, onload: function (response) { resolve(response.responseText); }, onerror: function (error) { reject(error); } }); }); }; const interceptClick = () => { const btn = document.getElementById(submitId); if (!btn || btn.dataset.pgpIntercepted === 'true') return; btn.dataset.pgpIntercepted = 'true'; btn.addEventListener('click', async function (e) { const textarea = document.getElementById(textareaId); if (!textarea) return; const content = textarea.value; if (pgpSignatureRegex.test(content)) { console.log('[PGPスクリプト] 署名が検出されたためそのまま送信します'); return; } e.preventDefault(); e.stopImmediatePropagation(); console.log('[PGPスクリプト] 署名が見つからないため処理を停止し、署名を取得します'); try { await httpRequest(localServer); // バッチ実行 const signatureText = await navigator.clipboard.readText(); if (!signatureText.includes('BEGIN PGP SIGNED MESSAGE')) { alert('PGP署名がクリップボードに見つかりませんでした。'); return; } const newText = content.replace(/\s*$/, '') + '\n' + signatureText + '\n'; textarea.value = newText; console.log('[PGPスクリプト] 署名を貼り付けました。送信を再開します。'); btn.click(); // イベント再発火 } catch (err) { alert('PGP署名の取得または貼り付けに失敗しました。\n' + err); } }, true); }; window.addEventListener('load', () => { setTimeout(interceptClick, 1000); }); })();
プロミスメソッドとか全然まだ理解してなくてそのなかに関数代入したその関数にオブジェクトのプロパティにresponseを?いやまあそのあたりのコードが示すデータの流れが全然理解できないような人間でもここまでできちゃった。
AIすごいなと思うよ。そして思うのは今後重要になってくるのは文法とか自体に詳しいことじゃなくて、そのプログラムの処理内容を指示できるシステムエンジニア的な言語化能力のほうじゃないかなと思った。
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 20250609111559680 -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaEbCbwAKCRBwMdsubs4+ SLueAPwOv7PBk4voAe5qlcCEvs/PJhmKc5QAb/1R43JMQFuDZgD/UTPEKsL/PhK9 jFGv2HDXK1dVjLNwvosgX9uYJh5xxwY= =qiOE -----END PGP SIGNATURE-----
最近になって増田で複垢自演ブクマが行われてるのを初めて見たという人向けに基本的なことを少しだけ説明する。
自演が疑われる記事やアカウントに対しては、以下のリンクにあるように、簡単に運営に通報できる仕組みが用意されている。
問い合わせフォームから通報する時は、自演の疑いがあるアカウントと記事のURLを忘れずにコピペすること。
https://hatena.zendesk.com/hc/ja/articles/900004879046
真偽不明だが、上記の通報機能を使ったけど運営に届いていなかったという報告が増田に投稿されている。
https://anond.hatelabo.jp/20220810222751
ちゃんと通報が届くのか不安な人は以下の問い合わせフォームを利用したほうがいいかもしれない。
https://hatena.zendesk.com/hc/ja/requests/new
もし通報したアカウントが本当に自演していた場合はきっちりBANされるようになっている。
ただし通報が完了してから即対処されるわけではない。問い合わせにも順番待ちというものがあることと、運営による状況の確認作業が必要だということは留意する必要がある。対処までの時間は場合によって異なり、数時間から数日程度と幅があるのだが、通報したのが土日祝日などの運営が休みの日だと、休み明けになってからの対応となる。
テクウヨ増田に関しては、ほぼ毎回通報していたのだが、通報した日の夕方にBANされてその日の夜にまた復活するというパターンが多かった。
自演していたアカウントがBANされたとしても、記事の方も一緒に削除されるとは限らない。そのまま残っていることも往々にしてある。
そして記事が削除された場合であっても、ブクマページがNot Found状態になる場合とならない場合の2パターンがある。
誰がどう見てもわかるくらい堂々と自演が行われていた場合であったとしても、基本的に運営というのは利用者からの通報がなければ動くことはない。
自演行為に対してブコメや増田で「運営は何してんだ、ちゃんと対処してくれよ」的なことをいくら書いたところで対処されることはないので、もし本当に何とかしてほしいと思っているのであれば、自分から通報なり問い合わせをして運営側に問題を認知してもらうほかない。
3IDとも現時点でNot Foundになってるね
top 41 - 60
top 21 - 40