CJ 1 rok pred
rodič
commit
5ee51555bb
53 zmenil súbory, kde vykonal 6844 pridanie a 690 odobranie
  1. 14 0
      dtok-api/api/src/main/java/com/dtok/api/AppApi.java
  2. 2 0
      dtok-api/api/src/main/java/com/dtok/api/controller/ScriptController.java
  3. BIN
      dtok-api/framework/target/framework-0.1.jar
  4. 2 1
      dtok-app/.idea/misc.xml
  5. 8 6
      dtok-app/app/src/main/AndroidManifest.xml
  6. 8 0
      dtok-app/app/src/main/java/com/cj/autojs/dtok/Api.java
  7. 6 0
      dtok-app/app/src/main/java/com/cj/autojs/dtok/LoginActivity.java
  8. 75 0
      dtok-app/app/src/main/java/com/cj/autojs/dtok/OnSwipeTouchListener.java
  9. 5 0
      dtok-app/app/src/main/java/com/cj/autojs/dtok/SplashActivity.java
  10. 2 1
      dtok-app/app/src/main/java/com/cj/autojs/dtok/config/UrlConfig.java
  11. 15 8
      dtok-app/app/src/main/java/com/cj/autojs/dtok/jsinterface/JsInterface.java
  12. 11 0
      dtok-app/app/src/main/res/drawable/buttonshapewhitebg.xml
  13. BIN
      dtok-app/app/src/main/res/drawable/good_morning_img.png
  14. BIN
      dtok-app/app/src/main/res/drawable/good_night_img.png
  15. 9 0
      dtok-app/app/src/main/res/drawable/ic_email_white_24dp.xml
  16. 9 0
      dtok-app/app/src/main/res/drawable/ic_lock_white_24dp.xml
  17. BIN
      dtok-app/app/src/main/res/drawable/logo.png
  18. BIN
      dtok-app/app/src/main/res/font/calibri.ttf
  19. BIN
      dtok-app/app/src/main/res/font/gotham.ttf
  20. 5 6
      dtok-app/app/src/main/res/layout/login_activity.xml
  21. 1 0
      dtok-app/app/src/main/res/values/colors.xml
  22. 7 0
      dtok-app/app/src/main/res/values/styles.xml
  23. 208 0
      dtok-mobile-vuetify/src/assets/logo-229183178229142187229186149-1.svg
  24. BIN
      dtok-mobile-vuetify/src/assets/logo.png
  25. BIN
      dtok-mobile-vuetify/src/assets/output-onlinepngtools (1).png
  26. BIN
      dtok-mobile-vuetify/src/assets/output-onlinepngtools.png
  27. 44 0
      dtok-mobile-vuetify/src/components/ItemSelect.vue
  28. 13 0
      dtok-mobile-vuetify/src/components/MainLayout.vue
  29. 38 0
      dtok-mobile-vuetify/src/components/NumberInput.vue
  30. 206 0
      dtok-mobile-vuetify/src/components/NumberInputSpinner.vue
  31. 56 0
      dtok-mobile-vuetify/src/components/TagInput.vue
  32. 56 0
      dtok-mobile-vuetify/src/components/dialog/ConfirmDialog.vue
  33. 63 0
      dtok-mobile-vuetify/src/components/dialog/GroupDialog.vue
  34. 121 0
      dtok-mobile-vuetify/src/components/dialog/ItemGroupDialog.vue
  35. 157 0
      dtok-mobile-vuetify/src/components/dialog/ItemsDialog.vue
  36. 56 0
      dtok-mobile-vuetify/src/components/dialog/LoadingDialog.vue
  37. 97 0
      dtok-mobile-vuetify/src/components/dialog/UserProfileDialog.vue
  38. 162 0
      dtok-mobile-vuetify/src/components/dialog/znzf.vue
  39. 9 0
      dtok-mobile-vuetify/src/core/android.js
  40. 3 0
      dtok-mobile-vuetify/src/core/event-bus..js
  41. 270 0
      dtok-mobile-vuetify/src/data/ExecData.js
  42. 29 0
      dtok-mobile-vuetify/src/router/index.js
  43. 859 531
      script/znzf.js
  44. 19 17
      script_env/test.js
  45. 465 120
      script_env/znzf1.js
  46. 11 0
      webpack-script/src/common/conf.js
  47. 363 0
      webpack-script/src/common/douyin.js
  48. 128 0
      webpack-script/src/common/engine.js
  49. 1866 0
      webpack-script/src/common/example/znzf.js
  50. 923 0
      webpack-script/src/common/node.js
  51. 166 0
      webpack-script/src/common/utility.js
  52. 238 0
      webpack-script/src/znzf.js
  53. 39 0
      webpack-script/webpack.config.js

+ 14 - 0
dtok-api/api/src/main/java/com/dtok/api/AppApi.java

@@ -224,5 +224,19 @@ public class AppApi {
         return ResponseData.success(script);
     }
 
+    @GetMapping("/getExecScriptTest")
+    public ResponseData getExecScriptTest(@RequestParam(defaultValue = "com.ss.android.ugc.aweme", required = false,
+            value = "app") String app, @RequestParam("module") String module) {
+
+
+        Script script = scriptRepository.findFirstByModuleAndApp(module, app);
+
+        if (Objects.isNull(script)) {
+            throw new NullPointerException("没有此功能");
+        }
+
+        return ResponseData.success(script);
+    }
+
 
 }

+ 2 - 0
dtok-api/api/src/main/java/com/dtok/api/controller/ScriptController.java

@@ -39,6 +39,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/script")
@@ -68,6 +69,7 @@ public class ScriptController extends BaseController {
             return predicate;
         };
         List<Script> result = scriptRepository.findAll(query);
+        result.stream().peek(script -> script.setScriptContent("")).collect(Collectors.toList());
         return ResponseData.success(result);
     }
 

BIN
dtok-api/framework/target/framework-0.1.jar


+ 2 - 1
dtok-app/.idea/misc.xml

@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="corretto-1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
@@ -8,7 +9,7 @@
   <component name="VisualizationToolProject">
     <option name="state">
       <ProjectState>
-        <option name="scale" value="0.2387140902872777" />
+        <option name="scale" value="0.5430916552667578" />
       </ProjectState>
     </option>
   </component>

+ 8 - 6
dtok-app/app/src/main/AndroidManifest.xml

@@ -5,7 +5,6 @@
 
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
     <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
-
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.TELEPHONY_SERVICE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
@@ -32,7 +31,7 @@
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
     <application
-        android:name="com.cj.autojs.dtok.App"
+        android:name=".App"
         android:allowBackup="true"
         android:icon="@drawable/logo"
         android:label="@string/app_name"
@@ -44,10 +43,13 @@
         tools:replace="android:label, android:allowBackup"
         tools:targetApi="m">
         <activity
-            android:name="com.cj.autojs.dtok.MainActivity"
+            android:name=".TestActivity"
+            android:exported="false" />
+        <activity
+            android:name=".MainActivity"
             android:exported="false" />
         <activity
-            android:name="com.cj.autojs.dtok.SplashActivity"
+            android:name=".SplashActivity"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -56,7 +58,7 @@
             </intent-filter>
         </activity>
         <activity
-            android:name="com.cj.autojs.dtok.LoginActivity"
+            android:name=".LoginActivity"
             android:exported="false"
             android:launchMode="singleTask" />
 
@@ -81,7 +83,7 @@
                 android:resource="@xml/accessibility_service_config" />
         </service>
         <service
-            android:name="com.cj.autojs.dtok.service.ForegroundService"
+            android:name=".service.ForegroundService"
             android:exported="false"
             android:foregroundServiceType="mediaProjection" />
 

+ 8 - 0
dtok-app/app/src/main/java/com/cj/autojs/dtok/Api.java

@@ -165,4 +165,12 @@ public class Api {
         client.newCall(request.url(url).get().build()).enqueue(callback);
     }
 
+    public final void getScriptTest(String module, Callback callback) {
+        Api api = INSTANCE;
+        OkHttpClient client = api.client();
+        Request.Builder request = api.request();
+        String url = UrlConfig.BASE_API + "getExecScriptTest/" + "?module=" + module;
+        client.newCall(request.url(url).get().build()).enqueue(callback);
+    }
+
 }

+ 6 - 0
dtok-app/app/src/main/java/com/cj/autojs/dtok/LoginActivity.java

@@ -9,6 +9,8 @@ import android.text.TextWatcher;
 import android.text.method.HideReturnsTransformationMethod;
 import android.text.method.PasswordTransformationMethod;
 import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -52,7 +54,11 @@ public class LoginActivity extends BaseActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
         setContentView(R.layout.login_activity);
+
         textView = findViewById(R.id.app_version);
         textView.setText(getVersionName());
         ForegroundService.stop(LoginActivity.this);

+ 75 - 0
dtok-app/app/src/main/java/com/cj/autojs/dtok/OnSwipeTouchListener.java

@@ -0,0 +1,75 @@
+package com.cj.autojs.dtok;
+
+import android.content.Context;
+import android.view.GestureDetector;
+import android.view.GestureDetector.SimpleOnGestureListener;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+
+public class OnSwipeTouchListener implements OnTouchListener {
+
+    private final GestureDetector gestureDetector;
+
+    public OnSwipeTouchListener (Context ctx){
+        gestureDetector = new GestureDetector(ctx, new GestureListener());
+    }
+
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+        return gestureDetector.onTouchEvent(event);
+    }
+
+    private final class GestureListener extends SimpleOnGestureListener {
+
+        private static final int SWIPE_THRESHOLD = 100;
+        private static final int SWIPE_VELOCITY_THRESHOLD = 100;
+
+        @Override
+        public boolean onDown(MotionEvent e) {
+            return true;
+        }
+
+        @Override
+        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+            boolean result = false;
+            try {
+                float diffY = e2.getY() - e1.getY();
+                float diffX = e2.getX() - e1.getX();
+                if (Math.abs(diffX) > Math.abs(diffY)) {
+                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
+                        if (diffX > 0) {
+                            onSwipeRight();
+                        } else {
+                            onSwipeLeft();
+                        }
+                        result = true;
+                    }
+                }
+                else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
+                    if (diffY > 0) {
+                        onSwipeBottom();
+                    } else {
+                        onSwipeTop();
+                    }
+                    result = true;
+                }
+            } catch (Exception exception) {
+                exception.printStackTrace();
+            }
+            return result;
+        }
+    }
+
+    public void onSwipeRight() {
+    }
+
+    public void onSwipeLeft() {
+    }
+
+    public void onSwipeTop() {
+    }
+
+    public void onSwipeBottom() {
+    }
+}

+ 5 - 0
dtok-app/app/src/main/java/com/cj/autojs/dtok/SplashActivity.java

@@ -3,6 +3,8 @@ package com.cj.autojs.dtok;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
+import android.view.Window;
+import android.view.WindowManager;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -28,6 +30,9 @@ public class SplashActivity extends BaseActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
         setContentView(R.layout.splash_screen);
         textView = findViewById(R.id.app_version);
         textView.setText(getVersionName());

+ 2 - 1
dtok-app/app/src/main/java/com/cj/autojs/dtok/config/UrlConfig.java

