#1 - 2024-4-9 23:23
国见佐彩 (想让世界热闹起来)
已更新,自己+好友 在看/看过/搁置/抛弃 的动画打分都参与排行
#2 - 2024-4-9 23:24
(想让世界热闹起来)
没经验,官方API不会用,笨办法搞的,面向ChatGPT编程。
(只计算好友“看过”的,搁置和抛弃没算进去,不带自己)

大概就是先在 https://bgm.tv/user/【你的id】/friends 爬到好友id
然后在 https://bgm.tv/anime/list/【每一位好友id】/collect?orderby=rate&page=【页数】 爬到这位好友所有“打过分的”条目id和给出的分数,把每位好友的打分存储到 "C:\\Users\\Admin\\Desktop\\friends_rating\\" + userId + ".txt"
读取上面所有文件并统计,输入评分人数低于多少时不参与排行榜统计,选择是否删除刚才好友评分txt文件,最后排行榜按友评从高到低排序,输出到C:\\Users\\Admin\\Desktop\\friends_rating\\ranking.txt


有两个类:
OutputFriendRatings.java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class OutputFriendRatings {
    public static void main(String[] args) {
        // 我的用户ID
        String myUserId = "650688";

        // 获取我的所有好友ID
        List<String> friendIds = getFriendIds(myUserId);

        // 遍历所有好友,查询其条目打分情况
        for (String friendId : friendIds) {
            System.out.println("正在查询好友ID:" + friendId);
            Map<String, String> ratings = getUserRatings(friendId);
            System.out.println("好友ID:" + friendId + ",条目打分情况:");
            for (Map.Entry<String, String> entry : ratings.entrySet()) {
                System.out.println(entry.getKey() + ", " + entry.getValue());
            }
            // 存储至本地文件
            saveToFile(friendId, ratings);
            // 休眠5秒钟
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // 获取我的所有好友ID
    private static List<String> getFriendIds(String userId) {
        List<String> friendIds = new ArrayList<>();
        String url = "https://bgm.tv/user/" + userId + "/friends";
        try {
            Document doc = Jsoup.connect(url).get();
            Elements users = doc.select("ul.usersMedium li.user a[href^=/user/]");
            for (Element user : users) {
                String href = user.attr("href");
                String friendId = href.substring(href.lastIndexOf("/") + 1);
                friendIds.add(friendId);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return friendIds;
    }

    // 获取用户的条目打分情况
    private static Map<String, String> getUserRatings(String userId) {
        Map<String, String> ratings = new HashMap<>();
        String baseUrl = "https://bgm.tv/anime/list/";
        int page = 1;
        while (true) {
            String url = baseUrl + userId + "/collect?orderby=rate&page=" + page;
            try {
                Document doc = Jsoup.connect(url).get();
                Elements items = doc.select("li.item");
                if (items.isEmpty()) {
                    break;
                }
                for (Element item : items) {
                    Element link = item.selectFirst("a[href^=/subject/]");
                    Element titleElement = item.selectFirst("a.l");
                    Element subTitleElement = item.selectFirst("small.grey");
                    Element ratingElement = item.selectFirst("span.starstop-s > span.starlight");
                    if (ratingElement != null) {
                        String href = link.attr("href");
                        String entryId = href.substring(href.lastIndexOf("/") + 1);
                        String title = (titleElement != null) ? titleElement.text() : "";
                        String subTitle = (subTitleElement != null) ? subTitleElement.text() : "";
                        int rating = extractRating(ratingElement);
                        ratings.put(entryId, title + " " + subTitle + " 评分:" + rating);
                    }
                }
                page++;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return ratings;
    }

    // 提取评分
    private static int extractRating(Element ratingElement) {
        String classAttribute = ratingElement.attr("class");
        String ratingText = classAttribute.substring(classAttribute.lastIndexOf("stars") + 5);
        return Integer.parseInt(ratingText);
    }

    // 将用户的条目打分情况存储至本地文件
    private static void saveToFile(String userId, Map<String, String> ratings) {
        String fileName = "C:\\Users\\Admin\\Desktop\\friends_rating\\" + userId + ".txt";
        try (FileWriter writer = new FileWriter(fileName)) {
            for (Map.Entry<String, String> entry : ratings.entrySet()) {
                writer.write(entry.getKey() + ", " + entry.getValue() + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("用户ID:" + userId + " 的条目打分情况已存储至本地文件:" + fileName);
    }
}





ReadFilesOutputRankingList.java



import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class ReadFilesOutputRankingList {
    public static void main(String[] args) {
        // 获取用户输入的评分人数阈值
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入评分人数阈值:");
        int threshold = scanner.nextInt();

        // 读取所有用户评分文件
        Map<String, WebCrawler.RatingInfo> ratingsMap = readRatingsFiles("C:\\Users\\Admin\\Desktop\\friends_rating");

        // 过滤评分人数低于阈值的条目
        filterByThreshold(ratingsMap, threshold);

        // 统计每个条目的平均评分和评分人数
        Map<String, Double> averageRatings = calculateAverageRatings(ratingsMap);

        // 对所有条目按照平均评分进行排序
        TreeMap<String, Double> sortedRatings = sortByAverageRating(averageRatings);

        // 输出排行榜到 txt 文件中
        outputRankingToFile(sortedRatings, ratingsMap, "C:\\Users\\Admin\\Desktop\\ranking.txt");

        // 询问用户是否删除所有用户打分文件
        System.out.print("是否删除所有用户打分文件?(Y/N):");
        String response = scanner.next();
        if (response.equalsIgnoreCase("Y")) {
            deleteAllRatingFiles("C:\\Users\\Admin\\Desktop\\friends_rating");
        }
    }

    // 读取所有用户评分文件
    private static Map<String, WebCrawler.RatingInfo> readRatingsFiles(String directoryPath) {
        Map<String, WebCrawler.RatingInfo> ratingsMap = new HashMap<>();
        File directory = new File(directoryPath);
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    String userId = file.getName().replace(".txt", "");
                    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
                        String line;
                        while ((line = br.readLine()) != null) {
                            String[] parts = line.split(", ", 2);
                            String entryId = parts[0];
                            String ratingInfo = parts[1];
                            ratingsMap.putIfAbsent(entryId, new WebCrawler.RatingInfo());
                            ratingsMap.get(entryId).addRating(userId, ratingInfo);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return ratingsMap;
    }

    // 过滤评分人数低于阈值的条目
    private static void filterByThreshold(Map<String, WebCrawler.RatingInfo> ratingsMap, int threshold) {
        ratingsMap.entrySet().removeIf(entry -> entry.getValue().getTotalUsers() < threshold);
    }

    // 统计每个条目的平均评分和评分人数
    private static Map<String, Double> calculateAverageRatings(Map<String, WebCrawler.RatingInfo> ratingsMap) {
        Map<String, Double> averageRatings = new HashMap<>();
        for (Map.Entry<String, WebCrawler.RatingInfo> entry : ratingsMap.entrySet()) {
            double totalRating = entry.getValue().getTotalRating();
            int totalUsers = entry.getValue().getTotalUsers();
            double averageRating = (totalUsers > 0) ? totalRating / totalUsers : 0;
            // 保留四位小数
            averageRatings.put(entry.getKey(), Math.round(averageRating * 10000.0) / 10000.0);
        }
        return averageRatings;
    }

    // 对所有条目按照平均评分进行排序
    private static TreeMap<String, Double> sortByAverageRating(Map<String, Double> averageRatings) {
        TreeMap<String, Double> sortedRatings = new TreeMap<>((o1, o2) -> {
            double result = averageRatings.get(o2) - averageRatings.get(o1);
            return (result != 0) ? (int) Math.signum(result) : o1.compareTo(o2);
        });
        sortedRatings.putAll(averageRatings);
        return sortedRatings;
    }

    // 输出排行榜到 txt 文件中
    private static void outputRankingToFile(TreeMap<String, Double> sortedRatings, Map<String, WebCrawler.RatingInfo> ratingsMap, String filePath) {
        try (FileWriter writer = new FileWriter(filePath)) {
            for (Map.Entry<String, Double> entry : sortedRatings.entrySet()) {
                String entryId = entry.getKey();
                double averageRating = entry.getValue();
                WebCrawler.RatingInfo ratingInfo = ratingsMap.get(entryId);
                String titleAndSubtitle = ratingInfo.getTitleAndSubtitle();
                int totalUsers = ratingInfo.getTotalUsers();
                writer.write("https://bgm.tv/subject/" + entryId + "   " + titleAndSubtitle + ", 平均分数: " + averageRating + ", 评分人数: " + totalUsers + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("排行榜已输出至文件:" + filePath);
    }

    // 删除所有用户打分文件
    private static void deleteAllRatingFiles(String directoryPath) {
        File directory = new File(directoryPath);
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    file.delete();
                }
            }
        }
        System.out.println("所有用户打分文件已删除");
    }

    // 内部类用于保存条目的评分信息
    static class RatingInfo {
        private double totalRating;
        private int totalUsers;
        private String titleAndSubtitle;

        public RatingInfo() {
            totalRating = 0;
            totalUsers = 0;
        }

        public void addRating(String userId, String ratingInfo) {
            totalRating += extractRating(ratingInfo);
            totalUsers++;
            if (titleAndSubtitle == null) {
                titleAndSubtitle = extractTitleAndSubtitle(ratingInfo);
            }
        }

        public double getTotalRating() {
            return totalRating;
        }

        public int getTotalUsers() {
            return totalUsers;
        }

        public String getTitleAndSubtitle() {
            return (titleAndSubtitle != null) ? titleAndSubtitle : "";
        }

        private double extractRating(String ratingInfo) {
            String ratingText = ratingInfo.substring(ratingInfo.lastIndexOf(":") + 1);
            return Double.parseDouble(ratingText);
        }

        private String extractTitleAndSubtitle(String ratingInfo) {
            return ratingInfo.substring(0, ratingInfo.lastIndexOf("评分:") - 1);
        }
    }

}
#3 - 2024-4-9 23:28
(想让世界热闹起来)
上面的输出格式如下,保留四位小数,这是我3人及以上


https://bgm.tv/subject/67753  明日之丈2 あしたのジョー2, 平均分数: 9.4, 评分人数: 5
https://bgm.tv/subject/23304  传说巨神伊迪安 发动篇 伝説巨神イデオン 発動篇, 平均分数: 9.3333, 评分人数: 6
https://bgm.tv/subject/326  攻壳机动队 S.A.C. 2nd GIG 攻殻機動隊 S.A.C. 2nd GIG, 平均分数: 9.2941, 评分人数: 17
https://bgm.tv/subject/6049  新世纪福音战士剧场版 Air/真心为你 新世紀エヴァンゲリオン劇場版 Air/まごころを、君に, 平均分数: 9.1463, 评分人数: 41
https://bgm.tv/subject/876  CLANNAD 〜AFTER STORY〜 , 平均分数: 9.1053, 评分人数: 38
https://bgm.tv/subject/253  星际牛仔 カウボーイビバップ, 平均分数: 9.0294, 评分人数: 34
https://bgm.tv/subject/4019  四叠半神话大系 四畳半神話大系, 平均分数: 9.0278, 评分人数: 36
https://bgm.tv/subject/112419  种树的牧羊人 L'homme qui plantait des arbres, 平均分数: 9.0, 评分人数: 4
https://bgm.tv/subject/3553  ∀高达 ∀ガンダム, 平均分数: 9.0, 评分人数: 7
https://bgm.tv/subject/9622  机动战士Z高达 機動戦士Ζガンダム, 平均分数: 9.0, 评分人数: 9
https://bgm.tv/subject/1453  少女革命 少女革命ウテナ, 平均分数: 8.9286, 评分人数: 14
https://bgm.tv/subject/25961  猫和老鼠 Tom and Jerry, 平均分数: 8.9259, 评分人数: 27
https://bgm.tv/subject/237  攻壳机动队 GHOST IN THE SHELL / 攻殻機動隊, 平均分数: 8.88, 评分人数: 25
https://bgm.tv/subject/265  新世纪福音战士 新世紀エヴァンゲリオン, 平均分数: 8.875, 评分人数: 48
https://bgm.tv/subject/9717  魔法少女小圆 魔法少女まどか☆マギカ, 平均分数: 8.8679, 评分人数: 53
https://bgm.tv/subject/324  攻壳机动队 STAND ALONE COMPLEX 攻殻機動隊 STAND ALONE COMPLEX, 平均分数: 8.8571, 评分人数: 21
#4 - 2024-4-9 23:30
(心脏要逃走了。)
支持(bgm45)
#4-1 - 2024-4-9 23:32
国见佐彩
对bangumi发动ddos攻击(bgm38)
#4-2 - 2024-4-9 23:34
Sora
国见佐彩 说: 对bangumi发动ddos攻击
走api会更好一些(bgm38)一次50个,你可以看下api文档然后喂给gpt就行了https://bangumi.github.io/api/
#4-3 - 2024-4-9 23:43
国见佐彩
Sora 说: 走api会更好一些一次50个,你可以看下api文档然后喂给gpt就行了https://bangumi.github.io/api/
懂了 这个方便好多
#5 - 2024-4-9 23:35
(混沌邪恶中。。。)
长见识了,Java爬虫
#6 - 2024-4-10 07:16
(この世のすべては、あなたを追いつめる为にある)
支持
#7 - 2024-4-10 07:27
(中华)
java爬虫,帖子里放代码,真是有点gpt的美
#8 - 2024-4-10 18:42
(想让世界热闹起来)
已更新。好友是爬出来的,查询友评用的API,快了不少。
这次包括了自己和所有好友 在看/看过/搁置/抛弃 的打分,只查动画。


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.boot.configurationprocessor.json.JSONArray;
import org.springframework.boot.configurationprocessor.json.JSONException;
import org.springframework.boot.configurationprocessor.json.JSONObject;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;

public class Main {
   
   
    //获取友评排行榜并保存本地文件(包括自己)(包括在看、看过、搁置、抛弃)
    public static void main(String[] args) {

        Scanner scanner1 = new Scanner(System.in);
        Scanner scanner2 = new Scanner(System.in);
        Scanner scanner3 = new Scanner(System.in);
        Scanner scanner4 = new Scanner(System.in);

        // 用户ID
        System.out.println("请输入要查询友评榜的用户ID: ");
        String userId = scanner1.nextLine();

        // 请求URL
        String baseUrl = "https://api.bgm.tv/v0/users/";

        // 用户代理
        String userAgent = "650688/my-private-project";

        System.out.println("请输入您的Access Token: ");
        System.out.println("(请在该网址获取: https://next.bgm.tv/demo/access-token)");
        // 请求头部信息
        //String token = "";
        String token = scanner2.nextLine();

        // 用户输入低于多少人评分的动画条目从最终排行榜中删除
        System.out.print("请输入低于多少人评分的动画条目将被删除:");
        int threshold = scanner3.nextInt();

        System.out.println();

        // 获取用户好友ID列表
        List<String> friendIds = getFriendIds(userId);

        // 创建Map存储动画信息及好友评分
        Map<Integer, Animation> animationMap = new HashMap<>();

        // 遍历好友ID,获取每个好友对动画的评分情况
        int no = 1;
        for (String friendId : friendIds) {
            System.out.println("正在查询第" + no + "位用户,ID: " + friendId + " 对动画的评分...");
            no++;

            // 遍历type为2、3、4、5的情况
            for (int type = 2; type <= 5; type++) {
                // 分页参数
                int offset = 0;
                boolean hasNextPage = true;

                // 发起请求直到没有下一页为止
                while (hasNextPage) {
                    try {
                        // 构建完整的请求URL
                        String fullUrl = baseUrl + friendId + "/collections?subject_type=2&limit=50&type=" + type + "&offset=" + offset;
                        URL url = new URL(fullUrl);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                        // 设置请求方法和请求头部信息
                        conn.setRequestMethod("GET");
                        conn.setRequestProperty("User-Agent", userAgent);
                        conn.setRequestProperty("Authorization", "Bearer " + token);

                        // 获取响应码
                        int responseCode = conn.getResponseCode();
                        if (responseCode == HttpURLConnection.HTTP_OK) {
                            // 读取响应内容
                            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                            StringBuilder response = new StringBuilder();
                            String inputLine;
                            while ((inputLine = in.readLine()) != null) {
                                response.append(inputLine);
                            }
                            in.close();

                            // 解析JSON响应
                            JSONObject jsonResponse = new JSONObject(response.toString());
                            JSONArray data = jsonResponse.getJSONArray("data");

                            // 遍历动画信息
                            for (int i = 0; i < data.length(); i++) {
                                JSONObject item = data.getJSONObject(i);
                                int score = item.optInt("rate", 0);

                                // 如果分数不为0,则处理该动画信息
                                if (score != 0) {
                                    int subjectId = item.getInt("subject_id");

                                    // 如果该动画信息已存在,则更新好友评分
                                    if (animationMap.containsKey(subjectId)) {
                                        Animation animation = animationMap.get(subjectId);
                                        animation.addFriendRating(friendId, score);
                                    } else {
                                        String subjectName = item.getJSONObject("subject").getString("name");
                                        String subjectNameCN = item.getJSONObject("subject").optString("name_cn", "");

                                        // 创建Animation对象并添加到Map
                                        Animation animation = new Animation(subjectId, subjectName, subjectNameCN);
                                        animation.addFriendRating(friendId, score);
                                        animationMap.put(subjectId, animation);
                                    }
                                }
                            }

                            // 更新分页参数
                            offset += jsonResponse.getInt("limit");
                            if (offset >= jsonResponse.getInt("total")) {
                                hasNextPage = false;
                            }
                        } else {
                            // 打印错误信息
                            System.out.println("Error: " + responseCode);
                        }

                        // 关闭连接
                        conn.disconnect();
                    } catch (IOException | JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        // 统计平均分数并排序
        List<Animation> sortedAnimations = calculateAndSortAverage(animationMap);

//        // 控制台输出排行榜
//        System.out.println("动画排行榜:");
//        for (int i = 0; i < sortedAnimations.size(); i++) {
//            Animation animation = sortedAnimations.get(i);
//            System.out.println("排名:" + (i + 1));
//            System.out.println("动画ID:" + animation.getSubjectId());
//            System.out.println("动画原名:" + animation.getSubjectName());
//            System.out.println("动画中文名:" + animation.getSubjectNameCN());
//            System.out.println("参与评分的好友人数:" + animation.getFriendRatings().size());
//            System.out.println("平均分数:" + animation.getAverageScore());
//            System.out.println();
//        }


//        // 用户输入低于多少人评分的动画条目从排行榜中删除
//        Scanner scanner = new Scanner(System.in);
//        System.out.print("请输入低于多少人评分的动画条目将被删除:");
//        int threshold = scanner.nextInt();

        // 删除低于阈值的动画条目
        sortedAnimations.removeIf(animation -> animation.getFriendRatings().size() < threshold);

        // 保存排行榜到本地文件
        saveRankingToFile(sortedAnimations, "C:\\Users\\Admin\\Desktop\\ranking.txt");
        System.out.println("友评榜已保存到 C:\\Users\\Admin\\Desktop\\ranking.txt ");
    }

    // 获取用户好友ID列表
    private static List<String> getFriendIds(String userId) {
        List<String> friendIds = new ArrayList<>();
        //把自己加入好友列表中,因为自己也参与友评榜计算
        friendIds.add(userId);
        // 目标网址
        String url = "https://bgm.tv/user/" + userId + "/friends";
        try {
            // 使用Jsoup库获取网页内容
            Document doc = Jsoup.connect(url).get();
            // 选择所有类似于<ul class="usersMedium">下的<li class="user">元素
            Elements users = doc.select("ul.usersMedium li.user a[href^=/user/]");

            // 遍历所有用户元素
            for (Element user : users) {
                // 获取用户链接中的 href 属性值
                String href = user.attr("href");
                // 从链接中提取用户ID部分
                String friendId = href.substring(href.lastIndexOf("/") + 1);
                // 添加好友ID到列表
                friendIds.add(friendId);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return friendIds;
    }

    // 计算平均分数并排序
    private static List<Animation> calculateAndSortAverage(Map<Integer, Animation> animationMap) {
        List<Animation> animations = new ArrayList<>(animationMap.values());
        // 计算每个动画的平均分数
        for (Animation animation : animations) {
            animation.calculateAverageScore();
        }
        // 根据平均分数排序
        animations.sort((a1, a2) -> Double.compare(a2.getAverageScore(), a1.getAverageScore()));
        return animations;
    }

    // 保存排行榜到本地文件
    private static void saveRankingToFile(List<Animation> animations, String filePath) {
        try (PrintWriter writer = new PrintWriter(filePath)) {
            for (Animation animation : animations) {
                writer.print("https://bgm.tv/subject/" + animation.getSubjectId() + "   ");
                writer.print("排名:" + (animations.indexOf(animation) + 1) + "   ");
                writer.print("" + animation.getSubjectName() + "   ");
                writer.print("" + animation.getSubjectNameCN() + "   ");
                writer.print("评分人数:" + animation.getFriendRatings().size() + "   ");

                //平均分保留四位小数
                double averageScore = animation.getAverageScore();
                String formatted = String.format("%.4f", averageScore);
                writer.println("平均分数:" + formatted);

                //writer.println("平均分数:" + animation.getAverageScore() + "");


                //writer.println();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

// 定义动画类
class Animation {
    private int subjectId;
    private String subjectName;
    private String subjectNameCN;
    private Map<String, Integer> friendRatings;
    private double averageScore;

    public Animation(int subjectId, String subjectName, String subjectNameCN) {
        this.subjectId = subjectId;
        this.subjectName = subjectName;
        this.subjectNameCN = subjectNameCN;
        this.friendRatings = new HashMap<>();
    }

    public int getSubjectId() {
        return subjectId;
    }

    public String getSubjectName() {
        return subjectName;
    }

    public String getSubjectNameCN() {
        return subjectNameCN;
    }

    public Map<String, Integer> getFriendRatings() {
        return friendRatings;
    }

    public double getAverageScore() {
        return averageScore;
    }

    public void addFriendRating(String friendId, int score) {
        friendRatings.put(friendId, score);
    }

    public void calculateAverageScore() {
        if (friendRatings.isEmpty()) {
            averageScore = 0.0;
        } else {
            int sum = friendRatings.values().stream().mapToInt(Integer::intValue).sum();
            averageScore = (double) sum / friendRatings.size();
        }
    }
}
#9 - 2024-4-10 18:47
(想让世界热闹起来)
这次输出格式如下:
https://bgm.tv/subject/67753   排名:1   あしたのジョー2   明日之丈2   评分人数:5   平均分数:9.4000
https://bgm.tv/subject/23304   排名:2   伝説巨神イデオン 発動篇   传说巨神伊迪安 发动篇   评分人数:6   平均分数:9.3333
https://bgm.tv/subject/326   排名:3   攻殻機動隊 S.A.C. 2nd GIG   攻壳机动队 S.A.C. 2nd GIG   评分人数:20   平均分数:9.2500
https://bgm.tv/subject/6049   排名:4   新世紀エヴァンゲリオン劇場版 Air/まごころを、君に   新世纪福音战士剧场版 Air/真心为你   评分人数:42   平均分数:9.1429
https://bgm.tv/subject/876   排名:5   CLANNAD 〜AFTER STORY〜      评分人数:39   平均分数:9.0769
https://bgm.tv/subject/3553   排名:6   ∀ガンダム   ∀高达   评分人数:8   平均分数:9.0000
https://bgm.tv/subject/4019   排名:7   四畳半神話大系   四叠半神话大系   评分人数:37   平均分数:9.0000
https://bgm.tv/subject/112419   排名:8   L'homme qui plantait des arbres   种树的牧羊人   评分人数:4   平均分数:9.0000
https://bgm.tv/subject/253   排名:9   カウボーイビバップ   星际牛仔   评分人数:36   平均分数:8.9722
https://bgm.tv/subject/25961   排名:10   Tom and Jerry   猫和老鼠   评分人数:27   平均分数:8.9259
https://bgm.tv/subject/9622   排名:11   機動戦士Ζガンダム   机动战士Z高达   评分人数:10   平均分数:8.9000
https://bgm.tv/subject/9717   排名:12   魔法少女まどか☆マギカ   魔法少女小圆   评分人数:55   平均分数:8.8909
https://bgm.tv/subject/324   排名:13   攻殻機動隊 STAND ALONE COMPLEX   攻壳机动队 STAND ALONE COMPLEX   评分人数:23   平均分数:8.8696
https://bgm.tv/subject/237   排名:14   GHOST IN THE SHELL / 攻殻機動隊   攻壳机动队   评分人数:27   平均分数:8.8519
https://bgm.tv/subject/3375   排名:15   涼宮ハルヒの消失   凉宫春日的消失   评分人数:47   平均分数:8.8511
https://bgm.tv/subject/263750   排名:16   進撃の巨人 Season 3 Part.2   进击的巨人 第三季 Part.2   评分人数:42   平均分数:8.8333
https://bgm.tv/subject/52787   排名:17   ブラック・ジャック OVA   怪医黑杰克 OVA   评分人数:6   平均分数:8.8333
https://bgm.tv/subject/1270   排名:18   ARIA The ORIGINATION   水星领航员 第三季   评分人数:11   平均分数:8.8182
https://bgm.tv/subject/321   排名:19   機動警察パトレイバー 2 the Movie   机动警察 和平保卫战   评分人数:16   平均分数:8.8125
https://bgm.tv/subject/93739   排名:20   ピンポン THE ANIMATION   乒乓   评分人数:37   平均分数:8.8108
https://bgm.tv/subject/40003   排名:21   うる星やつら2 ビューティフル・ドリーマー   福星小子2 绮丽梦中人   评分人数:10   平均分数:8.8000
https://bgm.tv/subject/265   排名:22   新世紀エヴァンゲリオン   新世纪福音战士   评分人数:50   平均分数:8.7800
https://bgm.tv/subject/216371   排名:23   リズと青い鳥   莉兹与青鸟   评分人数:47   平均分数:8.7660
https://bgm.tv/subject/66244   排名:24   Fantasia 2000   幻想曲2000   评分人数:4   平均分数:8.7500
https://bgm.tv/subject/103906   排名:25   PSYCHO-PASS サイコパス 新編集版   心理测量者 新编集版   评分人数:4   平均分数:8.7500
https://bgm.tv/subject/1453   排名:26   少女革命ウテナ   少女革命   评分人数:15   平均分数:8.7333
https://bgm.tv/subject/44693   排名:27   劇場版 魔法少女まどか☆マギカ [新編] 叛逆の物語   剧场版 魔法少女小圆 [新篇] 叛逆的物语   评分人数:41   平均分数:8.7317
https://bgm.tv/subject/1976   排名:28   精霊の守り人   精灵守护者   评分人数:3   平均分数:8.6667
https://bgm.tv/subject/10404   排名:29   あしたのジョー   明日之丈   评分人数:6   平均分数:8.6667
https://bgm.tv/subject/118098   排名:30   劇場版 シドニアの騎士   剧场版 希德尼娅的骑士   评分人数:3   平均分数:8.6667
https://bgm.tv/subject/1428   排名:31   鋼の錬金術師 FULLMETAL ALCHEMIST   钢之炼金术师 FULLMETAL ALCHEMIST   评分人数:30   平均分数:8.6333
https://bgm.tv/subject/839   排名:32   PERFECT BLUE   蓝色恐惧   评分人数:35   平均分数:8.6286
https://bgm.tv/subject/1728   排名:33   るろうに剣心 -明治剣客浪漫譚- 追憶編   浪客剑心 追忆篇   评分人数:24   平均分数:8.6250
https://bgm.tv/subject/10380   排名:34   STEINS;GATE   命运石之门   评分人数:54   平均分数:8.6111
https://bgm.tv/subject/41568   排名:35   ちはやふる2   歌牌情缘2   评分人数:5   平均分数:8.6000
https://bgm.tv/subject/8986   排名:36   クレヨンしんちゃん 嵐を呼ぶ モーレツ!オトナ帝国の逆襲   蜡笔小新 呼风唤雨!大人帝国的反击   评分人数:10   平均分数:8.6000
https://bgm.tv/subject/56847   排名:37   かぐや姫の物語   辉夜姬物语   评分人数:17   平均分数:8.5882
https://bgm.tv/subject/211567   排名:38   3月のライオン 第2シリーズ   3月的狮子 第二季   评分人数:24   平均分数:8.5833
https://bgm.tv/subject/1856   排名:39   十二国記   十二国记   评分人数:7   平均分数:8.5714
https://bgm.tv/subject/340   排名:40   蟲師   虫师   评分人数:18   平均分数:8.5556
https://bgm.tv/subject/4583   排名:41   機動戦士ガンダム 逆襲のシャア   机动战士高达 逆袭的夏亚   评分人数:9   平均分数:8.5556
https://bgm.tv/subject/238   排名:42   イノセンス   攻壳机动队2 无罪   评分人数:20   平均分数:8.5500
https://bgm.tv/subject/311   排名:43   千と千尋の神隠し   千与千寻   评分人数:48   平均分数:8.5417
https://bgm.tv/subject/493   排名:44   HELLSING OVA   皇家国教骑士团 OVA   评分人数:14   平均分数:8.5000
https://bgm.tv/subject/214824   排名:45   魔法のスターマジカルエミ 蝉時雨   魔法之星爱美 蝉时雨   评分人数:4   平均分数:8.5000
https://bgm.tv/subject/2496   排名:46   モノノ怪   物怪   评分人数:6   平均分数:8.5000
https://bgm.tv/subject/2531   排名:47   空中ブランコ   空中秋千   评分人数:4   平均分数:8.5000
https://bgm.tv/subject/4124   排名:48   ハートキャッチプリキュア!   Heart Catch 光之美少女!   评分人数:4   平均分数:8.5000
https://bgm.tv/subject/112397   排名:49   Yellow Submarine   黄色潜水艇   评分人数:4   平均分数:8.5000
https://bgm.tv/subject/840   排名:50   千年女優   千年女优   评分人数:36   平均分数:8.4722
#10 - 2024-4-10 19:20
(啊呜...)
review 完的几点建议
1. 不建议在BGM贴代码,可以贴到一些代码网站再复制链接过来,例如gist。或者直接发你的project github repo
2. 基本上上面所有注释都是废注释,没意义。
3. 那个while true真的会DDOS bgm,别这样做
4. 引入spring boot只是为了个JSON库没多大必要。
#10-1 - 2024-4-10 19:39
国见佐彩
多谢。gist是这个吗? https://gist.github.com/
在别的项目里直接加的,不太好用也没啥功能就随便搞了。明天再改改,有必要的话打个包。
#10-2 - 2024-4-10 20:09
降龙十八掌
国见佐彩 说: 多谢。gist是这个吗? https://gist.github.com/
在别的项目里直接加的,不太好用也没啥功能就随便搞了。明天再改改,有必要的话打个包。
不是程序猿的话也没人会在电脑上装java环境吧(bgm38)
#11 - 2024-4-11 21:31
(心脏要逃走了。)
做了个油猴脚本,对普通用户应该好一些,明天发出来(bgm26)