Tóm tắt
API LinkedIn cho phép các nhà phát triển tích hợp với mạng lưới chuyên nghiệp của LinkedIn một cách lập trình. Nó sử dụng xác thực OAuth 2.0, các điểm cuối RESTful và GraphQL cho hồ sơ, bài đăng, bình luận, trang công ty và quảng cáo, với giới hạn tốc độ là 100-500 yêu cầu mỗi ngày cho mỗi ứng dụng. Hướng dẫn này bao gồm thiết lập xác thực, truy cập hồ sơ, đăng nội dung, quản lý trang công ty, API quảng cáo và các chiến lược tích hợp sản xuất.
Giới thiệu
LinkedIn có hơn 900 triệu người dùng chuyên nghiệp tại hơn 200 quốc gia. Đối với các nhà phát triển xây dựng công cụ tuyển dụng, nền tảng tiếp thị hoặc ứng dụng B2B, tích hợp API LinkedIn là điều cần thiết để tiếp cận đối tượng chuyên nghiệp này.
Thực tế là: các nhà tiếp thị B2B quản lý sự hiện diện trên LinkedIn thủ công mất 15-20 giờ mỗi tuần cho việc đăng bài, theo dõi tương tác và tạo khách hàng tiềm năng. Một tích hợp API LinkedIn vững chắc sẽ tự động hóa việc phân phối nội dung, thu thập khách hàng tiềm năng, phân tích tương tác và quy trình làm việc tuyển dụng.
Hướng dẫn này sẽ hướng dẫn bạn toàn bộ quá trình tích hợp API LinkedIn. Bạn sẽ tìm hiểu về xác thực OAuth 2.0, truy cập hồ sơ, đăng nội dung, quản lý trang công ty, tích hợp quảng cáo, webhook và các chiến lược triển khai sản xuất. Cuối cùng, bạn sẽ có một tích hợp LinkedIn sẵn sàng cho sản xuất.
API LinkedIn là gì?
LinkedIn cung cấp các API RESTful và GraphQL để truy cập dữ liệu mạng lưới chuyên nghiệp. API xử lý:
- Thông tin hồ sơ người dùng (với sự đồng ý)
- Trang công ty và cập nhật
- Bài đăng, bình luận và phản ứng
- Kết nối (hạn chế)
- Đăng tuyển việc làm và ứng tuyển
- Quản lý Quảng cáo LinkedIn
- Biểu mẫu tạo khách hàng tiềm năng
- Nhắn tin (chỉ dành cho đối tác giới hạn)
Các tính năng chính
| Tính năng | Mô tả |
|---|---|
| RESTful + GraphQL | Nhiều kiểu API |
| OAuth 2.0 | Yêu cầu ủy quyền người dùng |
| Giới hạn tốc độ | 100-500 yêu cầu/ngày cho mỗi ứng dụng |
| Trang công ty | Các hoạt động CRUD đầy đủ |
| API Quảng cáo | Quản lý chiến dịch |
| Webhooks | Thông báo thời gian thực |
| Tải lên phương tiện | Hình ảnh và video |
Sản phẩm API
| API | Cấp độ truy cập | Trường hợp sử dụng |
|---|---|---|
| Đăng nhập bằng LinkedIn | Công khai | Xác thực người dùng |
| API Hồ sơ | Đối tác | Đọc hồ sơ người dùng |
| API Quản trị viên công ty | Đối tác | Quản lý trang công ty |
| API Quảng cáo | Đối tác | Quản lý chiến dịch quảng cáo |
| API Đăng tuyển việc làm | Đối tác | Đăng và quản lý việc làm |
| Nền tảng nhà phát triển tiếp thị | Đối tác | Truy cập API đầy đủ |
Phiên bản API
| Phiên bản | Trạng thái | Ngày kết thúc |
|---|---|---|
| v2 | Hiện tại | Đang hoạt động |
| v1 | Đã ngừng hỗ trợ | Tháng 12 năm 2023 |
Bắt đầu: Thiết lập xác thực
Bước 1: Tạo tài khoản nhà phát triển LinkedIn
Trước khi truy cập API:
- Truy cập Cổng thông tin nhà phát triển LinkedIn
- Đăng nhập bằng tài khoản LinkedIn
- Nhấp vào Tạo ứng dụng trong bảng điều khiển Ứng dụng của tôi
- Điền thông tin chi tiết ứng dụng (tên, logo, mô tả)
Bước 2: Cấu hình cài đặt ứng dụng
Thiết lập xác thực ứng dụng:
const LINKEDIN_CLIENT_ID = process.env.LINKEDIN_CLIENT_ID;
const LINKEDIN_CLIENT_SECRET = process.env.LINKEDIN_CLIENT_SECRET;
const LINKEDIN_REDIRECT_URI = process.env.LINKEDIN_REDIRECT_URI;
// Lấy các thông tin này từ bảng điều khiển ứng dụng của bạn
// https://www.linkedin.com/developers/apps/{appId}/auth
Bước 3: Yêu cầu quyền cần thiết
LinkedIn yêu cầu phê duyệt quyền:
| Quyền | Mô tả | Yêu cầu phê duyệt |
|---|---|---|
r_liteprofile |
Hồ sơ cơ bản (tên, ảnh) | Tự động phê duyệt |
r_emailaddress |
Địa chỉ email | Tự động phê duyệt |
w_member_social |
Đăng bài thay mặt người dùng | Xác minh đối tác |
r_basicprofile |
Hồ sơ đầy đủ | Xác minh đối tác |
r_organization_social |
Truy cập trang công ty | Xác minh đối tác |
w_organization_social |
Đăng bài lên trang công ty | Xác minh đối tác |
rw_ads |
Quản lý quảng cáo | Xác minh đối tác |
r_ads_reporting |
Phân tích quảng cáo | Xác minh đối tác |
Bước 4: Xây dựng URL ủy quyền
Triển khai luồng OAuth 2.0:
const getAuthUrl = (state, scopes = ['r_liteprofile', 'r_emailaddress']) => {
const params = new URLSearchParams({
response_type: 'code',
client_id: LINKEDIN_CLIENT_ID,
redirect_uri: LINKEDIN_REDIRECT_URI,
scope: scopes.join(' '),
state: state
});
return `https://www.linkedin.com/oauth/v2/authorization?${params.toString()}`;
};
// Cách sử dụng
const state = require('crypto').randomBytes(16).toString('hex');
const authUrl = getAuthUrl(state, ['r_liteprofile', 'r_emailaddress', 'w_member_social']);
console.log(`Chuyển hướng người dùng đến: ${authUrl}`);
Bước 5: Trao đổi mã để lấy mã truy cập (Access Token)
Xử lý callback OAuth:
const exchangeCodeForToken = async (code) => {
const response = await fetch('https://www.linkedin.com/oauth/v2/accessToken', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'authorization_code',
code: code,
client_id: LINKEDIN_CLIENT_ID,
client_secret: LINKEDIN_CLIENT_SECRET,
redirect_uri: LINKEDIN_REDIRECT_URI
})
});
const data = await response.json();
return {
accessToken: data.access_token,
expiresIn: data.expires_in // 60 ngày
};
};
// Xử lý callback
app.get('/oauth/callback', async (req, res) => {
const { code, state } = req.query;
try {
const tokens = await exchangeCodeForToken(code);
// Lưu trữ token một cách an toàn
await db.users.update(req.session.userId, {
linkedin_access_token: tokens.accessToken,
linkedin_token_expires: Date.now() + (tokens.expiresIn * 1000)
});
res.redirect('/success');
} catch (error) {
console.error('Lỗi OAuth:', error);
res.status(500).send('Xác thực thất bại');
}
});
Bước 6: Làm mới mã truy cập (Access Token)
Mã truy cập hết hạn sau 60 ngày:
const refreshAccessToken = async (refreshToken) => {
// Lưu ý: LinkedIn không cung cấp refresh token
// Người dùng phải xác thực lại sau 60 ngày
// Triển khai thông báo hết hạn
};
// Kiểm tra thời hạn token trước khi gọi API
const ensureValidToken = async (userId) => {
const user = await db.users.findById(userId);
if (user.linkedin_token_expires < Date.now() + 86400000) { // 24 giờ
// Thông báo cho người dùng xác thực lại
await notifyUserToReauth(user.id);
throw new Error('Token đã hết hạn, vui lòng xác thực lại');
}
return user.linkedin_access_token;
};
Bước 7: Thực hiện các cuộc gọi API đã xác thực
Tạo ứng dụng khách API có thể tái sử dụng:
const LINKEDIN_BASE_URL = 'https://api.linkedin.com/v2';
const linkedinRequest = async (endpoint, options = {}) => {
const accessToken = await ensureValidToken(options.userId);
const response = await fetch(`${LINKEDIN_BASE_URL}${endpoint}`, {
...options,
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json',
'X-Restli-Protocol-Version': '2.0.0',
...options.headers
}
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Lỗi API LinkedIn: ${error.message}`);
}
return response.json();
};
// Cách sử dụng
const profile = await linkedinRequest('/me');
console.log(`Xin chào, ${profile.localizedFirstName} ${profile.localizedLastName}`);
Truy cập Hồ sơ
Lấy hồ sơ người dùng
Lấy hồ sơ của người dùng đã xác thực:
const getUserProfile = async () => {
const response = await linkedinRequest('/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))');
return response;
};
// Cách sử dụng
const profile = await getUserProfile();
console.log(`Tên: ${profile.localizedFirstName} ${profile.localizedLastName}`);
console.log(`ID: ${profile.id}`);
console.log(`Ảnh: ${profile.profilePicture?.['displayImage~']?.elements?.[0]?.identifiers?.[0]?.identifier}`);
Lấy địa chỉ email
Lấy email người dùng:
const getUserEmail = async () => {
const response = await linkedinRequest('/emailAddress?q=members&projection=(emailAddress*)');
return response;
};
// Cách sử dụng
const email = await getUserEmail();
console.log(`Email: ${email.elements?.[0]?.emailAddress}`);
Các trường hồ sơ có sẵn
| Trường | Quyền | Mô tả |
|---|---|---|
id |
r_liteprofile | ID thành viên LinkedIn |
firstName |
r_liteprofile | Tên |
lastName |
r_liteprofile | Họ |
profilePicture |
r_liteprofile | URL ảnh đại diện |
headline |
r_basicprofile | Tiêu đề chuyên môn |
summary |
r_basicprofile | Phần giới thiệu |
positions |
r_basicprofile | Lịch sử làm việc |
educations |
r_basicprofile | Lịch sử học vấn |
emailAddress |
r_emailaddress | Email chính |
Đăng nội dung
Tạo bài đăng
Chia sẻ bài đăng văn bản lên bảng tin của người dùng:
const createPost = async (authorUrn, postContent) => {
const response = await linkedinRequest('/ugcPosts', {
method: 'POST',
body: JSON.stringify({
author: authorUrn,
lifecycleState: 'PUBLISHED',
specificContent: {
'com.linkedin.ugc.ShareContent': {
shareCommentary: {
text: postContent.text
},
shareMediaCategory: 'NONE'
}
},
visibility: {
'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'
}
})
});
return response;
};
// Cách sử dụng
const post = await createPost('urn:li:person:ABC123', {
text: 'Vui mừng thông báo ra mắt sản phẩm mới của chúng tôi! 🚀 #đổi_mới #khởi_nghiệp'
});
console.log(`Bài đăng đã tạo: ${post.id}`);
Tạo bài đăng kèm hình ảnh
Chia sẻ bài đăng kèm phương tiện:
const createPostWithImage = async (authorUrn, postData) => {
// Bước 1: Đăng ký tải lên phương tiện
const uploadRegistration = await linkedinRequest('/assets?action=registerUpload', {
method: 'POST',
body: JSON.stringify({
registerUploadRequest: {
recipes: ['urn:li:digitalmediaRecipe:feedshare-image'],
owner: authorUrn,
serviceRelationships: [
{
relationshipType: 'OWNER',
identifier: 'urn:li:userGeneratedContent'
}
]
}
})
});
const uploadUrl = uploadRegistration.value.uploadMechanism['com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest'].uploadUrl;
const assetUrn = uploadRegistration.value.asset;
// Bước 2: Tải hình ảnh lên URL được cung cấp
await fetch(uploadUrl, {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + await getAccessToken(),
'Content-Type': 'application/octet-stream'
},
body: postData.imageBuffer
});
// Bước 3: Tạo bài đăng với hình ảnh đã tải lên
const post = await linkedinRequest('/ugcPosts', {
method: 'POST',
body: JSON.stringify({
author: authorUrn,
lifecycleState: 'PUBLISHED',
specificContent: {
'com.linkedin.ugc.ShareContent': {
shareCommentary: {
text: postData.text
},
shareMediaCategory: 'IMAGE',
media: [
{
status: 'READY',
description: {
text: postData.imageDescription || ''
},
media: assetUrn,
title: {
text: postData.title || ''
}
}
]
}
},
visibility: {
'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'
}
})
});
return post;
};
Tạo bài đăng kèm video
Chia sẻ nội dung video:
const createPostWithVideo = async (authorUrn, postData) => {
// Đăng ký tải lên video
const uploadRegistration = await linkedinRequest('/assets?action=registerUpload', {
method: 'POST',
body: JSON.stringify({
registerUploadRequest: {
recipes: ['urn:li:digitalmediaRecipe:feedshare-video'],
owner: authorUrn,
serviceRelationships: [
{
relationshipType: 'OWNER',
identifier: 'urn:li:userGeneratedContent'
}
]
}
})
});
const assetUrn = uploadRegistration.value.asset;
// Tải lên video (sử dụng URL tải lên đã được ký trước từ phản hồi)
// ... logic tải lên ...
// Tạo bài đăng
const post = await linkedinRequest('/ugcPosts', {
method: 'POST',
body: JSON.stringify({
author: authorUrn,
lifecycleState: 'PUBLISHED',
specificContent: {
'com.linkedin.ugc.ShareContent': {
shareCommentary: { text: postData.text },
shareMediaCategory: 'VIDEO',
media: [{ status: 'READY', media: assetUrn }]
}
},
visibility: { 'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC' }
})
});
return post;
};
Thông số kỹ thuật phương tiện
| Loại phương tiện | Định dạng | Kích thước tối đa | Thời lượng |
|---|---|---|---|
| Hình ảnh | JPG, PNG, GIF | 8MB | Không áp dụng |
| Video | MP4, MOV | 5GB | Tối đa 15 phút |
| Tài liệu | PDF, PPT, DOC | 100MB | Không áp dụng |
Quản lý trang công ty
Lấy thông tin công ty
Lấy thông tin chi tiết trang công ty:
const getCompanyInfo = async (companyId) => {
const response = await linkedinRequest(
`/organizations/${companyId}?projection=(id,localizedName,vanityName,tagline,description,universalName,logoV2(original~:playableStreams),companyType,companyPageUrl,confirmedLocations,industries,followerCount,staffCountRange,website, specialties)`
);
return response;
};
// Cách sử dụng
const company = await getCompanyInfo('1234567');
console.log(`Công ty: ${company.localizedName}`);
console.log(`Người theo dõi: ${company.followerCount}`);
console.log(`Trang web: ${company.website}`);
Đăng bài lên trang công ty
Chia sẻ cập nhật lên trang công ty:
const createCompanyPost = async (organizationUrn, postContent) => {
const response = await linkedinRequest('/ugcPosts', {
method: 'POST',
body: JSON.stringify({
author: organizationUrn,
lifecycleState: 'PUBLISHED',
specificContent: {
'com.linkedin.ugc.ShareContent': {
shareCommentary: {
text: postContent.text
},
shareMediaCategory: postContent.media ? 'IMAGE' : 'NONE',
media: postContent.media ? [
{
status: 'READY',
media: postContent.media.assetUrn
}
] : []
}
},
visibility: {
'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'
}
})
});
return response;
};
// Cách sử dụng
const post = await createCompanyPost('urn:li:organization:1234567', {
text: 'Chúng tôi đang tuyển dụng! Hãy tham gia đội ngũ đang phát triển của chúng tôi. #nghe_nghiep #tuyen_dung'
});
Lấy số lượng người theo dõi công ty
Lấy số lượng người theo dõi:
const getFollowerCount = async (organizationId) => {
const response = await linkedinRequest(
`/organizationalEntityFollowerStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:${organizationId}`
);
return response;
};
Giới hạn tốc độ
Tìm hiểu giới hạn tốc độ
LinkedIn áp dụng giới hạn tốc độ cho mỗi ứng dụng:
| API | Giới hạn | Khung thời gian |
|---|---|---|
| API Hồ sơ | 100 yêu cầu | Mỗi ngày |
| Bài đăng UGC | 50 bài đăng | Mỗi ngày |
| Quản trị viên công ty | 500 yêu cầu | Mỗi ngày |
| API Quảng cáo | 100 yêu cầu | Mỗi phút |
Header giới hạn tốc độ
| Header | Mô tả |
|---|---|
X-Restli-Quota-Remaining |
Số yêu cầu còn lại |
X-Restli-Quota-Reset |
Số giây cho đến khi đặt lại |
Khắc phục các vấn đề thường gặp
Vấn đề: Lỗi 401 Unauthorized (Không được ủy quyền)
Giải pháp:
- Xác minh mã truy cập chưa hết hạn (60 ngày)
- Kiểm tra phạm vi token có bao gồm tài nguyên được yêu cầu
- Đảm bảo có header
Authorization: Bearer {token}
Vấn đề: Lỗi 403 Forbidden (Bị cấm)
Giải pháp:
- Xác minh ứng dụng có các quyền cần thiết
- Kiểm tra người dùng đã phê duyệt các phạm vi được yêu cầu
- Có thể yêu cầu xác minh đối tác
Vấn đề: Lỗi 429 Rate Limited (Vượt quá giới hạn tốc độ)
Giải pháp:
- Triển khai hàng đợi yêu cầu
- Lưu bộ nhớ cache phản hồi để giảm số lần gọi
- Sử dụng webhook thay vì thăm dò
Danh sách kiểm tra triển khai sản xuất
Trước khi đưa vào hoạt động:
- [ ] Hoàn thành xác minh Đối tác LinkedIn
- [ ] Triển khai OAuth 2.0 với lưu trữ token an toàn
- [ ] Thêm thông báo hết hạn token (60 ngày)
- [ ] Thiết lập giới hạn tốc độ và hàng đợi
- [ ] Cấu hình các điểm cuối webhook
- [ ] Triển khai xử lý lỗi toàn diện
- [ ] Thêm ghi nhật ký cho tất cả các cuộc gọi API
- [ ] Tạo đánh giá tuân thủ nguyên tắc thương hiệu
Các trường hợp sử dụng thực tế
Nền tảng tuyển dụng
Một công cụ tuyển dụng tự động hóa việc đăng tuyển việc làm:
- Thử thách: Đăng bài thủ công trên nhiều kênh
- Giải pháp: Tích hợp API việc làm của LinkedIn
- Kết quả: Tiết kiệm 80% thời gian, số lượng ứng tuyển tăng gấp 3 lần
Tự động hóa tiếp thị B2B
Một nền tảng tiếp thị lên lịch nội dung LinkedIn:
- Thử thách: Lịch đăng bài không nhất quán
- Giải pháp: Tự động đăng bài qua API UGC
- Kết quả: Tăng tương tác gấp 5 lần, duy trì sự hiện diện thương hiệu nhất quán
Kết luận
API LinkedIn cung cấp quyền truy cập toàn diện vào các tính năng mạng lưới chuyên nghiệp. Những điểm chính cần nhớ:
- Xác thực OAuth 2.0 với token có thời hạn 60 ngày
- Các API hồ sơ, đăng bài và trang công ty có sẵn
- Giới hạn tốc độ yêu cầu quản lý cẩn thận (100-500/ngày)
- Yêu cầu xác minh đối tác cho hầu hết các API
- Apidog hợp lý hóa việc kiểm thử API và cộng tác nhóm
Phần Câu hỏi thường gặp
Làm cách nào để truy cập API LinkedIn?
Tạo tài khoản Nhà phát triển LinkedIn, tạo một ứng dụng và hoàn tất xác minh Đối tác để có quyền truy cập API nâng cao.
Tôi có thể đăng bài tự động lên LinkedIn không?
Có, hãy sử dụng API UGC (Nội dung do người dùng tạo) với quyền w_member_social cho bài đăng cá nhân hoặc w_organization_social cho bài đăng công ty.
Giới hạn tốc độ của LinkedIn là gì?
Giới hạn tốc độ dao động từ 100-500 yêu cầu mỗi ngày tùy thuộc vào API. API Quảng cáo cho phép 100 yêu cầu mỗi phút.
Token LinkedIn có hiệu lực trong bao lâu?
Mã truy cập hết hạn sau 60 ngày. Người dùng phải xác thực lại để tiếp tục truy cập API.
Tôi có thể truy cập danh bạ của người dùng không?
Không, LinkedIn đã loại bỏ quyền truy cập API danh bạ đối với hầu hết các ứng dụng do thay đổi về quyền riêng tư.
