@viyzhu/boss-cli-fork 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,50 @@
1
1
  import type { Frame, Page } from 'puppeteer-core';
2
+ /**
3
+ * 默认搜索城市。**不硬编码深圳**——这个包是公开发布的,别人不一定在深圳;
4
+ * 不设这个变量时完全不碰城市控件,行为与加本功能之前一致。
5
+ */
6
+ export declare function defaultSearchCityFromEnv(): string;
7
+ /**
8
+ * 解析 `--school` / `--status` / `--major` 这类可多选参数的逗号分隔值。
9
+ * 中英文逗号都收——中文输入法下顺手打出全角逗号太常见,
10
+ * 因此而报「院校要求没有『统招本科,985院校』这一项」纯属自找麻烦。
11
+ */
12
+ export declare function parseFilterLabels(raw: string | undefined): string[];
13
+ /**
14
+ * 「跳槽频率」的选项里有个 `时间≥1年`——`≥` 在键盘上打不出来。
15
+ * 允许用户写 `>=`,映射到页面上的真实文案;其余一律按原样完全匹配。
16
+ */
17
+ export declare function normalizeFilterLabel(raw: string): string;
18
+ /**
19
+ * 拆 `--exp-range` / `--age-range` 的 `下限-上限`。
20
+ * 半角/全角连字符和波浪号都收,理由同逗号:中文输入法下这几个键太容易打串。
21
+ */
22
+ export declare function parseRangeArg(raw: string): {
23
+ min: string;
24
+ max: string;
25
+ };
26
+ /**
27
+ * 经验滑块共 12 档,档位文案是实测出来的(拖到各个百分比读 tooltip):
28
+ * 1=在校/应届,2..11=「(档位-1)年」,12=10年以上。
29
+ */
30
+ export declare const EXP_SLIDER_STOPS = 12;
31
+ export declare function expSliderLabel(index: number): string;
32
+ /**
33
+ * 学历滑块共 7 档,档位文案同样是实测 tooltip 读出来的,**不是照学历常识排的**
34
+ * (第 2 档是「中专/中技」不是「中专」,写错就永远匹配不上)。
35
+ */
36
+ export declare const DEGREE_SLIDER_LABELS: readonly ["初中及以下", "中专/中技", "高中", "大专", "本科", "硕士", "博士"];
37
+ export declare const DEGREE_SLIDER_STOPS: 7;
38
+ export declare function degreeSliderLabel(index: number): string;
39
+ /** 把 `--degree-range` 的一段转成滑块档位;只认页面上那七个文案。 */
40
+ export declare function degreeTokenToIndex(token: string): number;
41
+ /**
42
+ * 把 `--exp-range` 的一段转成滑块档位。收 `应届`、`0`~`10`、`10+`。
43
+ * 不认的值直接报错——猜错档位=搜错人群,而且用户不会发现。
44
+ */
45
+ export declare function expTokenToIndex(token: string): number;
46
+ /** 把 `--age-range` 的一段转成年龄下拉里的文案。收 `16`~`46` 与 `46+`。 */
47
+ export declare function ageTokenToLabel(token: string): string;
2
48
  export declare function isBossChatSearchUrl(url: string): boolean;
3
49
  export declare function assertNormalSearchPageReadyForPreview(page: Page): Promise<Frame>;
4
50
  export declare function readNormalSearchSelectedJobLabel(frame: Frame): Promise<string>;
@@ -7,6 +53,102 @@ export declare function readNormalSearchSelectedJobLabel(frame: Frame): Promise<
7
53
  * 模糊匹配 keyword 后点击,等待 `.search-current-job` 变更。keyword 为空则返回当前岗位。
8
54
  */
9
55
  export declare function selectNormalSearchJob(frame: Frame, keyword: string): Promise<string>;
