python3 阿里云api进行巡检发送邮件

python3 脚本爬取阿里云进行巡检

  • 不确定pip能不能安装上,使用时候可以百度一下,脚本是可以使用的,没有问题的

太长时间了,pip安装依赖忘记那些了,使用科大星火询问了下,给了下面的,看看能不能使用吧
根据您提供的代码,您需要安装以下Python库:

  1. HTMLTable(来自HTMLTable库)
  2. email.mime.multipart(来自email库)
  3. paramiko
  4. clickhouse-driver(来自clickhouse_driver库)
  5. smtplib
  6. string
  7. json
  8. requests
  9. time
  10. datetime
  11. prettytable(来自prettytable库)
  12. ntpath(来自ntpath库)
  13. email.header(来自email库)
  14. aliyunsdkcore(来自aliyunsdkcore库)
  15. email.mime.text(来自email库)
  16. aliyunsdkcore.request(来自aliyunsdkcore库)
  17. aliyunsdkecs.request.v20140526(来自aliyunsdkecs库)
  18. aliyunsdkcore.acs_exception.exceptions(来自aliyunsdkcore库)
  19. aliyunsdkcms.request.v20190101(来自aliyunsdkcms库)
  20. aliyunsdkr_kvstore.request.v20150101(来自aliyunsdkr_kvstore库)
  21. aliyunsdkdts.request.v20200101(来自aliyunsdkdts库)
  22. aliyunsdkr_kvstore.request.v20150101(来自aliyunsdkr_kvstore库)

不确定pip能不能安装上,使用时候可以百度一下,脚本是可以使用的,没有问题的

