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.
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ırmıştır. Entegrasyon seçenekleri:
| 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 durumu için, sosyal platformlarla 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 |
| Pazarlama API'si | Gönderiler, şirket sayfaları, reklamlar | |
| 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 platform için geliştirici hesapları oluşturun:
// 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
}
};
Adım 2: OAuth 2.0 Akışını Uygulayın
Birden fazla platform için birleştirilmiş OAuth işleyicisi:
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();
};
Adım 3: Tokenleri Güvenli Bir Şekilde 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'
};
Gönderi Planlama ve Yayınlama
Çoklu Platform Gönderisi Oluşturma
Birden fazla platformda aynı anda yayınlayın:
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();
};
Gönderi Planlama
Gönderi planlamasını uygulayın:
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;
}
});
Analiz ve Raporlama
Platformlar Arası Analizleri Getirme
Tüm platformlardan metrikleri birleştirin:
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);
}
Ekip Yönetimi
Rol Tabanlı Erişim Kontrolü
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);
};
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 |
| 100-500 çağrı | Günlük | |
| 200 çağrı | Saatlik |
Hız Sınırlama İşlemlerini Uygulama
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++;
}
}
Üretim Ortamına Dağıtım Kontrol Listesi
Canlıya geçmeden önce:
- [ ] 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şturur:
- 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ştirir:
- 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.