@@ -9,7 +9,8 @@ public class UrlConfig {
     public static String script;
 
     public static final String BASE_API = "https://api.ruanjian168.cc/api/";
-    public static final String UI_URL = "https://118.89.119.129";
+//    public static final String UI_URL = "https://118.89.119.129";
+    public static final String UI_URL = "http://192.168.2.24:3000";
     public static final String LOGIN_URL = "https://api.ruanjian168.cc/login";
 
     public static final String DEVICE = "DEVICE";

+ 15 - 8
dtok-app/app/src/main/java/com/cj/autojs/dtok/jsinterface/JsInterface.java

@@ -117,13 +117,13 @@ public class JsInterface {
 
 
     @JavascriptInterface
-    public void setScript(String uuid, String module, String cfg) {
+    public void setScript(String module, String cfg) {
         if (!((MainActivity) context).checkDrawOverlay()) {
             ((MainActivity) context).requestWindowPermission();
         } else if (!((MainActivity) context).checkAccessibility()) {
             ((MainActivity) context).openDialogAccessibility();
         } else {
-            Api.INSTANCE.getScript(uuid, module, new Callback() {
+            Api.INSTANCE.getScript(DeviceUtil.getDeviceIMEI(context), module, new Callback() {
                 @Override
                 public void onFailure(Call call, IOException e) {
 
@@ -195,7 +195,7 @@ public class JsInterface {
     }
 
     @JavascriptInterface
-        public final void openAccessibility() {
+    public final void openAccessibility() {
         ((MainActivity) context).openAccessibility();
     }
 
@@ -228,15 +228,15 @@ public class JsInterface {
 //
     @JavascriptInterface
     public void getPermission() {
-        ((MainActivity) context).runOnUiThread(()->{
-            if ( ((MainActivity) context).checkAccessibility()) {
+        ((MainActivity) context).runOnUiThread(() -> {
+            if (((MainActivity) context).checkAccessibility()) {
                 webView.evaluateJavascript("javascript:android.setAccessibility(true)", s -> {
                 });
             } else {
                 webView.evaluateJavascript("javascript:android.setAccessibility(false)", s -> {
                 });
             }
-            if ( ((MainActivity) context).checkDrawOverlay()) {
+            if (((MainActivity) context).checkDrawOverlay()) {
                 webView.evaluateJavascript("javascript:android.setDrawOverlay(true)", s -> {
                 });
             } else {
@@ -246,7 +246,8 @@ public class JsInterface {
         });
 
     }
-  @JavascriptInterface
+
+    @JavascriptInterface
     public void registerDevice() {
         new Thread(() -> Api.INSTANCE.registerDevice(DeviceUtil.getPhoneModel(), DeviceUtil.getBuildVersion(),
                 DeviceUtil.getPhoneBrand(), DeviceUtil.getDeviceIMEI(context), new Callback() {
@@ -295,7 +296,8 @@ public class JsInterface {
             uuid = device.getString("uuid");
         } catch (JSONException e) {
             webView.evaluateJavascript("javascript:android.unBondingDevice(null)", s -> {
-            });return;
+            });
+            return;
         }
 
         String finalUuid = uuid;
@@ -374,6 +376,11 @@ public class JsInterface {
     }
 
 
+    @JavascriptInterface
+    public void showToast(String message) {
+        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
+    }
+
     @JavascriptInterface
     public void getCommonItem() {
         new Thread(() -> Api.INSTANCE.getCommonItem(new Callback() {

+ 11 - 0
dtok-app/app/src/main/res/drawable/buttonshapewhitebg.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="rectangle">
+            <corners android:radius="8dp" />
+            <solid android:color="@android:color/transparent"/>
+            <stroke android:color="#96ffffff"
+                android:width="2dp"/>
+        </shape>
+    </item>
+</selector>

BIN
dtok-app/app/src/main/res/drawable/good_morning_img.png


BIN
dtok-app/app/src/main/res/drawable/good_night_img.png


+ 9 - 0
dtok-app/app/src/main/res/drawable/ic_email_white_24dp.xml

@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#96ffffff"
+        android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z"/>
+</vector>

+ 9 - 0
dtok-app/app/src/main/res/drawable/ic_lock_white_24dp.xml

@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#96ffffff"
+        android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z"/>
+</vector>

BIN
dtok-app/app/src/main/res/drawable/logo.png


BIN
dtok-app/app/src/main/res/font/calibri.ttf


BIN
dtok-app/app/src/main/res/font/gotham.ttf


+ 5 - 6
dtok-app/app/src/main/res/layout/login_activity.xml

@@ -5,6 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/loginLayout"
+    android:background="@drawable/good_morning_img"
     >
 
     <LinearLayout
@@ -31,7 +32,7 @@
             android:layout_marginLeft="20dp"
             android:layout_marginTop="30dp"
             android:layout_marginRight="20dp"
-            android:background="@drawable/edit_background"
+            android:background="#50FFFFFF"
             android:gravity="center_vertical"
             android:orientation="horizontal"
             app:layout_constraintHorizontal_bias="0"
@@ -73,7 +74,7 @@
             android:layout_marginLeft="20dp"
             android:layout_marginTop="20dp"
             android:layout_marginRight="20dp"
-            android:background="@drawable/edit_background"
+            android:background="#50FFFFFF"
             android:gravity="center_vertical"
             android:orientation="horizontal"
             app:layout_constraintHorizontal_bias="0"
@@ -116,14 +117,12 @@
             android:layout_marginStart="20dp"
             android:layout_marginTop="20dp"
             android:layout_marginEnd="30dp"
-            android:background="@drawable/btn_bg_selector"
             android:drawablePadding="6dp"
             android:text="@string/login"
             android:textColor="@android:color/white"
             android:textSize="16sp"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/linearLayout2" />
+            android:background="#75914560"
+      />
     </LinearLayout>
 
     <TextView

+ 1 - 0
dtok-app/app/src/main/res/values/colors.xml

@@ -3,6 +3,7 @@
     <color name="colorPrimary">#6200EE</color>
     <color name="colorPrimaryDark">#3700B3</color>
     <color name="colorAccent">#03DAC5</color>
+    <color name="textInputLayout">#96ffffff</color>
 
     <color name="abc_decor_view_status_guard">#ff000000</color>
     <color name="abc_decor_view_status_guard_light">#ffffffff</color>

+ 7 - 0
dtok-app/app/src/main/res/values/styles.xml

@@ -11,6 +11,13 @@
         <item name="windowNoTitle">true</item>
         <item name="windowActionBar">false</item>
     </style>
+    <style name="EditScreenTextInputLayoutStyle" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorControlNormal">@color/textInputLayout</item>
+        <item name="colorControlActivated">@color/textInputLayout</item>
+        <item name="colorControlHighlight">@color/textInputLayout</item>
+        <item name="colorAccent">@color/textInputLayout</item>
+        <item name="android:textColorHint">@color/textInputLayout</item>
+    </style>
 
 
     <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>

+ 208 - 0
dtok-mobile-vuetify/src/assets/logo-229183178229142187229186149-1.svg

@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="266px" height="267px" viewBox="0 0 266 267" enable-background="new 0 0 266 267" xml:space="preserve">  <image id="image0" width="266" height="267" x="0" y="0"
+    href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQoAAAELCAYAAAAhl8hsAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAs
+X0lEQVR42u3dd1QU99oH8O/MVhakKYiNEhRBjVcMGkVMBEvQqBjFxIKo11dNbLEcS4xJLPFqcn2j
+KdcaC6KiYu8oePUm77lJLNebaOyFWAEpgjRBnvePCShSdsFdZnd5Puc8B4WZ5bezM19+85smEBEY
+Y6wyotwNYIyZPw4KxpheHBSMMb04KBhjenFQMMb04qBgjOnFQcEY04uDgjGmFwcFY0wvDgrGmF4c
+FIwxvTgoGGN6cVAwxvTioGCM6cVBwRjTi4OCMaYXBwVjTC8OCsaYXhwUjDG9OCgYY3pxUDDG9OKg
+YIzpxUHBGNOLg4IxphcHBWNMLw4KxpheHBSMMb04KCxIjx49KDY2lh8Wy2ocB4UF8ff3x/jx4zFn
+zhwOC1ajBH6auWXx8/OjGzduIDAwEB999BF69OghyN0mZv24R2FhZsyYAZ1Oh5MnTyIyMhKfffYZ
+Jz0zOQ6KakhISKDNmzfLsoGOHDlSGDZsGHQ6HZKSkrBo0SJ07NiRxy6YSfGuRzW1bduWXF1dMXz4
+cAwePLjGu/+DBw+mvXv3Ijc3FwBga2uLsLAwbN68mXdFmPEREVc1au3ateTo6EhqtZreeOMNWr58
+OdV0G/r37092dnYEgACQIAjk7OxMY8aMqfG2cFl3yd4AS64JEyaQTqcjAKRQKMjb25umTJlCR44c
+qbENddiwYeTs7FwSFs8HxujRoyk+Pp5Dg4uDQu4KDw8nGxubUhuqVquloKAg+vzzz2tkI501axY1
+adKERFEsExj29vb03nvv0c6dOzkwuKpdPEZhBP369aP4+HhkZ2eX+ZlOp0P79u3RpUsXdOrUCd26
+dTPJGEJ0dDR99dVXuHr1arnt0Gg06Ny5M959912MHj2axzFYlXBQGMmQIUPo8OHDyMjIqHAatVoN
+Pz8/BAUFoUOHDoiIiDD6Bjt06FA6ceIEkpKS8PTp0zI/VyqV8Pb2Rnh4OD7//HMODGYQDgojmjp1
+KsXGxuL+/fvlbqTPE0URTk5OaN++PYKCgvD666+ja9euRtlwV61aRevWrcPVq1eRnp5e7jSCIMDR
+0RGhoaHo27cvBg0axKHBKsRBYWTr16+nFStW4PLly8jMzDR4PrVajebNmyMgIAABAQEYN27cS2+4
+M2fOpAMHDuD+/fvIyMhARZ+1SqWCn58fwsLCMH/+fA4MVgYHhYmMGzeOjh49inv37pWc61AVarUa
+TZs2RZs2bdCqVSu0aNECYWFh1dqIp0+fTkePHsXdu3eRlpZWYWAIgoA6deogODgYPXv2xNixYzk0
+GAAOCpNKSEiglStX4pdffkFSUhLy8/Or/VqiKMLR0RHNmzeHr68v/Pz80Lx5c/Tt29fgjfnTTz+l
+Q4cO4fbt20hNTa1090gURTRs2BChoaF46623EB4ezqFRi3FQ1IDt27fT5s2b8dtvvyEpKQk5OTlG
+ed3iHoC3tzd8fHzQtGlTeHt7Y+TIkZVu1H//+99p//79uHXrFlJSUpCXl1fp71GpVPD19UVoaChC
+QkIQGhrKoVHLcFDUoH379tHWrVtx9uxZpKSkICMjA0VFRUb/PQqFAq6urvD29oaXlxc8PT3h5eUF
+d3f3UgOmixcvpv379+Py5ct49OgRCgsL9b62RqNBmzZt0L17dwQHByMkJIRDoxbgoJDJ7Nmz6fjx
+40hKSkJ6ejqysrJMEhrPEwQBtra2cHNzKyknJyfcvn0bP//8c4VHSCqi0+kQEBCArl274tNPP+XA
+sGIcFDLbs2cPnThxAqdPn0ZKSgoyMzORlZWFnJwcWNJnY2Njg4CAAISEhKBz585GO9TLzAMHhZlZ
+tmwZnT17FpcvX0ZGRgays7NLqqCgQO7mGUSr1cLf3x/BwcEICgpCz549OTQsHAeFmfv+++/pwoUL
+uHTpEu7fv4/s7Gzk5OQgJycHubm5L3UkpSaoVCq0bNkSb775Jjp37owBAwZwaFggDgoLtHr1arpy
+5QquXr2Ku3fvloTG82WOvQ+FQgFPT08EBwcjODgYQ4YM4dCwEBwUVmL37t10/fp13Lx5E7du3UJS
+UhJyc3ORl5dXqvLz8/WeXl4TFAoFvLy80KdPH/Tu3ZuPnpg5Dgord/jwYUpMTERiYiL++OMP3L17
+F48ePSoJjRerpnsixeeC9O3bF8OHDzfZ1bXs5XBQ1FJbt26l4vAoDpA7d+7g4cOHshxtEQQBzs7O
+GDt2LBYuXMhhYWY4KKxccY8iOTkZycnJSElJQXJyMlJTU5GdnY28vDw8efKk5OuTJ09kba9Go0H3
+7t2xf/9+DgszwkFhRbZu3UoXLlzA1atXce3aNdy4caPKJ1GZAw4L88NBYcF27NhBp0+fxpkzZ/Cf
+//wHqampcjfJaOzt7TFjxgx8/PHHHBZmgIPCwqxfv57i4+Pxr3/9C3fu3JG7OSYjiiJ8fHxw8eJF
+DgozoJS7AUy/6OhoiouLw8mTJ606HJ5XVFSElJQUbNu2jd577z0OC5lxUJixuXPn0p49e/Df//5X
+7qbIoqCgAFevXpW7GQwcFGZn3759tGvXLhw6dAgpKSlyN0d2oshPvTQHHBRmYu/evRQdHY0DBw6Y
+/fUbNUWtVqNZs2ZyN4OBBzNlt3//ftq4cSMOHDig905TtU3jxo1x+/ZtHp8wA9yjkFFERATt3Lmz
+2gGhUCig1Wqh1WqhUqmg0WigUqmgVCqhVCqhUCggiiJEUYQgCBAEAUVFRSgqKgIRlfy7oKAAhYWF
+KCgoQEFBQcnp3Hl5ebJdFyIIAoikZ7yOGjWKw0Jm3KOQwbx582jlypV48OCBwfOoVCrY2tqWlE6n
+g5OTEzw8PNC4cWO4urrCzc0NAwcOrNZGdfToUUpPT8fDhw/x4MEDJCYm4s6dO0hLS0NeXl6p+2LU
+5NmbGo0GISEhGDduHHr37s2BIRMOihoUHR1N3377LU6dOqV3WqVSiTp16sDe3h4ODg5o2LAhWrRo
+gRYtWkCOv7BRUVF04cIFXLx4Ebdv30ZWVhYePXqErKwskweHIAhwcHDA4MGDsXz5cg4LGXBQ1JBh
+w4bR9u3bK9yoBEGASqWCo6MjnJyc0KhRI7Rv3x4BAQFmebOXuLg4+ve//41Tp04hMTERGRkZSE9P
+N9odxssjiiI8PDwwYcIETJ061eyWiTXjoDCx7777jr766ivcvHmz3J8rlUo4OjqiXr168Pb2xptv
+vonp06db3Eawbt06On78OP773/8iLS2tZJfFFNRqNQIDAzF58uRqPxSJVQ0HhQmNGDGCNm3aVGZA
+UBAE2NjYwNXVFR4eHggJCan+Xaw3biT88Qdw5w6QkgKkpQGpqUBGBpCbC+TnA0+eAIWFwNOngCAA
+ajWg1QIajfRVqwWcnABXV6B+/WfVuDHwzjtVbteqVavo2LFjOH/+vEkfS2Bvb48hQ4ZgxYoVHBYm
+xkFhArt376YFCxbgP//5T6nvi6KIOnXqoFGjRmjTpg3eeecdw5/AFR9P+P13lNTly1IwmPLzEwTA
+1hZo1gzw8QGaNwf8/IAqPNB49uzZlJCQUHKvC2OPZxTfKWvixImYNGkSB4apEBGXEWvp0qXk7OxM
+AEpKFEVydnamv/zlL/Thhx+Swa/3zTdEERFEzZsTKRREUizIW6JI5OJCFBpK9OmnRHv3GvR+Vq1a
+RaGhoeTu7k4ajabU8jFGaTQa6tGjBx04cMDw5ctlcMneAGuqyZMnk1qtLhUQDg4O1KZNG5o1a5Zh
+K/DcuURvvEGk08kfCoaUQkH0yitEY8YQxcbqfY8xMTHUu3dv8vDwMHpgCIJA9vb2NHToUDp48CAH
+BgeF+VW/fv1KrbC2trbUqlUrmjx5sv4VduFCok6diDQa+Tf8lymlksjXl2jSJKJ9+yp939u3b6c+
+ffpQw4YNSRRFo/cwbG1tqWfPnrR8+XIODCMUj1G8pOPHj9PHH3+Mn376CYA0It+4cWMEBQUhKiqq
+4n3mLVsI+/YBx45JA5DWRqMBAgOBAQOA8eMrXA4rVqygtWvX4tq1a3j06JHRmyGKIpydneHv7w9f
+X180aNAA7dq145v4VhEHxUvYt28fzZw5E5cuXYIoiqhbty78/f3xP//zPxWfIblkCWH7duD0adMO
+RL4MQQBUKsDO7tlREa0WUCielSgCRUXPqqBAOrqSny9VTo5UggB4eQH9+wNffFHhxjlx4kQ6dOgQ
+bt++bdI7gRff9btPnz7YtGkTh4WBOCiqacuWLTRz5kzcvXsXGo0GTZs2RXh4OD777LPyV74ZMwg7
+dgAVnE8hO1GUgsHRUSp3d6BVK8DTU6q33jJso9qyhXDnDnDpEnD1KpCeDmRmSqVWA+HhQAVnVx4+
+fJiWLFmC06dPIzMz06RvV6lUwt/fH7/88guHhSHk3vexxNq8eTO5uLiQKIrk6upKYWFhFe8Hz5tH
+1KSJ/OMHFZVaTdSgAdFrrxGNH0+0davx9+mjo4kmTCAKCiJq1kyqiRMr/D0ffPABNWrUiARBMPrY
+BV4Yx6jSUahaXLI3wNIqNjaW3NzcSK1Wk5+fH82bN6/8FW3NGiJ/f/mDoKJSqYjc3aXDnDU54Bcf
+TzRjBlFgIFFAANFHH5X7u1evXk2tWrUyyaHU4lIoFNShQwcOCg4K49a+ffvI09OT7O3tqWvXrnTo
+0KGyK9nBg0R9+pjPeQ/lHc5s2JCoe3ei6Gh5N5IdO4iGDSPq1Ytow4Zy2/L222+Ti4uLSYJCFEVq
+3bo1BwUHhXHLz8+PGjRoQKNGjSp/5Zo2jcjBQf4wKK8EQTo3IyCA6NtvzW/j+OSTCndH5s+fT02b
+NiWlUmnUoNBoNPTOO++Y37Iww5K9AZZSr7/+Ovn6+tKiRYvKrljr1hG1aiV/GFRUoiiNQwwaZP4b
+xaJFRN98U6adcXFx1KlTJ9LpdEYJCUEQyNXVldatW2f+y8QMSvYGWEKFhYVR+/btadeuXWVXqlGj
+pAFBucOgolIqpVPAv/zSsjaICjbgAQMGkJ2d3UsHha2tLfcmOCiMV1OmTKEePXqUXaFiY4lat5Y/
+CCortVo6mmGKIxky1tChQ6s9yCmKItWtW5f69u1rVcuEg0LGWr16NUVERJRdof73f4mcneUPgspK
+o5GuGTGD5WiK6ty5c5UCQqFQkLOzM7Vu3ZpmzpxptcvFVMU3163EzZs3ER0dXfqEnAkTCKtWSfd3
+MFcaDdChA3DihNWeTDRp0iT88MMPFf5coVBAp9NBp9PB3t4e9evXR5cuXbBgwQKrXSamxGdmVmDP
+nj3Ur1+/0itVeDhh5065m1Y5tRpo3x744Qer3yBatmxJhc8FtkKhgFKphEqlgoODA5o1awZfX19M
+mTLF6peFqXFQGCo4mHDihNytqJxSCbz2GvDTT7xhMKPi57Xpc/w44bXXzD8kFAqgRQtgwQK5W8Ks
+EI9RVObYMcLUqcD583K3pHIKhXS7uk8+Abp3594EMzre9ahMRATh0iW5W6GfrS0QGQnwE7WYiXBQ
+MMb04jEKxpheHBSMMb04KBhjenFQMMb04qBgjOnFQcEY08syg0IQqEZLFAl16hB8fAgDBhDWr6/6
+MeWabrOh5eVFFTdZIHMohUJB9evXp0GDBuld7tV5fa9KlgH7k9yXr1ar5L6EW6uV7otpSW2uqDw9
+K3wfMMKdpIxZCoWCXn311UqXe3Ve17OSZVBRJSQkkKurq0GvLwgC1atXj5YuXWqxl7dbZo9Cbnl5
+wKFDgL8//yWqQU+fPsX169cxZswY2Zf7okWLkJycbNC0arUagYGBmDx5ssWeOVt7rvUQBOkS7IoU
+FgJPnxr+ek+fAr//DnTvTjh2TP8KoNEY/toFBdLTt0zxPl9UlWkNboIAdSWvS0QoKCgo7gFUSV5e
+Hn7++Wejt7kq5s2bR/Hx8QZNK4oiPDw8sHfvXosNCaA2BYWNDfDWW+X/jAjIyADu3wfu3AGysw17
+zSdPgJ9+kp4C9uWXla8IvXoZ9pr5+cDPPwOpqcZ/n+Vxda3e76m0CTZ4q5I2FBQU4Pr167h48WKV
+X7uoqMjkTxGrzOHDh+nrr782eHp7e3sMHjxYtvYajdz7PjU2RmHofuigQdJt7avy2m5uRAcPGm//
+s1Mnk4w5VLVQzbEEQ/b5jx49Wu2xCk8jj6tUZYwiKCjI4NdVqVQUEhJiseMSPEZRmZgYAd27V22e
+hw+BhQvlbrlF6W6Bl8PPnDmTfvzxR4OmFUURjRo1wrRp0+RutlFwUJRnz56qrcSFhcCvvwLTp8s+
+yMZMY8+ePbR8+XKDp9fpdAgLC0OvXr0sLhDLw0FhLI8fA7t3y90KZiKff/45Hj9+bNC0SqUSLVu2
+xLJly6wiJAAOCuOqylETZjEmTZpEZ86cMWhaQRBQv359fPjhh3I326g4KBirRExMDK1Zs8bg6W1s
+bNC9e3cMHjzYanoTAAcFY5VauHAh8vLyDJpWoVCgWbNmWL9+vVWFBMBBwViFRo8eTRcuXDBoWkEQ
+ULduXbz//vtyN9skOCgYK8eGDRto48aNBk+v0Wjwxhtv4P3337e63gTAQcFYuRYuXIgnT54YNK0o
+ivD09ERsbKxVhgTAQcFYGREREXTt2jWDp3d0dERkZKTczTYpDgrGnrNy5Uratm2bwdOr1Wq0a9cO
+H330kdX2JgAOCsZKWbx4MQoNfFK9KIpo0qQJpk+fLnezTY6DgtV6RX9e0j9gwABKTEw0eD47OzuE
+h4eja9euVt2bADgoGENOTg6WLVtGu6twCr5KpULr1q2xePFiqw8JgIOCMWRkZODLL780+EY6giDA
+zc0NU6ZMkbvpNYaDgtV6hYWFuH//vsHT63Q6vP322+jfv3+t6E0AHBSMVYlCoYCvry9WrFhRa0IC
+4KBgzGCCIMDFxQXjx4+Xuyk1joOCMQNpNBoEBwdj5MiRtao3AXBQMGYQURTh7e2NLVu21LqQADgo
+GNNLEAQ4Oztj1KhRcjdFNhwUjOmhVqvRoUMHTJkypVb2JgAOCsYqJYoi3N3dsX///lobEgAHBWOV
+srOzs44H+LwkDgrGKiAIApycnDBv3rxa3ZsAOCgYqxARITMzE6tXr671z2vhoGCsEo8ePcKyZcvk
+bobsOCgYq0RRURFu3bqFiIiIWt2r4KBgTI/c3FwcPnwY69atq7VhwUHBmAEyMjLw1Vdfyd0M2XBQ
+MGaAoqIi3LhxA8OHD6+VvQoOCsYMlJubi4MHD2Ljxo21Liw4KBirgoyMDPz973+Xuxk1joOCsSp4
++vQpbty4gVGjRtWqXgUHBav1RFGEg4ODwdPn5ORg79692LJlS60JCw4KVuvZ2dnhvffeg1KpNHie
+4hvy1hYcFKzWc3R0xKpVq4SWLVsaPM/Tp09x9epVjBkzplb0KjgoWK0nitJmMGfOHDg5ORk8X05O
+Dnbt2oVt27ZZfVhwUDD2p/DwcCEiIgIqlcrgeTIyMvDFF1/I3XST46Bg7DnffPON0KZNG4Onf/r0
+Ka5cuYLx48dbda+Cg4KxF3zyySdwcXExePrs7GzExsZix44dVhsWHBSMvaBPnz7CX//6V2g0GoPn
+SU9Pt+pdEA4KxsqxePFioX379gZPX1hYiIsXL2LixIlW2avgoGCsAnPmzIGrq6vB02dnZ2P79u3Y
+u3ev1YUFBwVjFejRo4fw/vvvQ6vVGjxPWloaFi1aJHfTjY6DwlhEEdDp5G4FM7J58+YJgYGBEATD
+7q9bWFiICxcuYOrUqVbVq+CgMBadDujeXe5WMBNISEgQGjRoYPD0jx8/RkxMDA4cOGA1YcFBUZ5J
+k6r2ASuVQIsWwLJltf627tZq0qRJsLGxMXj6hw8f4m9/+5vczTYaDorybN5s+LSCALi4AOPHy91q
+ZkIzZ84UunTpUqVdkN9++w3Tp0+3il5F7QmKJ08Mm274cEJamuGvq9EAwcFAZCT3Jv70xIBlfeTI
+EYvbgA4dOiS4u7sbPP3jx4+xadMmi3yvLzL8ulpLl5wMuLtX/oE9fQo8fGj4a4oi8MorwObNHBLP
+SU5OhrueZV1YWCh3M6tl8uTJmDNnDrKzsw2aPjU1FQsXLkRoaKjcTX85RGR5BZBZlLMz0ZdfktHf
+X6dO1W+Tp6fR2gOAzLE8K3mPxn698qp///4kiqLBr1+nTh366KOPjL+e1GDVnl0PY1OrgXbtgOnT
+uTdRy+zcuVPw8vIyePrHjx8jKioK8fHxFrsLwkFRHaIING4MTJ8ud0uYTKZPn446deoYNC0RISUl
+BZ9//rncza42yxyjaNdO3t+vVgNvvgl07Wqa3oSfn+GDry+qwvF+fdrJvZwrfIsVv8fqtLkq50gU
+Gzt2rHDmzBk6d+6cwfMoFArExsbSwIEDLa4XKvy5X8cYYxXiXQ/GmF4cFIwxvTgoGGN6cVAwxvSy
+zKMeDIiJIRBJ15rY2EgXpoki0KtX+SPqW7YQlErplPPcXKCoCKX+r1AA5Y3GHzpESEmRTudycgLC
+wkpPc+RI6VPedTqgXz9pmthYQkGB1EZbW6BvX4sb7WcSDgpL9NVXhH/8A7hxQwqJ4GDA2Rm4dQuY
+OpVQvz4QHg5MnChtmFOnElauBF57DWjSBDhyBMjMBDw9gcBA4LffgMRE4OpVwuzZ0jxr10rzEAEh
+IdLv2bIFmDOHMHQoMGuWNN2ePcDOndKp7xoN0K0boNEQ1Grgk0+kNr3yCtC2LWBrSyY7pMxMS+5T
+Q7mqWcuWSadsu7oSHT367PTg9euJvL2JdDqi0aOl748eTdSx47NpWrQg0mqJBg0q/b3Zs6X/r1ol
+zd+0adnTjrt1I7KzI5o8+dnPIiOltjRqVHr63r2JevSw6FOXufgUbsvm5lb+90eMEDBzJpCfD+za
+BfzjHwRbW2DIkMpfb+hQoPjBN4sXS19DQspON2oU8PgxEBPz7HvOztJXheLZ92bPJhQVAXFx3IOw
+AhwU1mj0aAF16wLZ2UBCAtCzJzBhQuUb7OzZAubOFRATQ7h5U9qNCAgoO92gQQJEUQqLKVNKn61X
+VCR9XbyYsGsXcPAgh4SV4DEKOS1bVv5psSoVMH78y21k3t7AqVNAUhLQo4fhr3X+vPRVqaz4dHCN
+RjrFvHjaYjk5wNy5hC+/BOrWNZ9lwV4aB4Wc9u0r//vSUQzC2LHV30DUamkgsqCgavNlZT379/O7
+Es8TBOm1X7wnw+PHwO7dUvuTk4Fu3Qjx8Ya9B1MuC/bSOCjkdPy46Vb+lBRpQ6/CcykAAA0bSl+J
+SofG8/Lzpb/0jRuX/n7dusBXXwEHDgDffSf1aObOJcydq/99mnJZsJfGYxTWqvjQaadOVZuvXTvp
+XIgnT4CrV8v+/MABwtOn0mu/8Ubpn6lU0hW1S5cKaNVKCpq1a+VeEswIOCgsVUV/7QHpvp9FRdLl
+6h99VPYvdUGB1GPIzy87b9euArp3l24LeOJE2Z8fPCgFQosWzwZIc3OlnxUPZgLArFmAvb00RhIc
+zJcoWzgOCkt18qS0a0EEXLsmfS8mhhAZSThxAujcGZg/v+x827YRHj4sPd+L9uwR0KED8McfwJdf
+PtvIN2wgJCQAHTsCn332bPrz56W25OdLJ2oBwHvvCQgPl35+9iwwejSHhQXj+1FYotmzCT/99Oz/
+gvDsSWWNG0uHNUeOLNuTiIsjLFki9RaK56tbF9i+vfzxgWXLCP/+t/RvtVoavGzXrnQvpX9/QkbG
+s3lsbYHBg4EhQ6Rp3n6bkJsr/a6GDYHoaB6LsEAcFIwxvXjXgzGmFwcFY0wvDgpmXDt2EOrXJwiC
+eZdSSWjalLBkCe97G4DHKJjxHD5M+OAD6ZJ1c6ZQAD4+wOTJwJgxPLhqAA6Kl7Rv3z66desW0tLS
+kJWVVfKoOQcHB7i6umLatGm1Z0Vs2ZLw++9yt6JyKhXQsqV0nsd779Wez+ZlyX2du6VVVFQUDR8+
+nFq0aEE6na7SR8k5OzvT+vXra8f9GNq1I9kf8aivtFqizp2JEhJKPpM5c+bUjs/nJUv2BlhKLVq0
+iFq1alWlZ1ra2trSpEmTrH9FDAyUPwQqK0EgsrcnevvtUp/FiBEjrP+z4aComYqLi6OgoKBqPUxX
+EARq1KgRHThwwHpXyC5d5A+CykoUierXJxo5suQzOHjwIPXt25eio6Ot93PhoKi5SkhIIC8vr5d6
+8rZCoSBfX186cuSIda2UR48SdeggfxBUVkqldDu/Tz8tWfZRUVHUtm1bmjt3rnV9HhwU8lWXLl1e
+KiSKSxRF8vLyos2bN5deOePjLXNl3b5dui+n3EFQ2a6GnR1R+/ZEmzaVLOMvvviC3N3d6YMPPrDM
+5c5BYX516NAhEgTBKEFRvBvi7OxMn332WemVNDaWyJJ2TRYvJqpbV/4wqKwX4elJNHx4qWU6atQo
+cnBwoMGDB1vOsjajkr0B5loLFiwwWkg8X1qtlnr37l12ZZ07t9RfP7Osvn2lv9Zyh0FFYxFOTtJR
+jY0bS5bjkSNHKCgoiGxsbKhPnz7mvXzNuGRvgLnW7NmzTRIUz++KLF++vPSKu3Il0dChRMuWmdcK
+PX8+UePG8odBRbsZNjZEvr5EU6eWWm7Lli2jBg0akEajoW7dupnXMrWwkr0B5lqrV68mURRNFhYA
+SKfT0dChQ8uuwB9+SBQURDRpEtHu3fKt4MuWEbVsKX8YVFRqNZGXF1F4OFFcXKnlNGzYMFIoFKRW
+q6lz584cEhwUpqumTZuaNCiKj4r4+flRVFRU2ZU5IoLIx4fo9deJZswgOnSoZlb4WbPMOyCUSqIm
+TYh69SLavr3UMlmzZg01b96cAJBaraaOzz/4iIuDwhS1du1aaty4MSmVSpMHhq2tLUVGRpZdqffv
+JwoLI/LwIKpTR+pijxhB9N13xtsADh8mmjePqGdP6WiB3EFQUalU0tPIgoOJ1q4t8/4jIiJIrVYT
+ANJoNNyTMGLxtR56REVFUVRUFO7evYvc3Fzk5eUhMzMT+eXdb/IliaKI+vXrY/To0Zg3b17p6xB2
+7SJs2ybdVi4pSbpnpkIBNGoE+PpKz/d0c5PK1VW609Tzz/OIjydkZ0t3qbpzR3om6K1b0g10r1+X
+NkVzJAiAViu9Lx8fYMAA6QFHz/nb3/5GK1aswJ07dyAIAmxsbBAYGIhjx47xtRxGwkFRBZs3b6bE
+xEScOnUKV65cQUpKClJTU1H0/E1ljUCpVOLVV1/FxIkTMbK8W9q9/z7hxx+BBw+AjIxnt7azJqIo
+3ZzXzQ3w9wfefffZU9L/FB0dTStWrMC//7xdnyAIqFOnDkJCQrB7924OCWOSu0tjybVw4UJ6/fXX
+yc3NjRQKhdF3R7RaLfXs2ZNiYmLK70J/+qk06OnlReTgYL6HLg0tQSCytSVyd5fGZV44ilFcO3bs
+oF69epXaJRRFkVxcXIiv3zBNyd4Aa6ivv/6a2rdvT3Xr1jXqSVrFVXx4r9wBTyLQgQNEEyYQvfaa
+NMhXp450XoHcG35VwqFRI6I2baRrMrZurTAg+vXrRxqNpsyAsLu7O02fPp1DgoPC/Ovjjz+mFi1a
+kK2trUkGPIsP9a1Zs6biDWLTJqL33yfq2JGoWTMiV1fp8mq5A+H5YFCrierVk04DDwiQzqKs5D1t
+2LCB3nrrrXIHlVUqFbVs2ZK+/vprDgkTFo9RmEBERAT98MMPuHfvHgoLC43++kqlEs2aNUPfvn3R
+o0cPhISEVLw//sUXhFOnpGd45ORIg5k5OVI9eWL6haFSSY8RKC47O+mRAq+/LlUlD1CeP38+7dq1
+C7/++iteXE8FQYCtrS3atm2LmTNnolevXjwmYUIcFCYSExNDK1euxO+//47U1FSYajnb2tqic+fO
+6NOnD8aNG6d/Y1mzhnDpEnDlCnDvnvSUrydPSldBgTRAWlQk9QOe/3fxM0ReLJVKevbH86XVSkdg
+fHykIzM+PkD37pW2ce3atXT48GH885//RFpaWrnTKBQKuLm5oWvXroiKiuKAqAEcFCY2d+5cio2N
+RWJiYslt8kyh+NBqUFAQAgMDMXnyZMM3oIQEQnKydBTlwQMgNVXqeeTnS5WXJ1VBgRQKWu2z0mik
+noKTk3SEon59qUJDDf7933//PZ08eRI//PADEiu532bxUY1mzZohMjISkyZN4pCoIRwUNWT48OF0
+8uRJ3Lt3DwUFBSb9XYIgQKfTwd/fH0FBQWjXrh369+9vNhvV3r176fTp0zh16hROnz6N1NRUve9H
+o9HAw8MDISEhWL58udm8l9qCg6IGxcbG0qpVq3D+/HkkJyebbHfkRcV/if38/NCiRQv4+fnB19cX
+ffr0MfkGFxcXR9evX8fvv/+Oixcv4uLFi7h//77B8xfvZgQEBGDcuHHoUcmYBjMdDgoZLFmyhDZt
+2oSLFy/iSU0MKJZDEATY2dmhQYMGcHNzK/lav359uLi4QKvVlqpu3bqV2UAPHz5MmZmZyMrKwqNH
+j5CSkoKkpCQkJSXh3r17uHXrFh49elSt9omiCHt7e/j6+iIyMhIffPABB4SMOChk5ObmRklJSXI3
+w6wIggB7e3t4eHige/fuWLJkCQeEGeCgkJFKpSJTHD61RMW7Rx4eHggODsbXX3/NAWFGlHI3oLZa
+unQphwSkXQwnJyc0bNgQb775Jr799lsOCDPEQSETfSP91kwQBKjVari4uKBx48bo1q0bFixYwAFh
+xjgoZOLo6Ch3E2qcUqmEg4MD6tWrB19fX4SFhZV/dSwzOxwUMvHz84NKpTL5ORVyKw4HZ2dnNGrU
+CJ07d8b8+fM5HCwMD2bKyN/fn86dOyd3M4xKoVDA1tYWderUgb29PRo0aICgoKCyN+JhFoWDQkYb
+NmygKVOmICMjQ+6mVItCoYBWq4WNjQ10Oh1sbW1Rr149tG7dGm3btsVf//pXDgcrwUEhs0mTJtHG
+jRurfWKSMQmCAFEUS76KogiFQgGVSlVSarUaarUaWq0WTk5O8PT0hLe3N5o1a4ZBgwZxMFgpDgoz
+MHHiRNq5cycePHhQY6d1v6j4egp7e3vY29vD0dER9vb2JYcu3dzc4OLiAldXV4SFhXEg1DIcFGbi
+u+++o7Vr1+LWrVuy7IoUnzLdpEmTUuXu7o5hw4ZxMNRyHBRmZtq0aXT06FE8ePAAaWlpRr9xb3WI
+oghnZ2e4u7vD3d0dnp6e8PT0hIeHB/q9cMNbZp04KMzU3Llz6ejRo7h79y7S0tLw+PFjuZtUhiAI
+0Gq1cHd3h7e3N7y8vODt7Q1vb2/07duXA8SKcFCYue3bt9ORI0dw9uxZpKWlIT09HdnZ2bKNZRii
++LoNb29v+Pj4wMfHB76+vhgyZAiHh4XioLAg0dHRdOLECZw7dw4PHz5ERkYGsrKyzDo0ihX3Ppo2
+bYpWrVqVFPc8LAMHhYXatm0bnThxAqdPn8bDhw+Rnp6OzMxMiwiNYqIowtXVFf7+/njttdcQEBDA
+R1TMFAeFFdizZw8dP34cP//8M5KTk6sdGqIows7ODg4ODigsLER+fn5J1cSVrgqFAo0bN0anTp3w
+xhtvYOzYsRwaZoKDwsrs3buXEhISSkIjLS3N4N0TtVqNtm3bomPHjhBFEU+ePEFmZibu3buHtLQ0
+5ObmlilT3aFLFEW4uLggNDQUYWFheOeddzg0ZMRBYcV2795NR48exalTp5CSkmLQ0ZPigcguXbqg
+V69eZf6q79+/n27cuIHr16/jxo0buH//PnJycpCTk4Pc3Fzk5OQgLy8PT434PFS1Wo327dvj3Xff
+xcSJEzkwZMBBUUvExMTQsWPHcObMGTx8+BBpaWnIy8urdB6FQoFXXnkFAwYMwKJFiyrdQLdv307X
+r1/HlStXcOPGDaSnp5cESHZ2NnJzc1/6SlmlUglfX18MGzYMM2bM4MCoQRwUtdDq1aspLi6u5OFE
+6enplY5BCIIAJycnhIWFYfDgweiu5yE+xeLj4+ny5cu4dOkSrly5gqSkJGRnZ5dUTk5OtcY+lEol
+WrZsifHjx2P06NEcGDWAg6KWW7RoER07dgyJiYlITU2tdBC0eLfk7bffRmRkJEKr8JCf5y1fvpyK
+b92flJSEx48fl5S+Xs7z/rw7OPbv389hYWIcFAwAcOTIETp48CB+/PFHJCcnIzU1Ffn5+eVOW3yn
+7IEDB2LNmjUvvZHu27ePfv31V5w7dw43btzAo0ePkJWVhczMzArbUEwURTRo0ABTpkzBtGnTODBM
+hIOClbFq1So6ePAgLl68iJSUlAp7GYIgwM3NDePGjcOcOXOMtpHGxcXRqVOncOrUKVy7dg0ZGRlI
+T09Hbm5uhfPodDoMHDgQGzZs4LAwAQ4KVqnJkyfTiRMn8ODBA6SmppY7pqBWq9G5c2fMmjWr3AcF
+vayVK1fSyZMncf78eaSnp5ccqi2vHYGBgfjnP//JYWFkHBTMIEuXLqUDBw7g2rVrSE5OLjOWIIoi
+GjZsiBkzZpj0EOb3339PCQkJ+O2335Camoq0tLRS53IolUr85S9/wenTpzksjIiDglXJ1q1baceO
+HTh37lzJQOTzbG1tERkZWSMPEv7mm2/o6NGjuHr1KlJSUpCRkQEiglKpxKuvvoqzZ89yWBgJBwWr
+lvj4eNqyZQv+7//+D/fv30dWVlbJz7RaLUJDQ7F79+4a21BnzpxJx48fx71795CSkgIA6NixI06e
+PMlhYQQcFOyljRkzhk6ePIl79+6V9DDUajW6dOmCuLi4Gt1QV69eTbt27cLly5eRmZmJ/v37G+XI
+TG3HQcGMZsSIEfSvf/0L9+7dQ35+PtRqNUJCQnD48OEa31B3795NmzdvRmJiIubNm4devXpxWLwE
+DgpmVAcPHqQVK1bgzJkzSEpKglarxcCBAxEVFSXLhnro0CG6cuUKJk+ezEHxEjgomEl8++23tHbt
+Wly/fh0KhQKzZ8/m6zMsGAcFM6kRI0bQ8ePHoVAocPPmTQ4KC8VBwUxuw4YNtHz5cvj4+GDTpk0c
+FhZIlLsBzPqNGDFC+OWXX4SauEsWMw3uUbAadezYMTL0MnVmPjgoGGN68a4HY0wvDgrGmF4cFIwx
+vTgoGGN6cVAwxvTioGCM6cVBwRjTi4OCMaYXBwVjTC8OCsaYXhwUjDG9OCgYY3pxUDDG9OKgYIzp
+xUHBGNOLg4IxphcHBWNMLw4KxpheHBSMMb04KBhjenFQMMb04qBgjOnFQcEY04uDgjGmFwcFY0wv
+DgrGmF4cFIwxvTgoGGN6/T8mKDxExolcKAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0wMy0xOFQw
+OTowMToyNSswMTowMMcoCT4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMDMtMThUMDk6MDE6MjUr
+MDE6MDC2dbGCAAAAAElFTkSuQmCC" />
+</svg>

BIN
dtok-mobile-vuetify/src/assets/logo.png


BIN
dtok-mobile-vuetify/src/assets/output-onlinepngtools (1).png


BIN
dtok-mobile-vuetify/src/assets/output-onlinepngtools.png


+ 44 - 0
dtok-mobile-vuetify/src/components/ItemSelect.vue

@@ -0,0 +1,44 @@
+<script setup>
+import {computed, reactive, ref, toRefs, watch} from "vue";
+
+let props = defineProps(['defaultSelect','modelValue'])
+
+let commonItems = JSON.parse(localStorage.getItem('commonItems'))
+let obj = Object.keys(commonItems).map((item, i) => {
+  return {
+    name: item,
+    size: `${commonItems[item].length} 条数据`
+  }
+})
+
+let items = reactive(obj)
+let select
+if (props.defaultSelect) {
+  console.log(JSON.stringify(obj.find((item) => item.name === props.defaultSelect)))
+  select = ref(props.defaultSelect)
+} else {
+  select = ref(items[0].name)
+}
+
+defineExpose({select})
+</script>
+
+<template>
+  <!--    :hint="`${select.state}, ${select.abbr}`"-->
+  <div>
+    <v-select
+      :hint="`${commonItems[select].length}条数据`"
+      v-model="select"
+      :items="items"
+      item-title="name"
+      item-value="name" tile flat
+      label="选择话术" variant="outlined" density="compact"
+      persistent-hint
+      single-line
+    ></v-select>
+  </div>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 13 - 0
dtok-mobile-vuetify/src/components/MainLayout.vue

@@ -0,0 +1,13 @@
+<script setup>
+
+</script>
+
+<template>
+  <v-app>
+    <v-main>
+      <router-view></router-view>
+    </v-main>
+  </v-app>
+</template>
+
+

+ 38 - 0
dtok-mobile-vuetify/src/components/NumberInput.vue

@@ -0,0 +1,38 @@
+<script setup>
+import {ref} from "vue";
+let emit = defineEmits(['update:modelValue'])
+let props = defineProps(['modelValue'])
+let number = ref(0)
+number.value = props.modelValue
+
+function add(){
+  number.value++
+  emit('update:modelValue',number.value)
+}
+
+function minus(){
+  number.value--
+  emit('update:modelValue',number.value)
+}
+
+
+</script>
+
+<template>
+  <v-text-field  @update:model-value="emit('update:model-value', modelValue)" label="最大执行用户数" variant="outlined" density="compact">
+    <template v-slot:append>
+      <v-icon color="red" @click="add">
+        mdi-plus
+      </v-icon>
+    </template>
+    <template v-slot:prepend>
+      <v-icon color="green" @click="minus">
+        mdi-minus
+      </v-icon>
+    </template>
+  </v-text-field>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 206 - 0
dtok-mobile-vuetify/src/components/NumberInputSpinner.vue

@@ -0,0 +1,206 @@
+<template>
+  <div class='vnis' >
+    <button
+      @click='decreaseNumber'
+      @mousedown='whileMouseDown(decreaseNumber)'
+      @mouseup='clearTimer'
+      :class='buttonClass'>-</button>
+    <input
+      type='number'
+      v-bind:value='numericValue'
+      @keypress='validateInput'
+      @input='inputValue'
+      :class='inputClass'
+      :min='min'
+      :max='max'
+      debounce='500'
+    />
+    <button
+      @click='increaseNumber'
+      @mousedown='whileMouseDown(increaseNumber)'
+      @mouseup='clearTimer'
+      :class='buttonClass'>+</button>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'NumberInputSpinner',
+
+  data: function() {
+    return {
+      numericValue: this.value,
+      timer: null
+    };
+  },
+
+  props: {
+    value: {
+      type: Number,
+      default: 0
+    },
+    min: {
+      default: 0,
+      type: Number
+    },
+    max: {
+      default: 99999,
+      type: Number
+    },
+    step: {
+      default: 1,
+      type: Number
+    },
+    mouseDownSpeed: {
+      default: 100,
+      type: Number
+    },
+    inputClass: {
+      default: 'vnis__input',
+      type: String
+    },
+    buttonClass: {
+      default: 'vnis__button',
+      type: String
+    },
+    integerOnly: {
+      default: false,
+      type: Boolean
+    }
+  },
+
+  methods: {
+    clearTimer() {
+      if (this.timer) {
+        clearInterval(this.timer);
+        this.timer = null;
+      }
+    },
+
+    whileMouseDown(callback) {
+      if (this.timer === null) {
+        this.timer = setInterval(() => {
+          callback();
+        }, this.mouseDownSpeed);
+      }
+    },
+
+    increaseNumber() {
+      this.numericValue += this.step;
+    },
+
+    decreaseNumber() {
+      this.numericValue -= this.step;
+    },
+
+    isInteger(evt) {
+      evt = evt ? evt : window.event;
+      let key = evt.keyCode || evt.which;
+      key = String.fromCharCode(key);
+      const regex = /[0-9]/;
+
+      if (!regex.test(key)) {
+        evt.returnValue = false;
+        if (evt.preventDefault) evt.preventDefault();
+      }
+    },
+
+    isNumber(evt) {
+      evt = evt ? evt : window.event;
+      var charCode = evt.which ? evt.which : evt.keyCode;
+
+      if (
+        charCode > 31 &&
+        (charCode < 48 || charCode > 57) &&
+        charCode !== 46
+      ) {
+        evt.preventDefault();
+      } else {
+        return true;
+      }
+    },
+
+    validateInput(evt) {
+      if (this.integerOnly === true) {
+        this.isInteger(evt);
+      } else {
+        this.isNumber(evt);
+      }
+    },
+
+    inputValue(evt) {
+      console.log(parseInt(evt.target.value))
+      this.numericValue = evt.target.value
+        ? parseInt(evt.target.value)
+        : this.min;
+    }
+  },
+
+  watch: {
+    numericValue: function(val, oldVal) {
+      if (val <= this.min) {
+        this.numericValue = parseInt(this.min);
+      }
+
+      if (val >= this.max) {
+        this.numericValue = parseInt(this.max);
+      }
+
+      if (val <= this.max && val >= this.min) {
+        console.log(val, oldVal)
+        this.$emit('input', val, oldVal);
+      }
+    }
+  }
+};
+</script>
+
+<style lang='scss'>
+.vnis {
+  *,
+  *::after,
+  *::before {
+    box-sizing: border-box;
+  }
+
+  &__input {
+    -webkit-appearance: none;
+    border: 1px solid #ebebeb;
+    float: left;
+    font-size: 16px;
+    height: 40px;
+    margin: 0;
+    outline: none;
+    text-align: center;
+    width: calc(100% - 80px);
+
+    &::-webkit-outer-spin-button,
+    &::-webkit-inner-spin-button {
+      -webkit-appearance: none;
+    }
+  }
+
+  &__button {
+    -webkit-appearance: none;
+    transition: background 0.5s ease;
+    background: #387e90;
+    border: 0;
+    color: #fff;
+    cursor: pointer;
+    float: left;
+    font-size: 20px;
+    height: 40px;
+    margin: 0;
+    width: 40px;
+
+    &:hover {
+      background: lighten(#387e90, 10%);
+    }
+
+    &:focus {
+      outline: 1px dashed lighten(#387e90, 20%);
+      outline-offset: -5px;
+    }
+  }
+}
+</style>

+ 56 - 0
dtok-mobile-vuetify/src/components/TagInput.vue

@@ -0,0 +1,56 @@
+<script setup>
+
+import {ref, watch} from "vue";
+
+const props = defineProps(['label', 'value'])
+let emit = defineEmits(['update:value'])
+let tags = ref([])
+let textAreaStr = ref("")
+let isAdd = ref(false)
+
+tags.value = props.value
+function addTags() {
+  tags.value = tags.value.concat(textAreaStr.value.split('\n'))
+  emit('update:value',tags.value)
+  isAdd.value = false
+  textAreaStr.value = ''
+}
+
+function removeTag(i) {
+  tags.value.splice(i, 1)
+  console.log(tags.value)
+}
+
+defineExpose({isAdd, tags, textAreaStr})
+
+</script>
+
+
+<template>
+  <v-row style="margin-top: 0">
+    <v-chip color="primary" v-for="(item,i) in tags"
+            class="ma-2" tile
+            closable @click:close="removeTag"
+    >
+      {{ item }}
+    </v-chip>
+  </v-row>
+  <v-btn @click="isAdd=true" v-show="!isAdd" style="margin-top: 10px" tile color="primary" block
+         prepend-icon="mdi-plus">添加
+  </v-btn>
+  <v-textarea v-model="textAreaStr" style="margin-top: 20px" v-show="isAdd" rows="5" variant="outlined" color="primary"
+              label="每行一个,可一次添加多个!"
+  ></v-textarea>
+  <v-row v-show="isAdd">
+    <v-col>
+      <v-btn @click="isAdd=false" tile color="primary" block>取消</v-btn>
+    </v-col>
+    <v-col>
+      <v-btn @click="addTags" tile color="primary" block>确认添加</v-btn>
+    </v-col>
+  </v-row>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 56 - 0
dtok-mobile-vuetify/src/components/dialog/ConfirmDialog.vue

@@ -0,0 +1,56 @@
+<script setup>
+import {ref} from "vue";
+import {tr} from "vuetify/locale";
+
+let props = defineProps(['title', 'icon', 'message','type'])
+//
+let emit = defineEmits(['onDialogThen'])
+let dialog = ref(false)
+
+function enter() {
+  emit('onDialogThen',props.type)
+  dialog.value = false
+}
+
+function open() {
+  dialog.value = true
+}
+
+function close() {
+  dialog.value = false
+}
+
+defineExpose({open, close})
+
+</script>
+
+<template>
+  <v-dialog
+    v-model="dialog"
+    max-width="400"
+    persistent
+  >
+
+    <v-card tile
+      :prepend-icon="icon"
+      :text="message"
+      :title="title"
+    >
+      <template v-slot:actions>
+        <v-spacer></v-spacer>
+
+        <v-btn tile @click="dialog = false">
+          取消
+        </v-btn>
+
+        <v-btn tile color="primary" @click="enter()">
+          确定
+        </v-btn>
+      </template>
+    </v-card>
+  </v-dialog>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 63 - 0
dtok-mobile-vuetify/src/components/dialog/GroupDialog.vue

@@ -0,0 +1,63 @@
+<script setup>
+import {onMounted, ref} from "vue";
+import emitter from '@/core/event-bus.'
+
+const emit = defineEmits(['callGroupName'])
+
+let dialog2 = ref(false)
+let groupValue = ref("")
+
+
+function enter() {
+  dialog2.value = false
+  if (groupValue.value === "") {
+    emitter.emit('show_snackbar', {
+      type: 0,
+      text: '请输入组名'
+    })
+  } else {
+    dialog2.value = false
+    emit('callGroupName', groupValue.value)
+  }
+}
+</script>
+
+<template>
+  <v-dialog
+    v-model="dialog2"
+  >
+    <template v-slot:activator="{ props: activatorProps }">
+      <v-btn @click="dialog2=true" icon>
+        <v-icon>mdi-plus</v-icon>
+      </v-btn>
+    </template>
+    <v-card title="添加话术组">
+      <template v-slot:text>
+        <v-form ref="form">
+          <v-text-field required ref="group" :rules="[value => !!value || '请填写字段']"
+                        v-model="groupValue"
+                        variant="outlined" label="请输入组名"></v-text-field>
+        </v-form>
+      </template>
+
+      <v-card-actions>
+        <v-spacer></v-spacer>
+
+        <v-btn
+          text="取消"
+          variant="text"
+          @click="dialog2 = false"
+        ></v-btn>
+        <v-btn color="primary"
+               text="确认"
+               variant="text"
+               @click="enter()"
+        ></v-btn>
+      </v-card-actions>
+    </v-card>
+  </v-dialog>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 121 - 0
dtok-mobile-vuetify/src/components/dialog/ItemGroupDialog.vue

@@ -0,0 +1,121 @@
+<script setup>
+
+import {reactive, ref, watch} from "vue";
+import {android} from "@/core/android"
+import GroupDialog from "@/components/dialog/GroupDialog.vue";
+import ItemsDialog from "@/components/dialog/ItemsDialog.vue";
+
+let dialog = ref(false)
+let commonItems;
+let loading = true
+let dialog2 = false
+if ('commonItems' in localStorage) {
+  loading = false
+  commonItems = reactive(JSON.parse(localStorage.getItem("commonItems")))
+} else {
+  if (window.dtokjs) {
+    window.dtokjs.getCommonItem()
+  }
+}
+
+function refresh() {
+  console.log("刷新")
+  let obj = JSON.parse(localStorage.getItem("commonItems"))
+  Object.keys(obj).forEach((key) => {
+    commonItems[key] = obj[key]
+  })
+
+}
+
+watch(dialog, (n, o) => {
+  console.log("Dialog opening")
+  console.log(localStorage.getItem("commonItems"))
+})
+
+
+function setCommonItems(resp) {
+  loading = false
+  console.log("android call setCommonItems", JSON.stringify(resp))
+  if (resp !== null) {
+    localStorage.setItem('commonItems', JSON.stringify(resp.data))
+    commonItems = reactive(JSON.parse(localStorage.getItem("commonItems")))
+  }
+}
+
+function openGroupDialog() {
+
+}
+
+function callGroupName(groupName) {
+  commonItems[groupName] = []
+  localStorage.setItem("commonItems", JSON.stringify(commonItems))
+}
+
+android.setCommonItems = setCommonItems
+
+function getCommonItems() {
+  window.dtokjs.getCommonItem()
+}
+
+
+defineExpose({dialog, dialog2})
+</script>
+
+<template>
+  <v-dialog
+    v-model="dialog" scrollable
+    fullscreen
+  >
+    <template v-slot:activator="{ props: activatorProps }">
+      <v-list-item v-bind="activatorProps"
+      >
+        <v-list-item-title>
+          <v-icon>mdi-comment-edit-outline</v-icon>
+          话术管理
+        </v-list-item-title>
+      </v-list-item>
+    </template>
+
+    <v-card :loading="loading"
+    >
+      <v-toolbar color="primary" flat>
+        <v-btn
+          icon="mdi-close"
+          @click="dialog = false"
+        ></v-btn>
+
+        <v-toolbar-title>话术管理</v-toolbar-title>
+
+        <v-spacer></v-spacer>
+        <GroupDialog @callGroupName="callGroupName"></GroupDialog>
+
+      </v-toolbar>
+      <v-card-text class="pa-0 text-center" style="height: 300px;">
+
+        <v-card-title v-if="commonItems === undefined" style="margin-top: 50%">无数据</v-card-title>
+        <!--        <v-card link class="ma-2" v-else elevation="2" tile v-for="(item,i) in Object.keys(commonItems)">-->
+        <!--          <div class="pa-2 d-flex align-center">-->
+        <!--            &lt;!&ndash;              <v-icon&ndash;&gt;-->
+        <!--            &lt;!&ndash;                icon="mdi-broadcast"&ndash;&gt;-->
+        <!--            &lt;!&ndash;                start&ndash;&gt;-->
+        <!--            &lt;!&ndash;              ></v-icon>&ndash;&gt;-->
+        <!--            <div class="text-h6" style="margin-left: 10px">-->
+        <!--              {{ item }}-->
+        <!--            </div>-->
+        <!--            <v-spacer></v-spacer>-->
+        <!--            {{ commonItems[item].length }} 条数据-->
+        <!--          </div>-->
+
+        <!--        </v-card>-->
+        <ItemsDialog v-on:save-done="refresh" v-for="(item,i) in Object.keys(commonItems)" :key_="item"
+                     :size="commonItems[item].length"></ItemsDialog>
+      </v-card-text>
+
+    </v-card>
+  </v-dialog>
+
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 157 - 0
dtok-mobile-vuetify/src/components/dialog/ItemsDialog.vue

@@ -0,0 +1,157 @@
+<script setup>
+
+import {reactive, ref} from "vue";
+import emitter from "@/core/event-bus.";
+import {tr} from "vuetify/locale";
+
+const emit = defineEmits(['saveDone'])
+
+const props = defineProps(['key_', 'size'])
+let dialog = ref(false)
+let dialog2 = ref(false)
+let items = reactive(null)
+let itemStr = ref("")
+if (props.key_) {
+  let items_ = JSON.parse(localStorage.getItem("commonItems"))
+  items = reactive(items_[props.key_])
+}
+
+function removeItem(i) {
+  items.splice(i, 1)
+}
+
+function reset() {
+  let obj = JSON.parse(localStorage.getItem("commonItems"))
+  // items = obj[props.key_]
+  items.splice(0, items.length, ...obj[props.key_])
+
+}
+
+function openAddItemDialog() {
+  dialog2.value = true
+}
+
+function addItems() {
+  if (itemStr.value) {
+    itemStr.value.split('\n').forEach((item) => {
+      items.push({
+        content: item,
+        type: props.key_
+      })
+    })
+    dialog2.value = false;
+    itemStr.value = ""
+  }
+}
+
+function saveItems() {
+  let commonItems = JSON.parse(localStorage.getItem('commonItems'))
+  commonItems[props.key_] = items
+  localStorage.setItem('commonItems', JSON.stringify(commonItems))
+  emitter.emit('show_snackbar', {
+    type: 1,
+    text: '保存成功'
+  })
+  emit('saveDone')
+}
+
+</script>
+
+<template>
+  <v-dialog
+    v-model="dialog2"
+  >
+    <v-card title="添加话术">
+      <template v-slot:text>
+        <v-form ref="form">
+          <v-textarea required :rules="[value => !!value || '请填写话术']"
+                      v-model="itemStr"
+                      variant="outlined" label="多个话术换行"></v-textarea>
+        </v-form>
+      </template>
+
+      <v-card-actions>
+        <v-spacer></v-spacer>
+
+        <v-btn
+          text="取消"
+          variant="text"
+          @click="dialog2 = false"
+        ></v-btn>
+        <v-btn color="primary"
+               text="确认"
+               variant="text"
+               @click="addItems()"
+        ></v-btn>
+      </v-card-actions>
+    </v-card>
+  </v-dialog>
+  <v-dialog
+    v-model="dialog" scrollable
+    fullscreen
+  >
+    <template v-slot:activator="{ props: activatorProps }">
+      <v-card link class="ma-2" v-bind="activatorProps">
+        <div class="pa-2 d-flex align-center">
+          <!--              <v-icon-->
+          <!--                icon="mdi-broadcast"-->
+          <!--                start-->
+          <!--              ></v-icon>-->
+          <div class="text-h6" style="margin-left: 10px">
+            {{ key_ }}
+          </div>
+          <v-spacer></v-spacer>
+          {{ size }} 条数据
+        </div>
+
+      </v-card>
+    </template>
+
+    <template v-slot:default="{active}">
+      <v-card
+      >
+        <v-toolbar color="primary" flat>
+          <v-btn
+            icon="mdi-close"
+            @click="dialog = false"
+          ></v-btn>
+
+          <v-toolbar-title>{{ key_ }}</v-toolbar-title>
+
+          <v-spacer></v-spacer>
+          <v-btn @click="dialog2=true" icon>
+            <v-icon>mdi-plus</v-icon>
+          </v-btn>
+        </v-toolbar>
+
+        <v-card-text>
+          <v-text-field v-for="(item,i) in items"
+                        v-model="item.content"
+                        variant="underlined"
+                        @click:append="removeItem(i)"
+                        append-icon="mdi-delete"
+          ></v-text-field>
+        </v-card-text>
+        <v-divider></v-divider>
+
+        <v-card-actions>
+          <v-btn @click="reset" prepend-icon="mdi-refresh"
+                 text="重置"
+          ></v-btn>
+
+          <v-spacer></v-spacer>
+
+          <v-btn tile @click="saveItems"
+                 color="primary"
+                 text="保存" prepend-icon="mdi-file"
+                 variant="flat"
+          ></v-btn>
+        </v-card-actions>
+      </v-card>
+    </template>
+  </v-dialog>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 56 - 0
dtok-mobile-vuetify/src/components/dialog/LoadingDialog.vue

@@ -0,0 +1,56 @@
+<script setup>
+import {ref} from "vue";
+
+let props = defineProps(['text', 'icon'])
+//mdi-cellphone-nfc
+let dialog = ref(false)
+
+function open() {
+  dialog.value = true
+}
+
+function close() {
+  dialog.value = false
+}
+
+defineExpose({open, close})
+</script>
+
+<template>
+  <v-dialog
+    v-model="dialog"
+    max-width="320"
+    persistent
+  >
+    <v-list
+      class="py-2"
+      color="primary"
+      elevation="12"
+      rounded="lg"
+    >
+      <v-list-item
+        prepend-icon="$vuetify-outline"
+        :title="text"
+      >
+        <template v-slot:prepend>
+          <div class="pe-4">
+            <v-icon color="primary" size="x-large">{{ icon }}</v-icon>
+          </div>
+        </template>
+
+        <template v-slot:append>
+          <v-progress-circular
+            color="primary"
+            indeterminate="disable-shrink"
+            size="16"
+            width="2"
+          ></v-progress-circular>
+        </template>
+      </v-list-item>
+    </v-list>
+  </v-dialog>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 97 - 0
dtok-mobile-vuetify/src/components/dialog/UserProfileDialog.vue

@@ -0,0 +1,97 @@
+<script setup>
+import {reactive, ref, watch} from "vue";
+
+let props = defineProps(['userInfo', 'registerInfo'])
+
+let userInfo = null
+let registerInfo = null
+if (window.dtokjs) {
+  userInfo = reactive(JSON.parse(window.dtokjs.getUserInfo()))
+  console.log('userInfo', JSON.stringify(userInfo))
+}
+
+
+let dialog = ref(false)
+
+watch(dialog, (n, o) => {
+  registerInfo = reactive(props.registerInfo)
+})
+</script>
+
+<template>
+  <v-dialog
+    v-model="dialog"
+  >
+    <template v-slot:activator="{ props: activatorProps }">
+      <v-btn icon v-bind="activatorProps">
+        <v-icon>mdi-account</v-icon>
+      </v-btn>
+    </template>
+
+    <v-card tile
+            prepend-icon="mdi-account"
+            title="用户信息"
+    >
+      <v-card-text>
+        <template v-if="userInfo==null">
+          无用户信息
+        </template>
+        <template v-else>
+          <v-table>
+            <tbody>
+            <tr>
+              <td>用户名:</td>
+              <td>{{ userInfo.username }}</td>
+            </tr>
+            <tr>
+              <td>姓名:</td>
+              <td>{{ userInfo.name }}</td>
+            </tr>
+            <tr>
+              <td>有效期至:</td>
+              <td>{{ userInfo.expireAt.split(' ')[0] }}</td>
+            </tr>
+            <tr>
+              <td>最大设备数量:</td>
+              <td>{{ userInfo.maxDevices }}个</td>
+            </tr>
+            <tr v-if="registerInfo">
+              <td>IMEI:</td>
+              <td>{{ registerInfo.androidId }}</td>
+            </tr>
+            <tr v-if="registerInfo">
+              <td>手机型号:</td>
+              <td> {{ registerInfo.deviceBrand + registerInfo.deviceVersion }}</td>
+            </tr>
+            <tr v-if="registerInfo">
+              <td>注册时间:</td>
+              <td> {{ registerInfo.registerAt.split(' ')[0] }}</td>
+            </tr>
+            <tr v-if="!registerInfo">
+              <td style="color: red">无设备信息,请绑定设备</td>
+              <td></td>
+            </tr>
+
+            </tbody>
+          </v-table>
+        </template>
+      </v-card-text>
+
+      <v-divider></v-divider>
+
+      <v-card-actions>
+        <v-spacer></v-spacer>
+        <v-btn tile
+               color="primary"
+               text="关闭"
+               variant="tonal"
+               @click="dialog = false"
+        ></v-btn>
+      </v-card-actions>
+    </v-card>
+  </v-dialog>
+</template>
+
+<style scoped lang="sass">
+
+</style>

+ 162 - 0
dtok-mobile-vuetify/src/components/dialog/znzf.vue

@@ -0,0 +1,162 @@
+<script setup>
+import {reactive, ref, watch} from "vue";
+import TagInput from "@/components/TagInput.vue";
+import ExecData from "@/data/ExecData";
+import VueNumberInput from '@chenfengyuan/vue-number-input';
+import ItemSelect from "@/components/ItemSelect.vue";
+
+let module = '智能涨粉'
+let dialog = ref(false)
+let hsItem = ref(null)
+let znzf = reactive({
+  config: JSON.parse(JSON.stringify(ExecData.znzf)),
+  module: module,
+  itemKey: ''
+})
+
+watch(() => znzf.config, (value, oldValue, onCleanup) => {
+  console.log(JSON.stringify(value))
+}, {
+  deep: true
+})
+
+function startExec() {
+  console.log(hsItem.value.select)
+  znzf.config.plhs = JSON.parse(localStorage.getItem("commonItems"))[hsItem.value.select]
+    .map((item)=>{
+      return item.content
+    })
+  console.log(znzf.config)
+}
+
+function reset() {
+  console.log(ExecData.znzf)
+  znzf.config = JSON.parse(JSON.stringify(ExecData.znzf))
+}
+</script>
+
+<template>
+  <v-dialog
+    v-model="dialog" scrollable
+    fullscreen
+  >
+    <template v-slot:activator="{ props: activatorProps }">
+      <v-btn tile
+             prepend-icon="mdi-launch"
+             text="开始" color="primary"
+             v-bind="activatorProps"
+      ></v-btn>
+    </template>
+    <v-card flat
+    >
+      <v-toolbar color="primary" flat>
+        <v-btn
+          icon="mdi-close"
+          @click="dialog = false"
+        ></v-btn>
+
+        <v-toolbar-title>{{ module }}</v-toolbar-title>
+
+        <v-spacer></v-spacer>
+      </v-toolbar>
+      <v-card-text class="pa-0" style="height: 300px;">
+        <v-card tile class="ma-2" flat
+                text="自动和对标账号(种子号)的粉丝互动,快速爆粉,也可对同行的粉丝截流转化"
+                title="执行页面:首页-推荐"
+        >
+          <v-divider/>
+          <v-list lines="three">
+            <v-list-item class="pa-2">
+              <v-list-item-title>最大执行用户数</v-list-item-title>
+              <p>
+                <vue-number-input v-model="znzf.config.yxgs" center controls></vue-number-input>
+              </p>
+
+              <!--             <NumberInput v-model="znzf.config.yxgs"></NumberInput>-->
+            </v-list-item>
+            <v-list-item class="pa-2">
+              <v-list-item-title>主页停留(秒)</v-list-item-title>
+              <v-row>
+                <v-col>
+                  <vue-number-input v-model="znzf.config.czjg1" center controls></vue-number-input>
+                </v-col>
+                <div style="margin-top: 20px">至</div>
+                <v-col>
+                  <vue-number-input v-model="znzf.config.czjg2" center controls></vue-number-input>
+
+                </v-col>
+              </v-row>
+            </v-list-item>
+            <v-list-item class="pa-2">
+              <v-list-item-title>观看时长(秒)</v-list-item-title>
+              <v-row>
+                <v-col>
+                  <vue-number-input v-model="znzf.config.gksj1" center controls></vue-number-input>
+                </v-col>
+                <div style="margin-top: 20px">至</div>
+                <v-col>
+                  <vue-number-input v-model="znzf.config.gksj2" center controls></vue-number-input>
+
+                </v-col>
+              </v-row>
+            </v-list-item>
+
+            <v-list-item class="pa-2">
+              <v-list-item-title>对标账号</v-list-item-title>
+              <TagInput :label="'对标账号'" v-model:value="znzf.config.gjcs"></TagInput>
+            </v-list-item>
+
+            <v-slider prepend-icon="mdi-hand-heart" step="10" style="margin-top: 5px"
+                      show-ticks density="compact" label="点赞概率"
+                      v-model="znzf.config.dz"
+                      color="primary" thumb-label="always"
+            ></v-slider>
+            <v-slider prepend-icon="mdi-charity" step="10" style="margin-top: 5px"
+                      show-ticks density="compact" label="关注概率"
+                      color="primary" thumb-label="always"
+                      v-model="znzf.config.gz"
+            ></v-slider>
+            <v-slider prepend-icon="mdi-comment" step="10" style="margin-top: 5px"
+                      show-ticks density="compact" label="评论概率"
+                      color="primary" thumb-label="always"
+                      v-model="znzf.config.pl"
+            ></v-slider>
+            <ItemSelect ref="hsItem"></ItemSelect>
+            <v-switch class="pa-4"
+                      v-model="znzf.config.pltp"
+                      color="primary"
+                      label="评论图片"
+                      hide-details
+            ></v-switch>
+          </v-list>
+
+        </v-card>
+
+      </v-card-text>
+
+      <v-divider></v-divider>
+
+      <v-card-actions>
+        <v-btn size="large" @click="reset" flat variant="text" tile prepend-icon="mdi-refresh"
+               text="重置"
+        ></v-btn>
+
+        <v-spacer></v-spacer>
+
+        <v-btn tile
+               color="primary" size="large" style="min-width: 10em"
+               text="启动" prepend-icon="mdi-launch"
+               variant="flat"
+               @click="startExec"
+        ></v-btn>
+      </v-card-actions>
+    </v-card>
+  </v-dialog>
+</template>
+
+<style scoped lang="css">
+:deep(.vue-number-input__input[data-v-188efc8c]) {
+  border-radius: 0;
+}
+
+</style>

+ 9 - 0
dtok-mobile-vuetify/src/core/android.js

@@ -0,0 +1,9 @@
+const android = {}
+
+window.android = android
+
+if (window.Vue) {
+  window.Vue.use(android)
+}
+
+export {android}

+ 3 - 0
dtok-mobile-vuetify/src/core/event-bus..js

@@ -0,0 +1,3 @@
+import mitt from 'mitt'
+
+export default mitt()

+ 270 - 0
dtok-mobile-vuetify/src/data/ExecData.js

@@ -0,0 +1,270 @@
+export default {
+  znzf: {
+    yxgs: 1000,
+    czjg1: 3,
+    czjg2: 5,
+    gksj1: 5,
+    gksj2: 12,
+    gjcs: [
+      52042612234,
+      42780888122
+    ],
+    dz: 90,
+    gz: 20,
+    pl: 20,
+    plhs: ["过来支持你啦,希望能获得你的回访", "相遇是缘分,也看看我的作品吧", "支持你的作品,互相帮助", "诚信互助,一起进步", "互帮互助,希望你也能看我主页", "抖音那么大,也来我主页转转", "默默关注,评论支持", "互相帮忙,一起加油", "来支持你啦,也来支持我一下吧", "有缘看到你的作品,支持一下", "看到就是一种缘分,评论支持你", "给你点赞评论支持,希望也能回看一下我的", "互相帮助,希望得到你的回应", "关注你作品,向你学习", "真诚互助,一起加油吧", "双向奔赴的缘分来喽,支持你", "互相帮忙,有赞回赞,有评回评", "真诚交朋友,互相帮忙点赞评论"],
+    pltp: false,
+  },
+  fszh: {
+    yxgs: 500,
+    czjg1: 3,
+    czjg2: 6,
+    gksj1: 5,
+    gksj2: 10,
+    fssl1: 0,
+    fssl2: 1e4,
+    tglv: !0,
+    dz: 45,
+    gz: 5,
+    pl: 35,
+    txdz: 50,
+    plhs: [],
+    pltp: !0
+  },
+  hyzh: {
+    yxgs: 30,
+    czjg1: 1,
+    czjg2: 3,
+    gksj1: 5,
+    gksj2: 10,
+    tggz: !1,
+    fssl1: 0,
+    fssl2: 1e5,
+    dz: 75,
+    pl: 30,
+    gz: 5,
+    yhlx: 0,
+    plhs: [],
+    gjcs: ["合肥装修", "上海装修"],
+    pltp: !0
+  },
+  cjzf: {
+    czjg2: 6,
+    gksj1: 3,
+    yxgs: 1500
+  },
+  tcyl: {
+    pldz: 50,
+    jlfw: 10,
+    tgsy: true,
+    tggz: true,
+    yxsc: 180,
+    gksj1: 5,
+    gksj2: 12,
+    yhxb: 0,
+    dz: 90,
+    gz: 20,
+    pl: 20,
+    plhs: ["过来支持你啦,希望能获得你的回访", "相遇是缘分,也看看我的作品吧", "支持你的作品,互相帮助", "诚信互助,一起进步", "互帮互助,希望你也能看我主页", "抖音那么大,也来我主页转转", "默默关注,评论支持", "互相帮忙,一起加油", "来支持你啦,也来支持我一下吧", "有缘看到你的作品,支持一下", "看到就是一种缘分,评论支持你", "给你点赞评论支持,希望也能回看一下我的", "互相帮助,希望得到你的回应", "关注你作品,向你学习", "真诚互助,一起加油吧", "双向奔赴的缘分来喽,支持你", "互相帮忙,有赞回赞,有评回评", "真诚交朋友,互相帮忙点赞评论"],
+    pltp: false,
+  },
+  pljl: {
+    yxcs: 30,
+    gksj1: 5,
+    gksj2: 10,
+    tggz: !0,
+    tgsy: !1,
+    zdjcts: 50,
+    ppgjc: !0,
+    gjc: ["多少", "价格"],
+    ppdq: !0,
+    dqgjc: ["安徽", "浙江"],
+    fssl1: 0,
+    fssl2: 1e4,
+    tglv: !1,
+    dz: 5,
+    gz: 6,
+    pl: 35,
+    plhs: [],
+    pltp: !0
+  },
+  plqhf: {
+    yxcs: 100,
+    czjg1: 5,
+    czjg2: 10,
+    tggz: !0,
+    tgsy: !1,
+    zdjcts: 10,
+    pldz: !0,
+    hfpl: !1,
+    ppgjc: !0,
+    gjc: ["多少", "价格"],
+    ppdq: !1,
+    dqgjc: ["安徽", "浙江"],
+    plhs: []
+  },
+  fssx: {
+    sxcs: 10,
+    fssl1: 0,
+    fssl2: 1e4,
+    tlsj1: 3,
+    tlsj2: 10,
+    szpdz: !0,
+    zpsdy: 1,
+    gz: !0,
+    yhlx: 0,
+    sxhs: []
+  },
+  zbkc: {
+    yxsc: 5,
+    jgsj: 1,
+    zdhy: !0,
+    lwgx: !0,
+    gzgx: !0,
+    dzgx: !0,
+    zdhh: !0,
+    hhjg: 15,
+    hhhs: ["[赞][赞][赞][赞][赞]"]
+  },
+  zbtk: {
+    yxsc: 10,
+    gzbd: !0,
+    bdlc: 1,
+    dm: !0,
+    dmjg: 3,
+    dmcs: 5,
+    dmhs: ["🌹👏🎉", "👍👍👍👍👍"]
+  },
+  zbyh: {
+    zbcc: 5,
+    gksc: 2,
+    hd: 25,
+    hdhs: ["👍👍👍👍👍", "👏👏👏👏👏"]
+  },
+  zbdz: {
+    result: [],
+    showItems: false,
+    znzf: {
+      yxsc: 30,
+      dzsc: 2,
+      xxsj: 30
+    },
+    accounts: "",
+    showAddAccounts: false,
+    commonItems: [],
+    actionItems: [],
+    selectItemName: []
+  },
+  spsx: {
+    yxgs: 30,
+    gksj1: 6,
+    gksj2: 10,
+    tggz: !0,
+    tgsy: !0,
+    dz: 25,
+    gz: 10,
+    pl: 70,
+    pldz: 70,
+    plhs: [],
+    pltp: !0
+  },
+  znyh: {
+    yxgs: 50,
+    czjg1: 3,
+    czjg2: 5,
+    gksj1: 3,
+    gksj2: 6,
+    tggz: !0,
+    tgsy: !0,
+    dz: 20,
+    gz: 0,
+    pl: 6,
+    zyyl: 6,
+    plhs: []
+  },
+  czyh: {
+    yxgs: 30,
+    gksj1: 6,
+    gksj2: 12,
+    tggz: !0,
+    tgsy: !0,
+    dz: 80,
+    gz: 10,
+    pl: 50,
+    zyyl: 60,
+    gjc: ['多少', '价格', '钱', '电话'],
+    plhs: [],
+    pltp: !0
+  },
+  wnyl: {
+    yxsc: 30,
+    czjg1: 3,
+    czjg2: 6,
+    gksj1: 5,
+    gksj2: 10,
+    tggz: !1,
+    tgsy: !0,
+    dz: 0,
+    gz: 0,
+    pl: 80,
+    pldz: 80,
+    plhs: [],
+    pltp: !1
+  },
+  yjqg: {
+    czjg: 1,
+    qxgz: !1,
+    qxhg: !0
+  },
+  yjqz: {
+    yxsc: 10,
+    czjg1: 1,
+    czjg2: 3,
+    gksj1: 1,
+    gksj2: 3
+  },
+  fshf: {
+    yxgs: 30,
+    czjg1: 3,
+    czjg2: 6,
+    gksj1: 5,
+    gksj2: 10,
+    fssl1: 0,
+    fssl2: 1e4,
+    tglv: !0,
+    dz: 75,
+    gz: 50,
+    pl: 25,
+    plhs: [],
+    pltp: !0
+  },
+  dzhf: {
+    czjg1: 3,
+    czjg2: 6,
+    fssl1: 0,
+    fssl2: 1e4,
+    tglv: !0,
+    tggz: !1,
+    gkzp: !1,
+    zpdz: !0,
+    zppl: !1,
+    plhs: []
+  },
+  zdhp: {
+    hpts: 3,
+    hphs: []
+  },
+  tlxzh: {
+    yxgs: 30,
+    gksj1: 5,
+    gksj2: 10,
+    fssl1: 0,
+    fssl2: 1e4,
+    tglv: !0,
+    dz: 75,
+    gz: 50,
+    pl: 25,
+    plhs: [],
+    pltp: !0
+  }
+}

+ 29 - 0
dtok-mobile-vuetify/src/router/index.js

@@ -0,0 +1,29 @@
+import {createRouter, createWebHashHistory} from "vue-router"
+
+const routes = [
+
+  {
+    path: '/',
+    name: 'helloWorld',
+    component: () => import('@/components/MainLayout.vue'),
+    redirect: "/index",
+    children: [
+      {
+        path: '/index',
+        name: 'index',
+        component: () => import("@/components/HelloWorld.vue")
+      }
+    ]
+  }
+
+]
+
+export const router = createRouter({
+
+  history: createWebHashHistory(),
+
+  routes: routes
+
+})
+
+export default router

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 859 - 531
script/znzf.js


+ 19 - 17
script_env/test.js

@@ -7,27 +7,29 @@ ui.layout(
 
   
 ui.start_test.click(function(){
-    toast("打开wps,表情编辑话术");
-    threads.start(function () {
-        // resetConsole();
-        var url = "https://cybersicko.net/niuke/get_script"
-        var module = "znzf";
-        var res = http.post(url, {
-            "module": module
-        });
-        var weather = res.body.json();
+    // toast("打开wps,表情编辑话术");
+    // threads.start(function () {
+    //     // resetConsole();
+    //     var url = "https://cybersicko.net/niuke/get_script"
+    //     var module = "znzf";
+    //     var res = http.post(url, {
+    //         "module": module
+    //     });
+    //     var weather = res.body.json();
 
-        let conf = {"yxgs":1000,"czjg1":3,"czjg2":5,"gksj1":5,"gksj2":12,"dz":90,"gz":20,"pl":20,"plhs":["过来支持你啦,希望能获得你的回访","相遇是缘分,也看看我的作品吧","支持你的作品,互相帮助","诚信互助,一起进步","互帮互助,希望你也能看我主页","抖音那么大,也来我主页转转","默默关注,评论支持","互相帮忙,一起加油","来支持你啦,也来支持我一下吧","有缘看到你的作品,支持一下","看到就是一种缘分,评论支持你","给你点赞评论支持,希望也能回看一下我的","互相帮助,希望得到你的回应","关注你作品,向你学习","真诚互助,一起加油吧","双向奔赴的缘分来喽,支持你","互相帮忙,有赞回赞,有评回评","真诚交朋友,互相帮忙点赞评论"],"gjcs":["52042612234","42780888122","40605707934","34477336631","33119784740","42591640755","81239058442"],"pltp":false,"screenWidth":480,"screenHeight":801};
+    //     let conf = {"yxgs":1000,"czjg1":3,"czjg2":5,"gksj1":5,"gksj2":12,"dz":90,"gz":20,"pl":20,"plhs":["过来支持你啦,希望能获得你的回访","相遇是缘分,也看看我的作品吧","支持你的作品,互相帮助","诚信互助,一起进步","互帮互助,希望你也能看我主页","抖音那么大,也来我主页转转","默默关注,评论支持","互相帮忙,一起加油","来支持你啦,也来支持我一下吧","有缘看到你的作品,支持一下","看到就是一种缘分,评论支持你","给你点赞评论支持,希望也能回看一下我的","互相帮助,希望得到你的回应","关注你作品,向你学习","真诚互助,一起加油吧","双向奔赴的缘分来喽,支持你","互相帮忙,有赞回赞,有评回评","真诚交朋友,互相帮忙点赞评论"],"gjcs":["52042612234","42780888122","40605707934","34477336631","33119784740","42591640755","81239058442"],"pltp":false,"screenWidth":480,"screenHeight":801};
         
-        // 导入 AutoJS 的相关模块
-        var packageName = "com.ss.android.ugc.aweme"; // 视频App的包名
+    //     // 导入 AutoJS 的相关模块
+    //     var packageName = "com.ss.android.ugc.aweme"; // 视频App的包名
 
-        // 打开视频App
-        launch(packageName);
-        sleep(5000)
-        engines.execScript('znzf', weather.data.script )
+    //     // 打开视频App
+    //     launch(packageName);
+    //     sleep(5000)
 
-     });
+    //  });
+    var znzf = "/storage/emulated/0/脚本/Dtok/znzf1.js"
+
+    engines.execScriptFile(znzf )
 
    
 })

+ 465 - 120
script_env/znzf1.js

@@ -3,7 +3,8 @@
         81: (module, __unused_webpack_exports, __webpack_require__) => {
             __webpack_require__ = {
                 packageName: "com.ss.android.ugc.aweme",
-                versions: [ "26.0.0", "27.0.0", "28.0.0", "28.1.0", "28.2.0", "28.3.0", "28.4.0", "28.5.0", "28.6.0", "28.7.0", "28.8.0", "28.9.0", "29.0.0" ],
+                               versions: [ "26.0.0", "27.0.0", "28.0.0", "28.1.0", "28.2.0", "28.3.0", "28.4.0", "28.5.0", "28.6.0", "28.7.0", "28.8.0", "28.9.0", "29.0.0" ,"29.1.0"],
+
                 nodes: __webpack_require__(761),
                 commonts: [ "又刷到你了", "看看我的作品", "来我主页转转" ],
                 sxhs: [ "很高兴认识你", "常来常往" ],
@@ -95,8 +96,8 @@
                         gznum: {
                             id: "com.ss.android.ugc.aweme:id/yr5"
                         },
-                        fansnum: {
-                         id: "com.ss.android.ugc.aweme:id/yr9"
+                     fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/yr9"
                         },
                         username: {
                             id: "com.ss.android.ugc.aweme:id/ohq"
@@ -117,6 +118,307 @@
                         }
                     }
                 },
+                "27.3.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e3z"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dms"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e3p"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v0f"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y=3"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y=7"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/oth"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y_7"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q1y"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nu1"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z35"
+                        }
+                    }
+                },
+                "27.4.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e3="
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dm2"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e30"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v0u"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y_h"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y_l"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/os-"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y-k"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q19"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nuw"
+                        },
+                     userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z4t"
+                        }
+                    }
+                },
+                "27.5.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e3+"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dnm"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e33"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v1f"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y-e"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y-i"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/osz"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y+h"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q2n"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nuh"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z5o"
+                        }
+                    }
+                },
+                "27.6.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e5o"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dow"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e5e"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v2+"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y+-"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zac"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ouo"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/za+"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q4b"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nv8"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z7s"
+                        }
+                    }
+                },
+                "27.7.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/exn"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/df+"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/exd"
+                        }
+                    },
+                    user: {
+                     homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v83"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zic"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zig"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ov4"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zjf"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q6o"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nsz"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0cc"
+                        }
+                    }
+                },
+                "27.8.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/eyq"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dg_"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/eyg"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v_e"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zku"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zky"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/oyz"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zlu"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q72"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0ew"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nwv"
+                        }
+                    }
+                },
+                "27.9.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ezh"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dhs"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ey="
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/waf"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zn6"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zn="
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/o0p"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zo7"
+                        },
+                        followBtn: {
+                         id: "com.ss.android.ugc.aweme:id/q97"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0h="
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nz9"
+                        }
+                    }
+                },
                 "28.0.0": {
                     video: {
                         like: {
@@ -199,7 +501,7 @@
                             id: "com.ss.android.ugc.aweme:id/0lw"
                         },
                         msglistbox: {
-                         id: "com.ss.android.ugc.aweme:id/n3u"
+                            id: "com.ss.android.ugc.aweme:id/n3u"
                         }
                     }
                 },
@@ -211,7 +513,7 @@
                     },
                     comment: {
                         button: {
-                            id: "com.ss.android.ugc.aweme:id/c1a"
+                         id: "com.ss.android.ugc.aweme:id/c1a"
                         },
                         zan: {
                             id: "com.ss.android.ugc.aweme:id/efi"
@@ -305,7 +607,7 @@
                     },
                     user: {
                         homeMark: {
-                         id: "com.ss.android.ugc.aweme:id/v09"
+                            id: "com.ss.android.ugc.aweme:id/v09"
                         },
                         gznum: {
                             id: "com.ss.android.ugc.aweme:id/zbf"
@@ -314,7 +616,7 @@
                             id: "com.ss.android.ugc.aweme:id/zbj"
                         },
                         username: {
-                            id: "com.ss.android.ugc.aweme:id/old"
+                         id: "com.ss.android.ugc.aweme:id/old"
                         },
                         lanv: {
                             id: "com.ss.android.ugc.aweme:id/zcb"
@@ -407,7 +709,7 @@
                         },
                         followBtn: {
                             id: "com.ss.android.ugc.aweme:id/qz9"
-                     }
+                        }
                     },
                     live: {
                         userlistbox: {
@@ -418,7 +720,7 @@
                         }
                     }
                 },
-                "28.7.0": {
+             "28.7.0": {
                     video: {
                         like: {
                             id: "com.ss.android.ugc.aweme:id/ejz"
@@ -513,7 +815,7 @@
                     comment: {
                         button: {
                             id: "com.ss.android.ugc.aweme:id/c6w"
-                     },
+                        },
                         zan: {
                             id: "com.ss.android.ugc.aweme:id/elr"
                         }
@@ -523,7 +825,7 @@
                             id: "com.ss.android.ugc.aweme:id/wej"
                         },
                         gznum: {
-                            id: "com.ss.android.ugc.aweme:id/zt8"
+                         id: "com.ss.android.ugc.aweme:id/zt8"
                         },
                         fansnum: {
                             id: "com.ss.android.ugc.aweme:id/zt-"
@@ -542,7 +844,7 @@
                         userlistbox: {
                             id: "com.ss.android.ugc.aweme:id/0ol"
                         },
-                        msglistbox: {
+msglistbox: {
                             id: "com.ss.android.ugc.aweme:id/nrb"
                         }
                     }
@@ -589,7 +891,50 @@
                             id: "com.ss.android.ugc.aweme:id/nrq"
                         }
                     }
-                }
+                },
+                  "29.1.0": {
+                                        video: {
+                                            like: {
+                                                id: "com.ss.android.ugc.aweme:id/emy"
+                                            }
+                                        },
+                                        comment: {
+                                            button: {
+                                                id: "com.ss.android.ugc.aweme:id/c7i"
+                                            },
+                                            zan: {
+                                                id: "com.ss.android.ugc.aweme:id/eml"
+                                            }
+                                        },
+                                        user: {
+                                            homeMark: {
+                                                id: "com.ss.android.ugc.aweme:id/poo"
+                                            },
+                                            gznum: {
+                                                id: "com.ss.android.ugc.aweme:id/z1u"
+                                            },
+                                            fansnum: {
+                                                id: "com.ss.android.ugc.aweme:id/z1y"
+                                            },
+                                            username: {
+                                                id: "com.ss.android.ugc.aweme:id/o07"
+                                            },
+                                            lanv: {
+                                                id: "com.ss.android.ugc.aweme:id/z2q"
+                                            },
+                                            followBtn: {
+                                                id: "com.ss.android.ugc.aweme:id/q-z"
+                                            }
+                                        },
+                                        live: {
+                                            userlistbox: {
+                                                id: "com.ss.android.ugc.aweme:id/0wc"
+                                            },
+                                            msglistbox: {
+                                                id: "com.ss.android.ugc.aweme:id/nv_"
+                                            }
+                                        }
+                                    }
             };
             module.exports = nodes;
         },
