feat: init
This commit is contained in:
654
lib.js
Normal file
654
lib.js
Normal file
@@ -0,0 +1,654 @@
|
||||
let db = require("./core.sqlite.js")
|
||||
let consts = require("./consts.js")
|
||||
|
||||
let _global_duration = 1000;
|
||||
let userList = [];
|
||||
text("发私信").find().forEach((item, idx) => {
|
||||
let obj =
|
||||
userList.push({
|
||||
obj: item,
|
||||
name: item.parent().parent().child(1).child(0).child(0).text(),
|
||||
})
|
||||
})
|
||||
|
||||
let global = {
|
||||
setDuration: function (duration) {
|
||||
_global_duration = duration
|
||||
},
|
||||
}
|
||||
|
||||
let store = storages.create("_##_@_DY_Proxy");
|
||||
|
||||
const project = "autojs"
|
||||
|
||||
let pwdFile = function (path) {
|
||||
let pwd = engines.myEngine().cwd()
|
||||
|
||||
if (!path) {
|
||||
return pwd
|
||||
}
|
||||
|
||||
if (path) {
|
||||
path = path.replace(/^\//, "")
|
||||
}
|
||||
|
||||
return `${pwd}/${project}/${path}`.replace(/\/\//g, "/").replace(/\/$/, "")
|
||||
}
|
||||
|
||||
let pageUser = {
|
||||
activity: "com.ss.android.ugc.aweme.profile.ui.UserProfileActivity",
|
||||
wait: function () {
|
||||
waitForActivity(this.activity)
|
||||
},
|
||||
open: function () {
|
||||
home()
|
||||
sleep(500)
|
||||
let activity = "snssdk1128://user/profile"
|
||||
app.startActivity({
|
||||
packageName: consts.Package.DouYin,
|
||||
action: "android.intent.action.VIEW",
|
||||
data: activity,
|
||||
});
|
||||
let appId = id(consts.AppID()).findOne(1000)
|
||||
if (appId) {
|
||||
appId.click()
|
||||
}
|
||||
|
||||
waitForActivity("com.ss.android.ugc.aweme.main.MainActivity")
|
||||
this.clickTabMe()
|
||||
},
|
||||
openUser: function (uid) {
|
||||
let activity = "snssdk1128://user/profile/{uid}".replace("{uid}", uid)
|
||||
app.startActivity({
|
||||
packageName: consts.Package.DouYin,
|
||||
action: "android.intent.action.VIEW",
|
||||
data: activity,
|
||||
});
|
||||
let appId = id(consts.AppID()).findOne(1000)
|
||||
if (appId) {
|
||||
appId.click()
|
||||
}
|
||||
|
||||
for (let i = 0; i <= 10; i++) {
|
||||
sleep(1000)
|
||||
if (currentActivity() != "com.ss.android.ugc.aweme.profile.ui.UserProfileActivity") {
|
||||
if (i == 10) {
|
||||
return false
|
||||
}
|
||||
continue
|
||||
}
|
||||
break
|
||||
}
|
||||
return true
|
||||
},
|
||||
gotoFriend: function () {
|
||||
className("com.bytedance.highperformanceview.layout.MeasureOnceRelativeLayout2").find()[2].click()
|
||||
waitForActivity("com.ss.android.ugc.aweme.following.ui.FollowRelationTabActivity")
|
||||
sleep(2000)
|
||||
return true
|
||||
},
|
||||
getStatistics: function () {
|
||||
let statistics = {
|
||||
like: 0,
|
||||
friend: 0,
|
||||
focus: 0,
|
||||
fans: 0,
|
||||
}
|
||||
className("com.bytedance.highperformanceview.layout.MeasureOnceRelativeLayout2").find().forEach((item, index) => {
|
||||
let tv = item.findOne(className("android.widget.TextView"))
|
||||
if (tv) {
|
||||
let text = tv.text()
|
||||
switch (index) {
|
||||
case 0:
|
||||
statistics.like = parseInt(text)
|
||||
case 1:
|
||||
statistics.focus = parseInt(text)
|
||||
case 2:
|
||||
statistics.fans = parseInt(text)
|
||||
case 3:
|
||||
statistics.friend = parseInt(text)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
store.put("__statistics", statistics)
|
||||
return statistics
|
||||
},
|
||||
hasNewFriend: function () {
|
||||
let statistics = store.get("__statistics", {
|
||||
like: 0,
|
||||
friend: 0,
|
||||
focus: 0,
|
||||
fans: 0,
|
||||
})
|
||||
|
||||
let currentStatistics = this.getStatistics()
|
||||
|
||||
if (currentStatistics.friend > statistics.friend) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
hasPublishItems: function () {
|
||||
let txt = "还没有作品"
|
||||
let id = "com.ss.android.ugc.aweme:id/title"
|
||||
|
||||
let elem = text(txt).findOne(2 * 1000)
|
||||
if (!elem) {
|
||||
return true
|
||||
}
|
||||
|
||||
return !(elem.id() == id)
|
||||
},
|
||||
|
||||
getBtnGuanZhu: function () {
|
||||
let txt = "关注"
|
||||
let _class = "android.widget.TextView"
|
||||
|
||||
let elems = text(txt).find()
|
||||
if (elems.empty()) {
|
||||
return false
|
||||
}
|
||||
|
||||
let elem = elems.find(className(_class)).findOne(clickable())
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
return elem
|
||||
},
|
||||
getBtnBianJiZiLiao: function () {
|
||||
let _desc = "编辑资料"
|
||||
let _class = "android.view.ViewGroup"
|
||||
|
||||
let elem = className(_class).find().findOne(descStartsWith(_desc))
|
||||
if (!elem) {
|
||||
log("找不到编辑资料")
|
||||
return false
|
||||
}
|
||||
|
||||
return elem
|
||||
},
|
||||
|
||||
getBtnSiXin: function () {
|
||||
let txt = "私信"
|
||||
let desc = "私信"
|
||||
|
||||
let elem = text(txt).findOne(2 * _global_duration)
|
||||
if (!elem) {
|
||||
log("找不到私信按钮")
|
||||
return false
|
||||
}
|
||||
|
||||
if (elem.desc() != desc) {
|
||||
log("私信按钮 desc 不匹配")
|
||||
return false
|
||||
}
|
||||
return elem
|
||||
},
|
||||
|
||||
hasProduce: function () {
|
||||
let _text = "还没有作品"
|
||||
let elem = text(_text).findOne(1000)
|
||||
if (!elem) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
getIPLocation: function () {
|
||||
let txt = "IP:"
|
||||
|
||||
let elem = textStartsWith(txt).findOne(1000)
|
||||
if (!elem) {
|
||||
log("找不到 IP 标签 id")
|
||||
return false
|
||||
}
|
||||
|
||||
return elem.text().replace(txt, "").trim()
|
||||
},
|
||||
|
||||
clickBtnSiXin: function () {
|
||||
let elem = this.getBtnSiXin()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
elem.click()
|
||||
sleep(2 * _global_duration)
|
||||
return true
|
||||
},
|
||||
|
||||
clickBtnGuanZhu: function () {
|
||||
let elem = this.getBtnGuanZhu()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
elem.click()
|
||||
sleep(2 * _global_duration)
|
||||
return true
|
||||
},
|
||||
clickTabMe: function () {
|
||||
let pt = className("android.widget.TextView").find().findOne(text("我")).bounds()
|
||||
click(pt.centerX(), pt.centerY())
|
||||
sleep(1000)
|
||||
},
|
||||
}
|
||||
|
||||
let pageChat = {
|
||||
getBtnVoice: function () {
|
||||
let _desc = "语音"
|
||||
let _class = "android.widget.Button"
|
||||
|
||||
let elem = className(_class).find().findOne(desc(_desc))
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
return elem
|
||||
},
|
||||
getBtnMyLoveSend: function () {
|
||||
let _txt = "发送"
|
||||
let _id = "com.ss.android.ugc.aweme:id/send"
|
||||
|
||||
let elem = id(_id).findOne(2 * _global_duration)
|
||||
if (!elem) {
|
||||
log("找不到发送按钮")
|
||||
return false
|
||||
}
|
||||
|
||||
return elem
|
||||
},
|
||||
getMyLoveFirstProduct: function () {
|
||||
let _class = "com.bytedance.ies.dmt.ui.widget.DmtTextView";
|
||||
let loves = className(_class).find()
|
||||
if (loves.empty()) {
|
||||
log("找不到我的喜欢")
|
||||
return false
|
||||
}
|
||||
|
||||
return loves.shift()
|
||||
},
|
||||
getMyLoveButton: function () {
|
||||
let _txt = "我的喜欢"
|
||||
let elem = null;
|
||||
|
||||
let times = 0
|
||||
while (times++ < 10) {
|
||||
elem = className("android.widget.Button").find().findOne(desc(_txt))
|
||||
if (elem) {
|
||||
return elem
|
||||
}
|
||||
|
||||
elem = className("android.widget.TextView").find().findOne(text(_txt))
|
||||
if (!elem) {
|
||||
sleep(1000)
|
||||
continue
|
||||
}
|
||||
elem = elem.parent()
|
||||
break
|
||||
}
|
||||
|
||||
if (times > 10) {
|
||||
log("找不到 我的喜欢 按钮")
|
||||
return false
|
||||
}
|
||||
|
||||
return elem
|
||||
},
|
||||
getPanelMore: function () {
|
||||
let _class = "androidx.viewpager.widget.ViewPager"
|
||||
|
||||
let elem = className(_class).findOne(2 * _global_duration)
|
||||
if (!elem) {
|
||||
log("找不到 更多面板")
|
||||
return false
|
||||
}
|
||||
|
||||
return elem
|
||||
},
|
||||
getBtnCloseMore: function () {
|
||||
let _desc = "关闭面板"
|
||||
let _class = "android.widget.Button"
|
||||
|
||||
let elem = className(_class).find().findOne(desc(_desc))
|
||||
if (!elem) {
|
||||
log("找不到关闭面板按钮")
|
||||
return false
|
||||
}
|
||||
|
||||
return elem
|
||||
},
|
||||
getBtnMore: function () {
|
||||
let _desc = "更多面板"
|
||||
let _class = "android.widget.Button"
|
||||
|
||||
let elem = className(_class).find().findOne(desc(_desc))
|
||||
if (!elem) {
|
||||
log("找不到更多面板按钮")
|
||||
return false
|
||||
}
|
||||
// log(elem.id())
|
||||
|
||||
return elem
|
||||
},
|
||||
clickBtnCloseMore: function () {
|
||||
let elem = this.getBtnCloseMore()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
log("点击更多按钮")
|
||||
elem.click()
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
clickBtnMore: function () {
|
||||
if (desc("关闭面板").findOne(2 * _global_duration)) {
|
||||
return true
|
||||
}
|
||||
|
||||
let elem = this.getBtnMore()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
elem.click()
|
||||
sleep(2 * _global_duration)
|
||||
return true
|
||||
},
|
||||
swipeMorePanelRight: function () {
|
||||
let elem = this.getPanelMore()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
// elem.scrollLeft()
|
||||
let x = elem.bounds().centerX() + elem.bounds().width() / 4
|
||||
let y = elem.bounds().centerY()
|
||||
let x1 = elem.bounds().left
|
||||
let y1 = elem.bounds().centerY()
|
||||
log(x, y, x1, y1)
|
||||
swipe(x, y, x1, y1, 200)
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
swipeMorePanelLeft: function () {
|
||||
let elem = this.getPanelMore()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
let x = elem.bounds().centerX() - elem.bounds().width() / 4
|
||||
let y = elem.bounds().centerY()
|
||||
let x1 = elem.bounds().right
|
||||
let y1 = elem.bounds().centerY()
|
||||
log(x, y, x1, y1)
|
||||
swipe(x, y, x1, y1, 200)
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
|
||||
clickBtnMyLove: function () {
|
||||
let elem = this.getMyLoveButton()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
elem.click()
|
||||
// click(elem.bounds().centerX(), elem.bounds().centerY())
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
clickBtnMyLoveFirstProduct: function () {
|
||||
let elem = this.getMyLoveFirstProduct()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
log(elem.className())
|
||||
click(elem.bounds().centerX(), elem.bounds().centerY())
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
clickBtnMyLoveSend: function () {
|
||||
let elem = this.getBtnMyLoveSend()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
elem.click()
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
pressBtnVoice: function (duration) {
|
||||
let elem = this.getBtnVoice()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
|
||||
press(elem.bounds().centerX(), elem.bounds().centerY(), duration)
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
sendAudioVoice: function (voice) {
|
||||
let elem = this.getBtnVoice()
|
||||
if (!elem) {
|
||||
log("找不到 语音 按钮")
|
||||
return false
|
||||
}
|
||||
|
||||
var musicDuration = threads.disposable();
|
||||
threads.start(function () {
|
||||
sleep(500)
|
||||
//播放音乐
|
||||
media.playMusic(files.path(`audio/${voice}.m4a`));
|
||||
media.pauseMusic()
|
||||
|
||||
//让音乐播放完
|
||||
let duration = media.getMusicDuration()
|
||||
musicDuration.setAndNotify(duration)
|
||||
sleep(500)
|
||||
media.resumeMusic()
|
||||
|
||||
sleep(duration);
|
||||
});
|
||||
|
||||
let duration = musicDuration.blockedGet()
|
||||
|
||||
press(elem.bounds().centerX(), elem.bounds().centerY(), 1000 + duration)
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
|
||||
},
|
||||
isSendVoiceMode: function () {
|
||||
let _txt = "按住 说话"
|
||||
return text(_txt).findOne(2 * _global_duration)
|
||||
},
|
||||
getBtnVoiceToTxt: function () {
|
||||
return desc("文本").findOne(2 * _global_duration)
|
||||
},
|
||||
getInputSendTxt: function () {
|
||||
return text("发送消息").findOne(2 * _global_duration)
|
||||
},
|
||||
clickInputSendTxt: function () {
|
||||
let elem = this.getInputSendTxt()
|
||||
if (!elem) {
|
||||
log("找不到发送消息输入框")
|
||||
return false
|
||||
}
|
||||
|
||||
elem.click()
|
||||
sleep(_global_duration)
|
||||
return true
|
||||
},
|
||||
getBtnSendTxt: function () {
|
||||
return desc('发送').findOne(2 * _global_duration)
|
||||
},
|
||||
sendText: function (txt) {
|
||||
if (this.isSendVoiceMode()) {
|
||||
let elem = this.getBtnVoiceToTxt()
|
||||
if (!elem) {
|
||||
return false
|
||||
}
|
||||
elem.click()
|
||||
sleep(_global_duration)
|
||||
}
|
||||
|
||||
elem = this.getInputSendTxt()
|
||||
if (!elem) {
|
||||
log("找不到发送消息输入框")
|
||||
return false
|
||||
}
|
||||
|
||||
elem.setText(txt)
|
||||
sleep(_global_duration)
|
||||
|
||||
if (!this.getBtnSendTxt().click()) {
|
||||
log("找不到发送按钮")
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
let pageFriend = {
|
||||
activity: "com.ss.android.ugc.aweme.following.ui.FollowRelationTabActivity",
|
||||
wait: function () {
|
||||
lib.waitForActivity(_activity)
|
||||
},
|
||||
open: function () {
|
||||
// app.startActivity(this.activity)
|
||||
},
|
||||
getFriends: function () {
|
||||
let userList = [];
|
||||
|
||||
text("发私信").find().forEach((item, idx) => {
|
||||
let name = item.parent().parent().child(1).child(0).child(0).text()
|
||||
// log("check name exists", name)
|
||||
if (db.existsUser(name)) {
|
||||
return
|
||||
}
|
||||
|
||||
userList.push({ button: item, name: name })
|
||||
})
|
||||
return userList
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let st = {
|
||||
times: function (times) {
|
||||
if (times != undefined) {
|
||||
return store.put('__times', times)
|
||||
}
|
||||
return store.get('__times', 0)
|
||||
},
|
||||
addTimes: function () {
|
||||
return store.put('__times', this.times() + 1)
|
||||
},
|
||||
voice: function (voice) {
|
||||
if (voice != undefined) {
|
||||
return store.put('__voice', voice)
|
||||
}
|
||||
return store.get('__voice', "default")
|
||||
},
|
||||
produce: function (produce) {
|
||||
if (produce != undefined) {
|
||||
return store.put('__produce', produce)
|
||||
}
|
||||
return store.get('__produce', false)
|
||||
},
|
||||
name_keyword: function (keyword) {
|
||||
if (keyword != undefined) {
|
||||
return store.put('__name_keyword', keyword)
|
||||
}
|
||||
return store.get('__name_keyword', [])
|
||||
},
|
||||
default_avatar: function (avatar) {
|
||||
if (avatar != undefined) {
|
||||
return store.put('__default_avatar', avatar)
|
||||
}
|
||||
return store.get('__default_avatar', false)
|
||||
},
|
||||
default_name: function (name) {
|
||||
if (name != undefined) {
|
||||
return store.put('__default_name', name)
|
||||
}
|
||||
return store.get('__default_name', false)
|
||||
},
|
||||
region: function (region) {
|
||||
if (region != undefined) {
|
||||
return store.put('__region', region)
|
||||
}
|
||||
return store.get('__region', [])
|
||||
},
|
||||
wechat: function (wechat) {
|
||||
if (wechat != undefined) {
|
||||
return store.put('__wechat', wechat)
|
||||
}
|
||||
return store.get('__wechat', "")
|
||||
},
|
||||
hello: function (hello) {
|
||||
if (hello != undefined) {
|
||||
return store.put('__hello', hello)
|
||||
}
|
||||
return store.get('__hello', "你好")
|
||||
},
|
||||
host: function (h) {
|
||||
if (h) {
|
||||
store.put("__host", h)
|
||||
return h
|
||||
}
|
||||
|
||||
let host = store.get("__host", "")
|
||||
if (host.length == 0) {
|
||||
host = "https://f.jdwan.com"
|
||||
store.put("__host", host)
|
||||
}
|
||||
return host
|
||||
},
|
||||
lastID: function (id) {
|
||||
if (id) {
|
||||
return store.put('__lastID', id)
|
||||
}
|
||||
return store.get('__lastID', 0)
|
||||
},
|
||||
config_version: function (version) {
|
||||
if (version) {
|
||||
return store.put('__configVersion', version)
|
||||
}
|
||||
return store.get('__configVersion', 0)
|
||||
},
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
duration: 1000,
|
||||
global: global,
|
||||
page: {
|
||||
user: pageUser,
|
||||
chat: pageChat,
|
||||
friend: pageFriend,
|
||||
},
|
||||
store: st,
|
||||
kill: function () {
|
||||
let name = consts.Package.DouYin
|
||||
app.openAppSetting(name);//通过包名打开应用的详情页(设置页)
|
||||
text(app.getAppName(name)).waitFor();//通过包名获取已安装的应用名称,判断是否已经跳转至该app的应用设置界面
|
||||
sleep(500);//稍微休息一下,不然看不到运行过程,自己用时可以删除这行
|
||||
let is_sure = textMatches(/(.*强.*|.*停.*|.*结.*)/).findOne();//在app的应用设置界面找寻包含“强”,“停”,“结”,“行”的控件
|
||||
//特别注意,应用设置界面可能存在并非关闭该app的控件,但是包含上述字样的控件,如果某个控件包含名称“行”字
|
||||
//textMatches(/(.*强.*|.*停.*|.*结.*|.*行.*)/)改为textMatches(/(.*强.*|.*停.*|.*结.*)/)
|
||||
//或者结束应用的控件名为“结束运行”直接将textMatches(/(.*强.*|.*停.*|.*结.*|.*行.*)/)改为text("结束运行")
|
||||
|
||||
if (is_sure.enabled()) {//判断控件是否已启用(想要关闭的app是否运行)
|
||||
is_sure.parent().click();//结束应用的控件如果无法点击,需要在布局中找寻它的父控件,如果还无法点击,再上一级控件,本案例就是控件无法点击
|
||||
textMatches(/(.*确.*|.*定.*)/).findOne().click();//需找包含“确”,“定”的控件
|
||||
log(app.getAppName(name) + "应用已被关闭");
|
||||
sleep(1000);
|
||||
back();
|
||||
} else {
|
||||
log(app.getAppName(name) + "应用不能被正常关闭或不在后台运行");
|
||||
back();
|
||||
}
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user