Last active
October 6, 2017 13:05
-
-
Save tovask/f487a1dde8bec50d148ba37c3e10f6ff to your computer and use it in GitHub Desktop.
minimal php to access android touch inputs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
if(!isset($_SERVER['REMOTE_ADDR']) || $_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']){ | |
// for security, deny access outside of localhost (comment it out if you want to allow control from outside) | |
exit(); | |
} | |
//error_reporting(E_ALL); | |
//ini_set('display_errors', 1); | |
$adb_command = './adb'; | |
if(isset($_POST['action'])){ | |
switch($_POST['action']){ | |
case 'getScreenshot': | |
print shell_exec($adb_command.' shell screencap -p | perl -pe "s/\x0D\x0A/\x0A/g"'); | |
break; | |
case 'sendText': | |
print shell_exec(escapeshellcmd($adb_command.' shell input text '.escapeshellarg($_POST['data']))); | |
break; | |
case 'sendKey': | |
print shell_exec(escapeshellcmd($adb_command.' shell input keyevent '.$_POST['code'])); | |
break; | |
case 'sendTap': | |
print shell_exec(escapeshellcmd($adb_command.' shell input tap '.$_POST['x'].' '.$_POST['y'])); | |
break; | |
case 'sendSwipe': | |
print shell_exec(escapeshellcmd($adb_command.' shell input swipe '.$_POST['x1'].' '.$_POST['y1'].' '.$_POST['x2'].' '.$_POST['y2'].' '.$_POST['duration'])); | |
break; | |
default: | |
// | |
break; | |
} | |
exit(); | |
} | |
?> | |
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Android control</title> | |
<style> | |
* { | |
margin: 0px; | |
padding: 0px; | |
} | |
html, body{ | |
width: 100%; | |
height: 100%; | |
} | |
</style> | |
<script> | |
"use strict"; | |
var screenWidth = 1080, | |
screenHeight = 1920; | |
var delayBetweenScreenRefresh = 100, // in ms | |
logPressMinTime = 500, // in ms | |
screenImg, lastRefresh; | |
function log(msg){ | |
console.log(msg); | |
} | |
function send(action, params){ | |
var xhr = new XMLHttpRequest(); | |
xhr.open('POST', location.href.split('?')[0] ); | |
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); | |
var data = 'action='+action; | |
for(var i in params){ | |
data += '&'+i+'='+params[i]; | |
} | |
xhr.send(data); | |
} | |
function refreshScreen(){ | |
var xhr = new XMLHttpRequest(); | |
xhr.responseType = 'arraybuffer'; | |
xhr.onload = function() { | |
var blb = new Blob([xhr.response], {type: 'image/png'}); // from https://stackoverflow.com/a/25334606 | |
var url = URL.createObjectURL(blb); | |
screenImg.src = url; | |
setTimeout(refreshScreen, delayBetweenScreenRefresh); | |
if(lastRefresh.interval){ | |
clearInterval(lastRefresh.interval); | |
} | |
lastRefresh.innerHTML = 0; | |
lastRefresh.interval = setInterval(function(){ // show how old is the currently visible image | |
lastRefresh.innerHTML = Number(lastRefresh.innerHTML)+500; | |
}, 500); | |
} | |
xhr.open('POST', location.href.split('?')[0] ); | |
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); | |
xhr.send('action=getScreenshot'); | |
} | |
window.addEventListener('load', function(){ | |
lastRefresh = document.getElementById('lastRefresh'); | |
var startX, startY, startTime; | |
screenImg = document.getElementById('screenImg'); | |
screenImg.addEventListener('mousedown', function(e){ | |
var offset = screenImg.getBoundingClientRect() | |
startX = e.clientX - offset.left; | |
startY = e.clientY - offset.top; | |
startTime = (new Date()).getTime(); | |
e.preventDefault(); | |
e.stopPropagation(); | |
}); | |
screenImg.addEventListener('mouseup', function(e){ | |
var endX, endY, endTime; | |
var offset = screenImg.getBoundingClientRect() | |
endX = e.clientX - offset.left; | |
endY = e.clientY - offset.top; | |
endTime = (new Date()).getTime(); | |
//if( (startX - endX) < 5 && (startY - endY) < 5 ){ | |
if(startX == endX && startY == endY && (endTime-startTime)<logPressMinTime ){ | |
send('sendTap', {'x': (startX*screenWidth/offset.width), 'y': (startY*screenHeight/offset.height)} ); | |
}else{ | |
send('sendSwipe', {'x1': (startX*screenWidth/offset.width), 'y1': (startY*screenHeight/offset.height), | |
'x2': (endX*screenWidth/offset.width), 'y2': (endY*screenHeight/offset.height), | |
'duration': (endTime-startTime) } ) | |
} | |
e.preventDefault(); | |
e.stopPropagation(); | |
}); | |
document.getElementById('textSendButton').addEventListener('click', function(){ | |
send('sendText', {'data': document.getElementById('textSendContent').innerHTML } ); | |
}); | |
var pressbuttons = document.getElementsByClassName('pressButton'); | |
function sendButtonEvent(e){ | |
send('sendKey', {'code': e.target.getAttribute('data-value') } ); | |
} | |
for(var i in pressbuttons){ | |
if(!pressbuttons[i].addEventListener){ | |
continue; | |
} | |
pressbuttons[i].addEventListener('click', sendButtonEvent); | |
} | |
lastRefresh = document.getElementById('lastRefresh'); | |
refreshScreen(); | |
}); | |
</script> | |
</head> | |
<body> | |
<div style="float: left; height: 100%;" > | |
<img src="" style="display: block; max-height: 100%;" id="screenImg" /> | |
</div> | |
<div> | |
<div> | |
Long press minimum time: <script>document.write(logPressMinTime);</script>ms<br> | |
Last screen refresh was <span id="lastRefresh" ></span>ms ago | |
</div> | |
<div> | |
<h3>Type Text:</h3> | |
<textarea style="" id="textSendContent" ></textarea> | |
<button type="button" id="textSendButton">Send</button> | |
</div> | |
<div> | |
<h3>Press Button:</h3> | |
<button type="button" class="pressButton" data-value="KEYCODE_POWER">POWER</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_HOME">Home</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_BACK">Back</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_MENU">Menu</button> | |
<br> | |
<button type="button" class="pressButton" data-value="KEYCODE_VOLUME_DOWN">Volume Down</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_VOLUME_MUTE">Volume Mute</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_VOLUME_UP">Volume Up</button> | |
<br> | |
<button type="button" class="pressButton" data-value="KEYCODE_DEL">Backspace</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_ENTER">Enter</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_ESCAPE">Escape</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_MUTE">Mute</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_SPACE">Space</button> | |
<br> | |
<button type="button" class="pressButton" data-value="KEYCODE_PAGE_DOWN">Page Down</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_PAGE_UP">Page Up</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_LEFT">DPad Left</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_RIGHT">DPad Right</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_UP">DPad Up</button> | |
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_DOWN">DPad Down</button> | |
<br> | |
<a href="https://developer.android.com/reference/android/view/KeyEvent.html" target="_blank">(keycodes)</a> | |
</div> | |
</div> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment