Python

파이썬-실습(8) 카카오 디벨로퍼 인가코드, Friends 토큰

지나가는 지식들을 모아두기 2021. 12. 17. 13:10
728x90
300x250

https://cleaning-toolbox.tistory.com/60

 

카카오 디벨로퍼 인가코드, OWNER 토큰

현재 저는 카카오 디벨로퍼와 카카오 i 오픈빌더를 함께 사용해서 친구들에게 기온, 미세먼지, 확진자 수를 제가 만든 챗봇을 통해 자신이 알고 싶은 항목들과 시간을 설정하여 알람이 오게끔

cleaning-toolbox.tistory.com

 

위의 게시글을 보고 OWNER 토큰을 이해하셨다면

이제는 카톡 알림을 받을 User의 토큰을 최초 한 번은 발급받아야합니다.

과정은 이렇게 됩니다.

User의 카카오 로그인 url 접속 -> 카카오 로그인 -> 권한 허용 -> code 발급 -> code를 이용하여 Token 생성

 

위의 사진처럼 카카오 디벨로퍼에서 요청한 권한들을 User에게서 받을 수 있고 요청할 수 있습니다.

 

저의 카카오 로그인 User 전용 URL은

https://kauth.kakao.com/oauth/authorize?client_id={REST API KEY}&redirect_uri={redirect uri}&response_type=code&scope=talk_message,friends

이며 redirecturi만 기존의 OWNER것과 다르게 만들었습니다.

OWNER는 OWNER만의 Token으로 체크해야할 사항들이 있기에 따로 경로를 만들어 두개가 충돌하지 않게끔했습니다.

 

위의 URL에서 User가 카카오 로그인을 하고 권한을 수락한 후 code를 받으면 아래의 함수가 작동합니다.

def kakao_to_friends_get_friendstokens(code):
    url = 'https://kauth.kakao.com/oauth/token'
    authorize_code = code
    data = {
        'grant_type':'authorization_code',
        'client_id':************,
        'redirect_uri':'http://3.35.252.82:5000/kakao_friend_code',
        'code': authorize_code,
        }
    response = requests.post(url, data=data)
    tokens = response.json()
    with open("kakao_code_friends_friends.json","w") as fp:
        json.dump(tokens, fp)

 

그후 토큰의 유효성을 체크합니다.

def kakao_friends_token():
    with open("./kakao_code_friends_friends.json","r") as fp:
        tokens = json.load(fp)
    url="https://kapi.kakao.com/v1/user/access_token_info"
    headers={"Authorization" : "Bearer " + tokens["access_token"]}
    response = requests.get(url, headers=headers)
    return response.text

 

이렇게 하면 User가 만약 OWNER의 카카오톡 친구라면 User의 정보를 OWNER가 불러들일 수 있습니다.

저는 아래와 같은 함수를 작성하였습니다.

def kakao_friends_update():
    with open("kakao_code_friends_refresh.json","r") as fp:
        tokens = json.load(fp)
    friend_url = "https://kapi.kakao.com/v1/api/talk/friends"
    headers={"Authorization" : "Bearer " + tokens["access_token"]}
    result = json.loads(requests.get(friend_url, headers=headers).text)
    friends_list = result.get("elements")
    try:
        for friend in friends_list:
            func.update_item_one(mongo, {"uuid":str(friend['uuid'])}, {"$set": {"id":str(friend['id']), "name":str(friend['profile_nickname']), "image":str(friend['profile_thumbnail_image'])}}, "alarm", "kakao")
        print("friends_update success")
    except:
        print('friends_update fail')

Refresh Token으로 OWNER의 친구목록을 불러들이고 거기서 필요한 부분들만 뽑아서 MongoDB에 업데이트 하였습니다.

 

위의 함수와 이전 게시글을 참조한다면 OWNER의 카카오톡 친구목록을 불러올 수 있습니다.

전부를 불러오는게 아닌 그 권한을 수락한 친구들의 정보만 추출가능하게 됩니다.

 

왜인지는 모르겠지만 가끔 친구들이 권한을 수락하였지만 조금 시간이 지난 후에야 친구목록에 나오는 경우도 있습니다.

이 부분을 주의하시면서 진행하시면 잘 될 것 같습니다.

728x90
300x250