DEV Community

Cover image for Cách Sử Dụng Hootsuite API Hiệu Quả
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Cách Sử Dụng Hootsuite API Hiệu Quả

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ự.

Dùng thử Apidog ngay hôm nay

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
LinkedIn Marketing API Bài đăng, trang công ty, quảng cáo
Pinterest 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
  }
};
Enter fullscreen mode Exit fullscreen mode

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();
};
Enter fullscreen mode Exit fullscreen mode

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'
};
Enter fullscreen mode Exit fullscreen mode

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();
};
Enter fullscreen mode Exit fullscreen mode

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;
  }
});
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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);
};
Enter fullscreen mode Exit fullscreen mode

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
LinkedIn 100-500 cuộc gọi Mỗi ngày
Instagram 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++;
  }
}
Enter fullscreen mode Exit fullscreen mode

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)