기본 콘텐츠로 건너뛰기

추천 가젯

리눅스 홈서버 알림용 텔레그램 봇(Telegram Bot) 연동 및 쉘 스크립트 구축 가이드

개인 홈서버를 운영하다 보면 백업 완료 여부나 시스템 에러 같은 단방향 알림을 스마트폰으로 빠르게 받아보고 싶어집니다. 외부 메일 서버나 복잡한 SMTP 설정을 거치지 않고, 가장 확실하고 가볍게 쓸 수 있는 텔레그램 봇을 이용한 홈서버 알림 구축 방법 을 정리합니다. 1단계: 텔레그램 봇 생성하기 (BotFather) 텔레그램 앱을 켜고 상단 검색창에 BotFather 를 검색하여 공식 봇(파란색 체크마크 확인)을 엽니다. 대화창에 아래 명령어를 입력하여 새로운 봇을 만듭니다. Plaintext /newbot 봇의 이름(Name)을 입력합니다. (예: My Home Server Bot ) 봇의 아이디(Username)를 입력합니다. (반드시 영문이며 끝에 bot 또는 _bot 으로 끝나야 합니다. 예: my_home_backup_bot ) 생성이 완료되면 HTTP API 토큰(Token)이 발급됩니다. 이 토큰을 안전하게 보관합니다. 2단계: 내 Chat ID(채팅방 고유 번호) 확인하기 텔레그램은 보안상 사용자가 먼저 봇에게 말을 걸어야 메시지를 받을 수 있으며, 봇이 나에게 메시지를 보내려면 고유 Chat ID 가 필요합니다. 텔레그램 검색창에 userinfobot 을 검색하여 들어갑니다. 하단의 [시작하기] 버튼을 누르면 내 계정의 정보와 함께 Id (숫자) 값을 알려줍니다. 이 숫자를 복사해 둡니다. [중요] 1단계에서 만든 내 봇의 아이디(예: @my_home_backup_bot )를 검색해서 대화창을 열고, [시작] 버튼을 누르거나 아무 메시지나 먼저 한 번 전송해 둡니다. 3단계: 리눅스 쉘 스크립트 작성 및 테스트 서버(터미널)에서 환경변수를 설정하고 curl 명령어를 통해 테스트 메시지를 보낼 수 있습니다. 특히 인자값이 없을 때를 대비해 기본값 처리를 해두면 유용합니다. 아래 내용을 포함하는 쉘 스크립트 파일(예: send_telegram.sh )을 작성합니다. Bash #!/bin/bash # 환경변수 설정 (실제 토큰과 C...

iconv 때문에 망했다. 해결가능하신분이 있다면 답변좀,< 파랜드 택틱스 마법 파싱 프로그램이다. >


마법설명부분은 주석 제거하면 된다. 저 부분은 파택2에만 포함되어 있는 부분이다.

iconv가 아주 지랄같다. 

bash에서 head -c 20 |iconv -f euc-kr -t  하면 아주 잘 된다. 

그런데 glib에 있는 iconv를 불러서 사용하면 이 지랄이 난다. 

뭔가 16bit나 32bit computer문제에 little, big-endian 문제가 섞인거 같기는 한데...

어디에서 생긴 문제인지를 모르겠다. 


뭐 어쩌겠는가... 안 되면 어쩔 수 없는거지... 



ps:헥스에디터로 자기 속성에 맞는 브레스 마법을 모든 캐릭에게 얹어주니 게임이 아주 
빨리 진행되고 재미 있다. 


/*!
* \file a.c * \brief * * <+DETAILED+> * * \author KIM Hyeok (kh), ekh0324@gmail.com * * \internal * Created: 2019년 03월 18일 * Revision: none * Compiler: gcc * Organization: Konkuk University * Copyright: Copyright (c) 2019, KIM Hyeok * * This source code is released for free distribution under the terms of the * GNU General Public License as published by the Free Software Foundation. */ #include #include #include #include #include #include extern int errno; int main() { /* iconv_t ic = iconv_open("UTF-8", "CP949"); */ /* iconv_t ic = iconv_open("CP949", "UTF-8"); */ // iconv_t ic = iconv_open("UTF8//IGNORE", "CP949"); iconv_t ic = iconv_open("UTF-8", "CP949"); // iconv_t ic = iconv_open("UTF-8//TRANSLIT//IGNORE", "CP949//TRANSLIT//IGNORE"); // iconv_t ic2 = iconv_open("utf-8", "cp949"); if (ic == (iconv_t)(-1)) { perror("iconv_open"); return 1; } char buf[1000]; FILE * input = fopen("magic1.dat", "r"); char* strings = malloc(1000); short level, mana, firewater, windearth, lightdark; short min, max; char* filename= malloc(25); short sound, targettype, magictype,charactertype; char* description = malloc(21); char* outbuf= malloc(1000); char* inbuf = malloc(100); size_t insize,outsize; size_t result; // fread(inbuf, 1, 108, input); while(!feof(input)) { memset(inbuf, 0x00,100); insize = 20; outsize = 400; memset(inbuf, 0x00,insize); memset(strings, 0x00,1000); memset(outbuf, 0x00,1000); fread( inbuf, 1,insize, input); insize = strlen(inbuf); result = iconv(ic, &inbuf, &insize,& outbuf, &outsize); if (result < 0) { int err = errno; strerror_r(errno, buf, sizeof(buf) ); printf("result : %ld, errno : %d(%s)\n", result, errno,buf); return(-1); } else { fprintf(stderr, "[%s][(%ld)\n",outbuf, outsize); } memcpy(strings,outbuf, 300 ); memset(strings+300, 0x00, 10);; fread( &level, 2,1, input); fread( &mana, 2,1, input); fread( &firewater, 2,1, input); fread( &windearth, 2,1, input); fread( &lightdark, 2,1, input); fread( &min, 2,1, input); fread( &max, 2,1, input); insize = 12; fread( filename, 1,insize, input); filename[24] = '\0'; fread( &sound, 2,1, input); fread( &targettype, 2,1, input); fread( &magictype, 2,1, input); fread( &charactertype, 2,1, input); outsize = insize = 12; /* fread( inbuf, 1,insize, input); * iconv(ic, &inbuf, &insize, &description, &outsize); * description[20] = '\0'; */ printf("name:%s\n", strings); printf("배우는 레벨은 %d\n", level); printf("사용하는 마나는 %d\n", mana); if ( firewater>0 ) { printf("불마법 (+%d)\n", firewater); }else if (firewater <0 -firewater="" d="" if="" n="" printf="" windearth="">0 ) { printf("대기마법 (+%d)\n", windearth); }else if (windearth <0 -windearth="" d="" if="" lightdark="" n="" printf="">0 ) { printf("빛마법 (+%d)\n", lightdark); }else if (lightdark <0 -lightdark="" :="" d="" description="" filename="" max="" min="" n="" printf="" puts="" s="" span="">

댓글