๐Ÿ’ฌ์ž๋™ ๋ฌธ์ž ์ „์†ก ์‹œ์Šคํ…œ ๋งŒ๋“ค๊ธฐ

์ตœ๋ฏผ์„ยท2021๋…„ 1์›” 30์ผ
1

Toyproject

๋ชฉ๋ก ๋ณด๊ธฐ
6/8
post-thumbnail

๊นƒํ—ˆ๋ธŒ ํ”„๋กœ์ ํŠธ ๋งํฌ๋ฅผ ๋“ค์–ด๊ฐ€์„œ ํ™•์ธํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•œ ์ด์œ 

์ž‘๋…„ 3์›”๋ถ€ํ„ฐ ๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ 8๊ธฐ ๋ฉค๋ฒ„ ๋ชจ์ง‘์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋‹น์‹œ ์ง€์›์ž ์ˆ˜๋Š” ์•ฝ 90๋ช… ์ด์ƒ ๋˜๋Š” ์ƒํ™ฉ ์ด์˜€์œผ๋ฉฐ,
์‹ ์ฒญ ํผ์—๋Š” ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์„œ๋ฅ˜ ํ•ฉ๊ฒฉ, ๋ฉด์ ‘ ์•ˆ๋‚ด ๋“ฑ

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ ๋ฌธ์ž๋กœ ์•ˆ๋‚ด๋ฅผ ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.

์šด์˜์ง„์€ ์ด 4๋ช…์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด์•˜์ง€๋งŒ

๊ฒฐ๊ตญ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์€.. ์ธ์›์ˆ˜ ๋Œ€๋กœ n๋ถ„ ํ•˜๋Š” ๋ฟ ์ด์˜€์Šต๋‹ˆ๋‹ค.

์ค‘๊ฐ„์— ์—ฐ๋ฝ์ฒ˜ ์ ์œผ๋ฉด์„œ ๊บผ๋ฒ„๋ฆฐ ์‹ค์ˆ˜๋กœ ์ž์ฃผ ์ผ์–ด๋‚˜์„œ ์ •์‹ ๋‚˜๊ฐ”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ์—ฐ๋ฝ์ฒ˜๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ €์žฅํ•ด์„œ ์ „๋‹ฌํ•˜๋Š” ์ž์ฒด๊ฐ€
๋„ˆ๋ฌด๋„ ๋ฒˆ๊ฑฐ๋กœ์› ๊ณ , ์นด์นด์˜คํ†ก ์นœ๊ตฌ๋กœ๋„ ๋– ์„œ ๋ถˆํŽธํ–ˆ๋‹ค...

ํƒˆ๋ฝ์ž๋ถ„๋“ค๋„ ๋งŽ์€๋ฐ.. ์• ๋งค๋ชจํ•œ ์ƒํ™ฉ..

๊ทธ๋ž˜์„œ ์ž‘๋…„ 2020๋…„ 3์›”๋•Œ๋ฅผ ์ƒ๊ฐํ•˜์—ฌ,
์ด๋ฒˆ์—๋Š” ์–ด๋Š ์ •๋„ ๋น„์šฉ์„ ์ง€๋ถˆ ํ•˜์—ฌ๋„ ๋ˆ์„ ์จ์„œ ์†์ด ํŽธํ•ด์ง€๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‹ค.


SMS ๋ฌธ์ž์„œ๋น„์Šค API

์—ฌ๋Ÿฌ ๋ฌธ์ž์„œ๋น„์Šค ์„œ๋น„์Šค๋ฅผ ์ฐพ์œผ๋ฉด์„œ ๋ฐœ๊ฒฌํ•œ ์‚ฌ์ดํŠธ์ด๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ž์„œ๋น„์Šค๋Š” ์œ ๋ฃŒ๋กœ ๋˜์–ด์žˆ์–ด์„œ ์–ด๋Š ์ •๋„ ๊ฐ์•ˆํ–ˆ๋‹ค.
์™ธ๊ตญ์‚ฌ์ดํŠธ๋กœ Twilio ๋ผ๋Š” ์‚ฌ์ดํŠธ์ด๋‹ค.

์„ ํƒํ•œ ์ด์œ ๋ฅผ ๊ฐ„๋‹จํžˆ ๋‚˜์—ด ํ•ด๋ณธ๋‹ค.
1. API ์‚ฌ์šฉ๋ฒ•์ด ๋งค์šฐ ๊ฐ„๋‹จ.
2. ๊ฐœ์ธ ๋ฒˆํ˜ธ ์œ ์ถœํ•  ์ผ์ด ์—†์ด ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉ
3. ๊ฒฐ์ œ ์ตœ์†Œ ๊ธˆ์•ก์ด ๊ฐ€์žฅ ์ŒŒ๋‹ค. (20๋‹ฌ๋Ÿฌ ์ •๋„)

๊ทธ๋ ‡๊ฒŒ ๊ฐ€์ž…์„ ํ•˜๊ณ ๋‚˜์„œ API KEY + AUTH_TOKEN ๊ฐ’์„ ๋ฐœ๊ธ‰๋ฐ›์•˜๊ณ ,
Python์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณผ์ •

from twilio.rest import Client

# ๋ฌธ์ž API id + token
account_sid = <API_ID>
auth_token  = <TWILIO_TOKEN>
client = Client(account_sid, auth_token)

 # ๊ฑธ๋Ÿฌ์ง„ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜์—ฌ message API ์‚ฌ์šฉ
 message = client.messages.create(
         to='+82'+ PHONE_NUMBER, 
         from_="<SERVER_PHONE_NUMBER>",
         body="<๋ฉ”์„ธ์ง€ ๋‚ด์šฉ>"
)

Python๊ธฐ๋ฐ˜ API ํ˜ธ์ถœ ๊ณผ์ •
1. API ํ‚ค๊ฐ’, ์ธ์ฆํ† ํฐ์„ ์ „๋‹ฌํ•˜์—ฌ ์ธ์ฆ์„ ํ•œ๋‹ค.
2. message์— ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ(from_)์— ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ์ „ํ™”๋ฒˆํ˜ธ ๊ฐ’์„ ์ž…๋ ฅํ•œ๋‹ค.
3. ๋ฐ›๋Š” ์‚ฌ๋žŒ(to)์— "๊ตญ๋ฒˆ"์„ ํฌํ•จํ•œ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
ํ•œ๊ตญ์˜ ๊ฒฝ์šฐ +82 ๋ถ™ํ˜€์ฃผ์–ด์„œ ์ „์†กํ•˜๋ฉด ๋œ๋‹ค.
4. ๋ฉ”์„ธ์ง€ ๋‚ด์šฉ์—(body) ๋ฉ”์„ธ์ง€ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์„œ ์ „์†กํ•˜๋ฉด ๋œ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ „์†ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ, ์ฃผ์˜ ํ•  ์ 

์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ ๋ฃŒ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ํ•  ์‹œ, ๋ฐœ์‹  ๋ฒˆํ˜ธ๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ธ์ฆ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—ฌ์•ผํ•œ๋‹ค.

์ด ์ธ์ฆ์€ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฒˆํ˜ธ ์ €์žฅ์ด ์•„๋‹Œ, ARS์ธ์ฆ ๊นŒ์ง€ ๊ฑฐ์ณ์•ผ๋˜์„œ
์‚ฌ์‹ค ์ƒ, ์ „ํ™”๋ฒˆํ˜ธ๋งŒ ์•„๋Š” ์ƒ๋Œ€์—๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š”
์œ ๋ฃŒ ๋ฒ„์ „์„ ๊ตฌ๋งค ํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ด๋‹ค!

๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ, ์ €๋ฒˆ ํ•ด์ปคํ†ค์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ๋งคํ•œ ํŒ€์›์ด ์žˆ์–ด์„œ
์ปคํ”ผ ํ•˜๋‚˜ ์‚ฌ๋“œ๋ฆฌ๊ณ  ์•„์ด๋””๋ฅผ ๋นŒ๋ ค ๋ฐ›์•„์„œ ์‚ฌ์šฉํ–ˆ๋‹ค. ^-^


์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ปค์Šคํ…€ ์ฝ”๋“œ

์ง€๊ธˆ ํ˜„์žฌ ๊ฐ™์€ ๊ฒฝ์šฐ,
์ผ์ผํด๋ž˜์Šค ์ง€์›์„œ๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ์ธ์›๋“ค์—๊ฒŒ ์•ˆ๋‚ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด์•ผํ•œ๋‹ค.

์ผ์ผํด๋ž˜์Šค ์ง€์›์„œ๋Š” ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์— ์ €์žฅ๋˜๊ฒŒ ๋งŒ๋“ค์–ด์ ธ์„œ
csvํŒŒ์ผ ํ˜•์‹์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ csv ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ ํ•˜์—ฌ,
ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ์›ํ•˜๋Š” ๊ฐ’์ธ ์ „ํ™” ๋ฒˆํ˜ธ๋ฅผ ๋ฝ‘์•„์•ผ ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ „ํ™”๋ฒˆํ˜ธ ํฌ๋งทํŒ…์„ ์„ค์ •์„ ์•ˆํ•ด์ฃผ์–ด์„œ 2๊ฐ€์ง€ ์ „ํ™”๋ฒˆํ˜ธ ํฌ๋งท์ด ๋ณด์˜€๋‹ค.

  • ๋ฒˆํ˜ธ๋งŒ ์ž…๋ ฅ ํ•œ ๊ฒฝ์šฐ ( 00011114444)
  • bar์™€ ํ•จ๊ป˜ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ (000-1111-4444)

