친구에게 메시지 보내기 api 사용 신청

1.문서에서 카카오톡 메시지 , 메시지 API 검수 신청 방법 을 반드시 확인하세요.

2.검수 방법

반드시 신청하시는 서비스에 API나 SDK가 연동되어 정상적으로 호출이 된 상태만 검수받을 수 있습니다.

  1. 해당 앱의 ‘[내 애플리케이션 > 설정 > 일반 > 비즈 앱 정보 > 사업자 정보 등록]’ 에서 비즈앱 신청을 해주세요.
  2. 신청에 사용한 사업자등록증 사본을 카카오 계정(@kakao)에 메시지로 전달해주세요.
    넵 보냈습니다.
  3. OWNER의 개발자 계정 (email), 앱 이름을 알려주세요.
  • OWNER의 개발자 계정은 ‘내 애플리케이션 > 설정 > 팀 관리’ 에서 확인하세요
    dhpi@tmck.co.kr
  1. 앱에서의 API를 활용하는 이유/방식을 알려주세요.
  • 친구 api를 함께 사용하실 계획이라면 알려주시기 바랍니다.
  • 친구 API 를 함께 사용합니다.
  • 새로운 게시글이 발생되면 친구 목록을 가져와 담당자에게 카톡으로 알림을 줍니다.
  1. 메시지 전송 API가 적용된 서비스를 저희가 직접 확인하기 위해, '로그인을 하는 시점부터 해당 서비스까지 이동하는 순서’를 상세히 알려주세요.
    -사용자가 카카오 로그인 api를 통해 로그인
# Code 값 받기
def Code():
    global authorize_code
    ChromeSet.ChromeDriver()
    ChromeSet.driver.get('https://kauth.kakao.com/oauth/authorize?client_id=2c931f172c5b51****&redirect_uri=http://monitoring.tmck.co.kr/&response_type=code&scope=talk_message,friends')
    time.sleep(3)
    input("입력 : ")
    # 로그인
    user_id = '****"
    user_passwd = '****'

    ChromeSet.driver.find_element_by_id('id_email_2').send_keys(user_id)
    ChromeSet.driver.find_element_by_id('id_password_3').send_keys(user_passwd)
    ChromeSet.driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button[1]').click()
    time.sleep(3)
    temp_url = ChromeSet.driver.current_url
    CodeIDX1 = temp_url.index("=")
    authorize_code = temp_url[CodeIDX1+1:]
    ChromeSet.driver.close()

def API():
    global tokens
    url = 'https://kauth.kakao.com/oauth/token'
    rest_api_key = '****'
    redirect_uri = '****'

    data = {
        'grant_type':'authorization_code',
        'client_id':rest_api_key,
        'redirect_uri':redirect_uri,
        'code': authorize_code,
        }

    response = requests.post(url, data=data)
    tokens = response.json()['access_token']
    # json 저장
    with open(r"C:\\rawdata\\kakao_code.json","w") as fp:
        json.dump(tokens, fp)

-친구 api 통해 친구목록에서 uuid를 가져옴
    global api_login_time
    check_time = datetime.now()
    if int(datetime.strftime(datetime.now(), "%H")) == 13:
        pass
    else:
        if api_login_time < check_time - timedelta(hours=5):
            KakaoAPISet.Code()
            KakaoAPISet.API()
            api_login_time = check_time
        else:
            pass
        with open(r"C:\\rawdata\\kakao_code.json","r") as fp:
            tokens = json.load(fp)
        friend_url = "https://kapi.kakao.com/v1/api/talk/friends"
        headers = {"Authorization": "Bearer " + tokens}

        result = json.loads(requests.get(friend_url, headers=headers).text)


-가져온 uuid로 메시지 api 통해 친구에게 원하는 메시지를 보냄
        b = datetime.now().strftime("%Y/%m/%d")
        weekday = datetime.strptime(b, "%Y/%m/%d")
        t = ['월', '화', '수', '목', '금', '토', '일']
        now_hour = datetime.strftime(datetime.now(), "%H")
        if t[weekday.weekday()] == '토' or t[weekday.weekday()] == '일':
            if int(now_hour) == 13:
                pass
            elif int(now_hour) >13 and int(now_hour) < 20:
                # 홍길동
                friend_id_list.append('****')
            elif int(now_hour) > 7 and int(now_hour) <13:
                # 김길동
                friend_id_list.append('****')
        elif t[weekday.weekday()] == '월' or t[weekday.weekday()] == '화' or t[weekday.weekday()] == '수':
            if int(now_hour) == 13:
                pass
            elif int(now_hour) >13 and int(now_hour) < 20:
                # 이길동
                friend_id_list.append('****')
        elif t[weekday.weekday()] == '목' or t[weekday.weekday()] == '금':
            if int(now_hour) == 13:
                pass
            elif int(now_hour) > 7 and int(now_hour) < 13:
                # 최길동
                friend_id_list.append('****')
            else:
                # 조길동
                friend_id_list.append('****')

        for ID in range(len(friend_id_list)):
            send_url = "https://kapi.kakao.com/v1/api/talk/friends/message/default/send"

            data = {
                'receiver_uuids': '["{}"]'.format(friend_id_list[ID]),
                "template_object": json.dumps({
                    "object_type": "text",
                    "text": "데이터가 발생했습니다. \n 프로그램을 통해 데이터를 확인해주세요.",
                    "link": {
                        "web_url": "www.daum.net",
                        "web_url": "www.naver.com"
                    },
                    "button_title": "바로 확인"
                })
            }

            response = requests.post(send_url, headers=headers, data=data)
            response.status_code
            print(response)
  1. 테스트가 완료되어 서비스에 적용된(될) '실제 동작 화면 영상 혹은 캡쳐’를 첨부해주세요.

image

3.검수를 마친 후

검수를 마치면 "내 애플리케이션 > 설정 > 사용자 관리 > 동의항목 > 설정"에서 “카카오톡 메시지 전송” 접근권한 관리항목을 설정할 수 있게 됩니다.

안녕하세요.

메시지 수신 받을 카카오톡 친구들은 제공하시는 서비스에 어떻게 로그인 하는지 설명 부탁드려요.
(사이트URL을 알려주시거나 화면 캡쳐 부탁드립니다.)

위 이미지처럼 메시지만 수신하고 수신자는 카카오톡으로 별도의 로그인은 하지 않습니다.
해당 메시지를 받으면 게시판의 데이터를 조회하고 있습니다.

서비스 제공하시는 디벨로퍼스앱에

메시지 수신 받을 친구들도 카카오 로그인 해야하고
친구목록 조회, 메시지발송 권한 동의해야 친구목록 조회 및 메시지 발송이 가능한데요.

해당 Flow구현이 안되어 있는 것으로 보입니다.

확인 부탁드려요.

수신 받는 친구들은 제가 팀원으로 초대한 후 직접
친구목록 조회, 메시지발송 권한 동의를 진행하고 있습니다.

image

넵, 캡쳐해주신 부분은 디벨로퍼스 동의 설정으로

발신자, 수신자가 카카오 로그인 시, 카카오 동의창에 동의항목 띄우는 설정으로
해당 설정과 더불어

발신자, 수신자가 실제로 인가요청->토큰요청(사용자정보조회API호출)로 디벨로퍼스앱에 연결되야 메시지 발송 가능한데요.

위에 기재 해주신 내용은 발신자가 동의 받는 기능만 있는 것으로 보입니다.

수신자역시, 자신의 카카오 계정으로 로그인 해서 동의 받는 절차가 필요합니다.
(이는 대신해줄 수 없는 기능이고 당사자가 직접 제공하시는 서비스에 카카오 로그인 및 권한 동의 해야합니다.)

