PDA

View Full Version : Antiban Diagnostics Tool



Clarity
05-24-2018, 05:24 PM
Hi all,
Here is a quick and simple tool I wrote today to help get a better sense of mouse behavior during my scripts, and highlight potential problems that could lead to a ban if left unchecked, like forgetting to add waits or click randomness.

The include file adds several information tracking variables and an override to fastClick(), which is used by all or almost all (?) SRL-6 methods that click the mouse. Of course, this can easily be translated to OSRS includes, which I'll get to later. Warnings can be given during the script run, and statistics are reported on script termination.

At this point it's only looking at clicks, but I am updating it with more behavioral analysis stuff when I get the chance, hence the more general title 'Antiban Diagnostics' for now.

Current Features
- Warns if distance between current click and previous click is below diagnostics.distanceWarningLevel (pixels, default 2)
- Warns if time between current click and previous click is below diagnostics.timeWarningLevel (ms, default 200)
- Warns if the script-requested click is out of bounds, and automatically prevents the click from happening unless diagnostics.preventOutOfBounds is set to false (default true)
- Prints a final summary of click statistics when your script terminates, and also prints the entire list of warnings that happened during the run with timestamps
- Visual plot of clicks performed, color coded to match the warnings so that you can actually see where the problems were happening (diagnostics.visuals())

In Progress
- More advanced and helpful distance warning system that incorporates click groupings and trends rather than standalone pairs, so you can see if in the long run your randomness is poor and you are probably getting pattern detected
- Scoring/grading based on performance against pattern detection function (heuristics, neural net)
- OSRS include version

How to Use
- Include the code below in any script (easiest to save to a file in Includes like diagnostics.simba and then add {$i diagnostics.simba} to your script, put this after SRL-6 is included)
- At the start of your script, add diagnostics.init();
- Optionally assign different values to the warning level variables (diagnostics.distanceWarningLevel, diagnostics.timeWarningLevel, diagnostics.preventOutOfBounds)
- Use diagnostics.visuals() for visual plot

Sample debug output of one of my scripts:


[AB Diagnostics] -- Final Report --
[AB Diagnostics] Average time between clicks: 1288ms (Low: 485ms, High: 2703ms)
[AB Diagnostics] Average distance between clicks: 143px (Low: 35px, High: 923px)
[AB Diagnostics] Total Warnings: 0 TIME, 0 OUT OF BOUNDS, 0 DISTANCE
[AB Diagnostics] -- End of Report --


Sample warnings when I forced Simba to do silly things:


