💣️Ce programme n'est pas optimisé du tout et ne suit pas vraiment les bonnes pratiques.
xdotool -v
# Sortie :
# xdotool version 3.20160805.1
<?php
/**
* Moves the cursor in case the user does not use it during inactivity time.
*
*/
$defaultInactivityTime = 240;
$inactivityTime = $defaultInactivityTime; // Time in SECONDES in wich the user is considered as inactive.
function isUserMove()
{
$mouseLocation = getMouseLocation();
if ($mouseLocation['x'] > 1) {
return true;
}
return false;
}
/**
* Move the cursor in the screen.
*/
function simulateMouseMove()
{
for ($i = 1; $i < 800; $i++) {
// Stop the process if the user moves the cursor
if ($i > 5) {
if (isUserMove()) {
return false;
}
}
system('xdotool mousemove 1 '.$i);
}
for ($i = 800; $i > 1; $i--) {
system('xdotool mousemove 1 '.$i);
// Stop the process if the user moves the cursor
if ($i > 5) {
$mouseLocation = getMouseLocation();
if (isUserMove()) {
return false;
}
}
}
return true;
}
function getMouseLocation()
{
$mouseLocation = exec('xdotool getmouselocation 2>&1 | sed -rn \'${s/x:([0-9]+) y:([0-9]+) .*/\1 \2/p}\'');
$mouseCoordonates = explode(' ', $mouseLocation);
if (count($mouseCoordonates) === 2) {
return ['x' => $mouseCoordonates[0], 'y' => $mouseCoordonates[1]];
}
return null;
}
function echoState($message, $currentMouseLocation, $color = 'normal')
{
$redColor = "\033[33m";
$normalColor = "\033[0m";
// echo "\ec";
if ($color == 'red') {
$currentColor = $redColor;
$currentModeMessage= '/!\ SECURITY MODE /!\ ';
} else {
if (isUserMove()) {
$currentColor = $normalColor;
$currentModeMessage= '';
} else {
$currentColor = $redColor;
$currentModeMessage= '/!\ SECURITY MODE /!\ ';
}
}
echo sprintf("%s[%s]{x=%s,y=%s} %s%s".PHP_EOL,
$currentColor,
date('Y-m-d H:i:s'),
str_pad($currentMouseLocation['x'], 4, " " , STR_PAD_LEFT),
str_pad($currentMouseLocation['y'], 4, " " , STR_PAD_LEFT),
$currentModeMessage,
$message
);
}
$lastState = [
'time' => time(),
'mouse_location' => null,
];
$simulationIsActive = false;
while(true) {
$currentMouseLocation = getMouseLocation();
if (!is_null($currentMouseLocation)) {
if (!is_null($lastState['time']) && !is_null($lastState['mouse_location'])) {
// Detects if the mouse is moved since the last mouvement.
if (($lastState['mouse_location']['x'] === $currentMouseLocation['x']) &&
($lastState['mouse_location']['y'] === $currentMouseLocation['y'])
) {
// Detects if the current user is inactive.
$diffTimeSinceLastMouvement = time() - $lastState['time'];
$timeLeftBeforeSimulating = $inactivityTime - $diffTimeSinceLastMouvement;
if (($lastState['time'] + $inactivityTime) < time()) {
echoState('Simulate mouse move !', $currentMouseLocation, 'red');
$mouseSimulation = simulateMouseMove();
if (false === $mouseSimulation) {
// If the user interrupts the simulation.
// Reset the inactivity delay.
$inactivityTime = $defaultInactivityTime;
$simulationIsActive = false;
} else {
// Is the user is really inactive, reduce the delay.
$inactivityTime = rand(5, 30);
$simulationIsActive = true;
}
$lastState['time'] = time();
} else {
echoState(sprintf('No mouse move since %s seconde(s). %s secondes before simulating',
$diffTimeSinceLastMouvement,
$timeLeftBeforeSimulating
),
$currentMouseLocation
);
}
} else {
echoState('The mouse has been moved !', $currentMouseLocation);
$lastState['time'] = time();
}
}
$lastState['mouse_location'] = $currentMouseLocation;
}
sleep(1);
}