์ด ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•ด์„œ ํŒŒ์ผ์„ ์ฝ๊ณ  ์Šฌ๋ผ์ด์‹ฑํ•ด์„œ ๊ฐ’์„ ์ €์žฅํ•ด๋ณด์•˜๋‹ค.

# CSV ๋ฐ์ดํ„ฐ์—ด๊ธฐ

data_file = open('test.csv', 'r', encoding='utf-8')
reader = csv.reader(data_file)
for line in reader:
	# ๋‹จ์ˆœํ•˜๊ฒŒ ๊ธธ์ด๋กœ ๋น„๊ตํ•˜์—ฌ ๋‚˜๋ˆ„์—ˆ๋‹ค.
    if len(line[4]) > 12:
    	# split์œผ๋กœ '-'๋ฅผ ๊ธฐ์ค€ํ•˜์—ฌ ๋‚˜๋ˆ  ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ.
        temp = line[4].split('-')
        # ๋ถ„๋ฆฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณต๋ฐฑ์—†์ด ํ•ฉ์ณ์„œ number_array์— ์ €์žฅ
        number_array.append(''.join(temp))
    else:
    	# ์ •์ƒ์ ์ธ ์ž…๋ ฅ ์‹œ, ๋ฐ”๋กœ number_array์— ์ €์žฅ
        number_array.append(line[4])

๋‘ ๊ฐ€์ง€ ํฌ๋งท์˜ ๊ฒฝ์šฐ๋กœ๋งŒ ๊ฑธ๋Ÿฌ์ ธ์„œ ์ „ํ™”๋ฒˆํ˜ธ ๊ฐ’์ด ๋ฐฐ์—ด์— ์ €์žฅ๋˜๋Š” ํ˜•์‹.


API_ID์™€ AUTH_TOKEN ์ˆจ๊ธฐ๊ธฐ

์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์œ ์ถœ๋œ๋‹ค๋ฉด, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งˆ์Œ๋Œ€๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
๊นƒํ—ˆ๋ธŒ๋‚˜ ๋”ฐ๋กœ ์œ ์ถœ ๋ ๋งŒํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊ฑฐ๋ผ๋ฉด ๊ทธ๋ƒฅ ํ•˜๋ฉด ๋˜์ง€๋งŒ..

๋‚œ ์˜ฌ๋ฆด ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋”ฐ๋กœ ๋นผ์„œ ์ €์žฅํ•ด๋ณด์•˜๋‹ค.

{ 
  "auth_token":"<token ํ‚ค>",
  "my_phone_number":"<์„œ๋ฒ„ ์ „ํ™”๋ฒˆํ˜ธ>"
}

์œ„ ์ฝ”๋“œ๋Š” secretkey.json ํŒŒ์ผ์ด๋‹ค.

# Secret.json ์ฝ๊ธฐ
with open('secretkey.json') as token:
    json_data = json.loads(token.read())
    TWILIO_TOKEN = json_data["auth_token"] 
    # ํ† ํฐ ๊ฐ’ ๊ฐ€์ ธ์™€์„œ ์ €์žฅ
    MY_PHONE_NUMBER = json_data["my_phone_number"] 
    # ๋ณด๋‚ด๋Š” ์ „ํ™”๋ฒˆํ˜ธ ์ €์žฅ(๋‚ด์ „๋ฒˆ)

๊ทธ๋ ‡๊ฒŒ jsonํŒŒ์ผ๋กœ ๋ฐ›์•„์˜จ ๊ฐ’์„ ๊ฐ€์ ธ ์˜ต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ํ‚ค ๊ฐ’์„ ์ˆจ๊ฒจ์„œ, ๋กœ์ง์„ ๊ณต๊ฐœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์›Œ๋‚™ ๊ฐ„๋‹จํ•œ ํ† ์ดํ”„๋กœ์ ํŠธ๋กœ ํ•œ ๊ฒŒ์‹œ๊ธ€๋กœ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ตœ๋Œ€ ๋‹จ์ ์ด๋ž€ ์—ญ์‹œ ์œ ๋ฃŒ ์„œ๋น„์Šค๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ! ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
๋ฌด๋ฃŒ์„œ๋น„์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋งŒ.. ์—†์–ด์„œ ์•„์‰ฌ์šธ ๋ฟ์ด๋‹ค...

์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋ฅผ ์ด์šฉํ•ด, ๊ฐ„๋‹จํ•œ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑ ํ•ด๋ณผ ์ƒ๊ฐ์ด๋‹ค.

profile
๋˜๋Œ์•„๋ณด๋ฉฐ ์„ฑ์žฅํ•ฉ๋‹ˆ๋‹ค๐Ÿ”จ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 2์›” 23์ผ

์ €๋„ ์“ฐ๋ ต๋‹ˆ๋‹ค ...

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