jpskill.com
💼 ビジネス コミュニティ

linkedin-easy-apply

Puppeteer/Chromiumを用いてLinkedInのEasy Apply求人を自動検索・応募し、履歴書PDFの添付、リモート/職種フィルタリング、日次再実行、保守的な回答制御を行い、効率的な求職活動を支援するSkill。

📜 元の英語説明(参考)

Automate LinkedIn Easy Apply searches and applications with Puppeteer/Chromium, a verified resume PDF, remote/job-title filtering, stateful daily reruns, and conservative answer guardrails.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Puppeteer/Chromiumを用いてLinkedInのEasy Apply求人を自動検索・応募し、履歴書PDFの添付、リモート/職種フィルタリング、日次再実行、保守的な回答制御を行い、効率的な求職活動を支援するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o linkedin-easy-apply.zip https://jpskill.com/download/19810.zip && unzip -o linkedin-easy-apply.zip && rm linkedin-easy-apply.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/19810.zip -OutFile "$d\linkedin-easy-apply.zip"; Expand-Archive "$d\linkedin-easy-apply.zip" -DestinationPath $d -Force; ri "$d\linkedin-easy-apply.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して linkedin-easy-apply.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → linkedin-easy-apply フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

LinkedIn Easy Apply 自動化

このスキルは、AIコーディング/オペレーションエージェントが、反復可能なLinkedIn Easy Applyワークフローを構築・実行するのに役立ちます。

意図的に公開されており、認証情報は不要です。ユーザー名、パスワード、Cookie、プライベートプロファイルパス、またはユーザー固有の秘密情報は含まれていません。

機能

  • Easy Applyが有効なLinkedIn求人を検索します。
  • リモートのみ、または場所の制約がある検索をサポートします。
  • AI、LLM、Claude、OpenAI、Codex、full-stack、frontend、backend、web、software、JavaScript、TypeScript、Node、React、Svelteなどの設定可能な役割キーワードに焦点を当てます。
  • 可能な場合は、直接の応募URLを使用して、LinkedIn Easy Applyフローを確実に開きます。
  • 検証済みの履歴書PDFをアップロードします。
  • 検証済みの応募者情報のみに回答します。
  • 不明な必須質問、報酬に関する質問、カスタムエッセイ、または主観的なフィールドはスキップします。
  • 状態とJSONLログを保持し、日々の再実行で重複を回避します。

安全ルール

  • LinkedInの認証情報をスクリプト、スキル、メモリ、ログ、またはレポートに保存しないでください。
  • オペレーターが手動で一度ログインする永続的なブラウザプロファイルを推奨します。
  • CAPTCHA、MFA、不審なログインチェック、本人確認、またはアカウントセキュリティのプロンプトが表示された場合は停止してください。
  • 応募者情報を捏造しないでください。
  • オペレーターが提供した回答なしに、カスタムの自由形式の質問や報酬の期待に回答しないでください。
  • リモートのみの応募を提出する前に、ハイブリッド/場所の制約について求人票全体を再確認してください。

環境変数

RESUME_PDF=/absolute/path/to/resume.pdf
CHROME_PROFILE=$HOME/.cache/linkedin-chrome
STATE_DIR=/tmp/linkedin-easyapply-daily
MAX_SCAN=80
MAX_APPLY=10
DRY_RUN=1
SEARCHES='Claude|OpenAI|Codex|LLM engineer|AI engineer|full stack engineer|software engineer'
LOCATION='United States'
REMOTE_ONLY=1

Puppeteer起動パターン

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({
  headless: false,
  executablePath: process.env.CHROME_BIN || '/snap/bin/chromium',
  userDataDir: process.env.CHROME_PROFILE || `${process.env.HOME}/.cache/linkedin-chrome`,
  defaultViewport: null,
  args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--start-maximized']
});

const page = await browser.newPage();
page.setDefaultTimeout(30000);
page.on('dialog', async d => {
  try {
    if (d.type() === 'beforeunload') await d.accept();
    else await d.dismiss();
  } catch {}
});

検索ワークフロー

明示的なフィルターを使用してLinkedIn求人URLを構築します。

  • Easy Applyには f_AL=true を使用します。
  • リモートのみが必要な場合はリモートフィルターを使用します。
  • 要求された場合は United States などの場所を使用します。
  • 履歴書とターゲット市場に一致する設定可能なキーワードを使用します。

