首页 > 数据库 >mysql 主从复制 -- django发送钉钉通知

mysql 主从复制 -- django发送钉钉通知

时间:2024-03-28 09:37:51浏览次数:35  
标签:主从复制 -- django access token https msg import com

mysql 主从搭建

# 之前做过redis的主从,很简单


# mysql 稍微复杂一些, 搭建mysql主从的目的是?
    -读写分离
    -单个实例并发量低,提高并发量
    -只在主库写,读数据都去从库
    
   
 # 原理
MySQL服务器之间的主从同步是基于二进制日志机制(binlog),主服务器使用二进制日志来(binlog)记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致
    
    
# mysql 主从原理
步骤一:主库db的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db.










# 搭建步骤 :准备两台机器 (mysql的docker镜像模拟两台机器)
    - mysql版本必须完全一致
    -主库:10.0.0.111 33307
    -从库:10.0.0.111 33306

    
    # 第一步:拉取mysql5.7的镜像
    # 第二步:创建文件夹,文件(目录映射)
        mkdir /home/mysql
        mkdir /home/mysql/conf.d
        mkdir /home/mysql/data/
        touch /home/mysql/my.cnf
        
        mkdir /home/mysql1
        mkdir /home/mysql1/conf.d
        mkdir /home/mysql1/data/
        touch /home/mysql1/my.cnf

    # 第三步(重要):编写mysql配置文件(主,从)
    #### 主的配置####
    [mysqld]
    user=mysql
    character-set-server=utf8
    default_authentication_plugin=mysql_native_password
    secure_file_priv=/var/lib/mysql
    expire_logs_days=7
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    max_connections=1000
    server-id=100
    log-bin=mysql-bin
    [client]
    default-character-set=utf8

    [mysql]
    default-character-set=utf8



    #### 从库的配置#####
    [mysqld]
    user=mysql
    character-set-server=utf8
    default_authentication_plugin=mysql_native_password
    secure_file_priv=/var/lib/mysql
    expire_logs_days=7
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    max_connections=1000
    server-id=101  
    log-bin=mysql-slave-bin   
    relay_log=edu-mysql-relay-bin 

    [client]
    default-character-set=utf8

    [mysql]
    default-character-set=utf8
    
    
    #第三步:启动mysql容器,并做端口和目录映射
    docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7


   docker run  -di -v /home/mysql1/data/:/var/lib/mysql -v /home/mysql1/conf.d:/etc/mysql/conf.d -v /home/mysql1/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7




                    
   #第四步:连接主库
    mysql -uroot -P 3307 -h 10.0.0.111
    #在主库创建用户并授权
    ##创建test用户
    create user 'test'@'%' identified by '123';
    ##授权用户
    grant all privileges on *.* to 'test'@'%' ;
    ###刷新权限
    flush privileges;
    #查看主服务器状态(显示如下图)
    show master status; 

    
   # 第五步:连接从库
    mysql -uroot -P3306 -h 10.0.0.111 -p
    #配置详解
    '''
    change master to 
    master_host='MySQL主服务器IP地址', 
    master_user='之前在MySQL主服务器上面创建的用户名', 
    master_password='之前创建的密码', 
    master_log_file='MySQL主服务器状态中的二进制文件名', 
    master_log_pos='MySQL主服务器状态中的position值';
    '''
change master to master_host='10.0.0.111',master_port=3307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
    #启用从库
    start slave;
    #查看从库状态(如下图)
    show slave status\G; # 保证IO和sql线程是yes的
    
    
    # 第六步:在主库创建库,创建表,插入数据,看从库

django中多redis缓存

# 配置文件
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    },
    "slave": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    }
}


from django.core.cache import caches
caches['slave'].set('age',19)
print(caches['default'].get('name'))

django中使用连接池

# 使用池的目的    --->为了控制链接数量
    -线程池
    -redis连接池
        -之前讲过
    -mysql连接池
        -pymysql:dbutils模块
        -sqlalchemy:自带的
        -django:没有连接池
            -一个请求就是一个链接,用完就释放
            -第三方连接池
# 下载:pip3 install django-db-connection-pool

# 1 配置文件中配置
DATABASES = {
    'default': {
        'ENGINE': 'dj_db_conn_pool.backends.mysql',
        'NAME': 'cnblogs',
        'HOST': '10.0.0.101',
        'PORT': 33307,
        'PASSWORD': '123456',
        'USER': 'root',
        'POOL_OPTIONS': {
            'POOL_SIZE': 2,
            'MAX_OVERFLOW': 2
        }
    }
}


