zoukankan      html  css  js  c++  java
  • 爬虫与自动化实战,帮助小姐姐刷抖音完全解放掉双手

    image

    1. 场景

    你是否在为洗碗时,刷抖音需要滑动屏幕,导致屏幕沾上水而烦扰?

    你是否为在吃饭时刷抖音,由于手机屏幕过大,导致手指滑动视频不方便而苦恼?

    又或者是,冬天躺在被窝刷抖音,你是否为频繁伸出手去切换视频,而烦躁不安?

    本篇文章将大家利用 自动化与爬虫,精准地刷抖音,完全解放自己的双手,做一回真正的懒人

    2. 实现

    具体的实现思路是:无障碍服务 AccessibilityService 负责抖音 App 的 UI 自动化操作,Jsoup 负责爬取抖音视频的基本信息,包含每条视频的时长,最后保证每一条视频播放完成后,立马滑动到下一个视频下面通过 6 步实现第 1 步,使用 Andriod Studio 新建一个 Android 项目,使用 Gradle 新增依赖

    //build.gradle
    //新增依赖
    dependencies {
        //jsoup负责爬虫
        implementation 'org.jsoup:jsoup:1.13.1'
    
        //JSON数据解析
        implementation 'com.alibaba:fastjson:1.2.70'
    }
    

    第 2 步,并新建一个无障碍服务,用于处理抖音页面变动的事件

    //DouYinService.java
    //无障碍服务
    
    public class DouYinService extends BaseService
    {
        //主页面Activity
        private static final String PAGE_MAIN = "com.ss.android.ugc.aweme.main.MainActivity";
    
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event)
        {
            String className = event.getClassName().toString();
    
            if (TextUtils.equals(PAGE_MAIN, className))
            {
               //事件处理
            }
        }
    }    
    

    第 3 步,获取单个视频的分享地址

    image

    首先,模拟点击分享按钮,跳转到视频分享对话框

    //DouYinService.java
    
    //分享按钮id
    private static final String ID_SHARE = "com.ss.android.ugc.aweme:id/f4j";
    ​
    //查找分享按钮
    AccessibilityNodeInfo shareElement = findViewByID(ID_SHARE);  
    
    //模拟点击操作
    performViewClick(shareElement);
    

    需要注意的是,分享对话框首次展示时,复制视频链接的按钮不可见

    image

    因此,需要在分享对话框界面底部 左滑,直到复制视频链接的按钮可见接着执行点击操作,将当前视频的地址复制到系统剪切板

    //DouYinService.java
    
    //向左滑动到复制按钮可见
    while (true)
    {
        if (null == findViewByIDAndText(ID_SHARE_TAG, TEXT_SHARE_TAG))
        {
    
              break;
        }
    
        AccessibilityNodeInfo copyElement = findViewByIDAndText(ID_COPY_LINK, TEXT_COPY_LINK);
        if (null == copyElement)
        {
    
              Runtime.getRuntime().exec("adb shell input swipe 900 1600 300 1600");
        } else
        {
              Log.d("xag", "找到复制按钮,执行点击操作");
              performViewClick(copyElement);
              result = true;
              break;
        }
    
    }
    

    第 4 步,获取视频真实地址从系统剪切板中读取内容,然后利用 正则表达式 过滤出当前视频真实的分享地址

    //StringUtil.java
    ​
    /***
     * 利用正则表达式过滤出真实的视频地址
     * @param data
     * @return
     */
    public static String findUrlByStr(String data)
    {
        Pattern pattern = Pattern.compile("https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]");
        Matcher matcher = pattern.matcher(data);
        if (matcher.find())
        {
            return matcher.group();
        }
        return "";
    }
    

    第 5 步,爬取视频时长拿到视频的真实地址之后,用 Chrome 浏览器打开进行分析,发现会进行一次 重定向

    image

    使用 Jsoup 模拟上面的操作,连接视频的分享地址,获取视频重定向后的 URL 地址

    import org.jsoup.Connection;
    import org.jsoup.Jsoup;
    
    //获取重定向的url
    url = Jsoup.connect(url)
          .followRedirects(true)
          .execute().url().toExternalForm();
    

    分析发现,重定向后的地址包含了 视频的 ID

    image

    并且,下面发送的这个请求参数中恰好包含视频 ID,返回结果中包含了视频的时长等信息

    image

    因此,我们只需要从地址中过滤出视频 ID,然后模拟上面的请求即可

    //获取视频ID
    String item_id = StringUtil.getSubUtil(url, "video/(.*?)/\?region").get(0);
    
    //新的地址
    String new_url = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=" + item_id;
    
    Connection connection = Jsoup.connect(new_url).ignoreContentType(true);
    Connection data = connection.headers(Header.generateHeader());
    
    //请求结果
    String result = data.get().body().html();
    

    最后,新建一个实体类 VideoNewItem,使用 FastJson 进行数据解析,提取出视频的时长

    //解析数据
    VideoNewItem item = JSON.parseObject(result, VideoNewItem.class);
    
    //获取视频时长(毫秒)
    int videoDuration = item.getItem_list().get(0).getDuration();
    
    Log.d("xag", "视频时长:" + videoDuration + ",开始等待。。。");
    

    第 6 步,视频等待拿到视频的时长之后,就可以执行等待操作,然后向上滑动页面跳到下一个视频

    //倒计时,等待时间播放完成
    Thread.sleep(videoDuration);
    Log.d("xag", "等待完成,准备滑到下一个视频");
    
    //滑动到下一个视频
    try
    {
        Runtime.getRuntime().exec("adb shell input swipe 600 1200 600 600");
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    

    5. 最后

    重复上面的操作,即可以爬取视频时长,自动刷抖音短视频,完全解放掉双手

    我已经将文中全部源码上传到公众号后台,关注公众号「 AirPython 」后回复「 dyauto 」即可获得全部源码

    如果你觉得文章还不错,请大家点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

    推荐阅读

    聊聊 Python 做微信小程序自动化,那些踩过的坑?

    为了保护小姐姐的眼睛,我用自动化做了一款语音机器人

    自动化篇 | 朋友圈被折叠?会自动化不存在的

  • 相关阅读:
    volatile 能使得一个非原子操作变成原子操作吗?
    什么是线程局部变量?
    使用idea插件进行java代码生成
    mybatis plus+dynamic事务导致多数据源切换失败
    10_docker-compose
    Ubuntu的Python从2.x升级到3.x
    idea查看控制台数据mybatis的sql完整语句
    iframe高度处理
    angular路由
    去掉iPhone、iPad的默认按钮、输入框样式
  • 原文地址:https://www.cnblogs.com/xingag/p/13273924.html
Copyright © 2011-2022 走看看