RSSHub/lib/v2/linkedin/jobs.js

45 lines
2.0 KiB
JavaScript

const got = require('@/utils/got');
const { parseDate } = require('@/utils/parse-date');
const { parseJobSearch, KEYWORDS_QUERY_KEY, JOB_TYPES, JOB_TYPES_QUERY_KEY, EXP_LEVELS_QUERY_KEY, parseParamsToSearchParams, EXP_LEVELS, parseParamsToString } = require('./utils');
const BASE_URL = 'https://www.linkedin.com/';
const JOB_SEARCH_PATH = '/jobs-guest/jobs/api/seeMoreJobPostings/search';
module.exports = async (ctx) => {
const jobTypesParam = parseParamsToSearchParams(ctx.params.job_types, JOB_TYPES);
const expLevelsParam = parseParamsToSearchParams(ctx.params.exp_levels, EXP_LEVELS);
let url = new URL(JOB_SEARCH_PATH, BASE_URL);
url.searchParams.append(KEYWORDS_QUERY_KEY, ctx.params.keywords || '');
url.searchParams.append(JOB_TYPES_QUERY_KEY, jobTypesParam); // see JOB_TYPES in utils.js
url.searchParams.append(EXP_LEVELS_QUERY_KEY, expLevelsParam); // see EXPERIENCE_LEVELS in utils.js
url = url.toString();
// Parse job search page
const response = await got({
method: 'get',
url,
});
const jobs = parseJobSearch(response.data);
const jobTypes = parseParamsToString(ctx.params.job_types, JOB_TYPES);
const expLevels = parseParamsToString(ctx.params.exp_levels, EXP_LEVELS);
const feedTitle = 'LinkedIn Job Listing' + (jobTypes ? ` | Job Types: ${jobTypes}` : '') + (expLevels ? ` | Experience Levels: ${expLevels}` : '') + (ctx.params.keywords ? ` | Keywords: ${ctx.params.keywords}` : '');
ctx.state.data = {
title: feedTitle,
link: url,
description: 'This feed gets LinkedIn job posts',
item: jobs.map((job) => {
const title = `${job.company} is hiring ${job.title}`;
const description = `Title: ${job.title} | Company: ${job.company} | Location: ${job.location} `;
return {
title, // item title
description, // job description
pubDate: parseDate(job.pubDate), // data publish date
link: job.link, // job source link
};
}),
};
};