pei_blog

导航

 

一、笔记大纲

 

 

二、作业讲解

1、三个作业通用模块,数据库链接以及数据库操作

(1)数据库连接基本信息:创建在一个单独的python文件中,方便修改调用

mysql_info={
"host":"xxx.xx.xxx.xx",
"user":"jxz",
"password":"123456",
"port":3306,
"autocommit":True,
"charset":"utf8"
}

(2)操作数据库以及执行语句,密码加密等操作,进行定义

import pymysql,hashlib
import config
def op_mysql(sql:str,all=True,data_type=1):
# 建立链接
connect=pymysql.connect(**config.mysql_info)
#建立游标 data_type ==1 为字符串类型 其他为字典
if data_type==1:
cursor=connect.cursor()
else:
cursor=connect.cursor(pymysql.cursors.DictCursor)
# 执行语句
cursor.execute(sql)
result=None
if sql.strip().lower().startswith("select"):
if all:
result=cursor.fetchall()
else:
result=cursor.fetchone()
cursor.close()
connect.close()
return result
# 对密码进行md5加密
def md5_pwd(s,salt=""):
s=str(s)
pwd="%s%s"%(s,salt)
md5_pwd=hashlib.md5(pwd.encode())
return md5_pwd.hexdigest()
# 创建数据库
def create_user_table():
sql="create table if not exists lxp_user (id int pramiry key auto_increment,username varchar(15) not null unqiue," \
"password varchar(30) not null,error_count int default 0);"
op_mysql(sql)

1、登录

步骤分解:

(1)检验用户名密码的数据正确性

import tools
import string
#校验账号密码的数据格式
def check_data(username,password):
if not username or not password:
print("用户名或者密码不能为空")
elif len(username)<5 or len(username)>10:
print("用户名长度需要在5-10之间")
elif len(password) not in range(6,13):
print("密码长度需要在6-12之间")
elif not(set(password) &set(string.digits)) or not (set(password) & set(string.ascii_lowercase)) or not\
(set(password) &set(string.ascii_uppercase)):
print("密码复杂度不正确")
else:
return True

(2)校验数据库数据

def check_db(username,password):
user_info_sql="select * from lxp2 where username='%s'"%username
user_info=tools.op_mysql(user_info_sql,all=False,data_type=2)
if not user_info:
print("用户名不存在")
elif user_info.get("err_count")>4:
print("错误次数过多")
elif user_info.get("password") != tools.md5_pwd(password):
print("密码错误")
update_error_sql="update lxp2 set err_count=err_count+1 where username='%s'"%username
tools.op_mysql(update_error_sql)
else:
print("登录成功")
return True

(3)执行登录

def main():
for i in range(3):
username=input("username:").strip().lower()
passwword=input("password:").strip()
if not check_data(username,passwword):
continue
if check_db(username,passwword):
break
else:
print("错误次过多")
if __name__=="__main__":
main()

2、注册

(1)前端校验数据

import tools
import login
#校验账号密码的数据格式 直接使用登录的数据校验+密码和确认密码一致性校验
def check_data(username,password,cpassword):
if login.check_data(username,password) and password==cpassword:
return True

(2)链接数据库校验数据

def check_db(username,password):
user_info_sql="select * from lxp2 where username='%s'"%username
user_info=tools.op_mysql(user_info_sql,all=False,data_type=2)
if user_info:
print("用户名已存在")
return
else:
md5_password=tools.md5_pwd(password)
create_user_sql="insert into lxp2(username,password) values('%s','%s');"%(username,md5_password)
tools.op_mysql(create_user_sql)
print("注册成功")
return True

(3)执行注册

def main():
for i in range(3):
username=input("username:").strip().lower()
password=input("password:").strip()
cpassword=input("cpassword:").strip()
if not check_data(username,password,cpassword):
continue
if check_db(username,password):
break
else:
print("错误次过多")
if __name__=="__main__":
main()

