반응형

 

1. Google Cloud Console 접속:

2. 프로젝트 선택 또는 생성:

  • 기존 프로젝트가 있다면 선택합니다.
  • 새 프로젝트를 만들려면 상단의 프로젝트 선택 드롭다운 메뉴에서 "새 프로젝트"를 선택합니다.

 

 

3. API 및 서비스 대시보드로 이동:

  • 왼쪽 메뉴에서 "API 및 서비스"를 선택합니다.

4. OAuth 동의 화면 설정:

  • 왼쪽 메뉴에서 "OAuth 동의 화면"을 선택합니다.
  • 외부 또는 내부 사용자 유형을 선택하고 "만들기"를 클릭합니다.
  • 필요한 정보를 입력하고 저장합니다.

 

extrenal 을 사용해줍니다.

 

앱 이름 및 연락처만 등록 후 [저장 후 계속]

[저장 후 계속]

테스트 할 계정을 추가해주세요.
테스트 user 의 경우 오픈전에 설정해주어야 계정 테스트가 가능합니다. 

유저 추가후 [저장 후 계속]

 

위 과정까지 입력해주고 넘어갑니다.

여기까지 OAuth 동의 화면 완료

5. 사용자 인증 정보 생성:

  • 왼쪽 메뉴에서 "사용자 인증 정보"를 선택합니다.
  • "사용자 인증 정보 만들기" > "OAuth 클라이언트 ID"를 클릭합니다.

[상단에 사용자 인증 정보 만들기] [OAuth 클라이언트 ID] 버튼 클릭

애플리케이션 유형 선택:

  • "애플리케이션 유형"에서 "웹 애플리케이션"을 선택합니다.

애플리케이션 정보 입력:

  • 이름을 입력합니다 (예: "PopupGo Web Client").
  • "승인된 JavaScript 원본"에 개발 서버 URL을 추가합니다 (예: http://localhost:5173). -> 프론트
  • "승인된 리디렉션 URI"에도 개발 서버 URL을 추가합니다 (예: http://localhost:5173/oauth2/callback). -> 인증 후 redirect 할 주소. 해당 리다이렉트 파라미터에 access_token 을 받아올 수 있음. - 필자는 프론트 리다이렉트로 처리함.
  • 실제 배포 시에는 프로덕션 URL도 추가해야 합니다.

리다이렉션 URI 까지 입력 후 [만들기] 버튼 클릭

잘려진 화면 우측에 id 및 비밀번호가 보입니다. 

 

  • 클라이언트 ID 확인:
    • 생성된 클라이언트 ID가 표시됩니다. 이것이 YOUR_GOOGLE_CLIENT_ID 대신 사용할 값입니다.
  • 클라이언트 ID 보관:
    • 이 클라이언트 ID를 안전하게 보관하세요.
    • 언제든 "사용자 인증 정보" 페이지에서 다시 확인할 수 있습니다.

보안 주의사항:

  • 클라이언트 ID는 공개될 수 있는 정보이지만, 클라이언트 시크릿은 절대 공개되어서는 안 됩니다.
  • 프로덕션 환경에서는 클라이언트 ID를 환경 변수로 관리하는 것이 좋습니다.

이렇게 얻은 클라이언트 ID를 로그인 버튼 있는 파일의 YOUR_GOOGLE_CLIENT_ID 부분에 붙여넣으면 됩니다. 예를 들어:

 

로그인 버튼 클릭시 메소드

loginWithGoogle() {
      const clientId = '~~~~.apps.googleusercontent.com'; // Replace with your actual client ID
      const redirectUri = 'http://localhost:5173/oauth2/callback'; // The URL where you want to handle the response
      const scope = 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile';
      const responseType = 'token';

      const authUrl = `https://accounts.google.com/o/oauth2/auth?` +
                      `client_id=${clientId}&` +
                      `redirect_uri=${redirectUri}&` +
                      `response_type=${responseType}&` +
                      `scope=${scope}`;

      window.location.href = authUrl;
    }

해당 메소드를 실행하면 구글 로그인 할 수 있는 계정이 나옵니다.

 

 

계속을 누르면 링크가 이동 됩니다. 
여기서 리다이렉트를 서버 api 로 받아도 되고, 다시 프론트로 받고 백엔드로 다시 요청해서 처리해도 됩니다.
저는 리다이렉트 url 을 프론트로 했기 때문에 해당 프론트 페이지에서 토큰을 추출 후 서버로 요청했습니다. 

 

프론트 리다이렉트 url 
http://localhost:5173/oauth2/callback 
해당 경로로 프론트 페이지를 만들어 줍니다. 

 

해당 리다이렉트 페이지로 오면 토큰 추출 후 백엔드 api 를 호출해줍니다.

handleOAuth2Callback() {
    const hashParams = new URLSearchParams(window.location.hash.substring(1));
    const accessToken = hashParams.get('access_token');
    console.log(accessToken)
    if (accessToken) {
      fetch('http://localhost:8080/api/oauth2/google', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ token: accessToken })
      })
      .then(response => response.json())
      .then(data => {
        if (data.success) {
          localStorage.setItem('jwt', data.jwt); // JWT 토큰을 로컬 스토리지에 저장
          this.$router.push('/home');
        } else {
          alert('Authentication failed');
        }
      });
    } else {
      alert('Failed to get access token from URL');
    }
  }


