Coder Social home page Coder Social logo

joshuatz / linkedin-to-jsonresume Goto Github PK

View Code? Open in Web Editor NEW
216.0 14.0 53.0 8.53 MB

Browser extension to turn a LinkedIn profile page into a JSON Resume export.

Home Page: https://joshuatz.com/projects/web-stuff/linkedin-profile-to-json-resume-exporter/

License: MIT License

JavaScript 87.92% HTML 1.91% CSS 1.81% TypeScript 8.35%
linkedin jsonresume bookmarklet schema

linkedin-to-jsonresume's Introduction

LinkedIn Profile to JSON Resume Browser Tool GitHub tag (latest SemVer)

An extremely easy-to-use browser extension for exporting your full LinkedIn Profile to a JSON Resume file or string.

Chrome Extension 📦 - Webstore Link

My LinkedIn Profile 👨‍💼 - linkedin.com/in/joshuatzucker/

Demo GIF

What is JSON Resume?

"JSON Resume" is an open-source standard / schema, currently gaining in adoption, that standardizes the content of a resume into a shared underlying structure that others can use in automated resume formatters, parsers, etc. Read more about it here, or on GitHub.

What is this tool?

I made this because I wanted a way to quickly generate a JSON Resume export from my LinkedIn profile, and got frustrated with how locked down the LinkedIn APIs are and how slow it is to request your data export (up to 72 hours). "Install" the tool to your browser, then click to run it while looking at a LinkedIn profile (preferably your own), and my code will grab the various pieces of information off the page and then show a popup with the full JSON resume export that you can copy and paste to wherever you would like.

A Note About Feature Requests and Bug Reports

I want to make something clear: the only goal of this extension is to be able to export a JSON Resume version of your LinkedIn profile; nothing more, nothing less.

If the tool is malfunctioning or could do a better job of exporting JSON Resume, by all means please open an issue - I always appreciate it!

However, I have gotten several feature requests (as both issues and emails) asking me to extend the tool to do things that are far outside this goal. While I appreciate the interest, ultimately I am not interested in having this project grow outside the original scope - you will usually see me close this issues as wontfix and will reply to emails the same way. I have limited time, and this project was originally something I whipped up in a few days for personal use - it has already gotten way out of scope 😅


Breaking Change - v1.0 Schema Update

The 10/31/2021 release of this extension (v3.0.0) changes the default shape of the JSON exported by this tool, to adhere to the newer v1 schema offered by JSON Resume:

Previously
  • Stable: v0.0.16
  • Latest: v0.1.3
  • Beta: v0.1.3 + certificates
Version 3.0.0
  • Legacy: v0.0.16
  • Stable: v1.0.0
  • Beta: Even with v1.0.0 (for now)

Usage / Installation Options:

There are (or were) a few different options for how to use this:

  • Fast and simple: Chrome Extension - Get it here
    • Feel free to install, use, and then immediately uninstall if you just need a single export
    • No data is collected
  • [Deprecated] (at least for now): Bookmarklet
    • This was originally how this tool worked, but had to be retired as a valid method when LinkedIn added a stricter CSP that prevented it from working
    • Code to generate the bookmarklet is still in this repo if LI ever loosens the CSP

Schema Versions

This tool supports multiple version of the JSON Resume Schema specification for export, which you can easily swap between in the dropdown selector! ✨

"Which schema version should I use?"

If you are unsure, you should probably just stick with "stable", which is the default. It should have the most widespread support across the largest number of platforms.

Support for Multilingual Profiles

LinkedIn has a unique feature that allows you to create different versions of your profile for different languages, rather than relying on limited translation of certain fields.

For example, if you are bilingual in both English and German, you could create one version of your profile for each language, and then viewers would automatically see the correct one depending on where they live and their language settings.

I've implemented support (starting with v1.0.0) for multilingual profile export through a dropdown selector:

Export Language Selector

The dropdown should automatically get populated with the languages that the profile you are currently viewing supports, in addition to your own preferred viewing language in the #1 spot. You should be able to switch between languages in the dropdown and click the export button to get a JSON Resume export with your selected language.

Note: LinkedIn offers language choices through a Locale string, which is a combination of country (ISO-3166) and language (ISO-639). I do not make decisions as to what languages are supported.

This feature is the part of this extension most likely to break in the future; LI has some serious quirks around multilingual profiles - see my notes for details.

Export Options

There are several main buttons in the browser extension, with different effects. You can hover over each button to see the alt text describing what they do, or read below:

  • LinkedIn Profile to JSON: Converts the profile to the JSON Resume format, and then displays it in a popup modal for easy copying and pasting
  • Download JSON Resume Export: Same as above, but prompts you to download the result as an actual .json file.
  • Download vCard File: Export and download the profile as a Virtual Contact File (.vcf) (aka vCard)
    • There are some caveats with this format; see below

vCard Limitations and Caveats

  • Partial birthdate (aka BDAY) values (e.g. where the profile has a month and day, but has not opted to share their birth year), are only supported in v4 (RFC-6350) and above. This extension currently only supports v3, so in these situations the tool will simply omit the BDAY field from the export
    • See #32 for details
  • The LinkedIn display photo (included in vCard) served by LI is a temporary URL, with a fixed expiration date set by LinkedIn. From observations, this is often set months into the future, but could still be problematic for address book clients that don't cache images. To work around this, I'm converting it to a base64 string; this should work with most vCard clients, but also increases the vCard file size considerably.

Chrome Side-loading Instructions

Instead of installing from the Chrome Webstore, you might might want to "side-load" a ZIP build for either local development, or to try out a new release that has not yet made it through the Chrome review process. Here are the instructions for doing so:

  1. Find the ZIP you want to load
    • If you want to side-load the latest version, you can download a ZIP from the releases tab
    • If you want to side-load a local build, use npm run package-browserext to create a ZIP
  2. Go to Chrome's extension setting page (chrome://extensions)
  3. Turn on developer mode (upper right toggle switch)
  4. Drag the downloaded zip to the browser to let it install
  5. Test it out, then uninstall

You can also unpack the ZIP and load it as "unpacked".

Troubleshooting

When in doubt, refresh the profile page before using this tool.

Troubleshooting - Debug Log

If I'm trying to assist you in solving an issue with this tool, I might have you share some debug info. Currently, the easiest way to do this is to use the Chrome developer's console:

  1. Append ?li2jr_debug=true to the end of the URL of the profile you are on
  2. Open Chrome dev tools, and specifically, the console (instructions)
  3. Run the extension (try to export the profile), and then look for red messages that show up in the console (these are errors, as opposed to warnings or info logs).
    • You can filter to just error messages, in the filter dropdown above the console.

Updates:

