requests库和应用 (从ctf-- 速度 要快说起)

版权声明:版权所有……啊重点是我简直找不到第二个人写比我还多的吐槽-。- https://blog.csdn.net/StrongerIrene/article/details/83821088

我发现了,原来脚本还真的就是爬虫。那么我们来学习一下吧。。。
https://www.cnblogs.com/Albert-Lee/p/6230337.html
没什么好的教程。。
首先,认识request库。(网络请求库)
导入了requests之后 r=requests.get('...) 网址
print (r.text)
还可以继续传参数。
post就是提交表单数据,填写一堆输入框提交的。啊。
还有什么head头部这个那个,都可以搞到。(具体再看
那么,post你拿到的flag,然后客户端拿到之后就给你返回一个key。
======区分一下:
encode  你就想成enable  进行了编码,比如‘hello I‘m xxx’搞成了一堆瞎几把玩意儿
然后decode就是destory  把原来的密文给DIDIDIDI破解了
import  base64就是有base64的b64decode来解码~~
【关键:】附上小姐姐的代码(可能在本文最后)
r.request.session() 
request是获取信息--通过用户提交的表单,查询字符串,cookie等获得信息
session是服务端用来保存一些数据(通常是标记状态的,当然也可以保存别的)
session是服务端的记录变量,可以跟踪记录访问者动作,比如登录,退出等。 

r.request.headers         -返回request请求的头部信息
感觉,headers['flag']emmmm
split() 方法用于把一个字符串分割成字符串数组。
split有两个参数:分别是字符串/正则(从哪里开始分割啦)最大长度,就是1啦
过程都理解,但是自己还肯定写不出来的。
=============继续学习requests库:
r.text为服务器响应内容
经典的方法当然是写一个payload然后服务器穿进去咯:长这个样子
payload={'key1': value1.......
r=requests.get("http:///.........",params=payload)【记得要写网址呀!!】
或者直接就是:
r.request.get("http://.....)
print r.text (Requests可以自动对大多数unicode字符集无缝解码。
对于非文本请求r.content,Requests会自动解码gzip和deflate传输编码的响应内容。 
-------??JSON响应内容
Requests内置一个JSON解码器,使用方法如下:
r = requests.get("http://httpbin.org/get")
print(r.json())
如果JSON解码失败,r.json()会抛出一个异常。需要注意的是,成功调用r.json()并不意味着响应成功,因为某些服务器会在失败的响应中包含一个JSON对象,这种JSON会被解码返回。如果要判断请求是否成功,我们可以使用r.raise_for_status()或者检查r.status_code是否和预期相同。 
---------------------
请求头+响应头
(1)定制请求头:...?似乎不太常用
写法呢就是: (学习一下,大致都是这个套路吧qaq)规范一点的话冒号后面要多一个空格。
headers={'user-agent': 'my-app/0.0.1'}
r=request.get("http.....", headers=headers)
定制 header 的优先级低于某些特定的信息源(就是有些时候它就变得没用了-。-)
(我啥时候才能拥有过目不忘的本领啊=。=
(2)相应 状态码:
r=request.get('http://httpbin.org/get')
print r.status_code
# r.status_code == requests.codes.ok(200)
异常:r.raise_for_status()
(响应头)
r = requests.get('http://httpbin.org/get')
print(r.headers)  
 (这里呢就把你get到的全部的header都print出来了。。发现滴答清单加了井号会坏掉-。-
当然我们也可以:
print r.headers['connection'']
【这里!就是这么用的。】
【而且不区分大小写。。。】然后connection呢就是那个keep-alive
可以看出该服务器响应头为Python字典形式,但是这个字典比较特殊:它是仅为HTTP头部而生的,是大小写不敏感的。我们可以以任意大小写形式来访问响应头字段,由上面的例子也可以看出。
先这样吧QAQ

============唔,写了一下,感觉很乱。
post的话没有那个方法。
【还是先按照小姐姐的来吧。。。。。】
。。。?我写的那个,说:“我都说了让你快点。。。“
看起来应该是某个地方错了”
=================
日后可以在对比一下,明明上面的看起来挺对的,一起跑的时候只有下面的可以跑出来。 完全不熟练。。!!!
#coding:utf-8  [不加这一行就出错。。。
import requests

# post请求。 (无参/有参 填写提交)
# r=requests.post("https://www.luogu.org/problemnew/show/P1140")
# ---------------------------先继续题目吧

import base64

f=requests.session()
url = ' http://123.206.87.240:8002/web6/'
r = requests.get(url)
# print r.text

headers = base64.b64decode(r.headers['flag'])
print headers
flag = headers.split(": ")[1]
print flag
flag = base64.b64decode(flag)
print flag
data = {'margin': flag}
print f.post(url,data).text


# 似乎session才能post啊,所以才这么写了……


r=requests.session()
headers = r.get(url).headers
mid = base64.b64decode(headers['flag'])
print mid
#mid = mid.decode()   # 先转换成str类型的用于split
flag = base64.b64decode(mid.split(':')[1])
print flag
data = {'margin': flag}
print r.post(url, data).text

--------------------

=========切片=====
错误1:
TypeError: cannot concatenate 'str' and 'int' objects
使用bytes函数:num本来是数字,要转化成字符串。
num=bytes(num)
【感觉是函数/方法 啊啊啊所以直接用圆的括号好了!!!
错误2:
str.index这里要用() 不能用[]
(3)
开始的地方:beg=img_str.index('"')+1
index返回值是一个数字,不用怕的~~~
如果又别的,那么指定一个开始的地方就好了(str , begin,end)等于find() 但是不存在的时候会抛出异常……
结束的地方: 
bb = img_str.index('"',img_str.index('"')+1)
最后是str[beg+1:bb]这样的
(一定要+!。。把自己先搞没了)
那么最后的最后就是:(进行切片)
img_str='memo4"memo6 "memo9  '
bb = img_str.index('"',img_str.index('"')+1)
print img_str[img_str.index('"')+1: bb]
(注意各个用法)记得是str.index['"'}+1
===================
 

猜你喜欢

转载自blog.csdn.net/StrongerIrene/article/details/83821088