Instagram API 允许开发者通过编程方式访问 Instagram 平台的数据和功能。构建一个基于标签和用户的媒体查看器主要涉及 Instagram Graph API,这是 Facebook 提供的官方 API。
Instagram 提供两种主要 API:
首先需要在 Facebook 开发者平台创建应用并获取 API 访问权限。
// 示例:OAuth 认证流程
const express = require('express');
const axios = require('axios');
const app = express();
const INSTAGRAM_APP_ID = 'your-app-id';
const INSTAGRAM_APP_SECRET = 'your-app-secret';
const REDIRECT_URI = 'https://yourdomain.com/auth/instagram/callback';
app.get('/auth/instagram', (req, res) => {
const authUrl = `https://api.instagram.com/oauth/authorize?client_id=${INSTAGRAM_APP_ID}&redirect_uri=${REDIRECT_URI}&scope=user_profile,user_media&response_type=code`;
res.redirect(authUrl);
});
app.get('/auth/instagram/callback', async (req, res) => {
const { code } = req.query;
try {
const response = await axios.post('https://api.instagram.com/oauth/access_token', {
client_id: INSTAGRAM_APP_ID,
client_secret: INSTAGRAM_APP_SECRET,
grant_type: 'authorization_code',
redirect_uri: REDIRECT_URI,
code
});
const accessToken = response.data.access_token;
// 存储 accessToken 用于后续 API 调用
res.send('认证成功!');
} catch (error) {
res.send('认证失败');
}
});
app.listen(3000);
// 获取用户最近发布的媒体
async function getUserMedia(userId, accessToken) {
try {
const response = await axios.get(`https://graph.instagram.com/${userId}/media`, {
params: {
access_token: accessToken,
fields: 'id,caption,media_type,media_url,permalink,timestamp'
}
});
return response.data.data;
} catch (error) {
console.error('获取用户媒体失败:', error);
return [];
}
}
// 通过标签搜索帖子 (需要 Instagram Business 或 Creator 账户)
async function getMediaByHashtag(hashtag, accessToken) {
try {
// 首先获取标签ID
const tagResponse = await axios.get(`https://graph.facebook.com/v12.0/ig_hashtag_search`, {
params: {
user_id: 'your-instagram-business-id',
q: hashtag,
access_token: accessToken
}
});
const tagId = tagResponse.data.data[0].id;
// 然后获取该标签下的最新媒体
const mediaResponse = await axios.get(`https://graph.facebook.com/v12.0/${tagId}/recent_media`, {
params: {
user_id: 'your-instagram-business-id',
fields: 'id,caption,media_type,media_url,permalink,timestamp',
access_token: accessToken
}
});
return mediaResponse.data.data;
} catch (error) {
console.error('通过标签获取媒体失败:', error);
return [];
}
}
<!-- 简单的媒体查看器HTML结构 -->
<div class="media-viewer">
<div class="filter-controls">
<input type="text" id="username" placeholder="输入用户名">
<input type="text" id="hashtag" placeholder="输入标签">
<button id="search-btn">搜索</button>
</div>
<div class="media-grid" id="media-container">
<!-- 媒体内容将在这里动态加载 -->
</div>
</div>
<style>
.media-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 15px;
padding: 20px;
}
.media-item {
border: 1px solid #ddd;
border-radius: 8px;
overflow: hidden;
}
.media-item img {
width: 100%;
height: auto;
}
.media-caption {
padding: 10px;
font-size: 14px;
}
</style>
<script>
document.getElementById('search-btn').addEventListener('click', async () => {
const username = document.getElementById('username').value;
const hashtag = document.getElementById('hashtag').value;
let media = [];
if (username) {
media = await fetchUserMedia(username);
} else if (hashtag) {
media = await fetchHashtagMedia(hashtag);
}
renderMedia(media);
});
function renderMedia(mediaItems) {
const container = document.getElementById('media-container');
container.innerHTML = '';
mediaItems.forEach(item => {
const mediaElement = document.createElement('div');
mediaElement.className = 'media-item';
if (item.media_type === 'IMAGE' || item.media_type === 'CAROUSEL_ALBUM') {
mediaElement.innerHTML = `
<img src="${item.media_url}" alt="${item.caption || 'Instagram 图片'}">
<div class="media-caption">${item.caption || ''}</div>
`;
} else if (item.media_type === 'VIDEO') {
mediaElement.innerHTML = `
<video controls width="100%">
<source src="${item.media_url}" type="video/mp4">
</video>
<div class="media-caption">${item.caption || ''}</div>
`;
}
container.appendChild(mediaElement);
});
}
</script>
问题:Instagram API 有严格的调用频率限制(大约 200次/小时)。
解决方案:
问题:OAuth 认证流程失败或 access token 过期。
解决方案:
// 刷新 access token 示例
async function refreshAccessToken(accessToken) {
try {
const response = await axios.get('https://graph.instagram.com/refresh_access_token', {
params: {
grant_type: 'ig_refresh_token',
access_token: accessToken
}
});
return response.data.access_token;
} catch (error) {
console.error('刷新 token 失败:', error);
return null;
}
}
问题:某些字段返回 null 或缺失。
解决方案:
通过以上步骤和代码示例,您可以构建一个功能完整的 Instagram 媒体查看器,能够按用户和标签筛选并展示帖子。
没有搜到相关的文章