체인의정석

nestjs-telegraf 사용해보기 (Nest.js 텔레그램봇) 본문

개발/backend

nestjs-telegraf 사용해보기 (Nest.js 텔레그램봇)

체인의정석 2023. 11. 27. 19:56
728x90
반응형

https://nestjs-telegraf.vercel.app/

 

Installation | NestJS Telegraf

 

nestjs-telegraf.vercel.app

 npm i nestjs-telegraf --save

먼저 해당 모듈을 설치해준다.

import { Module } from '@nestjs/common';
import { TelegrafModule } from 'nestjs-telegraf';

@Module({
  imports: [
    TelegrafModule.forRoot({
      token: 'TELEGRAM_BOT_TOKEN',
    })
  ],
})
export class AppModule {}

설치 후 , Module에서 TelegrafModule을 import 해주기, TELEGRAM_BOT_TOKEN은 env에서 따로 지정해 주어야한다.아래는 node.js의 telegraph인데 구조는 이것과 동일하다고 한다.

https://telegraf.js.org/#/?id=constructor

 

telegraf.js - v4.15.0

telegraf.js - v4.15.0 Bots are special Telegram accounts designed to handle messages automatically. Users can interact with bots by sending them command messages in private or group chats. These accounts serve as an interface for code running somewhere on

telegraf.js.org

https://it-timehacker.tistory.com/447

 

텔레그램 봇 기본 틀 만들어 보기 (기본 템플릿, 깃허브 소스코드 및 사용방법 포함, javascript & typ

요즘 우리 팀에서는 텔레그램 봇을 통해 다양한 DAPP 관리나 모니터링 등을 하고 있다. 보아하니 매우 유용하게 사용이 가능할거 같다는 판단이 들어 이에 따라 나도 한번 텔레그램 봇을 학습해

it-timehacker.tistory.com

위의 포스팅에 텔레그램 봇 만드는 법이 있는데 여기서 봇 키까지만 빼온다.

기본적인 사용방법은 다음 예제에서 볼 수 있다.

import {
  Update,
  Ctx,
  Start,
  Help,
  On,
  Hears,
} from 'nestjs-telegraf';
import { TelegrafContext } from './common/interfaces/telegraf-context.interface.ts';

@Update()
export class AppUpdate {
  @Start()
  async start(@Ctx() ctx: TelegrafContext) {
    await ctx.reply('Welcome');
  }

  @Help()
  async help(@Ctx() ctx: TelegrafContext) {
    await ctx.reply('Send me a sticker');
  }

  @On('sticker')
  async on(@Ctx() ctx: TelegrafContext) {
    await ctx.reply('👍');
  }

  @Hears('hi')
  async hears(@Ctx() ctx: TelegrafContext) {
    await ctx.reply('Hey there');
  }
}

또한 여러개 봇을 사용하는 경우 다음과 같이 bot name을 지정해 주어야 한다고 한다.

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TelegrafModule } from 'nestjs-telegraf';

@Module({
  imports: [
    ConfigModule.forRoot(),
    TelegrafModule.forRootAsync({
      imports: [ConfigModule],
      botName: 'cat',  
      useFactory: (configService: ConfigService) => ({
        token: configService.get<string>('CAT_BOT_TOKEN'),
      }),
      inject: [ConfigService],
    }),
    TelegrafModule.forRootAsync({
      imports: [ConfigModule.forFeature(telegrafModuleConfig)],
      botName: 'dog',  
      useFactory: async (configService: ConfigService) => ({
        token: configService.get<string>('DOG_BOT_TOKEN'),
      }),
      inject: [ConfigService],
    }),
  ],
})
export class AppModule {}

그리고 여기에 해당되는 inject도 각각 따로 만들어 주어야한다.

또한 텔레그램 봇에서 특정 정보를 현재 구독하려는 상황이므로 

https://www.npmjs.com/package/@nestjs/schedule

 

@nestjs/schedule

Nest - modern, fast, powerful node.js web framework (@schedule). Latest version: 4.0.0, last published: a month ago. Start using @nestjs/schedule in your project by running `npm i @nestjs/schedule`. There are 250 other projects in the npm registry using @n

www.npmjs.com

해당 모듈을 사용하도록 하겠다.

공식문서는 아래에서 볼 수 있다.

https://docs.nestjs.com/techniques/task-scheduling

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

* * * * * *
| | | | | |
| | | | | day of week
| | | | months
| | | day of month
| | hours
| minutes
seconds (optional)

이런식으로 이루어지기 때문에

* * * * * *	every second
45 * * * * *	every minute, on the 45th second
0 10 * * * *	every hour, at the start of the 10th minute
0 */30 9-17 * * *	every 30 minutes between 9am and 5pm
0 30 11 * * 1-5	Monday to Friday at 11:30am

이걸참고해서 @Crone("45 * * * * *") 이렇게 하면 매분 45초에 실행된다.

import { Injectable, Logger } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';

@Injectable()
export class TasksService {
  private readonly logger = new Logger(TasksService.name);

  @Cron(CronExpression.EVERY_30_SECONDS)
  handleCron() {
    this.logger.debug('Called every 30 seconds');
  }
}

이런식도 된다고한다.

보니까 종류가 많은 것을 확인할 수 있었으며 잘 작동함을 확인할 수 있었다.

 

728x90
반응형
Comments