bceyk 发表于 2022-9-2 12:25

某东好玩节autojs脚本

本帖最后由 bceyk 于 2022-9-10 09:05 编辑

根据618 MonsterNone的脚本改的
等了一天都没人写
只能自己改了


如果违规请帮忙删除。

autojs下载地址https://wwp.lanzouy.com/i5XzA0av9ouf


20220902 15:01 修复了一些问题,用不了的重新导入下
20220903 08:48 新的一天,我才发现我又制造了那么多bug,改掉了。
20220903 09:57 修复参加游戏返回不了的问题
20220910 09:04 修复加购的问题
if (!auto.service) {
    toast('无障碍服务未启动!退出!')
    exit()
}
console.show()
function getSetting() {
    let indices = []
    autoOpen && indices.push(0)
    autoMute && indices.push(1)
    autoJoin && indices.push(2)
    xiayou && indices.push(3)
    let settings = dialogs.multiChoice('任务设置', ['自动打开京东进入活动。多开或任务列表无法自动打开时取消勾选', '自动调整媒体音量为0。以免直播任务发出声音,首次选择需要修改系统设置权限', '自动完成入会任务。京东将授权手机号给商家,日后可能会收到推广短信','开启去下游参加游戏任务(黑号无法完成脚本会卡死)'], indices)

    if (settings.length == 0) {
      toast('取消选择,任务停止')
      exit()
    }

    if (settings.indexOf(0) != -1) {
      storage.put('autoOpen', true)
      autoOpen = true
    } else {
      storage.put('autoOpen', false)
      autoOpen = false
    }
    if (settings.indexOf(1) != -1) {
      storage.put('autoMute', true)
      autoMute = true
    } else {
      storage.put('autoMute', false)
      autoMute = false
    }
    if (settings.indexOf(2) != -1) {
      storage.put('autoJoin', true)
      autoJoin = true
    } else {
      storage.put('autoJoin', false)
      autoJoin = false
    }
    if (settings.indexOf(3) != -1) {
      storage.put('xiayou', true)
      xiayou = true
    } else {
      storage.put('xiayou', false)
      xiayou = false
    }
}

let storage = storages.create("jd_task");
let autoOpen = storage.get('autoOpen', true)
let autoMute = storage.get('autoMute', true)
let autoJoin = storage.get('autoJoin', true)
let xiayou = storage.get('xiayou', true)
getSetting()

if (autoMute) {
    try {
      device.setMusicVolume(0)
      toast('成功设置媒体音量为0')
    } catch (err) {
      alert('首先需要开启权限,请开启后再次运行脚本')
      exit()
    }
}

console.log('开始完成京东任务...')
console.log('按音量下键停止')

device.keepScreenDim(30 * 60 * 1000) // 防止息屏30分钟

// 自定义取消亮屏的退出方法
function quit() {
    device.cancelKeepingAwake()
    exit()
}

// 监听音量下键
function registerKey() {
    events.observeKey()
    events.onKeyDown('volume_down', function (event) {
      console.log('京东任务脚本停止了')
      console.log('请手动切换回主页面')
      startCoin && console.log('本次任务开始时有' + startCoin + '金币')
      quit()
    })
}
threads.start(registerKey)

// 自定义一个findTextDescMatchesTimeout
function findTextDescMatchesTimeout(reg, timeout) {
    let c = 0
    while (c < timeout / 50) {
      let result = textMatches(reg).findOnce() || descMatches(reg).findOnce()
      if (result) return result
      sleep(50)
      c++
    }
    return null
}

// 打开京东进入活动
function openAndInto() {
    console.log('正在打开京东App...')
    if (!launch('com.jingdong.app.mall')) {
      console.log('可能未安装京东App')
    }

    sleep(2000)
    console.log('进入活动页面')

    app.startActivity({
      action: "VIEW",
      data: 'openApp.jdMobile://virtual?params={"category":"jump","action":"to","des":"m","sourceValue":"JSHOP_SOURCE_VALUE","sourceType":"JSHOP_SOURCE_TYPE","url":"https://bunearth.m.jd.com/babelDiy/Zeus/3k5mPYtzKqBmePisPkRxqzjkGChd/index.html","M_sourceFrom":"mxz","msf_type":"auto"}'
    })
}