pip install HTMLTable
pip install email
pip install paramiko
pip install clickhouse-driver
pip install smtplib
pip install string
pip install json
pip install requests
pip install time
pip install datetime
pip install prettytable
pip install ntpath
pip install email.header
pip install aliyunsdkcore
pip install email.mime.text
pip install aliyunsdkcore.request
pip install aliyunsdkecs.request.v20140526
pip install aliyunsdkcore.acs_exception.exceptions
pip install aliyunsdkcms.request.v20190101
pip install aliyunsdkr_kvstore.request.v20150101
pip install aliyunsdkdts.request.v20200101
pip install aliyunsdkr_kvstore.request.v20150101
#!/usr/bin/
env python
# -*- coding: utf-8 -*-
from HTMLTable import (HTMLTable,)
from email.mime.multipart import MIMEMultipartimport paramiko
from clickhouse_driver import Client, connect
import smtplib
import string
import json
import requests
import time
import datetime
import prettytable as pt
from ntpath import join
from email.header import Header
from aliyunsdkcore import client
from email.mime.text import MIMEText
from aliyunsdkcore.request import CommonRequest
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcms.request.v20190101.DescribeMetricTopRequest import DescribeMetricTopRequest
from aliyunsdkr_kvstore.request.v20150101.DescribeInstancesRequest import \DescribeInstancesRequest as DescribeInstancesRequest2
from aliyunsdkdts.request.v20200101.DescribeDtsJobsRequest import DescribeDtsJobsRequest
from aliyunsdkr_kvstore.request.v20150101.DescribeInstanceAttributeRequest import DescribeInstanceAttributeRequest# 阿里云认证
clt = client.AcsClient('TT','BB', 'cn-chengdu')# 脚本所需参数
# 设置页数
page_number = '1'
# 设置每页返回多少,默认为10条
strip_number = '100'
# ECS到期时间范围单位是‘天’
expire_days = '7'
# 云服务的数据命名空间(磁盘使用率那进行调用)
ecs_namespace = 'acs_ecs_dashboard'
# 云服务(ECS)的监控项名称
Disk_metricname = 'vm.DiskUtilization'  # 磁盘
Mem_metricname = 'vm.MemoryUtilization'  # 内存
CPU_metricname = 'cpu_total'  # CPU
# 磁盘使用率阀值(%)
Disk_use_rate = '70'
# 内存使用率阀值(%)
Mem_user_rate = '70'
# CPU使用率阀值(%)
Cpu_user_rate = '70'
str_time = "%s-%s-%s" % (datetime.datetime.now().year,datetime.datetime.now().month, datetime.datetime.now().day)
time_mail = time.strftime('%Y%m%d%H%M%S ', time.localtime(time.time()))
# 发送邮件相关信息
sender = 'aaaaaaa@163.com'# 收件人邮箱
receiver = 'bbbbb@163.com','ccccc@163.com'
# receiver = 'wangzq@icbf.com.cn','yangyang@icbf.com.cn'subject = '%s运维巡检表' % (str_time)
# 邮箱账户命密码
username = 'aaaaaaa@163.com'
password = 'aaaaaaaa''''
阿里云采样范围太大就会提示(是因为每个月阿里云api是有固定免费额度的)
{"status":"error","errorType":"execution",
"error":"query processing would load too many samples into memory in query execution"}
'''# 生成表格
def form(column_name, field_information, title):table = HTMLTable(caption='')table.append_header_rows(((column_name),))for field in field_information:table.append_data_rows(((field),))# 表格样式,即<table>标签样式table.set_style({'border-collapse': 'collapse','word-break': 'keep-all','white-space': 'nowrap','font-size': '14px','margin-left': '30px','text-align': 'center',})# 统一设置所有单元格样式,<td>或<th>table.set_cell_style({'border-color': '#000','border-width': '1px','border-style': 'solid','padding': '5px',})# 表头样式table.set_header_row_style({'color': '#fff','background-color': '#48a6fb','font-size': '18px',})# 覆盖表头单元格字体样式table.set_header_cell_style({'padding': '15px',})html = table.to_html()html = '<h3 style="color:red;margin-left: 30px" > %s </h3>' % (title) + htmlreturn html# 把巡检信息进行html格式化
def html_formatting( Aliyun_html):html_text = """
<!DOCTYPE html>
<html lang="en">
<head><title></title><meta charset="utf-8">
</head>
<body><div class="page" style="margin-left: 20px"><h1> {time_mail} 巡检结果如下 </h1><h2 style="color:blue;margin-left: 15px"> 阿里云 </h2>{Aliyun_html}</div></div>
</body>
</html>
""".format(time_mail=str_time,Aliyun_html=Aliyun_html,)msge = html_textreturn msge# 列表---ECS列表
def get_sys_info():request = DescribeInstancesRequest.DescribeInstancesRequest()# request.set_PageNumber('page_number')   #设置页数request.set_PageSize(strip_number)  # 设置每页返回多少,默认为10条request.set_accept_format('json')response = json.loads(clt.do_action(request)).get('Instances').get('Instance')return response# ECS 5天内到期时间
def ecs_five_endtime():field_information = []count = 0for i in get_sys_info():# 阿里云UTC时间转换成北京时间ecs_endtime_0 = i['ExpiredTime']ecs_endtime_1 = "%Y-%m-%dT%H:%MZ"ecs_endtime_2 = datetime.datetime.strptime(ecs_endtime_0, ecs_endtime_1)ecs_endtime_3 = ecs_endtime_2 + \datetime.timedelta(hours=8) - datetime.timedelta(seconds=1)ecs_endtime_4 = ecs_endtime_3.strftime('%Y-%m-%d')# 计算到期时间与现在时间之差current_time = time.strftime("%Y-%m-%d", time.localtime())current = time.mktime(time.strptime(current_time, '%Y-%m-%d'))ecs_endtime_5 = time.mktime(time.strptime(ecs_endtime_4, '%Y-%m-%d'))count_days = int((ecs_endtime_5 - current) / (24 * 60 * 60))# 距离到期时间小于天数if count_days <= int(expire_days):count = count + 1ecs_remarks = i['InstanceId'], i['InstanceName']ecs_IP_0 = i['VpcAttributes']ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]field = count, list(ecs_remarks)[0], ecs_IP_1, ecs_endtime_3.strftime('%Y年%m月%d日 %H:%M'), list(ecs_remarks)[1]#    print(field)field_information.append(field)title = 'ECS到期时间(%s天内)' % (expire_days)column_name = ["序号", "实例ID", "IP地址", "到期时间", "备注"]html_table = form(column_name=column_name, title=title,field_information=field_information)return html_table# ECS磁盘使用率
def disk_info():request = DescribeMetricTopRequest()request.set_accept_format('json')request.set_Namespace(ecs_namespace)request.set_MetricName(Disk_metricname)request.set_Orderby("Average")request.set_Length(strip_number)response_0 = clt.do_action_with_exception(request)response_1 = str(response_0, encoding='utf-8')return response_1# 列出超出磁盘阈值的ECS信息
def get_disk_Value():field_information = []count = 0Slicing_0 = eval(str(disk_info()))Slicing_1 = Slicing_0["Datapoints"]Slicing_2 = eval(Slicing_1)for Slicing_3 in Slicing_2:if Slicing_3.get("Average") >= float(Disk_use_rate):for ecs_id_0 in get_sys_info():if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:count += 1ecs_remarks = ecs_id_0['InstanceId'], ecs_id_0['InstanceName']ecs_IP_0 = ecs_id_0['VpcAttributes']ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]field = count, Slicing_3.get("instanceId"), ecs_IP_1, Slicing_3.get("mountpoint"), Slicing_3.get("Maximum"), list(ecs_remarks)[1]field_information.append(field)title = 'ECS磁盘使用率大于%s' % (Disk_use_rate)column_name = ["序号", "实例ID", "IP地址", "目录", "使用率(%)", "备注"]html_table = form(column_name=column_name, title=title,field_information=field_information)return html_table# ECS-CPU使用率
def CPU_info():request = DescribeMetricTopRequest()request.set_accept_format('json')request.set_Namespace(ecs_namespace)request.set_MetricName(CPU_metricname)request.set_Orderby("Average")request.set_Length(strip_number)response_0 = clt.do_action_with_exception(request)response_1 = str(response_0, encoding='utf-8')return response_1# 列出超出CPU阈值的ECS信息
def get_CPU_Value():count = 0field_information = []Slicing_0 = eval(str(CPU_info()))Slicing_1 = Slicing_0["Datapoints"]Slicing_2 = eval(Slicing_1)for Slicing_3 in Slicing_2:if Slicing_3.get("Average") >= float(Cpu_user_rate):for ecs_id_0 in get_sys_info():if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:ecs_remarks = ecs_id_0['InstanceId'], ecs_id_0['InstanceName']ecs_IP_0 = ecs_id_0['VpcAttributes']ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]count += 1field = count, Slicing_3.get("instanceId"), ecs_IP_1, Slicing_3.get("Maximum"), list(ecs_remarks)[1]field_information.append(field)title = 'ECS-CPU使用率大于%s' % (Cpu_user_rate)column_name = ["序号", "实例ID", "IP地址", "使用率(%)", "备注"]html_table = form(column_name=column_name, title=title,field_information=field_information)return html_table# ECS内存使用率
def Member_info():request = DescribeMetricTopRequest()request.set_accept_format('json')request.set_Namespace(ecs_namespace)request.set_MetricName(Mem_metricname)request.set_Orderby("Average")request.set_Length(strip_number)response_0 = clt.do_action_with_exception(request)response_1 = str(response_0, encoding='utf-8')return response_1# 列出超出内存阈值的ECS信息
def get_Member_Value():count = 0field_information = []Slicing_0 = eval(str(Member_info()))Slicing_1 = Slicing_0["Datapoints"]Slicing_2 = eval(Slicing_1)for Slicing_3 in Slicing_2:if Slicing_3.get("Average") >= float(Mem_user_rate):for ecs_id_0 in get_sys_info():if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:ecs_remarks = ecs_id_0['InstanceId'], ecs_id_0['InstanceName']ecs_IP_0 = ecs_id_0['VpcAttributes']ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]count += 1field = count, Slicing_3.get("instanceId"), ecs_IP_1, Slicing_3.get("Maximum"), list(ecs_remarks)[1]field_information.append(field)title = 'ECS内存使用率大于%s' % (Mem_user_rate)column_name = ["序号", "实例ID", "IP地址", "使用率(%)", "备注"]html_table = form(column_name=column_name, title=title,field_information=field_information)return html_table# 列表---RDS实例列表
def get_rds_info():request = CommonRequest()request.set_accept_format('json')request.set_domain('rds.aliyuncs.com')request.set_method('POST')request.set_protocol_type('https')  # https | httprequest.set_version('2014-08-15')request.set_action_name('DescribeDBInstances')request.add_query_param('RegionId', "cn-beijing")request.add_query_param('PageSize', strip_number)  # 条数# request.add_query_param('PageNumber', page_number) ###页码response = clt.do_action(request)false = 0rds_list_0 = eval(str(response, encoding='utf-8'))rds_list_1 = rds_list_0["Items"]["DBInstance"]return rds_list_1# 列出RDS到期时间
def rds_endtime():field_information = []count = 0for i in get_rds_info():# 阿里云UTC时间转换成北京时间rds_endtime_0 = i['ExpireTime']rds_endtime_1 = "%Y-%m-%dT%H:%M:%SZ"rds_endtime_2 = datetime.datetime.strptime(rds_endtime_0, rds_endtime_1)rds_endtime_3 = rds_endtime_2 + \datetime.timedelta(hours=8) - datetime.timedelta(seconds=1)rds_endtime_4 = rds_endtime_3.strftime('%Y-%m-%d')# 计算到期时间与现在时间之差current_time = time.strftime("%Y-%m-%d", time.localtime())current = time.mktime(time.strptime(current_time, '%Y-%m-%d'))rds_endtime_5 = time.mktime(time.strptime(rds_endtime_4, '%Y-%m-%d'))count_days = int((rds_endtime_5 - current) / (24 * 60 * 60))# 距离到期时间小于天数if count_days <= int(expire_days):count = count + 1field = count, i["DBInstanceId"], rds_endtime_3.strftime('%Y年%m月%d日 %H:%M'), i["DBInstanceDescription"]field_information.append(field)title = 'RDS到期时间(%s天内)' % (expire_days)column_name = ["序号", "实例ID", "到期时间", "备注"]html_table = form(column_name=column_name, title=title,field_information=field_information)return html_table# 列出RDS磁盘使用率
def rds_disk_info():request = DescribeMetricTopRequest()request.set_accept_format('json')request.set_MetricName("DiskUsage")request.set_Namespace("acs_rds_dashboard")request.set_Orderby("Average")request.set_Length(strip_number)response_0 = clt.do_action_with_exception(request)response_1 = str(response_0, encoding='utf-8')return response_1# 列出RDS超出阀值的资源
def rds_disk_threshold():count = 0field_information = []rds_threshold_0 = eval(rds_disk_info())rds_threshold_1 = eval(rds_threshold_0["Datapoints"])for rds_threshold_3 in rds_threshold_1:if rds_threshold_3["Average"] >= float(Disk_use_rate):for rds_id_0 in get_rds_info():if rds_id_0["DBInstanceId"] == 'rm-2ze3bzdt0ej4za0t6':breakif rds_threshold_3["instanceId"] == rds_id_0["DBInstanceId"]:count += 1field = count, rds_threshold_3["instanceId"], rds_id_0["DBInstanceDescription"], rds_threshold_3["Average"]field_information.append(field)title = 'RDS-磁盘使用率大于70%'column_name = ["序号", "实例ID", "备注", "使用率(%)"]html_table = form(column_name=column_name, title=title,field_information=field_information)return html_table# 列出redis实例列表
def get_redis_info():request = DescribeInstancesRequest2()request.set_accept_format('json')request.set_PageNumber(page_number)  # 页码request.set_PageSize(strip_number)  # 条数response_0 = clt.do_action_with_exception(request)false = true = 0response_1 = eval(str(response_0, encoding='utf-8'))response_2 = response_1["Instances"]["KVStoreInstance"]return response_2# Redis到期时间
def redis_endtime():field_information = []count = 0for i in get_redis_info():# 阿里云UTC时间转换成北京时间# if i.get('UserName') == 'r-2vcik2bo8gzn07yri9':redis_endtime_0 = i['EndTime']redis_endtime_1 = "%Y-%m-%dT%H:%M:%SZ"redis_endtime_2 = datetime.datetime.strptime(redis_endtime_0, redis_endtime_1)redis_endtime_3 = redis_endtime_2 + datetime.timedelta(hours=8)redis_endtime_4 = redis_endtime_3.strftime('%Y-%m-%d')# 计算到期时间与现在时间之差current_time = time.strftime("%Y-%m-%d", time.localtime())current = time.mktime(time.strptime(current_time, '%Y-%m-%d'))redis_endtime_5 = time.mktime(time.strptime(redis_endtime_4, '%Y-%m-%d'))count_days = int((redis_endtime_5 - current) / (24 * 60 * 60))# 距离到期时间小于天数if count_days <= int(expire_days):count = count + 1field = [count, i["InstanceId"], redis_endtime_3.strftime('%Y年%m月%d日 %H:%M'), i["InstanceName"]]field_information.append(field)title = 'Redis到期时间(%s天内)' %(expire_days)column_name = ["序号", "实例ID", "到期时间", "备注"]html_table = form(column_name=column_name, title=title,field_information=field_information)return html_table# 邮件
def send_mail(email_html):msg = MIMEMultipart()msg['Subject'] = Header(subject, 'utf-8')msg['From'] = Header('patrol-alarm@icbf.com.cn', 'utf-8')  # 发送者msg['To'] = Header('运维组', 'utf-8')msg.attach(MIMEText(email_html, 'html', 'utf-8'))smtp = smtplib.SMTP()smtp.connect('smtp.qiye.aliyun.com')smtp.login(username, password)for mailuser in receiver:smtp.sendmail(sender, mailuser, msg.as_string())print("邮件发送成功")smtp.quit()# 执行
if __name__ == '__main__':# 到期时间 ETC_endtime() + redis_endtime() + rds_endtime() + ecs_five_endtime()# 磁盘阀值类: rds_disk_threshold() + get_disk_Value()# CPU&内存类:get_CPU_Value() + get_Member_Value()# print(redis_endtime())html = html_formatting(Aliyun_html=get_disk_Value() +rds_disk_threshold() +rds_endtime() +ecs_five_endtime() +get_CPU_Value() +get_Member_Value() +redis_endtime())send_mail(email_html=html)

效果展示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

X64(64位)汇编指令与机器码转换原理

X64&#xff08;64位&#xff09;汇编指令与机器码转换原理 1 64位寻址形式下的ModR/M字节1.1 寻址方式1.2 寄存器编号 2 汇编指令转机器码2.1 mov rcx, 1122334455667788h2.2 mov rcx,[r8]与mov [r8],rcx2.3 mov rcx,[r8r9*2] 本文属于《 X86指令基础系列教程》之一&#xff…

9.MySQL索引的操作

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 索引操作 查询索引 创建主键索引 唯一索引的创建 普通索引的创建 全文索引的创建 删除索引 索引创建原则 索引操作 查询索引 第一种方法&#xff1a; show keys from 表名\G 我们了解其中几个就好。 第二种方法…

双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响

双目视觉检测的基本原理 利用相机测量宽度时&#xff0c;由于单个相机在成像时存在“近大远小”的现象&#xff0c;并且单靠摄入的图像无法知道被测物的距离&#xff0c;所以由被测物的跳动导致的被测物到工业相机之间距离变化&#xff0c;使测量精度难以提高。 因此测宽仪需…

项目综合实训,vrrp+bfd,以及策略路由的应用

目录 一&#xff0e; 项目需求 二&#xff0e; Visio设备画图 三&#xff0e; 设备选型 三&#xff0e;vlan规划 四&#xff0e;Ip地址规划 五&#xff0e;实验拓扑图 六&#xff0e;配置过程及结果 项目需求 1.S1作为VLAN10的主网关和根桥&#xff0c;S2作为v…