# 查看mysql有多少连接数
show status like 'Threads%';

钉钉通知

 发送群消息

# https://open.dingtalk.com/document/orgapp/robot-sends-nail-message
import requests
import time
import hmac
import base64
import hashlib
import urllib
timestamp = str(round(time.time() * 1000))
secret = 'SEC8e6b93d027b9d27443ed6fb24e67777eb89a23d6a6f07e2c6738c3fb98e9549a'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)

url = 'https://oapi.dingtalk.com/robot/send?access_token=7f38316d68b269eac5a94aaded02839e5c27ed1365419e16fce6ad24f5e5198b&timestamp=%s&sign=%s'%(timestamp,sign)

data = {
    "msgtype": "text",
    "text": {
        "content": "通知:监控报警: 服务异常"
     }
}
res = requests.post(url, json=data)
print(res.text)

Python发送邮件

使用SMTP模块发送邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Header

msg_from = '[email protected]'  # 发送方邮箱
passwd = 'luzdikipwhjjbibf'  # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码)
msg_to = ['[email protected]']  # 收件人邮箱
# msg_to = '[email protected]'  # 收件人邮箱

subject = "邮件标题"  # 主题
# *************发送html的邮件**********
content = '''
<p>Python 邮件发送测试...</p>
<p><a href="http://www.baidu.com">这是一个链接</a></p>
'''
# 生成一个MIMEText对象
msg = MIMEText(content)
# 放入邮件主题
msg['Subject'] = subject
# 也可以这样传参
# msg['Subject'] = Header(subject, 'utf-8')
# 放入发件人
msg['From'] = msg_from
# 放入收件人
# msg['To'] = '[email protected]'
# msg['To'] = '发给你的邮件啊'
try:
    # 通过ssl方式发送
    s = smtplib.SMTP_SSL("smtp.qq.com", 465)
    # 登录到邮箱
    s.login(msg_from, passwd)
    # 发送邮件:发送方,收件方,要发送的消息
    s.sendmail(msg_from, msg_to, msg.as_string())
    print('成功')
except s.SMTPException as e:
    print(e)
finally:
    s.quit()

发送html格式邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Header

msg_from = '[email protected]'  # 发送方邮箱
passwd = 'ldoetnwqdjqqbjjj'  # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码)
msg_to = ['[email protected]']  # 收件人邮箱
# msg_to = '[email protected]'  # 收件人邮箱

subject = "邮件标题"  # 主题
# *************发送html的邮件**********
content = '''
<p>Python 邮件发送测试...</p>
<p><a href="http://www.baidu.com">这是一个链接</a></p>
'''
# 生成一个MIMEText对象
msg = MIMEText(content)
# 放入邮件主题
msg['Subject'] = subject
# 也可以这样传参
# msg['Subject'] = Header(subject, 'utf-8')
# 放入发件人
msg['From'] = msg_from
# 放入收件人
# msg['To'] = '[email protected]'
# msg['To'] = '发给你的邮件啊'
try:
    # 通过ssl方式发送
    s = smtplib.SMTP_SSL("smtp.qq.com", 465)
    # 登录到邮箱
    s.login(msg_from, passwd)
    # 发送邮件:发送方,收件方,要发送的消息
    s.sendmail(msg_from, msg_to, msg.as_string())
    print('成功')
except s.SMTPException as e:
    print(e)
finally:
    s.quit()

发送带附件格式

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email import  encoders
msg_from = '[email protected]'  # 发送方邮箱
passwd = '***'  # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码)
msg_to = ['[email protected]']  # 收件人邮箱

subject = "邮件标题"  # 主题
# 创建一个带附件的实例
msg = MIMEMultipart()
# 放入邮件主题
msg['Subject'] = subject
# 也可以这样传参
# msg['Subject'] = Header(subject, 'utf-8')
# 放入发件人
msg['From'] = msg_from

# 邮件正文内容
msg.attach(MIMEText('Python 邮件发送测试……', 'plain', 'utf-8'))

# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
msg.attach(att1)

# 构造附件2,
with open('test.png', 'rb') as f:
    # 设置附件的MIME和文件名,这里是png类型:
    mime = MIMEBase('image', 'png', filename='test.png')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='test.png')
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart:
    msg.attach(mime)
