티스토리 뷰

Android Meal Open Library


나이스의 보안프로그램 적용으로 급식 파싱 라이브러리 사용이 제한될 수 있으며, 영구적으로 사용이 불가능할 수도 있습니다.

자세한 내용은 [Application] - 나이스 보안 프로그램과 현재 급식 파싱 불가능 관련을 참고하세요.


급식 라이브러리 가이드가 작성되었습니다.

오래된 이 글보다 아래 가이드 글을 참고해주세요!


http://itmir.tistory.com/579


https://bitbucket.org/whdghks913/wondanghighschool/src


위 주소로 접속하신다음 app/src/main/java/toast/library/meal 으로 이동하시면 자세한 README를 확인할수 있습니다.




요즘 김급식, 장급식같은 학교 급식을 파싱하는 어플이 많이 있습니다


또한 한번 앱을 만들기 시작해서 조금씩 실력을 쌓다보면 자신이 다니고 있는 학교 앱을 만들고 싶어하는 마음이 누구나 들 것입니다

앱 만들수 있고, 마켓 개발자 계정을 득하게 되면 먼저 올리고 싶은것이 바로 학교 앱일겁니다



그런대 학교 앱을 만들때 한번쯤은 급식 목록을 가져오는 화면을 구성하고 싶지 않나요?

그렇지만 급식 목록을 가져오는게 또 큰일입니다

왜냐면 급식을 DB로 저장한다고 하면 매번 업데이트 해야 하는 귀찮음이 있고 그걸 언제 DB화 할까요...??ㅋ


그래서 생각할수 있는 가장 기본적인 방법이 바로 "파싱" 입니다



처음에 학교 홈페이지 또는 나이스 홈페이지를 파싱한다면 머리 터질겁니다

(물론 저도 몇번..)



인터넷을 검색하다 보면 Toast라는 분의 급식 파싱 오픈 라이브러리가 존재합니다

http://blog.naver.com/rimal



이 글에서는 이 라이브러리를 사용해서 급식을 파싱하는 부분을 알아보겠습니다

물론 Toast님의 라이브러리를 조금 수정해서 제가 직접 다시 만들었습니다



1. 급식 칼로리와 인원수를 받아오지 못하는 부분 수정

2. 일주일치 급식을 가져올때, 날짜 선택을 할수 있도록 수정

3. 한달치 급식을 가져올수 있습니다 기능 삭제되었습니다



그럼 이 급식 파싱 라이브러리를 직접 사용해 보겠습니다



1. 라이브러리를 사용하기 전에..

이 급식 파싱 소스는 Toast님께서 기본을 만드셨고, 제가 소스를 대부분 뜯어 고쳤습니다

원본 소스 문의는 http://blog.naver.com/rimal에서...


급식을 파싱하는대 3G기준으로 약 1초~2초가 걸립니다

짧은 시간이지만 사용자를 위해 ProgressDialog등을 사용하시는걸 추천드립니다


한번 파싱하는대 데이터를 약 500kb (+-300kb)정도 소모합니다

적은 용량이지만 한번 파싱한 데이터는 저장해서 다음부턴 오프라인으로 저장된 데이터를 불러들이는 센스를 발휘합시다 ㅎㅎ (저도 제가 만든 학교앱에 이 장치를 해뒀습니다)


인터넷이 연결되지 않았을경우 예외처리는 되어있지 않으므로 직접 하셔야 합니다

연결되어 있을때만 파싱을 하시면 됩니다

혹시 이부분을 어떻게 처리할지 모르시는 분께서는 글을 조금 내리면 나오는 오픈소스 사이트에 접속하셔서 어떻게 코드 구성이 이루어져 있는지 확인해 주세요


html을 파싱하는대 jericho-html 파싱 라이브러리를 사용했습니다

함께 추가해 주셔야 합니다


네트워크 작업이므로 Thread 또는 AsyncTask를 사용해 주세요

Toast님께서 AsyncTask를 사용하라고 하셨습니다

기존에는 제 앱소스에도 Thread를 사용해서 처리하였으나, 최근 업데이트로 코드 구성을 모두 AsyncTask로 변경하였습니다

작업전, 작업중, 작업후 3단계로 나눠 구분하므로 더 효율적인 코드 구성을 할수 있습니다

Thread를 사용하면 핸들러까지 사용하는대 AsyncTask에서는 이 핸들러가 필요 없습니다


어떤 나쁜 학교는 급식을 제공하지 않을수도 있어요

나이스에 문의해 보시는것도 나쁘지 않은 방법일겁니다


