Tóm tắt
API của Hootsuite cho phép các nhà phát triển tích hợp với quy trình làm việc quản lý mạng xã hội theo chương trình. Nó sử dụng xác thực OAuth 2.0, các điểm cuối RESTful cho hồ sơ, bài đăng, phân tích và quản lý nhóm, với giới hạn tốc độ từ 50-200 yêu cầu mỗi phút tùy thuộc vào gói. Hướng dẫn này bao gồm thiết lập xác thực, lên lịch bài đăng, truy xuất phân tích, quản lý nhóm và các chiến lược tích hợp sản xuất.
Lưu ý: Hootsuite đã ngừng cung cấp API công khai của họ kể từ năm 2024. Hướng dẫn này bao gồm các phương pháp thay thế như tích hợp đối tác của Hootsuite, webhooks và các API quản lý mạng xã hội của bên thứ ba cung cấp chức năng tương tự.
Giới thiệu
Hootsuite quản lý hơn 30 triệu tài khoản mạng xã hội cho hơn 200.000 doanh nghiệp tại hơn 175 quốc gia. Đối với các nhà phát triển xây dựng công cụ mạng xã hội, nền tảng tiếp thị hoặc bảng điều khiển phân tích, tích hợp API mạng xã hội là rất cần thiết để tiếp cận lượng lớn đối tượng doanh nghiệp này.
Thực tế cho thấy: các nhà quản lý mạng xã hội xử lý hơn 20 tài khoản mất 25-35 giờ mỗi tuần cho việc đăng bài thủ công, theo dõi tương tác và tạo báo cáo. Một tích hợp API mạng xã hội vững chắc sẽ tự động hóa việc phân phối nội dung, giám sát tương tác, phân tích cảm xúc và báo cáo hiệu suất.
Tình trạng và Các lựa chọn thay thế cho API Hootsuite
Tình hình API hiện tại
Tính đến năm 2024, Hootsuite đã ngừng cung cấp API công khai của họ. Các tùy chọn tích hợp:
| Cách tiếp cận | Mô tả | Phù hợp nhất cho |
|---|---|---|
| API nền tảng gốc | Tích hợp trực tiếp với Facebook, Twitter, LinkedIn, v.v. | Kiểm soát hoàn toàn, giải pháp tùy chỉnh |
| Audiense | Công cụ phân tích đối tượng thuộc sở hữu của Hootsuite | Phân tích đối tượng |
| HeyOrca | API lên lịch mạng xã hội | Lịch nội dung |
| Buffer API | Quản lý mạng xã hội | Các đội nhỏ |
| Sprout Social API | Quản lý mạng xã hội cho doanh nghiệp lớn | Các tổ chức lớn |
| Agorapulse API | CRM mạng xã hội | Quản lý cộng đồng |
Cách tiếp cận được khuyến nghị: API nền tảng gốc
Đối với hầu hết các trường hợp sử dụng, tích hợp trực tiếp với các nền tảng mạng xã hội mang lại sự linh hoạt nhất:
| Nền tảng | Tên API | Tính năng chính |
|---|---|---|
| Facebook/Instagram | Graph API | Bài đăng, thông tin chi tiết, bình luận |
| Twitter/X | API v2 | Tweet, phân tích, luồng dữ liệu |
| Marketing API | Bài đăng, trang công ty, quảng cáo | |
| API v5 | Ghim, bảng, phân tích | |
| TikTok | Display API | Video, thông tin người dùng |
| YouTube | Data API | Video, danh sách phát, phân tích |
Bắt đầu: Xác thực đa nền tảng
Bước 1: Đăng ký ứng dụng nhà phát triển
Tạo tài khoản nhà phát triển cho từng nền tảng:
// Lưu trữ thông tin đăng nhập một cách an toàn
const SOCIAL_CREDENTIALS = {
facebook: {
appId: process.env.FB_APP_ID,
appSecret: process.env.FB_APP_SECRET,
redirectUri: process.env.FB_REDIRECT_URI
},
twitter: {
apiKey: process.env.TWITTER_API_KEY,
apiSecret: process.env.TWITTER_API_SECRET,
redirectUri: process.env.TWITTER_REDIRECT_URI
},
linkedin: {
clientId: process.env.LINKEDIN_CLIENT_ID,
clientSecret: process.env.LINKEDIN_CLIENT_SECRET,
redirectUri: process.env.LINKEDIN_REDIRECT_URI
},
instagram: {
appId: process.env.FB_APP_ID, // Sử dụng Đăng nhập Facebook
appSecret: process.env.FB_APP_SECRET
}
};
Bước 2: Triển khai luồng OAuth 2.0
Trình xử lý OAuth hợp nhất cho nhiều nền tảng:
const getAuthUrl = (platform, state) => {
const configs = {
facebook: {
url: 'https://www.facebook.com/v18.0/dialog/oauth',
params: {
client_id: SOCIAL_CREDENTIALS.facebook.appId,
redirect_uri: SOCIAL_CREDENTIALS.facebook.redirectUri,
scope: 'pages_manage_posts,pages_read_engagement,instagram_basic,instagram_content_publish',
state
}
},
twitter: {
url: 'https://twitter.com/i/oauth2/authorize',
params: {
client_id: SOCIAL_CREDENTIALS.twitter.apiKey,
redirect_uri: SOCIAL_CREDENTIALS.twitter.redirectUri,
scope: 'tweet.read tweet.write users.read offline.access',
state,
response_type: 'code'
}
},
linkedin: {
url: 'https://www.linkedin.com/oauth/v2/authorization',
params: {
client_id: SOCIAL_CREDENTIALS.linkedin.clientId,
redirect_uri: SOCIAL_CREDENTIALS.linkedin.redirectUri,
scope: 'w_member_social r_basicprofile',
state,
response_type: 'code'
}
}
};
const config = configs[platform];
const params = new URLSearchParams(config.params);
return `${config.url}?${params.toString()}`;
};
// Xử lý callback OAuth
const handleOAuthCallback = async (platform, code) => {
const tokenEndpoints = {
facebook: 'https://graph.facebook.com/v18.0/oauth/access_token',
twitter: 'https://api.twitter.com/2/oauth2/token',
linkedin: 'https://www.linkedin.com/oauth/v2/accessToken'
};
const response = await fetch(tokenEndpoints[platform], {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
client_id: SOCIAL_CREDENTIALS[platform].apiKey || SOCIAL_CREDENTIALS[platform].appId || SOCIAL_CREDENTIALS[platform].clientId,
client_secret: SOCIAL_CREDENTIALS[platform].appSecret || SOCIAL_CREDENTIALS[platform].apiSecret,
redirect_uri: SOCIAL_CREDENTIALS[platform].redirectUri,
code,
grant_type: 'authorization_code'
})
});
return response.json();
};
Bước 3: Lưu trữ token một cách an toàn
// Schema cơ sở dữ liệu cho các token mạng xã hội
const SocialToken = {
userId: 'user_123',
platform: 'facebook',
accessToken: 'encrypted_token_here',
refreshToken: 'encrypted_refresh_token',
tokenExpiry: Date.now() + 5183999, // 60 ngày
scopes: ['pages_manage_posts', 'pages_read_engagement'],
pageId: 'page_456', // Dành cho Facebook/Instagram
pageName: 'My Business Page'
};
Lên lịch và Đăng bài
Tạo bài đăng đa nền tảng
Đăng lên nhiều nền tảng cùng lúc:
const createSocialPost = async (postData) => {
const results = {};
// Bài đăng trên trang Facebook
if (postData.platforms.includes('facebook')) {
results.facebook = await postToFacebook({
pageId: postData.facebookPageId,
message: postData.message,
link: postData.link,
photo: postData.photo
});
}
// Bài đăng Twitter
if (postData.platforms.includes('twitter')) {
results.twitter = await postToTwitter({
text: postData.message,
media: postData.photo
});
}
// Bài đăng LinkedIn
if (postData.platforms.includes('linkedin')) {
results.linkedin = await postToLinkedIn({
authorUrn: postData.linkedinAuthorUrn,
text: postData.message,
contentUrl: postData.link
});
}
// Bài đăng Instagram
if (postData.platforms.includes('instagram')) {
results.instagram = await postToInstagram({
igAccountId: postData.igAccountId,
imageUrl: postData.photo,
caption: postData.message
});
}
return results;
};
// Đăng bài lên Facebook
const postToFacebook = async (postData) => {
const token = await getFacebookPageToken(postData.pageId);
const params = new URLSearchParams({
message: postData.message,
access_token: token
});
if (postData.link) {
params.append('link', postData.link);
}
if (postData.photo) {
params.append('photo', postData.photo);
}
const response = await fetch(
`https://graph.facebook.com/v18.0/${postData.pageId}/feed?${params.toString()}`,
{ method: 'POST' }
);
return response.json();
};
// Đăng bài lên Twitter
const postToTwitter = async (postData) => {
const token = await getTwitterToken();
let mediaIds = [];
if (postData.media) {
// Tải lên phương tiện trước
const mediaUpload = await uploadTwitterMedia(postData.media, token);
mediaIds = [mediaUpload.media_id_string];
}
const response = await fetch('https://api.twitter.com/2/tweets', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
text: postData.text,
media: mediaIds.length > 0 ? { media_ids: mediaIds } : undefined
})
});
return response.json();
};
// Đăng bài lên LinkedIn
const postToLinkedIn = async (postData) => {
const token = await getLinkedInToken();
const post = {
author: postData.authorUrn,
lifecycleState: 'PUBLISHED',
specificContent: {
'com.linkedin.ugc.ShareContent': {
shareCommentary: {
text: postData.text
},
shareMediaCategory: postData.contentUrl ? 'ARTICLE' : 'NONE',
media: postData.contentUrl ? [{
status: 'READY',
media: postData.contentUrn,
description: { text: postData.text }
}] : []
}
},
visibility: {
'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'
}
};
const response = await fetch('https://api.linkedin.com/v2/ugcPosts', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
'X-Restli-Protocol-Version': '2.0.0'
},
body: JSON.stringify(post)
});
return response.json();
};
// Đăng bài lên Instagram
const postToInstagram = async (postData) => {
const token = await getInstagramToken();
// Bước 1: Tạo container phương tiện
const containerResponse = await fetch(
`https://graph.facebook.com/v18.0/${postData.igAccountId}/media`,
{
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` },
body: JSON.stringify({
image_url: postData.imageUrl,
caption: postData.caption
})
}
);
const container = await containerResponse.json();
// Bước 2: Đăng bài
const publishResponse = await fetch(
`https://graph.facebook.com/v18.0/${postData.igAccountId}/media_publish`,
{
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` },
body: JSON.stringify({ creation_id: container.id })
}
);
return publishResponse.json();
};
Lên lịch bài đăng
Triển khai tính năng lên lịch bài đăng:
const schedulePost = async (postData, scheduledTime) => {
// Lưu trữ vào cơ sở dữ liệu để thực thi sau
const scheduledPost = await db.scheduledPosts.create({
message: postData.message,
platforms: postData.platforms,
scheduledTime: scheduledTime,
status: 'pending',
media: postData.media,
link: postData.link
});
// Thiết lập hàng đợi công việc
await jobQueue.add('publish-social-post', {
postId: scheduledPost.id
}, {
delay: scheduledTime - Date.now()
});
return scheduledPost;
};
// Bộ xử lý công việc
jobQueue.process('publish-social-post', async (job) => {
const post = await db.scheduledPosts.findById(job.data.postId);
try {
const result = await createSocialPost(post);
await db.scheduledPosts.update(post.id, {
status: 'published',
publishedAt: new Date(),
results: result
});
return result;
} catch (error) {
await db.scheduledPosts.update(post.id, {
status: 'failed',
error: error.message
});
throw error;
}
});
Phân tích và Báo cáo
Truy xuất phân tích đa nền tảng
Tổng hợp các chỉ số từ tất cả các nền tảng:
const getSocialAnalytics = async (accountId, dateRange) => {
const analytics = {
facebook: await getFacebookAnalytics(accountId.facebook, dateRange),
twitter: await getTwitterAnalytics(accountId.twitter, dateRange),
linkedin: await getLinkedInAnalytics(accountId.linkedin, dateRange),
instagram: await getInstagramAnalytics(accountId.instagram, dateRange)
};
// Tổng hợp các chỉ số
const totals = {
impressions: sum(analytics, 'impressions'),
engagement: sum(analytics, 'engagement'),
clicks: sum(analytics, 'clicks'),
shares: sum(analytics, 'shares'),
comments: sum(analytics, 'comments'),
newFollowers: sum(analytics, 'newFollowers')
};
return { analytics, totals };
};
// Thông tin chi tiết Facebook
const getFacebookAnalytics = async (pageId, dateRange) => {
const token = await getFacebookPageToken(pageId);
const metrics = [
'page_impressions_unique',
'page_engaged_users',
'page_post_engagements',
'page_clicks',
'page_fan_adds'
];
const params = new URLSearchParams({
metric: metrics.join(','),
since: dateRange.from,
until: dateRange.until,
access_token: token
});
const response = await fetch(
`https://graph.facebook.com/v18.0/${pageId}/insights?${params.toString()}`
);
return response.json();
};
// Phân tích Twitter
const getTwitterAnalytics = async (userId, dateRange) => {
const token = await getTwitterToken();
const response = await fetch(
`https://api.twitter.com/2/users/${userId}/metrics/private`,
{
headers: { 'Authorization': `Bearer ${token}` }
}
);
return response.json();
};
// Phân tích LinkedIn
const getLinkedInAnalytics = async (organizationId, dateRange) => {
const token = await getLinkedInToken();
const response = await fetch(
`https://api.linkedin.com/v2/organizationalEntityFollowerStatistics?q=organizationalEntity&organizationalEntity=${organizationId}`,
{
headers: { 'Authorization': `Bearer ${token}` }
}
);
return response.json();
};
// Thông tin chi tiết Instagram
const getInstagramAnalytics = async (igAccountId, dateRange) => {
const token = await getInstagramToken();
const metrics = [
'impressions',
'reach',
'engagement',
'profile_views',
'follower_count'
];
const params = new URLSearchParams({
metric: metrics.join(','),
period: 'day',
since: dateRange.from,
until: dateRange.until
});
const response = await fetch(
`https://graph.facebook.com/v18.0/${igAccountId}/insights?${params.toString()}`,
{
headers: { 'Authorization': `Bearer ${token}` }
}
);
return response.json();
};
function sum(analytics, metric) {
return Object.values(analytics).reduce((total, platform) => {
return total + (platform.data?.[metric] || 0);
}, 0);
}
Quản lý nhóm
Kiểm soát truy cập dựa trên vai trò
const TEAM_ROLES = {
ADMIN: 'admin',
MANAGER: 'manager',
CONTRIBUTOR: 'contributor',
VIEWER: 'viewer'
};
const ROLE_PERMISSIONS = {
[TEAM_ROLES.ADMIN]: ['create', 'read', 'update', 'delete', 'manage_team', 'billing'],
[TEAM_ROLES.MANAGER]: ['create', 'read', 'update', 'approve_posts'],
[TEAM_ROLES.CONTRIBUTOR]: ['create', 'read'],
[TEAM_ROLES.VIEWER]: ['read']
};
const checkPermission = (userRole, requiredPermission) => {
const permissions = ROLE_PERMISSIONS[userRole] || [];
return permissions.includes(requiredPermission);
};
Giới hạn tốc độ
Giới hạn tốc độ của nền tảng
| Nền tảng | Giới hạn | Khung thời gian |
|---|---|---|
| Facebook Graph | 200 cuộc gọi | Mỗi giờ cho mỗi người dùng |
| Twitter API v2 | 300 tweet | Mỗi 15 phút |
| 100-500 cuộc gọi | Mỗi ngày | |
| 200 cuộc gọi | Mỗi giờ |
Triển khai xử lý giới hạn tốc độ
class SocialMediaRateLimiter {
constructor() {
this.limits = {
facebook: { limit: 200, window: 3600000 },
twitter: { limit: 300, window: 900000 },
linkedin: { limit: 500, window: 86400000 },
instagram: { limit: 200, window: 3600000 }
};
this.counters = {};
}
async request(platform, endpoint, options) {
await this.waitForCapacity(platform);
const response = await fetch(endpoint, options);
this.incrementCounter(platform);
return response;
}
async waitForCapacity(platform) {
const limit = this.limits[platform];
const counter = this.counters[platform] || { count: 0, resetTime: Date.now() };
if (Date.now() > counter.resetTime + limit.window) {
counter.count = 0;
counter.resetTime = Date.now();
}
if (counter.count >= limit.limit) {
const waitTime = counter.resetTime + limit.window - Date.now();
await new Promise(resolve => setTimeout(resolve, waitTime));
}
this.counters[platform] = counter;
}
incrementCounter(platform) {
if (!this.counters[platform]) {
this.counters[platform] = { count: 0, resetTime: Date.now() };
}
this.counters[platform].count++;
}
}
Danh sách kiểm tra triển khai sản xuất
Trước khi đưa vào hoạt động:
- [ ] Triển khai OAuth 2.0 cho tất cả các nền tảng
- [ ] Lưu trữ token an toàn bằng mã hóa
- [ ] Thiết lập làm mới token tự động
- [ ] Triển khai giới hạn tốc độ cho từng nền tảng
- [ ] Thêm xử lý lỗi toàn diện
- [ ] Thiết lập ghi nhật ký cho tất cả các cuộc gọi API
- [ ] Tạo quy trình phê duyệt bài đăng
- [ ] Triển khai kiểm duyệt nội dung
- [ ] Thiết lập tổng hợp phân tích
- [ ] Tạo cơ chế đăng bài dự phòng
Các trường hợp sử dụng trong thực tế
Bảng điều khiển mạng xã hội
Một công ty tiếp thị xây dựng bảng điều khiển hợp nhất:
- Thách thức: Quản lý hơn 50 tài khoản khách hàng trên các nền tảng khác nhau
- Giải pháp: Bảng điều khiển trung tâm với khả năng đăng bài đa nền tảng
- Kết quả: Tiết kiệm 60% thời gian, hiện diện thương hiệu nhất quán
Phân phối nội dung tự động
Một nhà xuất bản tự động chia sẻ bài viết:
- Thách thức: Chia sẻ thủ công nội dung mới
- Giải pháp: Tự động đăng các bài viết mới lên tất cả các nền tảng
- Kết quả: Phân phối tức thì, lưu lượng truy cập mạng xã hội tăng gấp 3 lần
Kết luận
Mặc dù API công khai của Hootsuite đã bị ngừng, các API nền tảng gốc vẫn cung cấp khả năng quản lý mạng xã hội toàn diện. Những điểm chính:
- Triển khai OAuth 2.0 cho từng nền tảng riêng biệt
- Giới hạn tốc độ thay đổi đáng kể tùy theo nền tảng
- Đăng bài hợp nhất yêu cầu triển khai riêng cho từng nền tảng
- Tổng hợp phân tích cung cấp thông tin chi tiết đa nền tảng
- Apidog giúp hợp lý hóa việc kiểm thử API và hợp tác nhóm
Phần Câu hỏi thường gặp
Hootsuite còn có API không?
Hootsuite đã ngừng cung cấp API công khai của họ vào năm 2024. Hãy sử dụng các API nền tảng gốc hoặc các nền tảng quản lý thay thế như Buffer, Sprout Social hoặc Agorapulse.
Làm cách nào để đăng bài lên nhiều nền tảng cùng lúc?
Triển khai OAuth cho từng nền tảng và tạo một hàm đăng bài hợp nhất gọi API của từng nền tảng song song.
Giới hạn tốc độ cho API mạng xã hội là gì?
Các giới hạn khác nhau: Facebook (200/giờ), Twitter (300/15 phút), LinkedIn (100-500/ngày), Instagram (200/giờ).
Làm cách nào để lên lịch bài đăng?
Lưu trữ bài đăng vào cơ sở dữ liệu với scheduled_time, sau đó sử dụng hàng đợi công việc (Bull, Agenda) để xuất bản vào thời điểm đã lên lịch.
Tôi có thể nhận phân tích từ tất cả các nền tảng không?
Có, mỗi nền tảng cung cấp API phân tích riêng. Hãy tổng hợp dữ liệu để có báo cáo đa nền tảng.
Top comments (0)