java - 按键可多次按下

标签 java youtube

我正在尝试创建一个程序,该程序将:

  • 从直播
  • 中获取实时聊天消息
  • 如果实时聊天消息是确定的控件,请按住该键2秒钟
  • 记下该实时聊天ID,不要再次按该键。

  • 这是我到目前为止所拥有的。当我运行该程序并在聊天框中输入一个值时,它会无限按下该键并且不会停止,从而冻结了计算机。
    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.net.URL;
    import java.nio.channels.Channels;
    import java.nio.channels.ReadableByteChannel;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    
    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    
    class Game {
        String[] rawCommands = { "up", "down", "left", "right", "start", "select", "a", "b", "x", "y", "l", "r" };
        int[] transCommands = { KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C, KeyEvent.VK_D, KeyEvent.VK_E, KeyEvent.VK_F,
                KeyEvent.VK_G, KeyEvent.VK_H, KeyEvent.VK_I, KeyEvent.VK_J, KeyEvent.VK_K, KeyEvent.VK_L };
        ArrayList<String> seen = new ArrayList<String>();
    
        void main() {
            while (true) {
                HashMap<Integer, String[]> messages = listChatMessages();
    
                for (int i = 0; i < messages.size(); i++) {
                    String[] full = messages.get(i);
                    String id = full[0];
                    String msg = full[1];
    
                    Result r = oneOfManyIgnoreCase(msg, rawCommands);
                    if (r.bool) {
                        if (!oneOfManyIgnoreCase(id, seen.toArray(new String[seen.size()])).bool) {
                            int key = transCommands[Arrays.asList(rawCommands).indexOf(r.msg)];
                            keyPress(key);
                            if (seen.size() > 90) {
                                seen.remove(0);
                            }
                            seen.add(id);
                        }
                    }
                }
            }
        }
    
        void deleteChatMessage(String id) {
    
        }
    
        HashMap<Integer, String[]> listChatMessages() {
            HashMap<Integer, String[]> messages = new HashMap<>();
            try {
                URL response = new URL("https://www.googleapis.com/youtube/v3/liveChat/m"
                        + "essages?liveChatId=EiEKGFVDaUxwMWJTNFpvc2JlaHA5bHppbGNJQRIFL2xpdmU&part=sn"
                        + "ippet&key=AIzaSyAYFLriWHDy8MJZ_zblU-GuovOoqg6L-28&maxResults=200&pageToken=GKf04s3c7tcCILjGoM7c7tcC");
                ReadableByteChannel rbc = Channels.newChannel(response.openStream());
                FileOutputStream fos = new FileOutputStream("messages.json");
                fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
                fos.close();
    
                JSONParser parser = new JSONParser();
                Object obj = parser.parse(new FileReader("messages.json"));
                JSONObject jObj = (JSONObject) obj;
                JSONArray jArr = (JSONArray) jObj.get("items");
                for (int i = 0; i < jArr.size(); i++) {
                    JSONObject msg = (JSONObject) jArr.get(i);
                    JSONObject snippet = (JSONObject) msg.get("snippet");
                    JSONObject txtDetails = (JSONObject) snippet.get("textMessageDetails");
                    String[] full = new String[2];
                    full[1] = (String) txtDetails.get("messageText");
                    full[0] = (String) msg.get("id");
    
                    messages.put(i, full);
    
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return messages;
        }
    
        void keyPress(int key) {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        Robot bot = new Robot();
                        bot.setAutoDelay(1);
    
                        int duration = 3000;
                        long start = System.currentTimeMillis();
                        while (System.currentTimeMillis() - start < duration) {
                            bot.keyPress(key);
                            bot.keyRelease(key);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }).start();
        }
    
        Result oneOfManyIgnoreCase(String one, String[] many) {
            Boolean match = false;
            String message = "";
            for (String man : many) {
                if (one.equalsIgnoreCase(man)) {
                    match = true;
                    message = man;
                    break;
                }
            }
            Result r = new Result(match, message);
            return r;
        }
    }
    

    最佳答案

    下面的代码不是处理按键的好方法。通常,如果您要以编程方式按住某个键,则应使该键按下直到时间到,然后在该时间结束后等待约2毫秒,然后释放键。我认为您没有给键盘驱动程序足够的时间来处理发行版。另外。尝试只按一次按键,或者至少按需要几次。通常我认为,如果我没有记错的话,您只需要按下一次并在时间结束后释放它即可。

    while (System.currentTimeMillis() - start < duration) {
        bot.keyPress(key);
        bot.keyRelease(key);
    }
    

    关于java - 按键可多次按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47667351/

    相关文章:

    java - 如何添加-Xlint :unchecked option or any javac option in Eclipse?

    java - 如何在事件调度线程中同时运行两个组件?

    java - 如何通过 Apache HttpClient 执行以 xml 数据作为查询参数的 url?

    video - 使用youtube-dl从YouTube的每个搜索结果中下载第一个视频?

    Android:使用 DrawerLayout 和 YouTubePlayerSupportFragment

    javascript - 使用 YouTube API 创建播放列表时如何更改标题和说明?

    java - Java 中 Class 类型的可变参数

    java - 如何为 TreeViewer 启用滚动条

    reactjs - 如何在不播放Reactjs视频的情况下获得Youtube视频的时长

    api - Youtube API - 搜索多个作者/上传者?