DEV Community

Cover image for Hootsuite API の使い方
Akira
Akira

Posted on • Originally published at apidog.com

Hootsuite API の使い方

要約

Hootsuite APIは、開発者によるソーシャルメディア管理ワークフローの自動化と統合に役立つものでした。OAuth 2.0認証、プロフィール、投稿、分析、チーム管理用のRESTfulエンドポイントを備え、プランごとに1分あたり50〜200リクエストのレート制限が設けられていました。本記事では、認証設定、投稿スケジュール、分析取得、チーム管理、本番環境への統合まで、開発者が実装するための具体的なステップを解説します。

注意: Hootsuiteは2024年にパブリックAPIを廃止しました。本記事では、Hootsuiteパートナー連携、Webhook、または同様の機能を持つサードパーティソーシャルメディア管理APIなど、代替アプローチも紹介します。

Apidogを今すぐ試す

はじめに

Hootsuiteは、世界175カ国以上で20万社超・3,000万以上のソーシャルメディアアカウントを管理しています。開発者としてソーシャルメディアツールや分析ダッシュボードを構築する場合、API統合は不可欠です。

現場の担当者は手作業で週25〜35時間も投稿やエンゲージメント追跡、レポート作成に費やしています。API統合により、コンテンツ配信やエンゲージメント監視、分析、レポーティングを自動化できます。

Hootsuite APIの現状と代替手段

現在のAPI状況

2024年以降、HootsuiteのパブリックAPIは廃止されました。実装可能な選択肢は以下のとおりです。

アプローチ 説明 最適
ネイティブプラットフォームAPI Facebook/Twitter/LinkedIn等へ直接API統合 完全な制御、カスタム
Audiense オーディエンスインテリジェンス(Hootsuite傘下) オーディエンス分析
HeyOrca ソーシャルスケジューリングAPI コンテンツカレンダー
Buffer API ソーシャル管理 小規模チーム
Sprout Social API エンタープライズ管理 大規模組織
Agorapulse API ソーシャルCRM コミュニティ管理

推奨アプローチ: ネイティブプラットフォームAPI

ほとんどのユースケースでは、各ソーシャルプラットフォームの公式APIを直接利用するのが最も柔軟です。

プラットフォーム API名 主要機能
Facebook/Instagram Graph API 投稿、インサイト、コメント
Twitter/X API v2 ツイート、分析、ストリーム
LinkedIn Marketing API 投稿、企業ページ、広告
Pinterest API v5 ピン、ボード、分析
TikTok Display API 動画、ユーザー情報
YouTube Data API 動画、プレイリスト、分析

開始する: マルチプラットフォーム認証

ステップ1: 開発者アプリの登録

各プラットフォームで開発者アカウントを作成し、APIキーやシークレットを安全に格納します。

// Store credentials securely
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, // Uses Facebook Login
    appSecret: process.env.FB_APP_SECRET
  }
};
Enter fullscreen mode Exit fullscreen mode

ステップ2: OAuth 2.0フローの実装