응답 후 처리 방식은 각자 코드에 맞게 수정해주시면 됩니다. 

그리고 프론트 리다이렉트 페이지에서 요청하는 백엔드 api 호출하면 됩니다. 
해당 백엔드 api 에서는 가져온 토큰으로 서버에서 구글 토큰에 해당하는 유저정보를 가지고 옵니다. 

 

@Slf4j
@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/api/oauth2")
public class OAuth2Controller {

    @PostMapping("/google")
    public ResponseEntity<?> googleLogin(@RequestBody Map<String, String> body) {
        log.info("start google login");
        String token = body.get("token");
        log.info("Received token: {}", token);
        String url = "https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=" + token;
        RestTemplate restTemplate = new RestTemplate();
        try {
            log.info("Requesting token info from Google API");
            Map<String, Object> tokenInfo = restTemplate.getForObject(url, Map.class);
            log.info("Token info received: {}", tokenInfo);
            String email = (String) tokenInfo.get("email");
            log.info(email);
            // 사용자 정보를 통해 인증 및 세션 관리 로직 추가
            return ResponseEntity.ok(Map.of("success", true, "email", email));
        } catch (Exception e) {
            log.error("Error during Google login", e);
            return ResponseEntity.status(401).body(Map.of("success", false, "error", e.getMessage()));
        }
    }
}

 

security 가 적용되어 있다면 해당 api 허용되게 수정해주시면 됩니다. 

.requestMatchers("/api/oauth2/**").permitAll()

 

 

혹여나 안된다면 controller 에 cors 허용 되어있는지 확인해주시면 됩니다.

 

위의 코드로 작성해준다면 백엔드 api 에서 oauth 라이브러리를 import 하지 않아도 됩니다. 

반응형
반응형

주식을 하다보면 공시를 확인해야 하는데 매번 사이트를 들어가서 공시를 보기 여간 불편하기 때문에 

dart 에서 제공하는 api 를 사용해보자

 

 

전자공시시스템(DART ; Data Analysis, Retrieval and Transfer System)은 상장법인 등이 공시서류를 인터넷으로 제출하고, 투자자 등 이용자는 제출 즉시 인터넷을 통해 조회할 수 있도록 하는 종합적 기업공시 시스템이다.

 

오픈 API 를 신청하려면 아래 주소로 접속하자

opendart.fss.or.kr/intro/main.do

여기서 [인증키 신청]을 통해 접속할 수 있는 계정을 발급받고 더블어 인증키를 받자

[오픈API 이용현황] 메뉴를 들어가면 인증키가 바로 나온다.

 

 

DART 오픈 API 개발가이드 - drive.google.com/file/d/1nI6c5-fX-6TE357BWxYp7udf6BTED1U3/view

api 를 편히 쓰라고 python 은 라이브러리가 생겼다.

DART python 라이브러리 소스코드 - github.com/josw123/dart-fss  

dart python 라이브러리 문서 - dart-fss.readthedocs.io/en/latest/

해당 라이브러리 사용 하지 않아도 api 를 사용해도 된다.

나 같은 경우는 파이썬 잘 몰라서 스프링으로 하려고 한다.

 

python 코드 에서 api 콜 하는 부분 만 보고 직접 만들어주면 된다.

 

샘플 API 사용 예시

https://opendart.fss.or.kr/api/company.json?crtfc_key={발급받은API키}&corp_code=00126380

API 키를 발급 받았으면 다음처럼 사용 가능하다.

 

기업개황 API는 대표자명, 사업자등록번호 등의 기업의 기본 정보를 제공합니다. JSON 포멧 요청 URL은 https://opendart.fss.or.kr/api/company.json이고 다음 두 파라미터를 입력해야 한다.

  • crtfc_key: 발급받은 인증키
  • corp_code: 공시대상회사 고유번호
{
    "status": "000",
    "message": "정상",
    "corp_code": "00126380",
    "corp_name": "삼성전자(주)",
    "corp_name_eng": "SAMSUNG ELECTRONICS CO,.LTD",
    "stock_name": "삼성전자",
    "stock_code": "005930",
    ~~
    ~~
    ~~
    ~~
}

 