@@ -599,15 +944,15 @@
                 nodes: {},
                 init() {
                     var info = utility.packageInfo(conf.packageName);
-                    return utility.isEmpty(info) ? (alert("请安装支持的抖音版本!"), !1) : conf.versions.includes(info.versionName) ? (this.version = info.versionName, 
-                    this.nodes = conf.nodes[info.versionName] || {}, !0) : (alert("不支持 抖音(" + info.versionName + ")请安装支持的抖音版本!"), 
+                    return utility.isEmpty(info) ? (alert("请安装支持的抖音版本!"), !1) : conf.versions.includes(info.versionName) ? (this.version = info.versionName,
+                    this.nodes = conf.nodes[info.versionName] || {}, !0) : (alert("不支持 抖音(" + info.versionName + ")请安装支持的抖音版本!"),
                     !1);
                 },
                 execClose() {
                     for (utility.inputHide(); ;) {
                         var closeBtn = desc("关闭").visibleToUser().findOnce();
                         if (!closeBtn) break;
-                     closeBtn.click(), sleep(1e3);
+                        closeBtn.click(), sleep(1e3);
                     }
                 },
                 execCancel() {
@@ -626,31 +971,31 @@
                 },
                 execLike() {
                     var wdz = className("android.widget.LinearLayout").descStartsWith("未点赞").descEndsWith("按钮").visibleToUser().findOnce();
-                    return !!wdz && (utility.toast("执行点赞"), wdz.click(), sleep(1e3), 
+                    return !!wdz && (utility.toast("执行点赞"), wdz.click(), sleep(1e3),
                     !0);
                 },
                 execTxdz() {
                     var txdz;
-                    desc("用户头像").visibleToUser().findOnce().click() && (sleep(500), 
-                    txdz = className("android.widget.RelativeLayout").visibleToUser().findOnce(), 
-                    sleep(500), txdz.click(), engine.sleepMs(1e3, 2e3), back(), 
+                    desc("用户头像").visibleToUser().findOnce().click() && (sleep(500),
+                    txdz = className("android.widget.RelativeLayout").visibleToUser().findOnce(),
+                    sleep(500), txdz.click(), engine.sleepMs(1e3, 2e3), back(),
                     sleep(1e3));
                 },
                 popupAndClose() {
                     threads.start(function() {
                         for (;;) {
                             var a;
-                            sleep(200), text("授权提示").exists() && text("同意授权").click(), 
-                            sleep(200), text("休息一下吧").exists() && text("取消").click(), 
-                            sleep(200), (text("很晚了,睡个好觉").exists() || text("早点睡觉吧").exists()) && text("取消").click(), 
-                            sleep(200), text("朋友推荐").exists() && (a = desc("关闭").findOnce()) && a.click(), 
-                            sleep(200), text("发现通讯录好友").exists() && text("取消").click(), 
-                            sleep(200), text("个人信息保护指引").exists() && text("好的").click(), 
-                            sleep(200), text("去商店评分").exists() && text("取消").click(), 
-                            sleep(200), text("开启青少年模式").exists() && text("我知道了").click(), 
-                            sleep(200), text("检测到更新").exists() && text("以后再说").click(), 
-                            sleep(200), text("跳过广告").exists() && text("跳过广告").click(), 
-                            sleep(200), text("下次").exists() && text("下次").click(), 
+                            sleep(200), text("授权提示").exists() && text("同意授权").click(),
+                            sleep(200), text("休息一下吧").exists() && text("取消").click(),
+                            sleep(200), (text("很晚了,睡个好觉").exists() || text("早点睡觉吧").exists()) && text("取消").click(),
+                            sleep(200), text("朋友推荐").exists() && (a = desc("关闭").findOnce()) && a.click(),
+                         sleep(200), text("发现通讯录好友").exists() && text("取消").click(),
+                            sleep(200), text("个人信息保护指引").exists() && text("好的").click(),
+                            sleep(200), text("去商店评分").exists() && text("取消").click(),
+                            sleep(200), text("开启青少年模式").exists() && text("我知道了").click(),
+                            sleep(200), text("检测到更新").exists() && text("以后再说").click(),
+                            sleep(200), text("跳过广告").exists() && text("跳过广告").click(),
+                            sleep(200), text("下次").exists() && text("下次").click(),
                             sleep(1e3);
                         }
                     });
@@ -673,10 +1018,10 @@
                     return null !== node && null !== id(node.id).visibleToUser().findOnce() || null !== className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOnce();
                 },
                 IsVideoDelay(ms) {
-                 return null !== className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOne(ms);
+                    return null !== className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOne(ms);
                 },
                 skipVideo() {
-                    return !this.IsVideo() && (utility.toast("跳过非视频或图集作品!"), sleep(500), 
+                    return !this.IsVideo() && (utility.toast("跳过非视频或图集作品!"), sleep(500),
                     engine.slide(), !0);
                 },
                 IsFollow() {
@@ -687,21 +1032,21 @@
                     return !!con && (utility.toast("执行关注"), con.click(), !0);
                 },
                 sikpFollow() {
-                    return !this.IsFollow() && (utility.toast("跳过已关注用户"), sleep(500), 
+                    return !this.IsFollow() && (utility.toast("跳过已关注用户"), sleep(500),
                     engine.slide(), !0);
                 },
                 IsLike() {
                     return null !== className("android.widget.LinearLayout").descStartsWith("已点赞").descEndsWith("按钮").visibleToUser().findOnce();
                 },
                 sikpLike() {
-                    return !!this.IsLike() && (utility.toast("跳过已点赞视频"), sleep(500), 
+                    return !!this.IsLike() && (utility.toast("跳过已点赞视频"), sleep(500),
                     engine.slide(), !0);
                 },
                 getLikeNum() {
                     let num = 0;
                     try {
                         var desc = className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOnce().desc();
-                        num = parseFloat(desc.match(/[0-9]+(\.[0-9]{0,2})?/g)[0]), 
+                        num = parseFloat(desc.match(/[0-9]+(\.[0-9]{0,2})?/g)[0]),
                         (0 <= desc.indexOf("w") || 0 <= desc.indexOf("万")) && (num *= 1e4);
                     } catch (e) {
                         num = 0;
@@ -711,8 +1056,8 @@
                 IsAd() {
                     return null !== textContains("广告").visibleToUser().findOnce();
                 },
-                sikpAp() {
-                    return !!this.IsAd() && (utility.toast("跳过忽略广告"), sleep(500), 
+             sikpAp() {
+                    return !!this.IsAd() && (utility.toast("跳过忽略广告"), sleep(500),
                     engine.slide(), !0);
                 },
                 IsCommerce() {
@@ -723,13 +1068,13 @@
                     return !1;
                 },
                 sikpCommerce() {
-                    return !!this.IsCommerce() && (utility.toast("跳过商业视频!"), sleep(500), 
+                    return !!this.IsCommerce() && (utility.toast("跳过商业视频!"), sleep(500),
                     engine.slide(), !0);
                 },
                 watchVideo(startTime, watchTime) {
                     startTime = engine.getUnix() - startTime;
-                    0 < (watchTime -= startTime = 60 < startTime ? 60 : startTime) ? (engine.sleep(watchTime), 
-                    utility.toast("继续观看视频" + watchTime + "秒")) : utility.toast("已观看视频" + startTime + "秒"), 
+                    0 < (watchTime -= startTime = 60 < startTime ? 60 : startTime) ? (engine.sleep(watchTime),
+                    utility.toast("继续观看视频" + watchTime + "秒")) : utility.toast("已观看视频" + startTime + "秒"),
                     sleep(500);
                 },
                 canComment() {
@@ -746,36 +1091,36 @@
                     try {
                         isComment = !(!isComment && isComment !== undefined);
                         var plBtn = className("android.widget.LinearLayout").descStartsWith("评论").descEndsWith("按钮").visibleToUser().findOnce();
-                     if (plBtn && plBtn.click()) {
+                        if (plBtn && plBtn.click()) {
                             let editText = className("android.widget.EditText").visibleToUser().findOne(3e3);
-                            if (null === editText && (sleep(1e3), editText = className("android.widget.EditText").visibleToUser().findOne(2e3)), 
+                            if (null === editText && (sleep(1e3), editText = className("android.widget.EditText").visibleToUser().findOne(2e3)),
                             null === editText) utility.toast("没有识别到评论框"), sleep(500); else {
-                                isLike && (utility.toast("执行评论点赞"), sleep(1e3), 
+                                isLike && (utility.toast("执行评论点赞"), sleep(1e3),
                                 (commentZanBtns = descStartsWith("赞").descEndsWith("未选中").visibleToUser().find()).forEach(el => {
-                                    (el.clickable() ? el : el.parent()).click(), 
+                                    (el.clickable() ? el : el.parent()).click(),
                                     engine.sleepMs(500, 1e3);
                                 }));
                                 var hsLen = hs.length;
-                                if (!isComment || hsLen < 1) utility.toast("不执行评论"), 
+                                if (!isComment || hsLen < 1) utility.toast("不执行评论"),
                                 sleep(500); else if (utility.toast("准备发表评论"), editText.click()) {
-                                    if (sleep(1e3), setText(hs[random(0, hsLen - 1)]), 
+                                    if (sleep(1e3), setText(hs[random(0, hsLen - 1)]),
                                     engine.sleepMs(1e3, 3e3), pltp && null !== desc("插入图片").visibleToUser().findOne(3e3)) {
-                                        desc("插入图片").visibleToUser().findOne().click() || utility.toast("没有成功点击到发布图片按钮"), 
+                                        desc("插入图片").visibleToUser().findOne().click() || utility.toast("没有成功点击到发布图片按钮"),
                                         sleep(2e3);
                                         let listBox = id("com.ss.android.ugc.aweme:id/content_container").visibleToUser().findOne(2e3);
                                         if (0 == (listBox = listBox.find(id("com.ss.android.ugc.aweme:id/root_view"))).length) return void alert("没有图片!", "手机相册里请先准备好图片!");
-                                        listBox[random(0, listBox.length - 1)].click() || (utility.toast("图片点击失败!"), 
+                                        listBox[random(0, listBox.length - 1)].click() || (utility.toast("图片点击失败!"),
                                         back()), engine.sleepMs(1e3, 2e3);
-                                    }
+                                 }
                                     let sendBtn = className("android.widget.ImageView").visibleToUser().desc("发送").findOne(5e3);
-                                    if (null === (sendBtn = (sendBtn = sendBtn || className("android.widget.TextView").visibleToUser().text("发送").findOne(5e3)) || text("发送").findOne(5e3))) utility.toast("没有获取到发送按钮"), 
+                                    if (null === (sendBtn = (sendBtn = sendBtn || className("android.widget.TextView").visibleToUser().text("发送").findOne(5e3)) || text("发送").findOne(5e3))) utility.toast("没有获取到发送按钮"),
                                     sleep(1e3); else {
                                         if (sendBtn.clickable()) {
-                                            if (!sendBtn.click()) return utility.toast("没有成功点击发送按钮"), 
+                                            if (!sendBtn.click()) return utility.toast("没有成功点击发送按钮"),
                                             sleep(1e3), void this.execClose();
-                                        } else if (!sendBtn.parent().click()) return utility.toast("没有成功点击parent发送按钮"), 
+                                        } else if (!sendBtn.parent().click()) return utility.toast("没有成功点击parent发送按钮"),
                                         sleep(1e3), void this.execClose();
-                                        utility.toast("评论完成"), null !== text("我也发一张").visibleToUser().findOne(5e3) && this.execBack(), 
+                                        utility.toast("评论完成"), null !== text("我也发一张").visibleToUser().findOne(5e3) && this.execBack(),
                                         engine.sleepMs(2e3, 5e3);
                                     }
                                 } else utility.toast("没有成功点击评论框"), sleep(500);
@@ -791,17 +1136,17 @@
                 },
                 previewHome() {
                     var head = id(this.getNode("index.headimg").id).visibleToUser().findOnce();
-                 null !== head && head.click() && (utility.toast("访问用户首页"), this.isHome() ? (engine.sleep(2, 5), 
-                    1 == random(1, 3) && (engine.slide(), engine.sleep(2, 5))) : console.log("打开用户首页失败"), 
+                    null !== head && head.click() && (utility.toast("访问用户首页"), this.isHome() ? (engine.sleep(2, 5),
+                    1 == random(1, 3) && (engine.slide(), engine.sleep(2, 5))) : console.log("打开用户首页失败"),
                     this.execBackOnce());
                 },
                 previewHomeTc() {
                     let yhxb = 0;
                     var head = id(this.getNode("index.headimg").id).visibleToUser().findOnce();
                     if (null !== head && head.click()) {
-                        if (utility.toast("访问用户首页"), this.isHome()) return engine.sleepMs(2e3, 3e3), 
-                        null !== descStartsWith("男").visibleToUser().findOnce() && (yhxb = 1), 
-                        null !== descStartsWith("女").visibleToUser().findOnce() && (yhxb = 2), 
+                        if (utility.toast("访问用户首页"), this.isHome()) return engine.sleepMs(2e3, 3e3),
+                        null !== descStartsWith("男").visibleToUser().findOnce() && (yhxb = 1),
+                        null !== descStartsWith("女").visibleToUser().findOnce() && (yhxb = 2),
                         this.execBackOnce(), yhxb;
                         console.log("打开用户首页失败"), this.execBackOnce();
                     }
@@ -821,7 +1166,7 @@
             module.exports = douyin;
         },
         557: (module, __unused_webpack_exports, __webpack_require__) => {
-            "undefined" == typeof __webpack_require__.g.ENV_CONF && (__webpack_require__.g.ENV_CONF = {}), 
+            "undefined" == typeof __webpack_require__.g.ENV_CONF && (__webpack_require__.g.ENV_CONF = {}),
             module.exports = {
                 deviceWidth: ENV_CONF.screenWidth || device.width,
                 deviceHeight: ENV_CONF.screenHeight || device.height,
@@ -829,7 +1174,7 @@
                     engines.stopAll(), exit();
                 },
                 swipeEx(qx, qy, zx, zy, time) {
-                    for (var xxy = [ time ], point = [], dx0 = {
+                 for (var xxy = [ time ], point = [], dx0 = {
                         x: qx,
                         y: qy
                     }, dx1 = {
@@ -842,18 +1187,18 @@
                         x: zx,
                         y: zy
                     }, i = 0; i < 4; i++) eval("point.push(dx" + i + ")");
-                    for (let i = 0; i < 1; i += .08) xxyy = [ parseInt(this.bezier_curves(point, i).x), parseInt(this.bezier_curves(point, i).y) ], 
+                    for (let i = 0; i < 1; i += .08) xxyy = [ parseInt(this.bezier_curves(point, i).x), parseInt(this.bezier_curves(point, i).y) ],
                     xxy.push(xxyy);
                     gesture.apply(null, xxy);
                 },
                 bezier_curves(cp, t) {
-                    return cx = 3 * (cp[1].x - cp[0].x), bx = 3 * (cp[2].x - cp[1].x) - cx, 
-                    ax = cp[3].x - cp[0].x - cx - bx, cy = 3 * (cp[1].y - cp[0].y), 
-                    by = 3 * (cp[2].y - cp[1].y) - cy, ay = cp[3].y - cp[0].y - cy - by, 
+                    return cx = 3 * (cp[1].x - cp[0].x), bx = 3 * (cp[2].x - cp[1].x) - cx,
+                    ax = cp[3].x - cp[0].x - cx - bx, cy = 3 * (cp[1].y - cp[0].y),
+                    by = 3 * (cp[2].y - cp[1].y) - cy, ay = cp[3].y - cp[0].y - cy - by,
                     tSquared = t * t, tCubed = tSquared * t, (result = {
                         x: 0,
                         y: 0
-                    }).x = ax * tCubed + bx * tSquared + cx * t + cp[0].x, result.y = ay * tCubed + by * tSquared + cy * t + cp[0].y, 
+                    }).x = ax * tCubed + bx * tSquared + cx * t + cp[0].x, result.y = ay * tCubed + by * tSquared + cy * t + cp[0].y,
                     result;
                 },
                 shortSlide() {
@@ -863,7 +1208,7 @@
                     this.swipeEx(.5 * this.deviceWidth, .8 * this.deviceHeight, .5 * this.deviceWidth, .5 * this.deviceHeight, 300);
                 },
                 deSlide() {
-                 this.swipeEx(.5 * this.deviceWidth, .3 * this.deviceHeight, .5 * this.deviceWidth, this.deviceHeight, 300);
+                    this.swipeEx(.5 * this.deviceWidth, .3 * this.deviceHeight, .5 * this.deviceWidth, this.deviceHeight, 300);
                 },
                 bshortSlide() {
                     this.swipeEx(.5 * this.deviceWidth, .8 * this.deviceHeight, .5 * this.deviceWidth, .8 * this.deviceHeight - 500, 300);
@@ -879,7 +1224,7 @@
                 },
                 boundsClick(bounds) {
                     var x = .2 * bounds.width(), y = .2 * bounds.height();
-                    bounds.left += x, bounds.right -= x, bounds.top += y, bounds.bottom -= y, 
+                    bounds.left += x, bounds.right -= x, bounds.top += y, bounds.bottom -= y,
                     click(random(bounds.left, bounds.right), random(bounds.top, bounds.bottom));
                 },
                 sleepMs() {
@@ -905,21 +1250,21 @@
                 }
             };
         },
-        871: (module, __unused_webpack_exports, __webpack_require__) => {
+     871: (module, __unused_webpack_exports, __webpack_require__) => {
             __webpack_require__.g.floatyToastWindow === undefined && (__webpack_require__.g.floatyToastWindow = floaty.rawWindow(`
  <frame gravity="center" w="*">
-     <text 
-         id="text" text="" 
+     <text
+         id="text" text=""
          w="wrap_content" h="wrap_content"
-         visibility="invisible"  
-         bg="#1989fa" textColor="#ffffff" 
+         visibility="invisible"
+         bg="#1989fa" textColor="#ffffff"
          paddingLeft="10" paddingRight="10" paddingTop="5" paddingBottom="5"
          />
  </frame>
-`), floatyToastWindow.setTouchable(!1), floatyToastWindow.setSize(-1, -2), floatyToastWindow.setPosition(0, .75 * (ENV_CONF.screenHeight || device.height))), 
+`), floatyToastWindow.setTouchable(!1), floatyToastWindow.setSize(-1, -2), floatyToastWindow.setPosition(0, .75 * (ENV_CONF.screenHeight || device.height))),
             module.exports = {
                 currentRunPackage(packageName) {
-                    return currentPackage() == conf.packageName || (app.launch(conf.packageName), 
+                    return currentPackage() == conf.packageName || (app.launch(conf.packageName),
                     !1);
                 },
                 packageInfo(packageName) {
@@ -931,8 +1276,8 @@
                 },
                 checkVersion(packageName, versions) {
                     var info = this.packageInfo(packageName);
-                    return this.isEmpty(info) ? (alert("请安装抖音!"), !1) : (packageName = app.getAppName(packageName), 
-                    !!versions.includes(info.versionName) || (alert("不支持 " + packageName + "(" + info.versionName + "),请安装支持版本!"), 
+                    return this.isEmpty(info) ? (alert("请安装抖音!"), !1) : (packageName = app.getAppName(packageName),
+                    !!versions.includes(info.versionName) || (alert("不支持 " + packageName + "(" + info.versionName + "),请安装支持版本!"),
                     !1));
                 },
                 isEmpty(value) {
@@ -941,7 +1286,7 @@
                         return !0;
 
                       case "string":
-                     if (0 == value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length) return !0;
+                        if (0 == value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length) return !0;
                         break;
 
                       case "boolean":
@@ -960,7 +1305,7 @@
                 },
                 checkProbability(value, hdfs) {
                     var temp = random(1, 99);
-                    return console.log(hdfs + "计算概率:" + temp + (temp < value ? "未超出" : "超出") + value), 
+                    return console.log(hdfs + "计算概率:" + temp + (temp < value ? "未超出" : "超出") + value),
                     temp < value;
                 },
                 strFindKeys(s, keys) {
@@ -971,7 +1316,7 @@
                     if (e.fileName) {
                         packageName = this.packageInfo(packageName);
                         let versionName = "未知版本";
-                        packageName = "版本号:" + (versionName = packageName && packageName.versionName ? packageName.versionName : versionName) + "\r\n", 
+                        packageName = "版本号:" + (versionName = packageName && packageName.versionName ? packageName.versionName : versionName) + "\r\n",
                         packageName = (packageName = (packageName += "错误:" + e.toString() + "\r\n") + ("模块:" + e.fileName.replace(".js", "") + "\r\n")) + ("错误码:" + e.lineNumber + "\r\n") + "====================================\r\n";
                         files.write("/sdcard/error_bzy.log", packageName);
                     } else console.log("运行错误:", e.toString());
@@ -985,7 +1330,7 @@
                 },
                 toast(msg) {
                     ui.run(function() {
-                        console.log(msg), floatyToastWindow.text.setText(msg), floatyToastWindow.text.attr("visibility", "visible");
+                     console.log(msg), floatyToastWindow.text.setText(msg), floatyToastWindow.text.attr("visibility", "visible");
                     });
                 },
                 toastHide() {
@@ -1021,7 +1366,7 @@
         var cachedModule = __webpack_module_cache__[moduleId];
         return cachedModule !== undefined || (cachedModule = __webpack_module_cache__[moduleId] = {
             exports: {}
-     }, __webpack_modules__[moduleId](cachedModule, cachedModule.exports, __webpack_require__)), 
+        }, __webpack_modules__[moduleId](cachedModule, cachedModule.exports, __webpack_require__)),
         cachedModule.exports;
     }
     (() => {
@@ -1054,9 +1399,9 @@
         }, znzf = {
             banben: parseFloat(context.getPackageManager().getPackageInfo("com.ss.android.ugc.aweme", 0).versionName) < 27.4,
             init() {
-                return !(!douyin.init() || ("undefined" != typeof ENV_CONF && Object.assign(param, ENV_CONF), 
-                0 < param.pl && param.plhs.length < 1 ? (alert("请设置评论话术"), 1) : douyin.isRecommend() ? (utility.toast("开始任务:智能涨粉"), 
-                engine.sleep(1), device.keepScreenDim(), douyin.popupAndClose(), 
+                return !(!douyin.init() || ("undefined" != typeof ENV_CONF && Object.assign(param, ENV_CONF),
+                0 < param.pl && param.plhs.length < 1 ? (alert("请设置评论话术"), 1) : douyin.isRecommend() ? (utility.toast("开始任务:智能涨粉"),
+                engine.sleep(1), device.keepScreenDim(), douyin.popupAndClose(),
                 0) : (alert("请在抖音首页运行"), 1)));
             },
             isUserList() {
@@ -1070,58 +1415,58 @@
                 }
             },
             execUser() {
-                if (engine.sleep(param.czjg1, param.czjg2), !douyin.isHome()) return utility.toast("进入主页失败"), 
-                !1;
-                if (null !== text("私密账号").visibleToUser().findOnce() || null !== text("帐号已被封禁").visibleToUser().findOnce()) return utility.toast("私密或已封禁账号,跳过"), 
+                if (engine.sleep(param.czjg1, param.czjg2), !douyin.isHome()) return utility.toast("进入主页失败"),
+             !1;
+                if (null !== text("私密账号").visibleToUser().findOnce() || null !== text("帐号已被封禁").visibleToUser().findOnce()) return utility.toast("私密或已封禁账号,跳过"),
                 !1;
-                if (param.tglv && null !== className("android.widget.TextView").visibleToUser().id(douyin.getNode("user.lanv").id).findOnce()) return utility.toast("蓝v用户,跳过!"), 
+                if (param.tglv && null !== className("android.widget.TextView").visibleToUser().id(douyin.getNode("user.lanv").id).findOnce()) return utility.toast("蓝v用户,跳过!"),
                 !1;
                 let fansNum = 0;
                 var fansNode = id(douyin.getNode("user.fansnum").id).visibleToUser().findOnce();
-                fansNode && (fansText = fansNode.text(), fansNum = parseFloat(fansText), 
+                fansNode && (fansText = fansNode.text(), fansNum = parseFloat(fansText),
                 0 <= fansText.indexOf("w") || 0 <= fansText.indexOf("万")) && (fansNum *= 1e4);
                 let gzNum = 0;
                 fansNode = id(douyin.getNode("user.gznum").id).visibleToUser().findOnce();
-                if (fansNode && (gzText = fansNode.text(), gzNum = parseFloat(gzText), 
-                0 <= gzText.indexOf("w") || 0 <= gzText.indexOf("万")) && (gzNum *= 1e4), 
+                if (fansNode && (gzText = fansNode.text(), gzNum = parseFloat(gzText),
+                0 <= gzText.indexOf("w") || 0 <= gzText.indexOf("万")) && (gzNum *= 1e4),
                 gzNum - fansNum < 1e3) return !1;
                 fansNode = textContains("作品").visibleToUser().findOnce();
                 let videoNum = 0;
-                if ((videoNum = fansNode ? parseInt(fansNode.text().replace(/[^0-9]/gi, "")) : videoNum) < 1 || isNaN(videoNum)) return utility.toast("该用户没有作品或非正常用户,跳过"), 
+                if ((videoNum = fansNode ? parseInt(fansNode.text().replace(/[^0-9]/gi, "")) : videoNum) < 1 || isNaN(videoNum)) return utility.toast("该用户没有作品或非正常用户,跳过"),
                 !1;
-                this.banben && utility.checkProbability(param.txdz, "头像点赞") && (douyin.execTxdz(), 
-                engine.sleepMs(1e3, 2e3)), utility.checkProbability(param.gz, "关注") && ((followBtn = id(douyin.getNode("user.followBtn").id).visibleToUser().findOnce()) ? (utility.toast("执行关注!"), 
-             followBtn.click(), engine.sleepMs(500, 1e3), gzCount++, (followBtn = desc("更多,已展开").visibleToUser().findOne(5e3)) && (followBtn.click(), 
+                this.banben && utility.checkProbability(param.txdz, "头像点赞") && (douyin.execTxdz(),
+                engine.sleepMs(1e3, 2e3)), utility.checkProbability(param.gz, "关注") && ((followBtn = id(douyin.getNode("user.followBtn").id).visibleToUser().findOnce()) ? (utility.toast("执行关注!"),
+                followBtn.click(), engine.sleepMs(500, 1e3), gzCount++, (followBtn = desc("更多,已展开").visibleToUser().findOne(5e3)) && (followBtn.click(),
                 engine.sleepMs(500, 1e3))) : utility.toast("不关注!"));
                 var followBtn = utility.checkProbability(param.dz, "点赞"), isPl = utility.checkProbability(param.pl, "评论");
                 if (followBtn || isPl) {
-                    fansNode.selected() || (engine.boundsClick(fansNode.bounds()), 
+                    fansNode.selected() || (engine.boundsClick(fansNode.bounds()),
                     engine.sleepMs(1e3, 2e3)), engine.shortSlide();
                     var fansNode = id("com.ss.android.ugc.aweme:id/container").visibleToUser().find();
                     if (!fansNode.empty()) {
                         let video = fansNode[random(0, fansNode.length - 1)];
-                        video = video.findOne(className("android.view.View")), sleep(1e3), 
-                        video && video.clickable() && video.click() && douyin.IsVideoDelay(5e3) ? (fansNode = random(param.gksj1, param.gksj2), 
-                        utility.toast("观看视频:" + fansNode + " 秒"), engine.sleep(fansNode), 
-                        followBtn ? (douyin.execLike(), dzCount++) : utility.toast("不点赞"), 
-                        isPl && douyin.canComment() ? (fansNode = utility.checkProbability(param.pldz, "评论点赞"), 
-                        douyin.sendComment(param.plhs, isPl, fansNode, param.pltp), 
-                        plCount++) : utility.toast("不评论")) : (utility.toast("打开视频失败!"), 
+                        video = video.findOne(className("android.view.View")), sleep(1e3),
+                        video && video.clickable() && video.click() && douyin.IsVideoDelay(5e3) ? (fansNode = random(param.gksj1, param.gksj2),
+                        utility.toast("观看视频:" + fansNode + " 秒"), engine.sleep(fansNode),
+                        followBtn ? (douyin.execLike(), dzCount++) : utility.toast("不点赞"),
+                        isPl && douyin.canComment() ? (fansNode = utility.checkProbability(param.pldz, "评论点赞"),
+                        douyin.sendComment(param.plhs, isPl, fansNode, param.pltp),
+                        plCount++) : utility.toast("不评论")) : (utility.toast("打开视频失败!"),
                         back(), sleep(1e3));
                     }
                 }
                 return !0;
             },
             dbzhgjc(gjc) {
-                engine.sleepMs(1e3, 2e3), id("com.ss.android.ugc.aweme:id/et_search_kw").visibleToUser().findOne().setText(gjc), 
+                engine.sleepMs(1e3, 2e3), id("com.ss.android.ugc.aweme:id/et_search_kw").visibleToUser().findOne().setText(gjc),
                 engine.sleepMs(1e3, 2e3);
-                var b1 = text("搜索").visibleToUser().findOne().bounds(), b1 = (engine.boundsClick(b1), 
-                engine.sleepMs(3e3, 4e3), text("用户").visibleToUser().findOne().bounds()), b1 = (engine.boundsClick(b1), 
+                var b1 = text("搜索").visibleToUser().findOne().bounds(), b1 = (engine.boundsClick(b1),
+                engine.sleepMs(3e3, 4e3), text("用户").visibleToUser().findOne().bounds()), b1 = (engine.boundsClick(b1),
                 engine.sleepMs(3e3, 4e3), descContains(gjc).visibleToUser().findOne(5e3));
-                return null === b1 ? (alert("没有找到对标账号", "请检查对标账号 " + gjc + " 是否输入正确!"), 
-                !1) : (engine.boundsClick(b1.bounds()), engine.sleepMs(3e3, 4e3), 
-                text("粉丝").visibleToUser().findOne().parent().click(), engine.sleepMs(3e3, 4e3), 
-                !!id("com.ss.android.ugc.aweme:id/root_layout").exists() || (alert("打开粉丝列表失败", "对标账号 " + gjc + " 粉丝列表可能设置隐私了!"), 
+             return null === b1 ? (alert("没有找到对标账号", "请检查对标账号 " + gjc + " 是否输入正确!"),
+                !1) : (engine.boundsClick(b1.bounds()), engine.sleepMs(3e3, 4e3),
+                text("粉丝").visibleToUser().findOne().parent().click(), engine.sleepMs(3e3, 4e3),
+                !!id("com.ss.android.ugc.aweme:id/root_layout").exists() || (alert("打开粉丝列表失败", "对标账号 " + gjc + " 粉丝列表可能设置隐私了!"),
                 !1));
             },
             run() {
@@ -1130,16 +1475,16 @@
                     var userContents = [];
                     let gjcsCount = 0, dyc = !0;
                     for (;;) {
-                        if (dyc && (descStartsWith("搜索").descEndsWith("按钮").visibleToUser().findOne().parent().click(), 
+                        if (dyc && (descStartsWith("搜索").descEndsWith("按钮").visibleToUser().findOne().parent().click(),
                         dyc = !1, !this.dbzhgjc(param.gjcs[gjcsCount]))) break;
-                        if (runCount >= param.yxgs) return device.cancelKeepingAwake(), 
+                        if (runCount >= param.yxgs) return device.cancelKeepingAwake(),
                         void alert("恭喜任务完成!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
                         let listBox = className("androidx.recyclerview.widget.RecyclerView").visibleToUser().findOne();
                         if (!listBox) return void utility.toast("没有找到用户列表!");
                         var listBoxTop = listBox.bounds().top, childCount = listBox.childCount();
                         for (let i = 0; i < childCount - 1; i++) {
-                            if (runCount >= param.yxgs) return device.cancelKeepingAwake(), 
-                         void alert("恭喜任务完成!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
+                            if (runCount >= param.yxgs) return device.cancelKeepingAwake(),
+                            void alert("恭喜任务完成!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
                             utility.toast("已执行用户 " + runCount + " 条,任务数" + param.yxgs);
                             var child = listBox.child(i);
                             if (null != child && !(listBoxTop >= child.bounds().top || child.findOne(desc("已关注")))) {
@@ -1147,14 +1492,14 @@
                                 if (userNode) {
                                     userNode = userNode.text();
                                     if (!utility.isEmpty(userNode) && !userContents.includes(userNode)) {
-                                        console.log(userNode), 20 <= userContents.length && userContents.shift(), 
+                                        console.log(userNode), 20 <= userContents.length && userContents.shift(),
                                         userContents.push(userNode);
                                         try {
                                             child.click(), this.execUser() && runCount++;
                                         } catch (error) {
                                             console.log("用户操作失败:", error);
                                         }
-                                        if (utility.toast("返回用户列表"), this.toUserList(), 
+                                        if (utility.toast("返回用户列表"), this.toUserList(),
                                         engine.sleepMs(2e3, 3e3), !(listBox = className("androidx.recyclerview.widget.RecyclerView").visibleToUser().findOne())) return void utility.toast("没有找到用户列表!");
                                     }
                                 } else console.log("没有获取到用户信息");
@@ -1165,8 +1510,8 @@
                                 alert("对标账号已全部运行完!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
                                 break;
                             }
-                            if (engine.sleepMs(3e3, 4e3), back(), engine.sleepMs(3e3, 4e3), 
-                            back(), engine.sleepMs(3e3, 4e3), !this.dbzhgjc(param.gjcs[gjcsCount])) break;
+                            if (engine.sleepMs(3e3, 4e3), back(), engine.sleepMs(3e3, 4e3),
+                         back(), engine.sleepMs(3e3, 4e3), !this.dbzhgjc(param.gjcs[gjcsCount])) break;
                         }
                         engine.sleepMs(2500, 3500);
                     }
@@ -1181,4 +1526,4 @@
             engine.exit();
         }
     })();
-})()
+})();

+ 11 - 0
webpack-script/src/common/conf.js

@@ -0,0 +1,11 @@
+const nodes = require("./node");
+module.exports = {
+    packageName: "com.ss.android.ugc.aweme",
+    versions: ["26.0.0", "27.0.0", "28.0.0", "28.1.0", "28.2.0", "28.3.0", "28.4.0", "28.5.0", "28.6.0", "28.7.0", "28.8.0", "28.9.0", "29.0.0", "29.1.0"],
+    commonts: ["又刷到你了", "看看我的作品", "来我主页转转"],
+    sxhs: ["很高兴认识你", "常来常往"],
+    zfhs: ["互粉", "回关", "关注", "互赞"],
+    czyhGjzs: ["多少", "价格", "联系"],
+    dqGjzs: ["安徽", "浙江", "江苏"],
+    nodes: nodes,
+}

+ 363 - 0
webpack-script/src/common/douyin.js

@@ -0,0 +1,363 @@
+const utility = require("./utility");
+const conf = require("./conf");
+const engine = require("./engine");
+var douyin = {
+    version: "",
+    nodes: {},
+    init() {
+        var info = utility.packageInfo(conf.packageName);
+        if (utility.isEmpty(info)) {
+            alert("请安装支持的抖音版本!");
+            return false;
+        } else if (conf.versions.includes(info.versionName)) {
+            this.version = info.versionName;
+            this.nodes = conf.nodes[info.versionName] || {};
+            return true;
+        } else {
+            alert("不支持 抖音(" + info.versionName + ")请安装支持的抖音版本!");
+            return false;
+        }
+    },
+    execClose() {
+        for (utility.inputHide();;) {
+            var closeBtn = desc("关闭").visibleToUser().findOnce();
+            if (!closeBtn) {
+                break;
+            }
+            closeBtn.click();
+            sleep(1000);
+        }
+    },
+    execCancel() {
+        while (true) {
+            var closeBtn = id("cancel_btn").visibleToUser().findOnce();
+            if (!closeBtn) {
+                break;
+            }
+            closeBtn.click();
+            sleep(1000);
+        }
+    },
+    execBackOnce() {
+        var backBtn = desc("返回").visibleToUser().findOnce();
+        return backBtn !== null && (backBtn.click(), sleep(500), true);
+    },
+    execBack() {
+        while (this.execBackOnce());
+    },
+    execLike() {
+        var wdz = className("android.widget.LinearLayout").descStartsWith("未点赞").descEndsWith("按钮").visibleToUser().findOnce();
+        return !!wdz && (utility.toast("执行点赞"), wdz.click(), sleep(1000), true);
+    },
+    execTxdz() {
+        var txdz;
+        if (desc("用户头像").visibleToUser().findOnce().click()) {
+            sleep(500);
+            txdz = className("android.widget.RelativeLayout").visibleToUser().findOnce();
+            sleep(500);
+            txdz.click();
+            engine.sleepMs(1000, 2000);
+            back();
+            sleep(1000);
+        }
+    },
+    popupAndClose() {
+        threads.start(function () {
+            while (true) {
+                var a;
+                sleep(200);
+                if (text("授权提示").exists()) {
+                    text("同意授权").click();
+                }
+                sleep(200);
+                if (text("休息一下吧").exists()) {
+                    text("取消").click();
+                }
+                sleep(200);
+                if (text("很晚了,睡个好觉").exists() || text("早点睡觉吧").exists()) {
+                    text("取消").click();
+                }
+                sleep(200);
+                if (text("朋友推荐").exists() && (a = desc("关闭").findOnce())) {
+                    a.click();
+                }
+                sleep(200);
+                if (text("发现通讯录好友").exists()) {
+                    text("取消").click();
+                }
+                sleep(200);
+                if (text("个人信息保护指引").exists()) {
+                    text("好的").click();
+                }
+                sleep(200);
+                if (text("去商店评分").exists()) {
+                    text("取消").click();
+                }
+                sleep(200);
+                if (text("开启青少年模式").exists()) {
+                    text("我知道了").click();
+                }
+                sleep(200);
+                if (text("检测到更新").exists()) {
+                    text("以后再说").click();
+                }
+                sleep(200);
+                if (text("跳过广告").exists()) {
+                    text("跳过广告").click();
+                }
+                sleep(200);
+                if (text("下次").exists()) {
+                    text("下次").click();
+                }
+                sleep(1000);
+            }
+        });
+    },
+    getNode(path) {
+        var tp;
+        var path = path.split(".");
+        let node = this.nodes;
+        for (tp of path) {
+            if ((node = node[tp] || null) === null) {
+                break;
+            }
+        }
+        if (!node) {
+            node = conf.nodes.all;
+            for (let tp of path) {
+                if ((node = node[tp] || null) === null) {
+                    break;
+                }
+            }
+        }
+        return node;
+    },
+    isRecommend() {
+        return descContains("推荐").descEndsWith("按钮").descContains("已选中").visibleToUser().findOnce() !== null || descContains("精选").descEndsWith("按钮").descContains("已选中").visibleToUser().findOnce() !== null;
+    },
+    IsVideo() {
+        var node = douyin.getNode("video.like");
+        return node !== null && id(node.id).visibleToUser().findOnce() !== null || className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOnce() !== null;
+    },
+    IsVideoDelay(ms) {
+        return className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOne(ms) !== null;
+    },
+    skipVideo() {
+        return !this.IsVideo() && (utility.toast("跳过非视频或图集作品!"), sleep(500), engine.slide(), true);
+    },
+    IsFollow() {
+        return className("android.widget.Button").desc("关注").visibleToUser().findOnce() !== null;
+    },
+    execFollow() {
+        var con = className("android.widget.Button").desc("关注").visibleToUser().findOnce();
+        return !!con && (utility.toast("执行关注"), con.click(), true);
+    },
+    sikpFollow() {
+        return !this.IsFollow() && (utility.toast("跳过已关注用户"), sleep(500), engine.slide(), true);
+    },
+    IsLike() {
+        return className("android.widget.LinearLayout").descStartsWith("已点赞").descEndsWith("按钮").visibleToUser().findOnce() !== null;
+    },
+    sikpLike() {
+        return !!this.IsLike() && (utility.toast("跳过已点赞视频"), sleep(500), engine.slide(), true);
+    },
+    getLikeNum() {
+        let num = 0;
+        try {
+            var desc = className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOnce().desc();
+            num = parseFloat(desc.match(/[0-9]+(\.[0-9]{0,2})?/g)[0]);
+            if (desc.indexOf("w") >= 0 || desc.indexOf("万") >= 0) {
+                num *= 10000;
+            }
+        } catch (e) {
+            num = 0;
+        }
+        return num;
+    },
+    IsAd() {
+        return textContains("广告").visibleToUser().findOnce() !== null;
+    },
+    sikpAp() {
+        return !!this.IsAd() && (utility.toast("跳过忽略广告"), sleep(500), engine.slide(), true);
+    },
+    IsCommerce() {
+        try {
+            if (textEndsWith("限时秒杀").visibleToUser().findOnce() !== null) {
+                return true;
+            }
+            if (textEndsWith("优惠团购").visibleToUser().findOnce() !== null) {
+                return true;
+            }
+        } catch (e) {}
+        return false;
+    },
+    sikpCommerce() {
+        return !!this.IsCommerce() && (utility.toast("跳过商业视频!"), sleep(500), engine.slide(), true);
+    },
+    watchVideo(startTime, watchTime) {
+        startTime = engine.getUnix() - startTime;
+        if ((watchTime -= startTime = startTime > 60 ? 60 : startTime) > 0) {
+            engine.sleep(watchTime);
+            utility.toast("继续观看视频" + watchTime + "秒");
+        } else {
+            utility.toast("已观看视频" + startTime + "秒");
+        }
+        sleep(500);
+    },
+    canComment() {
+        let num = 0;
+        try {
+            var desc = className("android.widget.LinearLayout").descContains("评论").descEndsWith("按钮").visibleToUser().findOnce().desc();
+            num = parseFloat(desc.match(/[0-9]+(\.[0-9]{0,2})?/g)[0]);
+        } catch (e) {
+            num = 0;
+        }
+        return num > 0;
+    },
+    sendComment(hs, isComment, isLike, pltp) {
+        try {
+            isComment = !!isComment || isComment === undefined;
+            var plBtn = className("android.widget.LinearLayout").descStartsWith("评论").descEndsWith("按钮").visibleToUser().findOnce();
+            if (plBtn && plBtn.click()) {
+                let editText = className("android.widget.EditText").visibleToUser().findOne(3000);
+                if (editText === null) {
+                    sleep(1000);
+                    editText = className("android.widget.EditText").visibleToUser().findOne(2000);
+                }
+                if (editText === null) {
+                    utility.toast("没有识别到评论框");
+                    sleep(500);
+                } else {
+                    if (isLike) {
+                        utility.toast("执行评论点赞");
+                        sleep(1000);
+                        (commentZanBtns = descStartsWith("赞").descEndsWith("未选中").visibleToUser().find()).forEach(el => {
+                            (el.clickable() ? el : el.parent()).click();
+                            engine.sleepMs(500, 1000);
+                        });
+                    }
+                    var hsLen = hs.length;
+                    if (!isComment || hsLen < 1) {
+                        utility.toast("不执行评论");
+                        sleep(500);
+                    } else {
+                        utility.toast("准备发表评论");
+                        if (editText.click()) {
+                            sleep(1000);
+                            setText(hs[random(0, hsLen - 1)]);
+                            engine.sleepMs(1000, 3000);
+                            if (pltp && desc("插入图片").visibleToUser().findOne(3000) !== null) {
+                                if (!desc("插入图片").visibleToUser().findOne().click()) {
+                                    utility.toast("没有成功点击到发布图片按钮");
+                                }
+                                sleep(2000);
+                                let listBox = id("com.ss.android.ugc.aweme:id/content_container").visibleToUser().findOne(2000);
+                                if ((listBox = listBox.find(id("com.ss.android.ugc.aweme:id/root_view"))).length == 0) {
+                                    alert("没有图片!", "手机相册里请先准备好图片!");
+                                    return;
+                                }
+                                if (!listBox[random(0, listBox.length - 1)].click()) {
+                                    utility.toast("图片点击失败!");
+                                    back();
+                                }
+                                engine.sleepMs(1000, 2000);
+                            }
+                            let sendBtn = className("android.widget.ImageView").visibleToUser().desc("发送").findOne(5000);
+                            if ((sendBtn = (sendBtn = sendBtn || className("android.widget.TextView").visibleToUser().text("发送").findOne(5000)) || text("发送").findOne(5000)) === null) {
+                                utility.toast("没有获取到发送按钮");
+                                sleep(1000);
+                            } else {
+                                if (sendBtn.clickable()) {
+                                    if (!sendBtn.click()) {
+                                        utility.toast("没有成功点击发送按钮");
+                                        sleep(1000);
+                                        this.execClose();
+                                        return;
+                                    }
+                                } else if (!sendBtn.parent().click()) {
+                                    utility.toast("没有成功点击parent发送按钮");
+                                    sleep(1000);
+                                    this.execClose();
+                                    return;
+                                }
+                                utility.toast("评论完成");
+                                if (text("我也发一张").visibleToUser().findOne(5000) !== null) {
+                                    this.execBack();
+                                }
+                                engine.sleepMs(2000, 5000);
+                            }
+                        } else {
+                            utility.toast("没有成功点击评论框");
+                            sleep(500);
+                        }
+                    }
+                }
+                this.execClose();
+            }
+        } catch (e) {
+            console.log(e);
+            utility.toast("评论操作失败");
+            sleep(500);
+            this.execClose();
+        }
+    },
+    isHome() {
+        return id(this.getNode("user.homeMark").id).visibleToUser().findOne(10000) !== null;
+    },
+    previewHome() {
+        var head = id(this.getNode("index.headimg").id).visibleToUser().findOnce();
+        if (head !== null && head.click()) {
+            utility.toast("访问用户首页");
+            if (this.isHome()) {
+                engine.sleep(2, 5);
+                if (random(1, 3) == 1) {
+                    engine.slide();
+                    engine.sleep(2, 5);
+                }
+            } else {
+                console.log("打开用户首页失败");
+            }
+            this.execBackOnce();
+        }
+    },
+    previewHomeTc() {
+        let yhxb = 0;
+        var head = id(this.getNode("index.headimg").id).visibleToUser().findOnce();
+        if (head !== null && head.click()) {
+            utility.toast("访问用户首页");
+            if (this.isHome()) {
+                engine.sleepMs(2000, 3000);
+                if (descStartsWith("男").visibleToUser().findOnce() !== null) {
+                    yhxb = 1;
+                }
+                if (descStartsWith("女").visibleToUser().findOnce() !== null) {
+                    yhxb = 2;
+                }
+                this.execBackOnce();
+                return yhxb;
+            }
+            console.log("打开用户首页失败");
+            this.execBackOnce();
+        }
+    },
+    getVideoDesc() {
+        var vedioDesc = id(douyin.getNode("index.desc").id).visibleToUser().findOnce();
+        if (vedioDesc === null) {
+            return "";
+        } else {
+            return vedioDesc.text();
+        }
+    },
+    getVideoTitle() {
+        var vedioTitle = id(douyin.getNode("index.title").id).visibleToUser().findOnce();
+        if (vedioTitle === null) {
+            return "";
+        } else {
+            return vedioTitle.text();
+        }
+    },
+    getVideoMark() {
+        return this.getVideoDesc() + this.getVideoTitle();
+    }
+};
+module.exports = douyin;

+ 128 - 0
webpack-script/src/common/engine.js

@@ -0,0 +1,128 @@
+if (global.ENV_CONF === "undefined") {
+    global.ENV_CONF = {};
+}
+module.exports = {
+    deviceWidth: ENV_CONF.screenWidth || device.width,
+    deviceHeight: ENV_CONF.screenHeight || device.height,
+    exit() {
+        engines.stopAll();
+        exit();
+    },
+    swipeEx(qx, qy, zx, zy, time) {
+        var xxy = [time];
+        var point = [];
+        var dx0 = {
+            x: qx,
+            y: qy
+        };
+        var dx1 = {
+            x: random(qx - 100, qx + 100),
+            y: random(qy, qy + 50)
+        };
+        var dx2 = {
+            x: random(zx - 100, zx + 100),
+            y: random(zy, zy + 50)
+        };
+        var dx3 = {
+            x: zx,
+            y: zy
+        };
+        for (var i = 0; i < 4; i++) {
+            eval("point.push(dx" + i + ")");
+        }
+        for (let i = 0; i < 1; i += 0.08) {
+            xxyy = [parseInt(this.bezier_curves(point, i).x), parseInt(this.bezier_curves(point, i).y)];
+            xxy.push(xxyy);
+        }
+        gesture.apply(null, xxy);
+    },
+    bezier_curves(cp, t) {
+        cx = (cp[1].x - cp[0].x) * 3;
+        bx = (cp[2].x - cp[1].x) * 3 - cx;
+        ax = cp[3].x - cp[0].x - cx - bx;
+        cy = (cp[1].y - cp[0].y) * 3;
+        by = (cp[2].y - cp[1].y) * 3 - cy;
+        ay = cp[3].y - cp[0].y - cy - by;
+        tSquared = t * t;
+        tCubed = tSquared * t;
+        (result = {
+            x: 0,
+            y: 0
+        }).x = ax * tCubed + bx * tSquared + cx * t + cp[0].x;
+        result.y = ay * tCubed + by * tSquared + cy * t + cp[0].y;
+        return result;
+    },
+    shortSlide() {
+        this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.8, this.deviceWidth * 0.5, this.deviceHeight * 0.8 - 500, 300);
+    },
+    middleSlide() {
+        this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.8, this.deviceWidth * 0.5, this.deviceHeight * 0.5, 300);
+    },
+    deSlide() {
+        this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.3, this.deviceWidth * 0.5, this.deviceHeight, 300);
+    },
+    bshortSlide() {
+        this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.8, this.deviceWidth * 0.5, this.deviceHeight * 0.8 - 500, 300);
+    },
+    slide() {
+        this.swipeEx(this.deviceWidth * 0.8, this.deviceHeight * 0.7, this.deviceWidth * 0.8, 0, random(300, 500));
+    },
+    fanslide() {
+        this.swipeEx(this.deviceWidth * 0.9, this.deviceHeight * 0.5, this.deviceWidth * 0.9, this.deviceHeight * 0.01, 500);
+    },
+    regionClick(region) {
+        click(random(region[0], region[0] + region[2]), random(region[1], region[1] + region[3]));
+    },
+    boundsClick(bounds) {
+        var x = bounds.width() * 0.2;
+        var y = bounds.height() * 0.2;
+        bounds.left += x;
+        bounds.right -= x;
+        bounds.top += y;
+        bounds.bottom -= y;
+        click(random(bounds.left, bounds.right), random(bounds.top, bounds.bottom));
+    },
+    sleepMs() {
+        var argLen = arguments.length;
+        let min = 0;
+        let max = 0;
+        if (argLen == 1) {
+            min = arguments[0];
+            max = arguments[0];
+        } else {
+            if (argLen < 2) {
+                return;
+            }
+            min = arguments[0];
+            max = arguments[1];
+        }
+        if (min >= max) {
+            sleep(min);
+        } else {
+            sleep(random(min, max));
+        }
+    },
+    sleep() {
+        var argLen = arguments.length;
+        let min = 0;
+        let max = 0;
+        if (argLen == 1) {
+            min = arguments[0];
+            max = arguments[0];
+        } else {
+            if (argLen < 2) {
+                return;
+            }
+            min = arguments[0];
+            max = arguments[1];
+        }
+        if (min >= max) {
+            sleep(min * 1000);
+        } else {
+            sleep(random(min, max) * 1000);
+        }
+    },
+    getUnix() {
+        return parseInt(Date.now() / 1000);
+    }
+};

+ 1866 - 0
webpack-script/src/common/example/znzf.js

@@ -0,0 +1,1866 @@
+(() => {
+    var __webpack_modules__ = {
+        81: (module, __unused_webpack_exports, __webpack_require__) => {
+            __webpack_require__ = {
+                packageName: "com.ss.android.ugc.aweme",
+                versions: ["26.0.0", "27.0.0", "28.0.0", "28.1.0", "28.2.0", "28.3.0", "28.4.0", "28.5.0", "28.6.0", "28.7.0", "28.8.0", "28.9.0", "29.0.0", "29.1.0"],
+                nodes: __webpack_require__(761),
+                commonts: ["又刷到你了", "看看我的作品", "来我主页转转"],
+                sxhs: ["很高兴认识你", "常来常往"],
+                zfhs: ["互粉", "回关", "关注", "互赞"],
+                czyhGjzs: ["多少", "价格", "联系"],
+                dqGjzs: ["安徽", "浙江", "江苏"]
+            };
+            module.exports = __webpack_require__;
+        },
+        761: module => {
+            var nodes = {
+                all: {
+                    index: {
+                        headimg: {
+                            id: "com.ss.android.ugc.aweme:id/user_avatar"
+                        },
+                        desc: {
+                            id: "com.ss.android.ugc.aweme:id/desc"
+                        },
+                        title: {
+                            id: "com.ss.android.ugc.aweme:id/title"
+                        },
+                        searchInput: {
+                            id: "com.ss.android.ugc.aweme:id/et_search_kw"
+                        }
+                    }
+                },
+                "26.0.0": {
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dc7"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/er2"
+                        }
+                    },
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/er-"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/t5o"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/w8o"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/w8s"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/nsc"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/w9h"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/po9"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/mwq"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/xzb"
+                        }
+                    }
+                },
+                "27.0.0": {
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dh7"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/eyg"
+                        }
+                    },
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/eyp"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/vkl"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/yr5"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/yr9"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ohq"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/ys7"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/qpd"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/njx"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/zkc"
+                        }
+                    }
+                },
+                "27.3.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e3z"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dms"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e3p"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v0f"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y=3"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y=7"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/oth"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y_7"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q1y"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nu1"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z35"
+                        }
+                    }
+                },
+                "27.4.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e3="
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dm2"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e30"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v0u"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y_h"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y_l"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/os-"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y-k"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q19"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nuw"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z4t"
+                        }
+                    }
+                },
+                "27.5.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e3+"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dnm"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e33"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v1f"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y-e"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y-i"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/osz"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y+h"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q2n"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nuh"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z5o"
+                        }
+                    }
+                },
+                "27.6.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/e5o"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dow"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/e5e"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v2+"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y+-"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zac"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ouo"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/za+"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q4b"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nv8"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z7s"
+                        }
+                    }
+                },
+                "27.7.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/exn"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/df+"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/exd"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v83"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zic"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zig"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ov4"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zjf"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q6o"
+                        }
+                    },
+                    live: {
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nsz"
+                        },
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0cc"
+                        }
+                    }
+                },
+                "27.8.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/eyq"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dg_"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/eyg"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v_e"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zku"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zky"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/oyz"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zlu"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q72"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0ew"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nwv"
+                        }
+                    }
+                },
+                "27.9.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ezh"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dhs"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ey="
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/waf"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zn6"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zn="
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/o0p"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zo7"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q97"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0h="
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nz9"
+                        }
+                    }
+                },
+                "28.0.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ezh"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dho"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ey="
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/wcy"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zqq"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zqu"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/o13"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zrr"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q_r"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0kz"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/n19"
+                        }
+                    }
+                },
+                "28.1.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ezy"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/dh0"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ezo"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/wd8"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zrs"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zrw"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/o2_"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zsu"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q-1"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0lw"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/n3u"
+                        }
+                    }
+                },
+                "28.2.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/efs"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c1a"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/efi"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/vsx"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y6j"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y6n"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/oe9"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y7f"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/qod"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/zzu"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nbk"
+                        }
+                    }
+                },
+                "28.3.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/egc"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c1r"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ef6"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/vvo"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/y9g"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/y9k"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/og0"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/y=c"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/qp-"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z2s"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nc4"
+                        }
+                    }
+                },
+                "28.4.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ehq"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c2="
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ehf"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v09"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zbf"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zbj"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/old"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zcb"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/qu-"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z9i"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/ng7"
+                        }
+                    }
+                },
+                "28.5.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/eio"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c31"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/eid"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v3+"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zex"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/ze1"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/on1"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zft"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/qx3"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/z-5"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nje"
+                        }
+                    }
+                },
+                "28.6.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ei-"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c4g"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ei1"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v7c"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zh="
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zia"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/op1"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zi7"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/qz9"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0ck"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nk-"
+                        }
+                    }
+                },
+                "28.7.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ejz"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c41"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ejo"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v97"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zk="
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zla"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ory"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zl6"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q2d"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0fr"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nm6"
+                        }
+                    }
+                },
+                "28.8.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/ekj"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c5g"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/ej-"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/v+_"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zph"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zpl"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ot-"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zqd"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q47"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0jz"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nor"
+                        }
+                    }
+                },
+                "28.9.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/el2"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c6w"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/elr"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/wej"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zt8"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zt-"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/owx"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zu4"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q7="
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0ol"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nrb"
+                        }
+                    }
+                },
+                "29.0.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/el5"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c6v"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/elu"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/wgx"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/zxf"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/zxj"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/ox2"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/zyb"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q9u"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0r0"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nrq"
+                        }
+                    }
+                },
+                "29.1.0": {
+                    video: {
+                        like: {
+                            id: "com.ss.android.ugc.aweme:id/emy"
+                        }
+                    },
+                    comment: {
+                        button: {
+                            id: "com.ss.android.ugc.aweme:id/c7i"
+                        },
+                        zan: {
+                            id: "com.ss.android.ugc.aweme:id/eml"
+                        }
+                    },
+                    user: {
+                        homeMark: {
+                            id: "com.ss.android.ugc.aweme:id/poo"
+                        },
+                        gznum: {
+                            id: "com.ss.android.ugc.aweme:id/z1u"
+                        },
+                        fansnum: {
+                            id: "com.ss.android.ugc.aweme:id/z1y"
+                        },
+                        username: {
+                            id: "com.ss.android.ugc.aweme:id/o07"
+                        },
+                        lanv: {
+                            id: "com.ss.android.ugc.aweme:id/z2q"
+                        },
+                        followBtn: {
+                            id: "com.ss.android.ugc.aweme:id/q-z"
+                        }
+                    },
+                    live: {
+                        userlistbox: {
+                            id: "com.ss.android.ugc.aweme:id/0wc"
+                        },
+                        msglistbox: {
+                            id: "com.ss.android.ugc.aweme:id/nv_"
+                        }
+                    }
+                }
+            };
+            module.exports = nodes;
+        },
+        954: (module, __unused_webpack_exports, __webpack_require__) => {
+            var conf = __webpack_require__(81);
+            var utility = __webpack_require__(871);
+            var engine = __webpack_require__(557);
+            var douyin = {
+                version: "",
+                nodes: {},
+                init() {
+                    var info = utility.packageInfo(conf.packageName);
+                    if (utility.isEmpty(info)) {
+                        alert("请安装支持的抖音版本!");
+                        return false;
+                    } else if (conf.versions.includes(info.versionName)) {
+                        this.version = info.versionName;
+                        this.nodes = conf.nodes[info.versionName] || {};
+                        return true;
+                    } else {
+                        alert("不支持 抖音(" + info.versionName + ")请安装支持的抖音版本!");
+                        return false;
+                    }
+                },
+                execClose() {
+                    for (utility.inputHide();;) {
+                        var closeBtn = desc("关闭").visibleToUser().findOnce();
+                        if (!closeBtn) {
+                            break;
+                        }
+                        closeBtn.click();
+                        sleep(1000);
+                    }
+                },
+                execCancel() {
+                    while (true) {
+                        var closeBtn = id("cancel_btn").visibleToUser().findOnce();
+                        if (!closeBtn) {
+                            break;
+                        }
+                        closeBtn.click();
+                        sleep(1000);
+                    }
+                },
+                execBackOnce() {
+                    var backBtn = desc("返回").visibleToUser().findOnce();
+                    return backBtn !== null && (backBtn.click(), sleep(500), true);
+                },
+                execBack() {
+                    while (this.execBackOnce());
+                },
+                execLike() {
+                    var wdz = className("android.widget.LinearLayout").descStartsWith("未点赞").descEndsWith("按钮").visibleToUser().findOnce();
+                    return !!wdz && (utility.toast("执行点赞"), wdz.click(), sleep(1000), true);
+                },
+                execTxdz() {
+                    var txdz;
+                    if (desc("用户头像").visibleToUser().findOnce().click()) {
+                        sleep(500);
+                        txdz = className("android.widget.RelativeLayout").visibleToUser().findOnce();
+                        sleep(500);
+                        txdz.click();
+                        engine.sleepMs(1000, 2000);
+                        back();
+                        sleep(1000);
+                    }
+                },
+                popupAndClose() {
+                    threads.start(function () {
+                        while (true) {
+                            var a;
+                            sleep(200);
+                            if (text("授权提示").exists()) {
+                                text("同意授权").click();
+                            }
+                            sleep(200);
+                            if (text("休息一下吧").exists()) {
+                                text("取消").click();
+                            }
+                            sleep(200);
+                            if (text("很晚了,睡个好觉").exists() || text("早点睡觉吧").exists()) {
+                                text("取消").click();
+                            }
+                            sleep(200);
+                            if (text("朋友推荐").exists() && (a = desc("关闭").findOnce())) {
+                                a.click();
+                            }
+                            sleep(200);
+                            if (text("发现通讯录好友").exists()) {
+                                text("取消").click();
+                            }
+                            sleep(200);
+                            if (text("个人信息保护指引").exists()) {
+                                text("好的").click();
+                            }
+                            sleep(200);
+                            if (text("去商店评分").exists()) {
+                                text("取消").click();
+                            }
+                            sleep(200);
+                            if (text("开启青少年模式").exists()) {
+                                text("我知道了").click();
+                            }
+                            sleep(200);
+                            if (text("检测到更新").exists()) {
+                                text("以后再说").click();
+                            }
+                            sleep(200);
+                            if (text("跳过广告").exists()) {
+                                text("跳过广告").click();
+                            }
+                            sleep(200);
+                            if (text("下次").exists()) {
+                                text("下次").click();
+                            }
+                            sleep(1000);
+                        }
+                    });
+                },
+                getNode(path) {
+                    var tp;
+                    var path = path.split(".");
+                    let node = this.nodes;
+                    for (tp of path) {
+                        if ((node = node[tp] || null) === null) {
+                            break;
+                        }
+                    }
+                    if (!node) {
+                        node = conf.nodes.all;
+                        for (let tp of path) {
+                            if ((node = node[tp] || null) === null) {
+                                break;
+                            }
+                        }
+                    }
+                    return node;
+                },
+                isRecommend() {
+                    return descContains("推荐").descEndsWith("按钮").descContains("已选中").visibleToUser().findOnce() !== null || descContains("精选").descEndsWith("按钮").descContains("已选中").visibleToUser().findOnce() !== null;
+                },
+                IsVideo() {
+                    var node = douyin.getNode("video.like");
+                    return node !== null && id(node.id).visibleToUser().findOnce() !== null || className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOnce() !== null;
+                },
+                IsVideoDelay(ms) {
+                    return className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOne(ms) !== null;
+                },
+                skipVideo() {
+                    return !this.IsVideo() && (utility.toast("跳过非视频或图集作品!"), sleep(500), engine.slide(), true);
+                },
+                IsFollow() {
+                    return className("android.widget.Button").desc("关注").visibleToUser().findOnce() !== null;
+                },
+                execFollow() {
+                    var con = className("android.widget.Button").desc("关注").visibleToUser().findOnce();
+                    return !!con && (utility.toast("执行关注"), con.click(), true);
+                },
+                sikpFollow() {
+                    return !this.IsFollow() && (utility.toast("跳过已关注用户"), sleep(500), engine.slide(), true);
+                },
+                IsLike() {
+                    return className("android.widget.LinearLayout").descStartsWith("已点赞").descEndsWith("按钮").visibleToUser().findOnce() !== null;
+                },
+                sikpLike() {
+                    return !!this.IsLike() && (utility.toast("跳过已点赞视频"), sleep(500), engine.slide(), true);
+                },
+                getLikeNum() {
+                    let num = 0;
+                    try {
+                        var desc = className("android.widget.LinearLayout").descContains("点赞").descEndsWith("按钮").visibleToUser().findOnce().desc();
+                        num = parseFloat(desc.match(/[0-9]+(\.[0-9]{0,2})?/g)[0]);
+                        if (desc.indexOf("w") >= 0 || desc.indexOf("万") >= 0) {
+                            num *= 10000;
+                        }
+                    } catch (e) {
+                        num = 0;
+                    }
+                    return num;
+                },
+                IsAd() {
+                    return textContains("广告").visibleToUser().findOnce() !== null;
+                },
+                sikpAp() {
+                    return !!this.IsAd() && (utility.toast("跳过忽略广告"), sleep(500), engine.slide(), true);
+                },
+                IsCommerce() {
+                    try {
+                        if (textEndsWith("限时秒杀").visibleToUser().findOnce() !== null) {
+                            return true;
+                        }
+                        if (textEndsWith("优惠团购").visibleToUser().findOnce() !== null) {
+                            return true;
+                        }
+                    } catch (e) {}
+                    return false;
+                },
+                sikpCommerce() {
+                    return !!this.IsCommerce() && (utility.toast("跳过商业视频!"), sleep(500), engine.slide(), true);
+                },
+                watchVideo(startTime, watchTime) {
+                    startTime = engine.getUnix() - startTime;
+                    if ((watchTime -= startTime = startTime > 60 ? 60 : startTime) > 0) {
+                        engine.sleep(watchTime);
+                        utility.toast("继续观看视频" + watchTime + "秒");
+                    } else {
+                        utility.toast("已观看视频" + startTime + "秒");
+                    }
+                    sleep(500);
+                },
+                canComment() {
+                    let num = 0;
+                    try {
+                        var desc = className("android.widget.LinearLayout").descContains("评论").descEndsWith("按钮").visibleToUser().findOnce().desc();
+                        num = parseFloat(desc.match(/[0-9]+(\.[0-9]{0,2})?/g)[0]);
+                    } catch (e) {
+                        num = 0;
+                    }
+                    return num > 0;
+                },
+                sendComment(hs, isComment, isLike, pltp) {
+                    try {
+                        isComment = !!isComment || isComment === undefined;
+                        var plBtn = className("android.widget.LinearLayout").descStartsWith("评论").descEndsWith("按钮").visibleToUser().findOnce();
+                        if (plBtn && plBtn.click()) {
+                            let editText = className("android.widget.EditText").visibleToUser().findOne(3000);
+                            if (editText === null) {
+                                sleep(1000);
+                                editText = className("android.widget.EditText").visibleToUser().findOne(2000);
+                            }
+                            if (editText === null) {
+                                utility.toast("没有识别到评论框");
+                                sleep(500);
+                            } else {
+                                if (isLike) {
+                                    utility.toast("执行评论点赞");
+                                    sleep(1000);
+                                    (commentZanBtns = descStartsWith("赞").descEndsWith("未选中").visibleToUser().find()).forEach(el => {
+                                        (el.clickable() ? el : el.parent()).click();
+                                        engine.sleepMs(500, 1000);
+                                    });
+                                }
+                                var hsLen = hs.length;
+                                if (!isComment || hsLen < 1) {
+                                    utility.toast("不执行评论");
+                                    sleep(500);
+                                } else {
+                                    utility.toast("准备发表评论");
+                                    if (editText.click()) {
+                                        sleep(1000);
+                                        setText(hs[random(0, hsLen - 1)]);
+                                        engine.sleepMs(1000, 3000);
+                                        if (pltp && desc("插入图片").visibleToUser().findOne(3000) !== null) {
+                                            if (!desc("插入图片").visibleToUser().findOne().click()) {
+                                                utility.toast("没有成功点击到发布图片按钮");
+                                            }
+                                            sleep(2000);
+                                            let listBox = id("com.ss.android.ugc.aweme:id/content_container").visibleToUser().findOne(2000);
+                                            if ((listBox = listBox.find(id("com.ss.android.ugc.aweme:id/root_view"))).length == 0) {
+                                                alert("没有图片!", "手机相册里请先准备好图片!");
+                                                return;
+                                            }
+                                            if (!listBox[random(0, listBox.length - 1)].click()) {
+                                                utility.toast("图片点击失败!");
+                                                back();
+                                            }
+                                            engine.sleepMs(1000, 2000);
+                                        }
+                                        let sendBtn = className("android.widget.ImageView").visibleToUser().desc("发送").findOne(5000);
+                                        if ((sendBtn = (sendBtn = sendBtn || className("android.widget.TextView").visibleToUser().text("发送").findOne(5000)) || text("发送").findOne(5000)) === null) {
+                                            utility.toast("没有获取到发送按钮");
+                                            sleep(1000);
+                                        } else {
+                                            if (sendBtn.clickable()) {
+                                                if (!sendBtn.click()) {
+                                                    utility.toast("没有成功点击发送按钮");
+                                                    sleep(1000);
+                                                    this.execClose();
+                                                    return;
+                                                }
+                                            } else if (!sendBtn.parent().click()) {
+                                                utility.toast("没有成功点击parent发送按钮");
+                                                sleep(1000);
+                                                this.execClose();
+                                                return;
+                                            }
+                                            utility.toast("评论完成");
+                                            if (text("我也发一张").visibleToUser().findOne(5000) !== null) {
+                                                this.execBack();
+                                            }
+                                            engine.sleepMs(2000, 5000);
+                                        }
+                                    } else {
+                                        utility.toast("没有成功点击评论框");
+                                        sleep(500);
+                                    }
+                                }
+                            }
+                            this.execClose();
+                        }
+                    } catch (e) {
+                        console.log(e);
+                        utility.toast("评论操作失败");
+                        sleep(500);
+                        this.execClose();
+                    }
+                },
+                isHome() {
+                    return id(this.getNode("user.homeMark").id).visibleToUser().findOne(10000) !== null;
+                },
+                previewHome() {
+                    var head = id(this.getNode("index.headimg").id).visibleToUser().findOnce();
+                    if (head !== null && head.click()) {
+                        utility.toast("访问用户首页");
+                        if (this.isHome()) {
+                            engine.sleep(2, 5);
+                            if (random(1, 3) == 1) {
+                                engine.slide();
+                                engine.sleep(2, 5);
+                            }
+                        } else {
+                            console.log("打开用户首页失败");
+                        }
+                        this.execBackOnce();
+                    }
+                },
+                previewHomeTc() {
+                    let yhxb = 0;
+                    var head = id(this.getNode("index.headimg").id).visibleToUser().findOnce();
+                    if (head !== null && head.click()) {
+                        utility.toast("访问用户首页");
+                        if (this.isHome()) {
+                            engine.sleepMs(2000, 3000);
+                            if (descStartsWith("男").visibleToUser().findOnce() !== null) {
+                                yhxb = 1;
+                            }
+                            if (descStartsWith("女").visibleToUser().findOnce() !== null) {
+                                yhxb = 2;
+                            }
+                            this.execBackOnce();
+                            return yhxb;
+                        }
+                        console.log("打开用户首页失败");
+                        this.execBackOnce();
+                    }
+                },
+                getVideoDesc() {
+                    var vedioDesc = id(douyin.getNode("index.desc").id).visibleToUser().findOnce();
+                    if (vedioDesc === null) {
+                        return "";
+                    } else {
+                        return vedioDesc.text();
+                    }
+                },
+                getVideoTitle() {
+                    var vedioTitle = id(douyin.getNode("index.title").id).visibleToUser().findOnce();
+                    if (vedioTitle === null) {
+                        return "";
+                    } else {
+                        return vedioTitle.text();
+                    }
+                },
+                getVideoMark() {
+                    return this.getVideoDesc() + this.getVideoTitle();
+                }
+            };
+            module.exports = douyin;
+        },
+        557: (module, __unused_webpack_exports, __webpack_require__) => {
+            if (typeof __webpack_require__.g.ENV_CONF == "undefined") {
+                __webpack_require__.g.ENV_CONF = {};
+            }
+            module.exports = {
+                deviceWidth: ENV_CONF.screenWidth || device.width,
+                deviceHeight: ENV_CONF.screenHeight || device.height,
+                exit() {
+                    engines.stopAll();
+                    exit();
+                },
+                swipeEx(qx, qy, zx, zy, time) {
+                    var xxy = [time];
+                    var point = [];
+                    var dx0 = {
+                        x: qx,
+                        y: qy
+                    };
+                    var dx1 = {
+                        x: random(qx - 100, qx + 100),
+                        y: random(qy, qy + 50)
+                    };
+                    var dx2 = {
+                        x: random(zx - 100, zx + 100),
+                        y: random(zy, zy + 50)
+                    };
+                    var dx3 = {
+                        x: zx,
+                        y: zy
+                    };
+                    for (var i = 0; i < 4; i++) {
+                        eval("point.push(dx" + i + ")");
+                    }
+                    for (let i = 0; i < 1; i += 0.08) {
+                        xxyy = [parseInt(this.bezier_curves(point, i).x), parseInt(this.bezier_curves(point, i).y)];
+                        xxy.push(xxyy);
+                    }
+                    gesture.apply(null, xxy);
+                },
+                bezier_curves(cp, t) {
+                    cx = (cp[1].x - cp[0].x) * 3;
+                    bx = (cp[2].x - cp[1].x) * 3 - cx;
+                    ax = cp[3].x - cp[0].x - cx - bx;
+                    cy = (cp[1].y - cp[0].y) * 3;
+                    by = (cp[2].y - cp[1].y) * 3 - cy;
+                    ay = cp[3].y - cp[0].y - cy - by;
+                    tSquared = t * t;
+                    tCubed = tSquared * t;
+                    (result = {
+                        x: 0,
+                        y: 0
+                    }).x = ax * tCubed + bx * tSquared + cx * t + cp[0].x;
+                    result.y = ay * tCubed + by * tSquared + cy * t + cp[0].y;
+                    return result;
+                },
+                shortSlide() {
+                    this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.8, this.deviceWidth * 0.5, this.deviceHeight * 0.8 - 500, 300);
+                },
+                middleSlide() {
+                    this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.8, this.deviceWidth * 0.5, this.deviceHeight * 0.5, 300);
+                },
+                deSlide() {
+                    this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.3, this.deviceWidth * 0.5, this.deviceHeight, 300);
+                },
+                bshortSlide() {
+                    this.swipeEx(this.deviceWidth * 0.5, this.deviceHeight * 0.8, this.deviceWidth * 0.5, this.deviceHeight * 0.8 - 500, 300);
+                },
+                slide() {
+                    this.swipeEx(this.deviceWidth * 0.8, this.deviceHeight * 0.7, this.deviceWidth * 0.8, 0, random(300, 500));
+                },
+                fanslide() {
+                    this.swipeEx(this.deviceWidth * 0.9, this.deviceHeight * 0.5, this.deviceWidth * 0.9, this.deviceHeight * 0.01, 500);
+                },
+                regionClick(region) {
+                    click(random(region[0], region[0] + region[2]), random(region[1], region[1] + region[3]));
+                },
+                boundsClick(bounds) {
+                    var x = bounds.width() * 0.2;
+                    var y = bounds.height() * 0.2;
+                    bounds.left += x;
+                    bounds.right -= x;
+                    bounds.top += y;
+                    bounds.bottom -= y;
+                    click(random(bounds.left, bounds.right), random(bounds.top, bounds.bottom));
+                },
+                sleepMs() {
+                    var argLen = arguments.length;
+                    let min = 0;
+                    let max = 0;
+                    if (argLen == 1) {
+                        min = arguments[0];
+                        max = arguments[0];
+                    } else {
+                        if (argLen < 2) {
+                            return;
+                        }
+                        min = arguments[0];
+                        max = arguments[1];
+                    }
+                    if (min >= max) {
+                        sleep(min);
+                    } else {
+                        sleep(random(min, max));
+                    }
+                },
+                sleep() {
+                    var argLen = arguments.length;
+                    let min = 0;
+                    let max = 0;
+                    if (argLen == 1) {
+                        min = arguments[0];
+                        max = arguments[0];
+                    } else {
+                        if (argLen < 2) {
+                            return;
+                        }
+                        min = arguments[0];
+                        max = arguments[1];
+                    }
+                    if (min >= max) {
+                        sleep(min * 1000);
+                    } else {
+                        sleep(random(min, max) * 1000);
+                    }
+                },
+                getUnix() {
+                    return parseInt(Date.now() / 1000);
+                }
+            };
+        },
+        871: (module, __unused_webpack_exports, __webpack_require__) => {
+            if (__webpack_require__.g.floatyToastWindow === undefined) {
+                __webpack_require__.g.floatyToastWindow = floaty.rawWindow(`
+     <frame gravity="center" w="*">
+         <text
+             id="text" text=""
+             w="wrap_content" h="wrap_content"
+             visibility="invisible"
+             bg="#1989fa" textColor="#ffffff"
+             paddingLeft="10" paddingRight="10" paddingTop="5" paddingBottom="5"
+             />
+     </frame>
+    `);
+                floatyToastWindow.setTouchable(false);
+                floatyToastWindow.setSize(-1, -2);
+                floatyToastWindow.setPosition(0, (ENV_CONF.screenHeight || device.height) * 0.75);
+            }
+            module.exports = {
+                currentRunPackage(packageName) {
+                    return currentPackage() == conf.packageName || (app.launch(conf.packageName), false);
+                },
+                packageInfo(packageName) {
+                    try {
+                        return context.getPackageManager().getPackageInfo(packageName, 0);
+                    } catch (e) {
+                        return null;
+                    }
+                },
+                checkVersion(packageName, versions) {
+                    var info = this.packageInfo(packageName);
+                    if (this.isEmpty(info)) {
+                        alert("请安装抖音!");
+                        return false;
+                    } else {
+                        packageName = app.getAppName(packageName);
+                        return !!versions.includes(info.versionName) || (alert("不支持 " + packageName + "(" + info.versionName + "),请安装支持版本!"), false);
+                    }
+                },
+                isEmpty(value) {
+                    switch (typeof value) {
+                        case "undefined":
+                            return true;
+                        case "string":
+                            if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length == 0) {
+                                return true;
+                            }
+                            break;
+                        case "boolean":
+                            if (value) {
+                                break;
+                            }
+                            return true;
+                        case "number":
+                            if (value === 0 || isNaN(value)) {
+                                return true;
+                            }
+                            break;
+                        case "object":
+                            if (value !== null && value.length !== 0) {
+                                for (var i in value) {
+                                    return false;
+                                }
+                            }
+                            return true;
+                    }
+                    return false;
+                },
+                checkProbability(value, hdfs) {
+                    var temp = random(1, 99);
+                    console.log(hdfs + "计算概率:" + temp + (temp < value ? "未超出" : "超出") + value);
+                    return temp < value;
+                },
+                strFindKeys(s, keys) {
+                    for (w of keys) {
+                        if (s.indexOf(w) != -1) {
+                            return w;
+                        }
+                    }
+                    return "";
+                },
+                error(packageName, e) {
+                    if (e.fileName) {
+                        packageName = this.packageInfo(packageName);
+                        let versionName = "未知版本";
+                        packageName = "版本号:" + (versionName = packageName && packageName.versionName ? packageName.versionName : versionName) + "\r\n";
+                        packageName = (packageName = (packageName += "错误:" + e.toString() + "\r\n") + ("模块:" + e.fileName.replace(".js", "") + "\r\n")) + ("错误码:" + e.lineNumber + "\r\n") + "====================================\r\n";
+                        files.write("/sdcard/error_bzy.log", packageName);
+                    } else {
+                        console.log("运行错误:", e.toString());
+                    }
+                },
+                inputShow() {
+                    for (var i = 0; auto.windows[i] != null; i++) {
+                        if (auto.windows[i].type == 2) {
+                            return true;
+                        }
+                    }
+                    return false;
+                },
+                inputHide() {
+                    while (this.inputShow()) {
+                        back();
+                        sleep(1000);
+                    }
+                },
+                toast(msg) {
+                    ui.run(function () {
+                        console.log(msg);
+                        floatyToastWindow.text.setText(msg);
+                        floatyToastWindow.text.attr("visibility", "visible");
+                    });
+                },
+                toastHide() {
+                    try {
+                        floatyToastWindow.text.attr("visibility", "invisible");
+                    } catch (e) {}
+                },
+                objectToStr(obj) {
+                    try {
+                        var str = obj.toString();
+                        var index = str.indexOf(";");
+                        if (index === -1) {
+                            return "";
+                        } else {
+                            return str.slice(0, index);
+                        }
+                    } catch (error) {
+                        return "";
+                    }
+                },
+                compareVersion(version1, version2) {
+                    var arr1 = version1.split(".");
+                    var arr2 = version2.split(".");
+                    var length1 = arr1.length;
+                    var length2 = arr2.length;
+                    var minlength = Math.min(length1, length2);
+                    let i = 0;
+                    for (i; i < minlength; i++) {
+                        var a = parseInt(arr1[i]);
+                        var b = parseInt(arr2[i]);
+                        if (b < a) {
+                            return 1;
+                        }
+                        if (a < b) {
+                            return -1;
+                        }
+                    }
+                    if (length2 < length1) {
+                        for (let j = i; j < length1; j++) {
+                            if (parseInt(arr1[j]) != 0) {
+                                return 1;
+                            }
+                        }
+                    } else if (length1 < length2) {
+                        for (let j = i; j < length2; j++) {
+                            if (parseInt(arr2[j]) != 0) {
+                                return -1;
+                            }
+                        }
+                    }
+                    return 0;
+                }
+            };
+        }
+    };
+    var __webpack_module_cache__ = {};
+    function __webpack_require__(moduleId) {
+        var cachedModule = __webpack_module_cache__[moduleId];
+        if (cachedModule === undefined) {
+            cachedModule = __webpack_module_cache__[moduleId] = {
+                exports: {}
+            };
+            __webpack_modules__[moduleId](cachedModule, cachedModule.exports, __webpack_require__);
+        }
+        return cachedModule.exports;
+    }
+    (() => {
+        __webpack_require__.g = function () {
+            if (typeof globalThis == "object") {
+                return globalThis;
+            }
+            try {
+                return this || new Function("return this")();
+            } catch (e) {
+                if (typeof window == "object") {
+                    return window;
+                }
+            }
+        }();
+    })();
+    var __webpack_exports__ = {};
+    (() => {
+        var conf = __webpack_require__(81);
+        var engine = __webpack_require__(557);
+        var utility = __webpack_require__(871);
+        var douyin = __webpack_require__(954);
+        var param = {
+            yxgs: 500,
+            czjg1: 3,
+            czjg2: 6,
+            gksj1: 5,
+            gksj2: 10,
+            tglv: true,
+            dz: 45,
+            gz: 5,
+            pl: 35,
+            txdz: 60,
+            pldz: 80,
+            plhs: conf.commonts,
+            gjcs: ["77396094576", "60866194851"],
+            pltp: true
+        };
+        var znzf = {
+            banben: parseFloat(context.getPackageManager().getPackageInfo("com.ss.android.ugc.aweme", 0).versionName) < 27.4,
+            init() {
+                return !!douyin.init() && !(typeof ENV_CONF != "undefined" && Object.assign(param, ENV_CONF), param.pl > 0 && param.plhs.length < 1 ? (alert("请设置评论话术"), 1) : douyin.isRecommend() ? (utility.toast("开始任务:智能涨粉"), engine.sleep(1), device.keepScreenDim(), douyin.popupAndClose(), 0) : (alert("请在抖音首页运行"), 1));
+            },
+            isUserList() {
+                var tab = className("androidx.appcompat.app.ActionBar$Tab").visibleToUser().selected().findOnce();
+                return tab !== null && (tab.findOne(textContains("粉丝")) !== null || tab.findOne(textContains("关注")) !== null);
+            },
+            toUserList() {
+                while (true) {
+                    sleep(2000);
+                    if (this.isUserList()) {
+                        return;
+                    }
+                    back();
+                    sleep(1000);
+                }
+            },
+            execUser() {
+                engine.sleep(param.czjg1, param.czjg2);
+                if (!douyin.isHome()) {
+                    utility.toast("进入主页失败");
+                    return false;
+                }
+                if (text("私密账号").visibleToUser().findOnce() !== null || text("帐号已被封禁").visibleToUser().findOnce() !== null) {
+                    utility.toast("私密或已封禁账号,跳过");
+                    return false;
+                }
+                if (param.tglv && className("android.widget.TextView").visibleToUser().id(douyin.getNode("user.lanv").id).findOnce() !== null) {
+                    utility.toast("蓝v用户,跳过!");
+                    return false;
+                }
+                let fansNum = 0;
+                var fansNode = id(douyin.getNode("user.fansnum").id).visibleToUser().findOnce();
+                if (fansNode && (fansText = fansNode.text(), fansNum = parseFloat(fansText), fansText.indexOf("w") >= 0 || fansText.indexOf("万") >= 0)) {
+                    fansNum *= 10000;
+                }
+                let gzNum = 0;
+                fansNode = id(douyin.getNode("user.gznum").id).visibleToUser().findOnce();
+                if (fansNode && (gzText = fansNode.text(), gzNum = parseFloat(gzText), gzText.indexOf("w") >= 0 || gzText.indexOf("万") >= 0)) {
+                    gzNum *= 10000;
+                }
+                if (gzNum - fansNum < 1000) {
+                    return false;
+                }
+                fansNode = textContains("作品").visibleToUser().findOnce();
+                let videoNum = 0;
+                if ((videoNum = fansNode ? parseInt(fansNode.text().replace(/[^0-9]/gi, "")) : videoNum) < 1 || isNaN(videoNum)) {
+                    utility.toast("该用户没有作品或非正常用户,跳过");
+                    return false;
+                }
+                if (this.banben && utility.checkProbability(param.txdz, "头像点赞")) {
+                    douyin.execTxdz();
+                    engine.sleepMs(1000, 2000);
+                }
+                if (utility.checkProbability(param.gz, "关注")) {
+                    if (followBtn = id(douyin.getNode("user.followBtn").id).visibleToUser().findOnce()) {
+                        utility.toast("执行关注!");
+                        followBtn.click();
+                        engine.sleepMs(500, 1000);
+                        gzCount++;
+                        if (followBtn = desc("更多,已展开").visibleToUser().findOne(5000)) {
+                            followBtn.click();
+                            engine.sleepMs(500, 1000);
+                        }
+                    } else {
+                        utility.toast("不关注!");
+                    }
+                }
+                var followBtn = utility.checkProbability(param.dz, "点赞");
+                var isPl = utility.checkProbability(param.pl, "评论");
+                if (followBtn || isPl) {
+                    if (!fansNode.selected()) {
+                        engine.boundsClick(fansNode.bounds());
+                        engine.sleepMs(1000, 2000);
+                    }
+                    engine.shortSlide();
+                    var fansNode = id("com.ss.android.ugc.aweme:id/container").visibleToUser().find();
+                    if (!fansNode.empty()) {
+                        let video = fansNode[random(0, fansNode.length - 1)];
+                        video = video.findOne(className("android.view.View"));
+                        sleep(1000);
+                        if (video && video.clickable() && video.click() && douyin.IsVideoDelay(5000)) {
+                            fansNode = random(param.gksj1, param.gksj2);
+                            utility.toast("观看视频:" + fansNode + " 秒");
+                            engine.sleep(fansNode);
+                            if (followBtn) {
+                                douyin.execLike();
+                                dzCount++;
+                            } else {
+                                utility.toast("不点赞");
+                            }
+                            if (isPl && douyin.canComment()) {
+                                fansNode = utility.checkProbability(param.pldz, "评论点赞");
+                                douyin.sendComment(param.plhs, isPl, fansNode, param.pltp);
+                                plCount++;
+                            } else {
+                                utility.toast("不评论");
+                            }
+                        } else {
+                            utility.toast("打开视频失败!");
+                            back();
+                            sleep(1000);
+                        }
+                    }
+                }
+                return true;
+            },
+            dbzhgjc(gjc) {
+                engine.sleepMs(1000, 2000);
+                id("com.ss.android.ugc.aweme:id/et_search_kw").visibleToUser().findOne().setText(gjc);
+                engine.sleepMs(1000, 2000);
+                var b1 = text("搜索").visibleToUser().findOne().bounds();
+                engine.boundsClick(b1);
+                engine.sleepMs(3000, 4000);
+                var b1 = text("用户").visibleToUser().findOne().bounds();
+                engine.boundsClick(b1);
+                engine.sleepMs(3000, 4000);
+                var b1 = descContains(gjc).visibleToUser().findOne(5000);
+                if (b1 === null) {
+                    alert("没有找到对标账号", "请检查对标账号 " + gjc + " 是否输入正确!");
+                    return false;
+                } else {
+                    engine.boundsClick(b1.bounds());
+                    engine.sleepMs(3000, 4000);
+                    text("粉丝").visibleToUser().findOne().parent().click();
+                    engine.sleepMs(3000, 4000);
+                    return !!id("com.ss.android.ugc.aweme:id/root_layout").exists() || (alert("打开粉丝列表失败", "对标账号 " + gjc + " 粉丝列表可能设置隐私了!"), false);
+                }
+            },
+            run() {
+                if (this.init()) {
+                    let runCount = dzCount = gzCount = plCount = 0;
+                    var userContents = [];
+                    let gjcsCount = 0;
+                    let dyc = true;
+                    while (true) {
+                        if (dyc && (descStartsWith("搜索").descEndsWith("按钮").visibleToUser().findOne().parent().click(), dyc = false, !this.dbzhgjc(param.gjcs[gjcsCount]))) {
+                            break;
+                        }
+                        if (runCount >= param.yxgs) {
+                            device.cancelKeepingAwake();
+                            alert("恭喜任务完成!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
+                            return;
+                        }
+                        let listBox = className("androidx.recyclerview.widget.RecyclerView").visibleToUser().findOne();
+                        if (!listBox) {
+                            utility.toast("没有找到用户列表!");
+                            return;
+                        }
+                        var listBoxTop = listBox.bounds().top;
+                        var childCount = listBox.childCount();
+                        for (let i = 0; i < childCount - 1; i++) {
+                            if (runCount >= param.yxgs) {
+                                device.cancelKeepingAwake();
+                                alert("恭喜任务完成!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
+                                return;
+                            }
+                            utility.toast("已执行用户 " + runCount + " 条,任务数" + param.yxgs);
+                            var child = listBox.child(i);
+                            if (child != null && listBoxTop < child.bounds().top && !child.findOne(desc("已关注"))) {
+                                var userNode = child.findOne(className("android.widget.TextView"));
+                                if (userNode) {
+                                    userNode = userNode.text();
+                                    if (!utility.isEmpty(userNode) && !userContents.includes(userNode)) {
+                                        console.log(userNode);
+                                        if (userContents.length >= 20) {
+                                            userContents.shift();
+                                        }
+                                        userContents.push(userNode);
+                                        try {
+                                            child.click();
+                                            if (this.execUser()) {
+                                                runCount++;
+                                            }
+                                        } catch (error) {
+                                            console.log("用户操作失败:", error);
+                                        }
+                                        utility.toast("返回用户列表");
+                                        this.toUserList();
+                                        engine.sleepMs(2000, 3000);
+                                        if (!(listBox = className("androidx.recyclerview.widget.RecyclerView").visibleToUser().findOne())) {
+                                            utility.toast("没有找到用户列表!");
+                                            return;
+                                        }
+                                    }
+                                } else {
+                                    console.log("没有获取到用户信息");
+                                }
+                            }
+                        }
+                        if (!listBox.scrollForward()) {
+                            if (++gjcsCount >= param.gjcs.length) {
+                                alert("对标账号已全部运行完!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
+                                break;
+                            }
+                            engine.sleepMs(3000, 4000);
+                            back();
+                            engine.sleepMs(3000, 4000);
+                            back();
+                            engine.sleepMs(3000, 4000);
+                            if (!this.dbzhgjc(param.gjcs[gjcsCount])) {
+                                break;
+                            }
+                        }
+                        engine.sleepMs(2500, 3500);
+                    }
+                }
+            }
+        };
+        try {
+            znzf.run();
+        } catch (error) {
+            utility.error(conf.packageName, error);
+        } finally {
+            engine.exit();
+        }
+    })();
+})();

+ 923 - 0
webpack-script/src/common/node.js

@@ -0,0 +1,923 @@
+var nodes = {
+    all: {
+        index: {
+            headimg: {
+                id: "com.ss.android.ugc.aweme:id/user_avatar"
+            },
+            desc: {
+                id: "com.ss.android.ugc.aweme:id/desc"
+            },
+            title: {
+                id: "com.ss.android.ugc.aweme:id/title"
+            },
+            searchInput: {
+                id: "com.ss.android.ugc.aweme:id/et_search_kw"
+            }
+        }
+    },
+    "26.0.0": {
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dc7"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/er2"
+            }
+        },
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/er-"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/t5o"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/w8o"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/w8s"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/nsc"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/w9h"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/po9"
+            }
+        },
+        live: {
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/mwq"
+            },
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/xzb"
+            }
+        }
+    },
+    "27.0.0": {
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dh7"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/eyg"
+            }
+        },
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/eyp"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/vkl"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/yr5"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/yr9"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/ohq"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/ys7"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/qpd"
+            }
+        },
+        live: {
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/njx"
+            },
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/zkc"
+            }
+        }
+    },
+    "27.3.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/e3z"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dms"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/e3p"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v0f"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/y=3"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/y=7"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/oth"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/y_7"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q1y"
+            }
+        },
+        live: {
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nu1"
+            },
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/z35"
+            }
+        }
+    },
+    "27.4.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/e3="
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dm2"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/e30"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v0u"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/y_h"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/y_l"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/os-"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/y-k"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q19"
+            }
+        },
+        live: {
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nuw"
+            },
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/z4t"
+            }
+        }
+    },
+    "27.5.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/e3+"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dnm"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/e33"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v1f"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/y-e"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/y-i"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/osz"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/y+h"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q2n"
+            }
+        },
+        live: {
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nuh"
+            },
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/z5o"
+            }
+        }
+    },
+    "27.6.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/e5o"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dow"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/e5e"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v2+"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/y+-"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zac"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/ouo"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/za+"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q4b"
+            }
+        },
+        live: {
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nv8"
+            },
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/z7s"
+            }
+        }
+    },
+    "27.7.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/exn"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/df+"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/exd"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v83"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zic"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zig"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/ov4"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zjf"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q6o"
+            }
+        },
+        live: {
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nsz"
+            },
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0cc"
+            }
+        }
+    },
+    "27.8.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/eyq"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dg_"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/eyg"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v_e"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zku"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zky"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/oyz"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zlu"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q72"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0ew"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nwv"
+            }
+        }
+    },
+    "27.9.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/ezh"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dhs"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ey="
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/waf"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zn6"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zn="
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/o0p"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zo7"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q97"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0h="
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nz9"
+            }
+        }
+    },
+    "28.0.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/ezh"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dho"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ey="
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/wcy"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zqq"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zqu"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/o13"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zrr"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q_r"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0kz"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/n19"
+            }
+        }
+    },
+    "28.1.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/ezy"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/dh0"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ezo"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/wd8"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zrs"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zrw"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/o2_"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zsu"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q-1"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0lw"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/n3u"
+            }
+        }
+    },
+    "28.2.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/efs"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c1a"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/efi"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/vsx"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/y6j"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/y6n"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/oe9"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/y7f"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/qod"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/zzu"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nbk"
+            }
+        }
+    },
+    "28.3.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/egc"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c1r"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ef6"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/vvo"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/y9g"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/y9k"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/og0"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/y=c"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/qp-"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/z2s"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nc4"
+            }
+        }
+    },
+    "28.4.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/ehq"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c2="
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ehf"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v09"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zbf"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zbj"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/old"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zcb"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/qu-"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/z9i"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/ng7"
+            }
+        }
+    },
+    "28.5.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/eio"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c31"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/eid"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v3+"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zex"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/ze1"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/on1"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zft"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/qx3"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/z-5"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nje"
+            }
+        }
+    },
+    "28.6.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/ei-"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c4g"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ei1"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v7c"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zh="
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zia"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/op1"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zi7"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/qz9"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0ck"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nk-"
+            }
+        }
+    },
+    "28.7.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/ejz"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c41"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ejo"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v97"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zk="
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zla"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/ory"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zl6"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q2d"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0fr"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nm6"
+            }
+        }
+    },
+    "28.8.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/ekj"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c5g"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/ej-"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/v+_"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zph"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zpl"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/ot-"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zqd"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q47"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0jz"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nor"
+            }
+        }
+    },
+    "28.9.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/el2"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c6w"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/elr"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/wej"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zt8"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zt-"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/owx"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zu4"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q7="
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0ol"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nrb"
+            }
+        }
+    },
+    "29.0.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/el5"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c6v"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/elu"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/wgx"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/zxf"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/zxj"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/ox2"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/zyb"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q9u"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0r0"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nrq"
+            }
+        }
+    },
+    "29.1.0": {
+        video: {
+            like: {
+                id: "com.ss.android.ugc.aweme:id/emy"
+            }
+        },
+        comment: {
+            button: {
+                id: "com.ss.android.ugc.aweme:id/c7i"
+            },
+            zan: {
+                id: "com.ss.android.ugc.aweme:id/eml"
+            }
+        },
+        user: {
+            homeMark: {
+                id: "com.ss.android.ugc.aweme:id/poo"
+            },
+            gznum: {
+                id: "com.ss.android.ugc.aweme:id/z1u"
+            },
+            fansnum: {
+                id: "com.ss.android.ugc.aweme:id/z1y"
+            },
+            username: {
+                id: "com.ss.android.ugc.aweme:id/o07"
+            },
+            lanv: {
+                id: "com.ss.android.ugc.aweme:id/z2q"
+            },
+            followBtn: {
+                id: "com.ss.android.ugc.aweme:id/q-z"
+            }
+        },
+        live: {
+            userlistbox: {
+                id: "com.ss.android.ugc.aweme:id/0wc"
+            },
+            msglistbox: {
+                id: "com.ss.android.ugc.aweme:id/nv_"
+            }
+        }
+    }
+};
+module.exports = nodes;
+

+ 166 - 0
webpack-script/src/common/utility.js

@@ -0,0 +1,166 @@
+const {packageName} = require("./conf");
+if (global.floatyToastWindow === undefined) {
+    global.floatyToastWindow = floaty.rawWindow(`
+      <frame gravity="center" w="*">
+          <text 
+              id="text" text="" 
+              w="wrap_content" h="wrap_content"
+              visibility="invisible"  
+              bg="#1989fa" textColor="#ffffff" 
+              paddingLeft="10" paddingRight="10" paddingTop="5" paddingBottom="5"
+              />
+      </frame>
+     `);
+    floatyToastWindow.setTouchable(false);
+    floatyToastWindow.setSize(-1, -2);
+    floatyToastWindow.setPosition(0, (ENV_CONF.screenHeight || device.height) * 0.75);
+}
+
+module.exports = {
+    currentRunPackage(packageName) {
+        return currentPackage() == packageName || (app.launch(conf.packageName), false);
+    },
+    packageInfo(packageName) {
+        try {
+            return context.getPackageManager().getPackageInfo(packageName, 0);
+        } catch (e) {
+            return null;
+        }
+    },
+    checkVersion(packageName, versions) {
+        var info = this.packageInfo(packageName);
+        if (this.isEmpty(info)) {
+            alert("请安装抖音!");
+            return false;
+        } else {
+            packageName = app.getAppName(packageName);
+            return !!versions.includes(info.versionName) || (alert("不支持 " + packageName + "(" + info.versionName + "),请安装支持版本!"), false);
+        }
+    },
+    isEmpty(value) {
+        switch (typeof value) {
+            case "undefined":
+                return true;
+            case "string":
+                if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, "").length == 0) {
+                    return true;
+                }
+                break;
+            case "boolean":
+                if (value) {
+                    break;
+                }
+                return true;
+            case "number":
+                if (value === 0 || isNaN(value)) {
+                    return true;
+                }
+                break;
+            case "object":
+                if (value !== null && value.length !== 0) {
+                    for (var i in value) {
+                        return false;
+                    }
+                }
+                return true;
+        }
+        return false;
+    },
+    checkProbability(value, hdfs) {
+        var temp = random(1, 99);
+        console.log(hdfs + "计算概率:" + temp + (temp < value ? "未超出" : "超出") + value);
+        return temp < value;
+    },
+    strFindKeys(s, keys) {
+        for (w of keys) {
+            if (s.indexOf(w) != -1) {
+                return w;
+            }
+        }
+        return "";
+    },
+    error(packageName, e) {
+        if (e.fileName) {
+            packageName = this.packageInfo(packageName);
+            let versionName = "未知版本";
+            packageName = "版本号:" + (versionName = packageName && packageName.versionName ? packageName.versionName : versionName) + "\r\n";
+            packageName = (packageName = (packageName += "错误:" + e.toString() + "\r\n") + ("模块:" + e.fileName.replace(".js", "") + "\r\n")) + ("错误码:" + e.lineNumber + "\r\n") + "====================================\r\n";
+            files.write("/sdcard/error_bzy.log", packageName);
+        } else {
+            console.log("运行错误:", e.toString());
+        }
+    },
+    inputShow() {
+        for (var i = 0; auto.windows[i] != null; i++) {
+            if (auto.windows[i].type == 2) {
+                return true;
+            }
+        }
+        return false;
+    },
+    inputHide() {
+        while (this.inputShow()) {
+            back();
+            sleep(1000);
+        }
+    },
+    toast(msg) {
+        ui.run(function () {
+            console.log(msg);
+            floatyToastWindow.text.setText(msg);
+            floatyToastWindow.text.attr("visibility", "visible");
+        });
+    },
+    toastHide() {
+        try {
+            floatyToastWindow.text.attr("visibility", "invisible");
+        } catch (e) {
+        }
+    },
+    objectToStr(obj) {
+        try {
+            var str = obj.toString();
+            var index = str.indexOf(";");
+            if (index === -1) {
+                return "";
+            } else {
+                return str.slice(0, index);
+            }
+        } catch (error) {
+            return "";
+        }
+    },
+    compareVersion(version1, version2) {
+        var arr1 = version1.split(".");
+        var arr2 = version2.split(".");
+        var length1 = arr1.length;
+        var length2 = arr2.length;
+        var minlength = Math.min(length1, length2);
+        let i = 0;
+        for (i; i < minlength; i++) {
+            var a = parseInt(arr1[i]);
+            var b = parseInt(arr2[i]);
+            if (b < a) {
+                return 1;
+            }
+            if (a < b) {
+                return -1;
+            }
+        }
+        if (length2 < length1) {
+            for (let j = i; j < length1; j++) {
+                if (parseInt(arr1[j]) != 0) {
+                    return 1;
+                }
+            }
+        } else if (length1 < length2) {
+            for (let j = i; j < length2; j++) {
+                if (parseInt(arr2[j]) != 0) {
+                    return -1;
+                }
+            }
+        }
+        return 0;
+    }
+};
+

+ 238 - 0
webpack-script/src/znzf.js

@@ -0,0 +1,238 @@
+const douyin = require("./common/douyin");
+const conf = require("./common/conf");
+const engine = require("./common/engine");
+const utility = require("./common/utility");
+var param = {
+    yxgs: 500,
+    czjg1: 3,
+    czjg2: 6,
+    gksj1: 5,
+    gksj2: 10,
+    tglv: true,
+    dz: 45,
+    gz: 5,
+    pl: 35,
+    txdz: 60,
+    pldz: 80,
+    plhs: conf.commonts,
+    gjcs: ["77396094576", "60866194851"],
+    pltp: true
+};
+var znzf = {
+    banben: parseFloat(context.getPackageManager().getPackageInfo("com.ss.android.ugc.aweme", 0).versionName) < 27.4,
+    init() {
+        return !!douyin.init() && !(typeof ENV_CONF != "undefined" && Object.assign(param, ENV_CONF), param.pl > 0 && param.plhs.length < 1 ? (alert("请设置评论话术"), 1) : douyin.isRecommend() ? (utility.toast("开始任务:智能涨粉"), engine.sleep(1), device.keepScreenDim(), douyin.popupAndClose(), 0) : (alert("请在抖音首页运行"), 1));
+    },
+    isUserList() {
+        var tab = className("androidx.appcompat.app.ActionBar$Tab").visibleToUser().selected().findOnce();
+        return tab !== null && (tab.findOne(textContains("粉丝")) !== null || tab.findOne(textContains("关注")) !== null);
+    },
+    toUserList() {
+        while (true) {
+            sleep(2000);
+            if (this.isUserList()) {
+                return;
+            }
+            back();
+            sleep(1000);
+        }
+    },
+    execUser() {
+        engine.sleep(param.czjg1, param.czjg2);
+        if (!douyin.isHome()) {
+            utility.toast("进入主页失败");
+            return false;
+        }
+        if (text("私密账号").visibleToUser().findOnce() !== null || text("帐号已被封禁").visibleToUser().findOnce() !== null) {
+            utility.toast("私密或已封禁账号,跳过");
+            return false;
+        }
+        if (param.tglv && className("android.widget.TextView").visibleToUser().id(douyin.getNode("user.lanv").id).findOnce() !== null) {
+            utility.toast("蓝v用户,跳过!");
+            return false;
+        }
+        let fansNum = 0;
+        var fansNode = id(douyin.getNode("user.fansnum").id).visibleToUser().findOnce();
+        if (fansNode && (fansText = fansNode.text(), fansNum = parseFloat(fansText), fansText.indexOf("w") >= 0 || fansText.indexOf("万") >= 0)) {
+            fansNum *= 10000;
+        }
+        let gzNum = 0;
+        fansNode = id(douyin.getNode("user.gznum").id).visibleToUser().findOnce();
+        if (fansNode && (gzText = fansNode.text(), gzNum = parseFloat(gzText), gzText.indexOf("w") >= 0 || gzText.indexOf("万") >= 0)) {
+            gzNum *= 10000;
+        }
+        if (gzNum - fansNum < 1000) {
+            return false;
+        }
+        fansNode = textContains("作品").visibleToUser().findOnce();
+        let videoNum = 0;
+        if ((videoNum = fansNode ? parseInt(fansNode.text().replace(/[^0-9]/gi, "")) : videoNum) < 1 || isNaN(videoNum)) {
+            utility.toast("该用户没有作品或非正常用户,跳过");
+            return false;
+        }
+        if (this.banben && utility.checkProbability(param.txdz, "头像点赞")) {
+            douyin.execTxdz();
+            engine.sleepMs(1000, 2000);
+        }
+        if (utility.checkProbability(param.gz, "关注")) {
+            if (followBtn = id(douyin.getNode("user.followBtn").id).visibleToUser().findOnce()) {
+                utility.toast("执行关注!");
+                followBtn.click();
+                engine.sleepMs(500, 1000);
+                gzCount++;
+                if (followBtn = desc("更多,已展开").visibleToUser().findOne(5000)) {
+                    followBtn.click();
+                    engine.sleepMs(500, 1000);
+                }
+            } else {
+                utility.toast("不关注!");
+            }
+        }
+        var followBtn = utility.checkProbability(param.dz, "点赞");
+        var isPl = utility.checkProbability(param.pl, "评论");
+        if (followBtn || isPl) {
+            if (!fansNode.selected()) {
+                engine.boundsClick(fansNode.bounds());
+                engine.sleepMs(1000, 2000);
+            }
+            engine.shortSlide();
+            var fansNode = id("com.ss.android.ugc.aweme:id/container").visibleToUser().find();
+            if (!fansNode.empty()) {
+                let video = fansNode[random(0, fansNode.length - 1)];
+                video = video.findOne(className("android.view.View"));
+                sleep(1000);
+                if (video && video.clickable() && video.click() && douyin.IsVideoDelay(5000)) {
+                    fansNode = random(param.gksj1, param.gksj2);
+                    utility.toast("观看视频:" + fansNode + " 秒");
+                    engine.sleep(fansNode);
+                    if (followBtn) {
+                        douyin.execLike();
+                        dzCount++;
+                    } else {
+                        utility.toast("不点赞");
+                    }
+                    if (isPl && douyin.canComment()) {
+                        fansNode = utility.checkProbability(param.pldz, "评论点赞");
+                        douyin.sendComment(param.plhs, isPl, fansNode, param.pltp);
+                        plCount++;
+                    } else {
+                        utility.toast("不评论");
+                    }
+                } else {
+                    utility.toast("打开视频失败!");
+                    back();
+                    sleep(1000);
+                }
+            }
+        }
+        return true;
+    },
+    dbzhgjc(gjc) {
+        engine.sleepMs(1000, 2000);
+        id("com.ss.android.ugc.aweme:id/et_search_kw").visibleToUser().findOne().setText(gjc);
+        engine.sleepMs(1000, 2000);
+        var b1 = text("搜索").visibleToUser().findOne().bounds();
+        engine.boundsClick(b1);
+        engine.sleepMs(3000, 4000);
+        var b1 = text("用户").visibleToUser().findOne().bounds();
+        engine.boundsClick(b1);
+        engine.sleepMs(3000, 4000);
+        var b1 = descContains(gjc).visibleToUser().findOne(5000);
+        if (b1 === null) {
+            alert("没有找到对标账号", "请检查对标账号 " + gjc + " 是否输入正确!");
+            return false;
+        } else {
+            engine.boundsClick(b1.bounds());
+            engine.sleepMs(3000, 4000);
+            text("粉丝").visibleToUser().findOne().parent().click();
+            engine.sleepMs(3000, 4000);
+            return !!id("com.ss.android.ugc.aweme:id/root_layout").exists() || (alert("打开粉丝列表失败", "对标账号 " + gjc + " 粉丝列表可能设置隐私了!"), false);
+        }
+    },
+    run() {
+        if (this.init()) {
+            let runCount = dzCount = gzCount = plCount = 0;
+            var userContents = [];
+            let gjcsCount = 0;
+            let dyc = true;
+            while (true) {
+                if (dyc && (descStartsWith("搜索").descEndsWith("按钮").visibleToUser().findOne().parent().click(), dyc = false, !this.dbzhgjc(param.gjcs[gjcsCount]))) {
+                    break;
+                }
+                if (runCount >= param.yxgs) {
+                    device.cancelKeepingAwake();
+                    alert("恭喜任务完成!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
+                    return;
+                }
+                let listBox = className("androidx.recyclerview.widget.RecyclerView").visibleToUser().findOne();
+                if (!listBox) {
+                    utility.toast("没有找到用户列表!");
+                    return;
+                }
+                var listBoxTop = listBox.bounds().top;
+                var childCount = listBox.childCount();
+                for (let i = 0; i < childCount - 1; i++) {
+                    if (runCount >= param.yxgs) {
+                        device.cancelKeepingAwake();
+                        alert("恭喜任务完成!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
+                        return;
+                    }
+                    utility.toast("已执行用户 " + runCount + " 条,任务数" + param.yxgs);
+                    var child = listBox.child(i);
+                    if (child != null && listBoxTop < child.bounds().top && !child.findOne(desc("已关注"))) {
+                        var userNode = child.findOne(className("android.widget.TextView"));
+                        if (userNode) {
+                            userNode = userNode.text();
+                            if (!utility.isEmpty(userNode) && !userContents.includes(userNode)) {
+                                console.log(userNode);
+                                if (userContents.length >= 20) {
+                                    userContents.shift();
+                                }
+                                userContents.push(userNode);
+                                try {
+                                    child.click();
+                                    if (this.execUser()) {
+                                        runCount++;
+                                    }
+                                } catch (error) {
+                                    console.log("用户操作失败:", error);
+                                }
+                                utility.toast("返回用户列表");
+                                this.toUserList();
+                                engine.sleepMs(2000, 3000);
+                                if (!(listBox = className("androidx.recyclerview.widget.RecyclerView").visibleToUser().findOne())) {
+                                    utility.toast("没有找到用户列表!");
+                                    return;
+                                }
+                            }
+                        } else {
+                            console.log("没有获取到用户信息");
+                        }
+                    }
+                }
+                if (!listBox.scrollForward()) {
+                    if (++gjcsCount >= param.gjcs.length) {
+                        alert("对标账号已全部运行完!", "本次任务共完成\n点赞" + dzCount + "次\n关注" + gzCount + "次\n评论" + plCount + "次");
+                        break;
+                    }
+                    engine.sleepMs(3000, 4000);
+                    back();
+                    engine.sleepMs(3000, 4000);
+                    back();
+                    engine.sleepMs(3000, 4000);
+                    if (!this.dbzhgjc(param.gjcs[gjcsCount])) {
+                        break;
+                    }
+                }
+                engine.sleepMs(2500, 3500);
+            }
+        }
+    }
+};
+try {
+    znzf.run();
+} catch (error) {
+    utility.error(conf.packageName, error);
+} finally {
+    engine.exit();
+}

+ 39 - 0
webpack-script/webpack.config.js

@@ -0,0 +1,39 @@
+const path = require('path');
+const TerserPlugin = require('terser-webpack-plugin');
+
+const JavascriptObfuscator = require("webpack-obfuscator");
+
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
+
+module.exports = {
+    entry: {
+        znzf: './src/znzf.js'
+    }, // 入口文件路径
+    output: {
+        // filename: 'bundle.js', // 输出文件名称
+        filename: '[name].js',
+        path: path.resolve(__dirname, 'dist') // 输出文件存放位置(此处为 dist 目录)
+    },
+    optimization: {
+        minimize: false,
+        minimizer: [
+            new UglifyJsPlugin({
+                uglifyOptions: {
+                    output: {
+                        comments: false
+                    }
+                }
+            }),
+            new TerserPlugin({
+                terserOptions: {
+                    output: {
+                        comments: false,
+                    },
+                },
+            }),
+        ]
+    },
+    plugins: [
+    ],
+    mode: 'production'  //production
+};

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov