Skip to content

Commit 43b5389

Browse files
카카오 알림톡 및 음성 메시지 발송 예제 추가, VoiceOption 모델에 reply_range와 counselor_number의 상호 배타성 검증 로직 추가
1 parent 7a5f2c2 commit 43b5389

File tree

4 files changed

+91
-2
lines changed

4 files changed

+91
-2
lines changed

examples/simple/send_kakao_bms.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from solapi import SolapiMessageService
2+
from solapi.model import Bms, KakaoOption, RequestMessage
3+
4+
# API 키와 API Secret을 설정합니다
5+
message_service = SolapiMessageService(
6+
api_key="YOUR_API_KEY", api_secret="YOUR_API_SECRET"
7+
)
8+
9+
# 카카오 알림톡 발송을 위한 옵션을 생성합니다.
10+
kakao_option = KakaoOption(
11+
pf_id="계정에 등록된 카카오 비즈니스 채널ID",
12+
template_id="계정에 등록된 카카오 브랜드 메시지 템플릿 ID",
13+
# 만약에 템플릿에 변수가 있다면 아래와 같이 설정합니다.
14+
# 값은 반드시 문자열로 넣어주셔야 합니다!
15+
# variables={
16+
# "#{name}": "홍길동",
17+
# "#{age}": "30"
18+
# }
19+
# 브랜드 메시지 발송 대상자 설정, M, N 타입은 카카오측의 별도 인허가를 받은 대상만 사용할 수 있습니다.
20+
# M: 마케팅 수신 동의 대상자 및 카카오 채널 친구
21+
# N: 마케팅 수신 동의 대상자 및 카카오 채널 친구는 제외한 대상자
22+
# I: 카카오 채널 친구
23+
bms=Bms(targeting="M"),
24+
)
25+
26+
# 단일 메시지를 생성합니다
27+
message = RequestMessage(
28+
from_="발신번호", # 발신번호 (등록된 발신번호만 사용 가능)
29+
to="수신번호", # 수신번호
30+
kakao_options=kakao_option,
31+
)
32+
33+
# 메시지를 발송합니다
34+
try:
35+
response = message_service.send(message)
36+
print("메시지 발송 성공!")
37+
print(f"Group ID: {response.group_info.group_id}")
38+
print(f"요청한 메시지 개수: {response.group_info.count.total}")
39+
print(f"성공한 메시지 개수: {response.group_info.count.registered}")
40+
except Exception as e:
41+
print(f"메시지 발송 실패: {str(e)}")
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from solapi import SolapiMessageService
2+
from solapi.model import RequestMessage, VoiceOption
3+
4+
# API 키와 API Secret을 설정합니다
5+
message_service = SolapiMessageService(
6+
api_key="YOUR_API_KEY", api_secret="YOUR_API_SECRET"
7+
)
8+
9+
"""
10+
단일 메시지를 생성합니다
11+
header_message를 사용하는 경우, 반드시 아무 버튼이나 눌러야 text 메시지가 재생됩니다.
12+
text 메시지가 재생된 이후, reply_range에 명시된 번호(1~9) 혹은 counselor_number에 값이 있을 경우 0번을 눌러야 tail_message가 재생됩니다.
13+
자세한 사항은 아래 링크를 참고해주세요!
14+
15+
https://developers.solapi.com/references/voice
16+
"""
17+
message = RequestMessage(
18+
from_="발신번호", # 발신번호 (등록된 발신번호만 사용 가능)
19+
to="수신번호", # 수신번호
20+
text="안녕하세요! SOLAPI Python SDK를 사용한 음성 메시지 발송 예제입니다.",
21+
voice_options=VoiceOption(
22+
voice_type="FEMALE",
23+
header_message="안녕하세요!",
24+
tail_message="안녕하세요!",
25+
reply_range=1,
26+
),
27+
)
28+
29+
# 메시지를 발송합니다
30+
try:
31+
response = message_service.send(message)
32+
print("메시지 발송 성공!")
33+
print(f"Group ID: {response.group_info.group_id}")
34+
print(f"요청한 메시지 개수: {response.group_info.count.total}")
35+
print(f"성공한 메시지 개수: {response.group_info.count.registered_success}")
36+
print(f"실패한 메시지 개수: {response.group_info.count.registered_failed}")
37+
except Exception as e:
38+
print(f"메시지 발송 실패: {str(e)}")

solapi/model/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from .request.kakao.bms import Bms
55
from .request.message import Message as RequestMessage
66
from .request.send_message_request import SendRequestConfig
7+
from .request.voice.voice_option import VoiceOption
78
from .response.message import Message as ResponseMessage
89

910
__all__ = [
@@ -14,4 +15,5 @@
1415
"GetGroupsRequest",
1516
"MessageType",
1617
"Bms",
18+
"VoiceOption",
1719
]

solapi/model/request/voice/voice_option.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
from typing import Literal, Optional
22

3-
from pydantic import BaseModel, ConfigDict
3+
from pydantic import BaseModel, ConfigDict, model_validator
44
from pydantic.alias_generators import to_camel
55

66

77
class VoiceOption(BaseModel):
88
voice_type: Literal["FEMALE", "MALE"]
99
header_message: Optional[str] = None
1010
tail_message: Optional[str] = None
11-
reply_range: Optional[int] = None
11+
reply_range: Optional[Literal[1, 2, 3, 4, 5, 6, 7, 8, 9]] = None
1212
counselor_number: Optional[str] = None
1313

14+
@model_validator(mode="after")
15+
def check_exclusive_fields(self) -> "VoiceOption":
16+
if self.reply_range is not None and self.counselor_number is not None:
17+
raise ValueError(
18+
"reply_range와 counselor_number는 같이 사용할 수 없습니다."
19+
)
20+
return self
21+
1422
model_config = ConfigDict(
1523
alias_generator=to_camel,
1624
populate_by_name=True,

0 commit comments

Comments
 (0)