GGRS: Geoscience, GIS, & Remote Sensing

지구과학, GIS, 그리고 원격탐사 블로그입니다.

★오피넷(Opinet) 유가정보 무료 API 소개

댓글 0

IT

2021. 6. 22.

안녕하세요? 이번 글은 오피넷(Opinet) 유가정보 무료 API를 소개합니다. 한국석유공사가 운영하는 오피넷은 유종별 판매가격 제공 등 유가정보를 제공하고 있습니다. 출장비 산정 시 유가정보 확인 목적으로 접속해 보셨을 수 있겠습니다. 공식 홈페이지는 아래 링크를 이용하시면 됩니다. 

 

싼 주유소 찾기 오피넷

 

www.opinet.co.kr

홈페이지 하단을 보시면 '오피넷 API'가 있습니다.

 

싼 주유소 찾기 Opinet

유가 정보 API Opinet 유가 정보 API --> 주유소 판매 가격, 주유소 위치, 부가 서비스 등 전국 주유소 정보 및 평균 유가를 API로 제공합니다. API 이용 절차 STEP.01API 이용신청 STEP.02제휴진행 (유료API) ST

www.opinet.co.kr

오피넷 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

 

 

xmltodict

Makes working with XML feel like you are working with JSON

pypi.org

오피넷 유가정보 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도 한번 살펴봐야겠습니다.