# 构造附件3,图片格式
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)
try:
    # 通过ssl方式发送
    s = smtplib.SMTP_SSL("smtp.qq.com", 465)
    # 登录到邮箱
    s.login(msg_from, passwd)
    # 发送邮件:发送方,收件方,要发送的消息
    s.sendmail(msg_from, msg_to, msg.as_string())
    print('成功')
except s.SMTPException as e:
    print(e)
finally:
    s.quit()

Django发送邮件

在setting中配置

# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = '[email protected]'  # 帐号
EMAIL_HOST_PASSWORD = '***'  # 密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
#这样收到的邮件,收件人处就会这样显示
#DEFAULT_FROM_EMAIL = 'lqz<'[email protected]>'
EMAIL_USE_SSL = True   #使用ssl
#EMAIL_USE_TLS = False # 使用tls

#EMAIL_USE_SSL 和 EMAIL_USE_TLS 是互斥的,即只能有一个为 True

view视图函数

  from django.core.mail import send_mail
    import threading
    from mybbs import settings

    t = threading.Thread(target=send_mail, args=("您的文章%s新增了一条评论内容" ,
                                                 'ddd',
                                                 settings.EMAIL_HOST_USER,
                                                 ["[email protected]"])
                         )
    t.start()

一次性发多封邮件

from django.core.mail import send_mass_mail

message1 = ('第一封邮件标题', '这是邮件内容', '[email protected]', ['[email protected]', '[email protected]'])
message2 = ('第二封邮件标题', '这是邮件内容', '[email protected]', ['[email protected]'])
'''
fail_silently: (可选)布尔值。为 False 时, send_mail 会抛出 smtplib.SMTPException 异常。smtplib 文档列出了所有可能的异常。 这些异常都是 SMTPException 的子类
'''
send_mass_mail((message1, message2), fail_silently=False)
'''
send_mail 每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 send_mass_mail 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 send_mass_mail 要优于 send_mail。
'''

携带附件或发送html(需要接收方支持)

from django.core.mail import EmailMultiAlternatives
# subject 主题 content 内容 to_addr 是一个列表,发送给哪些人
msg = EmailMultiAlternatives('邮件标题', '邮件内容', '发送方', ['接收方'])
msg.content_subtype = "html"
# 添加附件(可选)
msg.attach_file('test.txt')
# 发送
msg.send()

备注:send_mail 每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 send_mass_mail 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 send_mass_mail 要优于 send_mail

各大邮箱smtp服务器及端口

新浪邮箱smtp服务器
外发服务器:smtp.vip.sina.com
收件服务器:pop3.vip.sina.com
新浪免费邮件
外发服务器:smtp.sina.com.cn
收件服务器:pop3.sina.com.cn
163邮箱smtp服务器
pop: pop.163.com
smtp: smtp.163.com
QQ邮箱smtp服务器及端口
接收邮件服务器:imap.exmail.qq.com,使用SSL,端口号993
发送邮件服务器:smtp.exmail.qq.com,使用SSL,端口号465或587
yahoo邮箱smtp服务器
接:pop.mail.yahoo.com.cn
发:smtp.mail.yahoo.com
126邮箱smtp服务器
pop: pop.126.com
smtp: smtp.126.com
新浪免费邮箱
POP3:pop.sina.com
SMTP:smtp.sina.com
SMTP端口号:25
新浪VIP邮箱
POP3:pop3.vip.sina.com
SMTP:smtp.vip.sina.com
SMTP端口号:25
新浪企业邮箱
POP3:pop.sina.com
SMTP:smtp.sina.com
SMTP端口号:25
雅虎邮箱
POP3:pop.mail.yahoo.cn
SMTP:smtp.mail.yahoo.cn
SMTP端口号:25
搜狐邮箱
POP3:pop3.sohu.com
SMTP:smtp.sohu.com
SMTP端口号:25
TOM邮箱
POP3:pop.tom.com
SMTP:smtp.tom.com
SMTP端口号:25
Gmail邮箱
POP3:pop.gmail.com
SMTP:smtp.gmail.com
SMTP端口号:587 或 25
QQ邮箱
POP3:pop.exmail.qq.com
SMTP:smtp.exmail.qq.com
SMTP端口号:25
263邮箱
域名:263.net
POP3:263.net
SMTP:smtp.263.net
SMTP端口号:25
域名:x263.net
POP3:pop.x263.net
SMTP:smtp.x263.net
SMTP端口号:25
域名:263.net.cn
POP3:263.net.cn
SMTP:263.net.cn
SMTP端口号:25
域名:炫我型
POP3:pop.263xmail.com
SMTP:smtp.263xmail.com
SMTP端口号:25
21CN 免费邮箱
POP3:pop.21cn.com
SMTP:smtp.21cn.com
IMAP:imap.21cn.com
SMTP端口号:25
21CN 经济邮邮箱
POP3:pop.21cn.com
SMTP:smtp.21cn.com
SMTP端口号:25
21CN 商务邮邮箱
POP3:pop.21cn.net
SMTP:smtp.21cn.net
SMTP端口号:25
21CN 快感邮箱
POP3:vip.21cn.com
SMTP:vip.21cn.com
SMTP端口号:25
21CN Y邮箱
POP3:pop.y.vip.21cn.com
SMTP:smtp.y.vip.21cn.com
SMTP端口号:25
中华网任我邮邮箱
POP3:rwpop.china.com
SMTP:rwsmtp.china.com
SMTP端口号:25
中华网时尚、商务邮箱
POP3:pop.china.com
SMTP:smtp.china.com
SMTP端口号:25

qq邮箱配置smtp

登录qq邮箱:

 

 

 

开启smtp服务,生成授权码

Python发送短信

# 发送短信需要借助于第三方短信平台,比较知名的有
    -腾讯云短信:https://cloud.tencent.com/act/pro/csms
    -阿里短信:https://cn.aliyun.com/product/sms?from_alibabacloud=
    -容联云短信:https://www.yuntongxun.com/sms/note-inform

 

腾讯云发送短信-准备

# 访问地址,完成以下操作:https://console.cloud.tencent.com/smsv2

1)申请短信签名 - 国内短信 > 签名管理【需要有公众号/备案网站/小程序等】
2)申请短信模块 - 国内短信 > 正文模板管理【发送短信的格式】
3)使用Python-sdk发送短信
    -https://cloud.tencent.com/document/product/382/43196

 

测试发送短信

# 1 安装模块
pip install --upgrade tencentcloud-sdk-python
# 2 复制官方代码测试


# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 导入对应产品模块的client models。
from tencentcloud.sms.v20210111 import sms_client, models

# 导入可选配置类
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
try:
    # 必要步骤:
    # 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。
    # 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
    # 您也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人,
    # 以免泄露密钥对危及您的财产安全。
    # SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi
    cred = credential.Credential("AKIDqLdhZJvQk9QaXLvHOMRKzQuMhqrlibOy", "YuIYggjdaKuc7Seo16zkKnL3kNpAPTQK")
    # cred = credential.Credential(
    #     os.environ.get(""),
    #     os.environ.get("")
    # )

    # 实例化一个http选项,可选的,没有特殊需求可以跳过。
    httpProfile = HttpProfile()
    # 如果需要指定proxy访问接口,可以按照如下方式初始化hp(无需要直接忽略)
    # httpProfile = HttpProfile(proxy="http://用户名:密码@代理IP:代理端口")
    httpProfile.reqMethod = "POST"  # post请求(默认为post请求)
    httpProfile.reqTimeout = 30    # 请求超时时间,单位为秒(默认60秒)
    httpProfile.endpoint = "sms.tencentcloudapi.com"  # 指定接入地域域名(默认就近接入)

    # 非必要步骤:
    # 实例化一个客户端配置对象,可以指定超时时间等配置
    clientProfile = ClientProfile()
    clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定签名算法
    clientProfile.language = "en-US"
    clientProfile.httpProfile = httpProfile

    # 实例化要请求产品(以sms为例)的client对象
    # 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8
    client = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)

    # 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
    # 您可以直接查询SDK源码确定SendSmsRequest有哪些属性可以设置
    # 属性可能是基本类型,也可能引用了另一个数据结构
    # 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明
    req = models.SendSmsRequest()

    # 基本类型的设置:
    # SDK采用的是指针风格指定参数,即使对于基本类型您也需要用指针来对参数赋值。
    # SDK提供对基本类型的指针引用封装函数
    # 帮助链接:
    # 短信控制台: https://console.cloud.tencent.com/smsv2
    # 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81

    # 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666
    # 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
    req.SmsSdkAppId = "1400635776"
    # 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名
    # 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
    req.SignName = "小猿取经公众号"
    # 模板 ID: 必须填写已审核通过的模板 ID
    # 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
    req.TemplateId = "1049981"
    # 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,,若无模板参数,则设置为空
    req.TemplateParamSet = ["8888",'5']
    # 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号]
    # 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号
    req.PhoneNumberSet = ["+8618953675221"]
    # 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回
    req.SessionContext = ""
    # 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手]
    req.ExtendCode = ""
    # 国内短信无需填写该项;国际/港澳台短信已申请独立 SenderId 需要填写该字段,默认使用公共 SenderId,无需填写该字段。注:月度使用量达到指定量级可申请独立 SenderId 使用,详情请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。
    req.SenderId = ""

    resp = client.SendSms(req)

    # 输出json格式的字符串回包
    print(resp.to_json_string(indent=2))

    # 当出现以下错误码时,快速解决方案参考
    # - [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
    # - [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
    # - [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
    # - [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)
    # - 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms)

