본문 바로가기
프로젝트

[twilio] 무료 크레딧으로 파이썬 문자 발송하고 스트림릿 배포하기!

by 포 키 2023. 11. 17.
728x90

오늘은 프로젝트에서 진행할 스트림릿에서 문자 발송하기를 구현해봤다.

먼저 twilio가 잘 되는지 확인하는 것은 간단했다.

회원가입을 하면 15 달러의 크레딧을 주는데 무료로 테스트 해볼 사람들에겐 너무 편하고 좋다.

하나의 단점이라고는 무료를 사용하다보니, 본인의 연락처로만 발송이 가능했다는 것이다.

그러나 우리는 그냥 프로젝트일뿐? 굳이 누군가한테 보낼 일은 없었기에 그냥 무료 크레딧만 사용했다.

지금부터 twilio 사용에 대해 작성해보려한다.

 

 

0. 기본 세팅

twilio 사이트에서 무료로 회원가입을 해주자!

회원가입은 그냥 하라는대로 쉽게 할 수 있었다.

중간에 전화번호 인증도 한번 해주고 한국 사이트와 같은 방법이라서 굳이 다루지 않으려한다.

그리고 주피터나 코랩이 아닌 로컬 환경을 열어주자!

파이참이나 vs code를 사용하면 되겠다. (나는 vs code를 사용했다.)

 

 

1. 문자 발송 확인하기

먼저 가입해서 받은 무료 크레딧으로 문자 발송이 잘 되는지 확인을 해줄 필요가 있다.

나는 1차로 사이트에서 전송해보기 버튼을 눌러서 해봤고, 2차로 로컬환경에서 코드를 복사해와서 해봤다.

로컬환경에서는 파이썬을 선택하고 복사해오면 되는데 나는 문구가 길었어서 문구를 통으로 묶는처리를 해야했다.

 

               (왼쪽) 사이트에서 전송해보는 기능                                                     (오른쪽) 코드와 내전용 토큰 확인 및 복사해오기

 

 

2. 로컬환경에서 실행해보기

로컬 환경에서 스트림릿으로 배포하는 기능까지 추가하고 싶었다.

그래야 우리 프로젝트에서 이것도 했다! 하고 보여줄 수 있기에 바쁘지만 부족하게 보이고 싶지 않은 마음에 해봤다.

먼저 내가 구현하고자 하는 1차적으론 개인정보 처리방침에 동의해야할 것, 2차적으론 문자가 발송될 것 이었다.

그래서 한파일에 모든 코드를 다 담아내기보단 깔끔하게 기능별로 파일을 구분해야겠다는 생각이 들었다.

 

- 코드


agree.py

import streamlit as st
import requests
from PIL import Image
from io import BytesIO
from message import show_message

def main():
    st.markdown("""
        <h1 style='text-align: center;'>개인정보 처리방침 동의서</h1>
    """, unsafe_allow_html=True)

    image_url = "https://github.com/HaJeong-K/Multi-Telecom/raw/main/twilio/개인정보처리방침.png"
    response = requests.get(image_url)
    
    if response.status_code == 200:
        with open("temp_image.png", "wb") as f:
            f.write(response.content)

        image = Image.open("temp_image.png")
        st.image(image, caption="이미지", use_column_width=True)
    else:
        st.error("이미지를 불러올 수 없습니다.")

    st.header("Twilio를 통한 메시지 발송 시 유의사항")
    st.markdown("""
        - 목적 제한: 개인정보는 명시된 목적 이외에 사용되지 않음.
        - 안전한 전송: Twilio를 통한 메시지 전송 시 암호화 및 보안 프로토콜 사용.
        - 동의 절차: 개인정보를 Twilio를 통해 처리 전, 사용자 동의 얻어야 함.
        - 접근 제어: Twilio 계정에 접근 권한을 제한하여 불법 접근 방지.
        - 보안 업데이트: Twilio 및 관련 서비스의 보안 업데이트 주기적으로 확인.
    """)

    if st.button("동의하기"):
        st.session_state.agreed = True
        st.success("동의가 완료되었습니다. 메세지 발송을 위해 아래를 확인해주세요.")
        show_message()

if __name__ == "__main__":
    main()

 


message.py

from twilio.rest import Client
import streamlit as st
import time

def send_twilio_message(message_body, to_phone_number):
   
    account_sid = '본인이 부여받은 시드 번호'
    auth_token = '본인이 부여받은 토큰 번호'
    twilio_client = Client(account_sid, auth_token)

    try:
        message = twilio_client.messages.create(
            from_='본인이 부여받은 번호',
            body=message_body,
            to=to_phone_number
        )
        st.success("메시지가 성공적으로 전송되었습니다. SID: {}".format(message.sid))
    except Exception as e:
        st.error("메시지 전송 중 오류가 발생했습니다: {}".format(str(e)))