【C语法学习】5 - fputc()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例14.2 示例24.3 示例3 1 函数原型 fputc()&#xff1a;将一个字符发送至指定流stream&#xff0c;函数原型如下&#xff1a; int fputc(int c, FILE *stream);2 参数 fputc()函数有两个参数c和stream&#xff1a; 参数c是待…

Servlet

Servlet是运行在服务端的小型Java程序&#xff0c;是sun公司提供一套规范&#xff0c;用来处理客户端请求&#xff0c;响应给浏览器的动态资源。但servlet的实质就是Java代码&#xff0c;通过Java的API动态的向客户端输出内容&#xff08;HTML&#xff09; 一、使用servlet2.5实…

量化交易Copula建模应对市场低迷

一、简介 传统上,我们依靠相关矩阵来理解资产间的动态。然而,正如过去的市场崩盘所表明的那样,当风暴袭来时,许多模型都会陷入混乱。突然之间,相关性似乎趋于一致,而多样化这一经常被吹捧的风险管理口号似乎并没有提供什么庇护。 这种出乎意料的同步,即资产在经济低迷时…

虹科分享 | 太赫兹成像技术透视分层结构助力文物研究

文章来源&#xff1a;虹科光电Hophotonix 阅读链接&#xff1a;虹科分享 | 太赫兹成像技术透视分层结构助力文物研究 对于时间分辨成像方法来说&#xff0c;分层结构的无创检测具有挑战性&#xff0c;其中分辨率和对比度可能会因层间反射和色散的突出信号衰减而受到影响。在一…

