还有10天就要开始中科大ctf了,对于小白的我,焦虑又刺激,话不多说,如果你和我一样都是小白,那我们麻溜的开始requests吧
上一次写爬虫用到了requests模块几个简单的函数,今天继续学习
我先学了学HTTP的基础
然后开始学requests
这里是requests官方文档网址
本地测试先搭建好服务端的环境
//这些是客户端向服务器发送的数据
<?php
echo 'HEADER: ';
print_r(apache_request_headers());
echo 'GET: ';
print_r($_GET);
echo 'POST: ';
print_r($_POST);
echo 'FILES: ';
print_r($_FILES)
?>
客户端代码测试一下
import requests
from requests import *
payload = {'key1': 'value1', 'key2': 'value2'}
# params相当于/?key1=value1&key2=value2
r = requests.get('http://127.0.0.1/experiment/requests/', params=payload)
# data是post数据
# r = requests.post('http://127.0.0.1/experiment/requests/', data=payload)
print(r.url) #url
print(r.text) #相应内容
返回结果
好的完美,我们可以进行接下来的学习了
import requests
from requests import *
import json
payload = {'key1': 'value1', 'key2': 'value2'}
headers={'user-agent':'hello_gay'}
# ***************** GET *********************
r = requests.get('http://127.0.0.1/experiment/requests/', params=payload,headers=headers)
# 1.params相当于/?key1=value1&key2=value2
# 2.headers是设置请求头
# 3.json=payload自动把payload转换成json格式
# 或者使用json.dumps(payload)编码json.loads(json)解码然后用params传送
# 4.cookies={'cookies_are': 'working'}设置cookie
# 5.allow_redirects=False禁用重定向
# 6.timeout=0.001超时后停止等待响应
# *************** POST ***********************
# files={'file':open('1.png','rb')}
files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} #字符串作为文件发送
r = requests.post('http://127.0.0.1/experiment/requests/', data=payload,files=files)
# 1.data是post数据
# 2.files=files上传文件
r = requests.post('http://127.0.0.1/experiment/requests/?key1=value', data=payload)
# 同时发送post和get请求
# ************** 返回信息输出 ******************
r.encoding='utf-8'; #设置编码
print(r) #获得响应状态码
print(r.content) # 字节形式显示内容: b'HEADER: Array\n......'
# print(r.json()) #json解码
print(r.url) #如果有重定向输出重定向之后的地址
# print(r.history) #许重定向时用
print(r.headers) #响应头,服务器向客户端响应的数据
print(r.text) #响应内容
print(r.raw.read()) #原始套接字相应(原始字节流),requests时需设置stream=True
# with open('raw.txt', 'wb') as fd: #存储流式传输的内容视频,音频等
# for chunk in r.iter_content(): #iter_content自动解码gzip,deflate等
# fd.write(chunk)
往下学之前需要先了解一些http其他更深入一些的东西,否则会有点看不懂哦
HTTP头详解
HTTP头字段类型
POST常见的数据格式
稍稍总结一下特殊的
客户端发送 | 服务器响应 |
---|---|
Accept,Accept-Charset | Content-Type |
Accept-Language | Content-Language |
User-Agent | Server |
import requests
from requests import *
payload = {'key1': 'value1', 'key2': 'value2'}
headers={'user-agent':'hello_gay'}
proxies={'http':'http://127.0.0.1','https':'https://127.0.0.1'}
# proxies = {'http': 'http://user:pass@127.0.0.1'} #base认证
# ************** session **************
# 当你要给一个主机发送多个请求的时候使用Session保存会话
s = requests.Session()
# session设置默认发送数据
# s.auth={'user':'pass'}
# s = requests.get('http://127.0.0.1/experiment/requests/', params=payload,headers=headers,proxies=proxies)
# {'user-agent':'hello_gay'}和{'user':'pass'}都将被发送
# 方法级参数不会在请求中保留,例如在requests.get(url,cookies={'cookie','aaa'})
# ****************** 预处理 *********************
req=requests.Request('POST','http://127.0.0.1/experiment/requests/',data=payload,headers=headers)
pre=req.prepare()
# pre.body='this is a prepared body' #相当于发送的data=payload部分
del pre.headers['Content-Type']
pre.headers['Keep-Dead'] = 'parrot'
r=s.send(pre,stream=True,timeout=0.1,proxies=proxies)
print(r.text)
#服务器返回headers
print(r.headers)
#发送请求headers
print(r.request.headers)
print(r.request.body)
ctf几个例题
讲解在这个网站里面有几个ctf的例题
1.速度要快
解题代码
import requests
import base64
url = 'http://123.206.87.240:8002/web6/'
r = requests.session()
# 题目中每次发送请求都会重新设置cookie,所以应当使用同一个会话
pre = r.get(url)
flag64 = pre.headers['flag']
flag1 = base64.b64decode(flag64)
flag2 = flag1.decode()[15:]
# flag1.decode(): 跑的还不错,给你flag吧: NjE4NTE3
flag3 = base64.b64decode(flag2)
# flag2: ODI2MjY1
flag = flag3.decode()
# flag3.decode(): 551057
res = r.post(url, data={'margin': flag})
print(res.text)
2.秋名山老司机
import requests
from bs4 import BeautifulSoup
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.session()
#和上一个一样也是同一个session
r = s.get(url)
beauty = BeautifulSoup(r.text)
cal = beauty.find_all('div')[0].string[:-3]
res = eval(cal)
flag = s.post(url, data={'value': res})
print(flag.text)
3.快速口算
import requests
import re
url = 'http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
s = requests.session()
r = s.get(url)
cal = re.search("[0-9+*()]+[)]", r.text).group()
flag=s.post(url,data={'v':eval(cal)})
print(flag.text)
import requests
import re
for i in range(0,30):
url='http://123.206.87.240:8002/web11/index.php?line='+str(i)+'&filename=aW5kZXgucGhw'
r=requests.get(url)
print (r.text)
url = 'http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy5waHA='
r = requests.get(url,cookies={'margin':'margin'})
print(r.text)
其他的问题
json和python中字典的区别和联系