カード/ページが要求された制約をサポートし、タイトル/説明がターゲットの役割ファミリーに一致する場合にのみ候補者を保持します。

直接Easy Apply URL

LinkedInの求人IDが分かっている場合は、まず直接フローを試してください。

const applyUrl = `https://www.linkedin.com/jobs/view/${jobId}/apply/?openSDUIApplyFlow=true`;
await page.goto(applyUrl, { waitUntil: 'domcontentloaded', timeout: 60000 });

モーダルが開かない場合は、ボタンやリンク全体で表示されている Easy Apply コントロールをクリックするフォールバックを行います。

控えめな回答ルール

履歴書、プロフィール、または明示的なオペレーターの指示によって検証された事実のみに回答します。

  • 就労許可/就労資格:検証済みの場合のみ「はい」。
  • ビザスポンサーシップが必要:検証済みの場合のみ「いいえ」。
  • リモート勤務の意欲:リモートのみの検索の場合のみ「はい」。
  • 経験年数:履歴書に基づいた値またはユーザー承認済みのマッピングを使用します。
  • メール/電話/場所:既存のプロフィール/履歴書の事実を使用します。
  • ミドルネーム:提供されていない場合は空白。

スキップするもの:

  • 給与/報酬の期待。
  • カバーレターのテキストプロンプト。
  • カスタムエッセイ。
  • 承認されていない場合の転居/ハイブリッド/出張。
  • 不明瞭な必須入力、ラジオボタン、または選択項目。

多段階応募ループ

  1. 応募フローを開きます。
  2. 既に提出された応募を検出します。
  3. 必要に応じて、検証済みの履歴書PDFをアップロード/選択します。
  4. 各ステップの表示されている入力/選択/ラジオボタンを検査します。
  5. 安全で検証済みの回答のみを記入します。
  6. 未知の必須フィールドが残っていない場合にのみ、「次へ」、「レビュー」、そして「応募を送信」をクリックします。
  7. 提出済み/スキップ済みの状態をログに記録します。

推奨される状態

{
  "seen": {},
  "applied": {},
  "skipped": {},
  "alreadySubmitted": {}
}

状態とログは以下に書き込みます。

/tmp/linkedin-easyapply-daily/state.json
/tmp/linkedin-easyapply-daily/results.jsonl

レポート

簡潔な結果を報告します。

提出済み:
- タイトル — 会社 — URL

スキップ済み:
- タイトル — 会社 — URL — 理由

状態: /tmp/linkedin-easyapply-daily/state.json
ログ: /tmp/linkedin-easyapply-daily/results.jsonl

落とし穴

  • ブラウザに組み込まれているツールはLinkedInでタイムアウトすることがよくあります。ChromiumとXvfbを使用したPuppeteerの方が通常は信頼性が高いです。
  • LinkedInの検索カードには「リモート」と表示されていても、説明にハイブリッド/ローカルの制約が含まれている場合があります。応募する前にページ全体を検査してください。
  • 広範なキーワードマッチングは不適切な回答を生み出す可能性があります。「United States」や「comfortable」のような一般的な単語を承認と見なさないでください。
  • DOM値の直接割り当てではReactフォームが更新されない場合があります。クリック/タイプと入力/変更イベントのディスパッチを推奨します。
  • ページがデタッチされたり、モーダルが予期せず閉じたりした場合は、新しいページを作成し、状態ファイルから続行してください。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

LinkedIn Easy Apply Automation

This skill helps an AI coding/operations agent build and run a repeatable LinkedIn Easy Apply workflow.

It is intentionally public and credential-free. It contains no usernames, passwords, cookies, private profile paths, or user-specific secrets.

What it does

  • Searches LinkedIn Jobs with Easy Apply enabled.
  • Supports remote-only and location-constrained searches.
  • Focuses on configurable role keywords such as AI, LLM, Claude, OpenAI, Codex, full-stack, frontend, backend, web, software, JavaScript, TypeScript, Node, React, and Svelte.
  • Opens the LinkedIn Easy Apply flow reliably with a direct apply URL when possible.
  • Uploads a verified resume PDF.
  • Answers only verified applicant facts.
  • Skips unknown required questions, compensation questions, custom essays, or subjective fields.
  • Keeps state and JSONL logs so daily reruns avoid duplicates.

Safety rules

  • Do not store LinkedIn credentials in scripts, skills, memory, logs, or reports.
  • Prefer a persistent browser profile where the operator logs in manually once.
  • Stop for CAPTCHA, MFA, suspicious-login checks, identity verification, or account-security prompts.
  • Do not fabricate applicant facts.
  • Do not answer custom freeform questions or compensation expectations without operator-provided answers.
  • Re-check full job descriptions for hybrid/location constraints before submitting remote-only applications.

Environment variables

RESUME_PDF=/absolute/path/to/resume.pdf
CHROME_PROFILE=$HOME/.cache/linkedin-chrome
STATE_DIR=/tmp/linkedin-easyapply-daily
MAX_SCAN=80
MAX_APPLY=10
DRY_RUN=1
SEARCHES='Claude|OpenAI|Codex|LLM engineer|AI engineer|full stack engineer|software engineer'
LOCATION='United States'
REMOTE_ONLY=1

Puppeteer launch pattern

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({
  headless: false,
  executablePath: process.env.CHROME_BIN || '/snap/bin/chromium',
  userDataDir: process.env.CHROME_PROFILE || `${process.env.HOME}/.cache/linkedin-chrome`,
  defaultViewport: null,
  args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--start-maximized']
});

const page = await browser.newPage();
page.setDefaultTimeout(30000);
page.on('dialog', async d => {
  try {
    if (d.type() === 'beforeunload') await d.accept();
    else await d.dismiss();
  } catch {}
});

Search workflow

Build LinkedIn Jobs URLs using explicit filters:

  • f_AL=true for Easy Apply.
  • Remote filter when remote-only is required.
  • Location such as United States when requested.
  • Configurable keywords matching the resume and target market.

Keep candidates only when the card/page supports the requested constraints and the title/description matches the target role family.

Direct Easy Apply URL

When a LinkedIn job ID is known, try the direct flow first:

const applyUrl = `https://www.linkedin.com/jobs/view/${jobId}/apply/?openSDUIApplyFlow=true`;
await page.goto(applyUrl, { waitUntil: 'domcontentloaded', timeout: 60000 });

If the modal does not open, fall back to clicking visible Easy Apply controls across buttons and links.

Conservative answer rules

Answer only facts that are verified by the resume, profile, or explicit operator instruction:

  • Work authorization / eligible to work: yes only if verified.
  • Visa sponsorship required: no only if verified.
  • Remote willingness: yes only for remote-only searches.
  • Years of experience: use resume-backed values or a user-approved mapping.
  • Email/phone/location: use existing profile/resume facts.
  • Middle name: blank if none provided.

Skip:

  • Salary/compensation expectations.
  • Cover-letter text prompts.
  • Custom essays.
  • Relocation/hybrid/travel if not approved.
  • Unclear required inputs, radios, or selects.

Multi-step apply loop

  1. Open the apply flow.
  2. Detect already-submitted applications.
  3. Upload/select the verified resume PDF if needed.
  4. Inspect each step's visible inputs/selects/radios.
  5. Fill only safe verified answers.
  6. Click Next, Review, then Submit application only when no unknown required fields remain.
  7. Log submitted/skipped state.

Suggested state

{
  "seen": {},
  "applied": {},
  "skipped": {},
  "alreadySubmitted": {}
}

Write state and logs to:

/tmp/linkedin-easyapply-daily/state.json
/tmp/linkedin-easyapply-daily/results.jsonl

Reporting

Report concise results:

Submitted:
- Title — Company — URL

Skipped:
- Title — Company — URL — reason

State: /tmp/linkedin-easyapply-daily/state.json
Log: /tmp/linkedin-easyapply-daily/results.jsonl

Pitfalls

  • Built-in browser tools often time out on LinkedIn. Puppeteer with Chromium and Xvfb is usually more reliable.
  • LinkedIn search cards can say Remote while the description includes hybrid/local constraints. Inspect the full page before applying.
  • Broad keyword matching can create bad answers. Avoid treating generic words like United States or comfortable as approval.
  • Direct DOM value assignment may not update React forms. Prefer click/type and dispatch input/change events.
  • If a page detaches or a modal closes unexpectedly, create a new page and continue from the state file.