【Java 进阶篇】Java Response 输出字符数据案例

在Java Web开发中&#xff0c;使用HTTP响应对象&#xff08;Response&#xff09;来向客户端发送数据是一项非常重要的任务。本篇博客将详细介绍如何使用Java中的Response对象来输出字符数据&#xff0c;并提供示例代码以帮助读者更好地理解和应用这一概念。不仅将讨论基础知识…

Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

redis过期策略 redis的过期策略可以通过配置文件进行配置 一、定期删除 redis会把设置了过期时间的key放在单独的字典中&#xff0c;定时遍历来删除到期的key。 1&#xff09;.每100ms从过期字典中 随机挑选20个&#xff0c;把其中过期的key删除&#xff1b; 2&#xff09;.…

MS3142电机驱动器可兼容LV8548M

MS3142/MS3142S 是一个双全桥电机驱动。可兼容LV8548M&#xff08;功能基本一致&#xff0c;管脚不兼容&#xff09;。电源电压供电范围 4V 到 18V&#xff0c;平均电流 1.1A&#xff0c;电流峰值 1.54A。如果需要更高的电流能力&#xff0c;可以将双全桥并联使用。 四个输入脚…

11月的『备考学习计划』+高效的作息时间表 超好用~

每日作息时间表 每天有三个时间段学习效率高 上午10点左右 下午4点左右 晚上8点-10点左右 坚持住了&#xff0c;学习效果事半功倍 有同感的同学 可以举举手&#x1f91a;&#xff0c;点点赞&#x1f493; 每日作息时间表 6:30-7:00起床 6:30---7:00是起床的最佳时刻&am…

