148 lines
3.8 KiB
Python
148 lines
3.8 KiB
Python
import re
|
|
import uuid
|
|
import random
|
|
import os
|
|
import sys
|
|
import requests
|
|
import json
|
|
import pickle
|
|
|
|
methods = {
|
|
'POST': requests.post,
|
|
'GET': requests.get,
|
|
'PUT': requests.put,
|
|
'PATCH': requests.patch
|
|
}
|
|
|
|
headers = {}
|
|
|
|
def string_to_header(s):
|
|
key, value = s.split(": ")
|
|
headers[key] = value.strip()
|
|
|
|
def read_default_headers(default_headers_file):
|
|
if os.path.isfile(default_headers_file):
|
|
with open(default_headers_file, 'r') as file:
|
|
headers.update(json.load(file))
|
|
|
|
def save_cookies(requests_cookiejar, filename):
|
|
if os.path.exists(filename):
|
|
with open(filename, 'rb') as f:
|
|
try:
|
|
existing_cookies = pickle.load(f)
|
|
except EOFError:
|
|
existing_cookies = requests_cookiejar
|
|
else:
|
|
existing_cookies = requests_cookiejar
|
|
|
|
for cookie in requests_cookiejar:
|
|
existing_cookies.set_cookie(cookie)
|
|
|
|
with open(filename, 'wb') as f:
|
|
pickle.dump(existing_cookies, f)
|
|
|
|
def load_cookies(filename):
|
|
try:
|
|
with open(filename, 'rb') as f:
|
|
return pickle.load(f)
|
|
except FileNotFoundError:
|
|
return None
|
|
|
|
def set_vars(_body):
|
|
def set_to_dict(body):
|
|
for key, value in body.items():
|
|
if isinstance(value, str):
|
|
value = value.replace('{{hex}}', uuid.uuid4().hex)
|
|
value = value.replace('{{uuid}}', str(uuid.uuid4()))
|
|
|
|
pattern = r'\{\{uuid\[(\d+)\]\}\}'
|
|
def replace_uuid_slice(match):
|
|
slice = int(match.group(1))
|
|
return uuid.uuid4().hex[:slice]
|
|
value = re.sub(pattern, replace_uuid_slice, value)
|
|
|
|
body[key] = str(value)
|
|
|
|
if isinstance(value, dict):
|
|
set_vars(value)
|
|
|
|
if type(_body) is dict:
|
|
set_to_dict(_body)
|
|
elif type(_body) is list:
|
|
for i in _body:
|
|
set_to_dict(i)
|
|
return _body
|
|
|
|
def send_req(method, url, body_txt):
|
|
func = methods[method]
|
|
cookie = load_cookies(session_path)
|
|
|
|
body = json.loads(body_txt) if '{' in body_txt else {}
|
|
body = set_vars(body)
|
|
|
|
if method == 'GET':
|
|
resp = func(url, headers=headers, params=body, cookies=cookie)
|
|
else:
|
|
resp = func(url, headers=headers, json=body, cookies=cookie)
|
|
|
|
print(f"// status_code {'':<18} {resp.status_code}")
|
|
|
|
for header_name, header_value in resp.headers.items():
|
|
print(f"// {header_name:<30} {header_value}")
|
|
try:
|
|
resp_content = resp.json()
|
|
print(json.dumps(resp_content, indent=2))
|
|
except ValueError:
|
|
print(resp.content)
|
|
|
|
save_cookies(resp.cookies, session_path)
|
|
|
|
|
|
if len(sys.argv) != 3:
|
|
print("Usage: python script.py <file_path> <project_path>")
|
|
sys.exit(1)
|
|
|
|
file_path = sys.argv[1]
|
|
project_path = sys.argv[2]
|
|
|
|
session_path = os.path.join(project_path, 'pysession')
|
|
default_headers = os.path.join(project_path, 'headers.json')
|
|
|
|
url = ''
|
|
body_txt = ""
|
|
_body_start = False
|
|
|
|
try:
|
|
with open(file_path) as file:
|
|
lines = file.readlines()
|
|
url = lines[0]
|
|
|
|
for line in lines[1:]:
|
|
line = line.strip()
|
|
if not line:
|
|
continue
|
|
if (_body_start or ('{' in line or '[' in line)) and not line.startswith('#'):
|
|
_body_start = True
|
|
body_txt += line
|
|
elif line.startswith('#'):
|
|
break
|
|
elif line:
|
|
string_to_header(line.strip())
|
|
|
|
method, url = url.strip('\n').split(' ')
|
|
except Exception as e:
|
|
print('got error when read body/headrs')
|
|
print(e)
|
|
|
|
try:
|
|
read_default_headers(default_headers)
|
|
except Exception as e:
|
|
print('got error when read default headrs')
|
|
print(e)
|
|
|
|
try:
|
|
send_req(method, url, body_txt)
|
|
except Exception as e:
|
|
print('got error when send request')
|
|
print(e)
|