Menulis bot telegram di Go dan AWS Lambda

Apa yang kita lakukan?

Kami akan menulis bot telegram sederhana yang merespons dengan pesan yang sama yang dikirim.





Mengapa AWS Lambda?

  1. Kemudahan penerapan, cukup tulis sls deploy



    , dan lambda sudah diturunkan





  2. Anda hanya membayar saat lambda dijalankan





  3. Tidak perlu mengonfigurasi server apa pun dan khawatir tentang penskalaan





Apa yang kamu butuhkan?

  • Pergi diinstal





  • Nodejs dan npm untuk menginstal tanpa server





  • Akun AWS untuk penerapan





TLDR

  • Clone repositori https://github.com/R11baka/echotgbot





  • Tetapkan variabel di file .env BOT_TOKEN





  • Mengompilasi biner env GOOS=linux go build -o bin/webhook main.go







  • Bongkar lambda dengan sls deploy







  • Memasang webhook dengan BOT_TOKEN





Daftar dengan AWS

  • AWS aws console aws_access_key_id, aws_secret_access_key .aws/credentials





.aws/credentials





cat ~/.aws/credentials
[default]
aws_access_key_id = ADEFEFEFFEBDXK3
aws_secret_access_key = Zy6ewfir/zGaT1B2/o9JDWDSssdrla
region = us-west-1
      
      



, BotFather. , BotFather /newbot



, , . , BotFather . , .





Serverless

Serverless- framework, , AWS Lambda . node, nodejs npm. serverless npm





npm install -g serverless







serverless ,





sls -v
Framework Core: 2.35.0 (standalone)
Plugin: 4.5.3
SDK: 4.2.2
Components: 3.8.2
      
      



serverless. serverless serverless.yml ,





service: echoBot
useDotenv: true
configValidationMode: error #   ,  , 
frameworkVersion: '>=1.28.0 <2.50.0'

provider:
  region: "us-west-1"
  lambdaHashingVersion: "20201221"
  name: aws
  runtime: go1.x
  logRetentionInDays: 30 #    
  endpointType: regional
  tracing: #    
    apiGateway: true
    lambda: true
  iam:
    role:
      statements:
        - Effect: "Allow"
          Resource: "*"
          Action:
            - "xray:*"
package:
  patterns:
    - "bin/webhook" #   

functions:
  webhook: 
    handler: bin/webhook
    timeout: 15
    description: simple echo bot
    memorySize: 128 #      
    environment:
      BOT_TOKEN: ${env:BOT_TOKEN}
    events:
      - http:
          path: /webhook
          method: ANY
          cors: false
      
      



Go

  1. telebot.v2 aws-lambda-go





    ➜  go mod init testBot
    go: creating new go.mod: module testBot
    ➜  go get -u gopkg.in/tucnak/telebot.v2
    go: gopkg.in/tucnak/telebot.v2 upgrade => v2.3.5
    go: github.com/pkg/errors upgrade => v0.9.1
    ➜ go get github.com/aws/aws-lambda-go
    go: github.com/aws/aws-lambda-go upgrade => v1.23.0
          
          



2. main.go





package main

import (
	"encoding/json"
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
	tb "gopkg.in/tucnak/telebot.v2"
	"os"
)

func main() {
	settings := tb.Settings{
		Token:       os.Getenv("BOT_TOKEN"),
		Synchronous: true,
		Verbose:     true,
	}
	tgBot, err := tb.NewBot(settings)
	if err != nil {
		fmt.Println(err)
		panic("can't create bot")
	}
	tgBot.Handle(tb.OnText, func(m *tb.Message) {
		message := m.Text
		tgBot.Send(m.Sender, message)
	})
	lambda.Start(func(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
		var u tb.Update
		if err = json.Unmarshal([]byte(req.Body), &u); err == nil {
			tgBot.ProcessUpdate(u)
		}
		return events.APIGatewayProxyResponse{Body: "ok", StatusCode: 200}, nil

	})
}
      
      



tucnak/telebot.v2 , return return events.APIGatewayProxyResponse{Body: "ok", StatusCode: 200}, nil



, .





Deploy

  • .env API_TOKEN BotFather





    echo API_TOKEN={API_TOKEN_FROM_BOTFATHER} > .env
          
          



  • serverlss . .





    sls print
          
          







  • env GOOS=linux go build  -o bin/webhook main.go 
          
          



  • serverless





    serverless deploy  -v
          
          



    ,





    Service Information
    service: echoBot
    stage: dev
    region: us-west-1
    stack: echoBot-dev
    resources: 11
    api keys:
    None
    endpoints:
    ANY - https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook
    functions:
    webhook: echoBot-dev-webhook
    layers:
    None
          
          



    https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook => token , webhook





Integrasi dengan telegram

Tetap memberi tahu telegram titik akhir mana yang harus ditarik saat menerima pesan. Ini dilakukan dengan perintah setWebhook





curl https://api.telegram.org/bot{YOUR_TOKEN}/setWebhook?url={YOUR_DEPLOYED_AWS_URL}

      
      



Memeriksa apakah webhook telah diinstal dilakukan menggunakan getWebhookInfo





➜  ~ curl https://api.telegram.org/bot1324913549:AAE1zYMH6K3hF2TOgUQoIP-E1g4rMIamck/setWebhook\?url\= https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook
{"ok":true,"result":true,"description":"Webhook was set"}
➜  ~ curl https://api.telegram.org/bot1324913549:AAE1zYMH6K3hF2TOgUQoIP-E1g4rMIamck/getWebhookInfo
{"ok":true,"result":{"url":"https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook","has_custom_certificate":false,"pending_update_count":0,"max_connections":40,"ip_address":"184.169.148.254"}}

      
      



Kesalahan

Jika ada yang tidak beres, buka CloudWatch dan lihat log, atau Anda juga dapat melihat log dari konsol





sls logs -f webhook
      
      






All Articles