// 获取金币数量
function getCoin() {
    let anchor = className('android.view.View').filter(function (w) {
      if ((w.desc() && w.desc().match(/分红:.*份/)) || (w.text() && w.text().match(/分红:.*份/))) {
            return true
      } else {
            return false
      }
    }).findOne(5000)
    if (!anchor) {
      console.log('找不到分红控件')
      return false
    }
    let coin = anchor.parent().child(2).text()
    if (coin) {
      return parseInt(coin)
    } else {
      coin = anchor.parent().child(3).text() // 有可能中间插了个控件
      if (coin) {
            return parseInt(coin)
      } else {
            return false
      }
    }
}

// 打开任务列表
function openTaskList() {
    console.log('打开任务列表')
    let taskListButtons = findTextDescMatchesTimeout(/赚次元币赢红包/, 20000)
    if (!taskListButtons) {
      console.log('未能打开任务列表,请关闭京东重新运行!')
      quit()
    }
    let taskListButton=taskListButtons.parent()

    taskListButton.click()
    console.log('等待任务列表')
    if (!findTextDescMatchesTimeout(/累计任务奖励/, 10000)) {
      console.log('似乎没能打开任务列表,退出!')
      console.log('如果已经打开而未检测到,请删除101版本及以上的webview或使用国内应用市场版京东尝试。')
      quit()
    }
}

// 关闭任务列表
function closeTaskList() {
    console.log('关闭任务列表')
    let jiangli = findTextDescMatchesTimeout(/累计任务奖励/, 5000)
    if (!jiangli) {
      console.log('无法找到任务奖励标识')
      return false
    }
    let closeBtn = jiangli.parent().child(6)
    return closeBtn.click()
}

// 重新打开任务列表
function reopenTaskList() {
    closeTaskList()
    sleep(3000)
    openTaskList()
    sleep(5000)
}

// 获取未完成任务,根据数字标识,返回任务按钮、任务介绍、任务数量(数组)
function getTaskByText() {
    let tButton = null,
      tText = null,
      tCount = 0,
      tTitle = null
    console.log('寻找未完成任务...')
    let taskButtons = textMatches(/.*浏览并关注.*|.*浏览.*s.*|.*累计浏览.*|.*浏览可得.*|.*逛晚会.*|.*品牌墙.*|.*打卡.*|.*逛会场.*|.*浏览加购.*|.*逛逛.*次元币.*|.*参加游戏.*|.*预约.*/).find()


    if (!taskButtons.empty()) { // 如果找不到任务,直接返回
      for (let i = 0; i < taskButtons.length; i++) {
            let item = taskButtons
            let a=item.indexInParent()
      
            tTitle = item.text()
            
            let r = item.parent().child(a-1).text().match(/(\d)\/(\d*)/)
         
            if (!r) continue

            tCount = (r - r)

            console.log(tTitle, tCount)
            if (tCount) { // 如果数字相减不为0,证明没完成
                tText = item.text()
               
                if (!autoJoin && tText.match(/成功入会/)) continue
                if (!xiayou && tText.match(/.*参加游戏.*/)) continue
                if (tText.match(/下单/)) continue
                tButton = item.parent().child(a+1)
                break
            }
      }
    }
    return
}

// 返回任务列表并检查是否成功,不成功重试一次,带有延时
function backToList() {
    let i = 0
    sleep(500)
    back()
    let leave = textMatches(/暂时离开/).findOne(5000)
    if (leave) {
      click(leave.bounds().centerX(), leave.bounds().centerY())
      sleep(3000)
    }
   
    for (i = 0; i < 3; i++) { // 尝试返回3次
      if (!findTextDescMatchesTimeout(/累计任务奖励/, 5000)) {
            console.log('返回失败,重试返回')
            sleep(2000)
            back()
            continue
      } else {
            break
      }
    }
    console.log(i)
    if(i==3){
    leave = textMatches(/已发放至“京东APP-我的-优惠券”,可立即使用/).findOne(5000)
    if (leave) {
      leave=leave.parent().parent().parent().child(1)
      click(leave.bounds().centerX(), leave.bounds().centerY())
      sleep(3000)
      back()
    }else if(autoOpen){
    console.log("返回失败,尝试重新进入活动")
      openAndInto()
    }else{
      console.log("返回失败,且未开启自动进入活动,请手动进入活动列表重新启动脚本")
    }
   
    }

   
    sleep(3000)
}