[AB Diagnostics] -- Final Report --
[AB Diagnostics] Average time between clicks: 53ms (Low: 15ms, High: 485ms)
[AB Diagnostics] Average distance between clicks: 41px (Low: 1px, High: 1177px)
[AB Diagnostics] Total Warnings: 31 TIME, 0 OUT OF BOUNDS, 6 DISTANCE
[AB Diagnostics] TIME WARNING (1): Time between clicks was 47ms! [@2469ms]
[AB Diagnostics] TIME WARNING (2): Time between clicks was 78ms! [@2703ms]
[AB Diagnostics] TIME WARNING (3): Time between clicks was 31ms! [@2938ms]
[AB Diagnostics] DISTANCE WARNING (1): Script clicked around the same pixel, X = 1099, Y = 397 twice! [@3172ms]
[AB Diagnostics] TIME WARNING (4): Time between clicks was 15ms! [@3172ms]
[AB Diagnostics] TIME WARNING (5): Time between clicks was 47ms! [@3407ms]
[AB Diagnostics] DISTANCE WARNING (2): Script clicked around the same pixel, X = 1097, Y = 400 twice! [@3610ms]
[AB Diagnostics] TIME WARNING (6): Time between clicks was 47ms! [@3625ms]
[AB Diagnostics] TIME WARNING (7): Time between clicks was 15ms! [@3797ms]
[AB Diagnostics] TIME WARNING (8): Time between clicks was 16ms! [@4032ms]
[AB Diagnostics] DISTANCE WARNING (3): Script clicked around the same pixel, X = 1096, Y = 402 twice! [@4203ms]
[AB Diagnostics] TIME WARNING (9): Time between clicks was 15ms! [@4203ms]
[AB Diagnostics] DISTANCE WARNING (4): Script clicked around the same pixel, X = 1097, Y = 402 twice! [@4407ms]
[AB Diagnostics] TIME WARNING (10): Time between clicks was 16ms! [@4407ms]
[AB Diagnostics] TIME WARNING (11): Time between clicks was 31ms! [@4578ms]
[AB Diagnostics] TIME WARNING (12): Time between clicks was 32ms! [@4735ms]
[AB Diagnostics] TIME WARNING (13): Time between clicks was 78ms! [@4875ms]
[AB Diagnostics] TIME WARNING (14): Time between clicks was 47ms! [@5016ms]
[AB Diagnostics] TIME WARNING (15): Time between clicks was 16ms! [@5219ms]
[AB Diagnostics] TIME WARNING (16): Time between clicks was 62ms! [@5500ms]
[AB Diagnostics] TIME WARNING (17): Time between clicks was 62ms! [@5750ms]
[AB Diagnostics] TIME WARNING (18): Time between clicks was 16ms! [@5985ms]
[AB Diagnostics] TIME WARNING (19): Time between clicks was 31ms! [@6078ms]
[AB Diagnostics] TIME WARNING (20): Time between clicks was 31ms! [@6250ms]
[AB Diagnostics] TIME WARNING (21): Time between clicks was 63ms! [@6532ms]
[AB Diagnostics] DISTANCE WARNING (5): Script clicked around the same pixel, X = 1099, Y = 397 twice! [@6782ms]
[AB Diagnostics] TIME WARNING (22): Time between clicks was 32ms! [@6782ms]
[AB Diagnostics] TIME WARNING (23): Time between clicks was 31ms! [@6891ms]
[AB Diagnostics] TIME WARNING (24): Time between clicks was 31ms! [@7047ms]
[AB Diagnostics] DISTANCE WARNING (6): Script clicked around the same pixel, X = 1103, Y = 404 twice! [@7219ms]
[AB Diagnostics] TIME WARNING (25): Time between clicks was 16ms! [@7235ms]
[AB Diagnostics] TIME WARNING (26): Time between clicks was 31ms! [@7594ms]
[AB Diagnostics] TIME WARNING (27): Time between clicks was 16ms! [@7813ms]
[AB Diagnostics] TIME WARNING (28): Time between clicks was 31ms! [@8016ms]
[AB Diagnostics] TIME WARNING (29): Time between clicks was 47ms! [@8172ms]
[AB Diagnostics] TIME WARNING (30): Time between clicks was 63ms! [@8360ms]
[AB Diagnostics] TIME WARNING (31): Time between clicks was 63ms! [@8641ms]
[AB Diagnostics] -- End of Report --


Sample of visual debug (all green crosses indicating no warnings):
https://i.gyazo.com/96c6229633197b9b3a0244d667c42f95.png

Here is the code for the tool (v1.1 - May 28th, 2018):


{Antiban Diagnostics v1.1}
{by Clarity}

const
WARNING_NONE = 0;
WARNING_TIME = 1;
WARNING_DISTANCE = 2;
WARNING_BOUNDS = 3;

type tEvent = record
x, y, clickType, warningType: integer;
timeStamp: uInt64;
end;

type tEventArray = array of tEvent;

type tDiagnostics = record
events: tEventArray;

//Basic Statistics and Warnings
TBCData, distanceData: tIntegerArray;
warnings: tStringArray;
warning: string;
index, TBCLow, TBCHigh, TBCMean, timeWarningLevel, distanceWarningLevel,
warningCountBounds, warningCountTime, warningCountDistance, clientW, clientH,
prevX, prevY, distanceLow, distanceHigh, distanceMean: integer;
TBC: tTimeMarker;
preventOutOfBounds, debugEvents: boolean;
end;

var
diagnostics: tDiagnostics;

