DEV Community

Cover image for Hootsuite API Nasıl Kullanılır?
Tobias Hoffmann
Tobias Hoffmann

Posted on • Originally published at apidog.com

Hootsuite API Nasıl Kullanılır?

TL;DR

Hootsuite API, geliştiricilerin sosyal medya yönetim iş akışlarını programlı olarak entegre etmelerini sağlar. OAuth 2.0 kimlik doğrulamasını, profiller, gönderiler, analizler ve ekip yönetimi için RESTful uç noktalarını kullanır ve plana bağlı olarak dakikada 50-200 istek hız sınırlamalarına sahiptir. Bu kılavuz, kimlik doğrulama kurulumunu, gönderi planlamasını, analiz almayı, ekip yönetimini ve üretim entegrasyon stratejilerini kapsar.

Not: Hootsuite, 2024 itibarıyla genel API'sini kullanımdan kaldırmıştır. Bu kılavuz, Hootsuite'in iş ortağı entegrasyonları, webhook'lar ve benzer işlevsellik sağlayan üçüncü taraf sosyal medya yönetim API'leri dahil olmak üzere alternatif yaklaşımları kapsar.

Apidog'u hemen deneyin

Giriş

Hootsuite, 175'ten fazla ülkede 200.000'den fazla işletme için 30 milyondan fazla sosyal medya hesabını yönetmektedir. Sosyal medya araçları, pazarlama platformları veya analiz panoları oluşturan geliştiriciler için, bu devasa iş kitlesine ulaşmak amacıyla sosyal medya API entegrasyonu elzemdir.

Gerçek şu ki: 20'den fazla hesabı yöneten sosyal medya yöneticileri, manuel gönderim, etkileşim takibi ve rapor oluşturma için haftada 25-35 saat kaybediyor. Sağlam bir sosyal medya API entegrasyonu, içerik dağıtımını, etkileşim izlemeyi, duygu analizini ve performans raporlamasını otomatikleştirir.

Hootsuite API Durumu ve Alternatifler

Mevcut API Durumu

2024 itibarıyla Hootsuite, genel API'sini kullanımdan kaldırdı. Entegrasyon için aşağıdaki yaklaşımları değerlendirebilirsiniz:

Yaklaşım Açıklama En İyi Kullanım Alanı
Yerel Platform API'leri Facebook, Twitter, LinkedIn vb. ile doğrudan entegrasyon. Tam kontrol, özel çözümler
Audiense Hootsuite'e ait hedef kitle zekası Hedef kitle analizi
HeyOrca Sosyal medya planlama API'si İçerik takvimleri
Buffer API Sosyal medya yönetimi Küçük ekipler
Sprout Social API Kurumsal sosyal medya yönetimi Büyük kuruluşlar
Agorapulse API Sosyal medya CRM'i Topluluk yönetimi

Önerilen Yaklaşım: Yerel Platform API'leri

Çoğu kullanım için, sosyal medya platformlarının kendi API'leriyle doğrudan entegrasyon en fazla esnekliği sağlar:

Platform API Adı Temel Özellikler
Facebook/Instagram Graph API Gönderiler, istatistikler, yorumlar
Twitter/X API v2 Tweetler, analizler, akışlar
LinkedIn Pazarlama API'si Gönderiler, şirket sayfaları, reklamlar
Pinterest API v5 Pinler, panolar, analizler
TikTok Display API Videolar, kullanıcı bilgileri
YouTube Data API Videolar, oynatma listeleri, analizler

Başlarken: Çoklu Platform Kimlik Doğrulaması

Adım 1: Geliştirici Uygulamalarını Kaydedin

Her sosyal medya platformu için geliştirici uygulamaları oluşturun ve kimlik bilgilerini güvenli şekilde saklayın:

// Kimlik bilgilerini güvenli bir şekilde saklayı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, // Facebook Girişi kullanır
    appSecret: process.env.FB_APP_SECRET
  }
};
Enter fullscreen mode Exit fullscreen mode

Adım 2: OAuth 2.0 Akışını Uygulayın

Birden fazla platform için birleşik OAuth işleyicisi kurun:

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

// OAuth geri çağrısını işleyin
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

Adım 3: Tokenleri Güvenli Bir Şekilde Saklayın

Tokenleri şifreleyerek veritabanında saklayın:

// Sosyal tokenler için veritabanı şeması
const SocialToken = {
  userId: 'user_123',
  platform: 'facebook',
  accessToken: 'encrypted_token_here',
  refreshToken: 'encrypted_refresh_token',
  tokenExpiry: Date.now() + 5183999, // 60 gün
  scopes: ['pages_manage_posts', 'pages_read_engagement'],
  pageId: 'page_456', // Facebook/Instagram için
  pageName: 'My Business Page'
};
Enter fullscreen mode Exit fullscreen mode

Gönderi Planlama ve Yayınlama

Çoklu Platform Gönderisi Oluşturma

Aşağıdaki fonksiyon ile birden fazla platformda aynı anda paylaşım yapabilirsiniz:

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

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

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

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

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

  return results;
};

// Facebook gönderimi
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();
};

// Twitter gönderimi
const postToTwitter = async (postData) => {
  const token = await getTwitterToken();

  let mediaIds = [];
  if (postData.media) {
    // Önce medyayı yükleyin
    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();
};

// LinkedIn gönderimi
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();
};

// Instagram gönderimi
const postToInstagram = async (postData) => {
  const token = await getInstagramToken();

  // Adım 1: Medya kapsayıcısı oluştur
  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();

  // Adım 2: Yayınla
  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

Gönderi Planlama

Planlanmış gönderileri iş kuyruğu ile otomatik olarak paylaşmak için:

const schedulePost = async (postData, scheduledTime) => {
  // Daha sonraki yürütme için veritabanına kaydet
  const scheduledPost = await db.scheduledPosts.create({
    message: postData.message,
    platforms: postData.platforms,
    scheduledTime: scheduledTime,
    status: 'pending',
    media: postData.media,
    link: postData.link
  });

  // İş kuyruğunu ayarla
  await jobQueue.add('publish-social-post', {
    postId: scheduledPost.id
  }, {
    delay: scheduledTime - Date.now()
  });

  return scheduledPost;
};

// İş işlemcisi
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

Analiz ve Raporlama

Platformlar Arası Analizleri Getirme

Tüm sosyal medya platformlarından metrikleri çekip birleştirmek için örnek kod:

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

  // Metrikleri birleştir
  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 };
};

// Facebook İstatistikleri
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();
};

// Twitter Analizleri
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();
};

// LinkedIn Analizleri
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();
};

// Instagram İstatistikleri
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

Ekip Yönetimi

Rol Tabanlı Erişim Kontrolü

Aşağıdaki kod, farklı ekip rollerine göre izinleri kontrol etmenizi sağlar:

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

Hız Sınırlama

Platform Hız Sınırları

Platform Sınır Pencere
Facebook Graph 200 çağrı Kullanıcı başına saatlik
Twitter API v2 300 tweet 15 dakikada bir
LinkedIn 100-500 çağrı Günlük
Instagram 200 çağrı Saatlik

Hız Sınırlama İşlemlerini Uygulama

Aşağıdaki sınıf ile istek hızınızı yönetebilirsiniz:

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

Üretim Ortamına Dağıtım Kontrol Listesi

Canlıya geçmeden önce aşağıdaki kontrol listesini uygulayın:

  • [ ] Tüm platformlar için OAuth 2.0 uygulayın
  • [ ] Tokenleri şifreleme ile güvenli bir şekilde saklayın
  • [ ] Otomatik token yenilemeyi ayarlayın
  • [ ] Her platform için hız sınırlaması uygulayın
  • [ ] Kapsamlı hata işlemeyi ekleyin
  • [ ] Tüm API çağrıları için günlük kaydı ayarlayın
  • [ ] Gönderi onay iş akışları oluşturun
  • [ ] İçerik denetimi uygulayın
  • [ ] Analiz birleştirmeyi ayarlayın
  • [ ] Yedek gönderim mekanizmaları oluşturun

Gerçek Dünya Kullanım Durumları

Sosyal Medya Panosu

Bir pazarlama ajansı birleşik bir pano oluşturdu:

  • Zorluk: Platformlarda 50'den fazla müşteri hesabını yönetme
  • Çözüm: Çoklu platform gönderimi olan merkezi pano
  • Sonuç: %60 zaman tasarrufu, tutarlı marka varlığı

Otomatik İçerik Dağıtımı

Bir yayıncı makale paylaşımını otomatikleştirdi:

  • Zorluk: Yeni içeriğin manuel olarak paylaşılması
  • Çözüm: Yeni makaleleri tüm platformlara otomatik olarak gönder
  • Sonuç: Anında dağıtım, 3 kat sosyal trafik

Sonuç

Hootsuite'in genel API'si kullanımdan kaldırılmış olsa da, yerel platform API'leri kapsamlı sosyal medya yönetimi yetenekleri sunar. Temel çıkarımlar:

  • Her platform için OAuth 2.0'ı ayrı ayrı uygulayın
  • Hız sınırları platforma göre önemli ölçüde değişir
  • Birleşik gönderim, platforma özel uygulamalar gerektirir
  • Analiz birleştirme, platformlar arası içgörüler sağlar
  • Apidog, API testini ve ekip işbirliğini kolaylaştırır

SSS Bölümü

Hootsuite'in hala bir API'si var mı?

Hootsuite, 2024 yılında genel API'sini kullanımdan kaldırdı. Yerel platform API'lerini veya Buffer, Sprout Social veya Agorapulse gibi alternatif yönetim platformlarını kullanın.

Birden fazla platforma aynı anda nasıl gönderi yaparım?

Her platform için OAuth uygulayın ve her platformun API'sini paralel olarak çağıran bir birleşik gönderi işlevi oluşturun.

Sosyal medya API'leri için hız sınırları nelerdir?

Sınırlar değişir: Facebook (200/saat), Twitter (300/15dk), LinkedIn (100-500/gün), Instagram (200/saat).

Gönderileri nasıl planlarım?

Gönderileri scheduled_time ile bir veritabanında saklayın, ardından planlanan zamanda yayınlamak için bir iş kuyruğu (Bull, Agenda) kullanın.

Tüm platformlardan analiz alabilir miyim?

Evet, her platform analiz API'leri sağlar. Platformlar arası raporlama için verileri birleştirin.

Top comments (0)