안녕하세요? 이번 글은 오피넷(Opinet) 유가정보 무료 API를 소개합니다. 한국석유공사가 운영하는 오피넷은 유종별 판매가격 제공 등 유가정보를 제공하고 있습니다. 출장비 산정 시 유가정보 확인 목적으로 접속해 보셨을 수 있겠습니다. 공식 홈페이지는 아래 링크를 이용하시면 됩니다.
홈페이지 하단을 보시면 '오피넷 API'가 있습니다.
오피넷 API를 통해 제공받을 수 있는 API 리스트입니다. / 무료 API Call 제한수: 1,500(call/일)
사용법은 하단 '무료 API 이용가이드 다운로드'를 참고하시면 됩니다.
API 이용 안내는 아래와 같은데요, 저도 아래 E-mail을 통해 Key를 발급 받았습니다.
자, 그럼 한번 API를 사용해볼까요?! 저는 파이썬으로 '전국 주유소 평균가격'을 확인해 보겠습니다.
먼저, 라이브러리를 호출합니다.
# 라이브러리 호출
import requests
import xmltodict
import tkinter as tk
from tkinter import ttk
xmltodict 라이브러리의 설치 및 소개는 아래 링크를 참조하시면 됩니다.
!pip install xmltodict
오피넷 유가정보 API에서 '전국 주유소 평균가격'을 요청해 보겠습니다.
*{Key}는 부여받은 키 값을 사용하시면 됩니다.
# 오피넷 유가정보 API
url = "http://www.opinet.co.kr/api/avgAllPrice.do?out=xml&code={Key}"
result = xmltodict.parse(requests.get(url).content)
result
자, 아래와 같이 현재 유종별 평균가격을 확인할 수 있습니다. 간단하죠?!
OrderedDict([('RESULT',
OrderedDict([('OIL',
[OrderedDict([('TRADE_DT', '20210623'),
('PRODCD', 'B034'),
('PRODNM', '고급휘발유'),
('PRICE', '1820.17'),
('DIFF', '+0.74')]),
OrderedDict([('TRADE_DT', '20210623'),
('PRODCD', 'B027'),
('PRODNM', '휘발유'),
('PRICE', '1588.19'),
('DIFF', '+0.62')]),
OrderedDict([('TRADE_DT', '20210623'),
('PRODCD', 'D047'),
('PRODNM', '자동차용경유'),
('PRICE', '1385.13'),
('DIFF', '+0.37')]),
OrderedDict([('TRADE_DT', '20210623'),
('PRODCD', 'C004'),
('PRODNM', '실내등유'),
('PRICE', '916.98'),
('DIFF', '-0.05')]),
OrderedDict([('TRADE_DT', '20210623'),
('PRODCD', 'K015'),
('PRODNM', '자동차용부탄'),
('PRICE', '877.79'),
('DIFF', '-0.13')])])]))])
휘발유 평균가격은 다음과 같이 확인해볼 수 있겠습니다.
for i in result['RESULT']['OIL']:
if i['PRODNM']=='휘발유':
print(i['PRICE'])
파이썬 Tkinter(트킨터)를 통해 간단히 GUI를 만들어 봤습니다. *유종을 선택하면 평균가격 표시
# 오피넷 유가정보
win = tk.Tk() # 인스턴스 생성
win.title("오피넷 유가정보") # 제목 표시줄 추가
win.geometry("300x70+50+50") # 지오메트리: 너비x높이+x좌표+y좌표
win.resizable(False, False) # x축, y축 크기 조정 비활성화
# 제품명 라벨
lblProd = tk.Label(win, width=10, text="제품")
lblProd.grid(row=0, column=0) # 라벨 행, 열 배치
# 제품명 콤보박스
cboProd = ttk.Combobox(win, width=20, values=["휘발유", "자동차용경유"])
cboProd.grid(row=0, column=1)
cboProd.configure(state='readonly') # 읽기전용
cboProd.current(0) # 휘발유
# 평균가격 라벨
lblPrice = tk.Label(win, text="")
lblPrice.grid(row=1, column=0, columnspan=2) # 라벨 행, 열 배치
def on_select(event):
selected = event.widget.get()
url = "http://www.opinet.co.kr/api/avgAllPrice.do?out=xml&code={Key}"
result = xmltodict.parse(requests.get(url).content)
for i in result['RESULT']['OIL']:
if i['PRODNM']==selected:
lblPrice['text'] = "평균가격: " + i['PRICE'] + "원"
cboProd.bind("<<ComboboxSelected>>", on_select)
win.mainloop() #GUI 시작
자, 아래와 같이 유종을 선택하면, 현재 평균가격을 확인하실 수 있습니다. 다른 API도 한번 살펴봐야겠습니다.