用这个工具,发朋友圈都可以自动了

今天推荐是一个比较骚气的工具,自动发朋友圈(不用root手机),对于一天发10多条,甚至20条朋友圈的朋友,每次编辑比较麻烦。我之前也写过抢红包工具,当时上架应用市场时,又恰逢过年,那下载量,比我吃了一桶老坛酸菜面还爽。后来由于应用市场的限制,就下架了,后来反正也不是很么高超的技术,就开源在我的github上了,今天分享这个自动发朋友圈的工具,也是和抢红包原理类似。通过开启辅助工具。进行监控屏幕上的按钮。延伸想想,那些喜欢点赞的朋友,是不是可以稍微改下,就变成了自动打开朋友圈,挨个朋友点赞。想想有木有很激动。哈哈~话不多说,我们进入司徒文德分享的文章。原文链接:https://www.jianshu.com/p/8b4ea121d188

一、效果图

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

二、测试Android设备
我在这两款设备测试正常,其它设备如果有什么问题,欢迎给我反馈_
夜神模拟器(Android 4.3)、华为荣耀8青春版(Android 7.0)

三、原理

整个app的核心是AccessibilitySampleService类,它继承了AccessibilityService服务。在辅助功能打开之后,AccessibilitySampleService类会监听目标APP(微信)页面的状态变化。之后使用Android官方提供的UI Automator Viewer工具,查看目标APP(微信)的布局结构树。

640?wx_fmt=png

根据rescoure-id搜索出相应的控件,再对这些控件执行点击、复制、粘贴等操作。

看下核心实现逻辑

 

@TargetApi(18)
public class AccessibilitySampleService extends AccessibilityService {
   @Override
   protected void onServiceConnected()
{
       super.onServiceConnected();
       flag = false;
   }
   private AccessibilityNodeInfo accessibilityNodeInfo;
   /**
    * 是否已经发送过朋友圈,true已经发送,false还未发送
    */

   public static boolean flag = false;
   @Override
   public void onAccessibilityEvent(AccessibilityEvent event)
{
       SharedPreferences sharedPreferences = getSharedPreferences(Constant.WECHAT_STORAGE, Activity.MODE_PRIVATE);
       int eventType = event.getEventType();
       LogUtil.e(eventType + "             " + Integer.toHexString(eventType) + "         " + event.getClassName());
       accessibilityNodeInfo = getRootInActiveWindow();
       if (accessibilityNodeInfo == null) {
           return;
       }
       switch (eventType) {
           case AccessibilityEvent.TYPE_VIEW_SCROLLED:
               if (!flag && event.getClassName().equals("android.widget.ListView")) {
                   clickCircleOfFriendsBtn();//点击发送朋友圈按钮
               }
               break;
           case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
               if (event.getClassName().equals("com.tencent.mm.ui.LauncherUI")) {//第一次启动app
                   flag = false;
                   jumpToCircleOfFriends();//进入朋友圈页面
               }
               if (!flag && event.getClassName().equals("com.tencent.mm.plugin.sns.ui.SnsUploadUI")) {
                   String content = sharedPreferences.getString(Constant.CONTENT, "");
                   inputContentFinish(content);//写入要发送的朋友圈内容
               }
               break;
       }
   }
   /**
    * 跳进朋友圈
    */