except TencentCloudSDKException as err:
    print(err)

django中封装

# 封装包:
    -libs
        send_tx_sms  #包名
            __init__.py
            settings.py #配置文件
            sms.py      # 核心文件
################ __init__.py ##############
from .sms import get_code,send_sms_by_phone

################ settings.py ##############
SECRET_ID = 'AKIDqLdhZJvQk9QaXLvHOMRKzQuMhqrlibOy'
SECRET_KEY = 'YuIYggjdaKuc7Seo16zkKnL3kNpAPTQK'
APP_ID = '1400635776'
SIGN_NAME='小猿取经公众号'
TEMPLATE_ID='1049981'

################ sms.py  ##############
import random

from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 导入对应产品模块的client models。
from tencentcloud.sms.v20210111 import sms_client, models

# 导入可选配置类
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from . import settings


# 获取n位随机数组验证码的函数
def get_code(num=4):
    code = ''
    for i in range(num):
        random_num = random.randint(0, 9)
        code += str(random_num)
    return code


# 发送短信函数
def send_sms_by_phone(mobile, code):
    try:
        cred = credential.Credential(settings.SECRET_ID, settings.SECRET_KEY)
        httpProfile = HttpProfile()
        httpProfile.reqMethod = "POST"  # post请求(默认为post请求)
        httpProfile.reqTimeout = 30  # 请求超时时间,单位为秒(默认60秒)
        httpProfile.endpoint = "sms.tencentcloudapi.com"  # 指定接入地域域名(默认就近接入)

        # 非必要步骤:
        # 实例化一个客户端配置对象,可以指定超时时间等配置
        clientProfile = ClientProfile()
        clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定签名算法
        clientProfile.language = "en-US"
        clientProfile.httpProfile = httpProfile
        client = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)
        req = models.SendSmsRequest()
        req.SmsSdkAppId = settings.APP_ID  # 腾讯短信创建app把app的id号复制过来https://console.cloud.tencent.com/smsv2/app-manage
        # 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名
        # 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
        req.SignName = settings.SIGN_NAME
        # 模板 ID: 必须填写已审核通过的模板 ID
        # 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
        req.TemplateId = settings.TEMPLATE_ID
        # 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,,若无模板参数,则设置为空
        req.TemplateParamSet = [code, '1']
        # 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号]
        # 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号
        req.PhoneNumberSet = ["+86" + mobile, ]
        # 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回
        req.SessionContext = ""
        req.ExtendCode = ""
        req.SenderId = ""

        resp = client.SendSms(req)

        # 输出json格式的字符串回包
        # 字符串类型
        print(resp.to_json_string(indent=2))

        return True
    except TencentCloudSDKException as err:

        return False
    
    
    
################ views.py ##############
from libs.send_tx_sms import get_code, send_sms_by_phone
def send(request):
    code = get_code()
    res = send_sms_by_phone('18953675221', code)
    if res:
        return HttpResponse('短信发送成功')
    else:
        return HttpResponse('短信发送失败')

Python发送钉钉通知

# 在公司内部,我们可能会使用钉钉发送群通知或个人通知,需要使用钉钉软件
    -手机端
    -pc端(mac,win)
# 钉钉发送通知主要有以下两种方式
    -1 发送群通知【群机器人-webhook方式】
        -使用场景:发送消息到聊天群,需要创建一个聊天机器人
    -2 发送个人通知【API方式】
        -使用场景:给公司内某个同事-发送通知类的消息
        -如果请假审批通过,报销单审批完成,员工生日祝福等

发送群通知

#1 文档(定义群聊天机器人):
https://open.dingtalk.com/document/robots/custom-robot-access
# 2 参照文档创建聊天机器人
    单击群管理 > 机器人 > 添加机器人,选择自定义机器人
    
# 3 参照api文档编写消息发送
https://open.dingtalk.com/document/orgapp/robot-overview

创建机器人

 

 

发送消息

发送DING消息

# https://open.dingtalk.com/document/orgapp/robot-sends-nail-message
import requests
import time
import hmac
import base64
import hashlib
import urllib
timestamp = str(round(time.time() * 1000))
secret = 'SEC8e6b93d027b9d27443ed6fb24e67777eb89a23d6a6f07e2c6738c3fb98e9549a'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)

url = 'https://oapi.dingtalk.com/robot/send?access_token=7f38316d68b269eac5a94aaded02839e5c27ed1365419e16fce6ad24f5e5198b&timestamp=%s&sign=%s'%(timestamp,sign)

data = {
    "msgtype": "text",
    "text": {
        "content": "通知:监控报警: 服务异常"
     }
}
res = requests.post(url, json=data)
print(res.text)

发送普通消息[链接、markdown消息,feedCard消息]

# https://oapi.dingtalk.com/robot/send?access_token=7f38316d68b269eac5a94aaded02839e5c27ed1365419e16fce6ad24f5e5198b
import requests
import time
import hmac
import base64
import hashlib
import urllib
timestamp = str(round(time.time() * 1000))
secret = 'SEC8e6b93d027b9d27443ed6fb24e67777eb89a23d6a6f07e2c6738c3fb98e9549a'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)




url = 'https://oapi.dingtalk.com/robot/send?access_token=7f38316d68b269eac5a94aaded02839e5c27ed1365419e16fce6ad24f5e5198b&timestamp=%s&sign=%s'%(timestamp,sign)

data = {
    "msgtype": "link",
    "link": {
        "text": "这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林",
        "title": "时代的火车向前开",
        "picUrl": "",
        "messageUrl": "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"
    }
}


res = requests.post(url, json=data)
print(res.text)

发送互动卡片

#1 步骤:
步骤一:登录开发者后台,创建内部应用。

步骤二:获取AppKey和AppSecret。

步骤三:申请机器人接口权限,搜索“机器人”,选择机器人相关接口权限并申请。

步骤四:获取应用访问凭证获取企业内部应用的access_token。

步骤五:登录互动卡片普通版搭建平台,搭建卡片模板。

步骤六:调用互动卡片服务端接口。

调用新版服务端API-机器人发送互动卡片接口,实现发送卡片信息。

根据cardBizId卡片标识ID,调用新版服务端API-更新机器人发送互动卡片接口,实现更新卡片内容

# 2 文档地址:
https://open.dingtalk.com/document/resourcedownload/ding-card-interactive-card-operation-process?spm=ding_open_doc.document.0.0.616d40e9XD0pGZ
    
    
# 3 安装sdk
pip install alibabacloud_dingtalk

发送个人通知

# 1 给公司某个发送通知
    -https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages
        
# 2 在钉钉开放平台创建企业内部应用/钉钉应用
    -获取应用凭证(AgentId、AppKey、AppSecret)
    -https://open-dev.dingtalk.com/fe/app#/corp/app
        
        
# 3 获取用户token
    -https://open.dingtalk.com/document/orgapp/obtain-orgapp-token
        
# 4 获取部门id

# 5 获取部门下所有用户

# 6 获取所有员工

# 7 发送消息

创建应用

# 1 访问地址:
https://open-dev.dingtalk.com/fe/app#/corp/app
# 2 创建应用

# 3 得到应用基本信息
AgentId、AppKey、AppSecret

 

 

 

 

获取token

# 1 文档地址:
https://open.dingtalk.com/document/orgapp/obtain-orgapp-token
    
# 2 编写代码获取token
def get_access_token(appkey, appsecret):
    """
    获取access_token
    https://open.dingtalk.com/document/orgapp/obtain-orgapp-token
    """
    url = 'https://oapi.dingtalk.com/gettoken'
    params = {
        'appkey': appkey,
        'appsecret': appsecret
    }

    res = requests.get(url, params=params)
    return res.json()

 

获取在职员工

# 1 接口文档
https://open.dingtalk.com/document/orgapp/intelligent-personnel-query-the-list-of-on-the-job-employees-of-the
    
# 2 给应用授权

# 3 代码获取
def get_all_member(access_token):
    url = "https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob"
    data = {
        "access_token": access_token,
    }
    body={
        'status_list':3,
        'offset':0,
        'size':50
    }
    res_json = requests.post(url=url, params=data,json=body).json()

    return res_json

 

发送消息

# 1 接口文档地址
https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages
    
# 2 给应用授权

# 3 代码发送消息
def send_message(access_token, body):
    """
    发送应用消息
    https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages
    """
    url = 'https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2'

    params = {
        'access_token': access_token,
    }

    res = requests.post(url, params=params, json=body)
    return res.json()


ret = send_message(token['access_token'], {
    "agent_id": agent_id,
    #"userid_list": res['userIds'][0],
    "userid_list": res['result']['data_list'][0],
    "msg": {
        "msgtype": "text",
        "text": {
            "content": "你好,钉钉"
        },
    },
})

获取部门列表

 

# 旧版本接口:https://open.dingtalk.com/document/orgapp/obtains-a-list-of-industry-departments
def get_dep_list(access_token):
    url = "https://oapi.dingtalk.com/department/list"
    data = {
        "access_token": access_token,
    }
    res_json = requests.get(url=url, params=data).json()

    print(res_json)
    return res_json['department'][0]['id']

# 新版本接口
def get_dep_list(access_token):
    url = "https://oapi.dingtalk.com/topapi/v2/department/listsub"
    data = {
        "access_token": access_token,
    }
    body={
        # 'dept_id':0,
        # 'language':'zh_CN'
    }
    res_json = requests.post(url=url, params=data,json=body).json()

    print(res_json)
    return res_json['result'][0]['dept_id']

 

获取部门下人员

 

# 旧版本接口
def get_memberList(access_token,depId):
    url = "https://oapi.dingtalk.com/user/getDeptMember"
    data = {
        "access_token": access_token,
        "deptId": depId,
    }
    res_json = requests.get(url=url, params=data).json()

    return res_json

# 新版本接口:https://open.dingtalk.com/document/orgapp/obtains-the-list-of-people-under-a-department
def get_memberList(access_token):
    url = "https://oapi.dingtalk.com/topapi/industry/user/list"
    data = {
        "access_token": access_token,
    }
    body={
        "dept_id": 922598227,
        'cursor':1,
        'size':10
    }
    res_json = requests.post(url=url, params=data,json=body).json()

    return res_json

 

 

 

总代码

 

 

import requests


def get_access_token(appkey, appsecret):
    """
    获取access_token
    https://open.dingtalk.com/document/orgapp/obtain-orgapp-token

    :param appkey: 应用的唯一标识key
    :param appsecret: 应用的密钥
    :return:
    {
        "errcode": 0,
        "access_token": "96fc7a7axxx",
        "errmsg": "ok",
        "expires_in": 7200
    }
    """
    url = 'https://oapi.dingtalk.com/gettoken'
    params = {
        'appkey': appkey,
        'appsecret': appsecret
    }

    res = requests.get(url, params=params)
    return res.json()


def send_message(access_token, body):
    """
    发送应用消息
    https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages
    """
    url = 'https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2'

    params = {
        'access_token': access_token,
    }

    res = requests.post(url, params=params, json=body)
    return res.json()


def get_dep_list(access_token):
    url = "https://oapi.dingtalk.com/department/list"
    data = {
        "access_token": access_token,
    }
    res_json = requests.get(url=url, params=data).json()

    print(res_json)
    return res_json['department'][0]['id']



def get_memberList(access_token,depId):
    url = "https://oapi.dingtalk.com/user/getDeptMember"
    data = {
        "access_token": access_token,
        "deptId": depId,
    }
    res_json = requests.get(url=url, params=data).json()

    return res_json


def get_all_member(access_token):
    url = "https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob"
    data = {
        "access_token": access_token,
    }
    body={
        'status_list':3,
        'offset':0,
        'size':50
    }
    res_json = requests.post(url=url, params=data,json=body).json()

    return res_json


if __name__ == '__main__':
    # 应用的唯一标识key
    appkey = 'dingonm5dhwzzwc1sgnj'

    # 应用的密钥
    appsecret = 'uIn2WinJ87THxLSjUAcuWQwg3hSVwG462UPm6yhi-mkvd2tb3ASjTOetYvuhvXef'

    # 发送消息时使用的微应用的AgentID
    agent_id = '3017843676'

    # 接收者的userid列表
    userid_list = ''

    token = get_access_token(appkey, appsecret)
    print(token)
    # 获取部门
    dept_id=get_dep_list(token['access_token'])

    # res=get_memberList(token['access_token'],dept_id)
    res=get_all_member(token['access_token'])
    print(res['result']['data_list'][0])
    # 发消息


    ret = send_message(token['access_token'], {
        "agent_id": agent_id,
        # "userid_list": res['userIds'][1],
        "userid_list": res['result']['data_list'][0],
        "msg": {
            "msgtype": "text",
            "text": {
                "content": "你好,钉钉通知~~~~"
            },
        },
    })
    # print(ret)

 