// 浏览n秒的任务
function timeTask() {
    console.log('等待浏览任务完成...')
    let c = 0
    while (c < 40) { // 0.5 * 40 = 20 秒,防止死循环
      if ((textMatches(/任务完成/).exists() )) // 等待已完成出现
      // if ((textMatches(/任务完成/).exists() || descMatches(/获得.*?次元币/).exists()))   
            break
      if ((textMatches(/已浏览/).exists() || descMatches(/已浏览/).exists())) { // 失败
            console.log('上限,返回刷新任务列表')
            return false
      }

      // 弹窗处理
      /*
      let pop = text('升级开卡会员领好礼')
      if (pop.exists()) {
            pop.parent().parent().parent().child(2).click()
            console.log('关闭会员弹窗')
      }
      */
      sleep(500)
      c++
    }
    if (c > 39) {
      console.log('未检测到任务完成标识。')
      return false
    }
    return true
}

// 入会任务
function joinTask() {
    let check = textMatches(/.*确认授权即同意.*|.*我的特权.*|.*立即开卡.*|.*解锁全部会员福利.*|.*授权信息.*/).findOne(8000)
    if (!check) {
      console.log('无法找到入会按钮,判定为已经入会')
      back()
      sleep(3000)
      return true
    } else if (check.text().match(/我的特权/)) {
      console.log('已经入会,返回')
      back()
      sleep(3000)
      return true
    } else {
      sleep(2000)
      if (check.text().match(/.*授权信息.*/)) {
            let up= textMatches(/去升级/).findOne(5000)
            click(up.bounds().centerX(), up.bounds().centerY())
            sleep(2000)
            check=textMatches(/.*确认授权即同意.*|.*我的特权.*|.*立即开卡.*|.*解锁全部会员福利.*/).findOne(8000)

      }
      if (check.text().match(/.*立即开卡.*|.*解锁全部会员福利.*/)) {
            let btn = check.bounds()
            console.log('即将点击开卡/解锁福利,自动隐藏控制台')
            sleep(500)
            console.hide()
            sleep(500)
            click(btn.centerX(), btn.centerY())
            sleep(500)
            console.show()
            check = textMatches(/.*确认授权即同意.*/).findOne(8000)
            sleep(2000)
      }

      if (!check) {
            console.log('无法找到入会按钮弹窗,加载失败')
            return false
      }

      if (check.indexInParent() == 6) {
            check = check.parent().child(5)
      } else if (check.text() == '确认授权即同意') {
            check = check.parent().child(0)
      } else {
            check = check.parent().parent().child(5)
      }

      check = check.bounds()

      let x = check.centerX()
      let y = check.centerY()

      console.log('检测是否有遮挡')
      let float = className('android.widget.ImageView')
            .filter(function (w) {
                let b = w.bounds()
                return b.left <= x && b.right >= x && b.top <= y && b.bottom >= y
            }).find()

      if (float.length > 1) {
            console.log('有浮窗遮挡,尝试移除')
            if (device.sdkInt >= 24) {
                gesture(1000, , )
                console.log('已经进行移开操作,如果失败请反馈')
            } else {
                console.log('安卓版本低,无法自动移开浮窗,入会任务失败。至少需要安卓7.0。')
                return false
            }
      } else {
            console.log('未发现遮挡的浮窗,继续勾选')
      }

      console.log('即将勾选授权,自动隐藏控制台')
      sleep(500)
      console.hide()
      sleep(500)
      click(x, y)
      sleep(500)
      console.show()

      console.log('准备点击入会按钮')
      let j = textMatches(/^确认授权(并加入店铺会员)*$/).findOne(5000)
      

      if (!j) {
            console.log('无法找到入会按钮,失败')
            return false
      }
      click(j.bounds().centerX(), j.bounds().centerY())
      sleep(3000)
      console.log('入会完成,返回')
      return true
    }
}

// 浏览商品和加购的任务,cart参数为是否加购的flag
function itemTask(cart) {
    console.log('等待进入商品列表...')
    if (!textContains('当前页').findOne(10000)) {
      console.log('未能进入商品列表。')
      return false
    }
    sleep(2000)
    let items = textContains('.jpg!q').find()

    for (let i = 0; i < items.length; i++) {
      if (cart) {
            console.log('加购并浏览')
            let tmp = items.parent().parent()
            tmp.child(tmp.childCount() - 1).click()
      } else {
            console.log('浏览商品页')
            items.parent().parent().child(4).click()
      }
      sleep(5000)
      console.log('返回')
      back()
      sleep(5000)
      let r = textContains('.jpg!q').findOnce()
      if (!r) {
            back()
            sleep(5000)
      }
      if (i >= 4 - 1) {
            break
      }
    }
    return true
}

