Latihas的南方孤岛
Latihas的南方孤岛

校园智慧英语辅助——自动填写单词

由于我们学校使用校园智慧英语这款app来线上检查同学们的学习情况,而默单词这一块与参考书完全一致,所以有些人左手持书右手打字,十分辛苦。为此,根据懒人创造技术定理,我设计了一款可以自动填写的程序。开了这个挂机一下午单词部分就完成了。下面让我们来康康这个程序编写得正常不正常啊~~~

package com.latihas.English;

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.InputEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.MessageDigest;
import java.util.Timer;
import java.util.TimerTask;

import static java.awt.Image.SCALE_SMOOTH;
import static java.awt.MouseInfo.getPointerInfo;
import static java.awt.Toolkit.getDefaultToolkit;
import static java.awt.event.KeyEvent.VK_CONTROL;
import static java.awt.event.KeyEvent.VK_V;
import static java.lang.Integer.toHexString;
import static java.lang.Runtime.getRuntime;
import static java.lang.System.gc;
import static java.lang.Thread.sleep;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.security.MessageDigest.getInstance;
import static javax.imageio.ImageIO.write;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class Main {
    final static String TMP_PNG = "F:\\tmp.png",
            TMP_TXT = "F:\\tmp.txt",
            TMP_OCR = "E:\\Tesseract-OCR\\tesseract.exe " + TMP_PNG + " F:\\tmp -l chi_sim";
    static String START_1,
            START_2;
    final static File FILE_TMP_PNG = new File(TMP_PNG),
            FILE_TMP_TXT = new File(TMP_TXT);
    final static JFrame jFrame = new JFrame();
    final static JPanel jPanel = new JPanel();
    final static JLabel jLabel_xy = new JLabel(),
            jLabel_copied = new JLabel("Copied:  "),
            jLabel_processing = new JLabel();
    final static JButton jButton_start = new JButton("开始");
    final static TextArea textArea_result = new TextArea(),
            textArea_letter = new TextArea();
    static Robot robot;
    final static int PNG_FX = 663,
            PNG_FY = 194,
            PNG_TX = 1209,
            PNG_TY = 290,
            TEXTINPUT_X = 939,
            TEXTINPUT_Y = 371,
            NEXT_X = 947,
            NEXT_Y = 1010;

    static void setStateImage(String path) {
        ImageIcon imageIcon = new ImageIcon(path);
        imageIcon.setImage(imageIcon.getImage().getScaledInstance(200, 200, SCALE_SMOOTH));
        jLabel_processing.setIcon(imageIcon);
        jLabel_processing.setSize(200, 200);
    }

    public static void main(String[] args) {
        try {
            robot = new Robot();
        } catch (Exception e) {
            e.printStackTrace();
        }
        setStateImage("pic/b.png");

        textArea_letter.setBounds(0, 0, 10, 10);
        textArea_letter.addTextListener(e -> {
            START_1 = textArea_letter.getText().trim();
            START_2 = START_1.toLowerCase();
        });
        jPanel.add(jLabel_xy);
        jPanel.add(jButton_start);
        jPanel.add(textArea_letter);
        jPanel.add(textArea_result);
        jPanel.add(jLabel_processing);
        jPanel.add(jLabel_copied);

        jFrame.add(jPanel);
        jFrame.setBounds(0, 0, 500, 630);
        jFrame.setAlwaysOnTop(true);
        //jFrame.setUndecorated(true);
        //jFrame.setOpacity(1f);
        jFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        jFrame.setVisible(true);

        jButton_start.addActionListener(v -> begin());

        new Thread(() -> new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                Point p = getPointerInfo().getLocation();
                jLabel_xy.setText("x:  " + (int) p.getX() + "       y:  " + (int) p.getY());
            }
        }, 0, 1)).start();
    }

    static void begin() {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    boolean f = false;
                    jButton_start.setEnabled(false);
                    setStateImage("pic/p.png");
                    textArea_result.setText("");

                    FILE_TMP_PNG.createNewFile();
                    FILE_TMP_TXT.createNewFile();
                    sleep(1000);
                    write(robot.createScreenCapture(new Rectangle(getDefaultToolkit().getScreenSize())).getSubimage(PNG_FX, PNG_FY, PNG_TX - PNG_FX, PNG_TY - PNG_FY),
                            "png",
                            FILE_TMP_PNG);
                    sleep(2000);
                    getRuntime().exec(TMP_OCR);
                    sleep(2000);
                    StringBuilder sb = new StringBuilder();
                    BufferedReader br = new BufferedReader(new FileReader(FILE_TMP_TXT));
                    while (br.ready()) sb.append(br.readLine());
                    String[] tts = sb.toString().replaceAll("[^\u4e00-\u9fa5]", " ").replaceAll(" +", " ").replaceFirst(" ", "").split(" ");
                    jLabel_copied.setText("Copied:  ");
                    for (String s : tts) {
                        String ts = getURLContent("https://fanyi-api.baidu.com/api/trans/vip/translate?q=" + s + "&from=zh&to=en&appid=20200204000380254&salt=0&sign=" + encrypt("20200204000380254" + s + "0Bj9Dy6Q30tSg0lLr8e2S"));
                        String ttts = ts.substring(ts.indexOf("dst") + 6, ts.length() - 4);
                        textArea_result.append('\n' + ttts);
                        String[] tttts = ttts.split(" ");
                        for (String ttttts : tttts)
                            if ((ttttts.startsWith(START_1) || ttttts.startsWith(START_2))) {
                                setClipboardString(ttttts);
                                jLabel_copied.setText("Copied:  " + ttttts);
                                f = true;
                            }
                    }
                    jButton_start.setEnabled(true);
                    click(TEXTINPUT_X, TEXTINPUT_Y);
                    keyPressWithCtrl(VK_V);
					sleep(500);
                    click(NEXT_X, NEXT_Y);
                    click(239, 215);
                    sleep(500);
                    if (f) setStateImage("pic/s.png");
                    else {
                        setStateImage("pic/e.png");
                        getDefaultToolkit().beep();
                    }
                    gc();
                } catch (Exception ignored) {
                }
            }
        }, 2000, 10000);
    }

    static void click(int x, int y) {
        robot.mouseMove(x, y);
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.delay(100);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
        robot.delay(100);
    }

    static void keyPressWithCtrl(int key) {
        robot.keyPress(VK_CONTROL);
        robot.keyPress(key);
        robot.keyRelease(key);
        robot.keyRelease(VK_CONTROL);
        robot.delay(200);
    }

    static void setClipboardString(String text) {
        getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null);
    }

    static String encrypt(String dataStr) {
        StringBuilder result = new StringBuilder();
        try {
            MessageDigest m = getInstance("MD5");
            m.update(dataStr.getBytes(UTF_8));
            for (byte b : m.digest()) result.append(toHexString((0x000000FF & b) | 0xFFFFFF00).substring(6));
        } catch (Exception ignored) {
        }
        return result.toString();
    }

    public static String getURLContent(String urlStr) {
        StringBuilder sb = new StringBuilder();
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(new URL(urlStr).openStream(), UTF_8));
            String str;
            while ((str = in.readLine()) != null) sb.append(str);
            in.close();
        } catch (Exception ignored) {
        }
        return sb.toString();
    }


}

