Фотография на обложке Александр Шатов на Unsplash
Оглавление
- Обзор
- Предварительные условия
- Начало работы
- Получение списка заданий
- Получение информации о конкретной вакансии
- Ограничения LinkedIn Job API
Обзор
LinkedIn Jobs API — это один из богатого набора инструментов, предоставляемых Proxycurl API для работы с обработанными и структурированными данными LinkedIn в ваших приложениях. LinkedIn Jobs API, в частности, может использоваться для доступа к вакансиям, перечисленным компанией (через конечную точку Jobs Listing Endpoint) на LinkedIn, или для запроса компактной информации о конкретной вакансии (через конечную точку Jobs Profile Endpoint), такой как название вакансии, описание, тип занятости и т.д.
Предварительные условия
Этот учебник написан на JavaScript (ES6) и Node.js, поэтому я предполагаю, что вам удобно писать и понимать код на обоих языках.
Создайте новую директорию, cd
в нее и запустите новый проект Node.js:
npm init -y
Далее нам нужно установить следующие пакеты для запуска нашего приложения.
Выполните следующий код для установки пакетов:
npm install express axios dotenv
or with Yarn
yarn add express axios dotenv
Начало работы
Чтобы начать использовать API Jobs, вам понадобится API-ключ для выполнения запросов к конечным точкам. Proxycurl дает бесплатно 10 кредитов для пробного использования, и каждый успешный запрос к API стоит 1 кредит. Вы можете получить дополнительные кредиты, пополнив свой счет через панель управления. В этом руководстве мы будем использовать бесплатные 10 кредитов для начала. Чтобы начать, перейдите сюда, чтобы получить бесплатный API-ключ.
Затем войдите в свою приборную панель и скопируйте API-ключ из вкладки API-ключ и биллинг.
Чтобы защитить ваш API Key, создайте файл .env
в корневом каталоге вашего проекта и добавьте следующий код:
API_KEY = 'YOUR_API_KEY'
Наконец, добавьте следующий код, чтобы запустить наш сервер:
import express from 'express';
import axios from 'axios';
import dotenv from 'dotenv';
const app = express();
dotenv.config();
app.listen(8000, () => {
console.log('App connected successfully!');
});
ПРИМЕЧАНИЕ: Не забудьте добавить "type": "module"
в package.json
, чтобы Node.js знал, что мы пишем код ES6.
Получение списка заданий
Допустим, нам зачем-то нужен список вакансий, опубликованных Twitter на LinkedIn. Ручной поиск таких данных может быть громоздким, но благодаря API Proxycurl мы можем легко получить эти данные.
Для выполнения этой задачи мы будем использовать конечную точку Jobs Listing для запроса вакансий, размещенных Twitter на LinkedIn, и конечную точку Company Profile для получения search_id
. search_id
— это числовая строка, возвращаемая в ответе конечной точки профиля компании, которую мы будем использовать в качестве параметра при запросе конечной точки списка вакансий.
Чтобы начать работу, добавьте следующий код прямо перед блоком кода app.listen()
:
// {...previous code omitted for brevity}
const TWITTER_URL = 'https://www.linkedin.com/company/twitter/'; // Line 1
const COMPANY_PROFILE_ENDPOINT = 'https://nubela.co/proxycurl/api/linkedin/company';
const JOBS_LISTING_ENDPOINT = 'https://nubela.co/proxycurl/api/v2/linkedin/company/job';
const JOB_PROFILE_ENDPOINT = 'https://nubela.co/proxycurl/api/linkedin/job';
const companyProfileConfig = { // Line 2
url: COMPANY_PROFILE_ENDPOINT,
method: 'get',
headers: {'Authorization': 'Bearer ' + process.env.API_KEY},
params: {
url: TWITTER_URL
}
};
const getTwitterProfile = async () => { // Line 3
return await axios(companyProfileConfig);
}
const profile = await getTwitterProfile();
const twitterID = profile.data.search_id;
console.log('Twitter ID:', twitterID);
const jobListingsConfig = {
url: JOBS_LISTING_ENDPOINT,
method: 'get',
headers: {'Authorization': 'Bearer ' + process.env.API_KEY},
params: {
search_id: twitterID // Line 4
}
}
const getTwitterListings = async () => { // Line 5
return await axios(jobListingsConfig);
}
const jobListings = await getTwitterListings();
const jobs = jobListings.data.job;
console.log(jobs);
Давайте разберемся, что происходит в приведенном выше коде.
-
Начиная со строки 1 выше, мы определили конечные точки API для API Proxycurl. Вы можете найти ссылки из документации API здесь.
-
В строке 2 мы определили конфигурацию axios для конечной точки профиля компании. Поле
url
принимает url конечной точки профиля компании, полеheaders
принимает Authorization Bearer с нашим API-токеном, а полеparams
принимает linkedIn url компании, которую мы хотим запросить, что в нашем случае является переменнойTWITTER_URL
. -
В строке 3 мы создали функцию
getTwitterProfile
, которая использует axios и возвращает профиль нашей компании, используяcompanyProfileConfig
. -
В строке 4 мы просто используем
search_id
, возвращенный из функцииgetTwitterProfile
в качестве параметра в конфигурации axios для функцииgetTwitterListings
. -
Наконец, в строке 5 мы определили функцию
getTwitterListings
для получения списка вакансий, размещенных в Twitter на LinkedIn, и прикрепили результат к переменнойjobs
, а затем занесли результат в журнал.
На данном этапе, если вы запустите npm dev
, в консоль должен быть записан следующий ответ:
Twitter ID: 96622
[
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Content Designer, Content Moderation (Canada)',
job_url: 'https://www.linkedin.com/jobs/view/3135150334',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Senior Machine Learning Engineer - Ads Predictions - Revenue',
job_url: 'https://www.linkedin.com/jobs/view/3104474438',
list_date: null,
location: 'Canada'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Sr. Software Engineer, Realtime Storage - Key Value Storage',
job_url: 'https://www.linkedin.com/jobs/view/3135386201',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Content Designer, Content Moderation (Canada)',
job_url: 'https://www.linkedin.com/jobs/view/3135146767',
list_date: null,
location: 'Canada'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Software Engineer - Content Health',
job_url: 'https://www.linkedin.com/jobs/view/3169270490',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Product Design Manager, Advertiser Experience',
job_url: 'https://www.linkedin.com/jobs/view/3020369734',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Engineering Manager - Content Health (Child Safety)',
job_url: 'https://www.linkedin.com/jobs/view/3165908037',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Senior Software Engineer - Observability',
job_url: 'https://www.linkedin.com/jobs/view/3158647123',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Outbound Sales Representative - Customer Success, Agency',
job_url: 'https://www.linkedin.com/jobs/view/3109712849',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Senior Software Engineer - Data Platform, Metadata Services (Permanently Remote!)',
job_url: 'https://www.linkedin.com/jobs/view/2939759384',
list_date: null,
location: 'Toronto, ON'
},
{
company: 'Twitter',
company_url: 'https://www.linkedin.com/company/twitter',
job_title: 'Client Account Manager',
job_url: 'https://www.linkedin.com/jobs/view/3136650462',
list_date: null,
location: 'Toronto, ON'
}
]
Получение подробной информации о конкретном задании
Конечная точка Job Profile возвращает обработанную и компактную информацию о конкретной вакансии, размещенной компанией на LinkedIn. Чтобы увидеть это в действии, мы используем одну из вакансий, перечисленных Twitter, которую мы вернули из конечной точки Jobs Listing Endpoint в нашем предыдущем коде.
Добавьте следующий код в свой проект:
// {...previous code omitted for brevity}
const jobProfileConfig = {
url: JOB_PROFILE_ENDPOINT,
method: 'get',
headers: { 'Authorization': 'Bearer ' + process.env.API_KEY },
params: {
url: jobs[0].job_url // Line 1
}
};
const getJobDetails = async () => { // Line 2
return await axios(jobProfileConfig);
};
const jobDetails = await getJobDetails();
console.log(jobDetails.data);
Вот что мы делаем выше.
-
В строке 1 мы добавили url первого задания в переменную
jobs
в качестве параметра к конфигурации axios вjobProfileConfig
. -
В строке 2 мы определили функцию
getJobDetails
для получения подробностей первого задания в массивеjobs
.
Выполнение этого кода выводит на консоль следующий ответ:
{
"apply_url": null,
"company": {
"logo": "https://media-exp1.licdn.com/dms/image/C4D0BAQHiNSL4Or29cg/company-logo_400_400/0/1519856215226?e=1661385600u0026v=betau0026t=rUecQpduLPDavL3JswjLsJAUNgSu1Q2l3JS5sGp8nHk",
"name": "Twitter",
"url": "https://www.linkedin.com/company/twitter"
},
"employment_type": "Full-time",
"industry": [
"Internet"
],
"job_description": "This role may also be remote. Note: By applying to this position you will have...",
"job_functions": [],
"linkedin_internal_id": "2400342303",
"location": "Toronto, ON",
"seniority_level": null,
"title": "'Content Designer, Content Moderation (Canada)",
"total_applicants": null
}
ПРИМЕЧАНИЕ: Для краткости я сократил содержимое поля job_description
.
Ограничения API LinkedIn Job
В нынешнем состоянии LinkedIn Job API имеет некоторые ограничения, которые ограничивают его использование. Вот некоторые из недостатков, с которыми может столкнуться пользователь при использовании API.
-
API не предоставляет дату размещения вакансии.
-
Он не предоставляет квалификацию или навыки, необходимые для работы.
Надеемся, что будущие обновления API будут включать значительные улучшения и обновления, которые ограничат вышеупомянутые недостатки.