인스타그램 그래프 API는 비즈니스와 크리에이터가 앱에서 인스타그램의 프레젠스를 관리하도록 지원한다. 고객에게 게시물 댓글에 답글 달기, 인사이트 분석, 해시태그로 검색 등의 기능을 지원한다
인스타그램 프로페셔널 계정- 인스타그램 비즈니스 및 크리에이터 계정의 소유주
instagram_basic
: 인스타그램 걔정 프로필 정보와 미디어를 읽도록 허용한다instagram_content_publish
: 사용자를 대신하여 일반 피드 사진과 동영상 게시물을 만들도록 허용한다instagram_manage_comments
: 사용자 대신 댓글을 작성하고 삭제하고 숨기도록 허용한다.instagram_manage_insights
: 앱이 페이스북 페이지에 연결된 인스타그램 계정의 인사이트에 접근할 수 있도록 허용한다pages_show_list
: 앱이 사용자가 관리하는 페이지의 리스트를 액세스하도록 허용한다. 사용자에게 관리하는 페이지의 리스트를 보여주고 사용자가 페이지를 관리함을 인증하는 것이다.pages_read_engagement
: 페이지가 게시한 콘텐츠를 읽고, 팔로워의 데이터, 프로필 사진, 메타 데이터 및 페이지에 대한 기타 인사이트를 읽을 수 있다웹사이트에 내 인스타그램 가져오기 (20-11-08 업데이트) instagram api
이 블로그에 인스타그램 프로페셔널 계정으로 전환 및 페이스북 페이지랑 연결하는 방법에 대해서 아주 잘 작성되어 있다.
다른 인스타그램 비즈니스 사용자나 크리에이터에 대한 기본적인 메타데이터를를 가져와서 사용할 수 있다.
엔드포인트
GET /{ig-user-id}/business_discovery
사례
요청 예시
curl -i -X GET \
"https://graph.facebook.com/v3.2/17841405309211844?fields=business_discovery.username(bluebottle){followers_count,media_count,media{comments_count,like_count}}&access_token={access-token}"
응답
{
"business_discovery": {
"followers_count": 267793,
"media_count": 1205,
"media": {
"data": [
{
"comments_count": 50,
"like_count": 5841,
"id": "17858843269216389"
},
//...생략...
{
"comments_count": 15,
"like_count": 3895,
"id": "17856337633208377"
},
],
},
"id": "17841401441775531"
},
"id": "17841405976406927"
}
Instagram 그래프 API를 사용하여 Instagram Business 계정에 단일 이미지 또는 동영상(단일 미디어 게시물)을 게시하거나, 여러 이미지와 동영상을 포함한 게시물(슬라이드 게시물)을 게시할 수 있다
제한 사항
엔드포인트
POST /{ig-user-id}/media
— 미디어를 업로드하고 미디어 컨테이너를 만든다POST /{ig-user-id}/media_publish
— 미디어 컨테이너를 사용하여 업로드된 미디어를 게시한다GET /{ig-container-id}?fields=status_code
— 미디어 컨테이너 게시 자격 요건과 상태를 확인한다GET /{ig-user-id}/content_publishing_limit
— 앱 사용자의 현재 게시 사용 제한 사용량을 확인한다단일 미디어 게시물
단일 이미지 또는 동영상 게시물을 게시하는 절차는 2단계로 구성됩니다.
[POST /{ig-user-id}/media](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media#creating)
엔드포인트를 사용하여 공개 서버에서 호스팅되는 이미지 또는 동영상에서 컨테이너를 만듭니다.
요청
POST https://graph.facebook.com/v13.0/17841400008460056/media
?image_url=https//www.example.com/images/bronz-fonz.jpg
&caption=%23BronzFonz
응답
{
"id": "17889455560051444" // IG Container ID
}
[POST /{ig-user-id}/media_publish](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media_publish#creating)
엔드포인트를 사용하여 컨테이너를 게시합니다.
요청
POST https://graph.facebook.com/v13.0/17841400008460056/media_publish ?creation_id=17889455560051444
응답
{
"id": "17920238422030506" // IG Media ID
}
슬라이드 게시물
단일 게시물(슬라이드 게시물)에 이미지, 동영상 또는 그 두 가지의 조합을 최대 10개까지 게시할 수 있습니다. 슬라이드 게시는 3단계 절차로 구성됩니다.
[POST /{ig-user-id}/media](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media#creating)
엔드포인트를 사용하여 슬라이드에 표시할 각 이미지와 동영상에 대해 개별적인 항목 컨테이너를 만듭니다.
매개변수
다음의 매개변수는 필수입니다. 추가적으로 지원되는 매개변수는 [POST /{ig-user-id}/media](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media#creating)
엔드포인트 참고 자료를 참조하세요.
is_carousel_item
— true
로 설정합니다. 슬라이드에 표시할 이미지 또는 동영상을 나타냅니다.image_url
— (이미지 전용) 이미지에 대한 경로입니다. 전달된 URL을 사용하여 이미지에 cURL을 실행하므로 URL은 공용 서버에 있어야 합니다.media_type
— (동영상 전용) VIDEO
로 설정합니다. 미디어가 동영상임을 나타냅니다.video_url
— (동영상 전용) 동영상에 대한 경로입니다. 전달된 URL을 사용하여 동영상에 cURL을 실행하므로 URL은 공용 서버에 있어야 합니다.요청
curl -i -X POST \
"https://graph.facebook.com/v13.0/90010177253934/media?image_url=https%3A%2F%2Fsol...&is_carousel_item=true&access_token=EAAOc..."
응답
{
"id": "17899506308402767"
}
다시 [POST /{ig-user-id}/media](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media#creating)
엔드포인트를 사용하여 항목에 대해 단일 슬라이드 컨테이너를 만듭니다.
매개변수
다음의 매개변수는 필수입니다. 추가적으로 지원되는 매개변수는 [POST /{ig-user-id}/media](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media#creating)
엔드포인트 참고 자료를 참조하세요.
media_type
— CAROUSEL
로 설정합니다. 컨테이너가 슬라이드임을 나타냅니다.children
— 게시된 슬라이드에 표시해야 하는 각 이미지와 동영상의 컨테이너 ID(최대 10개)로 구성된 배열입니다. 슬라이드는 이미지, 동영상 또는 그 두 가지의 조합을 모두 합쳐 최대 10개까지 포함할 수 있습니다.요청
curl -i -X POST \
"https://graph.facebook.com/v13.0/90010177253934/media?image_url=https%3A%2F%2Fsol...&is_carousel_item=true&access_token=EAAOc..."
응답
{
"id": "18000748627392977"
}
[POST /{ig-user-id}/media_publish](https://developers.facebook.com/docs/instagram-api/reference/ig-user/media_publish#creating)
엔드포인트를 사용하여 슬라이드 컨테이너를 게시합니다.
creation_id
— 슬라이드 컨테이너 ID입니다.
요청
curl -i -X POST \
"https://graph.facebook.com/v13.0/90010177253934/media_publish?creation_id=18000748627392977&access_token=EAAOc..."
응답
{
"id": "90010778390276"
}
사용 제한 사용량 확인
요청 샘플
GET graph.facebook.com/17841400008460056/content_publishing_limit
응답 샘플
{
"data": [
{
"quota_usage": 2
}
]
}
엔드포인트
API는 다음과 같은 엔드포인트로 구성됩니다. 매개변수 및 권한 요구 사항에 대한 내용은 각 엔드포인트 참고 자료 문서를 참조하세요.
[GET /{ig-media-id}/comments](https://developers.facebook.com/docs/instagram-api/reference/ig-media/comments#reading)
— IG 미디어에 대한 댓글 가져오기[GET /{ig-comment-id}/replies](https://developers.facebook.com/docs/instagram-api/reference/ig-comment/replies#read)
— IG 댓글에 대한 답글 가져오기[POST /{ig-comment-id}/replies](https://developers.facebook.com/docs/instagram-api/reference/ig-comment/replies#create)
— IG 댓글에 답글 달기[POST /{ig-comment-id}](https://developers.facebook.com/docs/instagram-api/reference/ig-comment#update)
— IG 댓글 숨기기/표시하기[POST /{ig-media-id}](https://developers.facebook.com/docs/instagram-api/reference/ig-media#update)
— IG 미디어에 대한 댓글 비활성화/활성화[DELETE /{ig-comment-id}](https://developers.facebook.com/docs/instagram-api/reference/ig-comment#delete)
— IG 댓글 삭제엔드포인트
해시태그 검색 API는 다음과 같은 노드 및 에지로 구성됩니다.
[GET /ig_hashtag_search](https://developers.facebook.com/docs/instagram-api/reference/ig-hashtag-search#reading)
— 특정 해시태그의 노드 ID 가져오기[GET /{ig-hashtag-id}](https://developers.facebook.com/docs/instagram-api/reference/ig-hashtag#reading)
— 해시태그에 대한 데이터 가져오기[GET /{ig-hashtag-id}/top_media](https://developers.facebook.com/docs/instagram-api/reference/ig-hashtag/top-media#reading)
— 특정 해시태그가 있는 가장 인기 있는 사진과 동영상 가져오기[GET /{ig-hashtag-id}/recent_media](https://developers.facebook.com/docs/instagram-api/reference/ig-hashtag/recent-media#reading)
— 특정 해시태그가 있는 가장 최근에 게시된 사진과 동영상 가져오기[GET /{ig-user-id}/recently_searched_hashtags](https://developers.facebook.com/docs/instagram-api/reference/ig-user/recently_searched_hashtags)
— Instagram 비즈니스 또는 크리에이터 계정이 이번 주에 검색한 고유한 해시태그 확인엔드포인트
API는 다음과 같은 엔드포인트로 구성됩니다.
[GET /{ig-media-id}/insights](https://developers.facebook.com/docs/instagram-api/reference/ig-media/insights)
— 미디어 개체에 대한 지표 가져오기[GET /{ig-user-id}/insights](https://developers.facebook.com/docs/instagram-api/reference/ig-user/insights)
— Instagram 비즈니스 계정 또는 Instagram 크리에이터 계정에 대한 지표 가져오기엔드포인트
API는 다음과 같은 엔드포인트로 구성됩니다.
[GET /{ig-user-id}/tags](https://developers.facebook.com/docs/instagram-api/reference/ig-user/tags)
— 비즈니스 또는 크리에이터 계정이 태그된 미디어 개체 가져오기[GET /{ig-user-id}?fields=mentioned_comment](https://developers.facebook.com/docs/instagram-api/reference/ig-user/mentioned_comment#reading)
— 비즈니스 또는 크리에이터 계정이 @언급된 댓글에 대한 데이터 가져오기[GET /{ig-user-id}?fields=mentioned_media](https://developers.facebook.com/docs/instagram-api/reference/ig-user/mentioned_media#reading)
— 비즈니스 또는 크리에이터 계정이 캡션에 @언급된 미디어 개체에 대한 데이터 가져오기[POST /{ig-user-id}/mentions](https://developers.facebook.com/docs/instagram-api/reference/ig-user/mentions#creating)
— 다른 Instagram 사용자가 비즈니스 또는 크리에이터 계정을 @언급한 댓글이나 미디어 개체 캡션에 답글 달기Instagram 기본 디스플레이 API를 사용하면 앱 사용자는 자신의 Instagram 계정에서 기본 프로필 정보, 사진 및 동영상을 가져올 수 있다. 이 API는 모든 유형의 Instagram 계정에 액세스하는 데 사용할 수 있지만 기본 데이터에 대한 읽기 액세스만 제공한다.
인증 받기
매개변수
client_id
- 앱 대시보드→ 제품→ Instagram→ 기본 디스플레이에 표시된 Instagram 앱 ID이다.redirect_uri
- 사용자가 권한 요처을 허용하거나 거부한 후 사용자를 리디렉션하는 urlscope
- 앱 사용자에게 요청할 권한의 쉼표 또는 url로 인코딩 된 공백으로 구분된 리스트, user_profile
은 필수 항목이다response_type
- 이 값을 code로 설정state
- 각 서버의 상태를 나타내는 값 필수는 아님요청
https://api.instagram.com/oauth/authorize
?client_id={instagram-app-id}
&redirect_uri={redirect-uri}
&scope={scope}
&response_type=code
&state={state} //Optional
성공적인 리디렉션 예시
https://socialsizzle.herokuapp.com/auth/?code=AQBx-hBsH3...#_
코드를 토큰으로 교환
매개변수
client_id
- 앱 대시보드→ 제품→ Instagram→ 기본 디스플레이에 표시된 Instagram 앱 ID이다.client_secret
- 앱 대시보드→ 제품→ Instagram→ 기본 디스플레이에 표시된 앱 시크릿 코드이다code
- 사용자를 redirect_url
로 리디렉션할 때 code 매개변수로 전달한 인증코드이다grant_type
- 이 값을 authorization_code로 설정한다redirect_uri
- 사용자가 인증 창으로 이동할때 페이스북에 전달한 리디렉션 uri이다.요청 샘플
curl -X POST \
https://api.instagram.com/oauth/access_token \
-F client_id=990602627938098 \
-F client_secret=eb8c7... \
-F grant_type=authorization_code \
-F redirect_uri=https://socialsizzle.herokuapp.com/auth/ \
-F code=AQBx-hBsH3...
성공적인 응답 샘플
응답이 성공하면 API는 앱 사용자의 단기 실행 액세스 토큰과 사용자 ID를 포함한 JSON 페이로드를 반환합니다.
{
"access_token": "IGQVJ...",
"user_id": 17841405793187218
}
사용자 프로필 및 미디어
액세스 토큰 및 권한 가져오기
사용자 노드 쿼리
엔드포인트
GET /me?fields={fields}&access_token={access-token}
{fields}는 응답에 포함된 각 미디어에 대해 반환받고자 하는 미디어 필드를 쉼표로 구분하고 또는 ID만 원할 경우 fields매개변수를 완전히 생략한다.
요청 예시
curl -X GET \
'https://graph.instagram.com/me/media?fields=id,caption&access_token=IGQVJ...'
응답 예시
{ "data": [ { "id": "17895695668004550", "caption": "" }, { "id": "17899305451014820", "caption": "" }, { "id": "17896450804038745", "caption": "" }, { "id": "17881042411086627", "caption": "" } ], "paging": { "cursors": { "after": "MTAxN...", "before": "NDMyN..." }, "next": "https://graph.faceb..." } }
밴드 OPEN API를 활용하기 위해 우선 서비스 등록을 한 뒤 액세스 토큰을 발급 받아야 한다.
특정 밴드의 글 목록을 조회한다. 글 목록은 최신순으로 정렬되어 제공된다.
url: [GET][https://openapi.band.us/v2/band/posts](https://openapi.band.us/v2/band/posts)
파라미터
name | type | mandatory | description |
---|---|---|---|
access_token | string | Y | 사용자 인증 접근 토큰 |
band_key | string | Y | 밴드 식별자 |
locale | string | Y | 국가 및 언어 (ex. en_US) |
name | type | description |
---|---|---|
result_code | integer | 결과 코드 (성공:1) |
result_data.paging | object | 페이징에 필요한 파라미터 정보 |
result_data.items | list | 글목록 |
paging
name | type | description |
---|---|---|
previous_params | object | 이전 페이징 호출용 파라미터 정보, 현재 제공되지 않습니다. |
next_params | object | 다음 페이징 호출용 파라미터 정보 |
items
name | type | description |
---|---|---|
content | string | 글 본문 (html 태그가 포함될 경우 이스케이프 처리되어 있습니다.)ex.소환 태그 : <band:refer user_key="abcde">사용자 이름</band:refer> |
author | object | 작성자 정보 |
post_key | string | 글 식별자 |
comment_count | int | 밴드 식별자 |
created_at | long | 글 작성일시 |
photos | list | 사진/동영상 정보로, 동영상은 항상 제일 앞에 노출됩니다. |
emotion_count | int | 감정 아이콘수 |
latest_comments | list | 최근에 글을 남겨진 댓글 |
band_key | string | 밴드 식별자 |
{
"result_code": 1,
"result_data": {
"paging": {
"previous_params": null,
"next_params": {
"after": "AABsFASmeIbSAib8KSzihCBC",
"limit": "20",
"band_key": "bandkeyxxxx"
"access_token": "accsstokenxxxx"
}
},
"items": [{
"content": "Cotents <band:refer user_no=\"\">Jordan</band:refer> <band:hashtag>#food</band:hashtag>",
"post_key": "AABhEEQG08e1Fc227z2fRCwv",
"created_at": 1444288237000,
"photos": [{
"width": 640,
"height": 480,
"photo_key": "AAACTLxEYqMx09qji9nzAv1V",
"photo_album_key": null,
"author": {
"name": "Sujan",
"description": "This is desc.",
"profile_image_url": "http://band.phinf.campmobile.net/20130719_224/yyyyyy/yyyyy.jpg"
},
"url": "http://beta.coresos.phinf.naver.net/a/2g8728_c/28aUd015g6pesvlf89uq_ggxdbs.jpg",
"comment_count": 1,
"emotion_count": 1,
"created_at": 1444295780000,
"is_video_thumbnail": true
}, {
"width": 1280,
"height": 720,
"photo_key": "AADtBkdo52blVIcH-4y_AotK",
"photo_album_key": null,
"author": {
"name": "Eddy",
"description": "This contents is so...",
"profile_image_url": "http://band.phinf.campmobile.net/20130719_224/xxxxxx/xxxxxx.jpg"
},
"url": "http://beta.coresos.phinf.naver.net/a/2g8701_9/ac2Ud01515ftew9215e27_ggxdbs.jpg",
"comment_count": 1,
"emotion_count": 1,
"created_at": 1444288237000,
"is_video_thumbnail": false
}],
"comment_count": 7,
"author": {
"name": "Charley Lee",
"description": "This is a description",
"profile_image_url": "http://band.phinf.campmobile.net/20130719_224/zzzzzz/zzzzz.jpg"
}
}...]
}
}
특정 글의 상세정보를 조회한다.
url: [GET][https://openapi.band.us/v2.1/band/post](https://openapi.band.us/v2.1/band/post)
name | type | mandatory | description |
---|---|---|---|
access_token | string | Y | 사용자 인증 접근 토큰 |
band_key | string | Y | 밴드 식별자 |
post_key | string | Y | 글 식별자 |
name | type | description |
---|---|---|
result_code | integer | 결과 코드 (성공:1) |
result_data.post | object | 글 상세정보 |
post는 위에 item 하나와 동일
{
"result_code": 1,
"result_data": {
"post": {
"content": "This is Cotents.\n To be continue... <band:attachment type=\"photo\" id=\"3452\" /><band:attachment type=\"video\" id=\"675\" />",
"video": {
"175284037": {
"height": 360,
"width": 640,
"is_video_thumbnail": true,
"created_at": 1484303791000,
"author": {
"name": "미니0",
"description": "",
"role": "member",
"profile_image_url": "http://coresos.phinf.naver.net/a/xxxx/xxxxx.png",
"user_key": "AACv2efNJhMjHOgGWhfhXg25"
},
"url": "http://coresos.phinf.naver.net/a/yyyy/yyyy.jpg",
"emotion_count": 0,
"comment_count": 0,
"photo_album_key": null,
"photo_key": "AAD7LTDVWfB5GE80Usi_0Y_H"
}
},
"is_multilingual": false,
"created_at": 1484303791000,
"author": {
"name": "Jordan",
"description": "",
"role": "member",
"profile_image_url": "http://coresos.phinf.naver.net/a/yyy/xxx.png",
"user_key": "AACv2efNJhMjHOgGWhfhXg25"
},
"emotion_count": 0,
"comment_count": 0,
"post_read_count": 0,
"post_key": "AAAFJEEalAmkhLXGh0rQCy3h",
"photo": {
"5110026620": {
"height": 1920,
"width": 1440,
"is_video_thumbnail": false,
"created_at": 1484303791000,
"author": {
"name": "Charley",
"description": "",
"role": "member",
"profile_image_url": "http://coresos.phinf.naver.net/a/2hj6eg_i/yyyyy.png",
"user_key": "AACv2efNJhMjHOgGWhfhXg25"
},
"url": "http://coresos.phinf.naver.net/a/2hjc4i_d/zzzzz.jpg",
"emotion_count": 0,
"comment_count": 0,
"photo_album_key": null,
"photo_key": "AACVbWOG62mcbDJjaYOkSO2c"
}
},
"shared_count": 0,
"band_key": "AAAbBbMeQHBLh3-y8xxogqBg"
}
}
}
import json
from urllib import request
import requests
token = "Access Token"
def get_bands(): #밴드 목록 조회
url = f'https://openapi.band.us/v2.1/bands?access_token={token}'
req = request.Request(url)
res = request.urlopen(req)
decoded = res.read().decode("utf-8")
json_dict = json.loads(decoded)
return json_dict
def create_post(band_key, content, do_push=True): # 게시글 작성하기
url = f'https://openapi.band.us/v2.1/bands/post/create'
data = {'access_token' : token, 'band_key' : band_key, 'content' : content, 'do_push' : do_push}
with requests.post(url, data) as resp:
json_dict = json.loads(resp.text)
return json_dict
def get_posts(band_key, locale): #글 목록 조회
url = f'https://openapi.band.us/v2/bands/post?access_token={token}&band_key={band_key}&locale={locale}'
with requests.get(url) as resp:
json_dict = json.loads(resp.text)
return json_dict
def get_spec_posts(band_key, post_key): #글 상세 조회
url = f'https://openapi.band.us/v2.1/bands/post?access_token={token}&band_key={band_key}&post_key={post_key}'
with requests.get(url) as resp:
json_dict = json.loads(resp.text)
return json_dict