
npm install linkedin-private-api-node12NodeJS Wrapper API for LinkedIn API, written in TypeScript.
No tokens are needed for using this API, only a working LinkedIn account.
```
npm install linkedin-private-api
typescript
import { Client } from 'linkedin-private-api';const username = process.env.USERNAME as string;
const password = process.env.PASSWORD as string;
(async () => {
// Login
const client = new Client();
await client.login.userPass({ username, password });
// Search for React development jobs in Israel
const jobsScroller = await client.search.searchJobs({
keywords: 'React',
filters: { location: 'Israel' },
limit: 20,
skip: 5,
});
const [someReactJobHit] = await jobsScroller.scrollNext();
const jobCompanyName = someReactJobHit.hitInfo.jobPosting.companyDetails.company.name;
// Fetch the job's company
const companiesScroller = await client.search.searchCompanies({ keywords: jobCompanyName });
const [{ company: jobCompany }] = await companiesScroller.scrollNext();
// Search for profiles and send an invitation
const peopleScroller = await client.search.searchPeople({
keywords: 'Bill Gates'
});
const [{ profile: billGates }] = await peopleScroller.scrollNext();
await client.invitation.sendInvitation({
profileId: billGates.profileId,
trackingId: billGates.trackingId,
});
// Search in my connections
const ownConnectionsScroller = await client.search.searchOwnConnections({ keywords: 'Bill Gates', limit: 1 });
const connections = await ownConnectionsScroller.scrollNext();
// Get conversation
const [billConversation] = await client.conversation.getConversations({
recipients: billGates.profileId
}).scrollNext();
const conversationMessages = await client.message.getMessages({
conversationId: billConversation.conversationId
}).scrollNext()
// Send a message
const sentMessage = await client.message.sendMessage({
profileId: billGates.profileId,
text: 'Hey Bill!',
});
})();
`API
$3
Classes that expose methods for communicating with linkedin API.
Each repository describes a LinkedIn entity that we can operate on it. Example:
InvitationRepository. The methods are divided into 3 types:
* Single entity getters - example:
conversation.getConversation({ conversationId: CONVERSATION_ID })
Single entity getters return a LinkedIn Entity. * Multiple entities getters - for example
invitation.getSentInvitations({ skip: 10, limit: 5 })
Multiple entities getters return a Scroller. * Mutations - for example
invitation.sendInvitation({ ... })
Mutations return a Response entity|Name|Example Usage|Docs Reference|
|-|-|-|
|
login|client.login.userPass(...)|Login Docs|
|search|client.search.searchPeople()|Search Docs|
|profile|client.profile.getOwnProfile()|Profile Docs|
|invitation|client.invitation.getReceivedInvitations()|Invitation Docs|
|conversation|client.conversation.getConversation(...)|Conversation Docs|
|message|client.message.getMessages(...)|Message Docs|
$3
Interfaces that describe LinkedIn objects. For example - Conversation object.
Most of those entities contain the properties returned from the LinkedIn response and in addition to these properties, the API adds some extra properties to make the usage a bit easier.The full list of entities can be found here, this is the list of the most important ones:
|Entities|
|-|
|Profile|
|MiniProfile|
|MiniCompany|
|Invitation|
|Conversation|
|Message|
|CompanySearchHit|
|PeopleSearchHit|
|JobSearchHit|
|MessageCreateResponse|
$3
Wrapper classes that enable a convenient work with paginated responses. For example - PeopleScroller.
Most of LinkedIn requests return paginated responses, (just like in the UI), scrollers just provide a structured way to navigate between pages. There are two types of scrollers:
* Index scroller - Accepts 2 properties:
skip (number) - Starting index (How many entities to skip).
limit (number) - How many entities to fetch on each iteration.* Time scrollers - Accepts one property:
createdBefore (Date) - Defines the point of time to start fetching entities.
Example:
`typescript
// index scroller
let companiesScroller = client.search.searchCompanies();
let companies = await companiesScroller.scrollNext(); // returns first page with 10 results
companies = await companiesScroller.scrollNext(); // next page
companies = await companiesScroller.scrollBack(); // previous page// overriding skip and limit
companiesScroller = client.search.searchCompanies({ skip: 100, limit: 1 });
companies = await companiesScroller.scrollNext(); // returns first page with 1 results
companies = await companiesScroller.scrollNext(); // next page
companies = await companiesScroller.scrollBack(); // previous page
// overriding createdBefore for time scroller
const twoDaysAgo = moment().subtract(2, 'days').toDate();
let messagesScroller = client.message.getMessages({
conversationId: CONVERSATION_ID,
createdBefore: twoDaysAgo
});
messages = await companiesScroller.scrollNext();
``This is a new project, and as such, there's a lot that need to be done.
Some new features that I expect to develop soon:
* Media support - fetch, like, comment and create a new post.
* Invitation improvements - be able to do some more actions like "remove connection".
* Improve login API
* Add services so automate common workflows
Want a specific feature? Please open a feature request :)
Also, i'll be more than happy to welcome new contributors to this project.
Note that using this API might cause your account being banned.
Always take care; we cannot be held for any account being banned.