def show_message():
    st.title("안내메세지를 받아보세요!")

    # 기존 코드에서 변경한 문자 통으로 묶는 부분!
    message_body = '''
    
(안내)[KT안내]서울 지역 65세 이상 고객 대상 디지털 기기 무료 교육 및 요금 할인, 새로운 가족 결합 안내 

1) 서울 지역 65세 이상 고객에게만 드리는 디지털 기기 무료 교육 이벤트♥
가까운 디지털 배움터, 대리점, 플라자, 체험형 플라자에 방문하셔서 이용해 보세요!

▶무료 교육에 대해 자세히 알아보기 : 링크

서울 지역 디지털 기기 무료 교육
▶기간 : 2023.12.01.~2023.12.31.
▶대상 : 서울에 주소를 두고 있는 서울 특별 시민인 65세 이상 고객
▶장소 : 서울 전 지역의 디지털 배움터, 대리점, 플라자, 체험형 플라자
▶혜택 : 디지털 기기 무료 교육을 수료한 고객에게는 월 10% 요금 할인까지

2) 새로운 가족 결합 안내
인터넷 사용을 안 하신다고요? 5회선 이상 결합을 하고 싶으시다고요? 걱정마세요 저희 KT가 해드릴게요. 거기다 급하게 데이터가 필요한 고객님이라면 가족 간 데이터 공유도 가능합니다.

▶내용 : 인터넷 사용 안 하는 사람도 결합 가능, 회선 제한 X, 데이터 쉐어링 제한 없음

▶변경 전 : 5회선까지, 인터넷 + 모바일 결합 기준, 데이터 쉐어링 제한 있음

고객님을 위해 항상 최선을 다하는 KT가 되겠습니다.

감사합니다.

[마음을 담다 DIGICO KT]
        '''

    to_phone_number = st.text_input("수신자 전화번호", "+8210")

    send_twilio_message(message_body, to_phone_number)

 

- 스트림릿 페이지

** 개인정보 처리방침 동의서는 내가 임의로 작성한 것으로 kt와는 아무런 상관이 없음을 명시한다.

 

여기서 동의하기를 누르면 안내 메세지를 받아보라는 추가 문구가 뜬다.

개인정보 처리방침에 동의하지 않으면, 메세지를 받을 수 없는 구조이다.

 

 

여기서 (무료 크레딧이니) 내 번호로 문자 메세지를 발송시켜서 성공할 경우에만 성공했다는 문구와 시드가 뜨도록 했다.

 

- 실제 문자로 받는 내용

** 문자 내용은 프로젝트와 연결해서 마케터 지망 팀원분께서 직접 만드신 것으로 kt와는 아무런 상관이 없음을 명시한다.

 

 

아쉬운 점

내가 실질적으로 구현하고 싶었던 부분은 개인정보 처리방침을 동의하는 사람에 한해서 메세지 발송을 할 수 있도록 하는 것이었다.

장고나 다른 웹을 개발하는 툴이었으면, 페이지를 넘어가도록 할 수 있지만, 스트림릿은 대시보드용이라 불가능했다.

개인정보 처리방침을 팝업으로 띄울 수 있을까 하는 생각도 해봤지만, 이 역시 지원하는 기능이 아니어서 아쉬웠다.

그리고 문자 서비스를 위해 twilio를 사용하다보니 앞에 쓸모없는 문구가 자동으로 붙게되는 것이 아쉬웠다.

해외 번호로 와서 스팸으로 차단되거나, 신뢰하지 못하는 경우도 분명 있을 거라 생각해서 이 부분 역시 아쉬웠다.

가장 큰 문제점이 하나 있었다.

message.py 코드를 보면 알듯 내가 입력할 번호를 직접 입력하고, 전송버튼을 눌러서 보내는 걸 구현하고 싶었다.

그렇지만.. 아무리 코드를 찾아보고 바꿔봐도 전송버튼을 생성하는건 문제가 없었지만,

전송버튼을 누르면 동의하기 부분으로 다시 세션이 초기화되면서 실제로 전송도 되지 않았다.

이 부분을 변경하려고 세션을 저장하는 방법도 사용해봤지만, 페이지가 변경되지 않는데 같은 기능을 이미 동의하기 버튼으로 구현이 된 상태에서 전송하기를 그 안에서 또 실행하려니까 안되는 느낌이었다.

아마 이 부분이 수정되지 않는다면, 문자 메세지 발송은 더 붙들지 않고 한계점에서 다룰 생각이다.

 

 

느낀점

그래도 이 부분을 내가 찾아서 해냈다는 것에 뿌듯함이 제일 큰 것 같다.

셀레니움을 해냈을 때만큼 뿌듯함을 느끼는 것 같다. ㅋㅋㅋㅋㅋ

여러 아쉬운 한계점을 맞닿고 부딪혀보기도 했는데, 이런 과정이 결국 직접해본 나에겐 경험으로 쌓이는 것이라 다음에는 오늘을 바탕으로 더 공부해서 잘 구현하면 된다는 생각을 한다.

728x90