3、导出数据库

(1)获取表头

# 判断以及获取表头函数
def get_table_title(table_name):
#
table_col_info="select column_name from information_schema.COLUMNS where table_name ='%s';"%table_name

table_file=tools.op_mysql(table_col_info)
title=[table[0] for table in table_file]
return title

(2)写入execl

def write_execl(data,execl_name):

book=xlwt.Workbook()
sheet=book.add_sheet("sheet1")
for row, row_data in enumerate(data):
for col, col_data in enumerate(row_data):
# print(col_data)
sheet.write(row, col,col_data)
book.save(execl_name)

(3)执行函数

def main(table_name):
title=get_table_title(table_name)
if not title:
print("表不存在")
query_data_sql="select * from %s;" % table_name
# query_data_sql = "select * from %s;" % table_name
result=list(tools.op_mysql(query_data_sql))
result.insert(0,title)
execl_name="%s_%s.xls"%(time.strftime('%Y%m%d%H%M%S'),table_name)
write_execl(result,execl_name)

if __name__ =="__main__":
main('lxp2')

三、redis操作

1、redis连接

import  redis
r=redis.Redis(host="xxx.xx.x.xxx",password="HK139bc&*",port=6379,db=4,decode_responses=True) # decode_responses=True将btye 转化为字符串

2、字符串格式操作

(1)新增:set 三个参数意义:key,value,失效时间

