Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

자작앱 설명서

자작 앱 설명서 : 로또에 관심 있으세요? (FCM 전송하기 feat Python)

Billcorea 2022. 4. 10. 13:25
반응형

https://play.google.com/store/apps/details?id=com.billcoreatech.getLotto

 

Get Lotto 로또 번호를 드립니다. - Google Play 앱

매주 요청한 요일에 로또 번호를 무작위로 보내 드립니다.

play.google.com


앱을 하나 또 게시했어요. 기능 구현을 위해서 firebase을 사용하고
번호 전달을 위해 python을 이용했습니다.  random 번호를 추출하기 때문에 당첨이 되거나 하지는 않겠지만, 
python을 이용해서 firebase readtime database을 활용하는 방법이 나올 듯합니다. 

 

또한 24시간 365일 컴터 하나를 켜 두어야 하는데, 그럴 수는 없으니, rasberry pi 3을 사용하기로 했습니다. 

os는 linux 계열을 사용했고요. 

 

crontab에 등록을 해 두었기 때문에 매일 반복적인 작업이 가능합니다. 

앱 설명서


게시된 앱의 설명이에요.

이제 random 을 이용해서 숫자를 만들고 전송하는 python code을 살펴볼게요...

import datetime
import json
import random
import sqlite3

# 2021.11.13 FCM 전송을 위한 수정
import firebase_admin
import requests
import telegram
import urllib3
from bs4 import BeautifulSoup
from firebase_admin import credentials
from firebase_admin import db

# 로컬에 저장을 해 두기 위해서 python 코드로 sqlite 테이블 만들어서 사용
conn = sqlite3.connect("opDeGangDB.sqlite", isolation_level=None)
# 커서 획득
rs = conn.cursor()
# 테이블 생성 (데이터 타입은 TEST, NUMERIC, INTEGER, REAL, BLOB 등)
rs.execute(''' CREATE TABLE IF NOT EXISTS LottoResult
              (id integer PRIMARY KEY, 
              hei text, 
              num1 text, 
              num2 text, 
              num3 text, 
              num4 text, 
              num5 text, 
              num6 text, 
              bonus text)
    ''')

# 저장된 마지막 회차를 구하기 위해서 
# 저장된 값이 string 이라서 int 타입으로 변환해서 찾음.
rs.execute('''
        select max(cast(hei as integer)) from LottoResult
    ''')
getHei = rs.fetchone()[0]

print(getHei)

# 마지막 회차는 삭제 
# 아래에서 다시 받음.
rs.execute('''
    delete from LottoResult
    where hei = {0}
'''.format(getHei))

# 동행복권 사이트에서 당첨 숫자를 파싱 하기 위해서
def getNumParase(getNum):
    # print(getNum)
    x = getNum.split('+')
    bonus = x[1].replace('.','')
    num = x[0].split(',')
    num.append(bonus)
    return num

# 동행복권 사이트 읽어오기
# 1등 당첨 번호만 마자막 회차와 다음 회차를 구함
# 그래야 최종 당첨 회차까지 구해짐.
baseUrl = "https://dhlottery.co.kr/gameResult.do?method=byWin"
for id in range(getHei, getHei+2):
    parameter = {'drwNo': id}
    res = requests.post(baseUrl, params=parameter)
    bs = BeautifulSoup(res.text, 'html.parser')
    desc = bs.find(id="desc")
    getText = desc['content']
    getNow = getText.split(' ')[1].replace('회','')
    getNum = getNumParase(getText.split(' ')[3])
    print(getNow + " " + str(getNum))

    # 한번 구해진 다음에는 null 이 오는 경우가 있어서
    try:
        rs.execute(''' 
            insert into LottoResult (hei, num1, num2, num3, num4, num5, num6, bonus)
            values ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7})
        '''.format(getNow, getNum[0], getNum[1], getNum[2], getNum[3], getNum[4], getNum[5], getNum[6]))
    except:
        pass

token = "2052..........................FBZM71o"
id = "8.....0"

# 텔레그램 봇으로 실행 되고 있음을 알려 주기 위해서...
bot = telegram.Bot(token)
now = datetime.datetime.now()

androidMsg = "이번 주({0}) 로또 번호를 알려 드려요...\n".format(now)
bot.sendMessage(chat_id=id, text=androidMsg)

# randint 을 이용해서 숫자 만들기
def getNum():
    number = []
    for i in range(0, 6):
        iNo = random.randint(1, 45)
        try:
            number.index(iNo)
        except:
            number.append(iNo)
    return number

# 여기서 5회차 분의 숫자를 구함.
def getLotto645(androidMsg):
    for i in range(0, 5):
        while True:
            numX = getNum()
            numX.sort()
            if len(numX) == 6:
                break
        androidMsg += json.dumps(numX) + "\n"

    return androidMsg

bot.sendMessage(chat_id=id, text="행복한 한 주 되세요")

#Firebase database 인증 및 앱 초기화
cred = credentials.Certificate('./services_firebase.json')
firebase_admin.initialize_app(cred,{
    'databaseURL' : 'https://getlo.....................atabase.app'
})

# FCM 전송을 하기 위해서 구한 함수 medium.com 에서 구함.
def lambda_handler(token, context):
    FCMToken = token

    Data = {'data': {'title': 'Lotto 보내 드립니다.', 'body': context}, 'to': FCMToken}
    Headers = {'Content-type': 'application/json',
               'Authorization': 'Key=AAAAR_0M6y...................xVA-T9frSd3VCSUIRXXn1PSxhOKgqroBVqTaxmWk'}
    http = urllib3.PoolManager().request('POST', 'https://fcm.googleapis.com/fcm/send', headers=Headers,
                                         body=json.dumps(Data))

    return {'statusCode': 200, 'body': json.dumps('Hello from Lambda!')}

# 전송해줄 요일을 구하기 위해서.
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
weekDay = datetime.datetime.today().weekday()

# firebase 에 저장된 사용자 정보 획득.
userInfo = db.reference('UserInfo')
sendNumber = db.reference('sendNumber')

# print(type(userInfo.get()))
for val in userInfo.get().values():
    # 오늘 보내야 하는 것만 보냄.
    if val["weeklyReceived"] in days[weekDay]:
        androidMsg = ""
        # 범호를 구하고
        androidMsg = getLotto645(androidMsg)
        # 번호를 보내주고
        lambda_handler(val['userToken'], androidMsg)
        print('send to ' + val['userToken'] + " " + val["weeklyReceived"] + " sendNumber(" + androidMsg + ")")
        # 보내준 번호 기록
        sendNumber.update({val['accountId'] : {'accountId': val['accountId'], 'sendNumber': androidMsg, 'sendDateTime': '{0}'.format(datetime.datetime.now())}})

# 작업 끝.
print('END JOB ...')

자료 전송을 위해서 SQlite을 이용해서 파싱 된 데이터를 참조해서 로또 당첨 번호를 기록해 두고 있어요.  

 

중간에 lambda_handler 함수는 다른 분이 posting 하신 코드를 참조해서 FCM 전송을 하고 있는데, 설정만 잘하면 전송하는 것은 문제가 없이 잘 사용하고 있습니다. 

https://medium.com/@sunyi233/python%EC%9C%BC%EB%A1%9C-fcm-push-%EB%B3%B4%EB%82%B4%EA%B8%B0-431b7a17c151

 

Python으로 FCM push 보내기

Firebase엔 FCM이라는 Push 서비스가 있습니다. 간단한 설정으로 안드로이드 앱이나 아이폰 앱에 push를 보낼 수 있습니다.

medium.com

 

다음 posting에서는 안드로이드 앱에 관한 부분을 기술해 볼게요.

 

좋은 일이 있기를 바라요.

반응형