标签:主从复制,--,django,access,token,https,msg,import,com
From: https://www.cnblogs.com/wzh366/p/18100764

相关文章

  • 保护主机安全,我来buff加成
    本文分享自华为云社区《【云图说】第303期保护主机安全,我来buff加成!》,作者:阅识风云。华为云主机安全服务(HSS)是提升主机、容器等工作负载安全性的产品,支持云上云下多主机以及容器的纳管接入,通过资产管理、漏洞管理、基线检查、病毒检测等功能,帮助企业更便捷、高效地管控主机、......
  • jvm内存模型
    1栈局部变量表存放局部变量局部变量表中的对象是指向堆中对象的地址操作数栈方法内的数据计算程序计数器程序一行代码运行后存放下一行代码的地址本地方法栈方法用native修饰动态链接符号引用转化为直接引用直接引用为方法区的具体地址方法出口2堆新生代伊甸......
  • blog-engine-09-nuxt 构建快速、SEO友好和可扩展的Web应用程序变得轻松
    拓展阅读blog-engine-01-常见博客引擎jekyll/hugo/Hexo/Pelican/Gatsby/VuePress/Nuxt.js/Middleman对比blog-engine-02-通过博客引擎jekyll构建githubpages博客实战笔记blog-engine-02-博客引擎jekyll-jekyll博客引擎介绍blog-engine-02-博客引擎jekyll-jekyll如何......
  • 【Vue】 签名组件
    一、需求背景:检查业务,检查完成后,执行人需要签字证明检查完成 二、实现效果: 三、技术实现通过canvas转换成blob对象,可以上传到文件服务,或者是下载另存为到本地磁盘注意重点,canvas的样式的宽高和dom对象宽高一定要一致才可以,否则无法在面板绘制线条!<template><el-dia......
  • Oracle中的for update 和 for update nowait
    在Oracle数据库中,FORUPDATE和FORUPDATENOWAIT是两种用于行级锁定的SQL子句,它们通常用在SELECT语句中以确保数据的一致性和隔离性。这里是它们的基本区别和用法:FORUPDATEFORUPDATE子句用于锁定SELECT语句检索到的行,以便于进行更新操作。当使用FORUPDATE时,如果所选行已经......
  • 房地产防飞单系统是什么
    房地产防飞单系统是一种基于客户关系管理(CRM)的应用系统,旨在防止销售人员的客户资源流失和泄露,确保客户资源的安全和追踪跟进。该系统通过实现信息的精准掌握和资源的有效分配,为企业提供更稳定、更高效、更优质的业务服务。 具体而言,房地产防飞单系统具备以下功能:     ......
  • 013、青溪
    013、青溪唐●王维言入黄花川,每逐青溪水。随山将万转,趣途无百里。声喧乱石中,色静深松里。漾漾泛菱荇,澄澄映葭苇。我心素已闲,清川澹如此。请留磐石上,垂钓将已矣。 【现代诗意译】青溪 我每次进入黄花川游玩,都要沿着青溪水前行。青溪随着山势弯曲转湾很多,可是距离......
  • IRIS / Chronicles 中的 Data Type(数据类型)字段型属性
    IRIS的数据类型比较少,也就4个数据类型:字符串,数字,时间,分类。在这里分类有点像我们的下拉选择框,其实对应Java或者其语言中的数据来说可以说是枚举类型。只是IRIS的枚举类型是定义在数据库中的,并且是事先定义好的。String这个好说,就是字符串。因为M语言的限制,所以Stri......
  • python x_train取前100行
    目录Python代码示例:取出x_train前100行数据Python代码示例:取出x_train前100行数据在机器学习和数据处理中,有时我们需要对数据集进行处理,比如提取其中的部分数据进行分析或训练模型。在Python中,我们可以利用简单的代码来实现这一功能。下面就以一个示例来演示如何使用Pytho......
  • 关于小狼毫输入法
    首先说明, 我用的是五笔输入法, 尽管win10 已经自带微软五笔, 那为什么还要折腾呢, 原因有点复杂, 也许是设置不方便, 比如是中文输入时, 为什么不能配置成英文标点符号, 在哪里设置, 愣是没找着, 其他输入法, 要么停更了, 要么不符合使用习惯, 偶然碰到小狼毫输......