인터넷 사용 권한을 AndroidManifest.xml에 추가하셔야 되요

당연한 사실..!

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

이거 두개는 필수로 넣어주셔야 합니다




2. Android Meal Library


[다운로드]


최신 : 2015-02-25 업데이트, 버전 6.0.0


meallibrary.java를 삭제했습니다. 자세한 다운로드 방법과 삭제 이유에 대한 내용은 아래 굵은 글씨를 확인해주세요.


jericho-html-3.3.jar



최신버전의 Android Meal Library사용방법은

https://bitbucket.org/whdghks913/wondanghighschool (src/toast/library/meal)에 오픈소스로 공개되어 있습니다.


정확한 주소는 app/src/main/java/toast/library/meal/MealLibrary.java 입니다.



bitbucket.org에 공개된 사용법이 더 최신방법입니다.

오픈소스 사이트에는 Thread를 이용한 방법말고 AsyncTask를 이용한 방법으로 변경하였습니다.

개발자분께서는 꼭 AsyncTask로 파싱을 해주시길 바랍니다.


첨부한 AndroidMealLibrary.zip 프로젝트를 삭제합니다.

라이브러리는 언제나 오류를 수정하여 변경되므로 이 글에 첨부된 파일보다 위 링크에 있는 자료를 사용하는것이 더 빠른 방법입니다.


오픈소스에는 날짜를 지정해서 급식을 가져오는 기능등의 예가 포함되어 있습니다.


오픈소스 어플을 테스트해보고 싶으신 분께서는 아래 주소로 접속해서 앱을 받아주시기 바랍니다.

https://play.google.com/store/apps/details?id=wondang.icehs.kr.whdghks913.wondanghighschool


[변경 내역]


- 2014-03-16 v1.0.0

첫 업로드



- 2014-07-13 v2.0.0

나이스 홈페이지의 구조 변경 대응

getMealNew(), getDateNew() 메소드를 사용해 주세요

구조가 변경된 나이스 홈페이지 사용 지역은 아직 getKcal, getPeople, getMonthMeal 메소드를 지원하지 않습니다


새로운 getMealNew, getDateNew 메소드의 사용방법은 기존 라이브러리의 사용방법과 같습니다



-2014-08-24 v3.0.0

getDateNew와 getMealNew 두개의 메소드에 전달할수 있는 값(year, month, day)추가

getMealNew(String CountryCode, String schulCode, String schulCrseScCode, String schulKndScCode, String schMmealScCode, String year, String month, String day)

getDateNew(String CountryCode, String schulCode, String schulCrseScCode, String schulKndScCode, String schMmealScCode, String year, String month, String day)



- 2014-09-06 v5.0.0

getKcalNew(), getPeopleNew() 메소드 추가



- 2015-02-25 v6.0.0

New()가 붙지 않은 기존 메소드 제거, 기존 메소드는 이제 더이상 지원하지 않습니다

getPeopleNew(year, month, day) 메소드가 기존 getPeople()메소드의 파싱방식이 적용되어 있었습니다;;;


- 2018-02-12 MealLibrary Version 8 Update

https://bitbucket.org/whdghks913/wondanghighschool

위 오픈소스 사이트의 app/src/main/java/toast/library/meal/MealLibrary.java 파일을 받아주세요.

가장 최신 파일입니다.


두 라이브러리를 받아서 자신의 프로젝트에 추가해 주세요




(1) 파싱 설명

Deprecated된 메소드 : getDate(), getKcal(), getMeal(), getMonthMeal(), getPeople()

이 메소드는 사용하지 마시고 아래 메소드를 사용해주세요



MealLibrary.getDateNew()

- MealLibrary.getDateNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode)

- MealLibrary.getDateNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode, year, month, day)



MealLibrary.getKcalNew()

- MealLibrary.getKcalNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode)

- MealLibrary.getKcalNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode, year, month, day)



MealLibrary.getMealNew()

- MealLibrary.getMealNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode)

- MealLibrary.getMealNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode, year, month, day)



MealLibrary.getPeopleNew()

- MealLibrary.getPeopleNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode)

- MealLibrary.getPeopleNew(CountryCode, schulCode, schulCrseScCode, schulKndScCode, schMmealScCode, year, month, day)



모든 정보의 반환은 String[]으로 반환하며, 맨 마지막 한달 급식을 가져오는 메소드를 제외하고 모두 [0]에서 [6]까지 정보가 담깁니다

[0]은 일요일 정보이며, [6]은 토요일 정보입니다


