| readstock code="001040"
| append [ | readstock code="005930" ]
| spath | table *
$ cd $SPLUNK_HOME/etc/apps/stock
나의 경로 : $ cd /opt/splunk/etc/apps/stock
파일 미리 생성
$ mkdir bin
$ touch bin/readstock.py
파이썬이 읽고 실행할 명령에 대한 코드를 작성할 파일
[readstock]
chunked = true
filename = readstock.py
python.version = python3
python3 버전으로 readstock.py 파일을 읽게 하는 파일
[readstock-command]
syntax = readstock code
shortdesc = read current stock price in naver financial
usage = public
readstock 명령어에 대한 간단한 설명을 출력하는 것
[searchbnf]
export = system
metadata/default.meta 는 root 가 먼저 만들어둔게 있으므로 일반 사용자가 touch 하는 것 보단 root 로 접속하여 vi 편집하는게 낫다
from __future__ import absolute_import, division, print_function, unicode_literals
import os, sys
import time
import json
# 사용자 정의 command를 위해서는 항상 포함되어야 한다.
splunkhome = os.environ['SPLUNK_HOME']
sys.path.append(os.path.join(splunkhome, 'etc', 'apps', 'stock', 'lib')) # 추가되는 패키지들이 저장된 라이브러리 경로
from splunklib.searchcommands import dispatch, GeneratingCommand, Configuration, Option, validators
from splunklib import six
from splunklib.six.moves import range
# 그 외에 필요한 패키지들...
from urllib.request import urlopen
from bs4 import BeautifulSoup
# GeneratingCommand 를 상속받아서 새로운 명령어 생성
@Configuration()
class ReadStockCommand(GeneratingCommand):
# 명령 파라미터 정의 "code" 를 파라미터로 받을 수 있게 정의함
code = Option(require=True)
# naver 에서는 다음페이지를 통해 현재 주식 가격 정보를 확인할 수 있다.
url = 'https://finance.naver.com/item/sise.nhn?code={}'
# 구현해야 하는 함수
def generate(self):
# url에 파라미터로 받은 코드를 추가해서 전체 url 생성
url = self.url.format(self.code)
self.logger.info("Generating event with code %s" % (self.code))
# url 호출
with urlopen(url) as doc:
content = doc.read()
# 여기에서 약간의 삽질을... 리눅스에서는 "euc-kr"에 대한 encoding 이 되지 않아서 한글이 깨짐.
# 우선 한글이 꼭 필요한게 아니어서 ignore 하고 내용을 utf-8로 decode 하였는데,
# 제대로 작동하기 위해서는 아래 코드를 사용하는 것이 좋음 (지금 환경에서 해결방법을 더 찾아봐야...)
# soup = BeautifulSoup(doc, 'lxml', from_encoding="euc-kr")
content = content.decode('utf-8', 'ignore')
soup = BeautifulSoup(content)
# BeautifulSoup 을 이용하면 html을 파싱해서 원하는 정보를 가져올 수 있다.
cur_price = soup.find('strong', id='_nowVal').text.replace(",", "")
cur_rate = soup.find('strong', id='_rate').text.strip()
stock_name = self.code
# 조회 된 내용을 바탕으로 메시지를 만들고 스플렁크 앱으로 전달해 준다.
raw = {"price": cur_price, "rate": cur_rate, "code":stock_name }
yield {'_time': time.time(), '_raw': raw}
dispatch(ReadStockCommand, sys.argv, sys.stdin, sys.stdout, __name__)
os.environ['SPLUNK_HOME'] 대신 /opt/splunk 로 대체
네이버 주가 정보 사이트에서 기업의 코드번호를 입력받아 조회하는 방식 -한글/영어 아님 숫자임
$ pip3 install beautifulsoup
혹은
$ pip3 install bs4
둘 중에 되는 것을 선택하여 설치
cd /home/sb111/.local/lib/python3.10/site-packages/
설치된 bs4를 복사하기
$ cp -r ./bs4 /opt/splunk/etc/apps/stock/lib/
패키지가 설치된 경로. 파이썬의 버전별로 경로가 다름
찾는 방법 :
$ file / -name 찾을파일의 이름
리눅스 서버 전체에서 해당 이름을 가진 파일의 경로를 탐색
ERROR ChunkedExternProcessor [9139 ChunkedExternProcessorStderrLogger] - stderr: File "/opt/splunk/etc/apps/stock/bin/readstock.py", line 9, in <module>
위의 시키는대로 해도 돌아가지 않는다.
이유는 splunklib와 splunk-sdk를 인식 못하기 때문
no module named 'splunklib' 에러를 계속 보게된다
pip3 install splunklib
로 설치했는데도 인식을 못한다 따라서
cd /opt/splunk/etc/apps/stock/bin/
이 주소로 이동하고 설치를 해야 splunk에서 인식하고 bin/readstock.py 이 작동한다
pip3 install -t . splunklib
pip3 install -t . splunk-sdk
[에러상황]
"Unable to locate package splunklib"
'ERROR ChunkedExternProcessor [9139 ChunkedExternProcessorStderrLogger] - stderr: File "/opt/splunk/etc/apps/stock/bin/readstock.py", line 9, in '
이러한 에러가 발생한다면 "splunklib", "splunk_sdk-1.7.0.dist-info" 각각의 디렉토리를 아래의 경로로 복사하면 되기도 한다.
파이썬이 읽는 패키지의 경로와 설치된 패키지의 경로가 달라서 그런거니까
cp -r splunklib /opt/splunk/etc/apps/stock/lib
cp -r splunk_sdk-1.7.0.dist-info /opt/splunk/etc/apps/stock/lib
| readstock
결과 : File "/opt/splunk/etc/apps/stock/bin/readstock.py", line 15, in module
에러났다. 모듈을 못 읽은 거 같은데 보러간다.
→ code="001040" 뒤에 종목 안 붙여줘서 에러남. 붙여주자