Run it
Copy the script and paste it into your executor.
()
Options = {
SaveLogs = ,
MaxEntries = ,
PreviewLimit = ,
StartPaused = ,
Follow = ,
HookDirect = ,
BlockedURLs = {},
}
user = ({ ... })[]
(user) ==
k, v (user) Options[k] = v
VERSION =
GAME =
genv = ( ())
(genv.HttpSpy) == (genv.HttpSpy.Unload) ==
(genv.HttpSpy.Unload)
cloneref = cloneref (x) x
newcc = (f) f
setclip = setclipboard toclipboard ((Clipboard) == Clipboard.set)
Players = (GAME:())
UIS = (GAME:())
CoreGui = (GAME:())
State = {
enabled = Options.StartPaused,
unloaded = ,
follow = Options.Follow == ,
filter = ,
}
Blocked, BlockPatterns, ResponseHooks, Proxies = {}, {}, {}, {}
k, v (Options.BlockedURLs {})
(k) == Blocked[v] = Blocked[k] = v
busy = ({}, { __mode = })
Conns = {}
OnRequest = .()
(n)
s = (.(n))
out = .(.(.(s), , ))
.(out, , ) == out = .(out, )
out
(dt)
dt < .(, .(dt * + ))
.(, dt)
(s, n)
s = (s)
#s > n .(s, , n) ..
s
(t, seen)
(t) ~= t
seen = seen {}
seen[t] seen[t]
c = {}
seen[t] = c
k, v (t) c[(k, seen)] = (v, seen)
c
(v, indent, seen)
indent = indent
seen = seen {}
tv = (v)
tv == .(, v)
tv ~= (v)
seen[v]
seen[v] =
keys = {}
k (v) keys[#keys + ] = k
.(keys, (a, b) (a) < (b) )
#keys == seen[v] =
inner = indent ..
parts = {}
_, k (keys)
ks = ((k) == .(k, )) k
( .. (k, inner, seen) .. )
parts[#parts + ] = inner .. ks .. .. (v[k], inner, seen)
seen[v] =
.. .(parts, ) .. .. indent ..
(url)
Blocked[url]
_, p (BlockPatterns)
.(url, p, , )
(fn, ...)
th = .()
was = busy[th]
busy[th] =
res = .((fn, ...))
busy[th] = was
res
(data)
(() OnRequest:(data) )
logName
Options.SaveLogs writefile appendfile
logName = .(, GAME.PlaceId, .())
(writefile, logName, .. VERSION .. .. .() .. )
rgb = .fromRGB
C = {
bg = (, , ),
panel = (, , ),
panel2 = (, , ),
stroke = (, , ),
strokeHi = (, , ),
text = (, , ),
dim = (, , ),
faint = (, , ),
accent = (, , ),
green = (, , ),
red = (, , ),
}
BADGE = {
GET = (, , ),
POST = (, , ),
PUT = (, , ),
PATCH = (, , ),
DELETE = (, , ),
OBJ = (, , ),
WS = (, , ),
INFO = (, , ),
}
(class, props, kids)
o = .(class)
k, v (props {})
k ~= o[k] = v
_, c (kids {}) c.Parent = o
props props.Parent o.Parent = props.Parent
o
(r) (, { CornerRadius = .(, r) })
(col) (, { Color = col, Thickness = , ApplyStrokeMode = .ApplyStrokeMode.Border })
(t, r, b, l)
(, {
PaddingTop = .(, t), PaddingRight = .(, r),
PaddingBottom = .(, b), PaddingLeft = .(, l),
})
(props, kids)
st = (C.stroke)
base = {
AutoButtonColor = , BackgroundColor3 = C.panel2, BorderSizePixel = ,
Font = .Font.GothamMedium, TextSize = , TextColor3 = C.text,
}
k, v (props) base[k] = v
all = { (), st }
_, k (kids {}) all[#all + ] = k
b = (, base, all)
b.MouseEnter:(() st.Color = C.strokeHi )
b.MouseLeave:(() st.Color = C.stroke )
b
(btn, text, idleColor)
label = btn:() btn.Text
btn:(, label)
ok = setclip ~= (setclip, text)
btn.Text = ok
btn.TextColor3 = ok C.green C.red
.(, ()
btn.Parent
btn.Text = label
btn.TextColor3 = idleColor C.dim
)
Gui = (, {
Name = .. (.(, )),
ResetOnSpawn = ,
ZIndexBehavior = .ZIndexBehavior.Sibling,
DisplayOrder = ,
})
() == .protect_gui (.protect_gui, Gui)
(() Gui.Parent = (gethui ()) CoreGui )
Gui.Parent = Players.LocalPlayer:()
Main = (, {
Size = .(, ),
Position = .(, -, , -),
BackgroundColor3 = C.bg,
BorderSizePixel = ,
Parent = Gui,
}, { (), (C.stroke) })
TitleBar = (, {
Size = .(, , , ),
BackgroundColor3 = C.panel,
BorderSizePixel = ,
Parent = Main,
}, {
(),
(, {
Size = .(, , , ), Position = .(, , , -),
BackgroundColor3 = C.panel, BorderSizePixel = ,
}),
})
(, {
Size = .(, , , ), Position = .(, ),
BackgroundTransparency = , Text = , TextColor3 = C.text,
Font = .Font.GothamBold, TextSize = , TextXAlignment = .TextXAlignment.Left,
Parent = TitleBar,
})
(, {
Size = .(, , , ), Position = .(, ),
BackgroundTransparency = , Text = VERSION, TextColor3 = C.faint,
Font = .Font.Gotham, TextSize = , TextXAlignment = .TextXAlignment.Left,
Parent = TitleBar,
})
TitleButtons = (, {
AnchorPoint = .(, ), Position = .(, -, , ),
Size = .(, ), AutomaticSize = .AutomaticSize.X,
BackgroundTransparency = , Parent = TitleBar,
}, {
(, {
FillDirection = .FillDirection.Horizontal, Padding = .(, ),
HorizontalAlignment = .HorizontalAlignment.Right,
VerticalAlignment = .VerticalAlignment.Center,
SortOrder = .SortOrder.LayoutOrder,
}),
})
StatusBtn = ({ Size = .(, ), TextSize = , Font = .Font.GothamBold, LayoutOrder = , Parent = TitleButtons })
MinBtn = ({ Size = .(, ), Text = , TextSize = , LayoutOrder = , Parent = TitleButtons })
CloseBtn = ({ Size = .(, ), Text = , TextSize = , TextColor3 = C.red, LayoutOrder = , Parent = TitleButtons })
Toolbar = (, {
Position = .(, ), Size = .(, , , ),
BackgroundTransparency = , Parent = Main,
})
FilterBox = (, {
Position = .(, , , -), Size = .(, -, , ),
BackgroundColor3 = C.panel, BorderSizePixel = , ClearTextOnFocus = ,
PlaceholderText = , PlaceholderColor3 = C.faint,
Text = , TextColor3 = C.text, Font = .Font.Gotham, TextSize = ,
TextXAlignment = .TextXAlignment.Left, ClipsDescendants = , Parent = Toolbar,
}, { (), (C.stroke), (, , , ) })
FollowBtn = ({ Position = .(, -, , -), Size = .(, ), TextColor3 = C.dim, Parent = Toolbar })
ClearBtn = ({ Position = .(, -, , -), Size = .(, ), Text = , TextColor3 = C.dim, Parent = Toolbar })
CountLabel = (, {
Position = .(, -, , -), Size = .(, ),
BackgroundTransparency = , Text = , TextColor3 = C.faint,
Font = .Font.Gotham, TextSize = , TextXAlignment = .TextXAlignment.Right,
Parent = Toolbar,
})
LIST_PAD =
Logs = (, {
Position = .(, ), Size = .(, -, , -),
BackgroundTransparency = , BorderSizePixel = ,
CanvasSize = .(), AutomaticCanvasSize = .AutomaticSize.None,
ScrollingDirection = .ScrollingDirection.Y, ScrollBarThickness = ,
ScrollBarImageColor3 = C.strokeHi, VerticalScrollBarInset = .ScrollBarInset.ScrollBar,
Parent = Main,
}, { (, , , ) })
Layout = (, { Padding = .(, LIST_PAD), SortOrder = .SortOrder.LayoutOrder, Parent = Logs })
EmptyLabel = (, {
Position = .(, ), Size = .(, -, , -),
BackgroundTransparency = , Text = , TextColor3 = C.faint,
Font = .Font.Gotham, TextSize = , Parent = Main,
})
NewPill = ({
AnchorPoint = .(, ), Position = .(, , , -),
Size = .(, ), AutomaticSize = .AutomaticSize.X,
BackgroundColor3 = C.accent, TextColor3 = (, , ), Font = .Font.GothamBold,
TextSize = , Visible = , ZIndex = , Parent = Main,
}, { (, , , ) })
Grip = (, {
AnchorPoint = .(, ), Position = .(, -, , -), Size = .(, ),
BackgroundTransparency = , Text = , AutoButtonColor = , ZIndex = , Parent = Main,
}, {
(, {
AnchorPoint = .(, ), Position = .(, -, , -), Size = .(, ),
BackgroundColor3 = C.faint, BorderSizePixel = , ZIndex = ,
}, { () }),
})
Icon = ({
Size = .(, ), Position = .(, -, , ),
BackgroundColor3 = C.panel, Text = , TextSize = , Font = .Font.GothamBold,
Visible = , ZIndex = , Parent = Gui,
})
(input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch
(input)
input.UserInputType == .UserInputType.MouseMovement input.UserInputType == .UserInputType.Touch
(handle, target, onClick)
dragging, moved, startInput, startPos = , , ,
handle.InputBegan:((input)
(input)
dragging, moved = ,
startInput, startPos = input.Position, target.Position
con
con = input.Changed:(()
input.UserInputState == .UserInputState.End
con:()
dragging =
moved onClick ()
)
)
Conns[#Conns + ] = UIS.InputChanged:((input)
dragging (input)
d = input.Position - startInput
moved d.Magnitude <
moved =
target.Position = .(startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y)
)
(TitleBar, Main)
resizing, startInput, startSize = , ,
Grip.InputBegan:((input)
(input)
resizing, startInput, startSize = , input.Position, Main.AbsoluteSize
con
con = input.Changed:(()
input.UserInputState == .UserInputState.End
con:()
resizing =
)
)
Conns[#Conns + ] = UIS.InputChanged:((input)
resizing (input)
d = input.Position - startInput
Main.Size = .(.(, startSize.X + d.X), .(, startSize.Y + d.Y))
)
Records = {}
newBelow =
wantBottomAt =
()
.(, Logs.CanvasSize.Y.Offset - Logs.AbsoluteWindowSize.Y)
()
Logs.CanvasPosition.Y >= () -
()
Logs.CanvasPosition = .(, ())
()
() newBelow =
NewPill.Visible = newBelow >
NewPill.Text = newBelow ..
()
State.follow () wantBottomAt = .()
Layout:():(()
Logs.CanvasSize = .(, Layout.AbsoluteContentSize.Y + )
wantBottomAt .() - wantBottomAt < ()
wantBottomAt =
()
)
Logs:():(refreshPill)
NewPill.MouseButton1Click:(()
newBelow =
()
()
)
(rec)
State.filter == .(rec.search, State.filter, , ) ~=
()
visible =
_, r (Records)
r.frame r.frame.Visible visible +=
CountLabel.Text = State.filter ~= (visible .. .. #Records) (#Records .. (#Records == ))
EmptyLabel.Visible = visible ==
EmptyLabel.Text = #Records ==
()
#Records > Options.MaxEntries
old = .(Records, )
old.frame
h = old.frame.Visible (old.frame.AbsoluteSize.Y + LIST_PAD)
old.frame:()
old.frame =
h > wantBottomAt
Logs.CanvasPosition = .(, .(, Logs.CanvasPosition.Y - h))
(rec)
p = {}
rec.statusCode
msg = ((rec.statusMsg) == rec.statusMsg ~= ) ( .. rec.statusMsg)
p[#p + ] = .. (rec.statusCode) .. msg
rec.state ==
p[#p + ] =
rec.state ==
p[#p + ] =
rec.state ==
p[#p + ] = .. (rec.err , )
rec.count
p[#p + ] = .. (rec.count) .. (rec.count == )
rec.body
p[#p + ] = #rec.body == ( .. (#rec.body) .. )
rec.note
p[#p + ] = rec.note
rec.sent p[#p + ] = .. (#rec.sent) ..
rec.dt (rec.state == rec.state == ) p[#p + ] = (rec.dt)
.(p, )
(rec)
logName
(appendfile, logName, .(, rec.time, rec.badge, rec.source, rec.url, (rec)))
(text, order, parent)
({
Size = .(, ), AutomaticSize = .AutomaticSize.X,
Text = text, TextSize = , TextColor3 = C.dim, LayoutOrder = order, Parent = parent,
}, { (, , , ) })
(rec)
State.unloaded
wasBottom = ()
col = BADGE[rec.badge] BADGE.INFO
isSys = rec.badge ==
frame = (, {
Size = .(, , , ), AutomaticSize = .AutomaticSize.Y,
BackgroundColor3 = C.panel, BorderSizePixel = , LayoutOrder = rec.id,
}, {
(),
(, , , ),
(, { SortOrder = .SortOrder.LayoutOrder, Padding = .(, ) }),
})
frameStroke = (C.stroke)
frameStroke.Parent = frame
header = (, { Size = .(, , , ), BackgroundTransparency = , LayoutOrder = , Parent = frame })
left = (, { Size = .(, , , ), BackgroundTransparency = , Parent = header }, {
(, {
FillDirection = .FillDirection.Horizontal, Padding = .(, ),
VerticalAlignment = .VerticalAlignment.Center, SortOrder = .SortOrder.LayoutOrder,
}),
})
(, {
Size = .(, ), AutomaticSize = .AutomaticSize.X,
BackgroundColor3 = col, BackgroundTransparency = , Text = rec.badge, TextColor3 = col,
Font = .Font.GothamBold, TextSize = , LayoutOrder = , Parent = left,
}, { (), (, , , ) })
(, {
Size = .(, ), AutomaticSize = .AutomaticSize.X, BackgroundTransparency = ,
Text = rec.time .. (rec.source ~= ( .. rec.source) ), TextColor3 = C.faint,
Font = .Font.Gotham, TextSize = , LayoutOrder = , Parent = left,
})
btns = (, {
AnchorPoint = .(, ), Position = .(, , , ),
Size = .(, , , ), AutomaticSize = .AutomaticSize.X,
BackgroundTransparency = , Parent = header,
}, {
(, {
FillDirection = .FillDirection.Horizontal, Padding = .(, ),
HorizontalAlignment = .HorizontalAlignment.Right, SortOrder = .SortOrder.LayoutOrder,
}),
})
respBtn
isSys
btns.Visible =
urlBtn = (, , btns)
urlBtn.MouseButton1Click:(() (urlBtn, rec.url) )
rec.request
reqBtn = (, , btns)
reqBtn.MouseButton1Click:(() (reqBtn, (rec.request)) )
respBtn = (, , btns)
respBtn.TextColor3 = C.text
respBtn.Visible =
respBtn.MouseButton1Click:(()
(respBtn, rec.body rec.copyText , C.text)
)
(, {
Size = .(, , , ), AutomaticSize = .AutomaticSize.Y, BackgroundTransparency = ,
Text = (rec.url, ), TextColor3 = isSys C.dim C.text, TextWrapped = ,
Font = isSys .Font.Gotham .Font.RobotoMono, TextSize = ,
TextXAlignment = .TextXAlignment.Left, TextYAlignment = .TextYAlignment.Top,
LayoutOrder = , Parent = frame,
})
info = (, {
Size = .(, , , ), AutomaticSize = .AutomaticSize.Y, BackgroundTransparency = ,
Text = , TextColor3 = C.dim, TextWrapped = , Font = .Font.GothamMedium, TextSize = ,
TextXAlignment = .TextXAlignment.Left, LayoutOrder = , Parent = frame,
})
preview = (, {
Size = .(, , , ), AutomaticSize = .AutomaticSize.Y,
BackgroundColor3 = C.bg, BorderSizePixel = , Visible = , LayoutOrder = , Parent = frame,
}, { (), (, , , ) })
previewText = (, {
Size = .(, , , ), AutomaticSize = .AutomaticSize.Y, BackgroundTransparency = ,
Text = , TextColor3 = (, , ), TextWrapped = , Font = .Font.RobotoMono,
TextSize = , TextXAlignment = .TextXAlignment.Left, TextYAlignment = .TextYAlignment.Top,
Parent = preview,
})
rec.refresh = ()
rec.frame rec.frame.Parent
()
text = (rec)
info.Text = text
info.Visible = text ~=
bad = rec.state == rec.state ==
info.TextColor3 = bad C.red (rec.state == C.faint C.dim)
frameStroke.Color = bad (, , ) C.stroke
body = rec.body
show = (body) == #body > #body <= Options.PreviewLimit
preview.Visible = show
show previewText.Text = body
respBtn
copyable = ((body) == #body > ) (rec.copyText #rec.copyText > )
respBtn.Visible = copyable
rec.frame = frame
frame.Visible = (rec)
rec.()
frame.Parent = Logs
Records[#Records + ] = rec
frame.Visible
State.follow wasBottom
wantBottomAt = .()
newBelow +=
()
()
Seq =
(badge, source, url)
Seq +=
rec = {
id = Seq, badge = badge, source = source, url = url ,
t0 = .(), time = .(), state = ,
}
rec.search = .(badge .. .. source .. .. rec.url)
.(buildEntry, rec)
rec
(rec, fields)
k, v (fields) rec[k] = v
rec.dt = .() - rec.t0
rec.refresh .(rec.refresh)
(rec)
(text)
rec = (, , text)
(rec, { state = })
()
StatusBtn.Text = State.enabled
StatusBtn.TextColor3 = State.enabled C.green C.red
StatusBtn.BackgroundColor3 = State.enabled (, , ) (, , )
Icon.TextColor3 = State.enabled C.text C.red
()
FollowBtn.Text = State.follow
FollowBtn.TextColor3 = State.follow C.text C.dim
FollowBtn.BackgroundColor3 = State.follow (, , ) C.panel2
(v)
State.enabled = v
()
()
_, r (Records)
r.frame r.frame:() r.frame =
.(Records)
newBelow =
Logs.CanvasPosition = .zero
()
()
StatusBtn.MouseButton1Click:(() ( State.enabled) )
FollowBtn.MouseButton1Click:(()
State.follow = State.follow
()
State.follow ()
)
ClearBtn.MouseButton1Click:(clearLogs)
FilterBox:():(()
State.filter = .(FilterBox.Text)
_, r (Records)
r.frame r.frame.Visible = (r)
newBelow =
()
()
)
MinBtn.MouseButton1Click:(()
Main.Visible =
Icon.Visible =
)
(Icon, Icon, ()
Icon.Visible =
Main.Visible =
)
()
()
WATCH = {
HttpGet = , HttpGetAsync = ,
HttpPost = , HttpPostAsync = ,
GetObjects = ,
}
HookedSet = {}
(target, fn)
iscclosure (target) fn
(fn)
(method, invoke, ...)
kind = WATCH[method]
url = ((...))
source = .. method
(url)
State.enabled ((kind, source, url), { state = })
kind == {}
State.enabled (...)
rec = (kind, source, url)
kind ==
data, ctype = (, ...)
data ~= rec.sent = (data)
rec.request = { Url = url, Data = data, ContentType = ctype }
res = (invoke, ...)
res[]
(rec, { state = , err = (res[]) })
(res[], )
out = res[]
kind ==
names = {}
(out) ==
i, o (out)
names[i] = (o) == (o.ClassName .. .. o.Name) (o)
(rec, { state = , count = #names, copyText = .(names, ) })
(rec, { state = , body = out == (out) })
.(fireOnRequest, { Url = url, Method = method })
.(res, , res.n)
(old, req)
State.unloaded (req) ~= busy[.()]
(req)
url = (req.Url)
method = .((req.Method ))
snapshot = (req)
(url)
State.enabled
r = (method, , url)
r.request = snapshot
(r, { state = })
{ Success = , StatusCode = , StatusMessage = , Headers = {}, Body = }
send = req
host = .(url, )
host Proxies[host]
send = {}
k, v (req) send[k] = v
s, e = .(url, host, , )
send.Url = .(url, , s - ) .. Proxies[host] .. .(url, e + )
rec
State.enabled
rec = (method, , url)
rec.request = snapshot
(req.Body) == #req.Body > rec.sent = req.Body
.(fireOnRequest, snapshot)
res = (old, send)
res[]
rec (rec, { state = , err = (res[]) })
(res[], )
response = res[]
hook = ResponseHooks[url]
hook
ok, r = (hook, response)
ok r ~= response = r
rec
f = { state = }
(response) ==
f.statusCode = response.StatusCode
f.statusMsg = response.StatusMessage
f.body = response.Body == (response.Body)
f.body = (response)
(rec, f)
response
installed = {}
oldNamecall
hookFn = ((self, ...)
State.unloaded (self, GAME)
method = ()
WATCH[method] busy[.()]
(method, (...)
setnamecallmethod (method)
(self, ...)
, ...)
(self, ...)
)
ok = (()
oldNamecall = (GAME, , hookFn)
mt = (GAME)
oldNamecall = mt.__namecall
(mt, ) make_writeable (mt)
mt.__namecall = hookFn
(mt, )
)
installed[#installed + ] = ok
Options.HookDirect
n =
method (WATCH)
ok, fn = (() GAME[method] )
ok (fn) == HookedSet[fn]
HookedSet[fn] =
old
hooked = (()
old = (fn, (fn, (self, ...)
State.unloaded (self, GAME) busy[.()]
(self, ...)
(method, (...) (self, ...) , ...)
))
)
hooked n +=
installed[#installed + ] = .. n
candidates = {
() == .request ,
() == .request ,
,
,
(fluxus) == fluxus.request ,
}
n =
i = ,
fn = candidates[i]
(fn) == HookedSet[fn]
HookedSet[fn] =
old
hooked = (()
old = (fn, (fn, (req)
(old, req)
))
)
hooked n +=
installed[#installed + ] = .. n
wsCandidates = {
{ (WebSocket) == WebSocket.connect , },
{ () == (.websocket) == .websocket.connect , },
}
w =
_, c (wsCandidates)
fn, label = c[], c[]
(fn) == HookedSet[fn]
HookedSet[fn] =
old
hooked = (()
old = (fn, (fn, (...)
State.unloaded State.enabled busy[.()]
(...)
url = ((...))
(url)
((, label, url), { state = })
(, )
rec = (, label, url)
res = (old, ...)
res[]
(rec, { state = , err = (res[]) })
(res[], )
(rec, { state = , note = })
.(res, , res.n)
))
)
hooked w +=
installed[#installed + ] = .. w
installed[#installed + ] =
( .. VERSION .. .. .(installed, )
.. (logName ( .. logName) ))
API = { Version = VERSION, OnRequest = OnRequest.Event }
()
State.unloaded
State.unloaded =
_, c (Conns) (() c:() )
(() Gui:() )
(() OnRequest:() )
genv.HttpSpy == API genv.HttpSpy =
CloseBtn.MouseButton1Click:(Unload)
API.() ()
API:(v) (v)
API:() State.enabled
API:() ()
API:(url) Blocked[url] =
API:(url) Blocked[url] =
API:(text) BlockPatterns[#BlockPatterns + ] = text
API:(url, fn) ResponseHooks[url] = fn
API:(url) ResponseHooks[url] =
API:(host, proxy) Proxies[host] = proxy
API:(host) Proxies[host] =
API:(visible) Gui.Enabled = visible
API:(pos) Main.Position = pos
API:(size) Main.Size = size
API.HookSynRequest = API.HookRequest
API.UnHookSynRequest = API.UnhookRequest
API.WhitelistUrl = API.UnblockUrl
genv.HttpSpy = API
APIHttpspy using hookfunction
Never paste your .ROBLOSECURITY cookie anywhere, and use an alt account with scripts.

Universal