저번에 이어서 텔레그램봇에 메세지를 전달해 보자.
환경 : spring boot 2 + gradle
import com.google.gson.Gson;
import com.jinvicky.telegrambot.domain.AlertMsg;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
@Slf4j
@Component
public class TelegramAlert {
private Logger logger = LoggerFactory.getLogger(TelegramAlert.class);
@Value("${notification.telegram.enabled}")
private boolean telegramEnabled;
@Value("${notification.telegram.bot.token}")
private String token;
@Value("${notification.telegram.chat.id}")
private String chatId;
public void sendAlert (String contents) {
BufferedReader in = null;
String url = "https://api.telegram.org/bot" + token + "/sendMessage?chat_id="+ chatId + "&text=";
try {
// 메세지 생성
StringBuffer sb = new StringBuffer();
sb.append("주문 결과 : ").append(contents);
url += sb.toString();
URL obj = new URL(url); // 호출할 url
HttpURLConnection con = (HttpURLConnection)obj.openConnection();
con.setRequestMethod("GET");
in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
String line;
StringBuffer buffer = new StringBuffer();
while((line = in.readLine()) != null) { // response를 차례대로 출력
buffer.append(line);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(in != null) {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// 다른 방법
public void sendAlert2 (String contents) {
String url = "https://api.telegram.org/bot" + token + "/sendMessage";
try {
AlertMsg telegramAlert = new AlertMsg(chatId, contents);
String param = new Gson().toJson(telegramAlert);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", MediaType.APPLICATION_JSON_VALUE);
HttpEntity<String> entity = new HttpEntity<>(param, headers);
restTemplate.postForEntity(url, entity, String.class);
} catch (Exception e) {
logger.error("telegram alert send failed", e);
}
}
}
텔레그램봇에 들어가는 기본 key 정보들은 별도 application.properties에 저장하고
@Value 애너테이션을 통해서 주입해서 사용한다.
resources 폴더 및에 application.properties를 생성하고 아래처럼 작성한다.
server.port=8085
notification.telegram.enabled=true또는 false 설정, 필수 아님.
notification.telegram.bot.token=토큰아이디
notification.telegram.chat.id=채팅아이디
텔레그램 알림 전송에는 두 가지 방법이 있다.
1. HttpUrlConnection
2. RestTemplate
피드백 : 1번은 성공률이 높은 쉬운 방법이지만, 1번을 기본으로 알고 2번으로 바꾸어 쓸 수 있어야 한다.
위 코드를 참고하고 비교해보자.
@Slf4j
@Controller
@RequestMapping("/alert")
public class TelegramController {
@GetMapping("/")
public String sendAlert() throws Exception {
String content = "test msg";
telegramAlert.sendAlert2(content);
return "orderDetail";
}
}
이제 /alert 경로로 접근하면 test msg라고 텔레그램봇 메세지가 도착하게 된다.
다음에는 페이팔 결제 연동을 해보자.