친구 api, 메시지 api 사용을 위한 체크 리스트

넵, 수신자의 인가 요청 내용 첨부드립니다.

import time
import requests
import json
from file_set import ChromeSet

def Recipient():
rest_api_key = input("Rest API Key 값을 입력하세요 : ")
redirect_uri = ‘http://monitoring.tmck.co.kr/
ChromeSet.ChromeDriver()
ChromeSet.driver.get(‘https://kauth.kakao.com/oauth/authorize?client_id=’ +str(rest_api_key) + ‘&redirect_uri=’ + redirect_uri + ‘&response_type=code&scope=talk_message,friends’)
time.sleep(3)
input("입력 : ")
# 로그인
user_id = input("카카오 계정 ID를 입력하세요 : ")
user_passwd = input("카카오 계정 PW를 입력하세요 : ")

ChromeSet.driver.find_element_by_id('id_email_2').send_keys(user_id)
ChromeSet.driver.find_element_by_id('id_password_3').send_keys(user_passwd)
ChromeSet.driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/div[8]/button[1]').click()
time.sleep(3)

temp_url = ChromeSet.driver.current_url
CodeIDX1 = temp_url.index("=")
authorize_code = temp_url[CodeIDX1+1:]
ChromeSet.driver.close()
print("authorize_code 정보를 불러왔습니다.")
print("token 값을 조회합니다.")

url = 'https://kauth.kakao.com/oauth/token'

data = {
    'grant_type':'authorization_code',
    'client_id':rest_api_key,
    'redirect_uri':redirect_uri,
    'code': authorize_code,
    }

response = requests.post(url, data=data)
tokens = response.json()['access_token']
# json 저장
with open(r"C:\\rawdata\\kakao_code.json","w") as fp:
    json.dump(tokens, fp)

print("token 값을 불러왔습니다.")
print("프로그램을 종료합니다.")

image

기재해주신 수신자의 카카오 로그인 방식이 ID/PW 노출의 위험이 있어보입니다.

안전한 사용을 위해 웹이나 앱을 통해 카카오 계정 로그인 시,
사용자가 카카오계정 페이지에서 직접 로그인 수행할 수있도록 처리 부탁드립니다.

안전한 사용을 위해 확인 부탁드려요.

카카오 계정 로그인은 사용자가 직접 웹페이지에서 진행하도록 변경하였습니다.

import time
import requests
import json
import ChromeSet


def Recipient():
    rest_api_key = input("Rest API Key 값을 입력하세요 : ")
    redirect_uri = 'http://monitoring.tmck.co.kr/'
    ChromeSet.ChromeDriver()
    ChromeSet.driver.get('https://kauth.kakao.com/oauth/authorize?client_id=' +str(rest_api_key) + '&redirect_uri=' + redirect_uri + '&response_type=code&scope=talk_message,friends')
    time.sleep(3)
    # 로그인
    print("카카오 계정 로그인을 진행해주세요.")
    input("로그인 완료 시 Enter 키를 입력해주세요.")

    temp_url = ChromeSet.driver.current_url
    CodeIDX1 = temp_url.index("=")
    authorize_code = temp_url[CodeIDX1+1:]
    ChromeSet.driver.close()
    print("authorize_code 정보를 불러왔습니다.")
    print("token 값을 조회합니다.")

    url = 'https://kauth.kakao.com/oauth/token'

    data = {
        'grant_type':'authorization_code',
        'client_id':rest_api_key,
        'redirect_uri':redirect_uri,
        'code': authorize_code,
        }

    response = requests.post(url, data=data)
    tokens = response.json()['access_token']
    # json 저장
    with open(r"C:\\rawdata\\kakao_code.json","w") as fp:
        json.dump(tokens, fp)

    print("token 값을 불러왔습니다.")
    print("프로그램을 종료합니다.")

image

image

안녕하세요~
API 권한 부여되었습니다.