【番外】用程序员的方式进行词曲投稿
有缘人你好~
我们又在《Learn XXX the Coders Way》系列相见啦~这次是番外内容(大概也算姊妹篇?)的第一篇,《Do XXX the Coders Way》
引子
最近几个周是被工作淹没的几周,原本计划要写的《用程序员的方式学习给视频起标题》还完全没有动工(逃……
而这件事呢,起因是我有个朋友……
她是一个作词人(嗯,一个特别高产的作词人),经常需要给各种音乐发行商投稿,而音乐发行商们收稿件……
是通过加微信!!!
我感觉这应该也不是什么巨大的工作量……直到她告诉我,她联系人列表里躺着的收歌老师有三位数……即便是最少的时候,她也需要给几十个“收歌老师”投稿。
我俩一起捋了一下投稿的操作流程:
其实在投稿的老师很少的时候,完全没有任何压力;不过量变产生质变,当数量达到数百的时候,这件事完全变成了另一个概念……
如果转发一次文件的操作时间为平均10s(算上搜索联系人,或者滑动列表选择联系人的时间),我们来算算完成投稿给500个“收歌老师”的总时间:
算下来完成这样一波操作,一共需要83分钟,也就是如果每两天写一首词并投稿的话,每天平均要花大半个小时去投稿!
对于被996疯狂压榨后(哦原来这是我),本来就只剩数个小时,只想“过一段自己的生活”的人,简直不能承受!
作弊……
谁能忍受每天要花掉额外的一小时去做一些重复性的工作呢?当然是不行啦!我们得想办法作弊!
如果换个聊天工具,比如 Telegram 或者 Discord ,我们很轻松就能通过官方提供的API接口来做这些事情,比如自动把指定的文件发送给指定的联系人。
但是对于微信这种产品,我们很难做到这样的事情,即便可以做,也有很高的被封号的危险。
作案工具调研
朋友给我发过来一个参考的“营销助手”类的工具,可以提供群发功能,但是收费非常高昂。
邀请朋友可以获得两小时免费试用时间,我试用了一下,发现工具使用了安卓的“无障碍”特性,用来结构化的访问软件UI,实现自动化操作。
对于 iOS 用户,可以考虑直接使用官方收编的捷径功能,文末附有 iOS 捷径功能的参考文档。
经过一番搜索,我发现了下面这些备选:
AutoJS
- 链接:https://pro.autojs.org/
- 运行环境:手机
- 原理:调用系统的无障碍API来完成自动操作,类似按键精灵,但是更加人性化
缺陷:
- API 很不稳定,在我的 MIUI 12 上根本无法获取到无障碍元素,虽然因为购买了 Pro 有些不甘,但最后还是放弃了。
- 软件本身使用非常麻烦,需要在VSCode上进行复杂的配置才能连接到手机,软件本身的使用体验不佳,不过特别在意隐私的可以使用这种完全本地的开发方式。
Hamibot
- 链接:https://hamibot.com/
- 运行环境:手机
- 原理:同样是使用无障碍API完成自动操作
- 缺陷:是 AutoJS 的 Fork,使用起来非常方便,产品设计非常人性化,缺点是必须登录并在平台上使用脚本编辑功能(这个编辑功能跟 VSCode 比就非常弱了),但这也正是它的优点—易于使用。
网易AirTest
- 链接:https://airtest.netease.com/
- 运行环境:PC + 手机
- 原理:可以使用截图+图像识别,也可以安装一个工具包后使用类似无障碍API的方式操作手机
- 缺陷:需要同时运行电脑跟手机,同时……大概是因为年久失修,无障碍服务的安卓服务包已经无法正常运行,执行的时候会崩溃,一番尝试后直接放弃了,如果是通用的游戏测试,估计能正常工作。
结论
最后还是选择了 Hamibot 作为了作案工具,其他的工具多少都有一些问题。
同时,在产品设计上,我们也可以看出来,Hamibot 虽然是 AutoJS 的 Fork ,但是他们明显对于普通用户更加友好,是“一眼能看懂用途”的 APP 说明。
成果
这里就略过各种操作过程了,直接贴一下最后的成果。
操作流程
→ 收藏DEMO文件和歌词文件到微信文件收藏
→ 给所有要投稿的特定联系人加上标签(相信一般人已经加上标签了)
→ 在脚本配置界面,配置DEMO文件名和歌词文件名,以及要发送到的目标联系人标签
→ 启动脚本,等待自动发送即可~
脚本链接:https://gist.github.com/winkidney/d7afa463d9e2f969f662b476ba0b1a57
避坑指南
- 在选择控件的时候,很多控件是不可点击的,请先获取控件的坐标再点击他们
- 有时候,一个元素,在A界面和B界面同时存在(比如一段文本),所以有时候遇到点击失效,请重新给元素增加一些特殊的识别选择器,以便能成功识别和点击。
嘘!
其实最后朋友没有成功用上这个工具hhhh,因为她的安卓机跟我的差异比较大,在我机器上完全正常,在她机器上却导致手机疯狂发烫(然而功能却无法执行),怀疑是安卓机的 API 差异导致的兼容性问题。
得亲自在手机上调一下才能知道是什么问题hhhh(匿了)。