
AI 应用AI 技能【免费下载链接】ai-job-searchThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.项目地址https://gitcode.com/GitHub_Trending/ai/ai-job-search点击查看免费下载导读linkedin-cli 是 ai-job-search 仓库中linkedin-search技能附带的命令行工具它直接调用 LinkedIn 公开的jobs-guest匿名接口让你可以在任意国家/地区含全球 Remote 职位、任意行业下搜索职位列表并拉取单个职位的完整详情。它无需任何认证、无需 API Key且零运行时依赖——只要装有bun克隆仓库即可直接运行。读完本文你将掌握它的安装方式、search与detail两条命令的全部参数用法、三种输出格式、JSON 错误协议以及从 URL 构造到 HTML 解析、指数退避重试的完整底层实现原理。一、工具定位一个免安装、免认证的求职搜索 CLIlinkedin-cli的核心设计目标可以概括为三点免认证数据源是 LinkedIn 的公开jobs-guest端点seeMoreJobPostings/search与jobPosting/id不需要登录态、Cookie 或 API Key零依赖使用纯bun 内置fetch实现没有任何运行时依赖bun install是可选的只用于安装 TypeScript 开发类型定义全球化jobs-guest端点对所有市场都是同一套CLI 的 HTML 解析与具体国家无关只需通过--location传入不同的地点字符串即可切换市场同一套代码开箱即用地适用于任何地区的求职者。正如 SKILL.md 中所注明的它是仓库职位门户技能模式job-portal-skill pattern的一个国家无关country-agnostic的落地示例而整个技能与 CLI 的触发入口在仓库中由allowed-tools限定为Bash(bun run .agents/skills/linkedin-search/cli/src/cli.ts *)。⚠️ 个人使用声明该工具读取 LinkedIn 的公开职位页面自动化访问违反 LinkedIn 服务条款Terms of Service。请保持低频率访问、不要用于商业用途或批量数据采集并自行承担运行责任。这一限制贯穿 CLI README、SKILL.md 与 url-reference.md 三处文档。二、安装与运行前提由于没有运行时依赖安装步骤极其简单cd .agents/skills/linkedin-search/cli bun install # 可选——仅安装 TypeScript 开发类型定义即使跳过bun installCLI 也可以直接运行。package.json 明确声明dependencies为空对象devDependencies中仅有typescript ^5.4.0与types/bun 1.3.14main指向src/cli.ts并提供了linkedin-search的bin入口同时预置了三条脚本Script命令用途startbun run src/cli.ts直接启动 CLItestbun test --timeout 30000运行测试套件30 秒超时typechecktsc --noEmit类型检查运行时唯一硬性要求是安装 bun仓库环境的运行时并具备网络访问 LinkedIn 的能力。三、命令总览与参数速查CLI 提供两条命令入口文件为 src/cli.ts命令说明输出格式search搜索职位列表--location必填--format json\|table\|plain默认jsondetail获取单个职位的完整详情--format json\|plain所有错误统一写入stderr格式为{ error: ..., code: ... }进程退出码为1。3.1search完整参数表Flag别名说明--location-l必填。地点字符串例如Mumbai, Maharashtra, India、Berlin, Germany、London, United Kingdom、Remote。--query-q关键词职位 / 技能 / 角色推荐使用。--jobage发布于最近 N 天内的职位取值为1、7、14、30省略则返回全部。--jobage-minutes发布于最近 N 分钟内的职位亚天级精度如30。与--jobage冲突二者只能传一个。--remote工作场所类型过滤remote|hybrid|onsite。--page页码从 1 开始每页固定 10 条结果。--limit-n客户端侧截断限制最终输出的结果条数。--formatjson|table|plain默认json。3.2detail命令的输入与输出detail命令接收一个id|url参数随后用--format json|plain控制输出默认json。id取自search结果的数字型职位 ID例如4426311357。从 SKILL.md 可知除裸数字 ID 外它还可以接受完整的 LinkedInjobs/view/...URLurn:li:jobPosting:...URN。返回内容包含完整职位描述description、资历级别seniority、雇佣类型employment type、职位职能job function与所属行业industries以及职位是否仍然开放的状态。四、快速示例可直接复制运行以下示例全部来自 CLI README 与 SKILL.md可直接在仓库根目录执行# 海得拉巴的软件工程师职位最近 7 天发布 bun run .agents/skills/linkedin-search/cli/src/cli.ts search -q backend engineer -l Hyderabad, Telangana, India --jobage 7 --format table # 伦敦的产品设计师职位 bun run .agents/skills/linkedin-search/cli/src/cli.ts search -q product designer -l London, United Kingdom --format table # 全远程的文档工程师职位 bun run .agents/skills/linkedin-search/cli/src/cli.ts search -q technical writer -l Remote --remote remote --format table # 班加罗尔的数据工程师职位最近 30 天发布 bun run .agents/skills/linkedin-search/cli/src/cli.ts search -q data engineer -l Bengaluru, Karnataka, India --jobage 30 --format table # 柏林的产品经理职位限远程 bun run .agents/skills/linkedin-search/cli/src/cli.ts search -q product manager -l Berlin, Germany --remote remote --format table # 全球远程的律师助理职位 bun run .agents/skills/linkedin-search/cli/src/cli.ts search -q paralegal -l Remote --format table # 最近 30 分钟内发布的远程工程师职位亚天级时间窗 bun run .agents/skills/linkedin-search/cli/src/cli.ts search -q engineer -l Remote --jobage-minutes 30 --format table # 获取单个职位的完整详情 bun run .agents/skills/linkedin-search/cli/src/cli.ts detail 4426311357 --format plain在仓库的 Agent 工作流中这些命令通常经由linkedin-search技能触发触发短语包括 find a job、job search、remote jobs、are there any X jobs in 等见 SKILL.md把搜索结果中的职位 ID 直接交给detail获取完整描述进而与仓库中的职位评估、简历定制等流程衔接。五、输出格式详解格式最佳用途json默认格式适合程序化消费可把返回结果中的 ID 直接传给detailtable快速人眼扫描的紧凑表格plain阅读单个职位的完整详情配合detail命令search --format json的输出结构见 src/commands/search.ts为{ meta: { count: 10, page: 1 }, results: [ { id: 4426311357, title: Backend Engineer, company: Example Corp, companyUrl: https://www.linkedin.com/company/example, location: Hyderabad, Telangana, India, date: 2026-09-22, url: https://www.linkedin.com/jobs/view/4426311357 } ] }其中每个结果对应一条职位卡片字段来自 helpers.ts 中定义的JobCard接口。table格式会输出 ID / TITLE / COMPANY / LOCATION / DATE 五列的对齐表格plain格式则把每个职位压缩为「标题 / 公司 · 地点 · 日期 / id / url」几行。detail --format plain会输出标题、公司、地点、资历、雇佣类型、职能、行业、状态ACTIVE或CLOSED / EXPIRED、完整描述与 URL 的易读文本。六、底层实现原理从 URL 构造到 HTML 解析6.1 数据源与请求 URL两个端点在 helpers.ts 中硬编码搜索https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search详情https://www.linkedin.com/jobs-guest/jobs/api/jobPostingurl-reference.md 对这两个端点给出了完整的参数对照参数含义示例keywords自由文本查询data engineerlocation地点字符串Mumbai, Maharashtra, India·Berlin, Germany·Remotef_TPR发布时间窗口秒r6048007 天、r259200030 天f_WT工作场所类型1现场 ·2远程 ·3混合start分页偏移每页 10 条0、10、20、…搜索 URL 的组装逻辑在 src/commands/search.ts 的buildUrl中--query映射为keywords--location映射为location时间窗通过minutesToTPR/jobageToTPR换算成f_TPR秒值--remote经workTypeFlag映射为f_WTstart (page - 1) * 10。两个换算函数在 helpers.ts 中实现jobageToTPR(days)days 0或 9999时返回null表示不设置时间窗否则返回r${days * 86400}例如 7 天 →r604800、30 天 →r2592000minutesToTPR(minutes)返回r${minutes * 60}例如 30 分钟 →r1800该行为有测试用例直接断言见 search.test.tsworkTypeFlag(mode)remote→2、hybrid→3、onsite/on-site→1未知值返回null。6.2 HTML 解析策略浅层标记 正则两个端点返回的都是 HTML 而非 JSON。开发者有意不引入 DOM 解析器注释中说明 LinkedIn 的卡片标记浅且稳定而node-html-parser在 LinkedIn 卡片上存在已知的嵌套 bughelpers.ts。因此搜索页解析parseJobCards响应是扁平的一串li职位卡片按data-entity-urnurn:li:jobPosting:切分成独立块逐块解析单张损坏的卡片不会拖垮其余结果每块提取 ID、base-card__full-link中的 URL、base-search-card__title或sr-onlyspan中的标题、base-search-card__subtitle中的公司与公司主页、job-search-card__location中的地点、job-search-card__listdate中的datetime属性helpers.ts详情页解析parseJobDetail提取top-card-layout__title/topcard__title标题、topcard__org-name-link公司、topcard__flavor--bullet地点用extractDivContent以标签深度计数的方式正确处理嵌套div抓取show-more-less-html__markup或description__text富文本描述块并把br、/p等标签替换为换行保留段落结构职位标准项资历、雇佣类型、职能、行业通过description__job-criteria-subheader标签名与description__job-criteria-text取值的正则成对抓取helpers.ts状态检测仅限顶卡范围内检查closed-job__flavor或 no longer accepting applications 文本实现注释特别强调该检测只认是否出现关闭横幅isActive: true仅表示未发现关闭横幅不代表职位必然开放标记漂移或同意墙响应同样不会渲染横幅。6.3 请求健壮性超时、限流与指数退避htmlFetchhelpers.ts是全部请求的统一出口具备以下行为设置自定义User-AgentMozilla/5.0 (compatible; linkedin-search-cli/1.0)、Accept、Accept-Language与X-Requested-With: XMLHttpRequest头15 秒请求超时AbortSignal.timeout(15000)对429 / 5xx做最多 6 次重试初始延迟 500ms、指数翻倍至上限 8000ms并附加 0–500ms 随机抖动jitter打散重试时间点404 返回空字符串上层据此判定NOT_FOUND其他非 2xx 状态直接抛出错误。6.4detail的 ID 归一化与安全防线detail并不会盲目接受任何输入。normalizeIdsrc/commands/detail.ts依次尝试urn:li:jobPosting:digitsURN 匹配纯 6 位以上数字串URL 形式带或不带 scheme 均可——仅接受主机名落在linkedin.com域内的jobs/view/id路径无 scheme 无斜杠的标题 slug如software-engineer-1234567890。代码注释揭示了一个真实安全教训旧实现会从任何 URL中取第一个 6 位以上数字段导致 Greenhouse 或 Lever 的投递链接职位页自己派发的申请外链被误解析从而拉取到恰好同号的无关 LinkedIn 职位并成功退出如今通过真实的 URL 解析同时拦截了形似域名linkedin.com.evil.io与 userinfo 注入linkedin.comevil.io等手段。七、严格参数校验宁可报错不可静默放行src/cli.ts 实现了两层强校验并有对应的测试套件cli-flag-validation.test.ts逐一验证未知标志一律拒绝search/detail各自维护KNOWN_FLAGS白名单任何未声明的 flag 都会以UNKNOWN_FLAG错误退出。设计动机来自一次真实事故在另一门户上拼错的 flag 名被静默丢弃导致一次请求把整个门户数据库13862 条结果当成匹配结果返回——被丢弃的过滤器改变了搜索结果却毫无报错。数字参数严格整形校验--jobage、--jobage-minutes、--page、--limit使用Number()而非parseInt解析必须是大于等于 1 的整数否则以BAD_ARG退出。这修复了parseInt(0.5) 0导致f_TPR被静默丢弃的历史缺陷测试中引用了 issue #371。冲突参数检测--jobage与--jobage-minutes同时传入时以CONFLICTING_AGE_FLAGS退出--location缺失以NO_LOCATION退出detail缺 ID 以NO_ID退出未知命令以BAD_CMD退出运行期异常统一封装为INTERNAL_ERROR。完整错误码速查错误码触发场景NO_LOCATIONsearch缺少必填的--location/-lCONFLICTING_AGE_FLAGS同时传了--jobage与--jobage-minutesBAD_ARG数字参数非整数、小于 1 或非数字UNKNOWN_FLAG传入了未声明的 flagNO_IDdetail缺少id\|url参数BAD_CMD未知命令BAD_IDdetail的输入无法解析出职位 ID含非 LinkedIn 域名 URLNOT_FOUND详情页返回 404SEARCH_FAILED/DETAIL_FAILED对应命令运行期请求失败INTERNAL_ERROR未捕获的运行时异常所有错误均以单行 JSON 写入 stderr退出码为1与仓库其他门户 CLI 的错误契约保持一致。八、常见问题与使用建议为什么--jobage与--jobage-minutes不能同时用二者都用于构造同一个f_TPR时间窗参数同时传入会产生歧义CLI 选择显式报错而非猜一个值。--limit与分页的关系--page决定请求哪一页每页固定 10 条即start (page-1)*10--limit是客户端侧截断即在解析出的卡片列表上slice(0, limit)src/commands/search.ts不会改变发往 LinkedIn 的请求。收到 429 怎么办CLI 内置最多 6 次、最长约 8 秒延迟的指数退避重试但仍建议降低请求频率、缩小--jobage窗口遵守个人使用、低频率的边界。detail报BAD_ID确认输入是纯数字 ID、jobs/view/开头的 LinkedIn URL 或urn:li:jobPosting:URN且主机确为 linkedin.com——申请外链Greenhouse/Lever 等无法用于查询。想快速验证正确性直接运行bun test在.agents/skills/linkedin-search/cli目录下执行测试套件覆盖 flag 校验、未知标志拒绝、f_TPR构造、--limit 0行为、ID 归一化、重试退避与请求超时等场景运行bun run src/cli.ts --help或search --help可随时查看内嵌的完整用法帮助。九、延伸阅读技能完整定义触发条件、上下文与 ToS 说明.agents/skills/linkedin-search/SKILL.mdCLI 官方说明本文主体来源.agents/skills/linkedin-search/cli/README.md数据端点与查询参数对照/.agents/skills/linkedin-search/url-reference.mdCLI 入口与参数解析/校验.agents/skills/linkedin-search/cli/src/cli.ts搜索命令实现.agents/skills/linkedin-search/cli/src/commands/search.ts详情命令与 ID 归一化.agents/skills/linkedin-search/cli/src/commands/detail.ts请求、解析与参数换算核心.agents/skills/linkedin-search/cli/src/helpers.ts依赖与脚本声明.agents/skills/linkedin-search/cli/package.json参数校验测试.agents/skills/linkedin-search/cli/tests/cli-flag-validation.test.ts赞分享AI 应用AI 技能【免费下载链接】ai-job-searchThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.项目地址https://gitcode.com/GitHub_Trending/ai/ai-job-search点击查看免费下载相关推荐ai-job-search 中的 Jobdanmark 职位搜索技能基于 Jobdanmark.dk 公共 API 的丹麦求职检索 CLI 实战指南ai job search 中的 Jobdanmark 职位搜索技能基于 Jobdanmark.dk 公共 API 的丹麦求职检索 CLI 实战指南 本文围绕AI 应用AI 技能用 Bun 打造零依赖、全球通用的职位搜索 CLIai-job-search 仓库 LinkedIn Search Skill 实战指南用 Bun 打造零依赖、全球通用的职位搜索 CLIai job search 仓库 LinkedIn Search Skill 实战指南 本指南围绕 ai jAI 应用AI 技能ai-job-search 项目 Jobdanmark 职位搜索 CLI 实战指南基于 Jobdanmark.dk 公共 API 的丹麦职位检索工具ai job search 项目 Jobdanmark 职位搜索 CLI 实战指南基于 Jobdanmark.dk 公共 API 的丹麦职位检索工具 本指南围AI 应用AI 技能上一篇Apache DolphinScheduler FILE 参数详解任务间文件传递的完整指南下一篇IoT-For-Beginners 智能语音计时器Wio Terminal 基于 DMAC 与 Flash 的音频采集实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考