多数プラットフォーム対応のOAuth認証URL生成・コールバック処理例:

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()}`;
};

// Handle OAuth callback
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

ステップ3: トークンを安全に保存する

// Database schema for social tokens
const SocialToken = {
  userId: 'user_123',
  platform: 'facebook',
  accessToken: 'encrypted_token_here',
  refreshToken: 'encrypted_refresh_token',
  tokenExpiry: Date.now() + 5183999, // 60 days
  scopes: ['pages_manage_posts', 'pages_read_engagement'],
  pageId: 'page_456', // For Facebook/Instagram
  pageName: 'My Business Page'
};
Enter fullscreen mode Exit fullscreen mode

投稿のスケジュールと公開

マルチプラットフォーム投稿の作成

複数プラットフォームへの同時投稿実装例:

const createSocialPost = async (postData) => {
  const results = {};

  // Facebook Page Post
  if (postData.platforms.includes('facebook')) {
    results.facebook = await postToFacebook({
      pageId: postData.facebookPageId,
      message: postData.message,
      link: postData.link,
      photo: postData.photo
    });
  }

  // Twitter Post
  if (postData.platforms.includes('twitter')) {
    results.twitter = await postToTwitter({
      text: postData.message,
      media: postData.photo
    });
  }

  // LinkedIn Post
  if (postData.platforms.includes('linkedin')) {
    results.linkedin = await postToLinkedIn({
      authorUrn: postData.linkedinAuthorUrn,
      text: postData.message,
      contentUrl: postData.link
    });
  }

  // Instagram Post
  if (postData.platforms.includes('instagram')) {
    results.instagram = await postToInstagram({
      igAccountId: postData.igAccountId,
      imageUrl: postData.photo,
      caption: postData.message
    });
  }

  return results;
};
Enter fullscreen mode Exit fullscreen mode

各プラットフォームへの投稿関数例(Facebook/Twitter/LinkedIn/Instagram)も上記の通り実装できます。

投稿のスケジュール設定

ジョブキューを使ったスケジューリング例:

const schedulePost = async (postData, scheduledTime) => {
  // Store in database for later execution
  const scheduledPost = await db.scheduledPosts.create({
    message: postData.message,
    platforms: postData.platforms,
    scheduledTime: scheduledTime,
    status: 'pending',
    media: postData.media,
    link: postData.link
  });

  // Set up job queue
  await jobQueue.add('publish-social-post', {
    postId: scheduledPost.id
  }, {
    delay: scheduledTime - Date.now()
  });

  return scheduledPost;
};

// Job processor
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

分析とレポート

クロスプラットフォーム分析の取得

各プラットフォームの分析データをAPIで取得し、集計します。

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)
  };

  // Aggregate metrics
  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 };
};
Enter fullscreen mode Exit fullscreen mode

各API呼び出し例も記載の通り実装可能です。

チーム管理

ロールベースのアクセス制御

ロール・権限管理の例:

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

レート制限

プラットフォームのレート制限

プラットフォーム 制限 期間
Facebook Graph 200コール ユーザーごと1時間あたり
Twitter API v2 300ツイート 15分あたり
LinkedIn 100-500コール 1日あたり
Instagram 200コール 1時間あたり

レート制限処理の実装

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

本番環境展開チェックリスト

公開前の実装チェック:

  • [ ] すべてのプラットフォームでOAuth 2.0を実装する
  • [ ] トークンを暗号化して安全に保存する
  • [ ] 自動トークン更新を設定する
  • [ ] プラットフォームごとにレート制限を実装する
  • [ ] 包括的なエラー処理を追加する
  • [ ] すべてのAPI呼び出しのロギングを設定する
  • [ ] 投稿承認ワークフローを作成する
  • [ ] コンテンツモデレーションを実装する
  • [ ] 分析集計を設定する
  • [ ] バックアップ投稿メカニズムを作成する

実世界のユースケース

ソーシャルメディアダッシュボード

課題: 50以上のクライアントアカウントを複数プラットフォームで管理

解決策: マルチプラットフォーム投稿機能付きの中央ダッシュボード

結果: 60%の工数削減とブランド一貫性の向上

自動コンテンツ配信

課題: 記事の手動共有

解決策: 新着コンテンツを自動で全プラットフォームに投稿

結果: 配信即時化、ソーシャルトラフィック3倍

結論

HootsuiteのパブリックAPI廃止後も、ネイティブAPIで各種ソーシャルメディア管理業務は自動化可能です。

  • 各プラットフォームでOAuth 2.0実装
  • レート制限はプラットフォームごとに異なる
  • 投稿機能はプラットフォームごとに分岐実装が必要
  • 分析集計でクロスプラットフォームのインサイト取得
  • Apidog はAPIテスト・チームコラボレーションを効率化

FAQ (よくある質問)

HootsuiteにはまだAPIがありますか?

Hootsuiteは2024年にパブリックAPIを廃止しました。ネイティブプラットフォームAPIやBuffer/Sprout Social/Agorapulseなどの代替管理プラットフォームを利用してください。

複数のプラットフォームに同時に投稿するにはどうすればよいですか?

各プラットフォームのOAuthを実装し、各APIを並列に呼び出す統一投稿機能を作成します。

ソーシャルメディアAPIのレート制限はどのくらいですか?

Facebook (1時間あたり200回)、Twitter (15分あたり300ツイート)、LinkedIn (1日あたり100-500回)、Instagram (1時間あたり200回) など、プラットフォームごとに異なります。

投稿をスケジュールするにはどうすればよいですか?

scheduled_timeを持つ投稿をDBに保存し、ジョブキュー (Bull, Agenda等) で指定時刻に自動投稿します。

すべてのプラットフォームから分析データを取得できますか?

はい、各プラットフォームの分析APIからデータを取得し、集計してレポート作成が可能です。

Top comments (0)