페이지 이동경로
  • 문서>
  • 카카오스토리

카카오스토리

Legacy Android

이 문서는 Legacy Kakao SDK for Android(이하 Legacy Android SDK)를 사용한 카카오스토리 기능 구현 방법을 안내합니다.

애플리케이션 설정 확인

이 기능을 사용하려면 카카오디벨로퍼스(Kakao Developers, 이하 개발자 웹사이트) 애플리케이션(이하 앱) 설정에 Android 플랫폼 및 키 해시 등 정보가 등록되어 있어야 합니다. 자세한 내용은 애플리케이션 등록을 참고합니다.

시작하기 전에

카카오스토리 API를 통해 쓴 글에는 서비스 앱으로 연결되는 링크 버튼이 있습니다. 이 연결이 정상적으로 동작하도록 하기 위해 AndroidManifest.xml에 커스텀 URL 스킴(Custom URL Scheme)을 등록합니다.

AndroidManifest.xml
<application
    ...
    <activity
        android:name=".KakaoStoryResponseActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="kakao${NATIVE_APP_KEY}"
                    android:host="kakaostory" />              
        </intent-filter>
    </activity>
    ...
 </application>

사용자 확인하기

카카오스토리 API는 사용자가 카카오 로그인한 뒤 발급되는 액세스 토큰(Access Token)을 필요로 합니다. 카카오스토리 API 호출 시, 사용자가 카카오 로그인한 상태여야 하며 카카오스토리도 사용하고 있어야 합니다. 따라서 카카오스토리 API 사용 전, 카카오스토리 이용자인지 확인해야 합니다.

requestIsStoryUser 호출 시, 요청 결과를 처리할 KakaoStoryResponseCallback에 성공, 실패, 예외처리 등 실제 서비스에서 필요한 동작을 구현해야 합니다.

Sample

KakaoStoryService.getInstance().requestIsStoryUser(new StoryResponseCallback<Boolean>() {
    @Override
    public void onNotKakaoStoryUser() {
        // isStoryUser 에서는 사용되지 않음
    }

    @Override
    public void onSessionClosed(ErrorResult errorResult) {
        Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
    }

    @Override
    public void onFailure(ErrorResult errorResult) {
        Log.e("KAKAO_API", "카카오스토리 사용여부 조회 실패: " + errorResult);
    }

    @Override
    public void onSuccess(Boolean result) {
        if (result) {
            Log.i("KAKAO_API", "카카오스토리 사용중");
        } else {
            Log.i("KAKAO_API", "카카오스토리 사용자가 아님");
        }
    }
});

사용자의 카카오스토리 사용 여부는 Boolean 값으로 전달되며, 값이 true라면 카카오스토리 사용자이므로 프로필 가져오기나 스토리 쓰기 등 다른 API들을 호출할 수 있습니다. 결과가 false라면 사용자가 카카오스토리를 쓰지 않는 것이니 관련 기능을 이용할 수 없도록 예외처리합니다.

프로필 가져오기

동의 항목 설정 필요

이 API를 사용하려면 동의 항목 설정을 참고하여 '프로필' 동의 항목을 설정해야 합니다.

KakaoStoryServicerequestProfile API로 사용자의 카카오스토리 프로필을 요청합니다. 요청 시 결과를 처리하는 StoryResponseCallback을 구현하여 전달해야 합니다.

Sample

KakaoStoryService.getInstance().requestProfile(new StoryResponseCallback<ProfileResponse>() {
    @Override
    public void onNotKakaoStoryUser() {
        Log.e("KAKAO_API", "카카오스토리 사용자가 아님");
    }

    @Override
    public void onSessionClosed(ErrorResult errorResult) {
        Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
    }

    @Override
    public void onFailure(ErrorResult errorResult) {
        Log.e("KAKAO_API", "카카오스토리 프로필 조회 실패: " + errorResult);
    }

    @Override
    public void onSuccess(ProfileResponse result) {
        Log.i("KAKAO_API", "스토리 닉네임: " + result.getProfile().getNickName());
        Log.i("KAKAO_API", "스토리 프로필이미지: " + result.getProfile().getProfileImageURL());
        Log.i("KAKAO_API", "스토리 생일: " + result.getProfile().getBirthday());
    }
});

요청 성공 시 카카오스토리 프로필을 ProfileResponse 객체로 받습니다.

