Hertz Middlewares for go-lark.
LarkChallengeHandler: URL challenge for general events and card callbackLarkEventHandler: Incoming events (schema 2.0)LarkCardHandler: Card callback: (Legacy) Incoming message event (schema 1.0)LarkMessageHandler
go get -u github.com/go-lark/lark-hertz/v2package main
import (
"context"
"fmt"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/go-lark/lark/v2"
larkhertz "github.com/go-lark/lark-hertz/v2"
)
func main() {
r := server.Default()
middleware := larkhertz.NewLarkMiddleware()
// lark server challenge
r.Use(middleware.LarkChallengeHandler())
// all supported events
eventGroup := r.Group("/event")
{
eventGroup.Use(middleware.LarkEventHandler())
eventGroup.POST("/", func(c context.Context, ctx *app.RequestContext) {
if evt, ok := middleware.GetEvent(ctx); ok { // => returns `*lark.EventV2`
if evt.Header.EventType == lark.EventTypeMessageReceived {
// message received event
// you may also parse other events
if msg, err := evt.GetMessageReceived(); err == nil {
fmt.Println(msg.Message.Content)
}
}
}
})
}
// card callback only
cardGroup := r.Group("/card")
{
cardGroup.Use(middleware.LarkCardHandler())
cardGroup.POST("/callback", func(c context.Context, ctx *app.RequestContext) {
if card, ok := middleware.GetCardCallback(ctx); ok { // => returns `*lark.EventCardCallback`
}
})
}
r.Spin()
}Example: examples/hertz-middleware
We may also setup callback for card actions (e.g. button). The URL challenge part is the same.
We may use LarkCardHandler to handle the actions:
r.Use(middleware.LarkCardHandler())
r.POST("/", func(c context.Context, ctx *app.RequestContext) {
if event, ok = middleware.GetCardCallback(ctx); ok {
}
})middleware.WithTokenVerfication("yourVerificationToken")Notice: encryption is not available for card callback, due to restriction from Lark Open Platform.
middleware.WithEncryption("yourEncryptionKey")Only bind specific URL for events:
middleware.BindURLPrefix("/abc")Copyright (c) go-lark Developers, 2018-2025.