先把安卓模拟器开好,再把上面这串又臭又长的代码复制到Java的IDE编译运行一下就行了(如果报错可以把资源文件删了)。项目架构是这样的:

http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228004131.png

运行时是这样的:

http://www.latihas.top/wp-content/uploads/2020/02/J4Y88PVBWBIO6DPRO-1024x559.png

上面那个框是填首字母的(大写),下面那个框负责输出,copy是表示最终复制的答案。注意要把有文字的地方放入(663,194)到(1209,290)这个矩形框内。程序窗口最上方会实时更新鼠标坐标:

http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228004535-1024x556.png

操作完之后会自动点击下一题保证连续性。

实现原理

使用Tesseract-OCR技术将图片转为文字,再用百度翻译API将文字翻译过来,然后程序进行过滤,用Robot类操控键盘鼠标。PS:这个API账号是我的,不要滥用,有每秒翻译上限的。

最终效果

大约在60%左右徘徊

ps:模拟器的选择也很重要,网易mumu模拟器会有问题,而雷电模拟器则正常。

http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005241-1-597x1024.png
http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005257-1-597x1024.png
http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005307-1-597x1024.png
http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005315-1-597x1024.png
http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005324-1-597x1024.png
http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005332-1-597x1024.png
http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005340-1-597x1024.png
http://www.latihas.top/wp-content/uploads/2020/02/TIM截图20200228005348-1-597x1024.png

Latihas

文章作者

发表评论

textsms
account_circle
email

  • I really like it whenever people come together and share ideas. Great website, keep it up. Gertrudis Ned Boudreaux

    4月前 回复
  • I like it when individuals get together and share ideas. Great blog, stick with it! Wynn Corney Maltz

    4月前 回复
  • Thanks for sharing. I never knew this about wreaths. I have had a Christmas wreath on my front door at Christmas for as long as I can remember, even as a child. Gladi Niki Abramson

    4月前 回复
  • This post will assist the internet viewers for building up new blog or even a weblog from start to end. Reena Washington Floss Carina Wilt Kiyoshi

    4月前 回复
  • Hi there, I found your website via Google at the same time as searching for a comparable topic, your site came up, it looks good. I have bookmarked it in my google bookmarks. Marissa Torey Delanty

    4月前 回复
  • Pretty! This has been an extremely wonderful article. Thanks for providing this info. Janetta Nowell Drooff

    4月前 回复
  • I just could not depart your web site prior to suggesting that I actually enjoyed the standard info a person provide for your visitors? Is gonna be back often in order to check up on new posts Romona Rodolph Moberg

    4月前 回复
  • As I site possessor I believe the content matter here is rattling great , appreciate it for your hard work. You should keep it up forever! Good Luck. Bev Dewitt Mackler

    4月前 回复
  • What a lovely story! The story in this YouTube video that is posted at this time is really a good one with having pleasant picture feature. Janet Tome Koerlin

    4月前 回复
  • changing this in constructor will clear the errors Nina Wilbert Campball

    4月前 回复
  • I would like to get across my appreciation for your generosity giving support to men and women who must have guidance on your concern. Your personal dedication to passing the solution all through turned out to be particularly beneficial and have really encouraged others just like me to achieve their pursuits. Your new important key points entails a lot a person like me and far more to my colleagues. Many thanks; from each one of us. Jeanine Terrill Bozovich

    4月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Sherye Bronny Hermione

    4月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Shelia Franciskus Teddi

    4月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Pattie Simeon Rosella

    4月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Marybeth Nahum Fotina

    4月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Elysee Coleman Eal

    3月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Tessy Meier Erastus

    3月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Kathryne Hersch Ponce

    3月前 回复
  • Alacakaranlik Safak Vakti izle, Alacakaranlik Safak Vakti full izle, Alacakaranlik Safak Vakti t�rk�e dublaj izle, Alacakaranlik Safak Vakti hd izle, The Twilight Saga: Breaking Dawn – Part 1 izle, Sonunda iki asik bela ve edward evlenmek’dedir. Edward ile Jacop arasinda bir se�im bir se�im yapmak zorunda kalan bela tercihini tutkuyla asik oldugu edward’dan yana kullanmaktadir. Film Bela ve Edward’in �evresinde d�nerken esrarengiz olaylar olur ikili tatildeyken �ocuklarinin olacaginin farkina varir bu olay akillara sigmayacak bir sey vampir adam ve insan kani tasiyan kisin �ocuklari olmasi bu konuyu aile ile konusmak isteyen ikili bakalim ne diyecekler nasil bir durum ortaya �ikacaktir. Consuela Patty Grory

    3月前 回复
  • dakota sioux casino https://casinoonlineslots777.com free online slots vegas world

    3周前 回复

Latihas的南方孤岛

校园智慧英语辅助——自动填写单词
由于我们学校使用校园智慧英语这款app来线上检查同学们的学习情况,而默单词这一块与参考书完全一致,所以有些人左手持书右手打字,十分辛苦。为此,根据懒人创造技术定理,我设计了一款…
扫描二维码继续阅读
2020-02-28