Spring中Bean的完整生命周期!(Bean实例化的流程,Spring后处理器,循环依赖解释及解决方法)附案例演示

Bean实例化的基本流程 加载xml配置文件&#xff0c;解析获取配置中的每个的信息&#xff0c;封装成一个个的BeanDefinition对象将BeanDefinition存储在一个名为beanDefinitionMap的Map<String,BeanDefinition>中ApplicationContext底层遍历beanDefinitionMap&#xff0c…

虚拟人运营系统介绍丨支持实时互动/直播/短视频创作,赋能元宇宙营销

2023年&#xff0c;以虚拟人为代表的元宇宙营销成为品牌营销黑马。 品牌通过虚拟人IP运营&#xff0c;形成具有一定影响力的品牌效应&#xff0c;围绕“内容持续输出——粉丝沉淀——优质运营——商业变现”的创新模式&#xff0c;打破同质化营销形式&#xff0c;利用虚拟人IP以…

Flask——接口路由技术

接口路由技术 一、Flask 简介1、环境安装&#xff1a;2、一个最小的应用3、两种运行方式 二、定义路由1、普通路由2、动态路由3、限定类型4、地址尾部的“/” 三、请求与响应-请求方法四、请求与响应-处理请求数据1、request的常用属性/方法2、get 请求参数3、json 请求4、表单…

c++实现策略模式

前言 看了一会儿大话设计模式&#xff0c;我感觉平常的话&#xff0c;策略模式还挺常用的&#xff0c;记录一下。个人理解策略模式&#xff0c;就是抽象一个算法&#xff0c;然后你可以有很多不同的实现&#xff0c;这些实现去重写抽象算法的虚方法。然后在一个上下文类中有一…

Java架构师数学与经济管理

目录 1 导学2 最小生成树3 最短路径4 网络与最大流量5 线性规划6 动态规划6.1 伏格尔法7 博弈论7.1 状态转移矩阵7.2 排队论8 决策论8.1 决策树9 数学建模想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学

Vue+element el-date-picker 时间日期选择器设置默认值,选择框不显示问题(已解决)

时间选择器默认值的问题 显示的时候如果用下面的方式赋值将不会显示出来&#xff1a; this.deviceFormData.time[0] that.$filterArray.formatDatehh(start);this.deviceFormData.time[1] that.$filterArray.formatDateEnd(end);实际上是有数据的&#xff0c;但是不会显示出…

libcurl库的网页爬虫程序

示例代码&#xff1a; #include <curl/curl.h> #include <iostream> ​ int main() {CURL *curl;CURLcode res; ​curl_global_init(CURL_GLOBAL_DEFAULT); ​curl curl_easy_init();if(curl) {curl_easy_setopt(curl, CURLOPT_URL, "/");curl_easy_se…

SMTP邮件发送图片-如何在github中存储图片并访问

之前写了一篇文章 Go&#xff1a;实现SMTP邮件发送订阅功能&#xff08;包含163邮箱、163企业邮箱、谷歌gmail邮箱&#xff09;&#xff0c;实现了通过邮箱服务来发送邮件&#xff0c;但都是文字内容&#xff0c;要是想实现邮件发送图片&#xff0c;就需要将图片放到公网可访问…