주의사항 

  • Open DART 및 DART 홈페이지의 경우 분당 100회 이상 요청시 서비스가 제한될 수 있음
  • 개인용은 일일 사용량은 10,000건으로 제한 되어 있습니다.

 

위 캡쳐본은 

DART 오픈 API 개발가이드 - drive.google.com/file/d/1nI6c5-fX-6TE357BWxYp7udf6BTED1U3/view

에 있는 내용입니다.

API 주소까지 다 있습니다.

반응형
반응형

업무하다가 웹사이트를 빈번하게 들어가서 검색하기 어려운 것들이 조금 있어서,

메신저에서 검색하고 싶은 내용들이 많아서 봇을 만들어 보려고 한다.

 

텔레그램 봇 기능

https://core.telegram.org/bots 

에 명시된 기능 가능

 

텔레그램 bot api 문서

https://core.telegram.org/api

문서가 있지만 이거로 보고 개발하기 내용물이 많아 라이브러리를 사용하는게 낫겠다.

 

우선 이런 API 들을 사용하려면 키를 발급 받아야 한다.

 

bot 만들기 및 API 키 발급하기

텔레그램 검색창에 BotFather 검색 후 말을 건다.

BotFather 를 사칭하는 애가 ㅁ낳으니 위에서 처럼 ⌵ 로 체크된 공식 파더한테 말을 걸어라

방에 들어가면 위와 같이 help 메시지가 온다.

 

/newbot 이라고 채팅해서 봇을 만들자

        - [ /newbot ] 명령어를 입력하면, 봇의 이름을 입력하라고 함.

         - 봇의 이름이 'bot'으로 끝나지 않는 경우 생성되지 않음.

         - 정상적으로 등록되면 'HTTP API Access Token'을 발급해줌.

 

방이름과 bot 아이디는 변경 가능하다.

방이름 변경 - /mybots

봇이름 변경 - /setname

 

봇을 만들면 API 키값을 준다.

 

 

JAVA API 사용

Java

둘 중에 하나 골라서 사용하면 된다.

 

나는 https://github.com/rubenlagus/TelegramBots 이 API 를 골랐다. 이유는 딱히 없다.

 

자바 API 라이브러리

<dependency>
  <groupId>org.telegram</groupId>
  <artifactId>telegrambots</artifactId>
  <version>5.1.1</version>
</dependency>

예제코드

public static void main(String[] args) {
	SpringApplication.run(TelegramApplication.class, args);

	try {
		TelegramBotsApi api = new  TelegramBotsApi(DefaultBotSession.class);
		api.registerBot(new TestHandlers());
	} catch (TelegramApiException e) {
		e.printStackTrace();
	}

}

위 처럼 TelegramBotsApi 객체 생성 후 봇 정보를 기입한 클래스를 registerBot 에 등록만 해주면 된다.

세부로직은 등록한 클래스 TestHandlers 에서 작성한다.

 

public class TestHandlers extends TelegramLongPollingBot {

    @Override
    public String getBotUsername() {
        return "방제말고 bot 이름";
    }

    @Override
    public void onUpdateReceived(Update update) throws TelegramApiException {
        Message message = update.getMessage();
        log.info(message.toString());
        if (update.hasMessage() && update.getMessage().hasText()) {
            SendMessage sendMessage = new SendMessage();
            sendMessage.setChatId(update.getMessage().getChatId().toString());
            sendMessage.setText("자동 응답으로 보낼 메시지");
            execute(sendMessage);
        }
    }

    @Override
    public String getBotToken() {
        return "API_발급된키 넣어주세요.";
    }
}    

봇으로 등록 할 클래스 에는 TelegramLongPollingBot 을 상속 받아줘서 token 값 및 bot name 을 입력해서 

onUpdateReceived 에 로직 처리를 해주면 된다.

Update 클래스에는 유저 이름 및 id 등 여러 데이터가 넘어온다.

 

위와 같이 스프링 서버나 자바 를 run 시켜주면

telegram.me/봇이름

와 같이 웹 url 로 이동해 텔레그램 메신저로 이동해서 등록된 봇을 확인할 수 있다.

 

 

 

굳이 java api 로 하지않고 텔레그램 api 를 그대로 사용해도 된다.

반응형

+ Recent posts