diff --git a/classes/API.js b/classes/API.js index f17eca8..e0d8ed1 100644 --- a/classes/API.js +++ b/classes/API.js @@ -9,7 +9,8 @@ import { LoadingBar } from './misc.js'; const cookieJar = new CookieJar(); const axios = wrapper(axiosModule.create({ jar: cookieJar, // attach cookie jar - withCredentials: true + withCredentials: true, + // maxRedirects: Infinity })); @@ -123,9 +124,13 @@ class APIHelper { getCookies(username, password) { return new Promise(async (resolve, reject) => { - const spawn = (await import("child_process")).spawn; - const pythonProcess = spawn('python', ["auth.py", username, password]); + const pythonProcess = (await import("child_process")).exec(`python ${import.meta.dirname}/auth.py ${username} ${password}`); + pythonProcess.stdout.on('data', (data) => resolve(data.toString())); + pythonProcess.stderr.on('data', (data) => reject(data.toString())); + pythonProcess.on('error', reject); + + pythonProcess.on('exit', (code) => console.log('done!', code)); }); } @@ -146,7 +151,7 @@ class APIHelper { JSESSIONID: scookie.get('JSESSIONID') }; - console.log(payload); + // console.log(payload); // this.authheaders['cookies'] = res.headers['set-cookie']; @@ -361,7 +366,7 @@ export default class linkedInAPIClass { */ async _makeReq(reqPath, isProfile = false, ignoreTimeoutErr = false) { await this.evade(); - const res = await axios.get(`https://www.linkedin.com/voyager/api/graphql?${reqPath}&queryId=${(!isProfile) ? "voyagerSearchDashClusters.f0c4f21d8a526c4a5dd0ae253c9b6e02" : "voyagerIdentityDashProfiles.5a6722404e6afd08958f5105e51cad51"}`, { headers: this.headers }).catch((err) => { + const res = await axios.get(`https://www.linkedin.com/voyager/api/graphql?${reqPath}&queryId=${(!isProfile) ? "voyagerSearchDashClusters.37920f17209f22c510dd410658abc540" : "voyagerIdentityDashProfiles.5a6722404e6afd08958f5105e51cad51"}`, { headers: this.headers }).catch((err) => { if (err?.code === 'ECONNRESET' && ignoreTimeoutErr) return null; console.error(err); return null; @@ -387,23 +392,37 @@ export default class linkedInAPIClass { if (this.logAll) console.log("LOGGED IN!"); this.headers = { - 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0', + 'Host': 'www.linkedin.com', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:128.0) Gecko/20100101 Firefox/128.0', 'Accept': 'application/vnd.linkedin.normalized+json+2.1', 'Accept-Language': 'en-US,en;q=0.5', - 'Accept-Encoding': 'gzip, deflate, br', - 'x-li-lang': 'en_US', - 'x-li-track': '{"clientVersion":"1.13.14725","mpVersion":"1.13.14725","osName":"web","timezoneOffset":-7,"timezone":"America/Los_Angeles","deviceFormFactor":"DESKTOP","mpName":"voyager-web","displayDensity":1,"displayWidth":1920,"displayHeight":1080}', - 'x-li-page-instance': 'urn:li:page:d_flagship3_search_srp_jobs;TvndZ7TATTy2i/ZUyyD3Zg==', - 'csrf-token': 'ajax:2538600735149500238', - 'x-restli-protocol-version': '2.0.0', - 'x-li-pem-metadata': 'Voyager - Organization - LCP_Member=interest-pipeline', + 'Accept-Encoding': 'gzip, deflate, br, zstd', + 'DNT': '1', + 'Sec-GPC': '1', 'Connection': 'keep-alive', - 'Referer': 'https://www.linkedin.com/jobs/search/?currentJobId=3840672849&distance=25.0&geoId=103644278&keywords=temp&origin=HISTORY', + 'Referer': 'https://www.linkedin.com/search/results/companies/?keywords=microsoft&origin=GLOBAL_SEARCH_HEADER&sid=5mA', 'Cookie': cookie, 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', - 'TE': 'trailers' + 'TE': 'trailers', + 'x-li-lang': 'en_US', + 'x-li-track': JSON.stringify({ + clientVersion: '1.13.21804', + mpVersion: '1.13.21804', + osName: 'web', + timezoneOffset: 0, + timezone: 'Atlantic/Reykjavik', + deviceFormFactor: 'DESKTOP', + mpName: 'voyager-web', + displayDensity: 2, + displayWidth: 4096, + displayHeight: 2160 + }), + 'x-li-page-instance': 'urn:li:page:d_flagship3_search_srp_companies;bfbz9Kn/TamNtptZQMG4Mg==', + 'csrf-token': 'ajax:1264483706853073695', + 'x-restli-protocol-version': '2.0.0', + 'x-li-pem-metadata': 'Voyager - Companies SRP=search-results' }; } diff --git a/classes/auth.py b/classes/auth.py new file mode 100644 index 0000000..7a4b859 --- /dev/null +++ b/classes/auth.py @@ -0,0 +1,66 @@ +import requests +import sys + +# Why is this in a python file? Because the nodejs always returns HTTP 500 + + +[_, username, password] = sys.argv + +print(username, password) + +AUTHHEADERS = { + "X-Li-User-Agent": "LIAuthLibrary:0.0.3 com.linkedin.android:4.1.881 Asus_ASUS_Z01QD:android_9", + "User-Agent": "ANDROID OS", + "X-User-Language": "en", + "X-User-Locale": "en_US", + "Accept-Language": "en-us", + } + + +res = requests.get( +f"https://www.linkedin.com/uas/authenticate", +headers=AUTHHEADERS, +) + +scookies = res.cookies + +payload = { + "session_key": username, + "session_password": password, + "JSESSIONID": scookies["JSESSIONID"], + } + +# self.session.cookies = cookies +# self.session.headers["csrf-token"] = self.session.cookies["JSESSIONID"].strip( +# '"' +# ) + + + +# attempt to bypass the CAPTCHA +url = "https://www.linkedin.com/checkpoint/lg/login-challenge-submit?lastCv=AgFZ5ZeTx7tCrAAAAY7uQimE1X7IgBH77ZD3WENAX3Ag4x8TZtzjINmKy-o&_d=d&session_redirect=&vcd=AgGInyRZWZpvSgAAAY7uQky1qELAo1A9Q8uIrW_pobeD_O5eVFEGfVnkAhm7OjlNF--l_YYPbixT5yvxKnv23lrmx5LW8A&pageInstance=urn%3Ali%3Apage%3Ad_checkpoint_ch_captchaV2Challenge%3BfR3yNrJFTJ2Pk03CUmRNLw%3D%3D&controlId=d_checkpoint_ch_captchaV2Challenge-Submit&ut=35EW7sTFMrLrc1" +headers = { + "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Accept-Encoding": "gzip, deflate, br", + "Referer": "https://www.linkedin.com/checkpoint/challenge/AgGQ7wuRAH6jgwAAAY7uQimQEUhVjSHHvLpOiDFbjiliykkUTdy5O46FV6DCsi1TQ2V6TYPULzc9AG1ymUdFF7-zFbyAvw?ut=3yYrWkE6YrLrc1", + "DNT": "1", + "Sec-GPC": "1", + "Connection": "keep-alive", + "Cookie": "JSESSIONID=ajax:2538600735149500238; lang=v=2&lang=en-us; bcookie=\"v=2&ece64a43-fa8f-495d-8f16-942fbfda8432\"; bscookie=\"v=1&202404172251303c0c01ab-29c3-4cfb-8b72-dc6cca67d34dAQFoy9tgTQeA3gYImSFnGmrE-D7LUGdX\"; li_gp=MTsxNzEzMzk0MjkwOzA=; lidc=\"b=OGST04:s=O:r=O:a=O:p=O:g=3159:u=1:x=1:i=1713394290:t=1713480690:v=2:sig=AQGXW3NObtywt8GkIy518CDbVOTkgKAa\"; chp_token=AgGGFUgiWZoEVgAAAY7uQimBzBMFY8ddHZL5K3xcMFMp8q67sR_BKdcnnAS5t9I8QTUhrOZeVLVKm9lrvDziWlt3UQH7tALyInZIQA", + "Upgrade-Insecure-Requests": "1" +} + +# Send the request +response = requests.get(url, headers=headers) + +res = requests.post( + f"https://www.linkedin.com/uas/authenticate", + data=payload, + cookies=scookies, + headers=AUTHHEADERS, +) + +print(res.json()) +sys.stdout.flush() \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 382e06d..a6b0a1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "linkedin-api-js", - "version": "1.0.0-11", + "version": "1.0.0-23", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkedin-api-js", - "version": "1.0.0-11", - "license": "ISC", + "version": "1.0.0-22", + "license": "MIT", "dependencies": { "axios": "^1.6.8", "axios-cookiejar-support": "^5.0.1", @@ -33,9 +33,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -43,11 +43,11 @@ } }, "node_modules/axios-cookiejar-support": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-5.0.1.tgz", - "integrity": "sha512-lwjyusKDJ1dLMRPnARWJCdcRXqmYvNITHnCQHRJGtIIL2QXj/lYPjMg04XZDp8QItzluu0KJqbjYlvI0+5X5Xw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-5.0.2.tgz", + "integrity": "sha512-4KwFqiH62Ry/J+ue1NwqLvBSaK3Bp/Owc9jTe7BS9c22uN8/4MB5pY7HV9QwQjV3ZRonCoSj5V8Pjx911qQqAw==", "dependencies": { - "http-cookie-agent": "^6.0.3" + "http-cookie-agent": "^6.0.5" }, "engines": { "node": ">=18.0.0" @@ -66,20 +66,24 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18.17" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -139,9 +143,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -213,6 +217,18 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -257,9 +273,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -270,14 +286,14 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/http-cookie-agent": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/http-cookie-agent/-/http-cookie-agent-6.0.3.tgz", - "integrity": "sha512-6JdymEgWgsg9VQ5VN9FGpRRcivyu4WdM0Ud3kW+Q0PB7knt0EFtlhNPU8wCuscXLfIEI5y6jEMdFTBODNsJR6g==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/http-cookie-agent/-/http-cookie-agent-6.0.5.tgz", + "integrity": "sha512-sfZ8fDgDP3B1YB+teqSnAK1aPgBu8reUUGxSsndP2XnYN6cM29EURXWXZqQQiaRdor3B4QjpkUNfv21syaO4DA==", "dependencies": { "agent-base": "^7.1.1" }, @@ -288,19 +304,26 @@ "url": "https://github.com/sponsors/3846masa" }, "peerDependencies": { - "deasync": "^0.1.26", "tough-cookie": "^4.0.0", "undici": "^5.11.0 || ^6.0.0" }, "peerDependenciesMeta": { - "deasync": { - "optional": true - }, "undici": { "optional": true } } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -359,6 +382,17 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -392,10 +426,15 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -406,7 +445,15 @@ "node": ">=6" } }, - "node_modules/tough-cookie/node_modules/universalify": { + "node_modules/undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", @@ -422,6 +469,25 @@ "querystringify": "^2.1.1", "requires-port": "^1.0.0" } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } } } }