前言
本文的文字和图片来源于网络,仅供学习、交流使用,没有任何商业用途,版权归原作者所有,如有问题,请立即联系我们处理。
作者:星安果 AirPython
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
python免费学习资料点击即可领取
你是否在为洗碗时,刷抖音需要滑动屏幕,导致屏幕沾上水而烦扰?
你是否为在吃饭时刷抖音,由于手机屏幕过大,导致手指滑动视频不方便而苦恼?
又或者是,冬天躺在被窝刷抖音,你是否为频繁伸出手去切换视频,而烦躁不安?
本篇文章将大家利用 自动化与爬虫,精准地刷抖音,完全解放自己的双手,做一回真正的懒人
实现
具体的实现思路是:无障碍服务 AccessibilityService 负责抖音 App 的 UI 自动化操作,Jsoup 负责爬取抖音视频的基本信息,包含每条视频的时长,最后保证每一条视频播放完成后,立马滑动到下一个视频
下面通过 6 步实现
第 1 步,使用 Andriod Studio 新建一个 Android 项目,使用 Gradle 新增依赖
//新增依赖
dependencies {
//jsoup负责爬虫
implementation 'org.jsoup:jsou;
//JSON数据解析
implementation 'com.alibaba:fastjson:1.2.70'
}
第 2 步,并新建一个无障碍服务,用于处理抖音页面变动的事件
//无障碍服务
public class DouYinService extends BaseService
{
//主页面Activity
private static final String PAGE_MAIN = "com.;;
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
String className = event.getClassName().toString();
if (PAGE_MAIN, className))
{
//事件处理
}
}
}
第 3 步,获取单个视频的分享地址
首先,模拟点击分享按钮,跳转到视频分享对话框
//分享按钮id
private static final String ID_SHARE = "com.;;
//查找分享按钮
AccessibilityNodeInfo shareElement = findViewByID(ID_SHARE);
//模拟点击操作
performViewClick(shareElement);
需要注意的是,分享对话框首次展示时,复制视频链接的按钮不可见
因此,需要在分享对话框界面底部 左滑,直到复制视频链接的按钮可见
接着执行点击操作,将当前视频的地址复制到系统剪切板
//向左滑动到复制按钮可见
while (true)
{
if (null == findViewByIDAndText(ID_SHARE_TAG, TEXT_SHARE_TAG))
{
break;
}
AccessibilityNodeInfo copyElement = findViewByIDAndText(ID_COPY_LINK, TEXT_COPY_LINK);
if (null == copyElement)
{
Run().exec("adb shell input swipe 900 1600 300 1600");
} else
{
Log.d("xag", "找到复制按钮,执行点击操作");
performViewClick(copyElement);
result = true;
break;
}
}
第 4 步,获取视频真实地址
从系统剪切板中读取内容,然后利用 正则表达式 过滤出当前视频真实的分享地址
/***
* 利用正则表达式过滤出真实的视频地址
* @param data
* @return
*/
public static String findUrlByStr(String data)
{
Pattern pattern = Pa("https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]");
Matcher matcher = (data);
if ())
{
return ma();
}
return "";
}
第 5 步,爬取视频时长
拿到视频的真实地址之后,用 Chrome 浏览器打开进行分析,发现会进行一次 重定向
使用 Jsoup 模拟上面的操作,连接视频的分享地址,获取视频重定向后的 URL 地址
import org.j;
import org.j;
//获取重定向的url
url = J(url)
.followRedirects(true)
.execute().url().toExternalForm();
分析发现,重定向后的地址包含了 视频的 ID
因此,我们只需要从地址中过滤出视频 ID,然后模拟上面的请求即可
//获取视频ID
String item_id = S(url, "video/(.*?)/\\?region").get(0);
//新的地址
String new_url = "; + item_id;
Connection connection = J(new_url).ignoreContentType(true);
Connection data = connec());
//请求结果
String result = da().body().html();
最后,新建一个实体类 VideoNewItem,使用 FastJson 进行数据解析,提取出视频的时长
//解析数据
VideoNewItem item = JSON.parseObject(result, VideoNewI);
//获取视频时长(毫秒)
int videoDuration = i().get(0).getDuration();
Log.d("xag", "视频时长:" + videoDuration + ",开始等待。。。");
第 6 步,视频等待
拿到视频的时长之后,就可以执行等待操作,然后向上滑动页面跳到下一个视频
//倒计时,等待时间播放完成
T(videoDuration);
Log.d("xag", "等待完成,准备滑到下一个视频");
//滑动到下一个视频
try
{
Run().exec("adb shell input swipe 600 1200 600 600");
} catch (IOException e)
{
e.printStackTrace();
}