ent_interface_dingtalk_top10.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import base64
  2. import hashlib
  3. import hmac
  4. import sys
  5. import re
  6. import os
  7. import urllib
  8. import time
  9. import requests
  10. abspath = os.path.abspath(__file__)
  11. root_path = re.sub(r"tendata-warehouse.*", "tendata-warehouse", abspath)
  12. sys.path.append(root_path)
  13. from dw_base.utils.config_utils import parse_args
  14. from dw_base.spark.spark_sql import SparkSQL
  15. import http.client
  16. import json
  17. from cryptography.hazmat.primitives.asymmetric import rsa, padding
  18. from cryptography.hazmat.primitives import serialization
  19. from base64 import b64encode
  20. # 公钥
  21. public_key_pem = b"""
  22. -----BEGIN PUBLIC KEY-----
  23. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSaL/mqfq/30d5w6/05EL4073z
  24. ZgsomKTDI9wKUyz+ETkGwWzaNQm8BAXk9nJMCPz25fCTPd2BkifrS2KFKK2+e4hU
  25. pQxs+FQGaSeR8YEBWsCwh8bWaFWgxKuWpPPdfP6Vcnid/pTAsjbnw0KIHT7x83WZ
  26. qQTu3GUdyXkfyB41CQIDAQAB
  27. -----END PUBLIC KEY-----
  28. """
  29. class UserInfo:
  30. """公司名称"""
  31. company_name: str
  32. """真实名称"""
  33. name: str
  34. """用户id"""
  35. user_id: int
  36. """用户名"""
  37. username: str
  38. def __init__(self, company_name: str, name: str, user_id: int, username: str) -> None:
  39. self.company_name = company_name
  40. self.name = name
  41. self.user_id = user_id
  42. self.username = username
  43. def __str__(self) -> str:
  44. return (f"UserInfo:\n"
  45. f" Company Name: {self.company_name}\n"
  46. f" Name: {self.name}\n"
  47. f" User ID: {self.user_id}\n"
  48. f" Username: {self.username}")
  49. def encrypt_user_id(user_id):
  50. public_key = serialization.load_pem_public_key(public_key_pem)
  51. encrypted = public_key.encrypt(
  52. user_id.encode(),
  53. padding.PKCS1v15()
  54. )
  55. return b64encode(encrypted).decode()
  56. def get_user_info(user_id):
  57. encrypted_user_id = encrypt_user_id(user_id)
  58. conn = http.client.HTTPConnection("192.168.11.6", 18080)
  59. payload = json.dumps({
  60. "encryptUserId": encrypted_user_id
  61. })
  62. headers = {
  63. 'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
  64. 'Content-Type': 'application/json'
  65. }
  66. try:
  67. conn.request("POST", "/account/personal", payload, headers)
  68. res = conn.getresponse()
  69. resdata = res.read().decode("utf-8")
  70. res_json = json.loads(resdata)
  71. user_info = UserInfo(res_json['companyName'], res_json['name'], res_json['userId'], res_json['username'])
  72. return user_info
  73. except Exception as e:
  74. print("Error:", e)
  75. finally:
  76. conn.close()
  77. spark = SparkSQL(udf_files=['dw_base/spark/udf/contacts/ctc_common.py',
  78. 'dw_base/spark/udf/spark_id_generate_udf.py'])
  79. def get_sign(secret):
  80. timestamp = str(round(time.time() * 1000))
  81. secret_enc = secret.encode('utf-8')
  82. string_to_sign = '{}\n{}'.format(timestamp, secret)
  83. string_to_sign_enc = string_to_sign.encode('utf-8')
  84. hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
  85. sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
  86. return timestamp, sign
  87. def send_dingtalk_markdown(msg):
  88. headers = {"Content-Type": "application/json"}
  89. data = {
  90. "msgtype": "markdown",
  91. "markdown": {"title": '企业库告警', "text": msg, }
  92. }
  93. json_data = json.dumps(data)
  94. secret = 'SECffb7fe1b4c3aacc7be85d3b03de88fdbf93dfb48fe1c13ea7dba34a84847675e'
  95. timestamp, sign = get_sign(secret)
  96. url = f'https://oapi.dingtalk.com/robot/send?access_token=ffdb7df856220a925196e911107a4aa259acb2fd1160fee8b11d0c3c800974fc&timestamp={timestamp}&sign={sign}'
  97. response = requests.post(url=url, data=json_data, headers=headers)
  98. response.raise_for_status()
  99. def ent_user_top(dt):
  100. sql = (f"select GET_JSON_OBJECT(ori_json, '$.params.userId') as user ,count(1) as cnt from ent_raw.interface_base "
  101. f"where dt='{dt}' and topic = 'ent_tendata_interface' and GET_JSON_OBJECT(ori_json, '$.type') = 'BRIEF_RESULT' group by GET_JSON_OBJECT(ori_json, '$.params.userId') order by count(1) desc limit 10"
  102. )
  103. body = ''
  104. for row in spark.query(sql)[0].collect():
  105. userid = row.user
  106. user_info = get_user_info(userid)
  107. body += f'{user_info.username},{user_info.name},{user_info.company_name},**{row.cnt}**次 \n\n'
  108. return body
  109. if __name__ == '__main__':
  110. CONFIG, _ = parse_args(sys.argv[1:])
  111. dts = CONFIG.get('dt').split(',')
  112. for dt in dts:
  113. format_dt = f'{dt[:4]}-{dt[4:6]}-{dt[6:]}'
  114. ent_user_top_cnt = ent_user_top(dt)
  115. msg = f'''### 企业主页接口调用统计top10
  116. > **统计日期 : {format_dt}**
  117. {ent_user_top_cnt}
  118. '''
  119. print(msg)
  120. send_dingtalk_markdown(msg)