56
+ /**
57
+ * 把当前岗位切成「不限职位」——搜全池而不是被某个岗位的画像圈住。
58
+ *
59
+ * 它是岗位下拉的第一项,但**不带 `.job-name`**(那个 class 只给真实职位用),
60
+ * 所以 `selectNormalSearchJob` 的选择器扫不到它,得单独按 `li[ka="search_select_job"]` 找。
61
+ */
62
+ export declare function selectNormalSearchAnyJob(frame: Frame): Promise<string>;
63
+ /**
64
+ * 选搜索城市。控件是「输入即联想」,不是普通下拉:
65
+ * 点 `.city-wrap` 让输入框获焦 → 往 `.search-city-kw input` 里敲字 →
66
+ * 冒出 `.city-box .search-result-item` → 点中文本完全相同的那一项。
67
+ *
68
+ * **必须走真实键盘输入**(ElementHandle.type):页面是 Vue,直接改 `input.value`
69
+ * 不触发 input 事件,联想列表根本不会出来。
70
+ *
71
+ * 已经是目标城市就直接返回,不做任何点击——少一次无谓交互就少一分自动化特征。
72
+ */
73
+ export declare function selectNormalSearchCity(frame: Frame, city: string): Promise<string>;
74
+ /** 学历要求:`.degree-ui` 里的单选项,当前选中项带 `.active`(已选中就不重复点)。 */
75
+ export declare function selectNormalSearchDegree(frame: Frame, degree: string): Promise<string>;
76
+ /**
77
+ * 经验要求:`.exp-list-ui` 里的单选项
78
+ * (在校/应届 / 25年毕业 / 26年毕业 / 26年后毕业 / 1-3年 / 3-5年 / 5-10年)。
79
+ *
80
+ * 旁边还有个「自定义」滑块(`.experience-select-custom-slider`)没做——拖滑块的交互
81
+ * 和点选项完全是两回事,等真有人需要「6-8年」这种区间再说。
82
+ */
83
+ export declare function selectNormalSearchExp(frame: Frame, exp: string): Promise<string>;
84
+ /**
85
+ * 年龄要求:`.age-list-ui` 里的单选项(20-25 / 25-30 / 30-35 / 35-40 / 40-50 / 50以上)。
86
+ * 「自定义」那对下拉(`.age-custom`,默认 `display:none`)同样没做。
87
+ */
88
+ export declare function selectNormalSearchAge(frame: Frame, age: string): Promise<string>;
89
+ /**
90
+ * 经验要求(自定义区间):拖 `.experience-select-custom-slider` 的双手柄滑块。
91
+ * 一拖动,预设那排的「不限」就会自动取消,两者是互斥的。
92
+ */
93
+ export declare function selectNormalSearchExpRange(page: Page, frame: Frame, minToken: string, maxToken: string): Promise<string>;
94
+ /**
95
+ * 学历要求(自定义区间):拖 `.degree-select-custom-slider`,七档
96
+ * 初中及以下 → 博士。预设那排只有「本科及以上 / 硕士及以上 / 博士」,
97
+ * 想要「大专-本科」这种带上限的区间只能走这里。
98
+ */
99
+ export declare function selectNormalSearchDegreeRange(page: Page, frame: Frame, minToken: string, maxToken: string): Promise<string>;
100
+ /**
101
+ * 年龄要求(自定义区间):点「自定义」展开 `.age-custom`,里面是两个下拉(16岁…46岁+)。
102
+ * 和经验那个滑块不一样,这里是规规矩矩的下拉,选完读回 `span.ipt` 校验。
103
+ */
104
+ export declare function selectNormalSearchAgeRange(frame: Frame, minToken: string, maxToken: string): Promise<string>;
105
+ /**
106
+ * 院校要求:`.school-ui` 里的多选框(统招本科 / 双一流院校 / 211院校 / 985院校 /
107
+ * 留学生 / QS 100 / QS 500),以及单独一个「只看第一学历」(提示语写明=第一学历为全日制本科)。
108
+ *
109
+ * 逐个点,每点一个歇一下——一次性连点是很明显的机器行为。
110
+ */
111
+ export declare function selectNormalSearchSchools(frame: Frame, labels: string[]): Promise<string[]>;
112
+ /**
113
+ * 点「清空筛选」把筛选条件归零。
114
+ *
115
+ * 为什么每次搜索前都要清:条件存在**平台侧**、跨命令粘着。不清的话「这次怎么只有 3 个人」
116
+ * 永远得靠猜是不是上次设的条件还挂着——这跟「不传 --job 就切不限职位」是同一个理由。
117
+ *
118
+ * 实测 `.reset-btn` 清的是学历 / 院校 / 其他筛选;关键词、当前岗位、城市**不动**
119
+ * (那三项本来就由 `--job` / `--city` / 关键词各自显式管)。
120
+ *
121
+ * 已经全是默认态就跳过——少一次无谓点击就少一分自动化特征。
122
+ */
123
+ export declare function resetNormalSearchFilters(frame: Frame): Promise<boolean>;
124
+ /**
125
+ * 求职状态:`.mutil-select` 多选下拉(离职-随时到岗 / 在职-暂不考虑 / 在职-考虑机会 / 在职-月内到岗)。
126
+ *
127
+ * 只能先展开再点选项——菜单是展开时才挂上 DOM 的。而占位文案「求职状态」一旦选中第一项就被
128
+ * 替换掉,所以**先记住它在 `.filter-2-item` 里的下标**,后续都按下标操作,不再按文案找。
129
+ * (这里能靠下标是因为每次搜索前都清过筛选,展开时占位文案一定还在。)
130
+ */
131
+ export declare function selectNormalSearchStatus(frame: Frame, labels: string[]): Promise<string[]>;
132
+ /**
133
+ * 跳槽频率:`.work-year-select` 单选下拉(不限 / 5年少于3份 / 时间≥1年)。
134
+ *
135
+ * 锚点用 `input.ipt` 的 placeholder 而不是文案——「性别」和「牛人活跃度」共用
136
+ * `.gender-select` 这个 class,只有 placeholder 能把三个下拉分开。
137
+ */
138
+ export declare function selectNormalSearchJobHop(frame: Frame, label: string): Promise<string>;
139
+ /**
140
+ * 专业:点 `.major-input-ui` 弹出 `.major-dialog` 弹层(`v-transfer-dom`,挂在 body 上,
141
+ * 但仍在同一个 iframe 文档里),在搜索框里打专业名 → 点联想项 → 点「确定」。
142
+ *
143
+ * 和城市一样**只认完全匹配**:搜「计算机」会出几十条(计算机科学与技术 / 计算机应用工程 /
144
+ * 计算机速录……),替用户挑一条的代价是整轮白跑且他不知道。平台限选 10 个。
145
+ *
146
+ * ⚠️ **一个专业开一次弹层**。平台的搜索框选中一项之后就不再出联想了——本机实测:
147
+ * 选完「计算机科学与技术」再打「软件工程」,`.major-lists` 根本不渲染,失焦重聚焦、
148
+ * 多敲一个字再退格都救不回来。而「确定」关掉再重开,搜索框就恢复正常,
149
+ * 且已选的专业还在。所以多个专业只能一个一个来,这是平台行为不是效率取舍。
150
+ */
151
+ export declare function selectNormalSearchMajors(frame: Frame, labels: string[]): Promise<string[]>;
10
152
  export declare function openNormalSearchResumePreview(frame: Frame, target: string): Promise<boolean>;
