Skip to content

Instantly share code, notes, and snippets.

@PJZ9n
Created May 17, 2020 13:08
Show Gist options
  • Save PJZ9n/651ed3f11e526815d7157d55df411c98 to your computer and use it in GitHub Desktop.
Save PJZ9n/651ed3f11e526815d7157d55df411c98 to your computer and use it in GitHub Desktop.
タイピングをマスターするのは思ったよりも難しいです。Processing
import java.awt.*;
import java.awt.Robot;
import net.sourceforge.tess4j.*;
import java.io.File;
import java.awt.image.BufferedImage;
import java.awt.event.KeyEvent;
final int PHASE_POS1 = 0;
final int PHASE_POS2 = 1;
final int PHASE_WAIT = 2;
final int PHASE_RUNNING = 3;
int phase = PHASE_POS1;
boolean selected = false;
int pos1X = 0;
int pos1Y = 0;
int pos2X = 0;
int pos2Y = 0;
int millis = 0;
void setup() {
size(1000, 500);
textFont(createFont("MS Gothic", 30));
}
void draw() {
try {
background(0);
//タイトル
textSize(40);
text("タイピング自動化ツール", 50, 50);
textSize(30);
text(floor(frameRate) + "FPS", 550, 50);
//フェーズ処理
switch (phase) {
case PHASE_POS1:
if (!selected) {
text("地点1を選択してください", 100, 150);
} else {
selected = false;
phase = PHASE_POS2;
}
text("NOW - X: " + getMouseX() + " | Y: " + getMouseY(), 100, 200);
text("POS1 - X: " + pos1X + " | Y: " + pos1Y, 100, 235);
text("POS2 - X: " + pos2X + " | Y: " + pos2Y, 100, 270);
break;
case PHASE_POS2:
if (!selected) {
text("地点2を選択してください", 100, 150);
} else {
selected = false;
phase = PHASE_WAIT;
}
text("NOW - X: " + getMouseX() + " | Y: " + getMouseY(), 100, 200);
text("POS1 - X: " + pos1X + " | Y: " + pos1Y, 100, 235);
text("POS2 - X: " + pos2X + " | Y: " + pos2Y, 100, 270);
break;
case PHASE_WAIT:
if (!selected) {
text("スタート待ちです...", 100, 150);
PImage se = getSelectedImage();
image(se, 500, 100, 400, 100);
} else {
selected = false;
phase = PHASE_RUNNING;
}
text("POS1 - X: " + pos1X + " | Y: " + pos1Y, 100, 235);
text("POS2 - X: " + pos2X + " | Y: " + pos2Y, 100, 270);
break;
case PHASE_RUNNING:
if (!selected) {
delay(800);
text("動作中です...", 100, 150);
//画像取得
PImage se = getSelectedImage();
image(se, 500, 100, 400, 100);
//OCR掛ける
String result = ocr(se).replace("\n", "");
//表示
text("検出: " + result, 500, 350);
//打つ
Robot robot = new Robot();
/*int[] keys = {
KeyEvent.VK_C,
};
keyPress(robot, 10, keys);*/
for (int i = 0; i < result.length(); i++) {
if (String.valueOf(result.charAt(i)) == " ") {
continue;
}
keyPress(robot, 10, stringToKeycode(String.valueOf(result.charAt(i))));
}
selected = false;
phase = PHASE_RUNNING;
}
break;
}
} catch (Exception e) {
println(e.getMessage());
}
}
int getMouseX() {
return (int)MouseInfo.getPointerInfo().getLocation().getX();
}
int getMouseY() {
return (int)MouseInfo.getPointerInfo().getLocation().getY();
}
void keyPressed() {
if (key == ' ') {
switch (phase) {
case PHASE_POS1:
selected = true;
pos1X = getMouseX();
pos1Y = getMouseY();
break;
case PHASE_POS2:
selected = true;
pos2X = getMouseX();
pos2Y = getMouseY();
break;
case PHASE_WAIT:
selected = true;
break;
}
}
}
void keyPress(Robot robot, int delay, int... keys) {
for (int key : keys) {
robot.keyPress(key);
}
for (int i = keys.length - 1; i >= 0; i--) {
robot.keyRelease(keys[i]);
}
robot.delay(delay);
}
int stringToKeycode(String s) throws Exception {
switch (s) {
case "A":
return KeyEvent.VK_A;
case "B":
return KeyEvent.VK_B;
case "C":
return KeyEvent.VK_C;
case "D":
return KeyEvent.VK_D;
case "E":
return KeyEvent.VK_E;
case "F":
return KeyEvent.VK_F;
case "G":
return KeyEvent.VK_G;
case "H":
return KeyEvent.VK_H;
case "I":
return KeyEvent.VK_I;
case "J":
return KeyEvent.VK_J;
case "K":
return KeyEvent.VK_K;
case "L":
return KeyEvent.VK_N;
case "M":
return KeyEvent.VK_M;
case "N":
return KeyEvent.VK_N;
case "O":
return KeyEvent.VK_O;
case "P":
return KeyEvent.VK_P;
case "Q":
return KeyEvent.VK_Q;
case "R":
return KeyEvent.VK_R;
case "S":
return KeyEvent.VK_S;
case "T":
return KeyEvent.VK_T;
case "U":
return KeyEvent.VK_U;
case "V":
return KeyEvent.VK_V;
case "W":
return KeyEvent.VK_W;
case "X":
return KeyEvent.VK_X;
case "Y":
return KeyEvent.VK_Y;
case "Z":
return KeyEvent.VK_Z;
case "-":
return KeyEvent.VK_MINUS;
case "0":
return KeyEvent.VK_0;
case "1":
return KeyEvent.VK_1;
case "2":
return KeyEvent.VK_2;
case "3":
return KeyEvent.VK_3;
case "4":
return KeyEvent.VK_4;
case "5":
return KeyEvent.VK_5;
case "6":
return KeyEvent.VK_6;
case "7":
return KeyEvent.VK_7;
case "8":
return KeyEvent.VK_8;
case "9":
return KeyEvent.VK_9;
default:
return KeyEvent.VK_MINUS;//HACK!!i
//throw new Exception();
}
}
String ocr(PImage image) {
ITesseract t = new Tesseract();
t.setTessVariable("tessedit_char_whitelist","1234567890ABCDEFGHIJKLMNOPQRSSTUVWXYZ-i");
t.setLanguage("eng");
try {
String result = t.doOCR((BufferedImage)image.getNative());
return result;
} catch (TesseractException e) {
println(e.getMessage());
return "Unknown";
}
}
PImage screenshot() {
try {
return new PImage(new Robot().createScreenCapture(new java.awt.Rectangle(0, 0, displayWidth, displayHeight)));
} catch (AWTException e) {
return new PImage();//hack
}
}
PImage getSelectedImage() {
return screenshot().get(pos1X, pos1Y, pos2X - pos1X, pos2Y - pos1Y);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment