카카오 메시지 api 친구 목록 요청하기

알파로그·2023년 4월 30일
0
post-custom-banner

✏️ 전체 과정

  1. 권한 설정
  2. 카톡 소셜로그인 → 토큰값 생성
  3. 카카오 서버에 친구목록 요청
  4. 메시지 보낼 친구 선택
  5. 메시지 전송

✏️ 권한 설정과 토큰값 생성하기

🔗 카카오 메시지 api 를 사용한 나에게 메시지 보내는 방법

  • 위 링크를 참고해 토큰값 생성까지 완료하면 된다.

⚠️ 만약 약관 동의를 하지 않은 사용자가 추가 동의를 받고싶을 경우

🔗 추가 항목 동의 받기 공식문서


✏️ 카카오 서버에서 친구 목록 요청

🔗 카카오 Rest api - 친구목록 가져오기 공식 문서

📍 친구 목록 요청을 위한기본 정보

  • 요청 url
https://kapi.kakao.com/v1/api/talk/friends - GET

  • Access token
    • Http header 에 담아야 한다.
Authorization: Bearer ${ACCESS_TOKEN}

  • Option
    • 파라미터를 선택적으로 사용해 조절할 수 있음
      • 참고로 GET 요청은 message body 를 사용할 수 없어서 쿼리 파라미터 방식으로 추가 정보를 전송해줘야 한다.
    • paging
      • 페이징은 limit 로 나눔 - 친구 수 가 limit 보다 클 경우 페이징 처리됨
      • 이 경우 after_url 로 GET 요청하면 다음 페이지 리스트를 받을 수 있음
    • 친구목록 정렬
      • orderfriend_order 로 설정 가능
      • 즐겨찾기 친구를 상단에 위치하려면 order 는 ‘asc’ 로,
        friend_order 는 ‘favorite’ 으로 지정하면 된다.

📍 친구 목록 응답 정보

  • 파일 형식 - JSON
  • elements - Friend[] :친구 정보를 담은 JSON 배열
    • 이 값을 추출하면 친구 목록을 얻을 수 있다.

✏️ 코드 구현

📍 Dependencies

  • JSON 파일을 다뤄야 하기 때문에 라이브러리를 추가해줘야한다.
implementation group: 'org.json', name: 'json', version: '20210307' // json 파서

📍 KakaoFriendListDto

  • elements 를 매핑하기 위한 dto
    • 공색문서를 참고해서 만들었다.
import lombok.Data;

@Data
public class KakaoFriendListDto {

    private String id;
    private String uuid;
    private boolean favorite;
    private String profile_nickname;
    private String profile_thumbnail_image;
}

📍 KakaoMessageService

  • Http message 를 만들고 httpRequest 를 호출해 전송하는 객체
    • JSONobject 는 바로 List 에 담을 수 없기 때문에 반복문으로 하나하나 값을 입력해줬다.
@Service
public class KakaoMessageService extends HttpCallService {

		private static final String FRIENDS_LIST_SERVICE_URL = "https://kapi.kakao.com/v1/api/talk/friends";

		...

		//-- 내 친구 목록 가져오기 --//
    public List<KakaoFriendListDto> getFriendsList(String accessToken) {
        HttpHeaders header = new HttpHeaders();
        header.set("Authorization", "Bearer " + accessToken);

        HttpEntity<String> entity = new HttpEntity<>(header);

        ResponseEntity<String> response = httpRequest(FRIENDS_LIST_SERVICE_URL, HttpMethod.GET, entity);

        List<KakaoFriendListDto> list = new ArrayList<>();
        JSONObject jsonObject = new JSONObject(response.getBody());
        JSONArray elements = (JSONArray) jsonObject.get("elements");

        for (Object element : elements) {
            KakaoFriendListDto dto = new KakaoFriendListDto();
            JSONObject obj = (JSONObject) element;

            dto.setId(obj.get("id").toString());
            dto.setUuid(obj.get("uuid").toString());
            dto.setFavorite((boolean) obj.get("favorite"));
            dto.setProfile_nickname(obj.get("profile_nickname").toString());
            dto.setProfile_thumbnail_image(obj.get("profile_thumbnail_image").toString());

            list.add(dto);
            }

        return list;
    }

📍 Controller

  • 응답값이 잘 전달됬는지 확인하기 위한 test 매핑 매서드를 만들었다.
@RestController
@RequestMapping("/kakao")
@RequiredArgsConstructor
public class KakaoMessageController {

    private final KakaoMessageService kakaoService;
    private final Rq rq;

		//-- 내 친구 목록 가져오기 테스트 --//
    @GetMapping("/list")
    public List<KakaoFriendListDto> getList() {
        String accessToken = rq.getMember().getAccessToken();

        return kakaoService.getFriendsList(accessToken);
    }

✏️ 결과

  • 정상적으로 200 Ok 가 나왔지만,
    element 값이 모두 null 로 나온다…
  • 알고보니 아직 정식적으로 kakao 에게 승인 받지 못했기 때문에 통신에 성공되는지만 확인 할 수 있다고한다.
profile
잘못된 내용 PR 환영
post-custom-banner

0개의 댓글