72e05ae2ly1gau2x9bmurj22yo1o01ky.jpg

朋友们请把般配打在公屏上~


RSS是订阅服务中常用的一种方法,但是在微博似乎没有提供这种服务,微博自带的提醒服务一直诟病严重,没有钱解决不了。

为了将诸葛大力更新信息及时推送给我,我改造了原有的WeiBo-Rss,优化了爬虫模块。

image.png

一直可惜做出来没有用的机会,就抽空做了一个诸葛大力定制版Dali-Rss,并且运行在了服务器上。

微博具有高强度的反爬措施,所以每次HTTP-request我都间隔了十秒,相对于RSSHUB的微博订阅更加及时。

服务初始化代码如下:

    public void run(ApplicationArguments args) throws Exception {
        mailDao.createTable();
        mailDao.insertMail("antzuhl1998@gmail.com");
        Thread thread = new Thread(new FindWeiBo());
        thread.start();
    }

创建一张邮箱信息表,存储会接收到信息的邮箱用户。

它的建表语句也很简单。

CREATE TABLE user_mail(
    id INTEGER PRIMARY KEY,
    mail_addr VARCHAR(128) NOT NULL UNIQUE);   

核心信息只有一个存在唯一约束的邮箱地址。

程序中存在两个线程,分别的main和爬虫监视线程。

在爬虫线程中,会循环请求诸葛大力的微博首页

 while (true) {
    try {
        Thread.sleep(10000);
        SpiderWeb.getCGWeibo("https://weibo.com/u/1927305954?profile_ftype=1&is_all=1#_0");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

这里的sleep(10000)其实是一个潜在bug,不过没什么影响。

以获取的微博信息会存储在一个HashMap中,key是微博标注时间,这样有一个好处就是当大力编辑了某条微博我们也能看到。

HTML请求的URL就是上图了,至于具体的HTML解析等代码就不贴出来了,赶时间写的,太难看了。

在发现有新的微博时,就会执行sendAll()方法。

sendAll会获取所有的注册邮箱的用户,并且调用邮件服务发送邮件给他们。

    public void sendAll (String data, String text) throws AddressException {
        MailDao mailDao = new MailDao();
        List<User> mails = mailDao.list();
        List<InternetAddress> list  = new ArrayList<>();
        for (User user : mails) {
            list.add(new InternetAddress(user.getMail()));
        }
        try {
            Send("xxxxxx@qq.com", (InternetAddress[]) list.toArray(new InternetAddress[list.size()]), "pop码,去自己邮箱找(发件人需要)", data, text);
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

邮件服务方法,这里的stmpPassword需要你去自己邮箱的账户选项中开启,邮箱会自动给你一个,是专门让你发邮箱的。

    public void Send(String myMailAddress,InternetAddress[] mailAddresss,String stmpPassword, String date, String text) throws AddressException,MessagingException {
        Properties properties = new Properties();
        properties.put("mail.transport.protocol", "smtp");
        properties.put("mail.smtp.host", "smtp.qq.com");
        properties.put("mail.smtp.port", 465);
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.debug", "true");
        Session session = Session.getInstance(properties);
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(myMailAddress));
        message.setRecipients(Message.RecipientType.TO, mailAddresss);
        message.setSubject("成果成果成狗微博更新啦~");
        message.setText(text);
        Transport transport = session.getTransport();
        transport.connect(myMailAddress, stmpPassword);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }

这样,就差不多完成啦!

image.png

qq_pic_merged_1579228004597.jpg

72e05ae2ly1gav8iwfktpj209m09q3yz.jpg

我给邮箱服务添加了一个rest接口,可以方便我后继查看已有用户和添加用户。

有了Dali-Rss,就应该没有人比我快了吧。