limit.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import os
  2. import sys
  3. import json
  4. import requests
  5. from datetime import datetime, timedelta
  6. sys.path.append(os.getcwd())
  7. from common.aliyun_log import AliyunLogger
  8. from common.scheduling_db import MysqlHelper
  9. from common.db import RedisClient
  10. def generate_expire_time():
  11. """
  12. 计算出过期时间
  13. """
  14. now = datetime.now()
  15. # 当天晚上12点的时间
  16. midnight = datetime(now.year, now.month, now.day) + timedelta(days=1)
  17. # 计算当前时间到当天晚上12点的秒数
  18. seconds_until_midnight = int((midnight - now).total_seconds())
  19. return seconds_until_midnight
  20. def bot(name):
  21. """
  22. 报警机器人
  23. """
  24. id_dict = {
  25. "余海涛": "15869772902",
  26. "范军": "15200827642",
  27. "罗情": "15111037095",
  28. "鲁涛": "18573105114",
  29. "王雪珂": "13513479926",
  30. "邓锋": "18175188134",
  31. }
  32. url = "https://open.feishu.cn/open-apis/bot/v2/hook/c273ff48-7b7e-4078-b3f7-d69a3d262df9"
  33. headers = {"Content-Type": "application/json"}
  34. payload = {
  35. "msg_type": "interactive",
  36. "card": {
  37. "elements": [
  38. {
  39. "tag": "div",
  40. "text": {
  41. "content": "抓取数量触发限量通知, <at id={}></at>, <at id={}></at>, <at id={}></at>\n".format(
  42. id_dict[name], id_dict["邓锋"], id_dict["王雪珂"]
  43. ),
  44. "tag": "lark_md",
  45. },
  46. },
  47. {
  48. "tag": "div",
  49. "text": {
  50. "content": "当天已经入库 300 条视频",
  51. "tag": "lark_md",
  52. },
  53. },
  54. ],
  55. "header": {"title": {"content": "【 通知 】", "tag": "plain_text"}},
  56. },
  57. }
  58. requests.post(url, headers=headers, data=json.dumps(payload))
  59. class AuthorLimit(object):
  60. """
  61. 账号爬虫限量
  62. """
  63. def __init__(self, mode, platform):
  64. self.mode = mode
  65. self.platform = platform
  66. self.limit_tag_dict = {"352": "余海涛", "353": "罗情", "53": "范军", "51": "鲁涛"}
  67. def find_tag(self, uid):
  68. """
  69. 通过 uid 去找符合标准的 tag
  70. """
  71. sql = f"""select tag from crawler_user_v3 where uid={uid};"""
  72. result = MysqlHelper.get_values(
  73. log_type=self.mode, crawler=self.platform, env="prod", sql=sql
  74. )
  75. tags = result[0]["tag"]
  76. if tags:
  77. tags = tags.split(",")
  78. for tag in tags:
  79. if self.limit_tag_dict.get(tag):
  80. return tag
  81. return None
  82. def author_limitation(self, user_id):
  83. """
  84. 限制账号, 服务长沙四名同学
  85. """
  86. if self.mode == "author":
  87. tag = self.find_tag(user_id)
  88. if tag:
  89. AliyunLogger.logging(
  90. code="8807",
  91. platform=self.platform,
  92. mode=self.mode,
  93. env="prod",
  94. message="找到个人账号,{}".format(tag)
  95. )
  96. R = RedisClient()
  97. if R.connect():
  98. tag_count = R.select(tag)
  99. if tag_count:
  100. tag_count = int(tag_count.decode("utf-8"))
  101. if tag_count <= 300:
  102. tag_count += 1
  103. expire_seconds = generate_expire_time()
  104. R.insert(
  105. key=tag, value=tag_count, expire_time=expire_seconds
  106. )
  107. return True
  108. else:
  109. # 报警
  110. name = self.limit_tag_dict[tag]
  111. bot(name)
  112. return False
  113. else:
  114. tag_count = 1
  115. expire_seconds = generate_expire_time()
  116. R.insert(
  117. key=tag, value=tag_count, expire_time=expire_seconds
  118. )
  119. return True
  120. else:
  121. return True
  122. else:
  123. return True
  124. else:
  125. return True