한달 급식 정보도 String[] 형식이지만, 길이가 달마다 다릅니다

Month.length등으로 길이를 가져오셔야 하며, [0]은 매월 1일, [1]은 매월 2일 ... 이며 정보가 없을경우 null이 담깁니다




(2) 변수 설명

CountryCode : 학교 교육청 코드, nice홈페이지 도메인의 과 같습니다

경상 북도는 gbe.kr이며, 경상도는 .kr, 다른 교육청은 go.kr 도메인을 사용합니다


EX) 인천 : ice.go.kr



schulCode : 학교 고유 코드번호 입니다

교육청에서 학교를 구분할때, 학교에 공문을 내릴때 사용하며 아래 참조에서 코드를 찾을수도 있습니다


EX) 인천의 학교 코드 검색 : http://hes.ice.go.kr/sts_sci_si00_001.do (학교 검색후 E10000xxxx 부분)



schulCrseScCode는 학교 분류입니다

"1" : 병설유치원

"2" : 초등학교

"3" : 중학교

"4" : 고등학교

분류번호랑 종류랑 안맞으면 리턴을 안합니다



schulKndScCode는 학교 종류입니다

"01" : 유치원

"02" : 초등학교

"03" : 중학교

"04" : 고등학교



schMmealScCode : 식사 값을 의미합니다

조식 : "1"

중식 : "2"

석식 : "3"



schYmd : (일주일치 정보를 얻어오는 메소드에서) 원하는 날짜의 급식 정보를 얻기 위해 필요합니다

String 형식 : 년.월.일

EX) "2014.03.16"



schYm : (한달치 정보를 얻어오는 메소드에서) 원하는 달의 급식 정보를 얻기 위해 필요합니다

String 형식 : 년.월

EX) "2014.03"



year, month, day : schYmd와 schYm의 정보를 세분화 해서 각각 정보를 넘겨줄때 사용합니다

EX) year = "2014", month = "03", day = "16"



대구 지역의 경우 나이스 홈페이지 구조 변경으로 새로운 메소드인 getMealNew, getDateNew를 사용해 주세요

새로운 New메소드는 지금은 getKcal, getPeople, getMonthMeal을 지원하지 않습니다 이제 지원합니다!




(3) 사용 예제

String[] lunch = MealLibrary.getMealNew("ice.go.kr", "E100001786", "4", "04", "2");


인천의 한 고등학교 점심을 가져오는 구문입니다

String[]에 index값 0에 일요일 점심이, 1에 월요일 ... 6에 토요일 점심 목록이 나타납니다

긊식이 존재하지 않을경우 null이 들어있습니다


for문등으로 String[]에 들어있는 급식 목록을 원하는 리스트에 뿌려주시면 됩니다



자세한 예제는 제가 직접 만든 학교앱에 이 라이브러리를 사용해서 어플을 만들어 두었습니다

오픈소스로 공개되어 있으니 확인해 보세요


오픈소스 주소 : https://bitbucket.org/whdghks913/wondanghighschool




(4) 사용 스크린샷

아래 스크린샷은 제가 직접 만든 학교 앱에 들어간 급식 파싱 부분 스크린샷 입니다

원리는 다음과 같습니다


날짜, 아침, 점심, 저녁값을 받아온다음 for문으로 리스트에 각각 뿌려줍니다

리스트뷰의 getView()에서 파싱한 날짜 형식을 Format을 변경해서 "월요일", "화요일"을 추출합니다 (20xx.xx.xx(요일))



(참고로 제 학교앱에는 MealLibrary 말고도 전에 포스팅한 CroutonHelper 라이브러리도 사용됬습니다)


이 스크린샷의 학교 어플은 위에 오픈소스 링크를 첨부해 두었습니다




3. Ps..

학교 급식 파싱하는거 장난 아니더라고요;

그렇지만 이렇게 급식정보를 받아오는 라이브러리를 모두 완성해서 기분 좋습니다




아무튼 이제 저처럼 급식 파싱하려고 별짓을 다하시는 분들께 도움이 됬으면 합니다

갑자기 파싱이 안된다던가 라는 문제가 있다면 티스토리 덧글 또는 제 이메일 whdghks913@naver.com으로 언제든지 메일주세요

시간 나는대로 원인 파악후 수정하겠습니다


