Files
SmsReceiver-go/main.go
OpenClaw Agent 4a31cd1115 initial commit: Go version of SMS Receiver with fixed template rendering
- Implemented all core features from Python version
- Fixed int64/int type compatibility in template functions
- Added login authentication, SMS receiving, statistics, logs
- Independent database: sms_receiver_go.db
- Fixed frontend display issues for message list and statistics
2026-02-08 17:15:22 +08:00

118 lines
2.8 KiB
Go

package main
import (
"flag"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"sms-receiver-go/auth"
"sms-receiver-go/config"
"sms-receiver-go/database"
"sms-receiver-go/handlers"
"github.com/gorilla/mux"
)
func main() {
// 命令行参数
configPath := flag.String("config", "config.yaml", "配置文件路径")
templatesPath := flag.String("templates", "templates", "模板目录路径")
flag.Parse()
// 加载配置
cfg, err := config.Load(*configPath)
if err != nil {
log.Fatalf("加载配置失败: %v", err)
}
log.Printf("配置加载成功: %s v%s", cfg.App.Name, cfg.App.Version)
// 初始化数据库
if err := database.Init(&cfg.Database); err != nil {
log.Fatalf("初始化数据库失败: %v", err)
}
defer database.Close()
// 初始化会话存储
auth.Init(cfg.Security.SecretKey)
// 初始化模板
if err := handlers.InitTemplates(*templatesPath); err != nil {
log.Fatalf("初始化模板失败: %v", err)
}
// 创建路由器
r := mux.NewRouter()
// 静态文件
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
// 页面路由
r.HandleFunc("/", handlers.Index)
r.HandleFunc("/login", handlers.Login)
r.HandleFunc("/logout", handlers.Logout)
r.HandleFunc("/message/{id}", handlers.MessageDetail)
r.HandleFunc("/logs", handlers.Logs)
r.HandleFunc("/statistics", handlers.Statistics)
// API 路由
r.HandleFunc("/api/receive", handlers.ReceiveSMS)
r.HandleFunc("/api/messages", handlers.APIGetMessages)
r.HandleFunc("/api/statistics", handlers.APIStatistics)
// 健康检查
r.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("OK"))
})
// 配置服务器
server := &http.Server{
Addr: cfg.GetServerAddress(),
Handler: r,
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
IdleTimeout: 60 * time.Second,
}
// 启动后台清理任务
go startCleanupTask(cfg)
// 优雅关闭
go func() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
log.Println("正在关闭服务...")
server.Close()
}()
log.Printf("服务启动: http://%s", cfg.GetServerAddress())
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("服务器启动失败: %v", err)
}
}
// startCleanupTask 启动定期清理任务
func startCleanupTask(cfg *config.Config) {
if !cfg.SMS.AutoCleanup {
return
}
// 每天凌晨 3 点执行清理
for {
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day()+1, 3, 0, 0, 0, now.Location())
time.Sleep(next.Sub(now))
if _, err := database.CleanupOldMessages(cfg.SMS.CleanupDays); err != nil {
log.Printf("清理旧消息失败: %v", err)
} else {
log.Println("自动清理旧消息完成")
}
}
}