STEEM, SBD 가격(KRW) E-mail Notification - Python Script

in #kr-dev7 years ago

안녕하세요 @flyyou입니다.

오랜만에 코딩관련된 포스팅을 올리네요

이번에 공부삼아 만들어본 Python Script는 STEEM과 SBD의 가격을 조회한 후
config파일에 설정된 특정 가격 이상으로 올랐다면 이메일을 보내주는 Script입니다.

아래 내용을 보기전에

제가 이전에 올려놓은 포스트를 보시면 한결 이해하기 수월합니다.

이메일을 받은 화면을 보면 아래와 같습니다.
일단 단순하게 해당 코인과 가격만 보여줍니다. 너무 심플한가요? ^^

우선 Script를 수행하기 전에 아래와 같이 coinCheck.ini 파일을 작성해 주어야 합니다.

  • coinCheck.ini
[Preferences]
Email:true

[Emails]
To:~~~~@gmail.com
From:~~~~@naver.com

[Values]
STEEM:1400
SBD:1100

[Preferences]는 Email 전송여부를 설정하는 부분입니다.
[Emails]는 보내는 사람 메일주소와 받는사람 메일주소를 설정하는 부분입니다.
[Values]는 코인 가격을 알람받을 기준이 되는 가격을 설정합니다.
설정한 가격 이상이 되면 이메일 알람을 받게 되는 것입니다.

아래는 Script 소스입니다.
주석을 하나하나 달아놓아서 보시는데 도움이 되실 것입니다.

import threading
import sys
import configparser
from urllib import request
import winsound
import json
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
import smtplib

def main():

    print("### STARTING... ###")

    if len(sys.argv) != 2:
      print('please include the arguments: fromEmailPassword.')
      sys.exit()

    # argument로부터 이메일 암호를 가져옵니다.
    fromEmailPW = sys.argv[1]

    # init and import the configuration file
    Config = configparser.ConfigParser()
    Config.read('coinCheck.ini')

    # checkCoin 함수를 호출합니다. 호출할때 URL과 Config 그리고 이메일 암호를 같이 전달합니다.
    checkCoin('https://min-api.cryptocompare.com/data/pricemulti?fsyms=STEEM,SBD&tsyms=BTC,USD,KRW', Config, fromEmailPW)

def sendEmail(emailtext, fromEmail, fromEmailPW, toEmail):
    # message의 MIMEMutipart를 지정해 줍니다. 해당 메시지는 텍스트로 전송됩니다.
    msg = MIMEMultipart('alternative')
    # 받는 분 이메일을 설정합니다.
    msg['To'] = toEmail
    # 제목을 설정합니다.
    msg['Subject'] = 'Coin Notification!!!'
    # 보내는분 메일을 설정합니다.
    msg['From'] = formataddr((str(Header('Python Coin', 'utf-8')), fromEmail))
    # 해당 메일 제목인 emailtext를 plain으로 설정하여 메일을 전송합니다.
    part1 = MIMEText(emailtext, 'plain')
    # 메일 내용을 메일에 attach하는 부분입니다.
    msg.attach(part1)
    # smtp서버에 SSL로 접속하는 부분입니다.
    # google은 보안이 강화되어서 되지 않아 네이버로 설정하였습니다.
    #server = smtplib.SMTP('smtp.gmail.com', 587)
    server = smtplib.SMTP_SSL('smtp.naver.com', 465)
    # smtp서버에 접속해서 ehlo를 실행합니다.
    # 해당부분은 메일서버에 접속해서 helo와 같은 의미이며 자기 자신이 누구인지 통지합니다.
    server.ehlo()
    #server.starttls()
    # 메일서버에 로그인 합니다.
    server.login(fromEmail, fromEmailPW)
    # 메일을 전송합니다.
    server.sendmail(fromEmail, toEmail, msg.as_string())
    # 서버와의 접속을 종료합니다.
    server.close()
    # 완료되었다는 로그를 기록합니다.
    print('successfully sent the email')

def notify(config, coinName, coinValue, fromEmailPW):
    # 이메일로 전송할 내용을 구성합니다.
    text = 'Coin Notification !!! [ ' + coinName + '] : value = ' + coinValue.__str__()
    print(text)

    # config파일의 설정값에 Email을 보내는 것으로 설정이 되어있는지 체크합니다.
    if config.get('Preferences', 'Email') == 'true':
        # 이메일을 전송하는 sendEmail 함수를 호출합니다.
        sendEmail(text, config.get('Emails', 'From'), fromEmailPW, config.get('Emails', 'To'))

def checkCoin(url, config, fromEmailPW):
    # 주기적으로 api를 호출하기위해서 Timer라는 것을 이용해서 20초간격으로 조회를 하라고 Thread를 설정을 해 주는 부분입니다.
    threading.Timer(20, checkCoin, [url, config, fromEmailPW]).start()
    # cryptocompare.com의 API를 호출하는 것입니다.
    # 중간에 파라미터로 ?fsyms=STEEM으로 조회를 원하는 코인과 &tsyms=BTC,USD,KRW 보고자 하는 가격을 넣으시면 됩니다.
    # URL은 main으로부터 전달받은 'https://min-api.cryptocompare.com/data/pricemulti?fsyms=STEEM,SBD&tsyms=BTC,USD,KRW'입니다.
    data = request.urlopen(url).read(2000)  # number of chars that should catch the announcement

    print("########### http data ############")
    #print(data)

    # 위의 API 결과에서 데이터를 추출해 주는 부분입니다. json_data로 데이터가 추출됩니다.
    json_data = json.loads(data)
    print(json_data)
    print("STEEM : %d" % json_data["STEEM"]["KRW"])
    print("SBD : %d" %json_data["SBD"]["KRW"])

    # 추출된 json_data에서 STEEM, SBD의 KRW값을 추출하기 위함입니다.
    krw_steem = json_data["STEEM"]["KRW"]
    krw_sbd = json_data["SBD"]["KRW"]

    # 알림을 받을 가격 한계치를 config파일에서 읽어옵니다.
    val_steem = config.get('Values', 'STEEM')
    val_sbd = config.get('Values', 'SBD')

    # STEEM 가격이 config파일에 설정된 가격을 넘었는지 판단하는 부분입니다.
    if krw_steem > float(val_steem):
        print("▲▲▲")
        # 코인가격이 설정된 가격보다 높으면 소리를 들려줍니다.
        winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)
        # 코인가격이 설정된 가격보다 높으면 이메일을 전송하는 함수를 호출합니다.
        notify(config, "STEEM", krw_steem, fromEmailPW)
    else:
        print("Nothing")

    if krw_sbd > float(val_sbd):
        print("▲▲▲")
        winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)
        notify(config, "SBD", krw_sbd, fromEmailPW)
    else:
        print("Nothing")

main()
Sort:  

I am Groot! :D

:D

상세한 주석과 함께 깜끔한 코드네요.
좋은 포스팅 감사드립니다 :)

좋게 봐주셔서 정말 감사합니다.

상세한 주석까지~~ 감사합니다

별말씀을요~ 이렇게 댓글 달아주시고 업보팅 해주셔서 정말 감사합니다. 즐거운 주말 되세요~

개발의 ㄱ 도 모르기에.. 이런포스팅 보면.. 대단하신것 같습니다..

별말씀을요~ 과찬이십니다. 파이썬에 대해서 하나씩 하나씩 배워가보려고 이것저것 해보고 있습니다. 댓글 및 업보팅 정말 감사합니다~

학생이신가요? 멋지시네요

좋게봐주셔서 감사합니다. 직장인입니다. ^^

Congratulations @flyyou! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of comments

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

wow

슬리퍼 이벤트 당첨결과 확인하러오세요!ㅎㅎ