Loading...
Loading...
AI 에이전트를 위한 한국 서비스 자동화 스킬 모음 — SRT/KTX 예매, KBO, 로또, 카카오톡, 지하철, HWP, 우편번호 등
npx skill4agent add aradotso/trending-skills k-skill-korean-ai-toolsSkill by ara.so — Daily 2026 Skills collection.
# npx로 전체 스킬 설치
npx k-skill install
# 또는 전역 설치
npm install -g k-skill
k-skill install# SRT만 설치
npx k-skill install srt
# KBO + 로또만 설치
npx k-skill install kbo lotto# k-skill-setup 스킬 실행 (sops+age 설정, secrets 파일 생성, 런타임 확인)
k-skill-setupk-skill installk-skill-setupsops + age.env# SRT
export SRT_USERNAME="your_id"
export SRT_PASSWORD="your_password"
# KTX/Korail
export KORAIL_USERNAME="your_id"
export KORAIL_PASSWORD="your_password"
# 서울 지하철 (공공데이터포털 API 키)
export SEOUL_METRO_API_KEY="your_api_key"# age 키 생성
age-keygen -o ~/.config/sops/age/keys.txt
# secrets 파일 암호화
sops --age $(cat ~/.config/sops/age/keys.txt | grep "public key" | awk '{print $4}') \
--encrypt secrets.yaml > secrets.enc.yaml
# 복호화하여 환경변수 주입
sops --decrypt secrets.enc.yaml | k-skill env injectconst { SRTClient } = require('k-skill/srt');
const client = new SRTClient({
username: process.env.SRT_USERNAME,
password: process.env.SRT_PASSWORD,
});
// 로그인
await client.login();
// 열차 조회
const trains = await client.searchTrains({
departure: '수서',
arrival: '부산',
date: '20260401', // YYYYMMDD
time: '080000', // HHmmss
passengers: 1,
});
console.log(trains);
// [{ trainNo: 'SRT123', departTime: '08:00', arrivalTime: '10:30', price: 59800, seats: 'available' }, ...]
// 예약
const reservation = await client.reserve({
trainNo: trains[0].trainNo,
passengers: 1,
seatType: 'normal', // 'normal' | 'window' | 'aisle'
});
console.log(reservation.reservationId);
// 예약 확인
const myReservations = await client.getReservations();
console.log(myReservations);
// 예약 취소
await client.cancelReservation(reservation.reservationId);"4월 1일 수서→부산 SRT 08시 이후 첫 열차 창가석으로 예약해줘"⚠️ 현재 작동하지 않습니다. 향후 지원 예정.
const { KTXClient } = require('k-skill/ktx');
// KTX/Korail 열차 조회, 예약, 예약 확인, 취소 지원 목표
// 현재 개발 중 — 사용 불가kakaocliconst { KakaoTalkMac } = require('k-skill/kakaotalk-mac');
const kakao = new KakaoTalkMac();
// 대화 목록 조회
const conversations = await kakao.listConversations();
console.log(conversations);
// [{ name: '홍길동', lastMessage: '안녕', unread: 2 }, ...]
// 특정 대화 검색
const results = await kakao.searchConversations('개발팀');
// 테스트 전송 (실제 전송 전 확인)
const preview = await kakao.previewSend({
to: '홍길동',
message: '안녕하세요!',
});
console.log(preview); // { to: '홍길동', message: '안녕하세요!', confirmed: false }
// 실제 전송 (사용자 확인 후)
await kakao.send({
to: '홍길동',
message: '안녕하세요!',
confirmed: true, // 반드시 사용자 동의 후 true
});중요: 에이전트는 사용자가 명시적으로 확인한 경우에만로 실제 전송합니다.confirmed: true
# 대화 목록
kakaocli list
# 메시지 전송
kakaocli send --to "홍길동" --message "테스트 메시지"
# 대화 내용 조회
kakaocli read --name "홍길동" --count 20const { SeoulSubway } = require('k-skill/seoul-subway');
const subway = new SeoulSubway({
apiKey: process.env.SEOUL_METRO_API_KEY,
});
// 역 이름으로 실시간 도착정보 조회
const arrivals = await subway.getArrivals('강남');
console.log(arrivals);
/*
[
{
line: '2호선',
station: '강남',
direction: '성수방면',
nextTrain: '1분 후',
followingTrain: '5분 후',
trainNo: '2234'
},
...
]
*/
// 특정 노선 필터링
const line2 = await subway.getArrivals('강남', { line: '2호선' });
// 역 코드로 조회
const byCode = await subway.getArrivalsByCode('0222');"지금 강남역 2호선 외선순환 다음 열차 언제 와?"const { KBOClient } = require('k-skill/kbo');
const kbo = new KBOClient();
// 오늘 경기 일정/결과
const today = await kbo.getGames();
console.log(today);
// 특정 날짜
const games = await kbo.getGames({ date: '20260401' }); // YYYYMMDD
// 팀별 필터링
const lgGames = await kbo.getGames({
date: '20260401',
team: 'LG',
});
console.log(lgGames);
/*
[
{
homeTeam: 'LG',
awayTeam: 'KIA',
homeScore: 5,
awayScore: 3,
status: 'final', // 'scheduled' | 'live' | 'final'
stadium: '잠실',
startTime: '18:30'
}
]
*/
// 팀 목록
const teams = kbo.getTeamList();
// ['LG', 'KIA', 'SSG', 'NC', 'KT', '두산', '한화', '롯데', '삼성', '키움']const { LottoClient } = require('k-skill/lotto');
const lotto = new LottoClient();
// 최신 회차 당첨번호
const latest = await lotto.getLatestResult();
console.log(latest);
/*
{
round: 1162,
date: '2026-03-28',
numbers: [3, 14, 22, 31, 40, 43],
bonusNumber: 7,
prizes: {
first: { winners: 12, amount: 2500000000 },
...
}
}
*/
// 특정 회차
const specific = await lotto.getResult(1100);
// 내 번호 대조
const myNumbers = [3, 14, 22, 31, 40, 43];
const check = await lotto.checkNumbers(myNumbers);
console.log(check);
/*
{
round: 1162,
myNumbers: [3, 14, 22, 31, 40, 43],
matched: [3, 14, 22, 31, 40, 43],
bonusMatched: false,
rank: 1, // 1~5등 또는 null
prize: 2500000000
}
*/.hwpconst { HWPProcessor } = require('k-skill/hwp');
const hwp = new HWPProcessor();
// HWP → Markdown 변환
const markdown = await hwp.toMarkdown('./document.hwp');
console.log(markdown);
// HWP → JSON 변환
const json = await hwp.toJSON('./document.hwp');
console.log(json.paragraphs);
// HWP → HTML 변환
const html = await hwp.toHTML('./document.hwp');
// 이미지 추출
const images = await hwp.extractImages('./document.hwp', {
outputDir: './extracted-images',
});
console.log(images); // ['./extracted-images/image_001.png', ...]
// 배치 처리 (디렉토리 내 전체 HWP 파일)
const results = await hwp.batchConvert('./hwp-files/', {
format: 'markdown',
outputDir: './converted/',
});
// Windows 직접 제어 (한글과컴퓨터 앱 설치된 경우)
const winHwp = new HWPProcessor({ useWindowsApp: true });
const nativeResult = await winHwp.toMarkdown('./document.hwp');# 단일 파일 변환
k-skill hwp convert document.hwp --format markdown
# 배치 변환
k-skill hwp batch ./hwp-folder/ --format json --output ./output/
# 이미지 추출
k-skill hwp extract-images document.hwp --output ./images/const { ZipcodeClient } = require('k-skill/zipcode');
const zipcode = new ZipcodeClient();
// 주소 키워드로 검색
const results = await zipcode.search('강남구 테헤란로');
console.log(results);
/*
[
{
zipcode: '06236',
roadAddress: '서울특별시 강남구 테헤란로 152',
jibunAddress: '서울특별시 강남구 역삼동 736',
building: '강남파이낸스센터'
},
...
]
*/
// 정확한 건물명으로 검색
const exact = await zipcode.search('롯데월드타워');
// 우편번호로 역조회
const byZip = await zipcode.getByZipcode('05510');const { SRTClient, SRTError, SRTAuthError } = require('k-skill/srt');
try {
const client = new SRTClient({
username: process.env.SRT_USERNAME,
password: process.env.SRT_PASSWORD,
});
await client.login();
const trains = await client.searchTrains({ ... });
} catch (err) {
if (err instanceof SRTAuthError) {
console.error('로그인 실패. 아이디/비밀번호를 확인하세요.');
} else if (err instanceof SRTError) {
console.error('SRT 오류:', err.message, err.code);
} else {
throw err;
}
}// .env 파일 사용 시
require('dotenv').config();
// sops 복호화 후 환경변수 주입 시
// sops --decrypt secrets.enc.yaml | k-skill env inject 실행 후 자동 주입됨
const { SRTClient } = require('k-skill/srt');
const client = new SRTClient({
username: process.env.SRT_USERNAME, // 환경변수 참조
password: process.env.SRT_PASSWORD,
});# 설치 및 설정
k-skill install # 전체 스킬 설치
k-skill install srt kbo lotto # 선택 설치
k-skill-setup # sops+age 설정, secrets 초기화
k-skill env inject # 환경변수 주입
# SRT
k-skill srt search --from 수서 --to 부산 --date 20260401 --time 080000
k-skill srt reserve --train SRT123 --passengers 1
k-skill srt list # 예약 목록
k-skill srt cancel --id RES456 # 예약 취소
# KBO
k-skill kbo today # 오늘 경기
k-skill kbo games --date 20260401
k-skill kbo games --team LG
# 로또
k-skill lotto latest # 최신 회차
k-skill lotto result --round 1100
k-skill lotto check --numbers 3,14,22,31,40,43
# 지하철
k-skill subway arrivals --station 강남
k-skill subway arrivals --station 강남 --line 2호선
# HWP
k-skill hwp convert doc.hwp --format markdown
k-skill hwp batch ./folder/ --format json
k-skill hwp extract-images doc.hwp
# 우편번호
k-skill zipcode search "강남구 테헤란로"
k-skill zipcode lookup 06236
# 카카오톡 (macOS)
k-skill kakao list
k-skill kakao send --to "홍길동" --message "메시지"SRT_USERNAME# 환경변수 확인
echo $SRT_USERNAME
# .env 파일에 등록
echo 'SRT_USERNAME=your_id' >> .env
echo 'SRT_PASSWORD=your_password' >> .env
# sops로 암호화 관리 권장
k-skill-setup # 다시 실행하여 secrets 등록# 의존 패키지 확인
npm install -g hwp.js
# Python 백엔드 사용 시
pip install python-hwp
# Windows에서 한컴 앱 직접 제어 시
k-skill hwp convert doc.hwp --use-native# kakaocli 설치 확인
which kakaocli
# 없으면 설치
brew install kakaocli
# 또는
npm install -g kakaocli# 공공데이터포털에서 API 키 발급
# https://data.seoul.go.kr → 서울시 지하철 실시간 도착정보
export SEOUL_METRO_API_KEY="발급받은_키"node --version # v18 이상 권장
# nvm으로 버전 변경
nvm install 20
nvm use 20