新增修改 第三个参数为失效时间
r.set("lxp_session","lixingpei",60

(2)获取:get(key)

print(r.get("lxp_session")

(3)删除:delete

r.delete("lxp_session")

3、哈希格式操作(大字典):不能打小key设置过期时间,只能对整体设置过期时间

(1)新增一条:hset

r.hset("test","lxp",'{"id":"1","score":"90"}')

(2)插入多条:hmset

d={"lxp02":"{'id':'2','name':'lxp2','sex':'女'}","lxp03":"{'id':'3','name':'lxp3','sex':'女'}"}
r.hmset("students",d) # 直接插入多条数据

(3)获取一条:hget

 print(r.hget("students","lxp1")) # 获取 大key,小key

(4)获取多条:hgetall

 print(r.hgetall("students")) # 获取所有数据

(5)删除一条:hdel

r.hdel("students","lxp1") # 删除单个

(6)删除多条:delete

r.delete("students") # 删除所有

(7)判断小key是否存在:hexists、

 print(r.hexists("students","lxp") )

(8)byte类型转化为字符串类型

第一种方法:

创建连接时写入:

decode_responses=True将btye 转化为字符串

第二种方法:decode

lxp=r.hget("students","lxp2")
print(lxp.decode()) # 转化为字符串

4、list操作

(1)新增:lpussh,rpush

 r.lpush("blacks_list1","1") # 从左边添加
 r.rpush("blacks_list1","4") # 从右侧添加

(2)获取:lrange:从0开始 顾头顾尾,没有反方向取值

 print(r.lrange("blacks_list1",0,1))

 

(3)删除:左侧删除,右侧删除 删除除指定位置外的元素,按照指定次数删除指定元素

左侧删除:r.lpop("blacks_list1") # 从左侧删除
右侧删除:r.rpop("blacks_list1") # 从右侧删除
删除除指定位置外的元素:
 print(r.ltrim("blacks_list1",0,0))  #除了第一个全部删除

依照指定次数删除指定元素:
 print(r.lrem("blacks_list1",1,"hhh"))

(4)修改,指定位置:lset

 r.lset("blacks_list1",0,"hhh")

(5)获取长度:llen

print(r.llen("blacks_list1")) # 获取长度

5、通用方法

(1)获取失效时间:ttl()

获取失效时间  -1 代表永久生效 除非是重启服务
print(r.ttl("lxp_session"))

(2)获取当前数据库中所有的key:keys()

print(r.keys()) # 获取当前数据库中的所有key
print(r.keys("*_*")) # 获取可以加条件

(3)判断key是否存在:exists()

 print(r.exists("lxp_session")) # 判断是否存在 返回0代表不存在 1代表存在

(4)查看key的类型:type()

print(r.type("lxp_session")) # 查看key的类型

(5)设置过期时间:expire()

r.expire("lxp_session",60) # 设置过期时间 前面为key 后面为过期时间 单位为秒

(6)清空所有数据库

r.flushall()# 清空所有数据库

(7)清空当前数据库

r.flushdb()# 清空当前数据库

5、redis练习:数据迁移:

import redis
r=redis.Redis(host="xxx.xx.xx.xx",password="HK139bc&*",port=6379,db=4,decode_responses=True)
r2=redis.Redis(host="xxx.xx.xxx.xx",password="HK139bc&*",port=6379,db=11,decode_responses=True)
for k in r.keys():
k_type=r.type(k)
if k_type=="string":
value=r.get(k)
r2.set(k,value)
elif k_type=="hash":
dic=r.hgetall(k)
r2.hmset(k,dic)
elif k_type=="list":
l_len=r.llen(k)
result=r.lrange(k,0,l_len)
r2.rpush(k,*result)

四、execl操作

1、xlrd:读取内容

读取内容原理:引入--实例化 --获取sheet页--读取

xlrt和xlwd读写超过65536会报错

(1)引入,实例化

import xlrd
book=xlrd.open_workbook("test.xls")

(2)获取sheet页

通过名字获取

sheet=book.sheet_by_name("sheet1") 通过名字

通过索引获取:

sheet=book.sheet_by_index(0) # 通过索引

(3)获取内容:

某个单元格内容:

print(sheet.cell(0,0).value)# 获取某一个单元格

获取整行数据

print(sheet.row_values(0))# 获取整行数据

获取整列数据

print(sheet.col_values(0))# 获取列数据

获取总共有多少行

print(sheet.nrows)# 总共多少行

获取总共有多少列

print(sheet.ncols)#总共多少列

获取所有的sheet

book.sheets()

2、xlutils:修改:

读取--复制 -修改--保存

import xlrd
from xlutils import copy
book=xlrd.open_workbook("test.xls")
new_book=copy.copy(book)
sheet=new_book.get_sheet(0)
print(dir(sheet))
sheet.write(0,0,"编号")
new_book.save("test.xls")

3、多行修改:openpyxl

引入--实例化:

import openpyxl
book=openpyxl.load_workbook("test2.xlsx")

获取sheet:

sheet=book["test1"]

获取所有sheet页

print(book.sheetnames)  

获取所有行

print(list(sheet.rows) )

获取有多少行

print(sheet.max_row)

获取有多少列

 print(sheet.max_column)

修改

 sheet.cell(1,1).value="编号"
print(sheet.cell(1, 1).value)
print(sheet["A1"].value) # a是第一列 1 代表第一行 如果是第二列 就是b
print(sheet["A2"].value)
sheet["A1"]="编号"
book.save("test2.xlsx")

五、网络请求

模块:requests

1.get请求

import  requests
url = "http://.xxxx.cn/api/user/stu_info"
data={"stu_name":"小黑"}
req=requests.get(url,data)
print(req.json())

2、post请求之k-v格式

url1="http://xxx.xxxx.cn/api/user/login"
data1={"username":"xxxx","passwd":"aA123456"}
data2={"version":1}
#(1)k-v格式  data=data
req=requests.post(url1,params=data2,data=data1) params 从url里面发出 不是必填的
print(req.json())

3、json格式 json=data

url="http://xxx.xxx.cn/api/user/add_stu"
data={
"grade":"飞马座",
"phone":"13555338909",
"name":"hhh"
}
req=requests.post(url,json=data)
print(req.url)
print(req.json())

4、需要上传cookie: cookies=cookie

(1)直接传cookie

url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
data={
'gc': 117545216,
'st': "0",
'end': "20",
'sort': 0,
'bkn': "1748190229"
}
cookie={'_qpsvr_localtk': '0.9708018590285696',
'uin': 'o1164019076', 'skey': '@21AFqIqD7',
'RK': 'h6RBy2WqQM', 'ptcz': '20a23ea6b2deb099287624b4e452bb0a9419dc427617d8344aa79fae1417d6eb',
'p_uin': 'o1164019076', 'pt4_token': 'CmdQpCaCkY4OjNWktzbggxGQhO*FxtHJyqADQG3Gjag_',
'p_skey': 'nJY4KF-Dr2OFb*2dtAwiNjtW-AJ6Z48ADb6q4ccdQys_',
'traceid': '4b3d0e4d8f'}
req=requests.post(url,data,cookies=cookie)

(2)通过header :header={cookie:""}

header={"cookie": "_qpsvr_localtk=0.9708018590285696; uin=o1164019076; skey=@21AFqIqD7; RK=h6RBy2WqQM; ptcz=20a23ea6b2deb099287624b4e452bb0a9419dc427617d8344aa79fae1417d6eb; p_uin=o1164019076; pt4_token=CmdQpCaCkY4OjNWktzbggxGQhO*FxtHJyqADQG3Gjag_; p_skey=nJY4KF-Dr2OFb*2dtAwiNjtW-AJ6Z48ADb6q4ccdQys_; traceid=4b3d0e4d8f"}
# req=requests.post(url,data,headers=header)

 

5、下载

url = "http://xxx.xxxx.cn/api/file/file_upload"
data={"file":open('test2.xlsx','rb')} # rb模式打开
req=requests.post(url,files=data)

6、上传

url="http://aliimg.changba.com/cache/photo/941190975_200_200.jpg"
req=requests.get(url)
with open("a1.jpg","wb") as fw:
fw.write(req.content)

7、获取结果的几种方式

(1)返回字典

print(req.json()) # 返回字典 ,如果接口返回的不是json 会报错  {'error_code': 2, 'msg': '无结果'}

(2)返回字符串

print(req.text) # 返回字符串

(3)返回byte

print(req.content) # 返回的是bytes

(4)返回状态码

print(req.status_code) # 返回状态码

(5)返回cookie

print(req.cookies) # 返回cookie

(6)返回请求头

print(req.headers) #返回请求头

8、练习题:获取好友信息写入到execl里面

import random
import requests,xlwt,random
url="https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list"
data={
"bkn": 1909363893
}
header={"cookie":"RK=h6RBy2WqQM; ptcz=20a23ea6b2deb099287624b4e452bb0a9419dc427617d8344aa79fae1417d6eb; traceid=0fb7afcc55; _qpsvr_localtk=0.2848722380254445; uin=o1164019076; skey=@I6eUauRAn; p_uin=o1164019076; pt4_token=ku6gK4fgK2rykkL*PZu3eL1iVt00GaqGrqsT-*FmwRI_; p_skey=0BTxgerNa54TvnxoSO5uMEsRt6lUFkNFbbBzGZzMJqE_"}
req=requests.post(url,data,headers=header)
print(req.json())
result=req.json().get("result")
book=xlwt.Workbook()
for index,g_info in result.items():

g_name=g_info.get("gname") if g_info.get("gname") else "默认分组"
# print(g_name)
g_mems=g_info.get("mems") # [{'name': 'HR-郭乐', 'uin': 16388200}, {'name': '李晓慧', 'uin': 541965125}]
try:
sheet = book.add_sheet(g_name)
except Exception as e:
sheet_name="好友分组%s"%random.randint(1.1000)
print("sheet页名字不合法")
sheet=book.add_sheet(sheet_name)
# print("当前分组是===============%s"%g_name)
for col,mems in enumerate(g_mems):
print(col)
nick=mems.get("name")
qq=mems.get('uin')
sheet.write(col, 0, nick)
sheet.write(col, 1, qq)
book.save("qq.xls")

六、异常处理

1、指定异常

(1)主键异常:KeyError

l=[1,2,3]
d={"name":"111"}
# print(l[4])
try:
name=d["n1ame"]
# l[4]
#https://www.cnblogs.com/small-wei/p/13468363.html 所有异常查找

except KeyError as e: #错误类型 如果写了只能捕捉指定异常
print(e)
print("主键异常")

(2)索引异常:IndexError 

import  traceback # 自带模块
l=[1,2,3]
d={"name":"111"}
# print(l[4])
try:
# name=d["n1ame"]
l[4]
#https://www.cnblogs.com/small-wei/p/13468363.html 所有异常查找


except IndexError as e:
print(e)
print("下标异常")

2、所有异常:Exception 

finally:不管有没有异常都会执行

except Exception as e:
traceback.print_exc()
# 获取保存信息 可以放在日志里面
msg=traceback.format_exc()
print(msg)
# print("出现异常了")
# 可以不写
else:
print("无异常")
finally:
print("不管出没出异常都会走")

3、异常打印:traceback模块:

traceback.print_exc()
# 获取保存信息 可以放在日志里面
msg=traceback.format_exc()
print(msg)

七、发送邮件

1、qq邮件:

配置获取:在邮箱设置--账户下面开启POP3/SMTP服务

发送格式:

import yamail
username="517882144@qq.com"
password="xxxxxxxxxxx"
host="smtp.qq.com"
smtp=yamail.SMTP(host=host,user=username,password=password)
smtp.send(
to=["1164019076@qq.com"],
# cc=["517882144@qq.com"],
subject=["摘要"],
contents=["内容"],
attachments=["qq151.xls"]

)

2、钉钉邮件

(1)关键字

步骤:添加自定义机器人:webbook为url:

参数查找网址:https://developers.dingtalk.com/document/app/message-types-and-data-format,查找消息类型与数据格式

发送消息:

import requests
url="https://oapi.dingtalk.com/robot/send?access_token=fed61e1ccbbf1c0ce5688360debc31f38f4e6691d035bf8b8e4068bb3f001a0b"
data={
"msgtype": "text",
"text": {
"content": "1,lalall"
}
}
req=requests.post(url,json=data)
print(req.json())

艾特某些人:

data={
"msgtype": "text",
"text": {
"content": "test,11111"
},
"at":{

"atMobiles":["13224245499"],
"isAtAll":False
}
}

艾特所有人:

data={
"msgtype": "text",
"text": {
"content": "test,11111"
},
"at":{

# "atMobiles":["13224245499"],
# "isAtAll":False
"isAtAll":True
}

(2)加签

机器人自定义选择加签:

找到官方文档

import time
import hmac
import hashlib
import base64
import urllib.parse
def dd_sign():

timestamp = str(round(time.time() * 1000))
secret = 'SECd804f4f67e86268c02aab9e0bbaa4fb9c38332d3fedb52f9d6d603a7c6b13bf7'
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))
return timestamp,sign
def send_dd_msg(msg,at=None,at_all=True):
url = "https://oapi.dingtalk.com/robot/send"
data={
"msgtype": "text",
"text": {
"content": msg
},
"at":{

"atMobiles":at,
"isAtAll":at_all
}
}

timestamp,sign=dd_sign()
params={
'access_token':"c832d0431e985fc899d0b36998afbc46a7d3545f21edc487e3770e0edcd0b881",
"sign":sign,
"timestamp":timestamp

}
try:

req = requests.post(url, json=data,params=params)
except:
print("钉钉消息发送失败")
else:
if req.json().get("errcode") ==0:
print("发送成功")
return True

# send_dd_msg("快上班了")
send_dd_msg("买山竹",at=["1355678909"],at_all=False)

 

posted on 2021-06-16 17:21  pei_blog  阅读(231)  评论(0)    收藏  举报