본문 바로가기
마인크래프트/Skript 기초 활용편

스크립트 기초 활용 11편(오늘의 날씨)

by 스터디립트 2023. 1. 4.

이번 시간에는 스크립트 자체에 있는 기능은 아니고, skUtilites 애드온에 있는 크롤링, 파일쓰기 기능들을 활용하여 오늘의 날씨를 알려주는 스크립트를 만들어 보도록 하겠습니다. 이번 시간에는 크롤링할 페이지의 소스코드에서 필요한 정보만 골라내야 하기 때문에, html에 대한 기본적인 지식이 있으셔야 합니다. 그리고 방금 알려드렸다싶이 이번 시간에 만들 스크립트는 skUtilities애드온이 꼭 필요합니다. 아래의 링크에서 다운로드받으실 수 있습니다.

 

https://forums.skunity.com/resources/skutilities.26/

 

Addon - skUtilities

 

forums.skunity.com

 

1. 페이지 소스코드 가져오기

skUtilites를 이용한 크롤링에서는 그 페이지의 소스코드의 특정 줄의 내용만 가져올 수 있습니다. 따라서 크롤링할 페이지의 소스코드를 가져온 뒤, 그 소스코드를 살펴보아서 내가 필요한 정보가 있는 줄 번호가 몇번인지 알아내야 합니다. 이 단계는 다른 프로그래밍 언어를 사용해서 크롤링하셔도 상관없으나, 혹시 다른 프로그래밍 언어를 사용했을 때의 크롤링 결과와 skUtilites를 이용하여 크롤링했을때의 크롤링 결과가 다를 지 몰라서 저는 크롤링 과정도 Skript를 이용했습니다. 아래는 그 코드입니다.

 

command /html:
	trigger:
		set {_lines} to line count of url "https://weather.naver.com/"
		if file "plugins\skUtilities\sourceCode.txt" exists:
			delete file "plugins\skUtilities\sourceCode.txt"
		create file "plugins\skUtilities\sourceCode.txt"
		set writable attribute of file "plugins\skUtilities\sourceCode.txt" to true
		loop {_lines} times:
			set {_l} to line loop-number from url "https://weather.naver.com/"
			write {_l} at line (file "plugins\skUtilities\sourceCode.txt"'s line count + 1) to file "plugins\skUtilities\sourceCode.txt"
			wait 1 tick
		send "완료" to sender

파일 생성은 create file "파일경로" 구문을 이용합니다.

https://skripthub.net/docs/?id=245

 

Create File or App (Effect) - skUtilities

Creates a file or at the location you give it

skripthub.net

 

한 가지 주의하실 점은 이미 파일이 존재한다면 위 구문은 작동하지 않습니다. 따라서 저는 파일이 존재한다면, delete file "파일경로"를 이용하여 파일을 한 번 삭제시켜준 뒤 다시 생성하였습니다.

https://skripthub.net/docs/?id=247

 

Delete File or App (Effect) - skUtilities

Deletes a file at the location you give it

skripthub.net

 

그 후 파일의 writable attribute를 true로 바꾸어 쓰기를 허용해주었습니다.

https://skripthub.net/docs/?id=147

 

Attribute of File (Expression) - skUtilities

Returns the value of the files attribute as a boolean Sets a attribute of a file (read/write/hidden) to a boolean

skripthub.net

 

그리고 line count of url "url"을 이용하여 페이지 소스코드의 줄 합계를 가져온 뒤, 그 횟수만큼 루프를 돌렸습니다. 루프 안에서는 루프 넘버에 해당하는 소스코드의 내용을 가져온 뒤, 파일에서는 줄 번호가 1번부터 시작하기에 루프 넘버 + 1 번째 줄에 그 내용을 작성하였습니다.

https://skripthub.net/docs/?id=264

 

Write Line in file (Effect) - skUtilities

Changes a line in a file to the text you want it to have! #note this could wipe the file! (Very low chance)

skripthub.net

그리고 중요한 점이, 루프 안을 보시면 끝 부분에 1틱 만큼의 딜레이를 넣어주었는데, 만약 딜레이를 넣어주지 않는다면 과부하가 걸려서 서버가 터져버립니다. 딜레이의 최소 단위가 1틱 이므로 1틱 만큼의 딜레이를 넣어주었는데, 저의 경우에는 서버 핑이 점점 올라가 200정도까지는 올라갔지만 서버가 터지지는 않았습니다.

 

 

2. 크롤링 결과물에서 필요한 정보 가져오기

저의 경우에는 네이버 날씨 페이지를 크롤링했습니다. 그랬더니 163번째 줄에 오늘의 날씨가 있더군요. 그래서 163번째 줄의 내용을 가져와주었습니다. 아래는 그 코드입니다

set {_data} to line 163 from url "https://weather.naver.com/"

https://skripthub.net/docs/?id=181

 

Line from URL (Expression) - skUtilities

Gets a line from a URL and returns it.

skripthub.net

                        <span class="weather">맑음</span>

그러면 {_data}에 위의 내용이 저장됩니다. 그런데 우리가 필요한 것은 html관련 내용들을 제외한 "맑음" 이라는 글자 뿐입니다. 애드온을 이용한다면 정규식을 이용하여 "맑음" 만 쏙 뽑아낼 수 있겠지만 아쉽게도 순정 Skript로는 그런 멋진 기능은 사용할 수 없기에 아쉬운 대로 정규식을 이용하여 split을 해주었습니다.

https://docs.skriptlang.org/expressions.html#ExprJoinSplit

 

Skript Documentation

Skript is a Bukkit plugin which allows server admins to customize their server easily, but without the hassle of programming a plugin or asking/paying someone to program a plugin for them.

docs.skriptlang.org

아래는 그 코드입니다.

set {_s::*} to regex {_data} split by "[><]"
		send {_s::*} to sender
		set {_weather} to {_s::3}
		send "오늘의 날씨는 %{_weather}%입니다" to sender

">" 와 "<" 둘 다, 즉 하나 이상의 내용에서 split 해 주어야 하므로 정규식을 이용해 주었습니다. 물론 정규식을 쓰기 귀찮으시거나 아직 정규식에 대해 잘 모르시는 분들은 "<"로 한번, ">"로 한번 split 해 주셔도 상관은 없습니다. 하지만 정규식이 말은 어려워 보이지만 은근 쉬우니, 아래 링크의 글 한번만 읽고 오셔도 어지간한 정규식들은 사용하실 수 있으실 겁니다.

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

 

정규 표현식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 노란색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다. 정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp[1] 또는 regex, rational expression)[2][3] 또

ko.wikipedia.org

 

split 한 결과 3번 인덱스에 맑음이 들어가 있었기에 {_s::3}의 내용을 이용해 주었습니다.

 

2단계의 코드들을 다 합쳐서 명령어로 만들어 주면 아래의 코드가 됩니다.

command /날씨:
	trigger:
		set {_data} to line 163 from url "https://weather.naver.com/"
		set {_s::*} to regex {_data} split by "[><]"
		send {_s::*} to sender
		set {_weather} to {_s::3}
		send "오늘의 날씨는 %{_weather}%입니다" to sender

 

 

 

 

 

이번 시간에는 순정Skript만을 이용한 기능은 아니지만, SkUtilites 애드온 하나만을 이용하여 페이지 크롤링 및 파일 쓰기, 그리고 아주 작은 내용이지만 정규식을 이용한 split에 관해서 다루어 보았습니다. 질문이 있으시다면 이글의 댓글에 적어주시면 답변해드리도록 하겠습니다.

 

아래는 스크립트 파일들입니다

주석미포함

crawling.sk
0.00MB

 

댓글