parser.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package service
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/PuerkitoBio/goquery"
  8. "strings"
  9. )
  10. type ParserService interface {
  11. GetMessage(ctx context.Context, req []byte) (string, error)
  12. ParseAlert(html string) (message string, err error)
  13. GetRuleId(ctx context.Context, htmlBytes []byte) (string, error)
  14. }
  15. func NewParserService(
  16. service *Service,
  17. ) ParserService {
  18. return &parserService{
  19. Service: service,
  20. }
  21. }
  22. type parserService struct {
  23. *Service
  24. }
  25. // 解析 alert 消息
  26. func (s *parserService) ParseAlert(html string) (message string, err error) {
  27. doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
  28. if err != nil {
  29. return "", err
  30. }
  31. sel := doc.Find(".alert")
  32. if sel.Length() == 0 {
  33. // 没有 .alert 元素
  34. return "", nil
  35. }
  36. // 找到 .alert,继续提取
  37. t := strings.TrimSpace(sel.Find("h4").Text())
  38. full := strings.TrimSpace(sel.Text())
  39. full = strings.TrimPrefix(full, "×")
  40. full = strings.TrimSpace(full)
  41. m := strings.TrimSpace(strings.TrimPrefix(full, t))
  42. return m, nil
  43. }
  44. func (s *parserService) GetMessage(ctx context.Context, req []byte) (string, error) {
  45. type msg struct {
  46. Message string `json:"msg"` // 如果字段叫 msg,用 `json:"msg"`
  47. }
  48. var m msg
  49. if err := json.Unmarshal(req, &m); err != nil {
  50. return "", fmt.Errorf("解析 message 失败: %v", err)
  51. }
  52. if m.Message == "no affect row" {
  53. return "", fmt.Errorf("没有该条数据")
  54. }
  55. return m.Message, nil
  56. }
  57. func (s *parserService) GetRuleId(ctx context.Context, htmlBytes []byte) (string, error) {
  58. // 1. 把 []byte 包成 io.Reader
  59. reader := bytes.NewReader(htmlBytes)
  60. // 2. 用 goquery 解析
  61. doc, err := goquery.NewDocumentFromReader(reader)
  62. if err != nil {
  63. return "", err
  64. }
  65. // 方法一:按位置拿(第 2 个 tr、第 2 个 td)
  66. id := doc.
  67. Find("table.table tbody tr").Eq(1). // 跳过表头行,拿第一条数据
  68. Find("td").Eq(1).Text() // 第 2 个 td
  69. return strings.TrimSpace(id), nil
  70. }