Je publie mes résultats de saut dans mon cercle d'amis depuis longtemps. Aujourd'hui, j'ai accidentellement vu une vidéo d'un collègue qui a utilisé du code pour faire des scores. Je suis allé à Baidu et j'ai vu le code (le code était à la fin). Après plusieurs rebondissements, j'ai finalement couru avec succès et marqué un peu.
Tout d'abord, parlons brièvement des étapes:
1. Code de score de téléchargement de Baidu
2. Installer ADB
3. Trouvez un téléphone pour se connecter à l'ordinateur à l'aide du mode de débogage USB
4. Démarrer le programme WECHAT
5. Exécutez le code dans Eclipse (ici, nous devons constamment déboguer et modifier les paramètres en fonction de la taille de l'écran du téléphone mobile)
Le résultat est que l'écran de votre téléphone appuyera automatiquement et laissera la pièce d'échecs sauter.
Parlons de la question:
1. Installez le jeu de problèmes ADB:
Télécharger l'adresse de l'outil ADB
Dans le gestionnaire de périphériques ici, s'il n'est pas installé sur d'autres appareils, la BAD est un point d'exclamation. Après l'installation, comme le montre la figure, le périphérique Android de ligne apparaîtra.
Si vous l'installez, cliquez avec le bouton droit dans la colonne ADB pour sélectionner les propriétés, et l'interface suivante apparaît, cliquez sur Mettre à jour le pilote, sélectionnez l'ordinateur de navigation et sélectionnez les programmes (c'est-à-dire la deuxième option). À l'heure actuelle, une option de pilote de navigation sur l'ordinateur apparaîtra, sélectionnera l'emplacement du package d'installation, puis tout sera publié pour installer.
La question est:
Après l'installation, vous pouvez utiliser ADB sous la fenêtre de commande CMD, mais l'exécution du code dans Eclipse n'a aucun effet (le programme ne rapporte pas d'erreur, et il n'y a pas de capture d'écran sur le téléphone), puis la console Eclipse montre que l'image n'existe pas.
Pour le moment, vous devez copier les deux DLL de bibliothèques de liens dynamiques que vous avez installées dans les deux répertoires suivants: (Si vous ne les trouvez pas, recherchez globalement sur le lecteur C)
adb.exe
Adbwinapi.dll
Adbwinusbapi.dll
C: / Windows / System32
C: / Windows / Syswow64
À l'heure actuelle, il doit être placé sous Syswow64. Je suis Win7 64 bits, donc il y a ce répertoire (d'autres personnes sur Internet disent que Win32 n'a pas besoin de le dire, je ne l'ai pas essayé).
Si le répertoire Syswow64 n'est pas placé, l'opération Eclipse n'a toujours aucun effet pour le moment: mais si vous exécutez la commande ADB Shell Screencap -p /sdcard/tencent/customerpic/current.png dans CMD, vous constaterez qu'il y aura une image actuelle.
J'ai découvert que j'utilisais CD sur System32 et sous Directory d'installation (C: / Program Files (X86) / Thunder Network / Thunder / Program), j'ai exécuté avec succès la commande ci-dessus dans le programme et j'ai signalé une erreur dans System32:
--------------------------------------------------------------------------------------------------------------------------------
Ce programme ne peut pas être démarré car adbwinapi.dll est absent de l'ordinateur. Essayez de réinstaller le programme pour résoudre ce problème.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bien sûr
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OK, cela signifie que l'ADB dans System32 ne peut pas trouver le fichier de liaison dynamique adbwinapi.dll, mais il est évident que, par hasard, j'ai vu le répertoire Syswow64, puis que signifie ce répertoire et qu'est-ce que cela signifie? OK, copiez les trois fichiers copiés dans le répertoire System32, puis copiez-les dans ce répertoire Syswow64, puis faites-le.
Question 2: Dispositif hors ligne
L'exécution du shell ADB dans la fenêtre de commande CMD a abouti à un périphérique d'erreur hors ligne. Je pensais qu'il y avait quelque chose qui ne va pas avec mon installation de BAD. J'avais beaucoup de baidu. J'ai essayé le serveur ADB Kill, le Remount ADB et d'autres commandes, mais j'ai trouvé que le code était / sdcard /. J'ai vu que cela devrait être une carte SD externe. Le chemin est-il faux? (J'ai utilisé Vivo X9, et ce téléphone n'a pas d'option de carte SD externe). Après avoir changé pour un téléphone plus ancien (Vivo Y27), je peux exécuter Shell ADB, mais / SDCard n'est pas un chemin de carte SD externe, mais le chemin du disque U du téléphone.
Cela signifie que cela ne devrait pas être un problème de chemin de code. On m'a dit que l'outil ADB est trop ancien et que la version ADB a la version 1.0.26. Eh bien, je suis trop paresseux pour trouver la nouvelle version de la BAD. Je l'ai débogué avec l'ancien Vivo Y27 et il peut être flassé.
Permettez-moi d'énumérer ce que j'ai appris:
1. Je sais qu'il y a une BAD, et je sais aussi que l'utilisation du shell ADB peut obtenir la session de bash du téléphone. Vous pouvez prendre des captures d'écran, et l'utilisation de la traction ADB peut obtenir des fichiers du téléphone. S'il y a plus de commandes sur le site officiel, je ne m'en souviens pas même si je le lis trop.
2. Sache que Java utilise runtime.getRuntime (). Exec () dans le code d'origine pour appeler les commandes système dans Windows:
process = runtime.getRuntime (). Exec (commande); System.out.println ("Exec Command start:" + Command); process.waitfor (); process.getInputStream (); BufferedReader BufferedReader = new BufferedReader (new InputStreamReader (process.getErrorStream ())); String Line = BufferedReader.Readline (); 3. Comprenez que dans le code, analysez une image en calculant la valeur de couleur RVB de la capture d'écran, etc., int pixel = bufferedImage.getrgb (x, y);
Tous les codes:
package com.lw.test; Importer java.awt.image.bufferedImage; Importer java.io.bufferedReader; Importer java.io.file; Importer java.io.ioException; Importer java.io.inputStreamReader; import java.util.arrays; Importer java.util.concurrent.TimeUnit; import javax.imageio.imageio; / ** * Référence zhihu * * @link <a href = "https://zhuanlan.zhihu.com/p/32452473" rel = "external nofollow" target = "_blank"> https://zhuanlan.zhihu.com/p/32452473 </a> * * sactiver * * @aror Leeho * / classe publique JumpJumpHelper {private static final String image_name = "current.png"; String final statique privé store_dir = "D: / JUMP_SCREENCAPTURE"; // Quantité privée statique finale finale INMELLOGHTLENGHT = 5; // Taille de l'image privée statique finale statique long [] ImageLength = new Long [ImageLengthLength]; Final privé rgbinfo rgbinfo = new rgbinfo (); PATH PRIVÉ FINAL PATH = "/ sdcard / Tencent / CustomerPic /"; String final privé [] adb_screen_capture_cmds = {"Adb Shell Screencap -p" + path + image_name, "adb pull" + path + "current.png" + store_dir}; // La coordonnée Y au bas de la zone d'affichage du score du jeu dans la capture d'écran, 300 est la valeur de 1920x1080. Modifier private final int gamescorebottomy = 300 selon la situation réelle; // Le coefficient de temps de presse peut être ajusté de manière appropriée en fonction de la situation spécifique; Final Private Double PressTimeCoEfficient = 2,05; // La coordonnée du point de départ de la presse est également la coordonnée de point de départ du jeu suivant private final int swipex = 280; private final int swipey = 600; // La hauteur de la base de la pièce d'échecs est privée final int halfbaseboardHeight = 20; // La largeur de la pièce d'échecs est tirée de la capture d'écran et ajuste le Final Int privé par vous-même HalmabodyWidth = 74; // Les coordonnées médianes des deux tremplins dans la capture d'écran du jeu sont principalement utilisées pour calculer l'angle. La proportion de XY peut être calculée sur la base de la capture d'écran réelle. Int final privé Int Boardx1 = 813; Final privé int boardy1 = 1122; Int final privé Int Boardx2 = 310; private final int boardy2 = 813; / ** * Obtenez les vérificateurs et les coordonnées centrales du Springboard suivant * * @return * @Author Leeho * @throws ioException * @upDate 31 décembre 2017 à 12:18:22 PM * / private int [] GethalmaandBoardxyValue (File CurrentImage) Throws ioException {BufferedImage BubireddiMage = ImageIo.Read (CurrentImage); int width = bufferedImage.getWidth (); int height = bufferedImage.getheight (); System.out.println ("largeur:" + largeur + ", hauteur:" + hauteur); int halmaxsum = 0; int halMaxCount = 0; int halmayMax = 0; int boardx = 0; int boardy = 0; // Transférer les points de pixels de la capture d'écran de haut en bas et utiliser la couleur de la pièce d'échecs comme base de reconnaissance de position. Enfin, la valeur moyenne de tous les pixels sur la rangée la plus basse de la couleur de la pièce d'échec est retirée, c'est-à-dire calculer les coordonnées de la pièce d'échecs pour (int y = jeuScorebottomy; y <height; y ++) {for (int x = 0; x <width; x ++) {processrgbinfo (tamponage, x, y); int rValue = this.rgbinfo.getrValue (); int gvalue = this.rgbinfo.getGValue (); int bValue = this.rgbinfo.getBValue (); // Identifiez la position de la pièce d'échecs en fonction de la couleur de RGB, if (rValue> 50 && rValue <60 && gvalue> 53 && gvalue <63 && bValue> 95 && bValue <110) {halmaxsum + = x; halMaxCount ++; // Y Valeur de coordonnées de la ligne inférieure de la pièce d'échecs halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxcount! = 0) {// x Valeur de coordonnées de la ligne inférieure de la pièce d'échecs int halmax = halmaxsum / halmaxcount; // Déplacez la moitié de la hauteur du châssis de pièce d'échecs en haut dans Halmay = HalmayMax - HalfbaseboardHeight; // Commencez à partir de jeuxCoreBottomy pour (int y = GamesCoreBottomy; y <height; y ++) {processrgbinfo (bufferedImage, 0, y); int lastPixelr = this.rgbinfo.getrValue (); int lastPixelg = this.rgbinfo.getgValue (); int lastPixelb = this.rgbinfo.getBValue (); // Tant que la valeur Boardx calculée est supérieure à 0, cela signifie que la valeur X de coordonnée centrale du tremplin suivant a été obtenue. if (boardX> 0) {break; } int boardXSUM = 0; int boardxCount = 0; pour (int x = 0; x <width; x ++) {processrgbinfo (tamponedImage, x, y); int pixelr = this.rgbinfo.getrValue (); int pixelg = this.rgbinfo.getgValue (); int pixelb = this.rgbinfo.getBValue (); // entraîner le cas où la tête de la pièce d'échecs est plus élevée que le tremplin suivant if (math.abs (x - halmax) <halmabodywidth) {continuer; } // Scannez de haut en bas à la position du sommet du tremplin suivant. Le tremplin suivant peut être un cercle ou une boîte. Prenez plusieurs points et trouvez la moyenne if ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastPixelg) + math.abs (pixelb - lastPixelb))> 10) {BarkXsum + = x; BoardXCount ++; }} if (boardxsum> 0) {boardx = boardxsum / boardxCount; }} // Dans l'angle réel, trouvez les coordonnées près du centre de la carte suivante. boardy = (int) (halmay - math.abs (boardx - halmax) * math.abs (barky1 - boardy2) / math.abs (boardx1 - boardx2)); if (boardx> 0 && bandy> 0) {int [] result = new int [4]; // le résultat de la coordonnée x [0] = halmax; // le résultat de la coordonnée y [1] = halmay; // le résultat de la coordonnée x [2] = boardx; // le résultat de la coordonnée y [3] = embarqué; Résultat de retour; }} return null; } / ** * Exécutez la commande * * @param commande * @author leeho * @update 31 décembre 2017 à 12:13:39 PM * / private void exécucommand (String Command) {Process process = null; try {process = runtime.getRuntime (). exec (commande); System.out.println ("Exec Command start:" + Command); process.waitfor (); process.getInputStream (); BufferedReader BufferedReader = new BufferedReader (new InputStreamReader (process.getErrorStream ())); String Line = BufferedReader.Readline (); if (line! = null) {System.out.println (ligne); } bufferedReader = new BufferedReader (new inputStreamReader (process.getInputStream ())); String Line02 = BufferedReader.Readline (); if (line02! = null) {System.out.println (line02); } System.out.println ("Exec Command end:" + Command); } catch (exception e) {e.printStackTrace (); } enfin {if (process! = null) {process.destroy (); }}} / ** * ADB obtient des captures d'écran Android * * @author leeho * @update 31 décembre 2017 12:11:42 PM * / private void exeateDbcaptureCommands () {for (String Command); }} / ** * Jump * * @param Distance * @author leeho * @update 31 décembre 2017 à 12:23:19 PM * / private void dojump (double distance) {System.out.println ("Distance:" + Distance); // Calculez le temps de presse, minimum 200 ms int presstime = (int) math.max (Distance * PressTimecoEfficient, 200); System.out.println ("PressTime:" + PressTime); // Exécuter la sous-opération String Commande = String.format ("ADB Shell Entrée Swipe% S% S% S% S% S", Swipex, Swipey, Swipex, Swipey, PressTime); System.out.println (commande); EXECTIONCOMAND (Commande); } / ** * Un autre jeu * * @author leeho * @update 31 décembre 2017 à 12:47:06 PM * / private void relayGame () {String Command = String.Format ("Adb Shell Entrée tap% s% s", swipex, swipey); EXECTIONCOMAND (Commande); } / ** * Calculez la distance du saut, c'est-à-dire la distance entre deux points * * @param halmax * @param halmay * @param boardx * @param borny * @return * @author leeho * @update 31 décembre 2017 à 12:27:30 PM * / Private Double ComputeDistance (Int Halmax, int halmay, int bandin Math.sqrt (math.pow (math.abs (boardx - halmax), 2) + math.pow (math.abs (bandy - halmay), 2)); } public static void main (String [] args) {JumpJumpHelper JumpJumpHelper = new JumpJumpHelper (); // String Command = "ADB Shell Screencap -P" + JumpJumpHelper.Path + Image_name; //// Command = "Dispositifs ADB"; // JumpJumpHelper.ExecUpecommand (Command); // // if (true) {return;} try {file storeir = new File (store_dir); if (! storeir.exists ()) {booléen flag = storeir.mkdir (); if (! Flag) {System.err.println ("Créer un répertoire de stockage d'images Échec"); retour; }} // Nombre d'exécutions int exécuteCount = 0; pour (;;) {// Exécuter la commande ADB pour obtenir une capture d'écran Android JumpJumpHelper.ExecuteadBcaptureCommands (); File currentImage = new File (store_dir, image_name); if (! currentImage.exists ()) {System.out.println ("L'image n'existe pas"); continuer; } longue longueur = currentImage.length (); ImageLength [exécution% ImageLengthLength] = longueur; // Vérifiez si vous devez redémarrer JumpJumphelper.CheckDorePlay (); ExecuteCount ++; System.out.println ("CurrentTh" + exécution + "Exécution!"); // Obtenez les coordonnées centrales des dames et de la plaque de base int [] result = JumpJumphelper.GethalmaandboardxyValue (currentImage); if (result == null) {System.out.println ("Le résultat de la méthode gethalmaandboardxyvalue est null!"); continuer; } int halmax = résultat [0]; int halmay = résultat [1]; int boardx = résultat [2]; int boardy = résultat [3]; System.out.println ("halmax:" + halmax + ", halmay:" + halmay + ", boardx:" + boardx + ", bandy:" + bandy); // Calculez la distance du saut double saut Distance = JumpJumphelper.computeJumpDistance (Halmax, Halmay, Boardx, Boardy); JumpJumphelper.Dojump (JumpDistance); // Restez pendant 2,5 secondes à chaque fois TimeUnit.Millisecondes.Sleep (2500); }} catch (exception e) {e.printStackTrace (); }} / ** * Vérifiez si vous devez redémarrer * * @Author Leeho * @update 31 décembre 2017 1:39:18 PM * / private void checkDorePlay () {if (ImageLength [0]> 0 && iMageLength [0] == ImageLength [1] && ImageLeng ImageLength [3] == ImageLength [4]) {// Cela signifie que la taille de l'image a été la même depuis 5 fois consécutives. Vous pouvez savoir que l'écran actuel est dans une autre série de tableaux.filt (ImageLength, 0); // simulez et cliquez sur le bouton pour recommencer le jeu ReplayGame (); }} / ** * Obtenez la valeur RVB des coordonnées spécifiées * * @param bufferedImage * @param x * @param y * @author leeho * @update 2017-02-31 12:12:43 PM * / private void processrgbinfo (buffredimage BuffredImage, int x, int y) {this.rgbinfo. int pixel = bufferedImage.getrgb (x, y); // Convertir en chiffre RVB this.rgbinfo.setrValue ((pixel & 0xff0000) >> 16); this.rgbinfo.setGValue ((pixel & 0xff000) >> 8); this.rgbinfo.setBValue ((pixel & 0xff)); } class rgbinfo {private int RValue; int gvalue privé; Int privé 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; }}}Bien sûr, les résultats seront effacés après un certain temps, mais en tant que programmeur, il est toujours bon. À partir de la vulnérabilité initiale de soumission de poste, l'ordinateur a été invité à saisir des paquets et à modifier les données en tant qu'agent. Maintenant, le code simule les clic (bien qu'il ne prenne pas effet.)
Pour plus de contenu, vous pouvez vous référer au sujet spécial "Jump on WeChat" pour apprendre.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.