   private void jumpToCircleOfFriends() {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("android:id/list");
               if (accessibilityNodeInfoList != null && accessibilityNodeInfoList.size() != 0) {
                   AccessibilityNodeInfo accessibilityNodeInfo = accessibilityNodeInfoList.get(0);
                   if (accessibilityNodeInfo != null) {
                       accessibilityNodeInfo = accessibilityNodeInfo.getChild(1);
                       if (accessibilityNodeInfo != null) {
                           accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                       }
                   }
               }
           }
       }, 1500);
   }
   /**
    * 写入朋友圈内容
    *
    * @param contentStr
    */

   private void inputContentFinish(final String contentStr) {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               List<AccessibilityNodeInfo> accessibilityNodeInfoList1 = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/dba");
               if (accessibilityNodeInfoList1.size() > 0) {
                   ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                   ClipData clip = ClipData.newPlainText("text", contentStr);
                   if (clipboard == null) {
                       return;
                   }
                   clipboard.setPrimaryClip(clip);
                   accessibilityNodeInfoList1.get(0).performAction(AccessibilityNodeInfo.ACTION_FOCUS);
                   accessibilityNodeInfoList1.get(0).performAction(AccessibilityNodeInfo.ACTION_PASTE);
                   LogUtil.e("写入内容");
               }
               List<AccessibilityNodeInfo> accessibilityNodeInfoList =
                       accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/h5");//点击发送
               if (accessibilityNodeInfoList == null || accessibilityNodeInfoList.size() == 0) {
                   LogUtil.e("发送朋友圈失败");
                   return;
               }
               accessibilityNodeInfoList.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
               Toast.makeText(getApplicationContext(), "发送朋友圈成功", Toast.LENGTH_LONG).show();
               flag = true;//标记为已发送
           }
       }, 1500);
   }
   /**
    * 选择图片
    *
    * @param startPicIndex 从第startPicIndex张开始选
    * @param picCount      总共选picCount张
    */

   private void choosePicture(final int startPicIndex, final int picCount) {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cyh");
               for (int i = 0; i < accessibilityNodeInfoList.size(); i++) {
                   for (int j = startPicIndex; j < startPicIndex + picCount; j++) {
                       AccessibilityNodeInfo childNodeInfo = accessibilityNodeInfoList.get(i).getChild(j);
                       if (childNodeInfo != null) {
                           List<AccessibilityNodeInfo> childNodeInfoList = childNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bnl");
                           if (childNodeInfoList != null && childNodeInfoList.size() != 0) {
                               childNodeInfoList.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                           }
                       }
                   }
               }
               List<AccessibilityNodeInfo> finishList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/h5");//点击确定
               if (finishList != null && finishList.size() != 0) {
                   finishList.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                   LogUtil.e("完成图片选择!");
               }
           }
       }, 1500);
   }
   /**
    * 点击发送朋友圈按钮
    */

   private void clickCircleOfFriendsBtn() {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               if (accessibilityNodeInfo == null) {
                   return;
               }
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/g1");
               if (accessibilityNodeInfoList != null && accessibilityNodeInfoList.size() != 0 &&
                       accessibilityNodeInfoList.get(0) != null && accessibilityNodeInfoList.get(0).getParent() != null) {
                   accessibilityNodeInfoList.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
               }
               openAlbum();
           }
       }, 1500);
   }
   /**
    * 打开相册
    */

   private void openAlbum() {
       new Handler().postDelayed(new Runnable() {
           @Override
           public void run()
{
               if (accessibilityNodeInfo == null) {
                   return;
               }
               List<AccessibilityNodeInfo> accessibilityNodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/axk");
               if (accessibilityNodeInfoList != null && accessibilityNodeInfoList.size() != 0 && accessibilityNodeInfoList.get(0).getChildCount() != 0) {
                   accessibilityNodeInfoList.get(0).getChild(1).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                   LogUtil.e("打开相册!");
                   SharedPreferences sharedPreferences = getSharedPreferences(Constant.WECHAT_STORAGE, Activity.MODE_PRIVATE);
                   if (sharedPreferences != null) {
                       int index = sharedPreferences.getInt(Constant.INDEX, 0);
                       int count = sharedPreferences.getInt(Constant.COUNT, 0);
                       choosePicture(index, count);
                   }
               }
           }
       }, 1500);
   }
   @Override
   public void onInterrupt()
{
   }
   /**
    * Called by the system to notify a Service that it is no longer used and is being removed.  The
    * service should clean up any resources it holds (threads, registered
    * receivers, etc) at this point.  Upon return, there will be no more calls
    * in to this Service object and it is effectively dead.  Do not call this method directly.
    */

   @Override
   public void onDestroy()
{
       super.onDestroy();
       LogUtil.e("服务被杀死!");
   }
}

四、注意事项
1、Android设备必须安装微信app
2、Android Sdk Version>18
特别提醒(不需要获取root权限)

五、开源地址
点击【阅读原文】

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/69706.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选题、撰写微信小程序毕业论文,以及答辩流程?

一、开始准备选题 在大四上学期开学时&#xff0c;开始准备论文。首先需要确定论文主题&#xff0c;考虑自己想要做什么样的毕业设计。可以选择之前接触过或者做过的领域&#xff0c;这样可以更快地进展。如果选择了之前没有接触过的领域&#xff0c;一定要尽早开始准备。我打…

【毕业设计】7-基于STM32开发板的无线传输设计(原理图工程+源代码工程+答辩论文+答辩PPT)

【毕业设计】 基于STM32开发板的无线传输设计&#xff08;原理图工程源代码工程答辩论文答辩PPT&#xff09; 文章目录 【毕业设计】 基于STM32开发板的无线传输设计&#xff08;原理图工程源代码工程答辩论文答辩PPT&#xff09;资料下载链接任务书设计说明书摘要设计框架架构…

根据班级模型设计简易朋友圈(支持发动态、点赞、评论、回复等)

需求 将学校以班级为单位制作一个简易的朋友圈&#xff0c;默认用户在一个班级里&#xff0c;用户可以在朋友圈里发动态&#xff0c;支持9宫格&#xff0c;对动态进行评论&#xff0c;回复其他用户的评论&#xff0c;可删除自己的评论&#xff0c;对动态进行点赞&#xff0c;可…

毕业论文用什么流程图软件比较好?

在写作论文的时候使用流程图&#xff0c;会让我们的论文看起来更加有逻辑。并且流程图的图片都可以在PPT中随意插入以及使用。 基础流程图作为最为基本和简单的的流程图方式&#xff0c;一般不区分用户角色和场景&#xff0c;适用于简单场景&#xff0c;梳理单一的流程情况&am…

AI真的会抢“饭碗” ?

去年年底ChatGPT横空出世&#xff0c;并在全球掀起AI热潮&#xff0c;全世界的科技公司都在这场人工智能竞赛中迎头追赶。不过AI强大的能力&#xff0c;也让广大职场人担心&#xff0c;“AI取代人类劳动力”也随之成为热议话题。 事实上&#xff0c;AI创作会不会真的抢人类的“…

AI未来会取代哪些行业

AI的全称Artificial Intelligence, 人工智能&#xff0c;合起来就是人工智能。 它的目的是模仿人类智能&#xff0c;使电脑能够实现一些人类难以完成的任务&#xff0c;比如自动学习、自动推理和自动解决问题。 虽然AI和人工制造的实体&#xff0c;如机器人等&#xff0c;都可…

李德毅院士 :智能的困扰和释放

来源&#xff1a;中国人工智能学会 李德毅, 何雯 *军事科学院系统工程研究院&#xff0c;北京&#xff0c;100141 *通信作者. E-mail: colcloud126.com 摘要&#xff1a;智能回答整个认知活动中“在哪里”、“是什么”、“为什么”和“怎么做”四个基本问题&#xff0c;含有丰富…

综述 | 从第一性原理出发,探索类脑智能研究的星辰大海

导读 近几年来&#xff0c;以大模型为代表的人工智能技术正在引领下一个产业发展的浪潮。目前&#xff0c;以ChatGPT、AlphaFold为代表的人工智能在文图生成、自然语言处理、蛋白质结构模拟等方面取得的突破性进展正在为这个行业带来不断的惊喜以及似乎无限的想象空间。然而&am…

管理类联考——英语——知识篇——作文题材说明

小作文题材 一、题材&#xff1a;小作文的内容&#xff08;写什么&#xff09; 1.疫情相关的主题&#xff1a;&#xff08;以信件方式出题可能性60%&#xff0c;对生活影响大&#xff09; (1)停学、复学&#xff1a;线上或线下停学和复学( go back to class/ school )&#x…

大佬回避!一名老程序猿送给在校大学生的话:关于恋爱、关于兼职和实习、关于师生和成长、关于工作和职场……

大学应当是人生中最快乐的时光。 在这些日子里&#xff0c;你可以做很多事情&#xff0c;有些事情甚至会影响你的一生…… 本文是我作为一个过来人的一些思考。 提笔缘故 可能是上了年纪的缘故&#xff0c;一旦有学弟学妹和我聊起大学或者工作是&#xff0c;我都会无数鸡汤犹如…

刚毕业的欧洲大学生,就能拿到美国互联网大厂 Offer?

