您的位置:首页 > 编程语言 > Python开发

python接口自动化(三十四)-封装与调用--函数和参数化(详解)

2019-05-13 16:00 781 查看

简介

  前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到。接下来这篇由我带领小伙伴们把每一

个鼠标点击动作写成一个函数,这样更方便维护了,而且可读性也高,后期其他维护人员在维护代码的时候看起来赏心悦目,就不会骂娘了。

  参数化的思维只需记住一点:不要写死,这样就便于维护,否则就会牵一发而动全身,一处修改导致处处修改,不便于维护。

登录函数

1、s 参数是 session 的一个实例类,先放这里,方便写后面代码

2、登录函数传三个参数,s 是需要调用前面的 session 类,所以必传,可以传个登录的 url,然后 payload 是账号和密码

保存草稿

1、编辑内容的标题 title 和正文 body_data 参数化了,这样后面可以方便传不同值

2、这里返回了获取到新的 url 地址,因为后面的 postid 参数需要在这里提取

提取 postid

1、这里用正则表达式提取 url 里面的 postid

删除草稿

1、传个 url 和 postid 就可以了

参考代码

# coding=utf-8
#1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

#2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-5-13
@author: 北京-宏哥
Project:学习和使用封装与调用--函数和参数化
'''
#3.导入模块
import requests

def login(s, url, payload):

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",

"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/json; charset=utf-8",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": "385",
"Cookie": "xxx 已省略",
"Connection": "keep-alive"
}
r = s.post(url, json=payload, headers=headers, verify=False)
result = r.json()
print (result)
return result['success'] # 返回 True 或 False

def save_box(s, url2, title, body_data):
'''# 获取报存之后 url 地址'''
body = {"__VIEWSTATE": "",
"__VIEWSTATEGENERATOR": "FE27D343",
"Editor$Edit$txbTitle": title,
"Editor$Edit$EditorBody": "<p>"+body_data+"</p>",
"Editor$Edit$Advanced$ckbPublished": "on",
"Editor$Edit$Advanced$chkDisplayHomePage": "on",
"Editor$Edit$Advanced$chkComments": "on",
"Editor$Edit$Advanced$chkMainSyndication": "on",
"Editor$Edit$lkbDraft": "存为草稿",
}
r2 = s.post(url2, data=body, verify=False)
print(r2.url)
return r2.url
def get_postid(u):
'''正则提取 postid'''
import re
postid = re.findall(r"postid=(.+?)&", u)
print (postid) # 这里是 list
if len(postid) < 1:
return ''
else:
return postid[0]
def delete_box(s,url3, postid):
'''删除草稿箱'''
json3 = {"postId": postid}
r3 = s.post(url3, json=json3, verify=False)
print (r3.json())
if __name__ == "__main__":
#-------------由于博客园的登录机制改变这部分代码仅作为参考start-------
'''
#登录url
url = "https://passport.cnblogs.com/user/signin"
payload = {
"input1": "xxx",
"input2": "xxx",
"remember": True
}
s = requests.session()
login(s, url, payload)
'''
# -------------由于博客园的登录机制改变这部分代码仅作为参考end-------

#编辑随笔url
url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1"
u = save_box(s, url2, "北京-宏哥学习和使用封装与调用--函数和参数化", "1、学习和使用封装与调用--函数和参数化")
postid = get_postid(u)
# 删除随笔url
url3 = "https://i.cnblogs.com/post/delete"
delete_box(s, url3, postid)

由于博客园的登录机制改变,我们想要让代码跑起来还需要用老办法绕过验证码通过cookie登录替换登录这个动作

改造代码如下

第一步:将登录方法注释掉

第二步:将登录方法所传的参数和调用登录的方法注释掉

第三步:通过cookie登录绕过验证码,实现登录

第五步:直接运行代码,查看结果

 

第六步:由于我们新增又删除,所以看到的界面看到的效果还是不太明显,为了让小伙伴们看到明显效果,我们这里还是通过老方法:打断点

第七步:在调用删除随笔的方法前打断点,双击方法前边出现一个大红点

第八步:debug运行代码,点击右上角的昆虫

第九步:浏览器登录查看随笔页面

postid

第十步:继续运行。执行删除随笔的方法

代码运行结果

第十一步:刷新随笔页面,查看刚刚新增的那条随笔消失了

 改造后参考代码

# coding=utf-8
#1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

#2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-5-13
@author: 北京-宏哥
Project:学习和使用封装与调用--函数和参数化
'''
#3.导入模块
import requests
# # 先打开登录首页,获取部分cookie
# url = "https://passport.cnblogs.com/user/signin"
# # 登录成功后保存编辑内容
# url2= "https://i.cnblogs.com/EditPosts.aspx?opt=1"
# s = requests.session()     #s参数作为全局变量
#-------------由于博客园的登录机制改变这部分代码仅作为参考start-------
'''
def login(s, url, payload):

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",

"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/json; charset=utf-8",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": "385",
"Cookie": "xxx 已省略",
"Connection": "keep-alive"
}
r = s.post(url, json=payload, headers=headers, verify=False)
result = r.json()
print (result)
return result['success'] # 返回 True 或 False
'''
# -------------由于博客园的登录机制改变这部分代码仅作为参考end-------
def save_box(s, url2, title, body_data):
'''# 获取报存之后 url 地址'''
body = {"__VIEWSTATE": "",
"__VIEWSTATEGENERATOR": "FE27D343",
"Editor$Edit$txbTitle": title,
"Editor$Edit$EditorBody": "<p>"+body_data+"</p>",
"Editor$Edit$Advanced$ckbPublished": "on",
"Editor$Edit$Advanced$chkDisplayHomePage": "on",
"Editor$Edit$Advanced$chkComments": "on",
"Editor$Edit$Advanced$chkMainSyndication": "on",
"Editor$Edit$lkbDraft": "存为草稿",
}
r2 = s.post(url2, data=body, verify=False)
print(r2.url)
return r2.url
def get_postid(u):
'''正则提取 postid'''
import re
postid = re.findall(r"postid=(.+?)&", u)
print (postid) # 这里是 list
if len(postid) < 1:
return ''
else:
return postid[0]
def delete_box(s,url3, postid):
'''删除草稿箱'''
json3 = {"postId": postid}
r3 = s.post(url3, json=json3, verify=False)
print (r3.json())
if __name__ == "__main__":
#-------------由于博客园的登录机制改变这部分代码仅作为参考start-------
'''
#登录url
url = "https://passport.cnblogs.com/user/signin"
payload = {
"input1": "xxx",
"input2": "xxx",
"remember": True
}
s = requests.session()
login(s, url, payload)
'''
# -------------由于博客园的登录机制改变这部分代码仅作为参考end-------
url = "https://passport.cnblogs.com/user/signin"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"
}  # get方法其它加个ser-Agent就可以了
s = requests.session()
r = s.get(url, headers=headers, verify=False)
print(s.cookies)
# 添加登录需要的两个cookie
c = requests.cookies.RequestsCookieJar()
c.set('.CNBlogsCookie',
'XXX')  # 填上面抓包内容  具体查看前边的cookie登录,这里不赘述
c.set('.Cnblogs.AspNetCore.Cookies',
'XXX')  # 填上面抓包内容   具体查看前边cookie登录,这里不赘述
c.set('AlwaysCreateItemsAsActive', "True")
c.set('AdminCookieAlwaysExpandAdvanced', "True")
s.cookies.update(c)
print(s.cookies)
result = r.content

#编辑随笔url
url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1"
u = save_box(s, url2, "北京-宏哥学习和使用封装与调用--函数和参数化", "1、学习和使用封装与调用--函数和参数化")
postid = get_postid(u)
# 删除随笔url
url3 = "https://i.cnblogs.com/post/delete"
delete_box(s, url3, postid)

小结

1、封装好处:

第一:重用;

第二:不必关心具体的实现;

第三:面向对象三大特征之一;

第四,具有安全性!

2、哈哈,各位小伙伴们,封装与调用--函数和参数化就是这么简单!!!小编能力有限欢迎各位批评指正。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: