android AccessibilityService合法合规采集大众点评app商店商品详情(2024-09-02)

news2024/11/13 9:36:10

免责任声明:

        任何可操作性的内容与本人无关,文章内容仅供参考学习,如有侵权损害贵公司利益,请联系作者,会立刻马上进行删除。

一、原理介绍


1、打开大众点评app商店

    public void open_shop(Context context,String shop_id)
    {
        String url="dianping://gcshopshell?shopuuid="+shop_id;
        scroll_count=0;
        Uri uri = Uri.parse(url); //
        Intent intent =new Intent(Intent.ACTION_VIEW,uri);;
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

2、采集如下字段:

    public class Commodity{
        public int id;
        public String title;        //商品标题
        public String price;      //售价
        public String market_price;  //市场价
        public String sales;            //年销量
        public String shop_id;        //商店id
        public String shop_index;
        public int count;
    }

3、 保存数据为Csv文件


            Csv csv1=Csv.getInstance(context);
            boolean bres=csv1.save_commodities(commodities);
            if(bres==false){
                fb.set_show("保存数据失败!请检查有没有数据存储权限!");
                return;
            }

4、滚动屏幕

private void performScroll(AccessibilityNodeInfo rootNode){
        if(mCurrentUI.startsWith("com.dianping.shopshell")){
            AccessibilityNodeInfo scrollNode=AccessibilityHelper.findNodeInfosById(rootNode,"com.dianping.v1:id/pagecontainer_recyclerview",0);
            if(scrollNode!=null) {
                if (scroll_count < 10) {
                    AccessibilityHelper.performScrollForward(scrollNode);
                    AccessibilityNodeInfo firstNode=AccessibilityHelper.findNodeInfoByTextAllMatched(rootNode,"抢购");
                    if(firstNode==null)scroll_count=10;
                }
                else {
                    AccessibilityHelper.performScrollBackward(scrollNode);
                    AccessibilityNodeInfo firstNode=AccessibilityHelper.findNodeInfoByTextAllMatched(rootNode,"封面");
                    if(firstNode!=null)scroll_count=0;
                }
                scroll_count += 1;
                if (scroll_count > 20) {
                    scroll_count = 0;
                }
            }
            //AccessibilityNodeInfo no_moreNode=AccessibilityHelper.findNodeInfosByText(rootNode,"收起",0);
            

        }

5、采集数据

private Commodity get_commodity(AccessibilityNodeInfo buyNode){
        try{
            AccessibilityNodeInfo parent=buyNode.getParent();
            if(parent==null)return null;
            parent=parent.getParent();
            if(parent==null)return null;
            int price_count=0;
            Commodity commodity=new Commodity();
            for (int i = 0; i < parent.getChildCount(); i++) {
                AccessibilityNodeInfo child=parent.getChild(i);
                if(child!=null&&child.getText()!=null){
                    String text=child.getText().toString();
                    text=text.replaceAll(",","[comma]");
                    commodity.shop_id=shop_id;
                    commodity.shop_index=String.valueOf(csv.shop_index);
                    commodity.count=commodity_count;
                    if(i==0){
                        //if(isInCommodities(text))return null;
                        commodity.title=text;
                    }
                    if(text.startsWith("年售"))commodity.sales=text;
                    if(text.startsWith("全国爆卖"))commodity.sales=text;
                    if(text.startsWith("¥")){
                        if(price_count==0)
                            commodity.price=text;
                        else
                        if(price_count==1)
                            commodity.market_price=text;
                        price_count+=1;
                    }

                }
            }
            if(isInCommodities(commodity))return null;
            return commodity;
        }catch (Exception e){
            MyLog.e(e);
            return null;
        }
    }
    private boolean isInCommodities(String title){
        for (Commodity commodity:commodities){
            if(title.equals(commodity.title))return true;
        }
        return false;
    }

6、获取商品数量并点击更多,展开商品信息

  private void performMoreClick(AccessibilityNodeInfo rootNode){
        if(commodity_count>0)return;
        AccessibilityNodeInfo moreNode=AccessibilityHelper.findNodeInfosByText(rootNode,"个团购",0);
        if(moreNode!=null) {
            String text=moreNode.getText().toString();
            if(text.startsWith("更多")){
                AccessibilityNodeInfo parent=moreNode.getParent();
                if(parent==null)return;
                if(parent.getClassName().toString().equals("android.widget.LinearLayout")){
                    MyLog.i("找到:"+text);
                    int more=Funcs.getDigital(text);
                    if(more>0)commodity_count=more+5;
                    show_count();
                    AccessibilityHelper.performClick(moreNode);
                }
            }
            return;
        }
        moreNode=AccessibilityHelper.findNodeInfosByText(rootNode,"个商品",0);
        if(moreNode!=null) {
            String text=moreNode.getText().toString();
            if(text.indexOf("更多")>0){
                String say="非美容院商店...跳过";
                FloatWindowButton fb=FloatWindowButton.getInstance(context);
                fb.set_show(say);
                Csv csv1=Csv.getInstance(context);
                boolean bres=csv1.save_no_shop_id(shop_id,String.valueOf(csv1.shop_index));
                if(bres==false){
                    fb.set_show("保存数据失败!请检查有没有数据存储权限!");
                    return;
                }
                open_next_shop_prepare(Config.interval,false);
            }
            return;
        }
    }

二、完整源代码


package accessibility.app;
import accessibility.AccessibilityFindByText;
import accessibility.AccessibilityHelper;
import accessibility.BaseAccessibilityJob;
import accessibility.AccService;
import floatwindow.FloatWindowButton;
import utils.Config;
import utils.Csv;
import utils.Funcs;
import utils.MyLog;

import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;

import com.dp.jp.MainActivity;

import java.util.ArrayList;
import java.util.List;

public class ShopInfoJob  extends BaseAccessibilityJob{
    public static final int STAT_NONE=0;
    public static final int STAT_WORKING=1;
    public static final int STAT_WAITING=2;
    public static int state=0;
    private static ShopInfoJob current;
    private utils.Csv csv;
    private int scroll_count=0;

    public String CurrentUI=null;
    public String shop_id=null;
    private boolean is_alarm=false;
    //--------------------------------------------------------------------------
    public List<Commodity> commodities=new ArrayList<Commodity>() ;
    public boolean isBusy=false;
    private int commodity_count=0;
    private ShopInfoJob() {
        //super(new String[]{Config.PKG_IM_TOKEN,Config.PKG_HUOBI,Config.PKG_BTD});
        super(new String[]{"com.dianping.v1"});
        //super(null);技术支持:metabycf or byc6352
        csv= Csv.getInstance(context);
    }
    public static synchronized ShopInfoJob getInstance() {
        if(current == null) {
            current = new ShopInfoJob();
        }
        return current;
    }
    @Override
    public void onCreateJob(AccService service) {
        super.onCreateJob(service);
        EventStart();


    }
    @Override
    public void onStopJob() {
        super.onStopJob();

    }
    /*
     * (刷新处理流程)
     * @see accessbility.AccessbilityJob#onWorking()
     */
    @Override
    public void onWorking(){
        FloatWindowButton fb=FloatWindowButton.getInstance(context);
        String say="正在执行任务...";
        if(commodity_count>0&&commodities.size()>=commodity_count){

            say="采集完成...";
            fb.set_show(say);
            Csv csv1=Csv.getInstance(context);
            boolean bres=csv1.save_commodities(commodities);
            if(bres==false){
                fb.set_show("保存数据失败!请检查有没有数据存储权限!");
                return;
            }
            AccessibilityHelper.performBack(service);
            Funcs.sleep(2);

            open_next_shop_prepare(Config.interval,false);
            return;
        }
        AccessibilityNodeInfo rootNode = service.getRootInActiveWindow();
        if (rootNode == null) return;

        fb.set_show(say);
        //com.dianping.shopshell.GCShopInfoActivity
        if(rootNode.getPackageName().toString().equals("com.dianping.v1")){
            if(mCurrentUI.startsWith("com.dianping.shopshell.")) {
                performMoreClick(rootNode);
                performScroll(rootNode);

            }
       }


    }
    @Override
    public void onReceiveJob(AccessibilityEvent event) {
        super.onReceiveJob(event);
        if(!mIsEventWorking)return;
        if(!mIsTargetPackageName)return;
        CurrentUI=mCurrentUI;
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
        {
            MyLog.i("mCurrentUI="+mCurrentUI);
            if(mCurrentUI.startsWith("com.dianping.shopshell.")){
                if(state==STAT_WORKING) {

                }
                if(is_alarm)
                    Funcs.alarm(context,false);
            }
            if(mCurrentUI.startsWith("android.app.Dialog")){
                if(Config.auto_close_verify){
                    AccessibilityNodeInfo rootNode=event.getSource();
                    if(rootNode==null)return;
                    //close_verify_btn(rootNode);
                }else {
                    Funcs.alarm(context,true);
                    is_alarm=true;
                }

            }
            if(mCurrentUI.startsWith("com.meituan.android.yoda.activity.YodaConfirmActivity")){
                if(Config.auto_close_verify){
                    AccessibilityNodeInfo rootNode=event.getSource();
                    if(rootNode==null)return;
                    //close_verify_back(rootNode);
                }else {
                    Funcs.alarm(context,true);
                    is_alarm=true;
                }

            }


        }
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED)
        {
            if(commodity_count>0&&commodity_count==commodities.size())return;
            if(mCurrentUI.startsWith("com.dianping.shopshell.")){
                if(state==STAT_WORKING) {
                    AccessibilityNodeInfo rootNode=event.getSource();
                    if(rootNode==null)return;
                    pluck_from_shop(rootNode);
                    TimeStart();
                    performMoreClick(rootNode);
                }
            }

        }

    }
    //---------------------------------------------------------------------
    //"dianping://gcshopshell?shopuuid=H44paDfKZflcSGHd"
    public void open_shop(Context context,String shop_id)
    {
        String url="dianping://gcshopshell?shopuuid="+shop_id;
        scroll_count=0;
        Uri uri = Uri.parse(url); //
        Intent intent =new Intent(Intent.ACTION_VIEW,uri);;
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
    /*
    1.浮动窗口:下一个
    2.working.over
    3.主窗口:继续
    4.accservice open
     */
    public void open_next_shop_prepare(int delay,boolean cur){
        if(runnableStart!=null)return;

        state=STAT_WAITING;
        //et_cur_id.setText(String.valueOf(csv1.commodities_index));
        runnableStart = new Runnable() {
            @Override
            public void run() {
                try {
                    Csv csv1=Csv.getInstance(context);
                    if(cur)
                        shop_id=csv1.get_shop_id();
                    else
                        shop_id=csv1.get_next_shop_id();
                    FloatWindowButton fb=FloatWindowButton.getInstance(context);
                    fb.ShowFloatWindow();
                    if(csv1.shop_index>Config.end_id||csv1.shop_index>csv1.get_shop_total_count()||shop_id.equals("")){
                        String say="已完成任务";
                        fb.set_show(say);
                        runnableStart=null;
                        return;
                    }
                    state=STAT_WORKING;
                    String say="开始执行任务...";
                    fb.set_show(say);
                    fb.set_commodity_count_show(String.valueOf(csv1.shop_index));
                    open_shop(context,shop_id);
                    commodities.clear();
                    commodity_count=0;
                    runnableStart=null;

                }catch (Exception e){
                    MyLog.e(e.getMessage().toString());
                }

            }
        };
        handler.postDelayed(runnableStart, delay);
    }

    //private boolean pluck_start=false;
    //private int pluck_count=0;
    //private Commodity commodity=null;

    private void pluck_from_shop(AccessibilityNodeInfo rootNode){
        try{
            if(mCurrentUI.startsWith("com.dianping.shopshell.")){
                if(isBusy)return;
                isBusy=true;
                try{
                    //com.dianping.v1:id/pagecontainer_recyclerview
                    //AccessibilityNodeInfo pagecontainerNode=AccessibilityHelper.findNodeInfosById(rootNode,"com.dianping.v1:id/pagecontainer_recyclerview",0);
                    //if(pagecontainerNode!=null){
                        List<AccessibilityNodeInfo>  buyNodes=AccessibilityHelper.findNodeInfosByTextAllMatched(rootNode,"抢购");
                        if(buyNodes==null||buyNodes.size()==0)return;
                        for (AccessibilityNodeInfo buyNode:buyNodes){
                            Commodity commodity=get_commodity(buyNode) ;
                            if(commodity!=null)commodities.add(commodity);
                        }
                        show_count();
                    //}
                }catch (Exception e){
                    MyLog.e(e.getMessage().toString());
                    return ;
                }finally {
                    isBusy=false;
                }
            }
        }catch (Exception e){
            MyLog.e(e.getMessage().toString());

        }
    }


    private void performScroll(AccessibilityNodeInfo rootNode){
        if(mCurrentUI.startsWith("com.dianping.shopshell")){
            AccessibilityNodeInfo scrollNode=AccessibilityHelper.findNodeInfosById(rootNode,"com.dianping.v1:id/pagecontainer_recyclerview",0);
            if(scrollNode!=null) {
                if (scroll_count < 10) {
                    AccessibilityHelper.performScrollForward(scrollNode);
                    AccessibilityNodeInfo firstNode=AccessibilityHelper.findNodeInfoByTextAllMatched(rootNode,"抢购");
                    if(firstNode==null)scroll_count=10;
                }
                else {
                    AccessibilityHelper.performScrollBackward(scrollNode);
                    AccessibilityNodeInfo firstNode=AccessibilityHelper.findNodeInfoByTextAllMatched(rootNode,"封面");
                    if(firstNode!=null)scroll_count=0;
                }
                scroll_count += 1;
                if (scroll_count > 20) {
                    scroll_count = 0;
                }
            }
            //AccessibilityNodeInfo no_moreNode=AccessibilityHelper.findNodeInfosByText(rootNode,"收起",0);
            //if(no_moreNode!=null&&no_moreNode.getText()!=null&&no_moreNode.getText().toString().startsWith("收起")) scroll_count=10;

        }

    }





    private Commodity get_commodity(AccessibilityNodeInfo buyNode){
        try{
            AccessibilityNodeInfo parent=buyNode.getParent();
            if(parent==null)return null;
            parent=parent.getParent();
            if(parent==null)return null;
            int price_count=0;
            Commodity commodity=new Commodity();
            for (int i = 0; i < parent.getChildCount(); i++) {
                AccessibilityNodeInfo child=parent.getChild(i);
                if(child!=null&&child.getText()!=null){
                    String text=child.getText().toString();
                    text=text.replaceAll(",","[comma]");
                    commodity.shop_id=shop_id;
                    commodity.shop_index=String.valueOf(csv.shop_index);
                    commodity.count=commodity_count;
                    if(i==0){
                        //if(isInCommodities(text))return null;
                        commodity.title=text;
                    }
                    if(text.startsWith("年售"))commodity.sales=text;
                    if(text.startsWith("全国爆卖"))commodity.sales=text;
                    if(text.startsWith("¥")){
                        if(price_count==0)
                            commodity.price=text;
                        else
                        if(price_count==1)
                            commodity.market_price=text;
                        price_count+=1;
                    }

                }
            }
            if(isInCommodities(commodity))return null;
            return commodity;
        }catch (Exception e){
            MyLog.e(e);
            return null;
        }
    }
    private boolean isInCommodities(String title){
        for (Commodity commodity:commodities){
            if(title.equals(commodity.title))return true;
        }
        return false;
    }
    private boolean isInCommodities(Commodity commodity_new){
        try {
            for (Commodity commodity:commodities){
                if(Funcs.isEqua(commodity_new.title,commodity.title)&&Funcs.isEqua(commodity_new.price,commodity.price)&&Funcs.isEqua(commodity_new.sales,commodity.sales))return true;
            }
            return false;
        }catch (Exception e){
            MyLog.e(e);
            return false;
        }
    }
    private void performMoreClick(AccessibilityNodeInfo rootNode){
        if(commodity_count>0)return;
        AccessibilityNodeInfo moreNode=AccessibilityHelper.findNodeInfosByText(rootNode,"个团购",0);
        if(moreNode!=null) {
            String text=moreNode.getText().toString();
            if(text.startsWith("更多")){
                AccessibilityNodeInfo parent=moreNode.getParent();
                if(parent==null)return;
                if(parent.getClassName().toString().equals("android.widget.LinearLayout")){
                    MyLog.i("找到:"+text);
                    int more=Funcs.getDigital(text);
                    if(more>0)commodity_count=more+5;
                    show_count();
                    AccessibilityHelper.performClick(moreNode);
                }
            }
            return;
        }
        moreNode=AccessibilityHelper.findNodeInfosByText(rootNode,"个商品",0);
        if(moreNode!=null) {
            String text=moreNode.getText().toString();
            if(text.indexOf("更多")>0){
                String say="非美容院商店...跳过";
                FloatWindowButton fb=FloatWindowButton.getInstance(context);
                fb.set_show(say);
                Csv csv1=Csv.getInstance(context);
                boolean bres=csv1.save_no_shop_id(shop_id,String.valueOf(csv1.shop_index));
                if(bres==false){
                    fb.set_show("保存数据失败!请检查有没有数据存储权限!");
                    return;
                }
                open_next_shop_prepare(Config.interval,false);
            }
            return;
        }
    }
    private void show_count(){
        String say="";
        if(commodity_count==0)
            say="当前商店编号:"+String.valueOf(csv.shop_index)+"已找到商品数:"+String.valueOf(commodities.size());
        else
            say="当前商店编号:"+String.valueOf(csv.shop_index)+"共有商品数:"+String.valueOf(commodity_count)+"已找到商品数:"+String.valueOf(commodities.size());
        FloatWindowButton.getInstance(context).set_commodity_count_show(say);
    }












    private Runnable runnableStart=null;
    private Handler handler = new Handler();









    public class Commodity{
        public int id;
        public String title;
        public String price;
        public String market_price;
        public String sales;
        public String shop_id;
        public String shop_index;
        public int count;
    }

}

技术支持:

UVHvvJozOTg0ODg3MuW+ruS/oe+8mmJ5YzYzNTLmiJZtZXRhYnljZueUteaKpe+8mmJ5YzAx (base64解码)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM基础知识---CPU---处理器

目录 一、ARM架构 1.1.RAM---随机存储器 1.2.ROM---只读存储器 1.3.flash---闪存存储器 1.4.时钟&#xff08;振晶&#xff09; 1.5.复位 二、CPU---ARM920T 2.1.R0~R12---通用寄存器 2.2.PC程序计数器 2.3.LR连接寄存器 2.4.SP栈指针寄存器 2.5.CPSR当前程序状态寄存…

【MySQL进阶】索引性能分析

1. 索引语法 创建索引&#xff1a; ​ 语法格式&#xff1a;create [unique|fulltext] index index_name on table_name(index_col_name...); 查看索引&#xff1a; ​ 语法格式&#xff1a;show index from table_name; 删除索引&#xff1a; ​ 语法格式&#xff1a;dr…

Spring Boot实现License生成和校验

1.License应用场景 在我们向客户销售商业软件的时候&#xff0c;常常需要对所发布的软件实行一系列管控措施&#xff0c;诸如验证使用者身份、软件是否到期&#xff0c;以及保存版权信息和开发商详情等。考虑到诸多应用场景可能处于离线环境&#xff0c;无法依赖网络进行实时认…

5.数据结构-c/c++二叉树详解(上篇)(遍历方法,完全二叉树)

目录 一. 二叉树的基本介绍 1.2 满二叉树 1.3 完全二叉树 1.4 搜索二叉树 1.5 平衡二叉搜索树 二. 二叉树的常用操作 2.1 二叉树的定义 2.2 创建一个新的节点 2.3 构建一颗树 2.5 销毁一棵树 三.二叉树的前序&#xff0c;中序&#xff0c;后序&#xff0c;层序遍历方…

day-47 子集

思路 利用深度优先遍历算法&#xff0c;对于每个数有选或不选两种抉择&#xff0c;每次遍历到idslen时将p加入答案中 解题过程 选中当前数字&#xff0c;调用dfs函数之后记得还原 Code class Solution {public int len;public List<List<Integer>> listnew Arra…

51单片机的智能台灯设计【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块DS1302时间模块光敏传感器模块人体红外模块按键等模块构成。适用于智能台灯、自动调节灯光亮度等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、环境光照强度、手动/自动模式、台灯亮度等信息&#xff1…

笔记整理—uboot番外(1)命令体系

在uboot启动进行命令行的环境下&#xff0c;当输入命令时&#xff0c;将会对命令进行先解析后执行的操作。 uboot/common/cmd_xxx.c 其中就有多个命令体系&#xff08;mian.c和commann.c&#xff09; uboot每个命令都对应了一个相关的函数&#xff0c;由此实现的命令体系与…

字符统计及重排

题目描述 给出一个仅包含字母的字符串&#xff0c;不包含空格&#xff0c;统计字符串中各个字母(区分大小写)出现的次数 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同&#xff0c;按照自然顺序进行排序&#xff0c;且小写字母在大写字母之前&a…

2024年【氧化工艺】考试及氧化工艺最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 氧化工艺考试考前必练&#xff01;安全生产模拟考试一点通每个月更新氧化工艺最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过氧化工艺操作证考试很简单。 1、【单选题】 废水经生物脱氮工艺、吹脱工艺等…

如何自学通过软考中级系统集成项目管理工程师?

虽然中级项目管理工程师&#xff08;以下简称中项&#xff09;考试相对较容易&#xff0c;但如果你是零基础&#xff0c;不建议完全依靠自学。 中项属于软考的"信息系统"专业&#xff0c;是中级资格。熟悉软考的人都知道&#xff0c;软考包括初级、中级、高级3个级别…

python-uinput虚拟输入

文章目录 python-uinput虚拟输入背景库简介&#xff1a;什么是python-uinput&#xff1f;安装指南&#xff1a;如何获取这个强大的工具&#xff1f;快速上手&#xff1a;五个核心函数的介绍与使用1. 创建虚拟设备2. 模拟键盘输入3. 模拟鼠标移动4. 模拟鼠标点击5. 模拟触摸屏操…

【粒子群算法PSO】基本原理及多种改进方法

【粒子群算法Matlab仿真定制】&#xff1a; QQ&#xff1a;491052175 1. 粒子群算法的发展趋势 粒子群算法&#xff0c;又称粒子群优化算法&#xff08;Particle swarm opyimization, PSO&#xff09;&#xff0c;是近年来新发展起来的进化算法。该算法和模拟退火算法相似&a…

Vue(十二) Vuex、四个map方法的使用、Vuex模块化+namespace命名空间

文章目录 一、Vuex前言&#xff1a;求和案例1. 搭建Vuex环境2. 基本使用3. 常见疑惑4. getters5. 四个map方法的使用(1) mapState(2) mapGetters(3) mapActions(4) mapMutations 6. 模块化命名空间namespace6.1 模块化6.2 模块化后读取数据 一、Vuex Vuex是一个Vue插件&#x…

FPGA与高速ADC接口简介

引言&#xff1a;本文介绍FPGA与高速ADC接口方式和标准以及JESD204与FPGA高速串行接口。 1. 高速ADC与处理器互联需要权衡的因素 如图1所示&#xff0c;ADC模数转换器可以与微控制器、DSP、FPGA以及ASIC均可以实现互联&#xff0c;在进行选择时&#xff0c;需要考虑以下因素&…

强化学习实操入门随笔

碎碎念&#xff1a;经过思考&#xff0c;打通底层逻辑&#xff0c;我认为未来ai的功能是在沟通领域代替人&#xff0c;未来人-人模式&#xff08;媒介是死的语言&#xff0c;比如看古人留下的文字、聊天的暂时不在&#xff09;会变成人-ai替身-人模式&#xff08;符合本人想法的…

上市公司财务数据分析系统

前言 1.拟解决的关键问题或技术: 本研究旨在解决企业在财务管理方面的主要问题,即如何通过对财务数据进行深度挖掘,实现对未来财务趋势的预测和风险的识别。具体地,该研究将重点解决以下问题: 1.构建有效的财务指标体系、设计合理的特征工程和指标构建方法,以充分反映…

Java基于小程序公考学习平台的设计与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

QT实现简易文件夹

使用UI界面实现简易文件夹 1、实现功能 1、双击文件夹&#xff0c;进入文件夹的下一层 2、点击回退按钮、返回上一级 3、如果是文本文件、则调用记事本的程序、显示文本内容 2、widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDir>…

《深度学习》OpenCV 图像边缘检测 算法解析及代码演示

目录 一、图像边缘检测 1、什么是边缘检测 2、常用的边缘检测算法 1&#xff09;Sobel算子 2&#xff09;Scharr 算子 3&#xff09;Canny边缘检测算法 4&#xff09;Laplacian算子 3、边缘检测流程 1&#xff09;预处理 2&#xff09;计算梯度 3&#xff09;非极大值抑制 …

微型直线导轨高精度运行的工作原理

微型导轨是一种用于高精度定位和运动控制的传动装置&#xff0c;常用于微小化、高精密度化的机械设备中&#xff0c;如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Y table&#xff0c;以及高速皮带驱动的设备等小型化设备。 微型导轨的构成相对…