// 逛店任务
function shopTask() {
    console.log('等待进入店铺列表...')
    let banner = textContains('喜欢').findOne(10000)
    if (!banner) {
      console.log('未能进入店铺列表。返回。')
      return false
    }
    let c = banner.text().match(/(\d)\/(\d*)/)
    if (!c) {
      c = 4 // 进行4次
    } else {
      c = c - c
    }
    sleep(2000)
    console.log('进行', c, '次')
    let like = textContains('喜欢').boundsInside(1, 0, device.width, device.height).findOnce()
    if (!like) {
      console.log('未能找到喜欢按钮。返回。')
      return false
    }
    let bound =
    console.log('喜欢按钮位于', bound)
    for (let i = 0; i < c; i++) {
      click(bound, bound)
      console.log('浏览店铺页')
      sleep(8000)
      console.log('返回')
      back()
      sleep(5000)
      let r = textContains('喜欢').findOnce()
      if (!r) {
            back()
            sleep(5000)
      }
    }
    return true
}

// 参观任务
function viewTask() {
    console.log('进行参观任务')
    sleep(5000)
    console.log('参观任务直接返回')
    return true
}

// 品牌墙任务
function wallTask() {
    console.log('进行品牌墙任务')
    sleep(3000)
    for (let i of ) { // 选5个
      console.log('打开一个')
      textContains('!q70').boundsInside(0, 0, device.width, device.height).findOnce(i).click()
      sleep(5000)
      console.log('直接返回')
      back()
      let r = textContains('!q70').findOne(8000)
      if (!r) back()
      sleep(3000)
    }
    console.log('返回顶部')
    let root = textContains('到底了').findOnce().parent().parent()
    root.child(root.childCount() - 2).click()
    console.log('品牌墙完成后重新打开任务列表')
    sleep(3000)
    openTaskList()
    return true
}

// 单个任务的function,自动进入任务、自动返回任务列表,返回boolean
function doTask(tButton, tText, tTitle) {
    let clickFlag = tButton.click()
    let tFlag
    if (tText.match(/浏览并关注.*s|浏览.*s/)) {
      console.log('进行', tText)
      tFlag = timeTask()
    } else if (tText.match(/累计浏览|加购/)) {
      console.log('进行累计浏览任务')
      if (tText.match(/加购/)) {
            tFlag = itemTask(true)
      } else {
            tFlag = itemTask(false)
      }
    } else if (tText.match(/入会/)) {
      console.log('进行入会任务')
      tFlag = joinTask()
      return tFlag
    } else if (tText.match(/浏览可得|浏览并关注|晚会/)) {
      let tTitle = tButton.parent().child(1).text()
      if (tTitle.match(/种草城/)) {
            tFlag = shopTask()
      } else {
            tFlag = viewTask()
      }
    } else if (tText.match(/品牌墙/)) {
      tFlag = wallTask()
      return tFlag // 品牌墙无需backToList,提前返回
    } else if (tText.match(/打卡/)) {
      tFlag = clickFlag // 打卡点击一次即可
      return tFlag
    } else {
      console.log('未知任务类型,默认为浏览任务', tText)
      tFlag = viewTask()
    }
    backToList()
    return tFlag
}

function signTask() {
    let anchor = className('android.view.View').filter(function (w) {
      return w.clickable() && (w.text() == '去使用奖励' || w.desc() == '去使用奖励')
    }).findOne(5000)

    if (!anchor) {
      console.log('未找到使用奖励按钮,签到失败')
      return false
    }

    let anchor_index = anchor.indexInParent()
    let sign = anchor.parent().child(anchor_index + 2) // 去使用的后两个
    sign.click()
    sleep(3000)

    sign = textMatches(/.*点我签到.*|.*明天再来.*/).findOne(5000)
    if (!sign) {
      console.log('未找到签到按钮')
      return false
    }

    if (sign.text().match(/明天再来/)) {
      console.log('已经签到')
    } else {
      click(sign.bounds().centerX(), sign.bounds().centerY())
      sleep(1000)
      console.log('签到完成')

    }


    console.log('检测是否有通知权限弹窗')
    if (textContains('通知权限').findOne(3000)) {
      console.log('出现弹窗,关闭')
      text('取消').click()
      sleep(1000)
      console.log('二次检测')
      if (textContains('通知权限').findOne(3000)) {
            console.log('出现弹窗,关闭')
            text('取消').click()
            sleep(1000)
            console.log('完成')
      } else {
            console.log('没有弹窗,继续。')
      }
    } else {
      console.log('没有弹窗,继续。')
    }

    return true
}

