message_parser.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from pydantic import BaseModel, Field
  2. from typing import Optional, Union, List
  3. import json
  4. class RuleField(BaseModel):
  5. min: Union[int, float] = 0
  6. max: Union[int, float] = 0
  7. class RuleModel(BaseModel):
  8. period: Optional[RuleField] = None
  9. duration: Optional[RuleField] = None
  10. play_cnt: Optional[RuleField] = None
  11. like_cnt: Optional[RuleField] = None
  12. comment_cnt: Optional[RuleField] = None
  13. share_cnt: Optional[RuleField] = None
  14. videos_cnt: Optional[RuleField] = None
  15. width: Optional[RuleField] = None
  16. height: Optional[RuleField] = None
  17. class MessageModel(BaseModel):
  18. id: int
  19. rule: str
  20. parsed_rule: List[RuleModel] = Field(default_factory=list)
  21. def model_post_init(self, __context) -> None:
  22. # 解析 rule 字符串
  23. try:
  24. if self.rule:
  25. rule_list = json.loads(self.rule)
  26. if not isinstance(rule_list, list):
  27. rule_list = [rule_list]
  28. self.parsed_rule = []
  29. for item in rule_list:
  30. try:
  31. self.parsed_rule.append(RuleModel(**item))
  32. except Exception as e:
  33. print(f"解析规则项失败: {item}, 错误: {e}")
  34. except json.JSONDecodeError as e:
  35. print(f"JSON 解析错误: {e}")
  36. except Exception as e:
  37. print(f"其他错误: {e}")
  38. super().model_post_init(__context)
  39. if __name__ == "__main__":
  40. message_data = {
  41. "createTime": 1747042241127,
  42. "id": 147,
  43. "interval": 86400,
  44. "machine": "",
  45. "mode": "related",
  46. "operator": "张良",
  47. "rule": '[{"videos_cnt":{"min":200,"max":0}},{"duration":{"min":30,"max":1200}}]',
  48. "source": "zhongqingkandianrelated",
  49. "spiderName": "run_zqkd_related",
  50. "startTime": 1758211500000,
  51. "status": 0,
  52. "taskName": "中青看点相关推荐",
  53. "updateTime": 1749178503914
  54. }
  55. try:
  56. message = MessageModel(**message_data)
  57. print(f"ID: {message.id}")
  58. print(f"原始规则字符串: {message.rule}")
  59. print("解析后的规则:")
  60. for idx, rule in enumerate(message.parsed_rule, 1):
  61. print(f"规则 {idx}:")
  62. rule_dict = rule.model_dump()
  63. for field_name, field_value in rule_dict.items():
  64. if field_value is not None:
  65. print(f" {field_name}: min={field_value['min']}, max={field_value['max']}")
  66. if not message.parsed_rule:
  67. print(" 没有有效的规则")
  68. except Exception as e:
  69. print(f"解析失败: {e}")
  70. import traceback
  71. traceback.print_exc()