Was werden wir machen?
Wir werden einen einfachen Telegramm-Bot schreiben, der mit derselben Nachricht antwortet, die gesendet wurde.
Warum AWS Lambda?
Bequeme Bereitstellung, nur schreiben
sls deploy
, und Lambda ist bereits entladen
Sie zahlen nur für die Zeit, in der Lambda läuft
Sie müssen keine Server konfigurieren und müssen sich nicht um die Skalierung kümmern
Was brauchen Sie?
Installiert gehen
Nodejs und npm zur Installation ohne Server
AWS-Konto für die Bereitstellung
TLDR
Klonen Sie das Repository https://github.com/R11baka/echotgbot
Legen Sie eine Variable in der .env-Datei BOT_TOKEN fest
Binär kompilieren
env GOOS=linux go build -o bin/webhook main.go
sls deploy
webhook BOT_TOKEN
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 => Wir benötigen diesen Endpunkt und das Bot-Token, um den Webhook zu installieren
Integration mit Telegramm
Es bleibt dem Telegramm zu sagen, welcher Endpunkt beim Empfang einer Nachricht abgerufen werden soll. Dies erfolgt mit dem Befehl setWebhook
curl https://api.telegram.org/bot{YOUR_TOKEN}/setWebhook?url={YOUR_DEPLOYED_AWS_URL}
Die Überprüfung, ob der Webhook installiert ist, erfolgt mit 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"}}
Fehler
Wenn ein Fehler aufgetreten ist , rufen Sie CloudWatch auf und sehen Sie sich die Protokolle an. Sie können die Protokolle auch über die Konsole anzeigen
sls logs -f webhook