
1. IoT 디바이스 설정
2. IoT 데이ㅣ터 저장 서비스 구성
3. 모니터링 및 관리 시스템 개발
[√] 팀 깃허브 만들기
[√] 팀 노션 만들기
python파일으로 만들기
# PyQt 복습 - 직접 디자인 코딩
import sys
from PyQt5.QtWidgets import *
class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.lblMessages = QLabel('메시지: ',self)
        self.lblMessages.setGeometry(10,5,300,50)
        btnOK = QPushButton('OK',self)
        btnOK.setGeometry(280,250,100,40)
        # PyQt event(signal) -> 이벤트핸들러(슬롯)
        btnOK.clicked.connect(self.btnOK_clicked)
        
        self.setGeometry(300,200,400,300)
        self.setWindowTitle('복습PyQt')
        self.show()        
    def btnOK_clicked(self):
        self.lblMessages.clear()
        self.lblMessages.setText('메시지: OK')
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    sys.exit(app.exec_())
Qt Designer 사용
경로 : C:\DEV\Langs\Python311\Lib\site-packages\QtDesigner

# QtDesigner 디자인 사용
import sys
from PyQt5 import QtGui,QtWidgets,uic
from PyQt5.QtWidgets import *
class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/mainApp.ui',self)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())
# QtDesigner 디자인 사용
import sys
from PyQt5 import QtGui,QtWidgets,uic
from PyQt5.QtWidgets import *
class qtApp(QWidget):
    count = 0 # 클릭횟수
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/mainApp.ui',self)
        
        # QtDesigner 에서 구성한 위젯 시그널 만듬
        self.btnOK.clicked.connect(self.btnOKClicked)
        self.btnPOP.clicked.connect(self.btnPOPClicked)
    def btnPOPClicked(self):
        QMessageBox.about(self,'popup','까꿍')
        
    def btnOKClicked(self): # 슬롯함수 
        self.count += 1
        self.lblMessage.clear()
        self.lblMessage.setText(f'메시지: OK + {self.count}') 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())



네이버 개발자 센터
application 만들기 : http://localhost

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/NaverAPISearch.ui',self)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())


#NaverSearchApp.py import sys from PyQt5 import uic from PyQt5.QtWidgets import * from NaverAPI import * class qtApp(QWidget): def __init__(self): super().__init__() uic.loadUi('./studyPyQt/NaverAPISearch.ui',self) # 검색 버튼 클릭시그널 / 슬롯함수 self.btnSearch.clicked.connect(self.btnSearchClicked) # 검색어 입력 후 엔터를 치면 처리 self.txtSearch.returnPressed.connect(self.txtSearchReturned) def txtSearchReturned(self): self.btnSearchClicked() def btnSearchClicked(self): search = self.txtSearch.text() if search == '': QMessageBox.warning(self,'경고','검색어를 입력하세요.') return else: api = NaverAPI() # Naver API 클래스 객체 생성 node = 'news' # movie로 변경하면 영화검색 가능 display = 100 output = [] # 결과 담을 리스트 변수 result = api.get_naver_search(node,search,1,display) # print(result) # 테이블 위젯에 출력하는 기능 items = result['items'] # json 결과 중 items 아래 배열만 추출 self.makeTable(items) # 테이블 위젯에 데이터들을 할당하는 함수 # 테이블 위젯에 데이터 display def makeTable(self,items) -> None: self.tblresult.setSelectionMode(QAbstractItemView.SingleSelection) self.tblresult.setColumnCount(2) self.tblresult.setRowCount(len(items)) # 현재 items 개수의 행 생성 : 100개 self.tblresult.setHorizontalHeaderLabels(['기사제목','뉴스링크']) self.tblresult.setColumnWidth(0,310) self.tblresult.setColumnWidth(1,260) # 컬럼 데이터 수정 금지 self.tblresult.setEditTriggers(QAbstractItemView.NoEditTriggers) for i, post in enumerate(items): # 0, 뉴스 ... title = post['title'] originallink = post['originallink'] # setItem(행,열,넣을 데이터) self.tblresult.setItem(i,0,QTableWidgetItem(title)) self.tblresult.setItem(i,1,QTableWidgetItem(originallink)) if __name__ == '__main__': app = QApplication(sys.argv) ex = qtApp() # MyApp(9일차 참고) ex.show() sys.exit(app.exec_())
#NaverAPI.py # NaverAPI class- openAPI : 인터넷을 통해 데이터를 전달 받음 from urllib.request import Request, urlopen from urllib.parse import quote import datetime # 현재시간 사용 import json # 결과는 json으로 return class NaverAPI: # 생성자 def __init__(self) -> None: print('Naver API 생성') # Naver API를 요청하는 함수 def get_request_url(self,url): req = Request(url) # Naver API 개인별 인증 req.add_header('X-Naver-Client-Id','VAWxYc3u4xYAh_Tw4roC') # naver application 클라이언트 아이디 : 내꺼 req.add_header('X-Naver-Client-Secret','GVdU6AhnmY') # naver application 클라이언트 비번 : 내꺼 try: res = urlopen(req) # 요청 결과가 바로 돌아온다 if res.getcode() == 200: # response OK print(f'[{datetime.datetime.now()}] Naver API 요청 성공') return res.read().decode('utf-8') else: print(f'[{datetime.datetime.now()}] Naver API 요청 실패') return None except Exception as e: print(f'[{datetime.datetime.now()}] 예외발생 {e}') return None # 실제 호출함수 def get_naver_search(self,node,search,start,display): base_url = 'https://openapi.naver.com/v1/search' node_url = f'/{node}.json' params = f'?query={quote(search)}&start={start}&display={display}' url = base_url + node_url + params retData = self.get_request_url(url) if retData == None: return None else: return json.loads(retData) # json으로 리턴 # json으로 받은 데이터를 list로 바꿔준다 def get_post_data(self,post,output): title = post['title'] description = post['description'] orginallink = post['orginallink'] link = post['link'] # 'pubDate': 'Tue, 07 Mar 2023 17:04:00 +0900' 문자열로 들어온 데이터를 날짜형으로 변환해준다 pubDate = datetime.datetime.strptime(post['pubDate'], '%a, %d %b %Y %H:%M:%S +0900') # 2023-03-07 17:04:00변경 pubDate = pubDate.strftime('%Y-%m-%d %H:%M:%S') # output에 옮기기 (리스트에 딕셔너리로 값 넣기) output.append({'title':title, 'description':description, 'originallink':originallink, 'link':link, 'pubDate':pubDate})


