commit
b286b8ae8f
|
@ -0,0 +1,3 @@
|
||||||
|
.idea/
|
||||||
|
out/
|
||||||
|
*.iml
|
|
@ -0,0 +1,2 @@
|
||||||
|
房,彩礼,单身,火了,专家,谣言,彩票,
|
||||||
|
张艺谋,郭德纲,贾玲
|
|
@ -0,0 +1,55 @@
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
public class EditFrame extends JFrame {
|
||||||
|
|
||||||
|
public EditFrame(String title, String fileName) {
|
||||||
|
setTitle(title);
|
||||||
|
setSize(300,300);
|
||||||
|
setIconImage(new ImageIcon("icon.jpg").getImage());
|
||||||
|
|
||||||
|
File file = new File(fileName);
|
||||||
|
|
||||||
|
JTextArea jta = new JTextArea();
|
||||||
|
jta.setLineWrap(true);
|
||||||
|
|
||||||
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
|
||||||
|
String tmp;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
while ((tmp = reader.readLine()) != null) {
|
||||||
|
sb.append(tmp).append("\n");
|
||||||
|
}
|
||||||
|
jta.setText(sb.toString());
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
JPanel bottom = new JPanel();
|
||||||
|
JButton ok = new JButton("确认");
|
||||||
|
ok.setBackground(Color.white);
|
||||||
|
JButton cancel = new JButton("取消");
|
||||||
|
cancel.setBackground(Color.white);
|
||||||
|
bottom.add(ok);
|
||||||
|
bottom.add(cancel);
|
||||||
|
|
||||||
|
setLocationRelativeTo(null);
|
||||||
|
getContentPane().add(jta, BorderLayout.CENTER);
|
||||||
|
getContentPane().add(bottom, BorderLayout.SOUTH);
|
||||||
|
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||||
|
|
||||||
|
ok.addActionListener(e -> {
|
||||||
|
try (FileWriter writer = new FileWriter(file, StandardCharsets.UTF_8)){
|
||||||
|
writer.write(jta.getText());
|
||||||
|
writer.flush();
|
||||||
|
NewsComparator.reloadConfig();
|
||||||
|
NewsPredicate.reloadConfig();
|
||||||
|
} catch (IOException ioException) {
|
||||||
|
ioException.printStackTrace();
|
||||||
|
}
|
||||||
|
dispose();
|
||||||
|
});
|
||||||
|
cancel.addActionListener(e -> dispose());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: RunToday
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新闻比较器:用于筛选出高价值的新闻
|
||||||
|
*/
|
||||||
|
public class NewsComparator implements Comparator<OneNews> {
|
||||||
|
|
||||||
|
public static String[] valueInits;
|
||||||
|
/*= new String[]{
|
||||||
|
"救","华春莹", "外交部", "雨", "雪"
|
||||||
|
};*/
|
||||||
|
|
||||||
|
static {
|
||||||
|
reloadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reloadConfig(){
|
||||||
|
File file = new File("order.txt");
|
||||||
|
|
||||||
|
if (!file.exists()) {
|
||||||
|
try {
|
||||||
|
file.createNewFile();
|
||||||
|
} catch (IOException ioException) {
|
||||||
|
ioException.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
|
||||||
|
String tmp;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
while ((tmp = reader.readLine()) != null) {
|
||||||
|
sb.append(tmp).append("\n");
|
||||||
|
}
|
||||||
|
valueInits = sb.toString().split(",");
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(OneNews o1, OneNews o2) {
|
||||||
|
return o2.getValue() - o1.getValue();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新闻过滤器:用于过滤无意义的 与 令人反感的新闻
|
||||||
|
*/
|
||||||
|
public class NewsPredicate implements Predicate<OneNews> {
|
||||||
|
|
||||||
|
public static String[] banKeys;
|
||||||
|
/*= new String[]{
|
||||||
|
// 社会类
|
||||||
|
"房", "彩礼", "单身",
|
||||||
|
// 无意义炒作
|
||||||
|
"火了", "专家", "谣言", "彩票",
|
||||||
|
// 人物类
|
||||||
|
"张艺谋", "郭德纲", "贾玲"
|
||||||
|
};*/
|
||||||
|
|
||||||
|
static {
|
||||||
|
reloadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reloadConfig(){
|
||||||
|
File file = new File("banned.txt");
|
||||||
|
|
||||||
|
if (!file.exists()) {
|
||||||
|
try {
|
||||||
|
file.createNewFile();
|
||||||
|
} catch (IOException ioException) {
|
||||||
|
ioException.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
|
||||||
|
String tmp;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
while ((tmp = reader.readLine()) != null) {
|
||||||
|
sb.append(tmp).append("\n");
|
||||||
|
}
|
||||||
|
banKeys = sb.toString().split(",");
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(OneNews oneNews) {
|
||||||
|
if (banKeys.length == 1 && banKeys[0].equals("")) return true;
|
||||||
|
for (String banKey : banKeys) {
|
||||||
|
// 如果存在禁词,则拒绝此条
|
||||||
|
if (oneNews.getTitle().contains(banKey)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 无禁词,默认通过
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
|
||||||
|
public class OneNews {
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
private int value;
|
||||||
|
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUrl() {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUrl(String url) {
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContent(String content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "OneNews{" +
|
||||||
|
"title='" + title + '\'' +
|
||||||
|
", url='" + url + '\'' +
|
||||||
|
", content='" + content + '\'' +
|
||||||
|
", value=" + value +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.plaf.basic.BasicScrollBarUI;
|
||||||
|
import javax.swing.plaf.metal.MetalScrollBarUI;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CREATED BY liusu
|
||||||
|
*/
|
||||||
|
public class RunToday{
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
|
JFrame jf = new JFrame("kawachi 前线新闻");
|
||||||
|
jf.setSize(700,600);
|
||||||
|
jf.setIconImage(new ImageIcon("icon.jpg").getImage());
|
||||||
|
|
||||||
|
JToolBar toolBar = new JToolBar();
|
||||||
|
JButton fresh = new JButton("刷新");
|
||||||
|
JButton editBanned = new JButton("过滤");
|
||||||
|
JButton editOrder = new JButton("排序");
|
||||||
|
JButton author = new JButton("关于");
|
||||||
|
toolBar.add(fresh);
|
||||||
|
toolBar.add(editBanned);
|
||||||
|
toolBar.add(editOrder);
|
||||||
|
toolBar.add(author);
|
||||||
|
toolBar.setFloatable(false);
|
||||||
|
|
||||||
|
JPanel panel = new JPanel();
|
||||||
|
panel.setLayout(new GridLayout(0, 1));
|
||||||
|
|
||||||
|
drawPanel(getList(), panel);
|
||||||
|
|
||||||
|
JScrollPane scrollPane = new JScrollPane(panel);
|
||||||
|
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
|
||||||
|
|
||||||
|
scrollPane.getVerticalScrollBar().setUI(new BasicScrollBarUI() {
|
||||||
|
@Override
|
||||||
|
protected void configureScrollBarColors() {
|
||||||
|
this.thumbColor = Color.PINK;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jf.add(toolBar, BorderLayout.NORTH);
|
||||||
|
jf.add(scrollPane, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
jf.setLocationRelativeTo(null);
|
||||||
|
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||||
|
jf.setVisible(true);
|
||||||
|
|
||||||
|
fresh.addActionListener( e ->
|
||||||
|
{
|
||||||
|
panel.removeAll();
|
||||||
|
panel.updateUI();
|
||||||
|
try {
|
||||||
|
drawPanel(getList(), panel);
|
||||||
|
} catch (URISyntaxException | IOException uriSyntaxException) {
|
||||||
|
uriSyntaxException.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
SwingUtilities.invokeLater(() -> scrollPane.getVerticalScrollBar().setValue(0));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
editBanned.addActionListener(e -> {
|
||||||
|
new EditFrame("编辑过滤器", "banned.txt").setVisible(true);
|
||||||
|
});
|
||||||
|
editOrder.addActionListener(e -> {
|
||||||
|
new EditFrame("编辑排序器", "order.txt").setVisible(true);
|
||||||
|
});
|
||||||
|
author.addActionListener(e -> {
|
||||||
|
JOptionPane.showMessageDialog(null, "<html>作者: 时光潜流<br/></html>名称: kawachi 前线新闻");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<OneNews> getList() throws URISyntaxException, IOException {
|
||||||
|
URL url = new URI("https://top.baidu.com/board?tab=realtime").toURL();
|
||||||
|
URLConnection urlConnection = url.openConnection();
|
||||||
|
HttpURLConnection conn = (HttpURLConnection) urlConnection;
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))){
|
||||||
|
String tmp;
|
||||||
|
while ((tmp = br.readLine()) != null) {
|
||||||
|
sb.append(tmp);
|
||||||
|
}
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
List<OneNews> list = new LinkedList<>();
|
||||||
|
|
||||||
|
Pattern patternTitle = Pattern.compile("<div class=\"c-single-text-ellipsis\">(.+?) </div>");
|
||||||
|
Pattern patternUrl = Pattern.compile("<a[^>]*href=\"([^\"]*)\".class=\"title_dIF3B.*?>");
|
||||||
|
Pattern patternContent = Pattern.compile("<!--s-frag-->[^\"].*?<div class=\".*? \">[^\"](.*?)<");
|
||||||
|
Matcher m1 = patternTitle.matcher(sb);
|
||||||
|
Matcher m2 = patternUrl.matcher(sb);
|
||||||
|
Matcher m3 = patternContent.matcher(sb);
|
||||||
|
while (m1.find() && m2.find() && m3.find()){
|
||||||
|
OneNews tmp = new OneNews();
|
||||||
|
|
||||||
|
tmp.setTitle(m1.group(1).trim());
|
||||||
|
tmp.setUrl(m2.group(1).trim());
|
||||||
|
tmp.setContent(m3.group(1).trim());
|
||||||
|
tmp.setValue(0);
|
||||||
|
|
||||||
|
// 获取权重
|
||||||
|
for (String valueInit : NewsComparator.valueInits) {
|
||||||
|
if (tmp.getTitle().contains(valueInit)) {
|
||||||
|
tmp.setValue(tmp.getValue() + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return list.stream().sorted(new NewsComparator()).filter(new NewsPredicate()).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void drawPanel(List<OneNews> list, JPanel panel) {
|
||||||
|
Font font = new Font("宋体", Font.BOLD, 16);
|
||||||
|
AtomicInteger i = new AtomicInteger();
|
||||||
|
list.forEach(item -> {
|
||||||
|
i.getAndIncrement();
|
||||||
|
JButton tmp = new JButton("<html><u> " + (i.get() < 10 ? "0" + i : i) + "." + item.getTitle() + "</u></html>");
|
||||||
|
tmp.setBackground(Color.WHITE);
|
||||||
|
tmp.setFont(font);
|
||||||
|
tmp.setForeground(Color.BLUE);
|
||||||
|
tmp.setHorizontalAlignment(JButton.LEFT);
|
||||||
|
tmp.setBorder(null);
|
||||||
|
tmp.addActionListener(e -> {
|
||||||
|
Desktop desktop = Desktop.getDesktop();
|
||||||
|
try {
|
||||||
|
desktop.browse(new URI(item.getUrl()));
|
||||||
|
} catch (IOException | URISyntaxException ioException) {
|
||||||
|
ioException.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
JTextArea jta = new JTextArea(" " + (item.getContent().equals("") ? "-" : item.getContent()));
|
||||||
|
jta.setLineWrap(true);
|
||||||
|
jta.setEditable(false);
|
||||||
|
jta.setFont(new Font("宋体", Font.PLAIN, 16));
|
||||||
|
|
||||||
|
panel.add(tmp);
|
||||||
|
panel.add(jta);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in New Issue