Skip to content

Instantly share code, notes, and snippets.

@hushin
Created December 6, 2025 02:10
Show Gist options
  • Select an option

  • Save hushin/8ce2df76c7cb898169dd0b2e3fa0f422 to your computer and use it in GitHub Desktop.

Select an option

Save hushin/8ce2df76c7cb898169dd0b2e3fa0f422 to your computer and use it in GitHub Desktop.
// ========================================
// セキュリティ・キャンプアンケート自動入力スクリプト
// ========================================
// 使い方: DevToolsで実行してください
// ========================================
// 設定値(ここを編集してください)
// ========================================
const FORM_DATA = {
// 設問1: 個人に関する設問
section1: {
// 1-1. お名前
lastName: '山田',
firstName: '太郎',
// 1-2. お名前(ふりがな)
lastNameKana: 'やまだ',
firstNameKana: 'たろう',
// 1-3. 生年月日
birthYear: '2000',
birthMonth: '1', // "1"〜"12"
birthDay: '1', // "1"〜"31"
// 1-4. メールアドレス
email: 'example@example.com',
// 1-5. 現在の所属(複数選択可、配列で指定)
// 選択肢: "student", "employee", "parttime", "other"
affiliation: ['student'],
affiliationOther: '', // "other"を選択した場合の入力値
// 1-6. 全国大会の参加年度(複数選択可)
// 選択肢: "2004"〜"2025", "none"(参加していない)
nationalCampYears: ['2023', '2024'],
// 1-7. ネクストの参加年度(単一選択)
// 選択肢: "2019"〜"2025", "none"(参加していない)
nextCampYear: 'none',
// 1-8. ジュニアの参加年度(単一選択)
// 選択肢: "2023"〜"2025", "none"(参加していない)
juniorCampYear: 'none',
// 1-9. セキュリティ・キャンプミニへの参加年度(複数選択可)
// 選択肢: "2013"〜"2025", "none"(参加していない)
miniCampYears: ['none'],
},
// 設問2: 学生の方に対する設問(所属が学生の場合のみ有効)
section2: {
// 2-1. 将来の進路希望(セレクトボックス c_q259)
// 選択肢の値: "0", "1", "2", "3", "4", "5"
// 0=民間企業, 1=公務, 2=教育, 3=研究者, 4=起業, 5=その他
careerHope: '0',
// 2-2. IT分野での将来の希望職種(セレクトボックス c_q260)
// 選択肢の値: "0", "1", "2", "3", "4", "5", "6", "7"
// 0=SE・プログラマー(組込み開発を含む), 1=ネットワークエンジニア, 2=Web制作・デザイナー,
// 3=情報セキュリティ専門家, 4=アナリスト, 5=ゲームクリエーター, 6=IT分野その他, 7=IT分野を希望していない
itCareerHope: '3',
},
// 設問3: 社会人等の方に対する設問(所属が企業・団体の場合のみ有効)
section3: {
// 3-1-1. 現在就業している企業・団体の業種(セレクトボックス c_q261)
// 選択肢の値: "0", "1", "2", "3", "4", "5"
// 0=民間企業, 1=公務, 2=教育, 3=研究者, 4=経営層, 5=その他
companyType: '0',
// 3-1-2. その他の具体的内容(テキストエリア c_q279)
companyTypeOther: '',
// 3-1-3. 所属先が協議会の会員企業・団体である場合(チェックボックス c_q290)
// 選択肢: "member", "nonmember"
companyMembership: 'nonmember',
// 3-1-4. 企業名・団体名(テキストエリア c_q333、任意)
companyName: '',
// 3-2. 情報セキュリティにかかわる業務を担当していますか(ラジオボタン c_q262)
// 選択肢: "yes", "no"
securityWork: 'yes',
},
// 設問4: これまでの活動等に関わる設問
section4: {
// 4-1. イベント参加・協力の有無
// 選択肢: "yes", "no"
eventParticipation: 'yes',
// 4-1-1. 該当するものにチェック(複数選択可、c_q315)
// 0=全国大会・ミニキャンプの講師・チューターを務めた, 1=ミニキャンプに参加した,
// 2=フォーラムに参加した(講演・補助を含む), 3=IPAが主催するセキュリティ・キャンプ以外のワークショップ・勉強会に参加した(講演・補助を含む),
// 4=IPA以外が主催する勉強会等を開催または参加した, etc=その他
eventParticipationDetails: [0, 2], // 講師・チューターを務めた、フォーラムに参加した
eventParticipationDetailsOther: '', // "etc"を選択した場合の入力値
// 4-1-2. イベント開催をどのような方法で知りましたか?(テキストエリア c_q316)
eventInfoSource: 'メーリングリストとSNS',
// 4-2-1. 参加したイベント(行×列の表形式、複数選択可)
// 各イベントに対して参加・講演・受賞・運営のチェックボックスがあります
// イベント15個 × 種類4種 = 60個のチェックボックス(c_q302_0〜c_q302_59)
// 配列のインデックス: 0-14=参加, 15-29=講演, 30-44=受賞, 45-59=運営
// イベント順: CODE BLUE, ISUCON, MWS Cup, SECCON, SECCON Beginners, SECCON CTF for GIRLS,
// SecHack365, TSG CTF, U-22, アプリ甲子園, 白浜シンポ, 情報オリンピック, 高専プロコン, パソコン甲子園, 学生ベンチャー
// 例: CODE BLUEの参加=0, CODE BLUEの講演=15, CODE BLUEの受賞=30, CODE BLUEの運営=45
// ISUCONの参加=1, ISUCONの講演=16, ISUCONの受賞=31, ISUCONの運営=46
events: [
// 参加(0-14)
0, // CODE BLUE
3, // SECCON
// 講演(15-29)
// 受賞(30-44)
33, // SECCON
// 運営(45-59)
],
// 4-2-2. その他のコンテスト
otherContests: '特になし',
// 4-3. 情報処理安全確保支援士試験の受験経験(任意)
// 選択肢: "yes", "no", null(未回答)
securitySupporterExam: 'no',
// 4-4. 情報処理技術者試験の受験経験(任意)
// 選択肢: "yes", "no", null(未回答)
itExam: 'yes',
// 4-4-1. 合格している試験区分(複数選択可、c_q266)
// 0=ITパスポート試験, 1=情報セキュリティマネジメント試験, 2=基本情報技術者試験,
// 3=応用情報技術者試験, 4=ITストラテジスト試験, 5=システムアーキテクト試験,
// 6=プロジェクトマネージャ試験, 7=ネットワークスペシャリスト試験,
// 8=データベーススペシャリスト試験, 9=エンべデッドシステムスペシャリスト試験,
// 10=ITサービスマネージャ試験, 11=システム監査技術者試験
itExamCategories: [2, 3], // 基本情報技術者試験、応用情報技術者試験
// 4-5. 未踏事業への応募経験(任意)
// 選択肢: "yes", "no", "unknown", null(未回答)
mitouApplication: 'no',
// 4-6. 講師・チューターとの情報交換(セレクトボックス c_q295)
// 選択肢の値: "0", "1", "2", "3"
// 0=定期的もしくは時々対面による情報交換を行っている
// 1=SNS等オンラインで情報交換を行っている
// 2=SNSをフォローしている
// 3=特に情報交換等を行っていない
instructorContact: '1',
// 4-7. 同期の修了生との連絡(セレクトボックス c_q303)
// 選択肢の値: "0", "1", "2", "3"
// 0=定期的もしくは時々対面で情報交換をしている
// 1=SNSで連絡を取り合っている(会ってはいない)
// 2=SNSでフォローしている
// 3=特に連絡は取っていない
alumniContact: '1',
// 4-8. 情報セキュリティ専門家との人脈(セレクトボックス c_q297)
// 選択肢の値: "0", "1", "2", "3"
// 0=勉強会や大会に参加して人脈が広がった
// 1=講師や参加者の紹介で人脈が広がった
// 2=その他の手段で人脈が広がった
// 3=特に人脈の広がりはない
securityNetwork: '0',
},
// 設問5: セキュリティ・キャンプとの今後の関わりについての設問
section5: {
// 5-1. 今後の協力意向(ラジオボタン)
// 選択肢: "0"=協力したいと思う, "1"=今は考えていない
cooperationIntent: '0',
// 5-2. 協力いただけること(行×列の表形式、複数選択可)
// 6イベント × 5種類 = 30個のチェックボックス(c_q321_0〜c_q321_34、一部欠番)
// 配列のインデックス: 0-6=講師(実際は0,1,2,3,6のみ、4,5は欠番), 7-13=チューター, 14-20=運営, 21-27=講演, 28-34=宣伝
// イベント順: 全国大会, ネクスト, ジュニア, コネクト, キャンプミニ, フォーラム
// 例: 全国大会の講師=0, 全国大会のチューター=7, 全国大会の運営=14, 全国大会の講演=21, 全国大会の宣伝=28
cooperation: [
7, // 全国大会のチューター
11, // キャンプミニのチューター
20, // フォーラムの運営
],
// 5-3. キャンプミニの開催エリア(ラジオボタン c_q351)
// 選択肢の値: "0"〜"10"
// 0=北海道, 1=東北, 2=関東, 3=甲信越, 4=北陸, 5=中部, 6=近畿, 7=中国, 8=四国, 9=九州・沖縄, 10=該当なし
miniCampArea: '2',
// 5-4. 最も得意とする分野(セレクトボックス c_q274)
// 選択肢の値: "0", "1", "2", "3", "4", "5"
// 0=Web, 1=組込み系, 2=ネットワーク系, 3=解析(ソフトウェア系), 4=その他, 5=特になし
specialtyField: '0',
// 5-5. ワークショップ・フォーラム参加可能な時間帯(チェックボックス c_q301)
// 配列でインデックスを指定
// 0=平日午前, 1=平日午後, 2=平日夜, 3=休日午前, 4=休日午後, 5=休日夜
availableTime: [2, 4], // 平日夜、休日午後
// 5-6. 話を聞きたい講演者やテーマ(テキストエリア c_q305)
workshopTheme: '最新のセキュリティ動向について',
// 5-7. 希望する実施形態(チェックボックス c_q287、複数選択可)
// 0=PCを使った実習講義, 1=PC実習のない座学講義, 2=技術以外(キャリアアップ等)に関する講義,
// 3=キャンプ参加者同士の懇親の場, 4=オンライン, etc=その他
workshopFormat: [0, 4], // PC実習、オンライン
workshopFormatOther: '', // "etc"を選択した場合の入力値
},
// 設問6: IPAの事業体験等への参加意向、その他
section6: {
// 6-1. 興味関心があるイベント(チェックボックス c_q345、複数選択可)
// 0=情報セキュリティ10大脅威選考への参加, 1=情報セキュリティ白書の執筆,
// 2=セキュリティセミナー等の運営支援, 3=未踏発企業への訪問・情報交換,
// 4=セキュリティセミナー等の聴講, 5=未踏関連イベント等の運営支援,
// 6=未踏関連イベント等の参加, 7=該当なし, etc=その他
interestedEvents: [4, 6], // セミナー聴講、未踏イベント参加
interestedEventsOther: '', // "etc"を選択した場合の入力値
// 6-2. IPAからの情報提供への同意(チェックボックス c_q349_0)
// true/false
agreementInfoProvision: true,
// 6-3-1. 修了生Slackへの参加状況(ラジオボタン c_q329)
// 選択肢の値: "0"=既に参加済み, "1"=参加を希望する, "2"=参加を見送る
slackStatus: '0',
// 6-3-2. Slack招待用URL送付先メールアドレス(テキスト入力 c_q330)
slackEmail: '',
// 6-4. IPAセキュリティ・キャンプ事務局へのご意見・ご要望(テキストエリア c_q276)
feedback: '特にありません。',
},
// 個人情報の取扱いへの同意(チェックボックス c_q46_0、必須)
privacyAgreement: true,
};
// ========================================
// フォーム入力処理(ここから下は編集不要)
// ========================================
// ヘルパー関数: 要素に値を設定
function setValue(selector, value) {
const element = document.querySelector(selector);
if (element) {
element.value = value;
element.dispatchEvent(new Event('input', { bubbles: true }));
element.dispatchEvent(new Event('change', { bubbles: true }));
return true;
}
return false;
}
// ヘルパー関数: チェックボックス/ラジオボタンを設定
function setChecked(selector, checked) {
const element = document.querySelector(selector);
if (element) {
element.checked = checked;
element.dispatchEvent(new Event('change', { bubbles: true }));
return true;
}
return false;
}
// ヘルパー関数: セレクトボックスの値を設定
function setSelect(selector, value) {
const element = document.querySelector(selector);
if (element) {
element.value = value;
element.dispatchEvent(new Event('change', { bubbles: true }));
return true;
}
return false;
}
// メイン処理
function fillForm() {
console.log('フォームの自動入力を開始します...');
// 設問1: 個人に関する設問
console.log('設問1を入力中...');
setValue('#c_q66_first', FORM_DATA.section1.lastName);
setValue('#c_q66_second', FORM_DATA.section1.firstName);
setValue('#c_q8_first', FORM_DATA.section1.lastNameKana);
setValue('#c_q8_second', FORM_DATA.section1.firstNameKana);
setValue('#c_q291_year', FORM_DATA.section1.birthYear);
setSelect('#c_q291_month', FORM_DATA.section1.birthMonth);
setSelect('#c_q291_day', FORM_DATA.section1.birthDay);
setValue('#c_q9', FORM_DATA.section1.email);
setValue('#c_q9_confirm', FORM_DATA.section1.email);
// 1-5. 所属
const affiliationMap = {
student: '#c_q344_0',
employee: '#c_q344_1',
parttime: '#c_q344_2',
other: '#c_q344_etc',
};
Object.keys(affiliationMap).forEach((key) => {
setChecked(
affiliationMap[key],
FORM_DATA.section1.affiliation.includes(key),
);
});
if (FORM_DATA.section1.affiliation.includes('other')) {
setValue('#c_q344_etc_text', FORM_DATA.section1.affiliationOther);
}
// 1-6. 全国大会の参加年度
const nationalYearMap = {
2004: 0,
2005: 1,
2006: 2,
2007: 3,
2008: 4,
2009: 5,
2010: 6,
2011: 7,
2012: 8,
2013: 9,
2014: 10,
2015: 11,
2016: 12,
2017: 13,
2018: 14,
2019: 15,
2020: 16,
2021: 17,
2022: 18,
2023: 19,
2024: 20,
2025: 21,
none: 22,
};
Object.keys(nationalYearMap).forEach((year) => {
setChecked(
`#c_q348_${nationalYearMap[year]}`,
FORM_DATA.section1.nationalCampYears.includes(year),
);
});
// 1-7. ネクストの参加年度
const nextYearMap = {
2019: 0,
2020: 1,
2021: 2,
2022: 3,
2023: 4,
2024: 5,
2025: 6,
none: 7,
};
if (FORM_DATA.section1.nextCampYear in nextYearMap) {
setChecked(`#c_q339_${nextYearMap[FORM_DATA.section1.nextCampYear]}`, true);
}
// 1-8. ジュニアの参加年度
const juniorYearMap = {
2023: 0,
2024: 1,
2025: 2,
none: 3,
};
if (FORM_DATA.section1.juniorCampYear in juniorYearMap) {
setChecked(
`#c_q340_${juniorYearMap[FORM_DATA.section1.juniorCampYear]}`,
true,
);
}
// 1-9. セキュリティ・キャンプミニの参加年度
const miniYearMap = {
2013: 0,
2014: 1,
2015: 2,
2016: 3,
2017: 4,
2018: 5,
2019: 6,
2020: 7,
2021: 8,
2022: 9,
2023: 10,
2024: 11,
2025: 12,
none: 13,
};
Object.keys(miniYearMap).forEach((year) => {
setChecked(
`#c_q341_${miniYearMap[year]}`,
FORM_DATA.section1.miniCampYears.includes(year),
);
});
// 設問2: 学生向け設問
if (FORM_DATA.section1.affiliation.includes('student')) {
console.log('設問2を入力中...');
setSelect('#c_q259', FORM_DATA.section2.careerHope);
setSelect('#c_q260', FORM_DATA.section2.itCareerHope);
}
// 設問3: 社会人向け設問
if (
FORM_DATA.section1.affiliation.includes('employee') ||
FORM_DATA.section1.affiliation.includes('parttime')
) {
console.log('設問3を入力中...');
setSelect('#c_q261', FORM_DATA.section3.companyType);
setValue('textarea[name="c_q279"]', FORM_DATA.section3.companyTypeOther);
if (FORM_DATA.section3.companyMembership === 'member') {
setChecked('#c_q290_0', true);
} else if (FORM_DATA.section3.companyMembership === 'nonmember') {
setChecked('#c_q290_1', true);
}
if (FORM_DATA.section3.securityWork === 'yes') {
setChecked('#c_q262_0', true);
} else {
setChecked('#c_q262_1', true);
}
setValue('textarea[name="c_q333"]', FORM_DATA.section3.companyName);
}
// 設問4: これまでの活動等に関わる設問
console.log('設問4を入力中...');
if (FORM_DATA.section4.eventParticipation === 'yes') {
setChecked('#c_q314_0', true);
// 4-1-1. 該当するものにチェック(c_q315)
FORM_DATA.section4.eventParticipationDetails.forEach((index) => {
if (index === 'etc') {
setChecked('#c_q315_etc', true);
setValue('#c_q315_etc_text', FORM_DATA.section4.eventParticipationDetailsOther);
} else {
setChecked(`#c_q315_${index}`, true);
}
});
// 4-1-2. イベント開催をどのような方法で知りましたか?(c_q316)
setValue('textarea[name="c_q316"]', FORM_DATA.section4.eventInfoSource);
} else {
setChecked('#c_q314_1', true);
}
// 4-2-1. イベント参加(表形式 c_q302)
FORM_DATA.section4.events.forEach((index) => {
setChecked(`#c_q302_${index}`, true);
});
setValue('textarea[name="c_q313"]', FORM_DATA.section4.otherContests);
// 4-3〜4-5(任意)
if (FORM_DATA.section4.securitySupporterExam === 'yes') {
setChecked('#c_q294_0', true);
} else if (FORM_DATA.section4.securitySupporterExam === 'no') {
setChecked('#c_q294_1', true);
}
if (FORM_DATA.section4.itExam === 'yes') {
setChecked('#c_q267_0', true);
// 4-4-1. 合格している試験区分(c_q266)
FORM_DATA.section4.itExamCategories.forEach((index) => {
setChecked(`#c_q266_${index}`, true);
});
} else if (FORM_DATA.section4.itExam === 'no') {
setChecked('#c_q267_1', true);
}
if (FORM_DATA.section4.mitouApplication === 'yes') {
setChecked('#c_q318_0', true);
} else if (FORM_DATA.section4.mitouApplication === 'no') {
setChecked('#c_q318_1', true);
} else if (FORM_DATA.section4.mitouApplication === 'unknown') {
setChecked('#c_q318_2', true);
}
setSelect('#c_q295', FORM_DATA.section4.instructorContact);
setSelect('#c_q303', FORM_DATA.section4.alumniContact);
setSelect('#c_q297', FORM_DATA.section4.securityNetwork);
// 設問5: 今後の関わり
console.log('設問5を入力中...');
if (FORM_DATA.section5.cooperationIntent === '0') {
setChecked('#c_q355_0', true);
} else {
setChecked('#c_q355_1', true);
}
// 5-2. 協力内容(表形式 c_q321)
FORM_DATA.section5.cooperation.forEach((index) => {
setChecked(`#c_q321_${index}`, true);
});
// 5-3. キャンプミニのエリア
setChecked(`#c_q351_${FORM_DATA.section5.miniCampArea}`, true);
setSelect('#c_q274', FORM_DATA.section5.specialtyField);
// 5-5. 参加可能な時間帯(c_q301)
FORM_DATA.section5.availableTime.forEach((index) => {
setChecked(`#c_q301_${index}`, true);
});
// 5-6. 話を聞きたい講演者やテーマ(c_q305)
setValue('textarea[name="c_q305"]', FORM_DATA.section5.workshopTheme);
// 5-7. 希望する実施形態(c_q287)
FORM_DATA.section5.workshopFormat.forEach((index) => {
if (index === 'etc') {
setChecked('#c_q287_etc', true);
setValue('#c_q287_etc_text', FORM_DATA.section5.workshopFormatOther);
} else {
setChecked(`#c_q287_${index}`, true);
}
});
// 設問6: その他
console.log('設問6を入力中...');
FORM_DATA.section6.interestedEvents.forEach((index) => {
if (index === 'etc') {
setChecked('#c_q345_etc', true);
setValue('#c_q345_etc_text', FORM_DATA.section6.interestedEventsOther);
} else {
setChecked(`#c_q345_${index}`, true);
}
});
setChecked('#c_q349_0', FORM_DATA.section6.agreementInfoProvision);
// 6-3-1. Slack参加状況
setChecked(`#c_q329_${FORM_DATA.section6.slackStatus}`, true);
// 6-3-2. Slack招待用URL送付先メールアドレス
setValue('#c_q330', FORM_DATA.section6.slackEmail);
setValue('textarea[name="c_q276"]', FORM_DATA.section6.feedback);
// 個人情報の取扱いへの同意
setChecked('#c_q46_0', FORM_DATA.privacyAgreement);
console.log('フォームの自動入力が完了しました!');
console.log('内容を確認して「送信内容確認」ボタンをクリックしてください。');
}
// 実行
try {
fillForm();
} catch (error) {
console.error('エラーが発生しました:', error);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment