Skip to content

Commit 033feba

Browse files
committed
钉钉报警支持指定用户id,爬虫代码支持提示
1 parent 0f2f980 commit 033feba

4 files changed

Lines changed: 49 additions & 14 deletions

File tree

feapder/core/base_parser.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
from feapder.db.mysqldb import MysqlDB
1414
from feapder.network.item import UpdateItem
1515
from feapder.utils.log import log
16+
from feapder.network.request import Request
17+
from feapder.network.response import Response
18+
from feapder.utils.perfect_dict import PerfectDict
1619

1720

1821
class BaseParser(object):
@@ -26,7 +29,7 @@ def start_requests(self):
2629

2730
pass
2831

29-
def download_midware(self, request):
32+
def download_midware(self, request: Request):
3033
"""
3134
@summary: 下载中间件 可修改请求的一些参数, 或可自定义下载,然后返回 request, response
3235
---------
@@ -37,7 +40,7 @@ def download_midware(self, request):
3740

3841
pass
3942

40-
def validate(self, request, response):
43+
def validate(self, request: Request, response: Response):
4144
"""
4245
@summary: 校验函数, 可用于校验response是否正确
4346
若函数内抛出异常,则重试请求
@@ -53,7 +56,7 @@ def validate(self, request, response):
5356

5457
pass
5558

56-
def parse(self, request, response):
59+
def parse(self, request: Request, response: Response):
5760
"""
5861
@summary: 默认的解析函数
5962
---------
@@ -65,7 +68,7 @@ def parse(self, request, response):
6568

6669
pass
6770

68-
def exception_request(self, request, response, e):
71+
def exception_request(self, request: Request, response: Response, e: Exception):
6972
"""
7073
@summary: 请求或者parser里解析出异常的request
7174
---------
@@ -78,7 +81,7 @@ def exception_request(self, request, response, e):
7881

7982
pass
8083

81-
def failed_request(self, request, response, e):
84+
def failed_request(self, request: Request, response: Response, e: Exception):
8285
"""
8386
@summary: 超过最大重试次数的request
8487
可返回修改后的request 若不返回request,则将传进来的request直接人redis的failed表。否则将修改后的request入failed表
@@ -135,7 +138,7 @@ def add_task(self):
135138
@result:
136139
"""
137140

138-
def start_requests(self, task):
141+
def start_requests(self, task: PerfectDict):
139142
"""
140143
@summary:
141144
---------

feapder/setting.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@
165165
# 报警 支持钉钉、飞书、企业微信、邮件
166166
# 钉钉报警
167167
DINGDING_WARNING_URL = "" # 钉钉机器人api
168-
DINGDING_WARNING_PHONE = "" # 报警人 支持列表,可指定多个
168+
DINGDING_WARNING_PHONE = "" # 被@的群成员手机号,支持列表,可指定多个。
169+
DINGDING_WARNING_USER_ID = "" # 被@的群成员userId,支持列表,可指定多个
169170
DINGDING_WARNING_ALL = False # 是否提示所有人, 默认为False
170171
DINGDING_WARNING_SECRET = None # 加签密钥
171172
# 飞书报警

feapder/templates/project_template/setting.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@
147147
# # 报警 支持钉钉、飞书、企业微信、邮件
148148
# # 钉钉报警
149149
# DINGDING_WARNING_URL = "" # 钉钉机器人api
150-
# DINGDING_WARNING_PHONE = "" # 报警人 支持列表,可指定多个
150+
# DINGDING_WARNING_PHONE = "" # 被@的群成员手机号,支持列表,可指定多个。
151+
# DINGDING_WARNING_USER_ID = "" # 被@的群成员userId,支持列表,可指定多个
151152
# DINGDING_WARNING_ALL = False # 是否提示所有人, 默认为False
152153
# DINGDING_WARNING_SECRET = None # 加签密钥
153154
# # 飞书报警

feapder/utils/tools.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
@author: Boris
88
99
"""
10-
import hmac
1110
import asyncio
1211
import base64
1312
import calendar
@@ -16,6 +15,7 @@
1615
import datetime
1716
import functools
1817
import hashlib
18+
import hmac
1919
import html
2020
import importlib
2121
import json
@@ -2467,18 +2467,41 @@ def reach_freq_limit(rate_limit, *key):
24672467

24682468

24692469
def dingding_warning(
2470-
message, message_prefix=None, rate_limit=None, url=None, user_phone=None, secret=None
2470+
message,
2471+
*,
2472+
message_prefix=None,
2473+
rate_limit=None,
2474+
url=None,
2475+
user_phone=None,
2476+
user_id=None,
2477+
secret=None,
24712478
):
2479+
"""
2480+
钉钉报警,user_phone与user_id 二选一即可
2481+
Args:
2482+
message:
2483+
message_prefix: 消息摘要,用于去重
2484+
rate_limit: 包名频率,单位秒,相同的报警内容在rate_limit时间内只会报警一次
2485+
url: 钉钉报警url
2486+
user_phone: 被@的群成员手机号,支持列表,可指定多个。
2487+
user_id: 被@的群成员userId,支持列表,可指定多个
2488+
secret: 钉钉报警加签密钥
2489+
Returns:
2490+
2491+
"""
24722492
# 为了加载最新的配置
24732493
rate_limit = rate_limit if rate_limit is not None else setting.WARNING_INTERVAL
24742494
url = url or setting.DINGDING_WARNING_URL
24752495
user_phone = user_phone or setting.DINGDING_WARNING_PHONE
2496+
user_id = user_id or setting.DINGDING_WARNING_USER_ID
24762497
secret = secret or setting.DINGDING_WARNING_SECRET
24772498
if secret:
24782499
timestamp = str(round(time.time() * 1000))
2479-
secret_enc = secret.encode('utf-8')
2480-
string_to_sign_enc = f'{timestamp}\n{secret}'.encode('utf-8')
2481-
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
2500+
secret_enc = secret.encode("utf-8")
2501+
string_to_sign_enc = f"{timestamp}\n{secret}".encode("utf-8")
2502+
hmac_code = hmac.new(
2503+
secret_enc, string_to_sign_enc, digestmod=hashlib.sha256
2504+
).digest()
24822505
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
24832506
url = f"{url}&timestamp={timestamp}&sign={sign}"
24842507

@@ -2492,10 +2515,17 @@ def dingding_warning(
24922515
if isinstance(user_phone, str):
24932516
user_phone = [user_phone] if user_phone else []
24942517

2518+
if isinstance(user_id, str):
2519+
user_id = [user_id] if user_id else []
2520+
24952521
data = {
24962522
"msgtype": "text",
24972523
"text": {"content": message},
2498-
"at": {"atMobiles": user_phone, "isAtAll": setting.DINGDING_WARNING_ALL},
2524+
"at": {
2525+
"atMobiles": user_phone,
2526+
"atUserIds": user_id,
2527+
"isAtAll": setting.DINGDING_WARNING_ALL,
2528+
},
24992529
}
25002530

25012531
headers = {"Content-Type": "application/json"}

0 commit comments

Comments
 (0)