linkedin checks bypass 🔥
This commit is contained in:
45
index.js
45
index.js
@@ -7,12 +7,8 @@ module.exports.query = (queryObject) => {
|
|||||||
return query.getJobs();
|
return query.getJobs();
|
||||||
};
|
};
|
||||||
|
|
||||||
//transfers object values passed to our .query to an obj we can access
|
|
||||||
function Query(queryObj) {
|
function Query(queryObj) {
|
||||||
//query vars
|
|
||||||
this.host = queryObj.host || "www.linkedin.com";
|
this.host = queryObj.host || "www.linkedin.com";
|
||||||
|
|
||||||
//api handles strings with spaces by replacing the values with %20
|
|
||||||
this.keyword = queryObj.keyword?.trim().replace(" ", "+") || "";
|
this.keyword = queryObj.keyword?.trim().replace(" ", "+") || "";
|
||||||
this.location = queryObj.location?.trim().replace(" ", "+") || "";
|
this.location = queryObj.location?.trim().replace(" ", "+") || "";
|
||||||
this.dateSincePosted = queryObj.dateSincePosted || "";
|
this.dateSincePosted = queryObj.dateSincePosted || "";
|
||||||
@@ -21,17 +17,9 @@ function Query(queryObj) {
|
|||||||
this.salary = queryObj.salary || "";
|
this.salary = queryObj.salary || "";
|
||||||
this.experienceLevel = queryObj.experienceLevel || "";
|
this.experienceLevel = queryObj.experienceLevel || "";
|
||||||
this.sortBy = queryObj.sortBy || "";
|
this.sortBy = queryObj.sortBy || "";
|
||||||
//internal variable
|
|
||||||
this.limit = Number(queryObj.limit) || 0;
|
this.limit = Number(queryObj.limit) || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Following get Functions act as object literals so the query can be constructed with the correct parameters
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
Query.prototype.getDateSincePosted = function () {
|
Query.prototype.getDateSincePosted = function () {
|
||||||
const dateRange = {
|
const dateRange = {
|
||||||
"past month": "r2592000",
|
"past month": "r2592000",
|
||||||
@@ -85,16 +73,6 @@ Query.prototype.getSalary = function () {
|
|||||||
return salaryRange[this.salary.toLowerCase()] ?? "";
|
return salaryRange[this.salary.toLowerCase()] ?? "";
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* EXAMPLE OF A SAMPLE QUERY
|
|
||||||
* https://www.linkedin.com/jobs/search/?f_E=2%2C3&f_JT=F%2CP&f_SB2=1&f_TPR=r2592000&f_WT=2%2C1&geoId=90000049&keywords=programmer&location=Los%20Angeles%20Metropolitan%20Area
|
|
||||||
* Date Posted (Single Pick) f_TPR
|
|
||||||
* Job Type (Multiple Picks) f_JT
|
|
||||||
* Experience Level(Multiple Picks) f_E
|
|
||||||
* On-Site/Remote (Multiple Picks) f_WT
|
|
||||||
* Salary (Single Pick) f_SB2
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
Query.prototype.url = function (start) {
|
Query.prototype.url = function (start) {
|
||||||
let query = `https://${this.host}/jobs-guest/jobs/api/seeMoreJobPostings/search?`;
|
let query = `https://${this.host}/jobs-guest/jobs/api/seeMoreJobPostings/search?`;
|
||||||
if (this.keyword !== "") query += `keywords=${this.keyword}`;
|
if (this.keyword !== "") query += `keywords=${this.keyword}`;
|
||||||
@@ -124,37 +102,40 @@ Query.prototype.getJobs = async function () {
|
|||||||
allJobs = [];
|
allJobs = [];
|
||||||
|
|
||||||
while (resultCount > 0) {
|
while (resultCount > 0) {
|
||||||
//fetch our data using our url generator with
|
const { data } = await axios.get(this.url(start), {
|
||||||
//the page to start on
|
headers: {
|
||||||
const { data } = await axios.get(this.url(start));
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
|
||||||
|
Accept:
|
||||||
|
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
|
||||||
|
"Accept-Language": "en-US,en;q=0.9",
|
||||||
|
"Accept-Encoding": "gzip, deflate, br",
|
||||||
|
Connection: "keep-alive",
|
||||||
|
"Upgrade-Insecure-Requests": "1",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
//select data so we can check the number of jobs returned
|
|
||||||
const $ = cheerio.load(data);
|
const $ = cheerio.load(data);
|
||||||
const jobs = $("li");
|
const jobs = $("li");
|
||||||
//if result count ends up being 0 we will stop getting more jobs
|
|
||||||
resultCount = jobs.length;
|
resultCount = jobs.length;
|
||||||
console.log("I got ", jobs.length, " jobs");
|
console.log("I got ", jobs.length, " jobs");
|
||||||
|
|
||||||
//to get the job data as objects with the desired details
|
|
||||||
parsedJobs = parseJobList(data);
|
parsedJobs = parseJobList(data);
|
||||||
allJobs.push(...parsedJobs);
|
allJobs.push(...parsedJobs);
|
||||||
|
|
||||||
//increment by 25 bc thats how many jobs the AJAX request fetches at a time
|
|
||||||
start += 25;
|
start += 25;
|
||||||
|
|
||||||
//in order to limit how many jobs are returned
|
|
||||||
//this if statment will return our function value after looping and removing excess jobs
|
|
||||||
if (jobLimit != 0 && allJobs.length > jobLimit) {
|
if (jobLimit != 0 && allJobs.length > jobLimit) {
|
||||||
while (allJobs.length != jobLimit) allJobs.pop();
|
while (allJobs.length != jobLimit) allJobs.pop();
|
||||||
return allJobs;
|
return allJobs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//console.log(allJobs)
|
|
||||||
return allJobs;
|
return allJobs;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function parseJobList(jobData) {
|
function parseJobList(jobData) {
|
||||||
const $ = cheerio.load(jobData);
|
const $ = cheerio.load(jobData);
|
||||||
const jobs = $("li");
|
const jobs = $("li");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "linkedin-jobs-api",
|
"name": "linkedin-jobs-api",
|
||||||
"version": "1.0.3",
|
"version": "1.0.4",
|
||||||
"description": "advanced node.js package for getting job listings from LinkedIn",
|
"description": "advanced node.js package for getting job listings from LinkedIn",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
Reference in New Issue
Block a user