如何检查twitch.tv中的流是否打开?

时间:2015-07-12 16:46:46

标签: java twitch

以下是我的getStream方法的代码:

public static Twitch_Stream getStream(String channelname) {
        try {
            String json = API.readJsonFromUrl("https://api.twitch.tv/kraken/streams?channel=" + channelname);

            Twitch_Stream stream = new Twitch_Stream();
            if (json.equalsIgnoreCase("[]")) {
                stream.setOnline(false);
                return stream;
            }

            JsonArray jb = gson.fromJson(json, JsonArray.class);
            if (jb.size() != 0) {
                JsonObject jo = (JsonObject) jb.get(0);
                stream.setOnline(true);
                stream.load(jo);
            }

            return stream;
        } catch (Exception error) {
            error.printStackTrace();
        }

        return null;

    }

这里是Twitch_Stream类http://pastebin.com/3RX1L1cv

的代码

当我做这样的事情时

Twitch_Stream streamer = Twitch_API.getStream("Jankos");
Bukkit.broadcastMessage("getName " + streamer.getName());
Bukkit.broadcastMessage(streamer.isOnline() + "");

streamer.getName()返回nullstreamer.isOnline()会返回false,即使流已开启。

我在哪里弄错了?

1 个答案:

答案 0 :(得分:3)

我不知道您的代码中存在什么问题,但简单的解决方法是从"https://api.twitch.tv/kraken/streams/" + channel读取格式为JSON的内容:

{
    "_links" : {
       //links to stream and channel
    },
    "stream" : {
       //details about current stream
    }
}

现在,如果stream键的值为null,则流是脱机的。如果它不为null,则为在线状态。

所以你的代码看起来像

public static void main(String[] argv) throws IOException {

    System.out.println(checkIfOnline("Jankos"));
    System.out.println(checkIfOnline("nightblue3"));

}

public static boolean checkIfOnline(String channel) throws IOException {
    String channerUrl = "https://api.twitch.tv/kraken/streams/" + channel;

    String jsonText = readFromUrl(channerUrl);// reads text from URL
    JSONObject json = new JSONObject(jsonText);

    return !json.isNull("stream");
}

private static String readFromUrl(String url) throws IOException {
    URL page = new URL(url);
    try (Stream<String> stream = new BufferedReader(new InputStreamReader(
            page.openStream(), StandardCharsets.UTF_8)).lines()) {
        return stream.collect(Collectors.joining(System.lineSeparator()));
    }
}

我使用了JSONObject库中的org.json。我也在使用Java 8及其流。

如果您想使用gson,可以使用类似

的内容
public static boolean checkIfOnline(String channel) throws IOException {
    String channerUrl = "https://api.twitch.tv/kraken/streams/" + channel;

    String jsonText = readFromUrl(channerUrl);// reads text from URL

    JsonParser parser = new JsonParser();
    JsonObject json = parser.parse(jsonText).getAsJsonObject();

    return !json.get("stream").isJsonNull();
}

如果您没有Java 8,则可以将从URL读取文本的代码重写为类似

的代码
private static String readFromUrl(String url) throws IOException {
    URL page = new URL(url);
    StringBuilder sb = new StringBuilder();
    Scanner scanner = null;
    try{
        scanner = new Scanner(page.openStream(), StandardCharsets.UTF_8.name());
        while (scanner.hasNextLine()){
            sb.append(scanner.nextLine());
        }
    }finally{
        if (scanner!=null)
            scanner.close();
    }
    return sb.toString();
}

或者从我看到的内容中,您可以使用API.readJsonFromUrl代替readFromUrl