🖥️ 시작하며 이전 포스팅에서는 개인 사용자들을 위한, 로컬 사용자들만을 위한 프로그램이었습니다. 그렇다면 이번에는 여러 사용자들을 가입시켜 이메일로 할인 정보를 보내주도록 코드를 업데이트 해보도록 하겠습니다. 이 사이트와 비슷한 기능을 수행합니다! 💡 로직 순서 사용자의 성, 이름, 이메일을 받아와서 스프레드시트에 저장합니다. 사실 간단합니다. 해당 정보들만 가져오면, API 서비스를 이용해 사용자들에게 이메일만 보내면 됩니다. 주의사항! Sheety API를 사용할 때, 열의 제목을 JSON에서 취급할 때는 아래 사진과 같게 해야 합니다.. 요즈음 API를 건들 때마다 Docs를 잘 봐야겠다는 생각이 항상 드네요. 또한 이전 코드에서 고쳐야 할 점은 다음과 같습니다. 항공편이 아예 없는 경우, 오류가..
로직 구글 시트에 가고 싶은 장소, 가격 상항선, 국가코드 저장 API를 이용해 Flight Search에서 가격 찾기 상한선 아래면 그에 대한 데이터와 가격을 SMS로 전송 코드 전문 # main.py from data_manager import DataManager from flight_search import FlightSearch from flight_data import FlightData from notification_manager import NotificationManager from datetime import datetime, timedelta data = DataManager() sheet_data = data.get_data() # iataCode가 비어있을 시 for i in s..
시작하며 오늘도 초미니 프로젝트를 하나 만듭니다! 운동에 관한 자연어 처리를 해주는 뉴트리셔닉스 (Nutritionix)을 이용해 자연어 처리로 오늘 무슨 운동을 했는지 대충 입력하면, 알아서 분류해 엑셀 시트에 넣어주는 프로그램입니다. 코드 전문 # main.py from exercise import Exercise from sheety import Sheety query = input('Tell me which exercises you did : ') p1 = Exercise(query=query) p1.post_exercise() put = Sheety(p1.get_exercise()) put.post_sheety() # exercise.py """뉴트리셔닉스 핵심 코드""" from dotenv ..
시작하며 API에서 header을 이용하면 고급 인증 방식을 쓸 수 있습니다. 또한, request 모듈에서 POST, PUT, DELETE를 사용할 수 있습니다. GET, POST, PUT, DELETE GET : 외부 시스템에 특정한 데이터를 요청합니다. POST : 외부 시스템에 데이터를 전송합니다. 전송의 성공 유무만 중요하고, 이에 대한 응답은 중요하지 않습니다. 데이터를 게시할 때 많이 사용합니다. PUT : 데이터를 업데이트합니다. DELETE : 외부 서비스의 데이터를 삭제합니다. 습관 추적기 프로젝트 이 사이트를 이용해서 습관 추적기를 만들어보겠습니다. 해당 서비스의 API 문서를 보면, 아래와 같이 코드를 짤 수 있습니다. from dotenv import load_dotenv impo..
시작하며 오늘은 초미니 프로젝트로 주식 거래를 도와주는 파이썬 프로그램을 만들려고 합니다. 관심 주식의 주식 시세를 가져옵니다. API를 활용합니다. 날짜별로 폐장 가격을 가져와 가격을 비교해 얼마나 상승했는지, 하락했는지 보여줄 수 있습니다. 관심 주식에 관련된 뉴스를 가져옵니다. 왜 지표가 상승했는지, 하락했는지에 대한 정보를 얻을 수 있습니다. 이에 대한 중요한 정보를 SMS로 전송합니다. 코드 전문 from dotenv import load_dotenv import os import requests from twilio.rest import Client load_dotenv() STOCK = "TSLA" COMPANY_NAME = "Tesla Inc" PERSENT_5_UP = False para..
시작하며 API는 Application Programming Interface로, 이를 이용해 소프트웨어를 생성하거나 외부 시스템과 상호작용 할 수 있습니다. 이용자들은 누구나 API의 규칙에 맞게 외부 시스템에 데이터를 요청해 응답받아 데이터를 사용할 수 있습니다. 대충 레스토랑에 우리가 주방에 직접 들어가서 음식을 만들 수는 없지만, 메뉴에 있는 음식을 주문할 수 있다고 생각하면 됩니다. API에서 가장 중요한 것은 API 엔드포인트 입니다. 쉽게 말해서 주소를 알아야 한다는 것인데, 보통 github.io같은 URL로 표현됩니다. API Request 도 중요합니다. 데이터를 요청해 빼 오는 것인데, 정식 절차를 밟아야 데이터를 건네주는데 여기서 정식 절차가 API라고 할 수 있습니다. 가장 간단한..
시작하며 직전에 포스팅한 smtplib와 datetime을 공부하고, 초초초미니 프로젝트를 한번 만들어 보았습니다. 이번에는 생일을 축하하는 이메일을 자동으로 보내는 초미니 프로젝트를 만들어보려고 합니다. 생일 축하 프로젝트? 프로젝트에서 각 파일들을 봅시다. letter_templates : 메일 양식 birthdays.csv : 연명부. name,email,year,month,day 양식으로 되어 있음 main.py : 코드 작성 이제 구현해야 할 기능들을 살펴봅시다. 1. `birthday.csv`에서 현재 생일인 사람을 가져옵니다. 2. `letter_templates`에서 랜덤한 양식을 가져와 빈칸을 채워 넣습니다. 3. 메일을 보냅니다. 코드 전문입니다. 이번에는 좀 빠르게 구현해보려고 구현에..
시작하며 파이썬에서는 smtplib 모듈을 사용해 이메일을 보낼 수 있습니다. 내장 라이브러리로, 따로 설치할 필요는 없습니다. 시작하기 전에, Google의 정책 변경으로 단순히 아이디와 비밀번호만 기입해서는 파이썬에서 이메일을 보낼 수 없습니다. 이에 대해서 이 분 블로그가 스크린샷으로 설명을 되게 잘해주셔서 링크해봅니다. smtplib import smtplib my_email = "your_email" password = "your_password" connection = smtplib.SMTP("smtp.gmail.com") connection.starttls() connection.login(user=my_email, password=password) connection.sendmail(fro..
반복을 재귀적으로 바꾸기 처음에는 While문을 쓰고, 맞는 값을 입력받은 구간에 break를 쓰는 방법을 생각했다. while True: try: text = input("Enter a word: ") res = [dict_df[i] for i in text.upper()] except KeyError: print("Sorry, only letters in the alphabet please.") else: print(res) break 공부하던 중, 아래 방법이 훨씬 좋다는 것을 배워서 기록해본다. 해당 구간을 함수로 돌린 후, except 부분에 해당 함수를 넣어 재귀적으로 구현했다. def generate(): try: text = input("Enter a word: ") res = [dict_..
내장함수 활용 df.loc[df[열 이름] = 값] 형태로 조회한 후 해당 행의 갯수들을 세는 방법이 있다. len(df.loc[df['온도'] == 30]) # df[df['온도'] == 30]과도 같다. collections 모듈 활용 collections 모듈의 Counter 메소드를 활용하면 해당 열에 존재하는 모든 값들의 개수들을 가져올 수 있다. 아래와 같은 csv 파일이 있다고 하자. day,temp,condition Monday,12,Sunny Tuesday,14,Rain Wednesday,15,Rain Thursday,14,Cloudy Friday,21,Sunny Saturday,22,Sunny Sunday,24,Sunny 여기서 온도를 비교하고 싶다고 할 때, 아래와 같이 Counter..
코드를 짜다가 리스트에서 맨 뒤의 요소부터 바로 앞의 요소로 덮어씌워야 하는 일이 생겼다. 가장 먼저 생각할 수 있는 방법은 인덱싱을 이용하는 것이다. # 간단하게 좌표라고 생각 class Pair: def __init__(self, x, y) -> None: self.x = x self.y = y def __repr__(self) -> str: return f"({self.x}, {self.y})" # 좌표들을 저장할 리스트 생성 list_pair = [] # (0, 0), (1, 1) 등등 좌표 생성 for i in range(5, 0, -1): tmp = Pair(i, i) list_pair.append(tmp) print(f"이전 : {list_pair}") # 맨 뒤의 요소부터 그 앞의 요소로 ..
range range는 어떤 정수 집합을 반복해야 하는 과정이 필요할 때 유용하다. from random import randint random_bits = 0 for i in range(32): if randint(0, 1): random_bits |= 1 > 0b11001000000001100000010110010 위 코드는 실행할 때 마다 랜덤한 값이 나온다. 9번째 줄에 있는 randint 덕분에 random_bits |= 1 > 1: 빨강 2: 파랑 3: 노랑 4: 초록 허나 위 코드는 조금은 투박해 보인다. 몇 번째 원소를 접근 중인지 알기 위해 리스트의 크기를 알아야 하고, 인덱싱을 사용해 배열 원소에 접근해야 한다. 코드가 짧으니 알아보기 쉽겠지만 단계가 많아 나중에 코드가 길어지면 읽기 ..