11
153
  export type SearchPoolGreetOptions = {
12
154
  /** 1-based 序号,对应上一次 `boss search` 输出的编号(仅当次列表有效) */
@@ -24,5 +166,29 @@ export type SearchPoolGreetOptions = {
24
166
  */
25
167
  export declare function greetSearchPoolOnPage(page: Page, options: SearchPoolGreetOptions): Promise<string>;
26
168
  export declare function runSearchPoolGreet(options: SearchPoolGreetOptions): Promise<string>;
27
- export declare function runNormalSearch(keyword?: string, jobKeyword?: string): Promise<string>;
169
+ export type NormalSearchOptions = {
170
+ keyword?: string;
171
+ jobKeyword?: string;
172
+ /** 不传则读 `BOSS_SEARCH_CITY`;仍为空就完全不碰城市控件。 */
173
+ city?: string;
174
+ degree?: string;
175
+ /** 学历要求的自定义区间,如 `大专-本科`;与 `degree` 互斥 */
176
+ degreeRange?: string;
177
+ schools?: string[];
178
+ /** 经验要求,单选:在校/应届 / 25年毕业 / 1-3年 / 3-5年 / 5-10年 等 */
179
+ exp?: string;
180
+ /** 经验要求的自定义区间,如 `3-8`;与 `exp` 互斥 */
181
+ expRange?: string;
182
+ /** 年龄要求,单选:20-25 / 25-30 / 30-35 / 35-40 / 40-50 / 50以上 */
183
+ age?: string;
184
+ /** 年龄要求的自定义区间,如 `23-27`;与 `age` 互斥 */
185
+ ageRange?: string;
186
+ /** 求职状态,可多选:离职-随时到岗 / 在职-暂不考虑 / 在职-考虑机会 / 在职-月内到岗 */
187
+ status?: string[];
188
+ /** 跳槽频率,单选:5年少于3份 / 时间≥1年 */
189
+ jobHop?: string;
190
+ /** 专业,可多选,最多 10 个 */
191
+ majors?: string[];
192
+ };
193
+ export declare function runNormalSearch(opts?: NormalSearchOptions): Promise<string>;
28
194
  //# sourceMappingURL=normal-search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"normal-search.d.ts","sourceRoot":"","sources":["../../src/toolset/normal-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAkClD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWxD;AAqDD,wBAAsB,qCAAqC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAOtF;AA0DD,wBAAsB,gCAAgC,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD1F;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkClG;AA8ID,MAAM,MAAM,sBAAsB,GAAG;IACnC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CA+EjB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAKzF;AAED,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B5F"}
1
+ {"version":3,"file":"normal-search.d.ts","sourceRoot":"","sources":["../../src/toolset/normal-search.ts"],"names":[],"mappings":"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"}