댓글
  • 이전 댓글 더보기
  • Favicon of http://blog.naver.com/rimal Toast 잘만들었네요
    숙5하세요
    2014.07.22 23:15 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 감사합니다 ㅋㅋ 2014.07.24 15:51 신고
  • Favicon of http://blog.sevens.pe.kr/ 세븐 감사합니다! 그런데 이번에 대구뿐만 아니라 경기도도 getMealNew, getDateNew를 써야 불러와지네요. 다 개편되고 있는것 같네요 'ㅅ'.. 2014.07.24 00:27 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 그렇군요.. 언제 인천도 저걸로 변경될지 모르겠습니다 2014.07.24 15:52 신고
  • Favicon of http://basixblog.tistory.com Basix 전 지원을 안하더군요....
    나쁜 학교!!
    2014.08.15 13:00 신고
  • ㅁㄴㅇㄹ 혹시 현재도 정상적으로 작동 하나요? 2014.08.15 22:45 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 제가 다니는 인천 고등학교 기준 파싱 잘됩니다
    인천도 새로운 메소드를 사용해야 합니다
    2014.08.16 16:34 신고
  • kycfeel 미르님. 항상 강좌 잘 보고 있습니다.
    미르님의 급식 예제소스를 받아 이클립스에 적용시켜 보니 일부 글자들이 ���� 형태로 나오네요. os x 10.9.4 입니다. 저만의 문제인가요?
    2014.08.22 16:57 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) java파일을 다른 메모장 프로그램으로 여신다음 내용을 이클립스로 붙혀넣기 해주세요
    한글 유니코드 문제 같습니다
    2014.08.22 16:59 신고
  • dd 음....
    어느학교로해도 없다고나오네요
    2014.08.28 18:56 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 무엇이 없다고 나오나요? 지금도 잘되는 라이브러리입니다~~ 2014.08.28 18:57 신고
  • bnb1348 이 라이브러리 쓰고 있는데 자꾸
    '점심이 없습니다' 라고 계속 뜨네요..
    2014.10.11 15:41 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 현재 작동되는 라이브러리입니다
    getMealNew에 집어넣는 요소를 검사해보세요
    만약 getMeal()을 쓰신다면 New메소드를 사용하세요
    2014.10.11 15:51 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 아뇨 라이브러리를 사용할때 뭘 잘못하신게 아닐지요
    제 오픈소스 학교앱을 참고해주세요
    2014.10.11 16:25 신고
  • bnb1348 아 이제 잘됩니다!!
    감사합니다.
    2014.10.11 16:39 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 넵~ 2014.10.11 16:43 신고
  • kycfeel 예제파일이 안보이네요. 다시 올려주실 수 있나요? 2014.11.09 20:55 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 본문에 있는 제가 만든 학교앱의 소스를 참고해 주세요 2014.11.09 21:06 신고
  • SB 급식코드 보는 앱이있나요? 2014.11.30 20:30 신고
  • SB 급식코드보는앱이있나요?
    2014.11.30 20:30 신고
  • Favicon of http://woo-jae.tistory.com Woojae Kim 시간표 db에 대해 질문 2개만 드려도 될까요?
    미르님이 만든 원당고 앱은 한 학년에 10반 까지 있는데 저희 학교가 1학년은 10반, 2학년은 14반, 3학년은 13반 까지 있습니다. db 파일 내에 반 수만 늘려서 수정해도 되는지 아니면 다른 파일도 수정해야하는지 궁금합니다.
    또 저희 학교가 중학교라서 화,수요일만 7교시고 다른 날은 6교시만 하는데 이에 대해서는 어떻게 수정해야 하나요?
    질문 너무 많이 드려 죄송합니다
    2015.01.12 23:27 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 1. 그것은 알수 없습니다
    구현한지 조금 오래되서 기억이 안나는데요 DB파일이랑 java파일이랑 연동되어 있을겁니다

    2. if문으로 null값이나 ""값이 나오면 return하면 되지 않을까요?
    2015.01.14 14:35 신고
  • 펙센* bitbucket Branches(?) 그부분에 Master 와 teacher가 있던데 두개 차이가 뭔가요?
    teacher로 보면 한글 깨진게 잘보이는데 master하면 한글깨진건 안보이더라구요.
    답변부탁드려요!
    2015.02.16 22:58 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) teacher는 망작(?)입니다..ㅋㅋ

    한글 깨짐은 인코딩을 바꿔서 시도해보시면 읽을수 있으실거예요
    원래 자바파일을 git에 올리면 한글이 깨지더라고요...
    2015.02.16 22:59 신고
  • 펙센* 이클립스 내에서는 아무런 오류가 없는데.
    이상하게, 실행해보면 작동이 중지 되네요.
    Bap.java에 문제가 있을꺼 같아, 그대로 붙혀넣어서, 몇가지만 수정해 보았지만, 작동이 여전히 중지됩니다. 이클립스 상에선 오류가 없어 해결하지도 못하겠습니다.ㅜㅜ
    2015.02.17 11:20 신고
  • 비밀댓글입니다 2015.03.01 16:12
  • Favicon of http://itmir.tistory.com Mir(whdghks913) sqlite로 수정합니다 2015.03.01 16:12 신고
  • 비밀댓글입니다 2015.03.28 19:28
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 나중에 따로 정리해서 포스팅 할까 생각중이긴 한데 요즘은 너무 바빠서 시간이 안나네요... 2015.03.28 20:37 신고
  • 소보로 에러가 없는데 Run실행시 MealLibrary 에서 오류가 나는데 해결법이 없을까요 2015.04.19 15:29 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 네 도와드리고 싶어도 도와드릴수가 없네요 2015.04.19 18:28 신고
  • Favicon of http://blackrug.tistory.com 블박 안녕하세요. 오랜만입니다. ㅎㅎ
    제가 요즘 앱개발을 시작하면서 급식 파싱 앱부터 만들기 위해 이 예제를 이용하여 만드는 중입니다. 한 3시간 동안 하다보니 틀같은건 잡혔으나 이것저것 자바 수정하다 보니 아침칸만들고 다했으나 (토요일 일요일도 다 만들었습니다.) 아침이 로딩이 안되더군요.. 어찌해야할까요?
    public static final int TYPE_BREAKFAST = 0; 이렇게 값을 주면 안되는 건가요?

    또한
    import net.htmlparser.jericho.Element;
    Meallibrary쪽에서 계속 문제가 생기더군요..
    private static Source mSource;
    에서 Source부분부터 시작해 이곳저곳...
    2015.12.13 16:08 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 일단 아침을 가져오는걸 만들어야하는데 점심이랑 저녁부분을 보고 따로 추가해야하는게 몇개 있습니다

    아래 오류는 jar이 추가가 안된거 같습니다

    카페로하죠ㅋㅋ
    2015.12.13 23:27 신고
  • jw 파싱이 안돼요 ㅠㅠ 아마 앱문제는 아닐거같은데 혹시 알아봐주실수 있나요??
    경기도교육청 ken.go.kr
    학교코드 J100000447
    고등학교입니다
    2015.12.20 04:36 신고
  • jw 심지어
    글에 나온 인천의 한 고등학교 예시를 그대로 복붙했는데도 안됩니다 ㅠㅠ 왜이러는 걸까요 참고로 android meal_library-5.jar랑 jericho-html-3.3.jar 모두 추가했습니다

    String meal[]=MealLibrary.getMealNew("ice.go.kr", "E100001786", "4", "04", "2");
    for (int i=0 ; i<meal.length; i++){
    Log.d("Meal값 확인", meal[i]);
    }
    2015.12.20 04:45 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 앱을 만드시기전에 먼저 가이드앱을 연구해보세요
    http://itmir.tistory.com/579, https://bitbucket.org/whdghks913/androidmeallibrary

    파싱이 안되는 이유는 인터넷 권한 문제, 학교코드 문제등 다양합니다.
    지금 알고계신 학교 코드를 샘플앱 소스에 넣으신후 작동을 확인해보세요
    2015.12.20 12:34 신고
  • 이성수 하나 여쭤볼 게 있는 데요. 급식 파싱을 학교홈페이지가 아니라 나이스에서 해오는 이유가 따로 있나요? 학교 코드를 넣으면 쉽게 수정이 되니까 다른 사람들이 쉽게 활용하라고 그렇게 한건가요? 아니면 다른 이유가 있는건가요?? 2016.05.25 21:21 신고
  • Favicon of http://itmir.tistory.com Mir(whdghks913) 제 학교 홈페이지는 가끔 업데이트가 이루어지지 않아 정보가 안뜰때도 있고 기타 이유로 처음부터 시도하지 않았습니다.
    학교 코드만 있으면 전국의 학교를 조회 가능한 방법을 찾으신 분은 제가 아니라 토스트님 입니다.
    2016.05.25 21:52 신고
  • 유동근 https://github.com/agemor/school-api
    이 라이브러리를 추가하니까 이런 오류가 나요
    사진 : http://www.android-town.org/
    자유게시판에 올렸습니다 한번만 봐주세요
    2016.05.29 16:20 신고
  • 우주 이제 다운못받나요?? 2016.07.30 20:43 신고
댓글쓰기 폼