公司服务器的验证方式之一是cookie,所以需要将cookie保存,一个是方便在多次请求时的上下文调用,另一个是为了在下次请求时,可以先尝试一下,上次的cookie能否再次使用,若能,则继续使用,若不能,则再次请求生成一个新的cookie,并保存。
登录、获取返回数据和cookie、下一个接口使用此cookie再次调用、获取返回数据,这个流程下来,并没有问题。但是这只是本次程序运行时正常,如果再次运行程序,则又是从登录开始执行,再次获取新的cookie。
于是,自然而然的想到,是否能将cookie保存下来,比如写入存储盘,永久有效,以方便多次运行程序时使用。折腾了半天,搜索了不少信息,先后使用了session保证上下文调用、LWPCookieJar和FileCookieJar类中的save方法和load方法,当然,内置模块的open和write、read方法肯定得要尝试,结果一个都调不通,要么是要求必须是str类型,要么是保存进去的不是我想要的,要么就只能保证本次上下文调用,无法永久储存。
最后还是在一个外国网站上看到了解决方法,下面记录解决步骤,以作备忘笔记(出于公司安全需要,以上代码直接调试是调试不通的)
环境配置:win7,Python2.7,request模块
第一步,登录获取cookie
r = requests.post(url='https://admin.miutrip.com/Account_1/CheckLogin/miutrip.api',
data={"customerNumber":"hkg1337","Uid":"15111111111","Pwd":"123456","rememberUid":1},
cert=('../SSL/server.cer','../SSL/server.key')
)
登录接口没有头验证和cookie验证,并不是所有目标网站的接口都是这样,所以需要注意
第二步,将cookie保存进cookies文件
with open('../cookies','w') as f:
pickle.dump(utils.dict_from_cookiejar(r.cookies), f)
为了这一步,真是费尽心思。
with中的那一行代码,其实做了两件事,第一件是将RequestsCookieJar类对象转换成了dict格式,然后写入文件。
这里保存完成后,进入cookies文件中看保存的内容,格式是出乎我们意料的,如果不仔细看,还以为看不懂,见下图:
保存进文件的cookie这上面的字段和值,都是cookie里的(信息经过了加密,为安全起见,进行了二次隐藏)。
这么个奇怪的格式,能用吗?我很好奇!不过不管怎样,得先把这个奇怪的东西从文件里弄出来赋值给变量啊,于是就有了下一步
第三步,从cookies中读入内容
def get_cookie():
with open('../cookies','r') as f:
cookies = utils.cookiejar_from_dict(pickle.load(f))
同样,with中的那行代码,同样做了两件事,先是用load读出了内容,然后将dict内容转换成RequestsCookieJar类对象格式,除此之外,还把RequestsCookieJar类对象,赋给了cookies这个变量
OK,目前都还比较顺利,那么,终极一步来了,这也是最初的目的
第四步,调用cookie执行请求
先来看看调用了格式不对的cookie时,结果返回如下:
{"Code":80000,"Data":"../../../Login.aspx"}
正常调用格式:
r_orderlist = requests.post(url='https://admin.miutrip.com/Flight_0_1/Order/GetFltOfflineOrders/miutrip.api',
data={"PageIndex":"1",
"PageSize":"10",
"OrderStatus":"5",
"ApprovalStatus":"0",
"CreateFrom":"2017-02-11",
"CreateTo":"2017-03-13",
"IsAbnormalOrder":"false",
"GetApproveOrder":"0",
"IfSearchUnNormalOrder":"0",
"UserRightFlag":"100111111",
"tdShow":"true",
"UserType":"1"},
cert=('../SSL/server.cer','../SSL/server.key'),
cookies = get_cookie()
)
调用了通过前面三步取出来的cookie,那么结果就正常了,与后台数据相比,完全一致。
大功告成!
最后想说的是,这个网站确实很不错,之前也有不少其他代码方面的问题,都是在这个网站上找到答案的!
参考网站:http://stackoverflow.com/questions/13030095/how-to-save-requests-python-cookies-to-a-file
网友评论