# NaverSearchApp.py
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from NaverAPI import *
import webbrowser # 웹브라우저 모듈
class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/NaverAPISearch.ui',self)
        self.setWindowIcon(QIcon('./studyPyQt/newsPaper.png'))
        
        # 검색 버튼 클릭시그널 / 슬롯함수
        self.btnSearch.clicked.connect(self.btnSearchClicked)
        # 검색어 입력 후 엔터를 치면 처리
        self.txtSearch.returnPressed.connect(self.txtSearchReturned)
        self.tblresult.doubleClicked.connect(self.tblresultDoubleClicked)
    def tblresultDoubleClicked(self):
        # row = self.tblresult.currentIndex().row()
        # column = self.tblresult.currentIndex().column()
        # print(row,column)
        selected = self.tblresult.currentRow()
        url = self.tblresult.item(selected,1).text() # 더블 클릭하면 url
        # print(url) # 콘솔창에  프린트
        webbrowser.open(url) # 웹브라우저 창에 링크가 뜬다
    def txtSearchReturned(self):
        self.btnSearchClicked()
    def btnSearchClicked(self):
        search = self.txtSearch.text()
        if search == '':
            QMessageBox.warning(self,'경고','검색어를 입력하세요.')
            return
        else:
            api = NaverAPI() # Naver API 클래스 객체 생성
            node = 'news' # movie로 변경하면 영화검색 가능
            display = 100
            result = api.get_naver_search(node,search,1,display)
            # print(result)
            # 테이블 위젯에 출력하는 기능
            items = result['items'] # json 결과 중 items 아래 배열만 추출
            self.makeTable(items) # 테이블 위젯에 데이터들을 할당하는 함수
    # 테이블 위젯에 데이터 display
    def makeTable(self,items) -> None:
        self.tblresult.setSelectionMode(QAbstractItemView.SingleSelection)
        self.tblresult.setColumnCount(2)
        self.tblresult.setRowCount(len(items)) # 현재 items 개수의 행 생성 : 100개
        self.tblresult.setHorizontalHeaderLabels(['기사제목','뉴스링크'])
        self.tblresult.setColumnWidth(0,310)
        self.tblresult.setColumnWidth(1,260)
        # 컬럼 데이터 수정 금지
        self.tblresult.setEditTriggers(QAbstractItemView.NoEditTriggers)
        for i, post in enumerate(items): # 0, 뉴스 ...
            title = self.replaceHtmlTag(post['title']) # HTML 특수문자 변환
            originallink = post['originallink']
            # setItem(행,열,넣을 데이터)
            self.tblresult.setItem(i,0,QTableWidgetItem(title))
            self.tblresult.setItem(i,1,QTableWidgetItem(originallink))
        
    def replaceHtmlTag(self,sentence) -> str:
        result = sentence.replace('<','<').replace('>','>').replace('<b>','').replace('</b>','').replace(''',"'").replace('"','"')  
        # 변환 안 된 특수문자가 나타나면 밑에 추가
        return result
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())
# NaverAPI.py
# NaverAPI class- openAPI : 인터넷을 통해 데이터를 전달 받음
from urllib.request import Request, urlopen
from urllib.parse import quote
import datetime # 현재시간 사용
import json # 결과는 json으로 return
class NaverAPI:
    # 생성자
    def __init__(self) -> None:
        print(f'[{datetime.datetime.now()}] Naver API 생성')
    # Naver API를 요청하는 함수
    def get_request_url(self,url):
        req = Request(url)
        # Naver API 개인별 인증
        req.add_header('X-Naver-Client-Id','VAWxYc3u4xYAh_Tw4roC') # naver application 클라이언트 아이디 : 내꺼
        req.add_header('X-Naver-Client-Secret','GVdU6AhnmY') # naver application 클라이언트 비번 : 내꺼
        try:
            res = urlopen(req) # 요청 결과가 바로 돌아온다
            if res.getcode() == 200: # response OK
                print(f'[{datetime.datetime.now()}] Naver API 요청 성공')
                return res.read().decode('utf-8')
            else:
                print(f'[{datetime.datetime.now()}] Naver API 요청 실패')
                return None
        except Exception as e:
            print(f'[{datetime.datetime.now()}] 예외발생 {e}')
            return None
        
    # 실제 호출함수
    def get_naver_search(self,node,search,start,display):
        base_url = 'https://openapi.naver.com/v1/search'
        node_url = f'/{node}.json'
        params = f'?query={quote(search)}&start={start}&display={display}'
        url = base_url + node_url + params
        retData = self.get_request_url(url)
        if retData == None:
            return None
        else:
            return json.loads(retData)  # json으로 리턴