Apa yang kita lakukan?
Kami akan menulis bot telegram sederhana yang merespons dengan pesan yang sama yang dikirim.
Mengapa AWS Lambda?
Kemudahan penerapan, cukup tulis
sls deploy
, dan lambda sudah diturunkan
Anda hanya membayar saat lambda dijalankan
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
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