/**
* Chrome Cookie Extractor for LinkedIn
* Uses chrome-cookies-secure to extract cookies directly from Chrome's cookie store
*
* Requirements:
* - User must be logged into LinkedIn in Chrome
* - Chrome must be closed (or use a different profile)
* - On macOS, may require Keychain access permission
*/
import chrome from "chrome-cookies-secure";
export interface LinkedInCookies {
li_at: string;
csrfToken: string;
allCookies: Array<{
name: string;
value: string;
domain: string;
path: string;
}>;
}
/**
* Extract LinkedIn cookies from Chrome browser
* @returns LinkedIn authentication cookies if found
*/
export async function extractLinkedInCookiesFromChrome(): Promise<LinkedInCookies | null> {
return new Promise((resolve) => {
chrome.getCookies(
"https://www.linkedin.com/",
"puppeteer", // Format that gives us structured cookie objects
(err: Error | null, cookies: Array<{name: string; value: string; domain: string; path: string}> | null) => {
if (err) {
console.error("[Chrome Cookies] Error extracting cookies:", err.message);
resolve(null);
return;
}
if (!cookies || cookies.length === 0) {
console.log("[Chrome Cookies] No LinkedIn cookies found in Chrome");
resolve(null);
return;
}
// Find the essential cookies
let li_at = "";
let csrfToken = "";
for (const cookie of cookies) {
if (cookie.name === "li_at") {
li_at = cookie.value;
}
if (cookie.name === "JSESSIONID") {
// Keep ajax: prefix, just remove surrounding quotes
// e.g. "ajax:123456" -> ajax:123456
csrfToken = cookie.value.replace(/^"|"$/g, "");
}
}
if (!li_at) {
console.log("[Chrome Cookies] li_at cookie not found - user may not be logged in");
resolve(null);
return;
}
if (!csrfToken) {
console.log("[Chrome Cookies] JSESSIONID cookie not found");
resolve(null);
return;
}
console.log("[Chrome Cookies] Successfully extracted LinkedIn cookies from Chrome");
resolve({
li_at,
csrfToken,
allCookies: cookies.map(c => ({
name: c.name,
value: c.value,
domain: c.domain || ".linkedin.com",
path: c.path || "/",
})),
});
},
"" // Default Chrome profile
);
});
}