作者 | Ludovico 译者 | 弯月 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 我是一名刚刚毕业的欧洲研究生&#xff0c;我将通过本文分享个人找工作的经历。 有人可能会说美国有很多机遇&#xff0c;别的国家也一样吗&#xff1f;高科技市场对技术人员供不…

某985学历程序员嫌弃女朋友高职毕业学历低,但女朋友实在太漂亮,好犹豫!...

????????关注后回复 “进群” &#xff0c;拉你进程序员交流群???????? 作者丨行走的印钞机 来源丨程序员八卦 都说程序员小哥哥找对象的标准就是漂亮&#xff0c;但人的欲望是无穷的&#xff0c;有了漂亮女朋友又想要更多&#xff0c;比如高学历、家境好、工作…

AAAI 2021 | 自动写歌:基于预训练和对齐约束的自动歌曲创作

©作者 | 盛中昊 学校 | 北京大学硕士 研究方向 | 自然语言处理 本工作由北京大学 KCL 实验室与南京理工大学、微软亚洲研究院、浙江大学共同提出。KCL&#xff08;Knowledge Computing Lab&#xff0c;知识计算实验室&#xff09;是北大软件工程国家工程研究中心一支 20 多…

快讯|科大讯飞:将发布讯飞星火认知大模型 V1.5;OpenAI CEO 称公司没有上市计划

一分钟速览新闻点 百度智能云推出代码助手 Comate&#xff0c;覆盖 30 开发语言科大讯飞&#xff1a;将发布讯飞星火认知大模型 V1.5新型量子计算机“悟空”即将发布OpenAI CEO 称公司没有上市计划特斯拉自动驾驶将开放给其他车企&#xff0c;马斯克称自动驾驶的 ChatGPT 时刻…

聚观早报 | 百度回应文心「造假」;TikTok CEO 出席美国会听证会

今日要闻&#xff1a;百度回应文心「造假」&#xff1b;TikTok CEO 出席美国会听证会&#xff1b;华为发布P60、Mate X3两款手机&#xff1b;2023胡润全球富豪榜公布&#xff1b;ARM 已通知客户将改变授权模式 百度回应文心「造假」 3 月 23 日消息&#xff0c;百度今日针对文…

chatgpt赋能python:Python做描述性统计:统计分析从未如此轻松

Python做描述性统计&#xff1a;统计分析从未如此轻松 Python是一种高级编程语言&#xff0c;广泛应用于数据科学、人工智能、Web开发和许多其他领域。Python非常适合数据分析和统计学&#xff0c;其中包括描述性统计&#xff0c;这是一种报告和总结数据集的方法。 什么是描述…

我去阿里的故事

背景介绍 本人19年毕业生&#xff0c;硕士华中科技大学&#xff0c;本科南昌航空大学&#xff0c;目前在阿里巴巴企业智能事业部从事Java开发。 故事从这里说起 应该差不多在大三上学期的时候吧&#xff0c;我的一位学长在我的一堂职业规划课上和大家分享他是如何复习考上了…

阿里中台(看图不说话)

阿里中台战略&#xff0c;源于阿里高管15年中参观世位于芬兰界上最成功的移动游戏公司Supercell。Supercell的核心竞争力就在多年的游戏研发中积累了非常科学的研发方法和体系&#xff0c;包括游戏开发过程中公共、通用的游戏开发素材、算法做了很好的沉淀&#xff0c;形成了强…

培训班出身的同学简历怎么做?面试要注意哪些?来自资深大厂HR的忠告

目录 1 不少培训班候选人的简历中&#xff0c;缺乏足够的商业项目年限 2 直接描述培训班学习经历会带来的负面影响 3 大龄转行Vs年轻的初级程序员&#xff0c;公司一般会如何选择&#xff1f; 4 经过培训班突击后&#xff0c;可以先面试小公司 5 面试官怎么面试有培训班经历…

辅导员面试时的自我介绍要如何准备

辅导员作为一名需要管理学生思想政治教育、日常管理、心理健康等方面的老师&#xff0c;需要面试者拥有较强的综合素质&#xff0c;因此&#xff0c;面试官在面试该岗位应聘者时会有较高的要求。而在一场辅导员面试中&#xff0c;最能表现自己能力的和给面试官留下深刻印象的就…