Update History (Click to Show / Hide)
Date Release Notes
4/9/2022 3.2.3 Fix: Incomplete work listings extraction (see #68)
12/24/2021 3.2.2 Fix: Broken endpoints (see #63)
11/14/2021 3.2.1 Fix: Some profiles missing full language proficiency extraction (see #59)
Fix: Missing Education (regression) (see #60)
11/7/2021 3.2.0 Improve/Fix: Include location in work positions (see #58)
11/7/2021 3.1.0 Fix: Incorrect sorting of volunteer positions (see #55)
Fix: Missing Certificates (see #59)
Improve/Fix: Extract Language proficiencies / languages (see #59)
Improve: Cleanup, README update
10/31/2021 3.0.0 Breaking Update: This extension has now been updated to output JSON matching the v1 schema specification released by JSON Resume (see #53 and #56). If you still need the v0.0.16 schema output, it is no longer the default, but is still available for now under the "legacy" schema option. Thanks @ anthonyjdella for the PR and code contributions!

Fix: Also rolled into this release is a fix for truncated volunteer experiences (see #55). Thanks @ fkrauthan for the heads up!
2/27/2021 2.1.2 Fix: Multiple issues around work history / experience; missing titles, ordering, etc. Overhauled approach to extracting work entries.
12/19/2020 2.1.1 Fix: Ordering of work history with new API endpoint (#38)
12/7/2020 2.1.0 Fix: Issue with multilingual profile, when exporting your own profile with a different locale than your profile's default. (#37)
11/12/2020 2.0.0 Support for multiple schema versions ✨ (#34)
11/8/2020 1.5.1 Fix: Omit partial BDAY export in vCard (#32)
10/22/2020 1.5.0 Fix: Incorrect birthday month in exported vCards (off by one)
Fix: Better pattern for extracting profile ID from URL, fixes extracting from virtual sub-pages of profile (e.g. /detail/contact-info), or with query or hash strings at the end.
7/7/2020 1.4.2 Fix: For work positions, if fetched via profilePositionGroups, LI ordering (the way it looks on your profile) was not being preserved.
7/31/2020 1.4.1 Fix: In some cases, wrong profileUrnId was extracted from current profile, which led to work history API call being ran against a different profile (e.g. from "recommended section", or something like that).
7/21/2020 1.4.0 Fix: For vCard exports, Previous profile was getting grabbed after SPA navigation between profiles.
7/6/2020 1.3.0 Fix: Incomplete work position entries for some users; LI was limiting the amount of pre-fetched data. Had to implement request paging to fix.

Also refactored a lot of code, improved result caching, and other tweaks.
6/18/2020 1.2.0 Fix / Improve VCard export feature.
6/5/2020 1.1.0 New feature: vCard export, which you can import into Outlook / Google Contacts / etc.
5/31/2020 1.0.0 Brought output up to par with "spec", integrated schemas as TS, added support for multilingual profiles, overhauled JSDoc types.

Definitely a breaking change, since the output has changed to mirror schema more closely (biggest change is website in several spots has become url)
5/9/2020 0.0.9 Fixed "references", added certificates (behind setting), and formatting tweaks
4/4/2020 0.0.8 Added version string display to popup
4/4/2020 0.0.7 Fixed and improved contact info collection (phone, Twitter, and email). Miscellaneous other tweaks.
10/22/2019 0.0.6 Updated recommendation querySelector after LI changed DOM. Thanks again, @ lucbpz.
10/19/2019 0.0.5 Updated LI date parser to produce date string compliant with JSONResume Schema (padded). Thanks @ lucbpz.
9/12/2019 0.0.4 Updated Chrome webstore stuff to avoid LI IP usage (Google took down extension page due to complaint). Updated actual scraper code to grab full list of skills vs just highlighted.
8/3/2019 NA Rewrote this tool as a browser extension instead of a bookmarklet to get around the CSP issue. Seems to work great!
7/22/2019 NA ALERT: This bookmarklet is currently broken, thanks to LinkedIn adding a new restrictive CSP (Content Security Policy) header to the site. I've opened an issue to discuss this, and both short-term (requires using the console) and long-term (browser extension) solutions.
6/21/2019 0.0.3 I saw the bookmarklet was broken depending on how you came to the profile page, so I refactored a bunch of code and found a much better way to pull the data. Should be much more reliable!

Development

With the rewrite to a browser extension, I actually configured the build scripts to be able to still create a bookmarklet from the same codebase, in case the bookmarklet ever becomes a viable option again.

Building the browser extension

npm run build-browserext will transpile and copy all the right files to ./build-browserext, which you can then side-load into your browser. If you want to produce a single ZIP archive for the extension, npm run package-browserext will do that.

Use build-browserext-debug for a source-map debug version. To get more console output, append li2jr_debug=true to the query string of the LI profile you are using the tool with.

Building the bookmarklet version

Currently, the build process looks like this:

  • src/main.js -> (webpack + babel) -> build/main.js -> mrcoles/bookmarklet -> build/bookmarklet_export.js -> build/install-page.html
    • The bookmark can then be dragged to your bookmarks from the final build/install-page.html

All of the above should happen automatically when you do npm run build-bookmarklet.

If this ever garners enough interest and needs to be updated, I will probably want to re-write it with TypeScript to make it more maintainable.

LinkedIn Documentation

For understanding some peculiarities of the LI API, see LinkedIn-Dev-Notes-README.md.

Debugging

Debugging the extension is a little cumbersome, because of the way Chrome sandboxes extension scripts and how code has to be injected. An alternative to setting breakpoints in the extension code itself, is to copy the output of /build/main.js and run it via the console.

li2jr = new LinkedinToResumeJson(true, true);
li2jr.parseAndShowOutput();

Even if you have the repo inside of a local static server, you can't inject it via a script tag or fetch & eval, due to LI's restrictive CSP.

If you do want to find the actual injected code of the extension in Chrome dev tools, you should be able to find it under Sources -> Content Scripts -> top -> JSON Resume Exporter -> {main.js}

Debugging Snippets

Helpful snippets (subject to change; these rely heavily on internals):

// Get main profileDB (after running extension)
var profileRes = await liToJrInstance.getParsedProfile(true);
var profileDb = await liToJrInstance.internals.buildDbFromLiSchema(profileRes.liResponse);

DISCLAIMER:

This tool is not affiliated with LinkedIn in any manner. Intended use is to export your own profile data, and you, as the user, are responsible for using it within the terms and services set out by LinkedIn. I am not responsible for any misuse, or repercussions of said misuse.

Attribution:

Icon for browser extension:

linkedin-to-jsonresume's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

linkedin-to-jsonresume's Issues

Not all references included

Hi,

thank you for your awesome work.
Unfortunatly not all references are included into JSON. I only see two instead of all 6 or 8.

image

Thank you for double checking.

Time-sensitive: Chrome deprecating manifest version v2 (by June 2024)

January 2023 - Staring in Chrome 112, Chrome may run experiments to turn off support for Manifest V2 extensions in Canary, Dev, and Beta channels.

https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/
https://developer.chrome.com/blog/mv2-transition/

UPDATE: They delayed it. Possibly June 2023?

2nd UPDATE: We finally have a deadline - June 2024. I received an email about this and they have published an announcement here:

We will begin disabling Manifest V2 extensions in pre-stable versions of Chrome (Dev, Canary, and Beta) as early as June 2024, in Chrome 127 and later. Users impacted by the rollout will see Manifest V2 extensions automatically disabled in their browser and will no longer be able to install Manifest V2 extensions from the Chrome Web Store. Also in June 2024, Manifest V2 extensions will lose their Featured badge in the Chrome Web Store if they currently have one.

"interests": [] are empty

Thank you for your great work. I hope it is fine for you, when I open some issues I came across while testing. Thanks for review.

The "interests": [], is always empty, even so the profile has interest.

Non-primary languages

Hi,
It would be really nice to add support for non-primary language profiles.
E.g., my primary language of a LinkedIn profile is Russian, but it has an English version too (obtained with a cgi ?locale=en_US).
BTW, the official PDF exporting fails here too and always exports a (primary) Russian version, even I switch to an English page.

Languages return one more entry then Linkedin UI shows

Describe the issue
When looking on Linkedin I have two languages in the Languages section (German and English). But when downloading the JSON profile I get 3 languages (English is duplicated. I assume it has something todo with manual provided languages vs my profile language as one English was auto added as Native Speaker)

Help me reproduce your issue
Add one language (the same as your profile one with different level) and add an additional language. After that export the JSON.

Additional context
This is not very important for me personally just thought I report it.

Profile photo not saved

Hi, how about this bug?

Profile photo not saved: I scra profile https://www.linkedin.com/in/diana-ponomareva/ and report this JSON:

{
"$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json",
"basics": {
"name": "Diana Ponomareva",
"label": "Руководитель рекрутингового агентства IT.и Пишите мне в телегу @diana_com только IT специалисты Темы публикаций: #crypto, #blockchain и #recruiting",
"image": "",
"email": "[email protected]",
"phone": "+35795148563",
"url": "",
"summary": "Phone : +357 95 148563\nE-mail: [email protected]\nSkype: diana ponomareva\nTelegram @diana_com",
"location": {
"countryCode": "RU",
"address": ""
},
"profiles": [
{
"network": "LinkedIn",
"username": "diana-ponomareva",
"url": "https://www.linkedin.com/in/diana-ponomareva/"
},
{
"network": "Twitter",
"username": "Diana_Redcode",
"url": "https://twitter.com/Diana_Redcode"
}
]
},
"work": [
{
"name": "RedCode",
"position": "Senior IT Recruiter",
"startDate": "2014-06-30",
"endDate": "",
"highlights": [],
"summary": "Я знаю всех ваших будущих сотрудников. Хантинг. Точечный поиск. Выстраивание работы команды рекрутеров. Формирование команды поиска и обучение it рекрутеров с нуля. \nПолный цикл подбора и других обязанностей:\n\n- Снятие заявки/ТЗ\n- Составление текста вакансии\n- Сорсинг на всех возможных площадках\n- Скрининг резюме\n- Первичные собеседования\n- Общение в чатах с заказчиками\n- Общение с кандидатам\n- Сопровождение кандидатов на этапе испытательного срока\n- Корректировка поиска кандидатов после технических собеседований\n- Team lead команды\n- Наставничество новых сотрудников\n- Составление регламентов\n- Анализ рынка заработных плат по вакансии\n\nСписок вакансий которые были в работе:\n- Системный аналитик\n- Devops engineer\n- Руководитель группы разработчиков Java\n- Solidity developer\n- Senior C# developer\n- PHP разработчик\n- Архитектор DWH\n- Product Owner\n- Senior Ruby Developer\n- Аналитик DWH (Senior)\n- Senior Software Engineer\n- Full Stack Developer\n- Game designer\n- Senior Developer (Unity 3D)\n- Unity 3D developer\n- Java (ETL) разработчик\n- Senior Frontend engineer\n- Senior Software Engineer, C++\n\n\nОткрыта к предложениям на позицию руководителя отдела подбора. Рассматриваю вакансии с релокацией. \n\n\nIT-рекрутер",
"url": "https://www.linkedin.com/company/redcod/",
"location": "Москва, Россия"
},
{
"name": "RedCode",
"position": " Chief Executive Officer",
"startDate": "2018-06-30",
"endDate": "",
"highlights": [],
"summary": "Управляю и развиваю рекрутинговое агентство специализирующееся на поиске it специалистов. Разработка и сопровождение всех цифровых продуктов.",
"url": "https://www.linkedin.com/company/redcod/",
"location": "Москва, Россия"
},
{
"name": "Recruitment Freelancer",
"position": "IT Recruter",
"startDate": "2010-12-31",
"endDate": "2014-12-31",
"highlights": [],
"summary": "Закрытие различных вакансий в сфере IT\nРазработка, тестирование, администрирование , сетевая инженерия, сопровождение, техподдержка, 1С",
"url": "https://www.linkedin.com/company/rustic-candles-events/",
"location": "Москва, Россия"
}
],
"volunteer": [],
"education": [],
"awards": [],
"certificates": [],
"publications": [],
"skills": [
{
"name": "Высшее руководство",
"level": "",
"keywords": []
},
{
"name": "Искусство публичного выступления",
"level": "",
"keywords": []
},
{
"name": "Executive search",
"level": "",
"keywords": []
},
{
"name": "Обучение",
"level": "",
"keywords": []
},
{
"name": "Обучение и развитие",
"level": "",
"keywords": []
},
{
"name": "Подбор персонала",
"level": "",
"keywords": []
},
{
"name": "Сорсинг",
"level": "",
"keywords": []
},
{
"name": "Формирование команды",
"level": "",
"keywords": []
},
{
"name": "Командная работа",
"level": "",
"keywords": []
}
],
"languages": [
{
"language": "ru",
"fluency": "Native Speaker"
}
],
"interests": [],
"references": [],
"projects": [],
"meta": {
"version": "v1.0.0",
"canonical": "https://github.com/jsonresume/resume-schema/blob/v1.0.0/schema.json"
}
}

, so an "image" json section is empty.

Photo address: https://media-exp1.licdn.com/dms/image/C4D03AQErAGm00RkXCw/profile-displayphoto-shrink_200_200/0/1660039683799?e=1668038400&v=beta&t=YgKPZ-oXA-Ezzehew1iQ_e8AdvNKUi-xkjhtQ0N2xRY

Thanks!

Can I use on my own app?

I’m looking to use this in my svelte app to export LinkedIn profile as json resume.

Do you have an example?

I’m not interested in browser extension.

resume.json

[user pasted JSON blob without explanation]

Work experience order is different than on LinkedIn profile

I was able to successfully export my linkedin profile to JSON Resume format since #26 was fixed. I have a new problem however. The order of work experience items in the resulting JSON Resume file is different than on my linkedin profile. Given that most templates and editors that can work with JSON Resume files, do not try to order it in any way (by date for example), this is problematic.

My LinkedIn profile results in a json file with the following work experience:

  "work": [
    {
      "company": "KLM Royal Dutch Airlines",
      "endDate": "2018-08-31",
      "highlights": [],
      "position": "Lead Data Engineer/Architect/Coach",
      "startDate": "2016-08-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "2organize",
      "endDate": "2012-10-31",
      "highlights": [],
      "position": "Intern Hadoop/Marketing Intelligence",
      "startDate": "2012-07-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "KLM Royal Dutch Airlines",
      "endDate": "",
      "highlights": [],
      "position": "Director Engineering & Architecture",
      "startDate": "2018-09-30",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Dandymusic",
      "endDate": "2011-06-30",
      "highlights": [],
      "position": "Owner & Pianist/Composer/Arranger",
      "startDate": "2005-09-30",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Hogeschool Rotterdam",
      "endDate": "2014-03-31",
      "highlights": [],
      "position": "Lecturer Datastructures & Algorithms",
      "startDate": "2013-10-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Hogeschool Rotterdam",
      "endDate": "2012-07-31",
      "highlights": [],
      "position": "Lecturer Cryptography 101",
      "startDate": "2012-01-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "2organize",
      "endDate": "2012-10-31",
      "highlights": [],
      "position": "Software Engineer",
      "startDate": "2012-07-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Joy in Coding",
      "endDate": "2018-12-31",
      "highlights": [],
      "position": "Freelance Software Engineer / Data Engineer / Firestarter",
      "startDate": "2016-05-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Info.nl",
      "endDate": "2014-05-31",
      "highlights": [],
      "position": "Software Engineer",
      "startDate": "2012-11-30",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Hogeschool Rotterdam",
      "endDate": "2013-12-31",
      "highlights": [],
      "position": "Lecturer Cryptography/Security",
      "startDate": "2013-09-30",
      "summary": "...",
      "url": ""
    },
    {
      "company": "ChargeGrid",
      "endDate": "2018-01-31",
      "highlights": [],
      "position": "Co-Founder",
      "startDate": "2016-01-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "The New Motion",
      "endDate": "2015-11-30",
      "highlights": [],
      "position": "Data Engineer/Scala Engineer",
      "startDate": "2014-06-30",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Digital Airline Operations",
      "endDate": "",
      "highlights": [],
      "position": "Director Engineering & Architecture",
      "startDate": "2018-06-30",
      "url": ""
    },
    {
      "company": "MOvE",
      "endDate": "2011-09-30",
      "highlights": [],
      "position": "Software Engineer",
      "startDate": "2010-06-30",
      "summary": "...",
      "url": ""
    },
    {
      "company": "VPRO",
      "endDate": "2016-08-31",
      "highlights": [],
      "position": "Software Engineer",
      "startDate": "2016-05-31",
      "summary": "...",
      "url": ""
    },
    {
      "company": "MOvE",
      "endDate": "2012-06-30",
      "highlights": [],
      "position": "Lead Engineer",
      "startDate": "2011-09-30",
      "summary": "...",
      "url": ""
    },
    {
      "company": "Universit",
      "endDate": "2016-05-31",
      "highlights": [],
      "position": "Firestarter and Software Engineer",
      "startDate": "2015-12-31",
      "summary": "...",
      "url": ""
    }
  ],

Position/Title missing into the exported JSON structure

Hi,

Nice extension!
Title / Position is missing for all work items:

"work": [
    {
      "company": "MyCompany",
      "highlights": [],
      "startDate": "2013-11-30",
      "website": "https://www.linkedin.com/company/xxxx/"
    },

It would be very cool to get them.
I use version 2.1.1

Missing information

If the linkedin profile shows the "show more" link because there are too many jobs (not that many really), the JSON generated doesn't include that info. This happens even if the plugin is called AFTER the show more link is pressed.

So I can't find any work arround this...

Example profile: https://www.linkedin.com/in/sebastianlavena/

This is great work ! Thanks if you can fix this :)

Contact Data are missing

Thank you very much for the great project and what an honor to open the #10 issue. I think you missed the contact data. In case you have a direct connection to the profile, in most cases, you are allowed to see the email address and other connected profiles e.g. Twitter. Unfortunately, I can't find this information in the JSON file. Is that a bug or a feature? Thank you

Problem to find an email address

I take the profile of someone, I tested in a linkedin email scraper, and the email was successfully found, When I use linkedin-to-jsonresume everything is scripted except the email.

Certificates are missing

The block of certificates is missing. I mean some people have a list of certificates like coursera.

image

Bug: Previous profile is grabbed after (SPA) page navigation (*vcard)

It was reported to me that when navigating between profiles and exporting vCards, the second export will be a duplicate of the first - i.e., it grabbed the first profile and not the second.

I just verified myself, and confirm this is a live bug. As opposed to being a regression after recent changes, I think this might actually be because LinkedIn is transitioning more and more of their site to act like a SPA (at least that is what I've noticed). This would also explain why a full page refresh before each export ensures the proper data is pulled.

In my quick test, the actual JSON Resume export seemed fine; just the VCards were affected.

Export language feature not working

Hi, my LinkedIn profile has the option of language selection so the viewer can easily change it according to their preference: Portuguese or English. Unfortunately, I can only export my data to JSON in Portuguese, which is my primary profile language. I've tried switching the display language on LinkedIn and also in the drop down menu in the extension but neither of the options work. Any idea of a workaround?

image

image

Feature: Add support for auto-pagination API calls

Most endpoints return all the data needed on the very first call, but a few are impacted by the pagination caps and require subsequent calls to get all the data necessary for the final schema generation.

Ideally, this should be made easier by modifying the voyagerFetch method (or associated methods) to accept a parameter to "auto-paginate" with an arbitrary limit, and then have the method run the requests (ideally in parallel if possible) and return the results together as a single combined entity.

Projects fail to export

I'd leave steps to reproduce, but I'm trying to keep my profile private for the time being. While I figure that out: I had several projects listed, and I got an empty list.

Parse from URL

This is awesome and super useful, thanks for making this and proving a wholesome readme.

I was looking into your code and I'm wondering if it is possible to parse all the data from Linkedin by scraping a Linkedin profile URL.

Is it possible? Could you point me how to?

Thanks

Candidate in lot

o How difficult would it be to parse linketin to json in candidate groups, for example, search for a term and on the linkedin search page to be able to parse all candidates

would you have any tips on how i could implement it?

Education not exported in JSON export

Describe the issue
I've just used the latest version and noticed that the education section is no longer populated (even though my profile should have one entry).

Help me reproduce your issue
Download profile with education populated

Additional context
This is not very important for me personally just thought I report it.

Improve: Add test(s) and/or checks

With how often this is needing updates, it would be nice to establish some sort of test or simple check to verify the shape of the output.

This could be something like a real-life integration test with snapshot...

  • dev puts cookie in .env file, extension runs via playwright, JSON Resume output is collected and compared to snapshot
  • Would essentially test all parts, include LI API endpoints
  • Downside: requires a static LI profile that never changes (or else not a true snapshot test)

... Or, to avoid needing a real LI profile and using real LI endpoints, could mock the LI API

  • This would also make it easier to test specific parts of the code versus full integration test
  • Avoid API throttling / quotas / flagging
  • Downside: Would not catch LI APIs changing

[URGENT] Extension not working anymore.

Troubleshooting
Before creating your issue, please run through the following troubleshooting steps to make sure this is not a temporary glitch or caused by a factor outside the control of this tool:

  • [✅] If you have recently installed any new browser extensions, try temporarily disabling them to see if that fixes mine (sometimes extensions interfere with each other)
  • [✅] Verify that LinkedIn has not rate-limited or banned your account. If you cannot load profiles, or get random error messages and blank pages, that is outside my control

Describe the issue
The tool isn't exporting the whole resume anymore. LinkedIn might have change something in their code.

Help me reproduce your issue
In order to expedite a bug fix, please help me narrow down what could be causing your issue by providing details that will let me replicate the same issue you saw:

  • Where did this happen?
    • Standard, as usual. It started to fail since last night. Yesterday morning it was working fine.
  • Is there anything special about the profile you were trying to extract?
    • No.
  • How consistent is this issue?
    • It happens for me and every other tests I did (4 different profiles)

Screenshots

image

CSP is breaking bookmarklet

Looks like LinkedIn just implemented CSP (was not there before):

VM10064:1 Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'report-sample' 'sha256-6gLjSWp3GRKZCUFvRX5aGHtECD1wVRgJOJp7r0ZQjV0=' 'unsafe-inline' static.licdn.com s.c.lnkd.licdn.com static-fstl.licdn.com static-src.linkedin.com https://www.linkedin.com/voyager/service-worker-push.js https://platform.linkedin.com/js/analytics.js static-exp1.licdn.com static-exp2.licdn.com s.c.exp1.licdn.com s.c.exp2.licdn.com static-lcdn.licdn.com s.c.lcdn.licdn.com https://www.linkedin.com/sc/ https://www.linkedin.com/scds/ https://qprod.www.linkedin.com/sc/ https://www.linkedin.com/sw.js https://www.linkedin.com/voyager/abp-detection.js https://platform.linkedin.com/litms/utag/ https://platform.linkedin.com/litms/vendor/".

Even though the bookmarklet does not use "eval" or is an inline-script, it looks like browsers treat it as such. See this SO question and this issue for details.

This CSP also blocks all injected CSS, which I was using to style the popup modal.

Short term fix:

Copy and paste main.js into the console, and hit enter to run. The "success modal" won't display, due to the inline CSS getting blocked by CSP, but you should be able to manually copy and paste the JSON export after plugging this into the console:

JSON.stringify(linkedinToResumeJsonConverter.getJSON(),null,4)

Options for moving forward

Unfortunately, this is not something I can work around, as far a bookmarklet goes. This CSP will block any bookmarklet, period. And you can't simply inject a new meta tag, since the header will override the meta tag if it is more restrictive (details).

The only way forward that I see is to migrate this to an entirely different form, such as a chrome extension. I avoided doing this previously, when I first started building this, since I don't like the level of permissions that extensions require and the associated privacy issues. Technically speaking though, it might not take that much work to wrap the code I have already written into a Chrome Extension. Or maybe as a command line utility or something like that.

How about export profile to markdown format?

Hi!

How would you feel about the idea of exporting profiles to markdown (.md) format?

It seems to me that, along with exporting to JSON and VCF, this would be an extremely useful feature.

Thanks for the answer!

Certain date ranges may start after they end

A profile might, on a work experience for example, have a date range that is "2007 - oct 2007". The this fix will interpret that as "2007-12-31 - 2007-10-31".

Start ends up bigger than end. I would suggest the fix is the following:

  • for end dates continue as is done currently ("year-12-31")
  • for start dates chose instead "year-01-01"

Maybe this will break a lot of things for people... Otherwise I am happy to make a PR.

Image prop is an empty string

Describe the issue
For me, the image prop is always an empty string, I tried to uninstall and reinstall the extension but I have the same result. Not sure if something changed recently with LinkedIn that could have caused this?

Additional context
I also dropped you an email, not sure if you've had time to take a look. Thanks!

EDIT:

Also, if the users work experience is set to current, is there a way to add this as an extra property? With the end date being an empty string, it's hard to tell if the person is still working there or just forgot to put an end date.

EDIT2:
It might be a good idea to add .replace(/\s+/g, " ") to the first and last name, I noticed that some of the profiles have a double space in their name, for example:

https://www.linkedin.com/in/claudiasirinda/

EDIT3:

For education, in the json, description is missing

Collects wrong Job Title and company

When a person has more than one current job, the system scrapes the last job, however, the profile "Professional Headline" Company & location are from the 1st job normally their main job

Picked Job
< h3 class="t-16 t-black t-bold">Founder - 3D Film Director

Actualy main job
< h2 class="mt1 t-18 t-black t-normal break-words">
Supply Chain & Business Development Consultant at Island Rush - Singapore

or
< h3 class="t-16 t-black t-bold">Supply Chain & Business Development Consultant

Some dates are not parsed correctly

  • One digit months need to be transformed into two digit months.
    When last day of the month is set:
  • Max number of days needs to be calculated instead of showing 31 for every month.

This should help validate the schema faster instead of having to validate manually and figure out which dates are incorrect.

Block account linkedin

I used it for 1 week and linkedin added a notification notice,
warning that it was not to use these types of automation mechanics, is there a more invisible way to do this?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.