Effectuez automatiquement les tâches d'activité Jingdong 618 : utilisez le code de script autojs pour raccrocher facilement

const VERSION = '2022618-16'

if (!auto.service) { toast('Le service d'accessibilité n'est pas démarré ! Quitter !') exit() }


let showVersion = function () { console.log('current version:' + VERSION) console.log('Hello, World!') toast('current version:' + VERSION) }



console.show()
showVersion()

function getSetting() { let indices = [] autoOpen && indices.push(0) autoMute && indices.push(1) autoJoin && indices.push(2)



let settings = dialogs.multiChoice('Paramètres des tâches', ['Ouvrir automatiquement JD.com pour accéder à l'événement. Décochez-le si vous ouvrez plusieurs fois ou si la liste des tâches ne peut pas être ouverte automatiquement', 'Ajuster automatiquement le volume du média à 0. Pour éviter le son de la tâche de diffusion en direct, sélectionnez-la pour la première fois. Il est nécessaire de modifier l'autorisation de configuration du système ", " Compléter automatiquement la tâche d'adhésion. JD autorisera le numéro de téléphone mobile au commerçant et pourra recevoir des SMS promotionnels. dans le futur'], indices)

if (settings.length == 0) { toast('Annuler la sélection, tâche arrêtée') 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 } }




















laissez stockage = stockages.create("jd_task");
laissez autoOpen = storage.get('autoOpen', true)
laissez autoMute = storage.get('autoMute', true)
laissez autoJoin = storage.get('autoJoin', true)
getSetting()

if (autoMute) { try { device.setMusicVolume(0) toast('Successfully set the media volume to 0') } catch (err) { alert('Vous devez d'abord activer l'autorisation, veuillez réexécuter le script après l'avoir activé ') sortie() } }







console.log('Commence à terminer la tâche Jingdong...')
console.log('Appuyez sur le bouton de réduction du volume pour arrêter')

device.keepScreenDim(30 * 60 * 1000) // empêche l'écran de s'assombrir pendant 30 minutes

// Personnalisez la méthode de sortie d'annulation de la fonction d'écran lumineux
quit() { device.cancelKeepingAwake() exit() }


// Surveiller la
fonction de la touche de diminution du volume registerKey() { try { events.observeKey() } catch(err) { console.log('La touche de volume du moniteur n'a pas pu s'arrêter. Il devrait s'agir d'une erreur dans l'autorisation d'accessibilité. Veuillez fermer la tâche d'arrière-plan du logiciel et relancez-la. ') console.log('Si cela ne fonctionne toujours pas, vous pouvez redémarrer le téléphone et essayer.') quit() } events.onKeyDown('volume_down', function (event) { console.log('Script de tâche Jingdong arrêté') console.log( 'Veuillez revenir manuellement à la page principale') startCoin && console.log('Cette tâche a commencé avec' + startCoin + 'pièces d'or') quit() }) } threads.start(registerKey)














// Recherche la
fonction findTextDescMatchesTimeout findTextDescMatchesTimeout(reg, timeout) { let c = 0 while (c < timeout / 50) { let result = textMatches(reg).findOnce() || descMatches(reg).findOnce() if (résultat) renvoie le résultat sleep(50) c++ } renvoie null }








// Ouvrez Jingdong et entrez la
fonction d'activité openAndInto() { console.log('Opening Jingdong App...') if (!launch('com.jingdong.app.mall')) { console.log('It may ne pas être installé JD App') }



sleep(2000)
console.log('Entrer dans la page active')

app.startActivity({ action : "VIEW", données : 'openApp.jdMobile://virtual?params={"category":"jump","action":"to","des":"m"," sourceValue":"JSHOP_SOURCE_VALUE","sourceType":"JSHOP_SOURCE_TYPE","url":"https://u.jd.com/JCTuenU","M_sourceFrom":"mxz","msf_type":"auto"}' }) }



// Récupère le nombre de pièces d'or
function getCoin() { let anchor = className('android.view.View').filter(function (w) { if ((w.desc() && w.desc().match (/dividend :.*parts/)) || (w.text() && w.text().match(/dividend: .*parts/))) { return true } else { return false } } ) . findOne (5000) if (!anchor) { console.log('Cannot find dividend control') return false } let coin = anchor.parent().child(2).text() if (coin) { return parseInt(coin) } else { coin = anchor.parent().child(3).text() // Il peut y avoir un contrôle inséré au milieu if (coin) { return parseInt(coin) } else { return false } } }






















// Fonction d'ouverture de la liste des tâches
openTaskList() { console.log('Ouvrir la liste des tâches') let taskListButtons = findTextDescMatchesTimeout(/dividend+card/, 20000) if (!taskListButtons) { console.log('Échec de l'ouverture de la liste des tâches , veuillez fermer Jingdong et relancer !') quit() } if (taskListButtons.indexInParent() == 0) { taskListButtons = taskListButtons.parent().parent().children() } else { taskListButtons = taskListButtons.parent() .enfants() }










let taskListButton = null
let flag = 0
for (let i = 3; i < taskListButtons.length; i++) { // 从第4(4-1)个开始
if (taskListButtons[i].clickable()) { if ( flag) { taskListButton = taskListButtons[i] break } else { flag = 1 continue } } }








if (!taskListButton || !taskListButton.clickable()) { console.log('Impossible de trouver le contrôle de la liste des tâches') quit() } taskListButton.click() console.log('en attente de la liste des tâches') if (!findTextDescMatchesTimeout( / Récompenses de tâches accumulées/, 10000)) { console.log('Il semble que la liste des tâches ne peut pas être ouverte, quittez !') console.log('Si elle a été ouverte mais pas détectée, veuillez supprimer la version 101 et supérieure de la vue Web ou utilisez la version domestique Essayez la version commerciale de JD.') quit() } }










// Ferme la liste des tâches
function closeTaskList() { console.log('Fermer la liste des tâches') let jiangli = findTextDescMatchesTimeout(/récompenses cumulées des tâches/, 5000) if (!jiangli) { console.log('Impossible de trouver le logo de récompense de tâche' ) return false } let closeBtn = jiangli. parent(). child(1) return closeBtn. click() }








// Rouvre la liste des tâches
function réouvrirTaskList() { closeTaskList() sleep(3000) openTaskList() sleep(5000) }




// Récupère les tâches inachevées, selon l'identification du numéro, renvoie le bouton de la tâche, l'introduction de la tâche, le numéro de la tâche (tableau)
function getTaskByText() { let tButton = null, tText = null, tCount = 0, tTitle = null console.log( 'Rechercher les tâches inachevées...') let taskButtons = textMatches(/.*Parcourir et suivre.*|.*Parcourir.*s.*|.*Parcourir cumulativement.*|.*Parcourir disponible.*|.*Aller à la fête .*|.*Brand Wall.*|.*Check in.*/).find() if (!taskButtons.empty()) { // Si la tâche n'est pas trouvée, retourne directement for (let i = 0 ; je < taskButtons.length ; i++) { let item = taskButtons[i] tTitle = item.parent().child(1).text() let r = tTitle.match(/(d)/(d* )/) si ( !r) continuer











tCompte = (r[2] - r[1])

console.log(tTitle, tCount)
if (tCount) { // Si la soustraction des nombres n'est pas 0, cela prouve qu'elle n'est pas terminée
tText = item.text()
if (!autoJoin && tText.match(/successful membership/)) continue
if (tText.match(/order/)) continue
tButton = item.parent().child(3)
break
}
}
}
return [tButton, tText, tCount, tTitle]
}

// Revenez à la liste des tâches et vérifiez si elle réussit, et réessayez une fois si elle ne réussit pas, avec un délai
function backToList() { sleep(500) back() for (let i = 0; i < 3; i++ ) { // essayez de revenir 3 fois if (!findTextDescMatchesTimeout(/récompense de tâche cumulée/, 5000)) { console.log('Return failed, retry return') sleep(2000) back() continue } else { break } } sommeil(3000) }













// Parcourir les tâches pendant n secondes
function timeTask() { console.log('En attente de la fin de la tâche de navigation...') let c = 0 while (c < 40) { // 0,5 * 40 = 20 secondes pour empêcher une boucle infinie if ((textMatches(/get.*?gold/).exists() || descMatches(/get.*?gold/).exists())) // attend la pause terminée if ((textMatches(/ visualisé / ).exists() || descMatches(/browsed/).exists())) { // échec console.log('limite supérieure, retour à l'actualisation de la liste des tâches') return false }








// Traitement de la fenêtre contextuelle
let pop = text('Mettre à niveau le membre de la carte pour recevoir un cadeau')
if (pop.exists()) { pop.parent().parent().child(2).click() console. log ('Fermer la fenêtre contextuelle d'adhésion') }


sleep(500)
c++
}
if (c > 39) { console.log('Aucun indicateur d'achèvement de tâche détecté.') return false } return true }




// Fonction de tâche d'adhésion
joinTask() { let check = textMatches(/.*Confirmer l'autorisation d'accepter.*|.*Mes privilèges.*|.*Ouvrir la carte immédiatement.*|.*Déverrouiller tous les avantages de l'adhésion.*/) . findOne(8000) if (!check) { console.log('Impossible de trouver le bouton de jointure, jugé déjà rejoint') return true } else if (check.text().match(/mon privilège/)) { console .log('Adhésion déjà, retour') return true } else { sleep(2000) if (check.text().match(/.*ouvrir la carte maintenant.*|.*déverrouiller tous les avantages de l'adhésion.*/)) { let btn = check.bounds() console.log('Cliquez pour ouvrir la carte/déverrouiller les avantages, masquez automatiquement la console') sleep(500) console.hide() sleep(500) click(btn.centerX(), btn .centerY()) sleep(500) console.show() check = textMatches(/.*Confirmer l'autorisation signifie accepter.*/).findOne(8000) sleep(2000) }




















if (!check) { console.log('Impossible de trouver la fenêtre contextuelle du bouton de jointure, échec du chargement') return false }


if (check.indexInParent() == 6) { check = check.parent().child(5) } else if (check.text() == 'Confirmer l'autorisation signifie accepter') { check = check.parent() .enfant(0) } sinon { vérifier = vérifier.parent().parent().enfant(5) }





vérifier = vérifier.limites()

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

console.log('Détecter s'il y a occlusion')
let float = className('android.widget.ImageView')
.filter(function (w) { let b = w.bounds() return b.left <= x && b . droite >= x && b.haut <= y && b.bas >= y }).find()


if (float.length > 1) { console.log('Il y a un blocage de fenêtre flottante, essayez de le supprimer') if (device.sdkInt >= 24) { geste(1000, [x, y], [x, y + 200 ]) console.log('L'opération de suppression a été effectuée, merci de nous faire part de vos commentaires si elle échoue') } else { console.log('La version d'Android est faible, la fenêtre flottante ne peut pas être supprimée automatiquement et la tâche de jonction échoué. Au moins Android 7.0 est requis.') return false } } else { console.log('Aucune fenêtre flottante bloquée trouvée, continuez à vérifier') }










console.log('L'autorisation sera vérifiée et la console sera masquée automatiquement')
sleep(500)
console.hide()
sleep(500)
click(x, y)
sleep(500)
console.show()

console.log('Prêt à cliquer sur le bouton d'adhésion')
let j = textMatches(/^confirmer l'autorisation (et rejoindre l'adhésion au magasin)*$/).findOne(5000)
if (!j) { console.log('Unable pour trouver le bouton d'adhésion, échec') return false } click(j.bounds().centerX(), j.bounds().centerY()) sleep(1000) console.log('Inscription terminée, retour') return vrai } }








// La tâche de parcourir les produits et d'ajouter des achats, le paramètre panier est le drapeau indiquant s'il faut ajouter des achats
function itemTask(cart) { console.log('waiting to enter the product list...') if (!textContains(' page actuelle').findOne (10000)) { console.log('Échec de la saisie de la liste d'éléments.') return false } sleep(2000) let items = textContains('.jpg!q70').find() for ( let i = 0 ; i < items.length ; i++) { if (panier) { console.log('Acheter et parcourir') let tmp = items[i].parent().parent() tmp.child(tmp. childCount() - 1).click() } else { console.log('Parcourir la page produit') items[i].parent().parent().child(4).click() } sleep(5000) console .log('返回') back() sleep(5000) let r = textContains('.jpg!q70').findOnce()





















if (!r) { back() sleep(5000) } if (i >= 4 - 1) { break } } return true }








//
Fonction de tâche d'achat shopTask() { console.log('attente pour entrer dans la liste des magasins...') let banner = textContains('like').findOne(10000) if (!banner) { console.log(' not Peut entrer dans la liste des magasins. Return.') return false } let c = banner.text().match(/(d)/(d*)/) if (!c) { c = 4 // faire 4 fois } else { c = c[2] - c[1] } sleep(2000) console.log('going', c, 'times') let like = textContains('like').boundsInside(1, 0, device .width , device.height).findOnce() if (!like) { console.log('Impossible de trouver le bouton like. Return.') return false } let bound = [like.bounds().centerX(), like .bounds ().centerY()] console.log('like button is located', lié)





















for (let i = 0; i < c; i++) { click(bound[0], bound[1]) console.log('Parcourir la page du magasin') sleep(8000) console.log('return') back( ) sleep(5000) let r = textContains('Like').findOnce() if (!r) { back() sleep(5000) } } return true }













//
Fonction de tâche de visite viewTask() { console.log('Effectuer une tâche de visite') sleep(5000) console.log('La tâche de visite revient directement') return true }




// Brand wall task
function wallTask() { console.log('Perform brand wall task') sleep(3000) for (let i of [2, 3, 4, 5, 6]) { // Choisissez 5 consoles. log ('Ouvrir un') textContains('!q70').boundsInside(0, 0, device.width, device.height).findOnce(i).click() sleep(5000) console.log('return direct' ) back() let r = textContains('!q70').findOne(8000) if (!r) back() sleep(3000) } console.log('back to top') let root = textContains('to the end ' ).findOnce().parent().parent() root.child(root.childCount() - 2).click() console.log('Rouvrir la liste des tâches une fois le brand wall terminé') sleep(3000 ) ouvreListeTâches( ) renvoie vrai }



















// La fonction d'une seule tâche, entrer automatiquement la tâche, revenir automatiquement à la liste des tâches, retourner
la fonction booléenne doTask(tButton, tText, tTitle) { let clickFlag = tButton.click() let tFlag if (tText.match(/ Parcourir et suivre.* s|Browse.*s/)) { console.log('Proceeding', tText) tFlag = timeTask() } else if (tText.match(/cumulative scanning/)) { console.log(' Exécution de tâches de navigation cumulatives' ) if (tText.match(/plus achat/)) { tFlag = itemTask(true) } else { tFlag = itemTask(false) } } else if (tText.match(/join/)) { console .log('Proceed join task') tFlag = joinTask() } else if (tText.match(/browse available|browse and follow|party/)) { let tTitle = tButton.parent().child(1).text () if ( tTitle.match(/planting grass city/)) { tFlag = shopTask()



















} else { tFlag = viewTask() } } else if (tText.match(/brand wall/)) { tFlag = wallTask() return tFlag // brand wall n'a pas besoin de backToList, return early } else if (tText.match( /check in /)) { tFlag = clickFlag // cliquez une fois pour renvoyer tFlag } else { console.log('type de tâche inconnu, tâche de navigation par défaut', tText) tFlag = timeTask() } backToList() return tFlag }














function signTask() { let anchor = className('android.view.View').filter(function (w) { return w.clickable() && (w.text() == 'pour utiliser la récompense' || w. desc() == 'Aller utiliser la récompense') }).findOne(5000)


if (!anchor) { console.log('Aucun bouton de récompense trouvé, échec de la connexion') return false }


let anchor_index = anchor.indexInParent()
let sign = anchor.parent().child(anchor_index + 2) // pour utiliser les deux derniers
sign.click()
sleep(3000)

sign = textMatches(/.*Cliquez sur moi pour vous connecter.*|.*Revenez demain.*/).findOne(5000)
if (!sign) { console.log('Aucun bouton de connexion trouvé') return false }


if (sign.text().match(/come again tomorrow/)) { console.log('signed in') } else { click(sign.bounds().centerX(), sign.bounds().centerY( ) ) sleep(1000) console.log('Connexion terminée')




// let next = textContains('Enveloppe rouge suivante').findOne(5000)
// if (!next) { // console.log('L'invite de l'enveloppe rouge suivante est introuvable et la fenêtre contextuelle peut ne pas être fermé automatiquement') // } else { // console.log('Fermer la fenêtre de connexion') // next.parent().child(0).click() // sleep(1000) // } }






// let title = text('Connectez-vous tous les jours pour recevoir une grande enveloppe rouge').findOne(5000)
// if (!title) { // console.log('The title was not found, and the sign- dans la page n'a pas pu se fermer automatiquement.') // return false // } // console.log('Fermer la page de connexion') // title.parent().child(0).click() // sleep( 1000)





console.log('Vérifier s'il existe une fenêtre contextuelle d'autorisation de notification')
if (textContains('Autorisation de notification').findOne(3000)) { console.log('Une fenêtre contextuelle apparaît, fermez-la') text('Annuler').click () sleep(1000) console.log('Détection secondaire') if (textContains('Autorisation de notification').findOne(3000)) { console.log('Une fenêtre contextuelle apparaît , close') text('Cancel') .click() sleep(1000) console.log('Complete') } else { console.log('No pop-up window, continue.') } } else { console. log('Aucune fenêtre contextuelle, continuez.') }














retourner vrai
}

let startCoin = null // requis pour les touches de volume

// Attrape globale d'essai pour traiter l'échec d'affichage d'une erreur
try { if (autoOpen) { openAndInto() console.log('en attente de chargement de la page active') if (!findTextDescMatchesTimeout(/.*Go pour utiliser les récompenses. */, 8000)) { console.log('Échec de la saisie de l'activité, veuillez la relancer !') quit() } console.log('Succès de la saisie de l'activité') sleep(2000)








openTaskList();
} else { alert('Veuillez fermer la fenêtre contextuelle et ouvrir immédiatement l'application Jingdong pour accéder manuellement à la page de l'événement et ouvrir la liste des tâches', '30 secondes est la limite de temps') console.log ( 'Veuillez ouvrir manuellement l'application Jingdong pour accéder à la page de l'événement, et ouvrir la liste des tâches') if (!findTextDescMatchesTimeout(/Récompenses de tâche accumulées/, 30000)) { console.log('Échec de l'accès à l'événement, veuillez réexécuter !') quit() } console.log('Event entré avec succès' ) }







dormir (5000)

try { console.log('Obtenir le montant initial de pièces d'or') startCoin = getCoin() console.log('Current total' + startCoin + 'gold coins') } catch (err) { console.log('Failed to obtenir des pièces d'or, sauter ', erreur) }





dormir (2000)

// boucle pour terminer toutes les tâches
while (true) { let [taskButton, taskText, taskCount, taskTitle] = getTaskByText()

if (!taskButton) { console.log('Recevoir les récompenses cumulées') textContains('Aller à la réclamation').find().forEach(function (e, i) { console.log('Recevoir le premier' + (i + 1 ) + 'récompenses accumulées') e.click() sleep(2000) })





console.log('Tâche d'enregistrement finale')
signTask()

let endCoin = null
try { console.log('Obtenir le nombre de pièces d'or à la fin') endCoin = getCoin() console.log('Current total' + endCoin + 'Gold coins') } catch (err) { console .log('Échec de l'obtention des pièces d'or, saut', erreur) }





console.log('Aucune tâche ne peut être effectuée automatiquement. Quitter.')
console.log('Les tâches interactives et les tâches de commande doivent être effectuées manuellement.')
if (startCoin && endCoin) { console.log('This l'opération a obtenu ' + (endCoin - startCoin) + 'pièces d'or') } else { console.log('Les pièces d'or obtenues dans cette opération ne peuvent pas être calculées. Veuillez vous référer au journal pour des raisons spécifiques.') }



// alert('La tâche est terminée', 'N'oubliez pas de recevoir l'enveloppe rouge du Nouvel An sur la page d'accueil du script !') alert('La tâche
est terminée', 'Il y aura de nouvelles tâches après la la tâche interactive est terminée manuellement, il est recommandé de terminer l'interaction deux fois, exécutez le script')
quit()
}

if (taskText.match(/brand wall/)) { // brand wall 0/3 ne doit être complété qu'une fois
taskCount = 1
}

// Effectue des tâches en fonction de taskCount, termine un type de tâches ensemble et actualise la liste des tâches après l'achèvement
console.log('Proceed' + taskCount + 'times' + taskText + '" task')
for (let i = 0; i < taskCount ; i++) { console.log('th' + (i + 1) + 'time') let taskFlag = doTask(taskButton, taskText, taskTitle) if (taskFlag) { console.log('Terminé, passez à la tâche suivante ') } else { console.log('La tâche a échoué, essayez de rouvrir la liste des tâches pour obtenir la tâche') break // Quittez directement, pas besoin d'appeler réouvrir ici } } console.log('Rouvrez la liste des tâches pour obtenir la tâche') rouvrirTaskList( ) } } catch (err) { device.cancelKeepingAwake() if (err.toString() != 'JavaException: com.stardust.autojs.runtime.exception.ScriptInterruptedException: null') { console.erreur (nouvelle erreur (). pile, erreur)
















startCoin && console.log('Cette mission a commencé avec' + startCoin + 'pièces d'or')
}
showVersion()
}
 

Je suppose que tu aimes

Origine blog.csdn.net/winkexin/article/details/131324358
conseillé
Classement