let startCoin = null // 音量键需要

// 全局try catch,应对无法显示报错
try {
    if (autoOpen) {
      openAndInto()
      console.log('等待活动页面加载')
      if (!findTextDescMatchesTimeout(/赚次元币赢红包/, 8000)) {
            console.log('未能进入活动,请重新运行!')
            quit()
      }
      console.log('成功进入活动')
      sleep(2000)

      openTaskList();
    } else {
      alert('请关闭弹窗后立刻手动打开京东App进入活动页面,并打开任务列表', '限时30秒')
      console.log('请手动打开京东App进入活动页面,并打开任务列表')
      if (!findTextDescMatchesTimeout(/累计任务奖励/, 30000)) {
            console.log('未能进入活动,请重新运行!')
            quit()
      }
      console.log('成功进入活动')
    }

    sleep(5000)

    // 完成所有任务的循环
    while (true) {
      let = getTaskByText()

      if (!taskButton) {
            console.log('领取累计奖励')
            textContains('去领取').find().forEach(function (e, i) {
                console.log('领取第' + (i + 1) + '个累计奖励')
                e.click()
                sleep(2000)
            })

         // console.log('最后进行签到任务')
         // signTask()

            console.log('没有可自动完成的任务了,退出。')

            alert('任务已完成', '互动任务手动完成之后还会有新任务,建议做完互动二次运行脚本')
            quit()
      }

      if (taskText.match(/品牌墙/)) { // 品牌墙0/3只需要一次完成
            taskCount = 1
      }

      // 根据taskCount进行任务,一类任务一起完成,完成后刷新任务列表
      console.log('进行' + taskCount + '次“' + taskText + '”类任务')
      for (let i = 0; i < taskCount; i++) {
            console.log('第' + (i + 1) + '次')
            let taskFlag = doTask(taskButton, taskText, taskTitle)
            if (taskFlag) {
                console.log('完成,进行下一个任务')
            } else {
                console.log('任务失败')
                break // 直接退出,无需在此调用reopen
            }
      }
      console.log('重新打开任务列表获取任务')
      reopenTaskList()
    }
} catch (err) {
    device.cancelKeepingAwake()
    if (err.toString() != 'JavaException: com.stardust.autojs.runtime.exception.ScriptInterruptedException: null') {
      console.error(new Error().stack, err)
      startCoin && console.log('本次任务开始时有' + startCoin + '金币')
    }
}

EchoChao 发表于 2022-9-2 17:16

运行脚本时候发现的问题,可以给大家参考一下。
因为我所有的脚本都是放在另外一个旧手机运行的,反应速度比较慢,楼主代码中的打开应用sleep(2000)就等待了2秒钟
导致我的应用还没完全打开,从而直接导致错误
所以大家手机配置要是低的话可以修改一下时间,当然大家手机可以的话就不用改了

bceyk 发表于 2022-9-2 15:03

bowie1127 发表于 2022-9-2 14:53
不行一直说无障碍没启动,启动了还是说没启动,重开软件和重新开机都试过了,但是我在autojs打开旧的京东 ...

要不。。把前四行删了试试

大帝的春天 发表于 2022-9-2 12:56

我也等了一天{:1_918:}

SundaySnow 发表于 2022-9-2 13:08

感谢楼主分享!试一试

xyqrm 发表于 2022-9-2 13:17

终于等到你,还好我没放弃:lol

zzwapj 发表于 2022-9-2 13:22

等一个成品。不会啊...

adaiswj 发表于 2022-9-2 13:40

小白只能等大佬出成品了,坐等

不知道改成啥 发表于 2022-9-2 13:46

有没有大佬打包的

zhangzhequan 发表于 2022-9-2 13:54

大佬有没有过检测的autojs

bceyk 发表于 2022-9-2 13:56

zhangzhequan 发表于 2022-9-2 13:54
大佬有没有过检测的autojs

京东没检测吧

铁铁CQ 发表于 2022-9-2 14:15

好开心,蹲到这个脚本
页: [1] 2 3 4 5 6
查看完整版本: 某东好玩节autojs脚本