He estado publicando mis resultados de salto en mi círculo de amigos durante mucho tiempo. Hoy accidentalmente vi un video de un colega que usó código para hacer puntajes. Fui a Baidu y vi el código (el código estaba al final). Después de varios giros y vueltas, finalmente corrí con éxito y anoté un poco.
Primero, hablemos brevemente sobre los pasos:
1. Código de puntaje de descarga de Baidu
2. Instale ADB
3. Encuentre un teléfono para conectarse a la computadora usando el modo de depuración USB
4. Comience el programa WeChat Mini
5. Ejecute el código en Eclipse (aquí necesitamos depurar constantemente y modificar los parámetros de acuerdo con el tamaño de la pantalla del teléfono móvil)
El resultado es que la pantalla de su teléfono presionará automáticamente y dejará que la pieza de ajedrez salte.
Hablemos de la pregunta:
1. Instale el conjunto de problemas ADB:
Descargar la dirección de la herramienta ADB
En el administrador de dispositivos aquí, si no está instalado en otros dispositivos, ADB es un punto de exclamación. Después de la instalación, como se muestra en la figura, aparecerá el dispositivo Android de línea.
Si lo instala, haga clic con el botón derecho en la columna ADB para seleccionar propiedades, y aparece la siguiente interfaz, haga clic en Actualizar el controlador, seleccione Examinar la computadora y seleccionar programas (es decir, la segunda opción). En este momento, aparecerá una opción de controlador de navegación en la computadora, seleccione la ubicación del paquete de instalación y luego todo se lanzará para instalar.
El caso es:
Después de la instalación, puede usar ADB en la ventana de comando CMD, pero ejecutar el código en Eclipse no tiene ningún efecto (el programa no informa un error, y no hay capturas de pantalla en el teléfono), y luego la consola Eclipse muestra que la imagen no existe.
En este momento, debe copiar las dos bibliotecas de enlaces dinámicos DLL que instaló en los siguientes dos directorios: (si no puede encontrarlos, busque a nivel mundial en la unidad C)
adb.exe
Adbwinapi.dll
Adbwinusbapi.dll
C:/Windows/System32
C:/Windows/Syswow64
En este momento, debe colocarse bajo SYSWOW64. Estoy WIN7 64 bit, así que existe este directorio (otras personas en Internet dicen que Win32 no necesita poner esto, no lo he probado).
Si no se coloca el directorio SYSWOW64, la operación de Eclipse aún no tiene ningún efecto en este momento: pero si ejecuta el shell shell schipencap -p /sdcard/tencent/customerpic/current.png comando en cmd, encontrará que habrá una imagen actual.png en el teléfono, lo que significa que el eclipse no ha encontrado la herramienta ADB correspondiente.
Descubrí que estaba usando CD a System32 y en Directorio de instalación (C:/Archivos de programa (x86)/Thunder Network/Thunder/Program), ejecuté con éxito el comando anterior en el programa e informé un error en System32:
----------------------------------------------------------------------------------------------------------------------------
Este programa no se puede iniciar porque adbwinapi.dll falta en la computadora. Intente reinstalar el programa para resolver este problema.
---------------------------------------------------------------------------------------------------
Seguro
---------------------------------------------------------------------------------------------------
Ok, esto significa que el ADB en System32 no puede encontrar el archivo de enlace dinámico adbwinapi.dll, pero es obvio que, por casualidad, vi el directorio syswow64, y luego, ¿qué significa este directorio y qué significa? Ok, copie los tres archivos copiados en el directorio System32 y luego copie a este directorio SYSWOW64 y hágalo.
Pregunta 2: Dispositivo fuera de línea
Ejecutar el shell ADB en la ventana de comando CMD dio como resultado un dispositivo de error fuera de línea. Pensé que había algo mal con mi instalación de ADB. Tenía mucho Baidu. Probé el servidor ADB Kill, el remogudo ADB y otros comandos, pero descubrí que el código era /sdcard /. Vi que esta debería ser una tarjeta SD externa. ¿Está mal el camino? (Usé Vivo X9, y este teléfono no tiene una opción de tarjeta SD externa). Después de cambiar a un teléfono más antiguo (Vivo Y27), puedo ejecutar el shell ADB, pero /sdcard no es una ruta de tarjeta SD externa, sino la ruta de disco U del teléfono.
Eso significa que no debería ser un problema de ruta de código. Me dijeron que la herramienta ADB es demasiado antigua y que la versión ADB tiene la versión 1.0.26. Bueno, soy demasiado vago para encontrar la nueva versión de ADB. Lo depuré con el viejo Vivo Y27 y se puede mostrar.
Déjame enumerar lo que he aprendido:
1. Sé que hay ADB, y también sé que usar el shell ADB puede obtener la sesión bash del teléfono. Puede tomar capturas de pantalla y usar ADB Pull puede obtener archivos desde el teléfono. Si hay más comandos en el sitio web oficial, no puedo recordarlo incluso si lo leo demasiado.
2. Sepa que Java usa runtime.getRuntime (). Exec () en el código original para llamar a los comandos del sistema en Windows:
proceso = runtime.getRuntime (). Exec (comando); System.out.println ("EXEC Command Start:" + comando); process.waitfor (); process.getInputStream (); BufferedReader BufferedReader = new BufferedReader (new InputStreamReader (Process.getErRorStream ())); String line = bufferedReader.readline (); 3. Comprenda que en el código, analice una imagen calculando el valor de color RGB de la captura de pantalla, etc., int pixel = bufferedImage.getRgb (x, y);
Todos los códigos:
paquete com.lw.test; import java.awt.image.bufferedImage; import java.io.bufferedReader; import java.io.file; import java.io.ioException; import java.io.inputstreamreader; importar java.util.arrays; import java.util.concurrent.timeunit; import javax.imageio.imageio; /** * referencia zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "externo nofollow" target = "_blank"> https://zhuanlan.zhihu.com/p/32452473 </a> * * @Author Ayermer * Leeho */ public class JumpJumphelper {private static final String image_name = "current.png"; sting de cadena final estática privada_dir = "d:/jump_screencapture"; // cantidad privada estática final int imageLengthlength = 5; // Tamaño de la imagen Private Static final Long [] imageLength = new Long [imageLengthLength]; RGBINFO final privado rgbinfo = new rgbinfo (); Path de cadena final privada = "/sdcard/tencent/customerpic/"; String final privada [] ADB_Screen_Capture_Cmds = {"ADB Shell Screencap -P"+Path+Image_Name, "ADB Pull"+Path+"Current.png"+store_dir}; // La coordenada y en la parte inferior del área de visualización de puntaje del juego en la captura de pantalla, 300 es el valor de 1920x1080. Modifique la final de GamesCorebottomy privada Final = 300 de acuerdo con la situación real; // El coeficiente de tiempo de prensa se puede ajustar adecuadamente de acuerdo con la situación específica; Private Double PressTimecoEfeEftient = 2.05; // La coordenada del punto de partida de la prensa también es la coordenada del punto de partida del próximo juego Final Private Int SwIpex = 280; Private final int swipey = 600; // La altura de la base de la pieza de ajedrez es privada final interfallbaseBoardHeight = 20; // El ancho de la pieza de ajedrez se toma de la captura de pantalla y ajusta la final privada int por ti mismo HalmabodyWidth = 74; // Las coordenadas de punto medio de las dos trampolín en la captura de pantalla del juego se usan principalmente para calcular el ángulo. La proporción de XY se puede calcular en función de la captura de pantalla real. Private Final Int BoardX1 = 813; Privado final int boardy1 = 1122; Private final int boardx2 = 310; Private final int boardy2 = 813; / ** * Obtenga los damas y las coordenadas del centro del próximo trampolín * * @return * @author leeho * @throws ioexception * @Update el 31 de diciembre de 2017 a las 12:18:22 pm */ private int [] gethalmaandboardxyvalue (archivo de actualización) lanza ioexception {bufferedimage bufferedimage = image.read (lectura de corriente); int width = bufferedImage.getWidth (); int hight = bufferedImage.getheight (); System.out.println ("Ancho:" + ancho + ", altura:" + altura); int halmaxsum = 0; int halmaxcount = 0; int halmaymax = 0; int boardx = 0; int broardy = 0; // Transfiere los puntos de píxeles de la captura de pantalla de arriba a abajo, y use el color de la pieza de ajedrez como base para el reconocimiento de posición. Finalmente, se toma el valor promedio de todos los píxeles en la fila más baja del color de la pieza del ajedrez, es decir, calcule las coordenadas de la pieza de ajedrez para (int y = gamescorebottomy; y <altura; y ++) {para (int x = 0; x <width; x ++) {processrgbinfo (bufferedimage, x, y); int rValue = this.rgbinfo.getRValue (); int gValue = this.rgbinfo.getgValue (); int bvalue = this.rgbinfo.getBValue (); // Identificar la posición de la pieza de ajedrez de acuerdo con el color de RGB, if (rValue> 50 && rValue <60 && gvalue> 53 && gValue <63 && bvalue> 95 && bvalue <110) {halmaxsum += x; HalmaxCount ++; // y el valor coordinado de la fila inferior de la pieza de ajedrez halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxCount! = 0) {// x Valor de coordenadas de la fila inferior de la pieza de ajedrez int halmax = halmaxsum /halmaxcount; // mover la mitad de la altura del chasis de la pieza de ajedrez hacia arriba int halmay = halmaymax - halfbaseBoardHeight; // Comience desde GamesCorebottomy para (int y = gamescorebottomy; y <altura; y ++) {processrgbinfo (bufferedImage, 0, y); int lastpixelr = this.rgbinfo.getRValue (); int lastpixelg = this.rgbinfo.getgValue (); int lastpixelb = this.rgbinfo.getBValue (); // Mientras el valor de BoardX calculado sea mayor que 0, significa que se ha obtenido el valor X de la coordenada central del próximo trampolín. if (boardx> 0) {break; } int boardxsum = 0; int boardxcount = 0; para (int x = 0; x <width; x ++) {processrgbinfo (bufferedImage, x, y); int pixelr = this.rgbinfo.getRValue (); int pixelg = this.rgbinfo.getgValue (); int pixelb = this.rgbinfo.getBValue (); // Entrena el estuche donde la cabeza de la pieza de ajedrez es más alta que el próximo trampolín if (math.abs (x - halmax) <halmabodywidth) {continuar; } // Escanear de arriba a abajo a la posición del vértice del siguiente trampolín. El próximo trampolín puede ser un círculo o una caja. Tome múltiples puntos y encuentre el promedio if ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastpixelg) + math.abs (pixelb - lastpixelb))> 10) {boardxsum + = x; BoardXCount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxcount; }} // Desde el ángulo real, encuentre las coordenadas cerca del centro de la siguiente placa. Boardy = (int) (halmay - math.abs (boardx - halmax) * math.abs (boardy1 - boardy2) / math.abs (boardx1 - boardx2)); if (boardx> 0 && boardy> 0) {int [] result = new int [4]; // El resultado de la coordenada x [0] = Halmax; // El resultado de la coordenada y [1] = Halmay; // El resultado de la coordenada x [2] = boardx; // El resultado de la coordenada y [3] = boardy; resultado de retorno; }} return null; } / ** * Ejecutar el comando * * @param comando * @author leeho * @Update 31 de diciembre de 2017 a las 12:13:39 pm * / private void ejecutecommand (comando de cadena) {proceso proceso = null; intente {process = runtime.getRunTime (). Exec (comando); System.out.println ("EXEC Command Start:" + comando); process.waitfor (); process.getInputStream (); BufferedReader BufferedReader = new BufferedReader (new InputStreamReader (Process.getErRorStream ())); String line = bufferedReader.readline (); if (line! = null) {system.out.println (línea); } bufferedReader = new BufferedReader (new InputStreamReader (Process.getInputStream ())); Cadena line02 = bufferedReader.readline (); if (line02! = null) {system.out.println (line02); } System.out.println ("EXEC Command End:" + comando); } catch (Exception e) {E.PrintStackTrace (); } finalmente {if (proceso! = null) {process.destroy (); }}} / ** * ADB obtiene capturas de pantalla de Android * * @author leeho * @Update 31 de diciembre de 2017 12:11:42 pm * / private void ejecutebcaptureCommands () {for (string command: adb_screen_capture_cmds) {ejecutOcommand); }} / ** * saltar * * @param distancia * @author leeho * @update 31 de diciembre de 2017 a las 12:23:19 pm * / private void dojump (doble distancia) {system.println ("Distancia:" + distancia); // Calcule el tiempo de prensa, mínimo 200 ms int presstime = (int) Math.max (Distancia * PressTimecoEftient, 200); System.out.println ("Presstom:" + Press Hora); // Ejecutar el comando de string de operación de presione = string.format ("ADB Shell Input Swipe %S %S %S %S %S", SwipEx, SwipEy, SwipEx, Swipey, Repress); System.out.println (comando); ejecutecommand (comando); } / ** * Otro juego * * @author leeho * @Update el 31 de diciembre de 2017 a las 12:47:06 pm * / private void replayGame () {String command = String.format ("ADB SHell Entrada Tap %S %S", SwipEx, Swipey); ejecutecommand (comando); } / ** * Calcule la distancia del salto, es decir, la distancia entre dos puntos * * * @param halmax * @param halmay * @param boardx * @param boardy * @return * @author leeho * @update el 31 de diciembre de 2017 a las 12:27:30 pm * / doble computejumpdistance (int halmay, int halmay, introxx, intboaty {introd MATH.SQRT (MATH.POW (MATH.ABS (BOUNDX - HALMAX), 2) + MATH.POW (MATH.ABS (BODARY - HALMAY), 2)); } public static void main (string [] args) {JumpJumphelper JumpJumphelper = new JumpJumphelper (); // String command = "ADB Shell Screencap -p" + JumpJumphelper.Path + Image_Name; //// comando = "dispositivos ADB"; // JumpJumphelper.executeCommand (comando); // // if (true) {return;} try {file storedir = new File (store_dir); if (! storedir.exists ()) {boolean flag = storedir.mkdir (); if (! flag) {system.err.println ("Crear directorio de almacenamiento de imagen fallido"); devolver; }} // Número de ejecuciones int ejecutecount = 0; para (;;) {// Ejecutar el comando ADB para obtener una captura de pantalla de Android JUMTJUMPHELPER.EXECUTEADBCAPTURECOMMANDS (); Archivo TRENTIMAGE = nuevo archivo (store_dir, image_name); if (! CurrentImage.Exists ()) {System.out.println ("La imagen no existe"); continuar; } larga longitud = currentImage.length (); ImageLength [ExecoCount % imageLengthLength] = longitud; // Compruebe si necesita reiniciar JumpJumphelper.CheckdorePlay (); ejecutecount ++; System.out.println ("CurrentTH" + Executecount + "Ejecución!"); // Obtenga las coordenadas centrales de los damas y la placa base int [] resultado = JumpJumphelper.GethalMaandBoardxyValue (CurrentImage); if (result == null) {system.out.println ("El resultado del método gethalmaandboardxyValue es nulo!"); continuar; } int halmax = resultado [0]; int halmay = resultado [1]; int boardx = resultado [2]; int broardy = resultado [3]; System.out.println ("Halmax:" + Halmax + ", Halmay:" + Halmay + ", BoardX:" + Boardx + ", Boardy:" + Boardy); // Calcule la distancia de Jump Double JumpDistance = JumpJumphelper.ComputeJumpDistance (Halmax, Halmay, BoardX, Boardy); JumpJumphelper.dojump (JumpDistance); // quédate por 2.5 segundos cada vez que TimeUnit.milliseConds.sleep (2500); }} catch (Exception e) {E.PrintStackTrace (); }} / ** * Compruebe si necesita reiniciar * * @author leeho * @update el 31 de diciembre de 2017 1:39:18 pm * / private void checkdorePlay () {if (imageLength [0]> 0 && imageLength [0] == imageLength [1] & imageLength [1] == ImageLength [2] && imagel longitud ImageLength [3] == ImageLength [4]) {// Esto significa que el tamaño de la imagen ha sido el mismo durante 5 veces consecutivas. Puede saber que la pantalla actual está en otra ronda de matrices. // simular y hacer clic en el botón para comenzar el juego nuevamente replaygame (); }} / ** * Obtenga el valor RGB de las coordenadas especificadas * * @param bufferedImage * @param x * @param y * @author leeho * @update 2017-02-31 12:12:43 pm * / private void processrgbinfo (bufferedImage bufferedimage, int x, int y) {this. int pixel = bufferedImage.getRgb (x, y); // Convertir a rgb dígito this.rgbinfo.setRValue ((píxel y 0xff0000) >> 16); this.rgbinfo.setgValue ((píxel y 0xff000) >> 8); this.rgbinfo.setBValue ((Pixel & 0xff)); } clase rgbinfo {private int rValue; privado int gvalue; private int bvalue; public int getRValue () {return rValue; } public void setRValue (int rValue) {rValue = rValue; } public int getgValue () {return gValue; } public void setgValue (int gValue) {gvalue = gValue; } public int getBValue () {return bvalue; } public void setBValue (int bvalue) {bvalue = bvalue; } public void reset () {this.rValue = 0; this.gValue = 0; this.bValue = 0; }}}Por supuesto, los resultados se eliminarán después de un tiempo, pero como programador, sigue siendo bueno. A partir de la vulnerabilidad inicial de envío posterior, se le pidió a la computadora que tomara paquetes y modificara los datos como agente. Ahora el código simula los clics (aunque no entrará en vigencia).
Para obtener más contenido, puede consultar el tema especial "Jump on WeChat" para aprender.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.