ProfileResponse
Name Type Description
nickName String 카카오스토리 닉네임
profileImageUrl String 카카오스토리 프로필 이미지 URL
480px * 480px ~ 1024px * 1024px 크기
thumbnailUrl String 카카오스토리 프로필 썸네일(Thumbnail) 이미지 URL
160px * 213px 크기(이미지 비율에 맞게 변경)
bgImageURL String 카카오스토리 배경 이미지 URL
480px 480px ~ 1024px 1024px 크기
permalink String 사용자의 스토리 홈 주소
birthday String 카카오스토리에 등록된 사용자 생일
MMdd 형식
birthdayType BirthdayType 카카오스토리 생일 양력/음력 구분, 양력(SOLAR)/음력(LUNAR)

스토리 쓰기

동의 항목 설정 필요

이 API를 사용하려면 동의 항목 설정을 참고하여 '카카오스토리 글 작성' 동의 항목을 설정해야 합니다.

현재 로그인한 사용자의 카카오스토리에 새로운 스토리를 씁니다. 스토리는 글(Post), 사진(Photo)과 글, 링크(Link) 세 가지 종류가 있습니다. 스토리 쓰기 요청에 사용하는 API도 스토리 종류별로 다릅니다.

스토리 종류
Type Description API
글(Note) 텍스트로 구성된 스토리 requestPostNote
사진(Photo) 텍스트와 사진으로 구성된 스토리 requestPostPhoto
링크(Link) 텍스트와 스크랩할 웹 페이지에서 얻은 정보로 구성된 스토리 requestPostLink

스토리 쓰기 요청 시 파라미터는 공통적으로 쓰이는 것과 메소드마다 추가로 전달하는 것이 있으니 주의합니다. 종류별 스토리 쓰기 요청의 파라미터와 예제는 다음과 같습니다.

Parameter

공통
Name Type Description Default
permission StoryPermission 스토리 공개 범위
PUBLIC(전체 공개), FRIEND(친구 공개), ONLY_ME(나만 보기)
StoryPermission.PUBLIC(전체 공개)
enableShare Boolean 친구 공개 스토리인 경우 공유 설정 false
androidExecParam String, Map<String, String> 스토리의 [해당 앱으로 이동] 버튼을 눌렀을 때 Android 앱 실행 URL에 붙일 파라미터 NONE
iosExecParam String, Map<String, String> 스토리의 [해당 앱으로 이동] 버튼을 눌렀을 때 iOS 앱 실행 URL에 붙일 파라미터 NONE
androidMarketParam String, Map<String, String> 카카오스토리에서 오픈마켓으로 이동할 때 실행 URL에 붙일 파라미터 NONE
iosMarketParam String, Map<String, String> 카카오스토리에서 앱스토어로 이동할 때 실행 URL에 붙일 파라미터 NONE
실행 URL

실행 URL은 앱 정보에 각 플랫폼이 설정돼 있어야만 정상 동작합니다. 또한 오픈마켓이나 앱스토어 URL이 설정되지 않으면 '해당 앱으로 이동' 링크가 동작하지 않습니다. 플랫폼 등록 방법은 애플리케이션 등록을 참고합니다. 참고용 URL 기본 형식은 다음과 같습니다.

실행 URL: kakao[Native App Key]://kakaostory Android 마켓 URL: market://details?id=[android package name] 기본 iOS 마켓 URL: https://itunes.apple.com/app/[앱스토어ID]

글 스토리
Name Type Description Required
content String 스토리에 들어갈 글, 2048자(char) 미만으로 제한 O
사진 스토리
Name Type Description Required
fileList List<File> 이미지 업로드 결과로 스토리에 들어갈 이미지들 O
content String 스토리에 들어갈 글, 2048자(char) 미만으로 제한 X
링크 스토리
Name Type Description Required
linkUrl String 스크랩할 웹 페이지 URL O
content String 스토리에 들어갈 글, 2048자(char) 미만으로 제한 X

Sample

글 스토리 쓰기
String content = "카카오스토리 노트 포스팅입니다.";

KakaoStoryService.getInstance().requestPostNote(new StoryResponseCallback<MyStoryInfo>() {
    @Override
    public void onNotKakaoStoryUser() {
        Log.e("KAKAO_API", "카카오스토리 사용자가 아님");
    }

    @Override
    public void onSessionClosed(ErrorResult errorResult) {
        Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
    }

    @Override
    public void onFailure(ErrorResult errorResult) {
        Log.e("KAKAO_API", "카카오스토리 노트 포스팅 실패: " + errorResult);
    }

    @Override
    public void onSuccess(MyStoryInfo result) {
        Log.i("KAKAO_API", "카카오스토리 노트 포스팅 성공. 포스트 ID: " + result.getId());
    }
}, content);
사진 스토리 쓰기
String content = "카카오스토리 사진 포스팅입니다.";
List<File> images = Arrays.asList(
        new File("path/of/image/file")
);

try {
    KakaoStoryService.getInstance().requestPostPhoto(new StoryResponseCallback<MyStoryInfo>() {
        @Override
        public void onNotKakaoStoryUser() {
            Log.e("KAKAO_API", "카카오스토리 사용자가 아님");
        }

        @Override
        public void onSessionClosed(ErrorResult errorResult) {
            Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
        }

        @Override
        public void onFailure(ErrorResult errorResult) {
            Log.e("KAKAO_API", "카카오스토리 노트 포스팅 실패: " + errorResult);
        }

        @Override
        public void onSuccess(MyStoryInfo result) {
            Log.i("KAKAO_API", "카카오스토리 노트 포스팅 성공. 포스트 ID: " + result.getId());
        }
    }, images, content);

} catch (KakaoParameterException e) {
    Log.e("KAKAO_API", "파라미터 입력 오류", e);
}
링크 스토리 쓰기
String content = "카카오스토리 링크 포스팅입니다.";
String linkUrl = "https://developers.kakao.com";

try {
    KakaoStoryService.getInstance().requestPostLink(new StoryResponseCallback<MyStoryInfo>() {
        @Override
        public void onNotKakaoStoryUser() {
            Log.e("KAKAO_API", "카카오스토리 사용자가 아님");
        }

        @Override
        public void onSessionClosed(ErrorResult errorResult) {
            Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
        }

        @Override
        public void onFailure(ErrorResult errorResult) {
            Log.e("KAKAO_API", "카카오스토리 링크 포스팅 실패: " + errorResult);
        }

        @Override
        public void onSuccess(MyStoryInfo result) {
            Log.i("KAKAO_API", "카카오스토리 링크 포스팅 성공. 포스트 ID: " + result.getId());
        }
    }, linkUrl, content);

} catch (KakaoParameterException e) {
    Log.e("KAKAO_API", "파라미터 입력 오류", e);
}

스토리 쓰기에 성공하면 해당 게시물 정보가 담긴 MyStoryInfo 객체를 받습니다. 내 스토리 가져오기 요청 시 받는 정보와 동일한 구성입니다.

내 스토리 가져오기

동의 항목 설정 필요

이 API를 사용하려면 동의 항목 설정을 참고하여 '카카오스토리 글 목록' 동의 항목을 설정해야 합니다.

현재 로그인한 사용자의 카카오스토리에서 스토리 정보를 받아옵니다.

카카오스토리 스토리 정보를 요청할 때는 하나의 스토리를 지정하는 requestGetMyStory, 특정 스토리보다 먼저 올라온 스토리 목록을 불러오는 requestGetMyStories 중 하나를 사용합니다.

조회 기준이 될 마지막 스토리 ID를 모르거나 최근 스토리들을 불러오려면 lastMyStoryId 지정 없이 requestGetMyStories로 요청합니다.

기본적으로는 다음과 같이 사용합니다.

  • 스토리 쓰기 후 응답으로 받은 ID로 지정 스토리 가져오기
  • 여러 개의 스토리 가져오기를 통해 최근 스토리 정보 가져오기
    • 받은 스토리 정보의 ID로 지정 스토리 가져오기

Parameter

requestGetMyStory: 지정 스토리 가져오기
Name Type Description Required
storyId String 정보를 원하는 스토리 아이디 O
requestGetMyStories: 여러 개의 스토리 가져오기
Name Type Description Required
lastMyStoryId String 정보를 원하는 마지막 스토리 아이디
해당 스토리를 제외하고, 그 이전에 작성된 스토리 정보가 제공됨
기본 값은 가장 최근 작성된 스토리 아이디
파라미터 미포함 시 가장 최근 스토리 정보부터 제공
X

Sample

지정 스토리 가져오기
String storyId = "_7Gfyf2.7Oi5GDuY0p8";     // 조회하고자 하는 포스트 ID

try {
    KakaoStoryService.getInstance().requestGetMyStory(new StoryResponseCallback<MyStoryInfo>() {
        @Override
        public void onNotKakaoStoryUser() {
            Log.e("KAKAO_API", "카카오스토리 사용자가 아님");
        }

        @Override
        public void onSessionClosed(ErrorResult errorResult) {
            Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
        }

        @Override
        public void onFailure(ErrorResult errorResult) {
            Log.e("KAKAO_API", "카카오스토리 포스팅 조회 실패: " + errorResult);
        }

        @Override
        public void onSuccess(MyStoryInfo result) {
            Log.i("KAKAO_API", "카카오스토리 포스팅 조회 성공: " + result);
        }
    }, storyId);
    
} catch (KakaoParameterException e) {
    Log.e("KAKAO_API", "파라미터 입력 오류", e);
}
특정 스토리 이전 정보 요청
KakaoStoryService.getInstance().requestGetMyStories(new StoryResponseCallback<List<MyStoryInfo>>() {
    @Override
    public void onNotKakaoStoryUser() {
        Log.e("KAKAO_API", "카카오스토리 사용자가 아님");
    }

    @Override
    public void onSessionClosed(ErrorResult errorResult) {
        Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
    }

    @Override
    public void onFailure(ErrorResult errorResult) {
        Log.e("KAKAO_API", "카카오스토리 포스팅 목록 조회 실패: " + errorResult);
    }

    @Override
    public void onSuccess(List<MyStoryInfo> result) {
        Log.i("KAKAO_API", "카카오스토리 포스팅 목록 조회 성공");
        for (MyStoryInfo story : result) {
            Log.i("KAKAO_API", story.toString());
        }
    }
}, null);   // lastMyStoryId: null -> 전체 목록 가져오기

하나의 스토리를 요청했다면 MyStoryInfo 객체, 최근 또는 특정 스토리 기준으로 이전 스토리들을 요청했다면 MyStoryInfo 객체 배열을 받습니다.

MyStoryInfo
Name Type Description
id String 스토리 ID
url String 스토리 URL
mediaType String 스토리 종류
PHOTO, NOTE, LINK 중 하나
createdAt String 게시 시간(RFC3339 internet date/time format)
commentCount Int 댓글 수
likeCount Int 느낌 수
content String 스토리 내용
permission String 공개 설정
imageInfoList MyStoryImageInfo[] 이미지 리스트
commentList StoryComment[] 댓글 목록
StoryLike StoryLike[] 느낌 목록
StoryComment
Name Type Description
text String 댓글 내용
writer StoryActor 작성자 정보
displayName(작성자 닉네임), profileThumbnailUrl(작성자 프로필 썸네일 이미지 URL)로 구성
StoryLike
Name Type Description
emoticon Emoticon 이모티콘으로 표현되는 느낌 종류
LIKE(좋아요), COOL(멋져요), HAPPY(기뻐요), SAD(슬퍼요), CHEER_UP(힘내요) 중 하나
actor StoryActor 느낌을 남긴 사용자 정보
displayName(작성자 닉네임), profileThumbnailUrl(작성자 프로필 썸네일 이미지 URL)로 구성

내 스토리 삭제하기

사용자는 자신이 올렸던 스토리에 한해 삭제할 수 있습니다. 스토리 삭제 요청 시 삭제할 스토리 ID를 명시해야 합니다. 필수 파라미터인 삭제 대상 스토리 ID가 없으면 예외가 발생합니다. 삭제 요청 결과를 처리하는 KakaoStoryResponseCallback을 구현해 요청 성공, 실패, 예외에 따른 동작을 정의합니다.

Parameter

Name Type Description Required
id String 삭제할 스토리 ID O

Sample

String storyId = "_7Gfyf2.7Oi5GDuY0p8";     // 삭제하고자 하는 포스트 ID

try {
    KakaoStoryService.getInstance().requestDeleteMyStory(new StoryResponseCallback<Boolean>() {
        @Override
        public void onNotKakaoStoryUser() {
            Log.e("KAKAO_API", "카카오스토리 사용자가 아님");
        }

        @Override
        public void onSessionClosed(ErrorResult errorResult) {
            Log.e("KAKAO_API", "세션이 닫혀 있음: " + errorResult);
        }

        @Override
        public void onFailure(ErrorResult errorResult) {
            Log.e("KAKAO_API", "카카오스토리 포스팅 삭제 실패: " + errorResult);
        }

        @Override
        public void onSuccess(Boolean result) {
            Log.i("KAKAO_API", "카카오스토리 포스팅 삭제 성공");
        }
    }, storyId);

} catch (KakaoParameterException e) {
    Log.e("KAKAO_API", "파라미터 입력 오류", e);
}

스토리 삭제 요청의 결과는 성공 또는 실패를 알리는 Boolean 값으로 받습니다. true이면 삭제 성공입니다.

더보기