procedure tEventArray.append(const evt: tEvent);
begin
insert(evt, self, length(self));
end;

//Mouse Clicks
procedure fastClick(button: integer); override;
var
x, y: integer;
evt: tEvent;
begin
if (button = MOUSE_MOVE) then
exit();

getMousePos(x, y);

//Event Recording for Pattern Recognition
evt.x := x;
evt.y := y;
evt.clickType := button;
evt.timeStamp := getTimeRunning();
evt.warningType := WARNING_NONE;

//Basic Statistics and Warnings
if (x <= 0) or (y <= 0) or (x >= diagnostics.clientW) or (y >= diagnostics.clientH) then
begin
evt.warningType := WARNING_BOUNDS;
inc(diagnostics.warningCountBounds);
diagnostics.warning := '[AB Diagnostics] BOUNDS WARNING (' + toStr(diagnostics.warningCountBounds) + '): Mouse was instructed to click at X = ' + toStr(x) + ', Y = ' + toStr(y) + '! [@' + toStr(getTimeRunning()) + 'ms]';
diagnostics.warnings.append(diagnostics.warning);
writeln(diagnostics.warning);
if diagnostics.preventOutOfBounds then
begin
writeln('[AB Diagnostics] Prevented click from occurring. Check your script!');
diagnostics.events.append(evt);
exit();
end;
end;
setLength(diagnostics.distanceData, length(diagnostics.distanceData) + 1);
setLength(diagnostics.TBCData, length(diagnostics.TBCData) + 1);
diagnostics.distanceData[diagnostics.index] := distance(x, y, diagnostics.prevX, diagnostics.prevY);
if (diagnostics.distanceData[diagnostics.index] <= diagnostics.distanceWarningLevel) then
begin
evt.warningType := WARNING_DISTANCE;
inc(diagnostics.warningCountDistance);
diagnostics.warning := '[AB Diagnostics] DISTANCE WARNING (' + toStr(diagnostics.warningCountDistance) + '): Script clicked around the same pixel, X = ' + toStr(x) + ', Y = ' + toStr(y) + ' twice! [@' + toStr(getTimeRunning()) + 'ms]';
diagnostics.warnings.append(diagnostics.warning);
writeln(diagnostics.warning);
end;
diagnostics.TBCData[diagnostics.index] := diagnostics.TBC.getTime();
if (diagnostics.TBCData[diagnostics.index] <= diagnostics.timeWarningLevel) then
begin
evt.warningType := WARNING_TIME;
inc(diagnostics.warningCountTime);
diagnostics.warning := '[AB Diagnostics] TIME WARNING (' + toStr(diagnostics.warningCountTime) + '): Time between clicks was ' + toStr(diagnostics.TBCData[diagnostics.index]) + 'ms! [@' + toStr(getTimeRunning()) + 'ms]';
diagnostics.warnings.append(diagnostics.warning);
writeln(diagnostics.warning);
end;
inc(diagnostics.index);
diagnostics.prevX := x;
diagnostics.prevY := y;

holdMouse(x, y, button);

wait(randomRange(60, 150));

getMousePos(x, y);
releaseMouse(x, y, button);

diagnostics.TBC.reset();
diagnostics.TBC.start();
diagnostics.events.append(evt);
end;

function tEventArray.toTPA(): tPointArray;
var
i: integer;
begin
setLength(result, length(diagnostics.events));
for i := 0 to high(diagnostics.events) do
result[i] := point(diagnostics.events[i].x, diagnostics.events[i].y);
end;

//Reporting
procedure tDiagnostics.visuals();
var
clusters: t2DPointArray;
tmb: tMufasaBitmap;
i, bmp, warningColor: integer;
begin
bmp := createBitmap(self.clientW, self.clientH);
tmb := getMufasaBitmap(bmp);
for i := 0 to high(events) do
begin
case events[i].warningType of
WARNING_NONE: warningColor := clLime;
WARNING_DISTANCE: warningColor := clOrange;
WARNING_TIME: warningColor := clYellow;
WARNING_BOUNDS: warningColor := clRed;
end;
tmb.drawCross(point(events[i].x, events[i].y), 5, warningColor);
end;
{clusters := clusterTPA(events.toTPA(), 20);
for i := 0 to high(clusters) do
begin
tmb.drawPolygon(clusters[i].getConvexHull(), clWhite);
end;}
//tmb.drawPolygon(events.toTPA().getConvexHull(), clWhite);
tmb.debug();
end;

procedure tDiagnostics.report();
var
i: integer;
begin
self.distanceLow := minA(self.distanceData);
self.distanceHigh := maxA(self.distanceData);
self.distanceMean := averageTIA(self.distanceData);
self.TBCLow := minA(self.TBCData);
self.TBCHigh := maxA(self.TBCData);
self.TBCMean := averageTIA(self.TBCData);
writeln('[AB Diagnostics] -- Final Report --');
writeln('[AB Diagnostics] Average time between clicks: ' + toStr(self.TBCMean) + 'ms (Low: ' + toStr(self.TBCLow) + 'ms, High: ' + toStr(self.TBCHigh) + 'ms)');
writeln('[AB Diagnostics] Average distance between clicks: ' + toStr(self.distanceMean) + 'px (Low: ' + toStr(self.distanceLow) + 'px, High: ' + toStr(self.distanceHigh) + 'px)');
writeln('[AB Diagnostics] Total Warnings: ' + toStr(self.warningCountTime) + ' TIME, ' + toStr(self.warningCountBounds) + ' OUT OF BOUNDS, ' + toStr(self.warningCountDistance) + ' DISTANCE');

for i := 0 to high(self.warnings) do
writeln(self.warnings[i]);
writeln('[AB Diagnostics] -- End of Report --');
if self.debugEvents then
begin
writeln(' ');
for i := 0 to high(events) do
writeln(events[i]);
end;
self.visuals();
end;

//Wrapper
procedure diagnosticsReport();
begin
diagnostics.report();
end;

//Init
procedure tDiagnostics.init();
begin
getClientDimensions(self.clientW, self.clientH);
addOnTerminate('diagnosticsReport');
self.debugEvents := true;
self.timeWarningLevel := 200;
self.distanceWarningLevel := 2;
self.preventOutOfBounds := true;
self.TBC.reset();
self.TBC.start();
end;

Hoodz
05-24-2018, 08:08 PM
AB LEAKING?!
Kasi; Sjoe; The Killer; Benny; Ian;

StickToTheScript
05-24-2018, 08:19 PM
Oh my... This is fantastic! Great work, Clarity!

Wire
05-24-2018, 11:50 PM
I was looking for something like this, nicely done!

P1nky
05-25-2018, 02:27 PM
Creative and a useful tool for scripters. :garfield:

Clarity
05-28-2018, 10:44 PM
AB LEAKING?!
Kasi; Sjoe; The Killer; Benny; Ian;

Lol.


Oh my... This is fantastic! Great work, Clarity!


Creative and a useful tool for scripters. :garfield:


I was looking for something like this, nicely done!

Thanks! Hope it is helpful for ya.

Updated with visual plot option, will debug all click events after script termination, color coded based on warning/no warning. Also changed it to be based on a tDiagnostics type, so things are now diagnostics.report(), etc.

Example of the basic visual debug atm:
https://i.gyazo.com/96c6229633197b9b3a0244d667c42f95.png

Benny
06-09-2018, 07:52 PM
AB LEAKING?!
Kasi; Sjoe; The Killer; Benny; Ian;

Confirmed.

sleiker
09-01-2020, 01:12 PM
cool stuff

saml1991
03-24-2021, 11:07 PM
28753

This is so cool! I really wanted to see everywhere I had clicked in a session, this even colour codes it :)

Although now I have this vast amount of information I have no Idea what to do with it ha.

Attached is 5.5hrs of barb fishing, I did an procedure TMouse.Click(Button: Int32); override; for the mouse click and changed TBC to tstopwatch so it works on OSRS with SRL