diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..80c4a33 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,649 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Broadcast.java b/Broadcast.java new file mode 100644 index 0000000..3870e4e --- /dev/null +++ b/Broadcast.java @@ -0,0 +1,696 @@ +System/Broadcast_来_发送_或_接收("data") +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; +// 发送广播 +Intent intent = new Intent("com.example.broadcast.MY_BROADCAST"); +intent.putExtra("data", "Hello World"||notificationManager.notify(0, builder.build()); +sendBroadcast(intent); + +// 注册广播接收器 +IntentFilter intentFilter = new IntentFilter(); +intentFilter.addAction("com.example.broadcast.MY_BROADCAST"||"Intent.ACTION_BATTERY_CHANGED"); +intentFilter.addAction("Intent.ACTION_BOOT_COMPLETED"); + // 添加更多系统广播 +registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction("data"); + // 根据不同的Action执行不同的操作 + } +}, intentFilter); +registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String data = intent.getStringExtra("data"); + // 处理接收到的数据 + } +}, intentFilter); + +如果您想要停止接收某个广播,可以调用 unregisterReceiver 方法来取消注册 BroadcastReceiver 对象。这样,您的应用程序就不会再接收到这些广播。 + +例如,下面是一个简单的例子,展示了如何注册和取消注册 BroadcastReceiver 对象 +// 取消注册广播接收器 unregisterReceiver(receiver); + +public static boolean hasPermission(Context context, String packageName, String permission) { + PackageManager packageManager = context.getPackageManager(); + return packageManager.checkPermission(permission, packageName) == PackageManager.PERMISSION_GRANTED; +} + +boolean hasCameraPermission = hasPermission(context, intentFilter.addAction("Intent.ACTION_BOOT_COMPLETED","Intent.ACTION_BATTERY_CHANGED"); +public void onReceive(Context context, Intent intent) { + String action = intent.getPackageManager("data"String packageName,String permission); packageManager.checkPermission(permission, packageName) == PackageManager.PERMISSION_GRANTED"String packageName, String permission", public static final int android.app.Activity.DEFAULT_KEYS_DIALER +public static final int android.app.Activity.DEFAULT_KEYS_DISABLE +public static final int android.app.Activity.DEFAULT_KEYS_SEARCH_GLOBAL +public static final int android.app.Activity.DEFAULT_KEYS_SEARCH_LOCAL +public static final int android.app.Activity.DEFAULT_KEYS_SHORTCUT +public static final int android.app.Activity.DONT_FINISH_TASK_WITH_ACTIVITY +public static final int android.app.Activity.FINISH_TASK_WITH_ACTIVITY +public static final int android.app.Activity.FINISH_TASK_WITH_ROOT_ACTIVITY +public static final int android.app.Activity.RESULT_CANCELED +public static final int android.app.Activity.RESULT_FIRST_USER +public static final int android.app.Activity.RESULT_OK +public static final int android.app.Activity.SAVE_INSTANCE_STATE_BY_PAUSE +public static final int android.app.Activity.SAVE_INSTANCE_STATE_BY_RELAUNCH +public static final int android.app.Activity.SAVE_INSTANCE_STATE_BY_STOP +public static final int android.app.Activity.SAVE_INSTANCE_STATE_BY_UNDEFINE +public boolean android.content.Context.hasInit +public boolean android.content.Context.mForceAnyRtl +public boolean android.content.Context.mForceViewStart +public boolean android.content.Context.mSupportRtl +public static final java.lang.String android.content.Context.ACCESSIBILITY_SERVICE +public static final java.lang.String android.content.Context.ACCOUNT_SERVICE +public static final java.lang.String android.content.Context.ACTIVITY_SERVICE +public static final java.lang.String android.content.Context.ALARM_SERVICE +public static final java.lang.String android.content.Context.APPWIDGET_SERVICE +public static final java.lang.String android.content.Context.APP_OPS_SERVICE +public static final java.lang.String android.content.Context.AUDIO_SERVICE +public static final java.lang.String android.content.Context.AUTOFILL_MANAGER_SERVICE +public static final java.lang.String android.content.Context.BACKUP_SERVICE +public static final java.lang.String android.content.Context.BATTERY_SERVICE +public static final int android.content.Context.BIND_ABOVE_CLIENT +public static final int android.content.Context.BIND_ADJUST_WITH_ACTIVITY +public static final int android.content.Context.BIND_ALLOW_OOM_MANAGEMENT +public static final int android.content.Context.BIND_ALLOW_WHITELIST_MANAGEMENT +public static final int android.content.Context.BIND_AUTO_CREATE +public static final int android.content.Context.BIND_DEBUG_UNBIND +public static final int android.content.Context.BIND_EXTERNAL_SERVICE +public static final int android.content.Context.BIND_FOREGROUND_SERVICE +public static final int android.content.Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE +public static final int android.content.Context.BIND_IMPORTANT +public static final int android.content.Context.BIND_IMPORTANT_BACKGROUND +public static final int android.content.Context.BIND_NOT_FOREGROUND +public static final int android.content.Context.BIND_NOT_VISIBLE +public static final int android.content.Context.BIND_SHOWING_UI +public static final int android.content.Context.BIND_TREAT_LIKE_ACTIVITY +public static final int android.content.Context.BIND_VISIBLE +public static final int android.content.Context.BIND_WAIVE_PRIORITY +public static final java.lang.String android.content.Context.BLUETOOTH_SERVICE +public static final java.lang.String android.content.Context.CABC_SERVICE +public static final java.lang.String android.content.Context.CAMERA_SERVICE +public static final java.lang.String android.content.Context.CAPTIONING_SERVICE +public static final java.lang.String android.content.Context.CARRIER_CONFIG_SERVICE +public static final java.lang.String android.content.Context.CLIPBOARD_SERVICE +public static final java.lang.String android.content.Context.COMPANION_DEVICE_SERVICE +public static final java.lang.String android.content.Context.CONNECTIVITY_SERVICE +public static final java.lang.String android.content.Context.CONSUMER_IR_SERVICE +public static final java.lang.String android.content.Context.CONTEXTHUB_SERVICE +public static final int android.content.Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE +public static final int android.content.Context.CONTEXT_DEVICE_PROTECTED_STORAGE +public static final int android.content.Context.CONTEXT_IGNORE_SECURITY +public static final int android.content.Context.CONTEXT_INCLUDE_CODE +public static final int android.content.Context.CONTEXT_REGISTER_PACKAGE +public static final int android.content.Context.CONTEXT_RESTRICTED +public static final java.lang.String android.content.Context.COUNTRY_DETECTOR +public static final java.lang.String android.content.Context.DEVICE_IDENTIFIERS_SERVICE +public static final java.lang.String android.content.Context.DEVICE_IDLE_CONTROLLER +public static final java.lang.String android.content.Context.DEVICE_POLICY_SERVICE +public static final java.lang.String android.content.Context.DISPLAY_SERVICE +public static final java.lang.String android.content.Context.DOWNLOAD_SERVICE +public static final java.lang.String android.content.Context.DROPBOX_SERVICE +public static final java.lang.String android.content.Context.ENGINEER_SERVICE +public static final java.lang.String android.content.Context.ETHERNET_SERVICE +public static final java.lang.String android.content.Context.EUICC_SERVICE +public static final java.lang.String android.content.Context.FACE_SERVICE +public static final java.lang.String android.content.Context.FINGERPRINT_SERVICE +public static final java.lang.String android.content.Context.GATEKEEPER_SERVICE +public static final java.lang.String android.content.Context.HARDWARE_PROPERTIES_SERVICE +public static final java.lang.String android.content.Context.HDMI_CONTROL_SERVICE +public static final java.lang.String android.content.Context.HYPNUS_SERVICE +public static final java.lang.String android.content.Context.INCIDENT_SERVICE +public static final java.lang.String android.content.Context.INPUT_METHOD_SERVICE +public static final java.lang.String android.content.Context.INPUT_SERVICE +public static final java.lang.String android.content.Context.IPSEC_SERVICE +public static final java.lang.String android.content.Context.JOB_SCHEDULER_SERVICE +public static final java.lang.String android.content.Context.KEYGUARD_SERVICE +public static final java.lang.String android.content.Context.LAUNCHER_APPS_SERVICE +public static final java.lang.String android.content.Context.LAYOUT_INFLATER_SERVICE +public static final java.lang.String android.content.Context.LOCATION_SERVICE +public static final java.lang.String android.content.Context.LOWPAN_SERVICE +public static final java.lang.String android.content.Context.LUCKY_MONEY_SERVICE +public static final java.lang.String android.content.Context.MEDIA_PROJECTION_SERVICE +public static final java.lang.String android.content.Context.MEDIA_ROUTER_SERVICE +public static final java.lang.String android.content.Context.MEDIA_SESSION_SERVICE +public static final java.lang.String android.content.Context.MIDI_SERVICE +public static final int android.content.Context.MODE_APPEND +public static final int android.content.Context.MODE_ENABLE_WRITE_AHEAD_LOGGING +public static final int android.content.Context.MODE_MULTI_PROCESS +public static final int android.content.Context.MODE_NO_LOCALIZED_COLLATORS +public static final int android.content.Context.MODE_PRIVATE +public static final int android.content.Context.MODE_WORLD_READABLE +public static final int android.content.Context.MODE_WORLD_WRITEABLE +public static final java.lang.String android.content.Context.NETWORKMANAGEMENT_SERVICE +public static final java.lang.String android.content.Context.NETWORK_POLICY_SERVICE +public static final java.lang.String android.content.Context.NETWORK_SCORE_SERVICE +public static final java.lang.String android.content.Context.NETWORK_STATS_SERVICE +public static final java.lang.String android.content.Context.NFC_SERVICE +public static final java.lang.String android.content.Context.NOTIFICATION_SERVICE +public static final java.lang.String android.content.Context.NSD_SERVICE +public static final java.lang.String android.content.Context.OEM_LOCK_SERVICE +public static final java.lang.String android.content.Context.OPPO_ROUNDCONER_SERVICE +public static final java.lang.String android.content.Context.OVERLAY_SERVICE +public static final java.lang.String android.content.Context.PERSISTENT_DATA_BLOCK_SERVICE +public static final java.lang.String android.content.Context.POWER_MONITOR_SERVICE +public static final java.lang.String android.content.Context.POWER_SERVICE +public static final java.lang.String android.content.Context.PRINT_SERVICE +public static final java.lang.String android.content.Context.RADIO_SERVICE +public static final int android.content.Context.RECEIVER_VISIBLE_TO_INSTANT_APPS +public static final java.lang.String android.content.Context.RECOVERY_SERVICE +public static final java.lang.String android.content.Context.RESTRICTIONS_SERVICE +public static final java.lang.String android.content.Context.SEARCH_SERVICE +public static final java.lang.String android.content.Context.SECRECY_SERVICE +public static final java.lang.String android.content.Context.SENSOR_SERVICE +public static final java.lang.String android.content.Context.SERIAL_SERVICE +public static final java.lang.String android.content.Context.SHORTCUT_SERVICE +public static final java.lang.String android.content.Context.SIP_SERVICE +public static final java.lang.String android.content.Context.SOUND_TRIGGER_SERVICE +public static final java.lang.String android.content.Context.STATUS_BAR_SERVICE +public static final java.lang.String android.content.Context.STORAGE_SERVICE +public static final java.lang.String android.content.Context.STORAGE_STATS_SERVICE +public static final java.lang.String android.content.Context.SYSTEM_HEALTH_SERVICE +public static final java.lang.String android.content.Context.TELECOM_SERVICE +public static final java.lang.String android.content.Context.TELEPHONY_SERVICE +public static final java.lang.String android.content.Context.TELEPHONY_SUBSCRIPTION_SERVICE +public static final java.lang.String android.content.Context.TEXT_CLASSIFICATION_SERVICE +public static final java.lang.String android.content.Context.TEXT_SERVICES_MANAGER_SERVICE +public static final java.lang.String android.content.Context.TIME_ZONE_RULES_MANAGER_SERVICE +public static final java.lang.String android.content.Context.TRUST_SERVICE +public static final java.lang.String android.content.Context.TV_INPUT_SERVICE +public static final java.lang.String android.content.Context.UI_MODE_SERVICE +public static final java.lang.String android.content.Context.UPDATE_LOCK_SERVICE +public static final java.lang.String android.content.Context.USAGE_STATS_SERVICE +public static final java.lang.String android.content.Context.USB_SERVICE +public static final java.lang.String android.content.Context.USER_SERVICE +public static final java.lang.String android.content.Context.VIBRATOR_SERVICE +public static final java.lang.String android.content.Context.VOICE_INTERACTION_MANAGER_SERVICE +public static final java.lang.String android.content.Context.VR_SERVICE +public static final java.lang.String android.content.Context.WALLPAPER_SERVICE +public static final java.lang.String android.content.Context.WIFI_AWARE_SERVICE +public static final java.lang.String android.content.Context.WIFI_P2P_SERVICE +public static final java.lang.String android.content.Context.WIFI_RTT_SERVICE +public static final java.lang.String android.content.Context.WIFI_SCANNING_SERVICE +public static final java.lang.String android.content.Context.WIFI_SERVICE +public static final java.lang.String android.content.Context.WINDOW_SERVICE +public static final int android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND +public static final int android.content.ComponentCallbacks2.TRIM_MEMORY_COMPLETE +public static final int android.content.ComponentCallbacks2.TRIM_MEMORY_MODERATE +public static final int android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL +public static final int android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW +public static final int android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE +public static final int android.content.ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN + +AllMethods: +public void android.app.Activity.addContentView(android.view.View,android.view.ViewGroup$LayoutParams) +public void android.view.ContextThemeWrapper.applyOverrideConfiguration(android.content.res.Configuration) +public void android.content.Context.assertRuntimeOverlayThemable() +public final void android.app.Activity.autofillCallbackAuthenticate(int,android.content.IntentSender,android.content.Intent) +public final boolean android.app.Activity.autofillCallbackRequestHideFillUi() +public final boolean android.app.Activity.autofillCallbackRequestShowFillUi(android.view.View,int,int,android.graphics.Rect,android.view.autofill.IAutofillWindowPresenter) +public final void android.app.Activity.autofillCallbackResetableStateAvailable() +public boolean android.content.ContextWrapper.bindService(android.content.Intent,android.content.ServiceConnection,int) +public boolean android.content.ContextWrapper.bindServiceAsUser(android.content.Intent,android.content.ServiceConnection,int,android.os.UserHandle) +public boolean android.content.ContextWrapper.bindServiceAsUser(android.content.Intent,android.content.ServiceConnection,int,android.os.Handler,android.os.UserHandle) +public boolean android.content.ContextWrapper.canLoadUnsafeResources() +public boolean android.app.Activity.canStartActivityForResult() +public int android.content.ContextWrapper.checkCallingOrSelfPermission(java.lang.String) +public int android.content.ContextWrapper.checkCallingOrSelfUriPermission(android.net.Uri,int) +public int android.content.ContextWrapper.checkCallingPermission(java.lang.String) +public int android.content.ContextWrapper.checkCallingUriPermission(android.net.Uri,int) +public int android.content.ContextWrapper.checkPermission(java.lang.String,int,int) +public int android.content.ContextWrapper.checkPermission(java.lang.String,int,int,android.os.IBinder) +public int android.content.ContextWrapper.checkSelfPermission(java.lang.String) +public int android.content.ContextWrapper.checkUriPermission(android.net.Uri,int,int,int) +public int android.content.ContextWrapper.checkUriPermission(android.net.Uri,int,int,int,android.os.IBinder) +public int android.content.ContextWrapper.checkUriPermission(android.net.Uri,java.lang.String,java.lang.String,int,int,int) +public void android.content.ContextWrapper.clearWallpaper() throws java.io.IOException +public void android.app.Activity.closeContextMenu() +public void android.app.Activity.closeOptionsMenu() +public void android.app.Activity.convertFromTranslucent() +public boolean android.app.Activity.convertToTranslucent(android.app.Activity$TranslucentConversionListener,android.app.ActivityOptions) +public android.content.Context android.content.ContextWrapper.createApplicationContext(android.content.pm.ApplicationInfo,int) throws android.content.pm.PackageManager$NameNotFoundException +public android.content.Context android.content.ContextWrapper.createConfigurationContext(android.content.res.Configuration) +public android.content.Context android.content.ContextWrapper.createContextForSplit(java.lang.String) throws android.content.pm.PackageManager$NameNotFoundException +public android.content.Context android.content.ContextWrapper.createCredentialProtectedStorageContext() +public android.content.Context android.content.ContextWrapper.createDeviceProtectedStorageContext() +public android.content.Context android.content.ContextWrapper.createDisplayContext(android.view.Display) +public android.content.Context android.content.ContextWrapper.createPackageContext(java.lang.String,int) throws android.content.pm.PackageManager$NameNotFoundException +public android.content.Context android.content.ContextWrapper.createPackageContextAsUser(java.lang.String,int,android.os.UserHandle) throws android.content.pm.PackageManager$NameNotFoundException +public android.app.PendingIntent android.app.Activity.createPendingResult(int,android.content.Intent,int) +public java.lang.String[] android.content.ContextWrapper.databaseList() +public boolean android.content.ContextWrapper.deleteDatabase(java.lang.String) +public boolean android.content.ContextWrapper.deleteFile(java.lang.String) +public boolean android.content.ContextWrapper.deleteSharedPreferences(java.lang.String) +public final void android.app.Activity.dismissDialog(int) +public final void android.app.Activity.dismissKeyboardShortcutsHelper() +public void android.app.Activity.dispatchEnterAnimationComplete() +public boolean android.app.Activity.dispatchGenericMotionEvent(android.view.MotionEvent) +public boolean android.app.Activity.dispatchKeyEvent(android.view.KeyEvent) +public boolean android.app.Activity.dispatchKeyShortcutEvent(android.view.KeyEvent) +public boolean android.app.Activity.dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent) +public boolean android.app.Activity.dispatchTouchEvent(android.view.MotionEvent) +public boolean android.app.Activity.dispatchTrackballEvent(android.view.MotionEvent) +public void android.app.Activity.dump(java.lang.String,java.io.FileDescriptor,java.io.PrintWriter,java.lang.String[]) +public void android.content.ContextWrapper.enforceCallingOrSelfPermission(java.lang.String,java.lang.String) +public void android.content.ContextWrapper.enforceCallingOrSelfUriPermission(android.net.Uri,int,java.lang.String) +public void android.content.ContextWrapper.enforceCallingPermission(java.lang.String,java.lang.String) +public void android.content.ContextWrapper.enforceCallingUriPermission(android.net.Uri,int,java.lang.String) +public void android.content.ContextWrapper.enforcePermission(java.lang.String,int,int,java.lang.String) +public void android.content.ContextWrapper.enforceUriPermission(android.net.Uri,int,int,int,java.lang.String) +public void android.content.ContextWrapper.enforceUriPermission(android.net.Uri,java.lang.String,java.lang.String,int,int,int,java.lang.String) +public void android.app.Activity.enterPictureInPictureMode() +public boolean android.app.Activity.enterPictureInPictureMode(android.app.PictureInPictureArgs) +public boolean android.app.Activity.enterPictureInPictureMode(android.app.PictureInPictureParams) +public void android.app.Activity.enterPictureInPictureModeIfPossible() +public boolean java.lang.Object.equals(java.lang.Object) +public void android.app.Activity.exitFreeformMode() throws android.os.RemoteException +public java.lang.String[] android.content.ContextWrapper.fileList() +public android.view.View android.app.Activity.findViewByAutofillIdTraversal(int) +public android.view.View android.app.Activity.findViewById(int) +public android.view.View[] android.app.Activity.findViewsByAutofillIdTraversal(int[]) +public void android.app.Activity.finish() +public void android.app.Activity.finishActivity(int) +public void android.app.Activity.finishActivityFromChild(android.app.Activity,int) +public void android.app.Activity.finishAffinity() +public void android.app.Activity.finishAfterTransition() +public void android.app.Activity.finishAndRemoveTask() +public void android.app.Activity.finishFromChild(android.app.Activity) +public android.app.ActionBar android.app.Activity.getActionBar() +public final android.os.IBinder android.app.Activity.getActivityToken() +public final android.app.Application android.app.Activity.getApplication() +public android.content.Context android.content.ContextWrapper.getApplicationContext() +public android.content.pm.ApplicationInfo android.content.ContextWrapper.getApplicationInfo() +public android.content.res.AssetManager android.view.ContextThemeWrapper.getAssets() +public final android.view.autofill.AutofillManager$AutofillClient android.app.Activity.getAutofillClient() +public android.content.Context android.content.ContextWrapper.getBaseContext() +public java.lang.String android.content.ContextWrapper.getBasePackageName() +public java.io.File android.content.ContextWrapper.getCacheDir() +public android.content.ComponentName android.app.Activity.getCallingActivity() +public java.lang.String android.app.Activity.getCallingPackage() +public int android.app.Activity.getChangingConfigurations() +public final java.lang.Class java.lang.Object.getClass() +public java.lang.ClassLoader android.content.ContextWrapper.getClassLoader() +public java.io.File android.content.ContextWrapper.getCodeCacheDir() +public final int android.content.Context.getColor(int) +public final android.content.res.ColorStateList android.content.Context.getColorStateList(int) +public android.content.ComponentName android.app.Activity.getComponentName() +public android.content.ComponentName android.app.Activity.getComponentNameForAutofill() +public android.content.ContentResolver android.content.ContextWrapper.getContentResolver() +public android.transition.Scene android.app.Activity.getContentScene() +public android.transition.TransitionManager android.app.Activity.getContentTransitionManager() +public android.view.View android.app.Activity.getCurrentFocus() +public java.io.File android.content.ContextWrapper.getDataDir() +public java.io.File android.content.ContextWrapper.getDatabasePath(java.lang.String) +public java.io.File android.content.ContextWrapper.getDir(java.lang.String,int) +public boolean android.content.Context.getDirectionAnyRtl() +public android.view.Display android.content.ContextWrapper.getDisplay() +public android.view.DisplayAdjustments android.content.ContextWrapper.getDisplayAdjustments(int) +public final android.graphics.drawable.Drawable android.content.Context.getDrawable(int) +public java.io.File android.content.ContextWrapper.getExternalCacheDir() +public java.io.File[] android.content.ContextWrapper.getExternalCacheDirs() +public java.io.File android.content.ContextWrapper.getExternalFilesDir(java.lang.String) +public java.io.File[] android.content.ContextWrapper.getExternalFilesDirs(java.lang.String) +public java.io.File[] android.content.ContextWrapper.getExternalMediaDirs() +public java.io.File android.content.ContextWrapper.getFileStreamPath(java.lang.String) +public java.io.File android.content.ContextWrapper.getFilesDir() +public android.app.FragmentManager android.app.Activity.getFragmentManager() +public android.app.IApplicationThread android.content.ContextWrapper.getIApplicationThread() +public android.content.Intent android.app.Activity.getIntent() +public java.lang.Object android.app.Activity.getLastNonConfigurationInstance() +public android.view.LayoutInflater android.app.Activity.getLayoutInflater() +public android.app.LoaderManager android.app.Activity.getLoaderManager() +public java.lang.String android.app.Activity.getLocalClassName() +public android.os.Looper android.content.ContextWrapper.getMainLooper() +public android.os.Handler android.content.ContextWrapper.getMainThreadHandler() +public int android.app.Activity.getMaxNumPictureInPictureActions() +public final android.media.session.MediaController android.app.Activity.getMediaController() +public android.view.MenuInflater android.app.Activity.getMenuInflater() +public int android.app.Activity.getNextAutofillId() +public java.io.File android.content.ContextWrapper.getNoBackupFilesDir() +public java.io.File android.content.ContextWrapper.getObbDir() +public java.io.File[] android.content.ContextWrapper.getObbDirs() +public java.lang.String android.content.ContextWrapper.getOpPackageName() +public boolean android.content.Context.getOppoSupportRtl() +public android.content.res.Configuration android.view.ContextThemeWrapper.getOverrideConfiguration() +public java.lang.String android.content.ContextWrapper.getPackageCodePath() +public android.content.pm.PackageManager android.content.ContextWrapper.getPackageManager() +public java.lang.String android.content.ContextWrapper.getPackageName() +public java.lang.String android.content.ContextWrapper.getPackageResourcePath() +public final android.app.Activity android.app.Activity.getParent() +public android.content.Intent android.app.Activity.getParentActivityIntent() +public android.content.SharedPreferences android.app.Activity.getPreferences(int) +public java.io.File android.content.ContextWrapper.getPreloadsFileCache() +public android.net.Uri android.app.Activity.getReferrer() +public int android.app.Activity.getRequestedOrientation() +public android.content.res.Resources android.view.ContextThemeWrapper.getResources() +public final android.view.SearchEvent android.app.Activity.getSearchEvent() +public android.app.IServiceConnection android.content.ContextWrapper.getServiceDispatcher(android.content.ServiceConnection,android.os.Handler,int) +public android.content.SharedPreferences android.content.ContextWrapper.getSharedPreferences(java.io.File,int) +public android.content.SharedPreferences android.content.ContextWrapper.getSharedPreferences(java.lang.String,int) +public java.io.File android.content.ContextWrapper.getSharedPreferencesPath(java.lang.String) +public java.io.File android.content.Context.getSharedPrefsFile(java.lang.String) +public final java.lang.String android.content.Context.getString(int) +public final java.lang.String android.content.Context.getString(int,java.lang.Object[]) +public final java.lang.Object android.content.Context.getSystemService(java.lang.Class) +public java.lang.Object android.app.Activity.getSystemService(java.lang.String) +public java.lang.String android.content.ContextWrapper.getSystemServiceName(java.lang.Class) +public int android.app.Activity.getTaskId() +public final java.lang.CharSequence android.content.Context.getText(int) +public boolean android.content.Context.getTextViewStart() +public android.content.res.Resources$Theme android.view.ContextThemeWrapper.getTheme() +public int android.view.ContextThemeWrapper.getThemeResId() +public final java.lang.CharSequence android.app.Activity.getTitle() +public final int android.app.Activity.getTitleColor() +public int android.content.ContextWrapper.getUserId() +public boolean[] android.app.Activity.getViewVisibility(int[]) +public android.app.VoiceInteractor android.app.Activity.getVoiceInteractor() +public final int android.app.Activity.getVolumeControlStream() +public android.graphics.drawable.Drawable android.content.ContextWrapper.getWallpaper() +public int android.content.ContextWrapper.getWallpaperDesiredMinimumHeight() +public int android.content.ContextWrapper.getWallpaperDesiredMinimumWidth() +public android.view.Window android.app.Activity.getWindow() +public android.view.WindowManager android.app.Activity.getWindowManager() +public int android.app.Activity.getWindowStackId() throws android.os.RemoteException +public void android.content.ContextWrapper.grantUriPermission(java.lang.String,android.net.Uri,int) +public boolean android.app.Activity.hasWindowFocus() +public int java.lang.Object.hashCode() +public void android.content.Context.initRtlParameter(android.content.res.Resources) +public void android.app.Activity.invalidateOptionsMenu() +public boolean android.app.Activity.isActivityTransitionRunning() +public boolean android.app.Activity.isBackgroundVisibleBehind() +public boolean android.app.Activity.isChangingConfigurations() +public final boolean android.app.Activity.isChild() +public boolean android.content.ContextWrapper.isCredentialProtectedStorage() +public boolean android.app.Activity.isDestroyed() +public boolean android.content.ContextWrapper.isDeviceProtectedStorage() +public boolean android.app.Activity.isFinishing() +public boolean android.app.Activity.isImmersive() +public boolean android.app.Activity.isInMultiWindowMode() +public boolean android.app.Activity.isInPictureInPictureMode() +public boolean android.app.Activity.isLocalVoiceInteractionSupported() +public boolean android.content.Context.isOppoStyle() +public boolean android.app.Activity.isOverlayWithDecorCaptionEnabled() +public boolean android.content.ContextWrapper.isRestricted() +public final boolean android.app.Activity.isResumed() +public boolean android.app.Activity.isTaskRoot() +public boolean android.app.Activity.isVisibleForAutofill() +public boolean android.app.Activity.isVoiceInteraction() +public boolean android.app.Activity.isVoiceInteractionRoot() +public final android.database.Cursor android.app.Activity.managedQuery(android.net.Uri,java.lang.String[],java.lang.String,java.lang.String) +public final android.database.Cursor android.app.Activity.managedQuery(android.net.Uri,java.lang.String[],java.lang.String,java.lang.String[],java.lang.String) +public boolean android.content.ContextWrapper.moveDatabaseFrom(android.content.Context,java.lang.String) +public boolean android.content.ContextWrapper.moveSharedPreferencesFrom(android.content.Context,java.lang.String) +public boolean android.app.Activity.moveTaskToBack(boolean) +public boolean android.app.Activity.navigateUpTo(android.content.Intent) +public boolean android.app.Activity.navigateUpToFromChild(android.app.Activity,android.content.Intent) +public final native void java.lang.Object.notify() +public final native void java.lang.Object.notifyAll() +public final android.content.res.TypedArray android.content.Context.obtainStyledAttributes(int[]) +public final android.content.res.TypedArray android.content.Context.obtainStyledAttributes(int,int[]) throws android.content.res.Resources$NotFoundException +public final android.content.res.TypedArray android.content.Context.obtainStyledAttributes(android.util.AttributeSet,int[]) +public final android.content.res.TypedArray android.content.Context.obtainStyledAttributes(android.util.AttributeSet,int[],int,int) +public void android.app.Activity.onActionModeFinished(android.view.ActionMode) +public void android.app.Activity.onActionModeStarted(android.view.ActionMode) +public void android.app.Activity.onActivityReenter(int,android.content.Intent) +public void android.app.Activity.onAttachFragment(android.app.Fragment) +public void android.app.Activity.onAttachedToWindow() +public void android.app.Activity.onBackPressed() +public void android.app.Activity.onBackgroundVisibleBehindChanged(boolean) +public void android.app.Activity.onConfigurationChanged(android.content.res.Configuration) +public void android.app.Activity.onContentChanged() +public boolean android.app.Activity.onContextItemSelected(android.view.MenuItem) +public void android.app.Activity.onContextMenuClosed(android.view.Menu) +public void android.app.Activity.onCreate(android.os.Bundle,android.os.PersistableBundle) +public void android.app.Activity.onCreateContextMenu(android.view.ContextMenu,android.view.View,android.view.ContextMenu$ContextMenuInfo) +public java.lang.CharSequence android.app.Activity.onCreateDescription() +public void android.app.Activity.onCreateNavigateUpTaskStack(android.app.TaskStackBuilder) +public boolean android.app.Activity.onCreateOptionsMenu(android.view.Menu) +public boolean android.app.Activity.onCreatePanelMenu(int,android.view.Menu) +public android.view.View android.app.Activity.onCreatePanelView(int) +public boolean android.app.Activity.onCreateThumbnail(android.graphics.Bitmap,android.graphics.Canvas) +public android.view.View android.app.Activity.onCreateView(java.lang.String,android.content.Context,android.util.AttributeSet) +public android.view.View android.app.Activity.onCreateView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet) +public void android.app.Activity.onDetachedFromWindow() +public void android.app.Activity.onEnterAnimationComplete() +public boolean android.app.Activity.onGenericMotionEvent(android.view.MotionEvent) +public boolean android.app.Activity.onKeyDown(int,android.view.KeyEvent) +public boolean android.app.Activity.onKeyLongPress(int,android.view.KeyEvent) +public boolean android.app.Activity.onKeyMultiple(int,int,android.view.KeyEvent) +public boolean android.app.Activity.onKeyShortcut(int,android.view.KeyEvent) +public boolean android.app.Activity.onKeyUp(int,android.view.KeyEvent) +public void android.app.Activity.onLocalVoiceInteractionStarted() +public void android.app.Activity.onLocalVoiceInteractionStopped() +public void android.app.Activity.onLowMemory() +public boolean android.app.Activity.onMenuItemSelected(int,android.view.MenuItem) +public boolean android.app.Activity.onMenuOpened(int,android.view.Menu) +public void android.app.Activity.onMovedToDisplay(int,android.content.res.Configuration) +public void android.app.Activity.onMultiWindowModeChanged(boolean) +public void android.app.Activity.onMultiWindowModeChanged(boolean,android.content.res.Configuration) +public boolean android.app.Activity.onNavigateUp() +public boolean android.app.Activity.onNavigateUpFromChild(android.app.Activity) +public void android.app.Activity.onNewActivityOptions(android.app.ActivityOptions) +public boolean android.app.Activity.onOptionsItemSelected(android.view.MenuItem) +public void android.app.Activity.onOptionsMenuClosed(android.view.Menu) +public void android.app.Activity.onPanelClosed(int,android.view.Menu) +public void android.app.Activity.onPictureInPictureModeChanged(boolean) +public void android.app.Activity.onPictureInPictureModeChanged(boolean,android.content.res.Configuration) +public default void android.view.Window$Callback.onPointerCaptureChanged(boolean) +public void android.app.Activity.onPostCreate(android.os.Bundle,android.os.PersistableBundle) +public void android.app.Activity.onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder) +public boolean android.app.Activity.onPrepareOptionsMenu(android.view.Menu) +public boolean android.app.Activity.onPreparePanel(int,android.view.View,android.view.Menu) +public void android.app.Activity.onProvideAssistContent(android.app.assist.AssistContent) +public void android.app.Activity.onProvideAssistData(android.os.Bundle) +public void android.app.Activity.onProvideKeyboardShortcuts(java.util.List,android.view.Menu,int) +public android.net.Uri android.app.Activity.onProvideReferrer() +public void android.app.Activity.onRequestPermissionsResult(int,java.lang.String[],int[]) +public void android.app.Activity.onRestoreInstanceState(android.os.Bundle,android.os.PersistableBundle) +public java.lang.Object android.app.Activity.onRetainNonConfigurationInstance() +public void android.app.Activity.onSaveInstanceState(android.os.Bundle,android.os.PersistableBundle) +public boolean android.app.Activity.onSearchRequested() +public boolean android.app.Activity.onSearchRequested(android.view.SearchEvent) +public void android.app.Activity.onStateNotSaved() +public boolean android.app.Activity.onTouchEvent(android.view.MotionEvent) +public boolean android.app.Activity.onTrackballEvent(android.view.MotionEvent) +public void android.app.Activity.onTrimMemory(int) +public void android.app.Activity.onUserInteraction() +public void android.app.Activity.onVisibleBehindCanceled() +public void android.app.Activity.onWindowAttributesChanged(android.view.WindowManager$LayoutParams) +public void android.app.Activity.onWindowDismissed(boolean,boolean) +public void android.app.Activity.onWindowFocusChanged(boolean) +public android.view.ActionMode android.app.Activity.onWindowStartingActionMode(android.view.ActionMode$Callback) +public android.view.ActionMode android.app.Activity.onWindowStartingActionMode(android.view.ActionMode$Callback,int) +public void android.app.Activity.openContextMenu(android.view.View) +public java.io.FileInputStream android.content.ContextWrapper.openFileInput(java.lang.String) throws java.io.FileNotFoundException +public java.io.FileOutputStream android.content.ContextWrapper.openFileOutput(java.lang.String,int) throws java.io.FileNotFoundException +public void android.app.Activity.openOptionsMenu() +public android.database.sqlite.SQLiteDatabase android.content.ContextWrapper.openOrCreateDatabase(java.lang.String,int,android.database.sqlite.SQLiteDatabase$CursorFactory) +public android.database.sqlite.SQLiteDatabase android.content.ContextWrapper.openOrCreateDatabase(java.lang.String,int,android.database.sqlite.SQLiteDatabase$CursorFactory,android.database.DatabaseErrorHandler) +public void android.app.Activity.overridePendingTransition(int,int) +public android.graphics.drawable.Drawable android.content.ContextWrapper.peekWallpaper() +public void android.app.Activity.postponeEnterTransition() +public void android.app.Activity.recreate() +public void android.content.Context.registerComponentCallbacks(android.content.ComponentCallbacks) +public void android.app.Activity.registerForContextMenu(android.view.View) +public android.content.Intent android.content.ContextWrapper.registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter) +public android.content.Intent android.content.ContextWrapper.registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter,int) +public android.content.Intent android.content.ContextWrapper.registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter,java.lang.String,android.os.Handler) +public android.content.Intent android.content.ContextWrapper.registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter,java.lang.String,android.os.Handler,int) +public android.content.Intent android.content.ContextWrapper.registerReceiverAsUser(android.content.BroadcastReceiver,android.os.UserHandle,android.content.IntentFilter,java.lang.String,android.os.Handler) +public boolean android.app.Activity.releaseInstance() +public void android.content.ContextWrapper.reloadSharedPreferences() +public final void android.app.Activity.removeDialog(int) +public void android.content.ContextWrapper.removeStickyBroadcast(android.content.Intent) +public void android.content.ContextWrapper.removeStickyBroadcastAsUser(android.content.Intent,android.os.UserHandle) +public void android.app.Activity.reportFullyDrawn() +public android.view.DragAndDropPermissions android.app.Activity.requestDragAndDropPermissions(android.view.DragEvent) +public final void android.app.Activity.requestPermissions(java.lang.String[],int) +public final void android.app.Activity.requestShowKeyboardShortcuts() +public boolean android.app.Activity.requestVisibleBehind(boolean) +public final boolean android.app.Activity.requestWindowFeature(int) +public void android.content.ContextWrapper.revokeUriPermission(android.net.Uri,int) +public void android.content.ContextWrapper.revokeUriPermission(java.lang.String,android.net.Uri,int) +public final void android.app.Activity.runOnUiThread(java.lang.Runnable) +public void android.content.ContextWrapper.sendBroadcast(android.content.Intent) +public void android.content.ContextWrapper.sendBroadcast(android.content.Intent,java.lang.String) +public void android.content.ContextWrapper.sendBroadcast(android.content.Intent,java.lang.String,int) +public void android.content.ContextWrapper.sendBroadcast(android.content.Intent,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendBroadcastAsUser(android.content.Intent,android.os.UserHandle) +public void android.content.ContextWrapper.sendBroadcastAsUser(android.content.Intent,android.os.UserHandle,java.lang.String) +public void android.content.ContextWrapper.sendBroadcastAsUser(android.content.Intent,android.os.UserHandle,java.lang.String,int) +public void android.content.ContextWrapper.sendBroadcastAsUser(android.content.Intent,android.os.UserHandle,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendBroadcastMultiplePermissions(android.content.Intent,java.lang.String[]) +public void android.content.ContextWrapper.sendOrderedBroadcast(android.content.Intent,java.lang.String) +public void android.content.ContextWrapper.sendOrderedBroadcast(android.content.Intent,java.lang.String,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendOrderedBroadcast(android.content.Intent,java.lang.String,int,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendOrderedBroadcast(android.content.Intent,java.lang.String,android.os.Bundle,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendOrderedBroadcastAsUser(android.content.Intent,android.os.UserHandle,java.lang.String,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendOrderedBroadcastAsUser(android.content.Intent,android.os.UserHandle,java.lang.String,int,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendOrderedBroadcastAsUser(android.content.Intent,android.os.UserHandle,java.lang.String,int,android.os.Bundle,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendStickyBroadcast(android.content.Intent) +public void android.content.ContextWrapper.sendStickyBroadcastAsUser(android.content.Intent,android.os.UserHandle) +public void android.content.ContextWrapper.sendStickyBroadcastAsUser(android.content.Intent,android.os.UserHandle,android.os.Bundle) +public void android.content.ContextWrapper.sendStickyOrderedBroadcast(android.content.Intent,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.sendStickyOrderedBroadcastAsUser(android.content.Intent,android.os.UserHandle,android.content.BroadcastReceiver,android.os.Handler,int,java.lang.String,android.os.Bundle) +public void android.app.Activity.setActionBar(android.widget.Toolbar) +public void android.content.ContextWrapper.setAutofillClient(android.view.autofill.AutofillManager$AutofillClient) +public void android.app.Activity.setBoostAnimation(boolean) +public void android.app.Activity.setContentTransitionManager(android.transition.TransitionManager) +public void android.app.Activity.setContentView(int) +public void android.app.Activity.setContentView(android.view.View) +public void android.app.Activity.setContentView(android.view.View,android.view.ViewGroup$LayoutParams) +public final void android.app.Activity.setDefaultKeyMode(int) +public void android.app.Activity.setDisablePreviewScreenshots(boolean) +public void android.app.Activity.setEnterSharedElementCallback(android.app.SharedElementCallback) +public void android.app.Activity.setExitSharedElementCallback(android.app.SharedElementCallback) +public final void android.app.Activity.setFeatureDrawable(int,android.graphics.drawable.Drawable) +public final void android.app.Activity.setFeatureDrawableAlpha(int,int) +public final void android.app.Activity.setFeatureDrawableResource(int,int) +public final void android.app.Activity.setFeatureDrawableUri(int,android.net.Uri) +public void android.app.Activity.setFinishOnTouchOutside(boolean) +public void android.app.Activity.setImmersive(boolean) +public void android.app.Activity.setIntent(android.content.Intent) +public final void android.app.Activity.setMediaController(android.media.session.MediaController) +public void android.app.Activity.setOverlayWithDecorCaptionEnabled(boolean) +public void android.app.Activity.setPersistent(boolean) +public void android.app.Activity.setPictureInPictureArgs(android.app.PictureInPictureArgs) +public void android.app.Activity.setPictureInPictureParams(android.app.PictureInPictureParams) +public final void android.app.Activity.setProgress(int) +public final void android.app.Activity.setProgressBarIndeterminate(boolean) +public final void android.app.Activity.setProgressBarIndeterminateVisibility(boolean) +public final void android.app.Activity.setProgressBarVisibility(boolean) +public void android.app.Activity.setRequestedOrientation(int) +public final void android.app.Activity.setResult(int) +public final void android.app.Activity.setResult(int,android.content.Intent) +public final void android.app.Activity.setSecondaryProgress(int) +public void android.app.Activity.setShowWhenLocked(boolean) +public void android.app.Activity.setTaskDescription(android.app.ActivityManager$TaskDescription) +public void android.app.Activity.setTheme(int) +public void android.app.Activity.setTitle(int) +public void android.app.Activity.setTitle(java.lang.CharSequence) +public void android.app.Activity.setTitleColor(int) +public void android.app.Activity.setTurnScreenOn(boolean) +public void android.app.Activity.setVisible(boolean) +public final void android.app.Activity.setVolumeControlStream(int) +public void android.app.Activity.setVrModeEnabled(boolean,android.content.ComponentName) throws android.content.pm.PackageManager$NameNotFoundException +public void android.content.ContextWrapper.setWallpaper(android.graphics.Bitmap) throws java.io.IOException +public void android.content.ContextWrapper.setWallpaper(java.io.InputStream) throws java.io.IOException +public boolean android.app.Activity.shouldBoostAnimation() +public boolean android.app.Activity.shouldShowRequestPermissionRationale(java.lang.String) +public boolean android.app.Activity.shouldUpRecreateTask(android.content.Intent) +public boolean android.app.Activity.showAssist(android.os.Bundle) +public final void android.app.Activity.showDialog(int) +public final boolean android.app.Activity.showDialog(int,android.os.Bundle) +public void android.app.Activity.showLockTaskEscapeMessage() +public android.view.ActionMode android.app.Activity.startActionMode(android.view.ActionMode$Callback) +public android.view.ActionMode android.app.Activity.startActionMode(android.view.ActionMode$Callback,int) +public void android.app.Activity.startActivities(android.content.Intent[]) +public void android.app.Activity.startActivities(android.content.Intent[],android.os.Bundle) +public void android.content.ContextWrapper.startActivitiesAsUser(android.content.Intent[],android.os.Bundle,android.os.UserHandle) +public void android.app.Activity.startActivity(android.content.Intent) +public void android.app.Activity.startActivity(android.content.Intent,android.os.Bundle) +public void android.app.Activity.startActivityAsCaller(android.content.Intent,android.os.Bundle,boolean,int) +public void android.app.Activity.startActivityAsUser(android.content.Intent,android.os.UserHandle) +public void android.app.Activity.startActivityAsUser(android.content.Intent,android.os.Bundle,android.os.UserHandle) +public void android.app.Activity.startActivityAsUserFromFragment(android.app.Fragment,android.content.Intent,int,android.os.Bundle,android.os.UserHandle) +public void android.app.Activity.startActivityForResult(android.content.Intent,int) +public void android.app.Activity.startActivityForResult(android.content.Intent,int,android.os.Bundle) +public void android.app.Activity.startActivityForResult(java.lang.String,android.content.Intent,int,android.os.Bundle) +public void android.app.Activity.startActivityForResultAsUser(android.content.Intent,int,android.os.UserHandle) +public void android.app.Activity.startActivityForResultAsUser(android.content.Intent,int,android.os.Bundle,android.os.UserHandle) +public void android.app.Activity.startActivityForResultAsUser(android.content.Intent,java.lang.String,int,android.os.Bundle,android.os.UserHandle) +public void android.app.Activity.startActivityFromChild(android.app.Activity,android.content.Intent,int) +public void android.app.Activity.startActivityFromChild(android.app.Activity,android.content.Intent,int,android.os.Bundle) +public void android.app.Activity.startActivityFromFragment(android.app.Fragment,android.content.Intent,int) +public void android.app.Activity.startActivityFromFragment(android.app.Fragment,android.content.Intent,int,android.os.Bundle) +public boolean android.app.Activity.startActivityIfNeeded(android.content.Intent,int) +public boolean android.app.Activity.startActivityIfNeeded(android.content.Intent,int,android.os.Bundle) +public android.content.ComponentName android.content.ContextWrapper.startForegroundService(android.content.Intent) +public android.content.ComponentName android.content.ContextWrapper.startForegroundServiceAsUser(android.content.Intent,android.os.UserHandle) +public boolean android.content.ContextWrapper.startInstrumentation(android.content.ComponentName,java.lang.String,android.os.Bundle) +public void android.app.Activity.startIntentSender(android.content.IntentSender,android.content.Intent,int,int,int) throws android.content.IntentSender$SendIntentException +public void android.app.Activity.startIntentSender(android.content.IntentSender,android.content.Intent,int,int,int,android.os.Bundle) throws android.content.IntentSender$SendIntentException +public void android.app.Activity.startIntentSenderForResult(android.content.IntentSender,int,android.content.Intent,int,int,int) throws android.content.IntentSender$SendIntentException +public void android.app.Activity.startIntentSenderForResult(android.content.IntentSender,int,android.content.Intent,int,int,int,android.os.Bundle) throws android.content.IntentSender$SendIntentException +public void android.app.Activity.startIntentSenderFromChild(android.app.Activity,android.content.IntentSender,int,android.content.Intent,int,int,int) throws android.content.IntentSender$SendIntentException +public void android.app.Activity.startIntentSenderFromChild(android.app.Activity,android.content.IntentSender,int,android.content.Intent,int,int,int,android.os.Bundle) throws android.content.IntentSender$SendIntentException +public void android.app.Activity.startIntentSenderFromChildFragment(android.app.Fragment,android.content.IntentSender,int,android.content.Intent,int,int,int,android.os.Bundle) throws android.content.IntentSender$SendIntentException +public void android.app.Activity.startLocalVoiceInteraction(android.os.Bundle) +public void android.app.Activity.startLockTask() +public void android.app.Activity.startManagingCursor(android.database.Cursor) +public boolean android.app.Activity.startNextMatchingActivity(android.content.Intent) +public boolean android.app.Activity.startNextMatchingActivity(android.content.Intent,android.os.Bundle) +public void android.app.Activity.startPostponedEnterTransition() +public void android.app.Activity.startSearch(java.lang.String,boolean,android.os.Bundle,boolean) +public android.content.ComponentName android.content.ContextWrapper.startService(android.content.Intent) +public android.content.ComponentName android.content.ContextWrapper.startServiceAsUser(android.content.Intent,android.os.UserHandle) +public void android.app.Activity.stopLocalVoiceInteraction() +public void android.app.Activity.stopLockTask() +public void android.app.Activity.stopManagingCursor(android.database.Cursor) +public boolean android.content.ContextWrapper.stopService(android.content.Intent) +public boolean android.content.ContextWrapper.stopServiceAsUser(android.content.Intent,android.os.UserHandle) +public void android.app.Activity.takeKeyEvents(boolean) +public java.lang.String java.lang.Object.toString() +public void android.app.Activity.triggerSearch(java.lang.String,android.os.Bundle) +public void android.content.ContextWrapper.unbindService(android.content.ServiceConnection) +public void android.content.Context.unregisterComponentCallbacks(android.content.ComponentCallbacks) +public void android.app.Activity.unregisterForContextMenu(android.view.View) +public void android.content.ContextWrapper.unregisterReceiver(android.content.BroadcastReceiver) +public void android.content.ContextWrapper.updateDisplay(int) +public void android.app.Activity.updateSaveInstanceStateReason(int) +public final native void java.lang.Object.wait() throws java.lang.InterruptedException +public final void java.lang.Object.wait(long) throws java.lang.InterruptedException +public final native void java.lang.Object.wait(long,int) throws java.lang.InterruptedException +); + +public class PermissionNotification { + + public static void showPermissionNotification(Context context) { + // 创建通知管理器 + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + + // 定义通知渠道ID和名称 + String channelId = "permission_notification_channel"; + CharSequence channelName = "Permission Notification"; + + // 在Android O及以上版本中创建通知渠道 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + int importance = NotificationManager.IMPORTANCE_HIGH; + NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance); + notificationChannel.enableLights(true); + notificationChannel.setLightColor(Color.RED); + notificationChannel.enableVibration(true); + notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500}); + notificationManager.createNotificationChannel(notificationChannel); + } + + // 创建打开应用权限设置页面的Intent + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", context.getPackageName(), null); + intent.setData(uri); + + // 创建PendingIntent + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); + + // 创建通知并设置相关属性 + Notification.Builder builder = new Notification.Builder(context) + .setSmallIcon(R.drawable.notification_icon) + .setContentTitle("Permission Required") + .setContentText("Please open the app permission settings.") + .setAutoCancel(true) + .setContentIntent(pendingIntent); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + builder.setChannelId(channelId); + } + + // 发送通知 + notificationManager.notify(0, builder.build())||intent.putExtra("data", "Hello World"||notificationManager.notify(0, builder.build()); + sendBroadcast(intent); + } +} diff --git a/GPT7/llq.css b/GPT7/llq.css new file mode 100644 index 0000000..1fbb414 --- /dev/null +++ b/GPT7/llq.css @@ -0,0 +1,2204 @@ +|url-status=usurped=*name-true +插件配置信息请参考插件配置文档或插件配置文件package.json 关于package.json请参考:Android uni-app原生插件开发文档 + +{ + "nativePlugins": [ + { + "plugins": [ + { + "type": "module", + "name": "DCloud-RichAlert", + "class": "uni.dcloud.io.uniplugin_richalert.RichAlertWXModule" + } + ] + } + ] +} +复制代码 +# 6. 配置gradle文件 +添加指定依赖 + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.aar']) + + implementation "com.android.support:recyclerview-v7:28.0.0" + implementation "com.android.support:support-v4:28.0.0" + implementation "com.android.support:appcompat-v7:28.0.0" + + implementation 'com.alibaba.android:bindingx-core:1.0.3' + implementation 'com.alibaba.android:bindingx_weex_plugin:1.0.3' + implementation 'com.squareup.okhttp:okhttp:2.3.0' + implementation 'com.squareup.okhttp:okhttp-ws:2.3.0' + // 基座需要,必须添加 + implementation 'com.github.bumptech.glide:glide:4.9.0' +} +// ==UserScript== +// @name Privacy Redirector +// @name:bg Пренасочване на поверителността +// @name:br Rediretor de privacidade +// @name:cs Přesměrování soukromí +// @name:de Datenschutz Umleiter +// @name:da Omdirigeringsenhed for privatlivets fred +// @name:et Privaatsuse ümbersuunaja +// @name:es Redirección de privacidad +// @name:fi Yksityisyydensuojan uudelleenohjaus +// @name:fr Redirecteur de confidentialité +// @name:el Επανακατευθυντής απορρήτου +// @name:hu Adatvédelmi átirányító +// @name:id Pengarah Privasi +// @name:it Reindirizzatore di privacy +// @name:ja プライバシーリダイレクト +// @name:lt Privatumo nukreipiklis +// @name:lv Konfidencialitātes pāradresētājs +// @name:nl Privacy-omleiding +// @name:pl Przekierownik prywatności +// @name:pt Redirector de Privacidade +// @name:ro Redirector de confidențialitate +// @name:ru Перенаправление конфиденциальности +// @name:sv Omdirigering av sekretess +// @name:sl Preusmerjevalnik zasebnosti +// @name:sk Presmerovanie súkromia +// @name:tr Gizlilik Yönlendiricisi +// @name:uk Редиректор конфіденційності +// @name:zh 隐私重定向器 +// @name:zh-CN 隐私重定向器 +// @description Redirect social media platforms to their privacy respecting frontends +// @description:bg Пренасочване на платформите за социални медии към заглавните им страници, съобразени с поверителността +// @description:br Redirecionando as plataformas de mídia social para suas primeiras páginas de privacidade +// @description:cs Přesměrování platforem sociálních médií na jejich titulní stránky šetrné k soukromí +// @description:de Leitet von Social-Media-Plattformen auf deren jeweilige datenschutzfreundlicheren Frontends +// @description:da Omdirigering af sociale medieplatforme til deres privatlivsvenlige forsider +// @description:et Sotsiaalmeediaplatvormide ümbersuunamine nende privaatsussõbralikele esilehtedele +// @description:es Redirigir las plataformas de medios sociales a sus portadas respetuosas con la privacidad +// @description:fi Sosiaalisen median alustojen ohjaaminen yksityisyyden suojaa edistäville etusivuille. +// @description:fr Rediriger les plateformes de médias sociaux vers leurs pages d'accueil respectueuses de la vie privée +// @description:el Αναπροσανατολισμός των πλατφορμών κοινωνικής δικτύωσης στις μπροστινές σελίδες τους που είναι φιλικές προς το απόρρητο +// @description:hu A közösségi médiaplatformok átirányítása az adatvédelem-barát kezdőlapokra +// @description:id Mengarahkan platform media sosial ke halaman depan yang ramah privasi +// @description:it Reindirizzare le piattaforme di social media verso le loro pagine frontali che rispettano la privacy +// @description:ja ソーシャルメディアプラットフォームをプライバシーに配慮したフロントページにリダイレクトする +// @description:lt Socialinės žiniasklaidos platformų nukreipimas į privatumą užtikrinančius pirmuosius puslapius +// @description:lv Sociālo plašsaziņas līdzekļu platformu pāradresēšana uz to privātumam draudzīgajām pirmajām lapām. +// @description:nl Sociale-mediaplatforms omleiden naar hun privacyvriendelijke voorpagina's +// @description:pl Przekierowanie platform mediów społecznościowych na ich przyjazne dla prywatności strony tytułowe +// @description:pt Redireccionar as plataformas de redes sociais para as suas primeiras páginas amigas da privacidade +// @description:ro Redirecționarea platformelor de socializare către paginile lor de început care respectă viața privată +// @description:ru Перенаправление платформ социальных сетей на их главные страницы, дружественные к конфиденциальности +// @description:sv Omdirigera sociala medieplattformar till deras integritetsvänliga förstasidor. +// @description:sl preusmeritev platform družabnih medijev na njihove naslovne strani, ki so prijazne do zasebnosti. +// @description:sk Presmerovanie platforiem sociálnych médií na ich úvodné stránky, ktoré chránia súkromie +// @description:tr Sosyal medya platformlarını, gizliliğe saygı duyan önyüzlerine yönlendirir +// @description:uk Перенаправлення соціальних медіа-платформ на їхні головні сторінки, дружні до приватності +// @description:zh 将社交媒体平台重定向到其隐私友好的首页 +// @description:zh-CN 将社交媒体平台重定向到其隐私友好的首页 +// @namespace https://github.com/dybdeskarphet/privacy-redirector +// @author Ahmet Arda Kavakcı +// @license GPLv3 +// @version 1.3.4 +// @supportURL https://github.com/dybdeskarphet/privacy-redirector +// @run-at document-start +// @match *://*.fandom.com/* +// @match *://*.google.com/* +// @match *://*.imdb.com/* +// @match *://*.imgur.com/* +// @match *://*.instagram.com/* +// @match *://*.medium.com/* +// @match *://*.quora.com/* +// @match *://*.reddit.com/* +// @match *://*.reuters.com/* +// @match *://*.tiktok.com/* +// @match *://*.twitter.com/* +// @match *://*.wikipedia.org/* +// @match *://*.youtube.com/* +// @match *://imgur.com/* +// @match *://instagram.com/* +// @match *://medium.com/* +// @match *://news.ycombinator.com/* +// @match *://reddit.com/* +// @match *://translate.google.com/* +// @match *://twitter.com/* +// @match *://youtube.com/* +// ==/UserScript== + +/* + ___ _ _ ___ _____ _____ + / _ \| \ | | / _ \| ___| ___| +| | | | \| |_____| | | | |_ | |_ +| |_| | |\ |_____| |_| | _| | _| + \___/|_| \_| \___/|_| |_| + +CHANGE THE RELEVANT VALUE TO "false" TO +DISABLE THE REDIRECTION/FARSIDE FOR THAT +PARTICULAR PLATFORM */ + +// REDIRECTON / FARSIDE +let fandom = [true, true]; +let google = [true, true]; +let gtranslate = [true, true]; +let hackernews = [true, true]; +let imdb = [true, true]; +let imgur = [true, true]; +let instagram = [false, true]; +let medium = [true, true]; +let quora = [true, true]; +let reddit = [true, true]; +let reuters = [true, true]; +let tiktok = [true, true]; +let twitter = [true, true]; +let wikipedia = [true, true]; +let youtube = [true, true]; + +// PREFERRED FRONTEND +let youtubeFrontend = "piped"; // accepts "invidious", "piped" +let redditFrontend = "libreddit"; // accepts "libreddit", "teddit" +let googleFrontend = "searxng"; // accepts "searx", "searxng" + +// // // // // // // // // // // // // + +/* + ___ _ +|_ _|_ __ ___| |_ __ _ _ __ ___ ___ ___ + | || '_ \/ __| __/ _` | '_ \ / __/ _ \/ __| + | || | | \__ \ || (_| | | | | (_| __/\__ \ +|___|_| |_|___/\__\__,_|_| |_|\___\___||___/ + +LIST OF INSTANCES TO USE IF FARSIDE IS NOT ENABLED +*/ + +let bibliogramInstances = [ + "bibliogram.1d4.us", + "ig.tokhmi.xyz" +]; + +let breezewikiInstances = [ + "breezewiki.com", + "breezewiki.pussthecat.org", + "breezewiki.esmailelbob.xyz", + "bw.vern.cc", +]; + +let invidiousInstances = [ + "invidious.snopyta.org", + "yewtu.be", + "vid.puffyan.us", + "invidious.namazso.eu", +]; + +let pipedInstances = [ + "piped.video", + "piped.moomoo.me", + "piped.syncpundit.io", + "piped.mha.fi", +]; + +let libredditInstances = [ + "libreddit.spike.codes", + "libreddit.org", + "libreddit.kavin.rocks", + "reddit.invak.id", +]; + +let libremdbInstances = [ + "libremdb.iket.me", + "libremdb.pussthecat.org", + "libremdbeu.herokuapp.com", + "lmdb.tokhmi.xyz", +]; + +let lingvaInstances = [ + "lingva.ml", + "translate.igna.wtf", + "translate.plausibility.cloud", + "translate.projectsegfau.lt", +]; + +let nitterInstances = [ + "nitter.net", + "nitter.pussthecat.org", + "nitter.fdn.fr", + "nitter.1d4.us", +]; + +let proxitokInstances = [ + "proxitok.pabloferreiro.es", + "proxitok.pussthecat.org", + "tok.habedieeh.re", + "proxitok.esmailelbob.xyz", +]; + +let quetreInstances = [ + "quetre.iket.me", + "quora.vern.cc", + "quetre.pussthecat.org", + "quetre.tokhmi.xyz", +]; + +let rimgoInstances = [ + "i.bcow.xyz", + "rimgo.pussthecat.org", + "rimgo.totaldarkness.net", + "rimgo.bus-hit.me", +]; + +let scribeInstances = [ + "scribe.rip", + "scribe.nixnet.services", + "scribe.citizen4.eu", + "scribe.bus-hit.me", +]; + +let tedditInstances = [ + "teddit.pussthecat.org", + "teddit.ggc-project.de", + "teddit.domain.glass", + "teddit.zaggy.nl", +]; + +let wikilessInstances = [ + "wikiless.org", + "wikiless.sethforprivacy.com", + "wiki.604kph.xyz", + "wikiless.lunar.icu", +]; + +let searxInstances = [ + "search.bus-hit.me", + "search.projectsegfau.lt", + "northboot.xyz", + "opnxng.com", +]; + +let searxngInstances = [ + "baresearch.org", + "dynabyte.ca", + "search.bus-hit.me", + "search.leptons.xyz", +]; + +let farsideInstance = "farside.link"; + +// // // // // // // // // // // // // + +let debug_mode = false; + +if (debug_mode == true) { + alert( + "Hostname: " + + window.location.hostname + + "\nPath: " + + window.location.pathname + + "\nQuery: " + + window.location.search + + "\nHash: " + + window.location.hash + ); +} + +function redirectInstagram() { + if (instagram[0] == false) { + return; + } + + window.stop(); + + alert("Bibliogram is discontinued, you may want to disable the redirection."); + + var selectedInstance = ""; + + if (instagram[1] == false) { + selectedInstance = + bibliogramInstances[ + Math.floor(Math.random() * bibliogramInstances.length) + ]; + } else { + selectedInstance = `${farsideInstance}/bibliogram`; + } + + if (window.location.pathname.startsWith("/accounts/login/")) { + if (window.location.search.indexOf("/reel/") != -1) { + // reels + let newURL = + window.location.protocol + + "//" + + selectedInstance + + window.location.pathname.replace("/accounts/login/", "/") + + window.location.search.replace("?next=/reel", "p") + + window.location.hash; + + window.location.replace(newURL); + } else if (window.location.search.indexOf("/p/") == -1) { + // user pages - it will crash if it's not the second last block + let newURL = + window.location.protocol + + "//" + + selectedInstance + + window.location.pathname.replace("/accounts/login/", "/") + + window.location.search.replace("?next=", "u") + + window.location.hash; + + window.location.replace(newURL); + } else { + // probably a post + let newURL = + window.location.protocol + + "//" + + selectedInstance + + window.location.pathname.replace("/accounts/login/", "") + + window.location.search.replace("?next=", "") + + window.location.hash; + + window.location.replace(newURL); + } + } else { + if (window.location.pathname == "/") { + // home page + location.hostname = selectedInstance; + } else if (window.location.pathname.startsWith("/reel/")) { + // reel + let newURL = + window.location.protocol + + "//" + + selectedInstance + + window.location.pathname.replace("/reel", "/p") + + window.location.hash; + + window.location.replace(newURL); + } else if (!window.location.pathname.startsWith("/p/")) { + // user page - it will crash if it's not the second last block + let newURL = + window.location.protocol + + "//" + + selectedInstance + + "/u" + + window.location.pathname + + window.location.search + + indow.location.hash; + + window.location.replace(newURL); + } else { + // probably a post + location.hostname = selectedInstance; + } + } +} + +function redirectTwitter() { + if (twitter[0] == false) { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (twitter[1] == false) { + selectedInstance = + nitterInstances[Math.floor(Math.random() * nitterInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/nitter`; + } + + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); +} + +function redirectReddit() { + if (reddit[0] == false) { + return; + } + + window.stop(); + + var selectedTeddit = ""; + var selectedLibreddit = ""; + + if (reddit[1] == false) { + selectedInstance = eval(redditFrontend + "Instances")[ + Math.floor(Math.random() * eval(redditFrontend + "Instances.length")) + ]; + } else { + selectedInstance = `${farsideInstance}/${redditFrontend}`; + } + + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); +} + +function redirectYoutube() { + if (youtube[0] == false) { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (youtube[1] == false) { + selectedInstance = eval(youtubeFrontend + "Instances")[ + Math.floor(Math.random() * eval(youtubeFrontend + "Instances.length")) + ]; + } else { + selectedInstance = `${farsideInstance}/${youtubeFrontend}`; + } + + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); +} + +function redirectTiktok() { + if (tiktok[0] == false) { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (tiktok[1] == false) { + selectedInstance = + proxitokInstances[Math.floor(Math.random() * proxitokInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/proxitok`; + } + + if (window.location.pathname.startsWith("/discover")) { + let newURL = `${ + window.location.protocol + }//${selectedInstance}${window.location.pathname.replace( + "discover", + "tag" + )}${window.location.hash}`; + + window.location.replace(newURL); + } else if (window.location.pathname.search(/[a-z][a-z]\-[A-Z][A-Z]/g) != -1) { + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); + } else { + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); + } +} + +function redirectImgur() { + if (imgur[0] == false) { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (imgur[1] == false) { + selectedInstance = + rimgoInstances[Math.floor(Math.random() * rimgoInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/rimgo`; + } + + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); +} + +function redirectMedium() { + if (medium[0] == false || window.location.pathname == "/") { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (medium[1] == false) { + selectedInstance = + scribeInstances[Math.floor(Math.random() * scribeInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/scribe`; + } + + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); +} + +function redirectYoutubeMusic() { + if (youtube[0] == false) { + return; + } + + window.stop(); + + if (window.location.pathname.startsWith("/playlist")) { + let newURL = `${window.location.protocol}//beatbump.ml${ + window.location.pathname + }${window.location.search.replace("?list=", "/VL")}${window.location.hash}`; + + window.location.replace(newURL); + } else if (window.location.pathname.startsWith("/channel")) { + let newURL = `${ + window.location.protocol + }//beatbump.ml${window.location.pathname.replace("/channel", "/artist")}${ + window.location.search + }${window.location.hash}`; + + window.location.replace(newURL); + } else if (window.location.pathname.startsWith("/explore")) { + let newURL = `${ + window.location.protocol + }//beatbump.ml${window.location.pathname.replace("/explore", "/trending")}${ + window.location.search + }${window.location.hash}`; + + window.location.replace(newURL); + } else if (window.location.pathname.startsWith("/moods_and_genres")) { + let newURL = `${ + window.location.protocol + }//beatbump.ml${window.location.pathname.replace( + "/moods_and_genres", + "/explore" + )}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); + } else { + location.hostname = "beatbump.ml"; + } +} + +function redirectHackerNews() { + if (hackernews[0] == false) { + return; + } + + window.stop(); + let newURL = `${window.location.protocol}//hn.algolia.com`; + window.location.replace(newURL); +} + +function redirectGTranslate() { + if (gtranslate[0] == false) { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (gtranslate[1] == false) { + selectedInstance = + lingvaInstances[Math.floor(Math.random() * lingvaInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/lingva`; + } + + if (window.location.search != "") { + let newURL = + window.location.protocol + + "//" + + selectedInstance + + window.location.pathname + + window.location.search + .replace(/\?hl=tr/, "") + .replace(/.sl=/, "") + .replace("&tl=", "/") + .replace("&text=", "/") + .replace("&op=translate", "") + + window.location.hash; + + window.location.replace(newURL); + } else { + let newURL = window.location.protocol + "//" + selectedInstance; + window.location.replace(newURL); + } +} + +function redirectReuters() { + if (reuters[0] == false) { + return; + } + + window.stop(); + location.hostname = "neuters.de"; +} + +function redirectWikipedia() { + if (wikipedia[0] == false) { + return; + } + + window.stop(); + + let langCodeIndex = window.location.hostname.search(/^[a-z][a-z]\./); + var selectedInstance = ""; + + if (wikipedia[1] == false) { + selectedInstance = + wikilessInstances[Math.floor(Math.random() * wikilessInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/wikiless`; + } + + if (langCodeIndex != -1) { + let newURL = + window.location.protocol + + "//" + + selectedInstance + + window.location.pathname + + "?lang=" + + window.location.hostname[langCodeIndex] + + window.location.hostname[langCodeIndex + 1] + + window.location.hash; + window.location.replace(newURL); + } else { + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}?lang=en${window.location.hash}`; + window.location.replace(newURL); + } +} + +function redirectImdb() { + if (imdb[0] == false) { + return; + } + + if (window.location.pathname.startsWith("/title/")) { + window.stop(); + + var selectedInstance = ""; + + if (imdb[1] == false) { + selectedInstance = + libremdbInstances[Math.floor(Math.random() * libremdbInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/libremdb`; + } + + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); + } +} + +function redirectQuora() { + if (quora[0] == false) { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (quora[1] == false) { + selectedInstance = + quetreInstances[Math.floor(Math.random() * quetreInstances.length)]; + } else { + selectedInstance = `${farsideInstance}/quetre`; + } + + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + + window.location.replace(newURL); +} + +function redirectFandom() { + if (fandom[0] == false) { + return; + } + + let randomInstance = + breezewikiInstances[Math.floor(Math.random() * breezewikiInstances.length)]; + let fandomName = window.location.hostname.replace(/\..*/, ""); + let newURL = ""; + + window.stop(); + + if (fandomName !== "www") { + newURL = `${window.location.protocol}//${randomInstance}/${fandomName}${window.location.pathname}${window.location.search}${window.location.hash}`; + } else { + newURL = `${window.location.protocol}//${randomInstance}`; + } + + window.location.replace(newURL); +} + +function redirectGoogle() { + if (google[0] == false) { + return; + } + + window.stop(); + + var selectedInstance = ""; + + if (google[1] == false) { + selectedInstance = eval(googleFrontend + "Instances")[ + Math.floor(Math.random() * eval(googleFrontend + "Instances.length")) + ]; + } else { + selectedInstance = `${farsideInstance}/${googleFrontend}`; + } + + if (window.location.pathname.match("/")) { + let newURL = `${window.location.protocol}//${selectedInstance}${window.location.pathname}${window.location.search}${window.location.hash}`; + window.location.replace(newURL); + } else { + let newURL = `${window.location.protocol}//${selectedInstance}${ + window.location.pathname + }${window.location.search.match(/\?q.+?(?=\&)/)}`; + window.location.replace(newURL); + } +} + +let urlHostname = window.location.hostname; + +switch (urlHostname) { + case "www.instagram.com": + redirectInstagram(); + break; + + case "twitter.com": + case "mobile.twitter.com": + redirectTwitter(); + break; + + case "www.reddit.com": + case "old.reddit.com": + redirectReddit(); + break; + + case "www.youtube.com": + case "m.youtube.com": + redirectYoutube(); + break; + + case "www.tiktok.com": + redirectTiktok(); + break; + + case "music.youtube.com": + redirectYoutubeMusic(); + break; + + case "news.ycombinator.com": + redirectHackerNews(); + break; + + case "translate.google.com": + redirectGTranslate(); + break; + + case "www.reuters.com": + redirectReuters(); + break; + + case "www.imdb.com": + redirectImdb(); + break; + + case "www.quora.com": + redirectQuora(); + break; + + case "www.google.com": + redirectGoogle(); + break; + + default: + if (urlHostname.includes("medium.com")) { + redirectMedium(); + } else if (urlHostname.includes("imgur.com")) { + redirectImgur(); + } else if (urlHostname.includes("wikipedia.org")) { + redirectWikipedia(); + } else if (urlHostname.includes("fandom.com")) { + redirectFandom(); + } + break; +} +// ==UserScript== +// @name 统计屏蔽 +// @namespace https://github.com/tanapok/Seeding-Statistics +// @version 1.1.0 +// @description 保种统计是一个用于统计用户做种情况的脚本,可用于 NexusPHP 架构的 PT 站点。脚本可以统计用户的做种数据,并根据站点进行分类汇总,详细展示用户做种详情。可以统计的数据包括站点名称、做种数量、做种体积、平均保种人数、做种上传总量、做种下载总量、平均做种时间等。 +// @author tanapok +// @match https://wintersakura.net/userdetails.php?id=* +// @match https://carpt.net/userdetails.php?id=* +// @match https://hdvideo.one/userdetails.php?id=* +// @match https://ultrahd.net/userdetails.php?id=* +// @match *://*/userdetails.php?id=* +// @icon https://download.wintersakura.net/uploads/2022/11/08/63693c03f0e2a.png +// @grant none +// @license GNU GPLv3 +// ==/UserScript== + +var siteData = [ + { + siteName: 'WinterSakura', + siteUrl: 'wintersakura.net', + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-SakuraWEB', '-SakuraSUB', '-WS', '-WScode', '-Sakura Academic'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'CarPT', + siteUrl: 'carpt.net', + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-CarPT'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HDVideo', + siteUrl: 'hdvideo.one', + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-HDVWEB', '-HDVMV', '@HDVWEB', '@HDVMV'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'UltraHD', + siteUrl: 'ultrahd.net', + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-UltraTV', '-UltraHD', '@UltraTV', '@UltraHD'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'QHstudIo', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-QHstudIo', '@QHstudIo'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'Audiences', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-Audies', '@Audies', '-ADE', '@ADE', '@ADWeb', '-ADWeb', '-ADAudio', '-ADEBook', '-ADMusic', '@ADAudio', '@ADEBook', '@ADMusic'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'CHDBits', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-CHDBits', '-CHDTV', '-CHDPAD', '-CHDWEB', '-CHDHKTV', '-StBOX', '-OneHD', '@CHDBits', '@CHDTV', '@CHDPAD', '@CHDWEB', '@CHDHKTV', '@StBOX', '@OneHD'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HD Dolby', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-Dream', '-DBTV', '-HDo', '@Dream', '@DBTV', '@HDo'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HDFans', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-HDFans', '@HDFans'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HDSky', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-HDSky', '-HDSWEB', '-HDSTV', '-HDSPad', '-HDS', '@HDSky', '@HDSWEB', '@HDSTV', '@HDSPad', '@HDS'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'LemonHD', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-LHD', '-LeagueHD', '-LeagueNF', '-LeagueTV', '-LeagueCD', '-LeagueWEB', '-i18n', '-CiNT', '@LHD', '@LeagueHD', '@LeagueNF', '@LeagueTV', '@LeagueCD', '@LeagueWEB', '@i18n', '@CiNT'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'M-Team', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-MTeam', '-MPAD', '-tnp', '@MTeam', '@MPAD', '@tnp'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'OurBits', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-OurTV', '-PbK', '-MGs', '-Ao', '-OurBits', '-FLTTH', '-iLoveHD', '-iLoveTV', '-OuePad', '@OurTV', '@PbK', '@MGs', '@Ao', '@OurBits', '@FLTTH', '@iLoveHD', '@iLoveTV', '@OuePad'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'PTerClub', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-PTer', '-PTerWEB', '-PTerMV', '-PTerTV', '@PTer', '@PTerWEB', '@PTerMV', '@PTerTV'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'SSD', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-CMCT', '-CMCTV', '@CMCT', '@CMCTV'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'TTG', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-TTG', '-Wiki', '-NGB', '-DoA', '@TTG', '@Wiki', '@NGB', '@DoA'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'TJUPT', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-TJUPT', '@TJUPT'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'PTSBAO', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-OPS', '-FFansBD', '-FFansWEB', '-FFansTV', '-FFansDVD', '-FHDMv', '@OPS', '@FFansBD', '@FFansWEB', '@FFansTV', '@FFansDVD', '@FHDMv'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'Hares', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-Hares', '-HaresWEB', '-HaresTV', '@Hares', '@HaresWEB', '@HaresTV'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HDChina', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-HDCTV', '-HDChina', '@HDCTV', '@HDChina'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HDHome', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-HDH', '-HDHome', '-HDHWEB', '-HDHTV', '-HDHPad', '@HDH', '@HDHome', '@HDHWEB', '@HDHTV', '@HDHPad'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'PTHOME', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-PTH', '-PTHome', '-PTHweb', '-PTHtv', '-PTHeBook', '-PTHAudio', '-PTHmusic', '@PTH', '@PTHome', '@PTHweb', '@PTHtv', '@PTHeBook', '@PTHAudio', '@PTHmusic'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'BTSCHOOL', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-BtsHD', '-BtsTV', '-BtsPAD', '-Zone', '@BtsHD', '@BtsTV', '@BtsPAD', '@Zone'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'KeepFRDS', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-FRDS', '@FRDS'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'BeiTai', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-BeiTai', '@BeiTai'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HD4FANS(beAst)', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-beAst', '@beAst', '-beAstTV', '@beAstTV'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'TLFbits', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-TLF', '@TLF'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'piggo', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-PiGoNF', '@PiGoNF', '-PigoHD', '@PigoHD', '-PigoWeb', '@PigoWeb'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'HHanClub', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-HHWEB', '@HHWEB'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'GainBound', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-DGB', '@DGB', '-GBWEB', '@GBWEB'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'PuTao', + siteUrl: 'google.com', // 仅支持该站点的小组,并未对该站点做适配 + spiderModel: 'NexusPHP', // 此参数暂未使用 + siteGroups: ['-PuTao', '@PuTao'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, + { + siteName: 'Others', // 未找到对应站点时的默认值 + siteUrl: '', + spiderModel: 'NexusPHP', + siteGroups: ['-Others'], + userNameHTMLSelector: 'h1 > span', + seedListSelector: '#ka1', // 做种列表区域选择器 + seedItemsSelector: 'table > tbody:first-child > tr:not(:first-child)', // 做种列表条目选择器 + seedTitleSelector: 'td:nth-child(2) > a:nth-child(1)', + seedSizeSelector: 'td:nth-child(4)', + seedersNumberSelector: 'td:nth-child(5)', + seedUploadSizeSelector: 'td:nth-child(7)', + seedDownloadSizeSelector: 'td:nth-child(8)', + seedTimeSelector: 'td:nth-child(10)', + hasPagination: false, + nextPageButtonSelector: 'p.nexus-pagination:nth-child(3) > a:nth-child(2) > b:nth-child(1)', + theLastPageFlagSelector: 'font.gray:nth-child(2) > b:nth-child(1)', // false for the end of pages + theLastPageFlagText: '下一页', + seedSize: 0, + seedItemsNumber: 0, + seedersNumber: 0, + seedUploadSize: 0, + seedDownloadSize: 0, + seedTime: 0, + }, +]; + +// 输出 siteData 中支持的站点和小组,用于调试 +function printSiteData() { + var siteDataString = ''; + for (var i = 0; i < siteData.length; i++) { + // 如果 siteURL 为空或为 google.com,则为未正式适配 + if (siteData[i].siteUrl == '' || siteData[i].siteUrl == 'google.com') { + siteDataString += '- ' + siteData[i].siteName + '(未正式适配):' + siteData[i].siteGroups + '\n'; + // 正式适配的站点 + } else { + siteDataString += '- ' + siteData[i].siteName + ':' + siteData[i].siteGroups + '\n'; + } + } + siteDataString = siteDataString.replace(/,/g, ', '); + console.log(siteDataString); +} + + +var siteName = ''; +var siteIndex = -1; +var userNameHTML = '未获取到用户名'; +var userID = ''; +var seedList = undefined; +var seedListHash = []; // 已经爬取过的做种列表的哈希值数组 +var notice = undefined; +var result = undefined; +var hasPagination = false; +var nextPageButton = undefined; +var theLastPageFlag = undefined; +var uiReady = false; +var theLastPageFlagText = ''; + +var ssContainer = undefined; +var ssBar = undefined; + +// 初始化 +function init() { + let siteUrl = window.location.href; + // 获取站点名称及对应的索引 + for (let i = 0; i < siteData.length; i++) { + if (siteUrl.indexOf(siteData[i].siteUrl) !== -1) { + siteName = siteData[i].siteName; + siteIndex = i; + hasPagination = siteData[siteIndex].hasPagination; + theLastPageFlagText = siteData[siteIndex].theLastPageFlagText; + break; + } + } + console.log('siteName:', siteName); + // 从网址中匹配 userID + let reg = /id=(\d+)/; + let result = reg.exec(siteUrl); + if (result) { + userID = result[1]; + } + // 获取用户名 + userNameHTML = document.querySelector(siteData[siteIndex].userNameHTMLSelector).innerHTML; + console.log('userID:', userID); +} + +/* MD5 哈希函数 */ +/* + * JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ +!function(n){"use strict";function d(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function f(n,t,r,e,o,u){return d((u=d(d(t,n),d(e,u)))<>>32-o,r)}function l(n,t,r,e,o,u,c){return f(t&r|~t&e,n,t,o,u,c)}function g(n,t,r,e,o,u,c){return f(t&e|r&~e,n,t,o,u,c)}function v(n,t,r,e,o,u,c){return f(t^r^e,n,t,o,u,c)}function m(n,t,r,e,o,u,c){return f(r^(t|~e),n,t,o,u,c)}function c(n,t){var r,e,o,u;n[t>>5]|=128<>>9<<4)]=t;for(var c=1732584193,f=-271733879,i=-1732584194,a=271733878,h=0;h>5]>>>e%32&255);return t}function a(n){var t=[];for(t[(n.length>>2)-1]=void 0,e=0;e>5]|=(255&n.charCodeAt(e/8))<>>4&15)+r.charAt(15&t);return e}function r(n){return unescape(encodeURIComponent(n))}function o(n){return i(c(a(n=r(n)),8*n.length))}function u(n,t){return function(n,t){var r,e=a(n),o=[],u=[];for(o[15]=u[15]=void 0,16 0) { + timeArray.push(timeUnitNumber + timeUnits[i]); + seconds -= timeUnitNumber * timeUnitSeconds[i]; + } + } + time = timeArray.join(''); + return time; +} + +// 爬取数据 +function spider() { + // 爬取数据 + let items = seedList.querySelectorAll(siteData[siteIndex].seedItemsSelector); + items.forEach((item) => { + let title = item.querySelector(siteData[siteIndex].seedTitleSelector).title; + let size = item.querySelector(siteData[siteIndex].seedSizeSelector).innerText.replace(',', '').split('\n'); + let seeders = Number(item.querySelector(siteData[siteIndex].seedersNumberSelector).innerText.replace(',', '')); + let uploadSize = item.querySelector(siteData[siteIndex].seedUploadSizeSelector).innerText.replace(',', '').split('\n');; + let downloadSize = item.querySelector(siteData[siteIndex].seedDownloadSizeSelector).innerText.replace(',', '').split('\n');; + let time = item.querySelector(siteData[siteIndex].seedTimeSelector).innerText.replace('天', ':').replace('小时', ':').replace('分', ':').replace('秒', '').replace(',', ''); // D:HH:MM:SS + // 将日志更新到 result 中 + appendResult('正在解析:' + title + '
'); + // 遍历 siteData 中的所有站点,查找 siteGroup 中的元素包含于 title 中的首个元素 + let finded = false; + for (let i = 0; i < siteData.length; i++) { + for (let j = 0; j < siteData[i].siteGroups.length; j++) { + // 不区分大小写 + if (title.toLowerCase().indexOf(siteData[i].siteGroups[j].toLowerCase()) !== -1) { + siteData[i].seedSize += sizeToBytes(size); + siteData[i].seedersNumber += seeders; + siteData[i].seedUploadSize += sizeToBytes(uploadSize); + siteData[i].seedDownloadSize += sizeToBytes(downloadSize); + siteData[i].seedTime += timeToSeconds(time); + siteData[i].seedItemsNumber++; + finded = false; + break; + } + } + if (finded) { + break; + } + } + // 如果没找到,更新 Others 站点的数据 + if (!finded) { + // 在 siteData 中找到 Others 站点的索引 + let othersIndex = siteData.findIndex((site) => { + return site.siteName === 'Others'; + }); + siteData[othersIndex].seedSize += sizeToBytes(size); + siteData[othersIndex].seedersNumber += seeders; + siteData[othersIndex].seedUploadSize += sizeToBytes(uploadSize); + siteData[othersIndex].seedDownloadSize += sizeToBytes(downloadSize); + siteData[othersIndex].seedTime += timeToSeconds(time); + siteData[othersIndex].seedItemsNumber++; + } + showResult('解析完成:' + title + '
'); + }); +} + +// 输出数据到表格 +function outputData() { + // 将站点名称、用户名称和用户的 UID 输出到 result 中 + // 使用谷歌 icon 缓存获取站点 icon 地址 + let siteIcon = 'https://www.google.com/s2/favicons?domain=' + window.location.hostname; + showResult('站点名称: ' + siteData[siteIndex].siteName + '
'); + appendResult('用户名称:' + userNameHTML + '
'); + appendResult('用户 ID/UID:' + userID + '
'); + // 将 siteData 中所有站点的 做种数量 和 做种体积 输出到 result 中 + let totalSeedItemsNumber = 0; + let totalSeedSize = 0; + for (let i = 0; i < siteData.length; i++) { + totalSeedItemsNumber += siteData[i].seedItemsNumber; + totalSeedSize += siteData[i].seedSize; + } + appendResult('做种总量:' + totalSeedItemsNumber + '
'); + appendResult('做种总大小:' + bytesToSize(totalSeedSize, 3) + '
'); + + // 输出数据到表格(优先输出当前站点,然后依次输出其他站点) + // 在同一行输出站点名称、做种数量、做种体积、平均做种人数、做种上传总量、做种下载总量、平均做种时间,并将其原始值写入 data-value 属性中 + let table = document.createElement('table'); + table.innerHTML = '站点名称做种数量做种体积平均做种人数做种上传总量做种下载总量平均做种时间'; + // 输出当前站点的数据(仅当 seedItemsNumber 不为 0 时) + if (siteData[siteIndex].seedItemsNumber !== 0) { + let tr = document.createElement('tr'); + tr.innerHTML = '' + siteData[siteIndex].siteName + + '' + siteData[siteIndex].seedItemsNumber + + '' + bytesToSize(siteData[siteIndex].seedSize, 3) + + '' + (siteData[siteIndex].seedersNumber / siteData[siteIndex].seedItemsNumber).toFixed(2) + + '' + bytesToSize(siteData[siteIndex].seedUploadSize, 2) + + '' + bytesToSize(siteData[siteIndex].seedDownloadSize, 2) + + '' + secondsToTime((siteData[siteIndex].seedTime / siteData[siteIndex].seedItemsNumber)) + + ''; + table.appendChild(tr); + } + // 输出其他站点的数据(仅当 seedItemsNumber 不为 0 时) + for (let i = 0; i < siteData.length; i++) { + if (i !== siteIndex && siteData[i].seedItemsNumber !== 0) { + let tr = document.createElement('tr'); + tr.innerHTML = '' + siteData[i].siteName + + '' + siteData[i].seedItemsNumber + + '' + bytesToSize(siteData[i].seedSize, 3) + + '' + (siteData[i].seedersNumber / siteData[i].seedItemsNumber).toFixed(2) + + '' + bytesToSize(siteData[i].seedUploadSize, 2) + + '' + bytesToSize(siteData[i].seedDownloadSize, 2) + + '' + secondsToTime((siteData[i].seedTime / siteData[i].seedItemsNumber)) + + ''; + table.appendChild(tr); + } + } + // 将表格输出到 result 中 + appendResult(table.outerHTML); + notice.style.backgroundColor = 'rgba(31,177,65,1)'; + notice.style.color = 'white'; + // #ss-container 的最小宽度设置为其当前值,防止变形 + ssContainer.style.minWidth = ssContainer.offsetWidth + 'px'; + // 表格排序功能 + // 鼠标悬停显示手型 + let tableHead = document.querySelectorAll('#ss-container table tr th'); + for (let i = 0; i < tableHead.length; i++) { + tableHead[i].addEventListener('mouseover', function() { + this.style.cursor = 'pointer'; + }); + } + // 获取表格元素 + let tableElement = document.querySelector('#ss-container table'); + // 当 #ss-container 中的表格表头项被点击时,使用 sortTable 函数进行排序 + for(let i = 0; i < tableHead.length; i++) { + tableHead[i].addEventListener('click', function() { + sortTable(tableElement, i); + }); + } +} + +// sortTable 函数,根据对应列 col 对 table 进行排序 +function sortTable(table, col) { + // 清除所有其他列后的 ' ▲' ' ▼' + let tableHead = document.querySelectorAll('#ss-container table tr th'); + for (let i = 0; i < tableHead.length; i++) { + if (i !== col) { + tableHead[i].innerHTML = tableHead[i].innerHTML.replace(' ▲', '').replace(' ▼', ''); + } + } + // 如果列后面有 ' ▲',则将其改为 ' ▼',并将 table 进行降序排序 + if (tableHead[col].innerHTML.indexOf(' ▲') !== -1) { + tableHead[col].innerHTML = tableHead[col].innerHTML.replace(' ▲', ' ▼'); + sortTableDesc(table, col); + } + // 如果列后面有 ' ▼',则将其改为 ' ▲',并将 table 进行升序排序 + else if (tableHead[col].innerHTML.indexOf(' ▼') !== -1) { + tableHead[col].innerHTML = tableHead[col].innerHTML.replace(' ▼', ' ▲'); + sortTableAsc(table, col); + } + // 如果列后面没有 ' ▲' ' ▼',则将其改为 ' ▲',并将 table 进行升序排序 + else { + tableHead[col].innerHTML = tableHead[col].innerHTML + ' ▲'; + sortTableAsc(table, col); + } +} + +// sortTableAsc 函数,根据对应列 col 对 table 进行升序排序 +function sortTableAsc(table, col) { + let rows = table.rows; + let arr = []; + for (let i = 1; i < rows.length; i++) { + arr.push(rows[i]); + } + arr.sort(function(a, b) { + let aVal = a.cells[col].getAttribute('data-value'); + let bVal = b.cells[col].getAttribute('data-value'); + if (isNaN(aVal) || isNaN(bVal)) { + return aVal.localeCompare(bVal); + } + else { + return aVal - bVal; + } + }); + for (let i = 0; i < arr.length; i++) { + table.appendChild(arr[i]); + } +} + +// sortTableDesc 函数,根据对应列 col 对 table 进行降序排序 +function sortTableDesc(table, col) { + let rows = table.rows; + let arr = []; + for (let i = 1; i < rows.length; i++) { + arr.push(rows[i]); + } + arr.sort(function(a, b) { + let aVal = a.cells[col].getAttribute('data-value'); + let bVal = b.cells[col].getAttribute('data-value'); + if (isNaN(aVal) || isNaN(bVal)) { + return bVal.localeCompare(aVal); + } + else { + return bVal - aVal; + } + }); + for (let i = 0; i < arr.length; i++) { + table.appendChild(arr[i]); + } +} + +/* UI 相关 */ + +// 向页面注入 UI +function injectUI() { + let ssHTML = document.createElement('div'); + ssHTML.id = 'ss-container'; + ssHTML.innerHTML = ` +
+
+
+
+
+
+
+ +
+
+ `; + let ssCSS = document.createElement('style'); + ssCSS.innerHTML = ` + #ss-high-friction-bar { + display: flex; + flex-direction: column; + justify-content: start; + align-items: center; + margin-bottom: 6px; + cursor: move; + } + .ss-graph { + height: 1px; + width: 60px; + background-color: rgba(0, 0, 0, 0.1); + margin-bottom: 2px; + } + #ss-container { + font-family: "Helvetica Neue", Helvetica, Arial; + font-size: 0.8rem; + line-height: 1.45; + color: rgba(0, 0, 0, 0.76); + box-sizing: border-box; + min-width: 20vw; + max-width: 80vw; + width: auto; + height: auto; + min-height: 15vh; + max-height: 90vh; + background-color: rgba(255, 255, 255, 0.96); + position: fixed; + left: 0; + top: 0; + border-radius: 6px; + margin: 12px; + padding: 12px; + box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.1); + transition: box-shadow 0.1s ease-in-out; + overflow: auto; + z-index: 9999; + } + #ss-container:hover { + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.25); + background-color: white; + } + #ss-notice { + background-color: rgba(0, 0, 0, 0.05); + width: fit-content; + padding: 0.2rem; + border-radius: 3px; + } + #ss-result { + margin-top: 0.4rem; + } + #ss-result table { + border-collapse: collapse; + margin-top: 0.4rem; + } + #ss-result table, #ss-result th, #ss-result td { + border: 0; + /* background-color: rgba(4,150,255,1); */ + } + #ss-result th { + background-color: rgba(4, 142, 255, 0.96); + color: rgba(255, 255, 255, 0.96); + } + #ss-result th, #ss-result td { + text-align: left; + padding: 0.2rem 1rem; + } + #ss-result tr:nth-child(odd) { + background-color: rgba(0, 0, 0, 0.05); + } + #ss-result tr:nth-child(even) { + background-color: rgba(0, 0, 0, 0.1); + } + #ss-result td { + font-size: inherit; + } + `; + document.body.appendChild(ssCSS); + document.body.appendChild(ssHTML); + notice = document.querySelector('#ss-notice'); + result = document.querySelector('#ss-result'); +} +// 显示提示信息 +function showNotice(text) { + notice.style.display = 'block'; + notice.querySelector('#ss-notice-text').innerText = text; +} +// 隐藏提示信息 +function hideNotice() { + notice.style.display = 'none'; +} +// 显示结果 +function showResult(text) { + result.style.display = 'block'; + result.innerHTML = text; +} +// 追加结果 +function appendResult(text) { + result.style.display = 'block'; + result.innerHTML += text; +} +// 隐藏结果 +function hideResult() { + result.style.display = 'none'; +} +// UI 事件绑定 +function bindUIActions() { + ssContainer = document.querySelector("#ss-container"); + ssBar = document.querySelector("#ss-high-friction-bar"); + // 鼠标在 ssBar 上按下时,使 ssContainer 跟随鼠标移动 + ssBar.onmousedown = function (e) { + let x = e.clientX - ssContainer.offsetLeft; + let y = e.clientY - ssContainer.offsetTop; + // 增大 ssContainer 的阴影效果 + ssContainer.style.boxShadow = "0 0 10px 5px rgba(0, 0, 0, 0.1)"; + document.onmousemove = function (e) { + ssContainer.style.left = e.clientX - x - 12 + "px"; + ssContainer.style.top = e.clientY - y - 12 + "px"; + // 防止鼠标移出浏览器窗口 + if (e.clientX - x - 12 < 0) { + ssContainer.style.left = 0; + } + if (e.clientY - y - 12 < 0) { + ssContainer.style.top = 0; + } + if (e.clientX - x - 12 > document.documentElement.clientWidth - ssContainer.offsetWidth) { + ssContainer.style.left = document.documentElement.clientWidth - ssContainer.offsetWidth + "px"; + } + if (e.clientY - y - 12 > document.documentElement.clientHeight - ssContainer.offsetHeight) { + ssContainer.style.top = document.documentElement.clientHeight - ssContainer.offsetHeight + "px"; + } + } + } + // 鼠标松开时,停止移动 + document.onmouseup = function () { + // 恢复 ssContainer 的阴影效果 + ssContainer.style.boxShadow = "0 0 5px 2px rgba(0, 0, 0, 0.1)"; + document.onmousemove = null; + } +} + + +/* 主函数 */ + +(function() { + 'use strict'; + // 调试 + // printSiteData(); + + // 初始化 + init(); + // 持续判断页面是否包含做种列表 + let timer = setInterval(() => { + console.log('Running...'); + if (checkPage()) { + if (!uiReady) { + injectUI(); + bindUIActions(); + uiReady = false; + } + showNotice('正在统计当前页数据,请稍候...'); + // 爬取数据 + spider(); + if(hasNextPage()) { + showNotice('当前页面统计完成,稍后自动统计下一页'); + } else { + showNotice('统计完成,若对结果不满意,可刷新页面后重新尝试'); + outputData(); + clearInterval(timer); + } + } else { + if (uiReady) { + showNotice('当前页面数据已统计过,有可能是没有数据,或需手动切换至下一页'); + } + } + }, 1000); +})(); +uniformed compared + +^http(s?)://(.*).bing\.com/(.*) +
新必应 - 了解详细信息
  1. 分享
    • Facebook
    • Twitter
    • Email
    • Pinterest

新必应简介

提出实际问题。获取完整的答案。聊天并创建。

由 AI 支持的全新应答引擎必应。
You will receive emails about Microsoft Bing, which include offers about Microsoft, Rewards, and partner products. Terms | Privacy

问任何问题

提出较短、较长或介于两者之间的任何长度的问题。提问的准确性越高,答案就越好。

给我写一份三道菜的菜单。

我需要举办6人晚宴。你能帮我推荐三道不包括坚果或海鲜的菜吗?

在必应上试用

帮我计划一个很特别的纪念旅行。

我正在规划我的9月份的周年纪念日旅行。能帮忙推荐一些距伦敦希思罗机场航程不超过3小时的去处吗?

在必应上试用

有什么我可以跟我的孩子一起尝试的艺术创意么?

请推荐一些为1周岁至3周岁孩子作手工的点子和详细说明。制作材料仅限于纸盒、塑料瓶、纸和细绳。

在必应上试用

可以帮我健身么?

请为我制定一个锻炼手臂和腹肌的计划,无需仰卧起坐和健身器材。每次不应超过30分钟。

在必应上试用

写一首押韵的诗词。

我8岁的儿子杰克喜欢狗和关于海洋的科学。请为他写一首押韵的诗。

在必应上试用

帮助我计划钓鱼旅行。

我刚去蒙大拿州的比格霍恩钓过鱼,计划今年春季去佛罗里达群岛钓鱼。请问我需要做的准备工作会有什么不同?

在必应上试用

可以帮我写个故事么?

为孩子们写一个关于住在月球上的狗的故事

在必应上试用

我的编码需要一些帮助。

编写一段输出斐波那契数列的Python代码

在必应上试用

我需要一辆大型快车。

请推荐几款评价不错、六秒百公里加速、六座及以上的四驱车?

在必应上试用

帮我做一份智趣问答。

写一个关于流行音乐琐事的测验,我可以和我的朋友一起玩,有 5 个问题。

在必应上试用

帮我找一个宠物。

我如何挑选最适合我的狗品种? 是领养还是购买更好?

在必应上试用

帮我找一个音乐节。

我喜欢电子音乐,想去参加我的第一个音乐节。你对我有什么提示或建议吗?

在必应上试用

答案仅仅是开始

新必应提供可靠的最新结果,并提供问题的完整答案。当然,它还会引用源。

聊天功能 1 图像

根据需要提问。执行复杂的搜索。跟进。在聊天中进行优化。你将会被理解和感到惊叹。

搜索功能 2 图像

获取答案,而不是面对诸多选项不知所措。必应查看 Web 上的搜索结果,并汇总对特定问题和需求的答复。

灯泡功能 3 图像

获得灵感。无论是电子邮件还是餐食计划,提供你的想法和提示,必应都会为你编写一份草稿以供你在其基础上进行构建。

常见问题解答

有问题? 从此处开始

新必应就像在你搜索 Web 时拥有一位研究助理、个人规划器和创意合作伙伴。使用这组由 AI 支持的功能,你可以:

询问你的实际问题。当你提出复杂问题时,必应会提供详细的回复。

获取实际答案。必应通过 Web 查看搜索结果,为你提供汇总答案。

发挥创意。当你需要灵感时,必应可以帮助你编写文章、故事,甚至分享项目的想法。

在聊天体验中,你还可以聊天并提出后续问题,例如,“可以用更简单的术语”来解释,或者“为我提供更多选项”,以便在搜索中获取不同甚至更详细的答案。

提出问题,就像你正在与某个人交谈一样。这意味着包括详细信息、询问说明或详细信息,以及告诉必应它如何对你更有帮助。下面是一个示例:“我计划在九月与朋友一起旅行。从伦敦希思罗飞 3 小时有哪些海滩?”然后跟进类似“我们该怎么做?”之类的内容。

直接询问有关如何与必应交互的提示。尝试“你能做什么?”“你能帮我处理 X 吗?”“你的限制是什么?”必应会在有无法帮助的内容时通知你。

必应尝试让答案保持有趣和真实,但鉴于这是早期预览版,它仍可根据汇总的 Web 内容显示意外或不准确的结果,因此请使用最佳判断。我们一直在学习,欢迎提供反馈以帮助必应改进。使用每个必应页面右下角的反馈按钮分享你的想法。

新的必应基于现有的必应体验,为你提供新类型的搜索。

除了生成相关链接列表之外,必应还跨 Web 整合可靠源,为你提供一个汇总的答案。

搜索你说话、构建文本和思考的方式。必应采用复杂的搜索并共享回详细的响应。

在聊天体验中,你可以自然地聊天,并向初始搜索提出后续问题,以获取个性化的回复。

必应可用作创意工具。它可以帮助你编写故事、故事,甚至分享项目的想法。

必应在 Web 上搜索相关内容,然后汇总找到的内容以生成有用的响应。它还引用了其源,因此你能够看到指向它引用的 Web 内容的链接。

在 Microsoft,我们非常重视对负责任 AI 的承诺。我们正在根据 AI 原则 开发必应。我们正在与我们的合作伙伴 OpenAI 合作,以提供鼓励负责任使用的体验。例如,我们在基础模型工作上已经并将继续与 OpenAI 合作,我们设计必应用户体验以使人类为中心,并且我们开发了一个安全系统,旨在缓解故障并避免滥用内容筛选、操作监视和滥用检测以及其他安全措施。等待列表过程也是我们负责任的 AI 方法的一部分。我们将从具有必应早期访问权限的人员处获取用户反馈,以改进该工具,然后使其广泛可用。

负责任 AI 是一段旅程,我们将不断改进我们的系统。我们致力于提高 AI 的可靠性和可信度,你的反馈将帮助我们实现此操作。若要详细了解如何负责任地使用必应,请参阅我们的 使用条款和内容策略

尽管必应努力避免在搜索结果中共享意外的冒犯性内容,并已采取措施防止其聊天功能涉及可能有害的主题,但仍可能会看到意外结果。我们一直在努力改进预防有害内容的技术。

如果在系统中遇到有害或不适当的内容,请提供反馈或向必应报告问题,方法是打开响应右上角的菜单,然后单击标志图标。还可以使用每个必应页面右下角的反馈按钮。我们将继续使用用户反馈,为所有人提供安全的搜索体验。

必应旨在将其所有响应都基于可靠的来源,但 AI 可能会出错,并且 Internet 上的第三方内容可能并不总是准确或可靠。必应有时会错误地引用它找到的信息,你可能会看到听起来有说服力但不完整、不准确或不恰当的响应。根据必应的响应做出决策或采取措施之前,请使用自己的判断并仔细检查事实。

若要共享网站反馈或报告问题,请打开响应右上角的菜单,然后单击标志图标。还可以使用每个必应页面右下角的反馈按钮。

可以通过选择“加入等待列表”来请求访问权限。清除等待列表后,你将收到一封电子邮件,告知你可以在 Bing.com 访问新的必应,然后可以在常用搜索框中开始键入内容。新必应也可在聊天体验中找到,位于搜索结果的顶部。

成为世界第一批使用 AI 支持的应答引擎的用户之一

由 AI 支持的全新应答引擎必应。
You will receive emails about Microsoft Bing, which include offers about Microsoft, Rewards, and partner products. Terms | Privacy
新必应 - 了解详细信息
新必应 - 了解详细信息
  1. 分享
    • Facebook
    • Twitter
    • Email
    • Pinterest

新必应简介

提出实际问题。获取完整的答案。聊天并创建。

由 AI 支持的全新应答引擎必应。
You will receive emails about Microsoft Bing, which include offers about Microsoft, Rewards, and partner products. Terms | Privacy

问任何问题

提出较短、较长或介于两者之间的任何长度的问题。提问的准确性越高,答案就越好。

给我写一份三道菜的菜单。

我需要举办6人晚宴。你能帮我推荐三道不包括坚果或海鲜的菜吗?

在必应上试用

帮我计划一个很特别的纪念旅行。

我正在规划我的9月份的周年纪念日旅行。能帮忙推荐一些距伦敦希思罗机场航程不超过3小时的去处吗?

在必应上试用

有什么我可以跟我的孩子一起尝试的艺术创意么?

请推荐一些为1周岁至3周岁孩子作手工的点子和详细说明。制作材料仅限于纸盒、塑料瓶、纸和细绳。

在必应上试用

可以帮我健身么?

请为我制定一个锻炼手臂和腹肌的计划,无需仰卧起坐和健身器材。每次不应超过30分钟。

在必应上试用

写一首押韵的诗词。

我8岁的儿子杰克喜欢狗和关于海洋的科学。请为他写一首押韵的诗。

在必应上试用

帮助我计划钓鱼旅行。

我刚去蒙大拿州的比格霍恩钓过鱼,计划今年春季去佛罗里达群岛钓鱼。请问我需要做的准备工作会有什么不同?

在必应上试用

可以帮我写个故事么?

为孩子们写一个关于住在月球上的狗的故事

在必应上试用

我的编码需要一些帮助。

编写一段输出斐波那契数列的Python代码

在必应上试用

我需要一辆大型快车。

请推荐几款评价不错、六秒百公里加速、六座及以上的四驱车?

在必应上试用

帮我做一份智趣问答。

写一个关于流行音乐琐事的测验,我可以和我的朋友一起玩,有 5 个问题。

在必应上试用

帮我找一个宠物。

我如何挑选最适合我的狗品种? 是领养还是购买更好?

在必应上试用

帮我找一个音乐节。

我喜欢电子音乐,想去参加我的第一个音乐节。你对我有什么提示或建议吗?

在必应上试用

答案仅仅是开始

新必应提供可靠的最新结果,并提供问题的完整答案。当然,它还会引用源。

聊天功能 1 图像

根据需要提问。执行复杂的搜索。跟进。在聊天中进行优化。你将会被理解和感到惊叹。

搜索功能 2 图像

获取答案,而不是面对诸多选项不知所措。必应查看 Web 上的搜索结果,并汇总对特定问题和需求的答复。

灯泡功能 3 图像

获得灵感。无论是电子邮件还是餐食计划,提供你的想法和提示,必应都会为你编写一份草稿以供你在其基础上进行构建。

常见问题解答

有问题? 从此处开始

新必应就像在你搜索 Web 时拥有一位研究助理、个人规划器和创意合作伙伴。使用这组由 AI 支持的功能,你可以:

询问你的实际问题。当你提出复杂问题时,必应会提供详细的回复。

获取实际答案。必应通过 Web 查看搜索结果,为你提供汇总答案。

发挥创意。当你需要灵感时,必应可以帮助你编写文章、故事,甚至分享项目的想法。

在聊天体验中,你还可以聊天并提出后续问题,例如,“可以用更简单的术语”来解释,或者“为我提供更多选项”,以便在搜索中获取不同甚至更详细的答案。

提出问题,就像你正在与某个人交谈一样。这意味着包括详细信息、询问说明或详细信息,以及告诉必应它如何对你更有帮助。下面是一个示例:“我计划在九月与朋友一起旅行。从伦敦希思罗飞 3 小时有哪些海滩?”然后跟进类似“我们该怎么做?”之类的内容。

直接询问有关如何与必应交互的提示。尝试“你能做什么?”“你能帮我处理 X 吗?”“你的限制是什么?”必应会在有无法帮助的内容时通知你。

必应尝试让答案保持有趣和真实,但鉴于这是早期预览版,它仍可根据汇总的 Web 内容显示意外或不准确的结果,因此请使用最佳判断。我们一直在学习,欢迎提供反馈以帮助必应改进。使用每个必应页面右下角的反馈按钮分享你的想法。

新的必应基于现有的必应体验,为你提供新类型的搜索。

除了生成相关链接列表之外,必应还跨 Web 整合可靠源,为你提供一个汇总的答案。

搜索你说话、构建文本和思考的方式。必应采用复杂的搜索并共享回详细的响应。

在聊天体验中,你可以自然地聊天,并向初始搜索提出后续问题,以获取个性化的回复。

必应可用作创意工具。它可以帮助你编写故事、故事,甚至分享项目的想法。

必应在 Web 上搜索相关内容,然后汇总找到的内容以生成有用的响应。它还引用了其源,因此你能够看到指向它引用的 Web 内容的链接。

在 Microsoft,我们非常重视对负责任 AI 的承诺。我们正在根据 AI 原则 开发必应。我们正在与我们的合作伙伴 OpenAI 合作,以提供鼓励负责任使用的体验。例如,我们在基础模型工作上已经并将继续与 OpenAI 合作,我们设计必应用户体验以使人类为中心,并且我们开发了一个安全系统,旨在缓解故障并避免滥用内容筛选、操作监视和滥用检测以及其他安全措施。等待列表过程也是我们负责任的 AI 方法的一部分。我们将从具有必应早期访问权限的人员处获取用户反馈,以改进该工具,然后使其广泛可用。

负责任 AI 是一段旅程,我们将不断改进我们的系统。我们致力于提高 AI 的可靠性和可信度,你的反馈将帮助我们实现此操作。若要详细了解如何负责任地使用必应,请参阅我们的 使用条款和内容策略

尽管必应努力避免在搜索结果中共享意外的冒犯性内容,并已采取措施防止其聊天功能涉及可能有害的主题,但仍可能会看到意外结果。我们一直在努力改进预防有害内容的技术。

如果在系统中遇到有害或不适当的内容,请提供反馈或向必应报告问题,方法是打开响应右上角的菜单,然后单击标志图标。还可以使用每个必应页面右下角的反馈按钮。我们将继续使用用户反馈,为所有人提供安全的搜索体验。

必应旨在将其所有响应都基于可靠的来源,但 AI 可能会出错,并且 Internet 上的第三方内容可能并不总是准确或可靠。必应有时会错误地引用它找到的信息,你可能会看到听起来有说服力但不完整、不准确或不恰当的响应。根据必应的响应做出决策或采取措施之前,请使用自己的判断并仔细检查事实。

若要共享网站反馈或报告问题,请打开响应右上角的菜单,然后单击标志图标。还可以使用每个必应页面右下角的反馈按钮。

可以通过选择“加入等待列表”来请求访问权限。清除等待列表后,你将收到一封电子邮件,告知你可以在 Bing.com 访问新的必应,然后可以在常用搜索框中开始键入内容。新必应也可在聊天体验中找到,位于搜索结果的顶部。

成为世界第一批使用 AI 支持的应答引擎的用户之一

由 AI 支持的全新应答引擎必应。
You will receive emails about Microsoft Bing, which include offers about Microsoft, Rewards, and partner products. Terms | Privacy
新必应 - 了解详细信息 + + + + // Your code here... +})(); diff --git a/ui(10).js b/ui(10).js new file mode 100644 index 0000000..6c3c0d7 --- /dev/null +++ b/ui(10).js @@ -0,0 +1,191 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / demos / DragCreateElement / DragCreateElement.html + + + + + + + 拖拽创建元素 + + + +
+
+
+
+
+
+ +
+ + + + + + // Your code here... +})(); diff --git a/ui(11).js b/ui(11).js new file mode 100644 index 0000000..6975f33 --- /dev/null +++ b/ui(11).js @@ -0,0 +1,227 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / demos / ContextMenu / index.html + + + + + + + FabricJS 右键菜单 + + + + +说明文档:《Fabric.js自定义右键菜单》 + +
+ + +
+ + + + + + // Your code here... +})(); diff --git a/ui(12).js b/ui(12).js new file mode 100644 index 0000000..212005e --- /dev/null +++ b/ui(12).js @@ -0,0 +1,45 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / tutorial / IText / enterEditing.html + + + + + + + 激活输入框 + + + + + + + + + // Your code here... +})(); diff --git a/ui(2).js b/ui(2).js new file mode 100644 index 0000000..4a7c1ff --- /dev/null +++ b/ui(2).js @@ -0,0 +1,125 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + mouse:wheel:滚轮事件 +getZoom:获取画布当前缩放级别 +setZoom:设置画布缩放级别 +zoomToPoint:设置画布缩放比例及缩放原点 +其中 setZoom 和 zoomToPoint 的应用场景不同。 + + +起步 + +在使用缩放功能之前,先初始化一下画布。 + +我还会在画布上设置一个背景图,便于观察。 + +01.png + + + + + + + +复制代码 + +缩放画布(以左上角为原点) + +以左上角为原点进行缩放画布,推荐使用 getZoom 和 setZoom 组合。 + +getZoom 可以获取画布当前缩放级别,用 setZoom 设置一个新的缩放级别。 + +所以我在页面上再加2个按钮,一个放大,一个缩小。 + +02.gif + +
+ + +
+ + + + + + +复制代码 +放大时缩放级别加1,缩小时缩放级别减1。 + + +缩放画布(以鼠标指针为原点) + +03.gif + + + + + + + +//复制代码 +//使用 mouse:wheel 监听鼠标滚轮滚动,如果向上滚动,deltaY 的值是100,向下就是 -100,所以可以自己设置一条公式来控制滚动时的缩放级别。 + +//zoomToPoint 可以理解为 setZoom 的增强版,第一个参数是原点坐标,本例传入鼠标当前所在的坐标;第二个参数是缩放级别。 + // Your code here... +})(); diff --git a/ui(3).js b/ui(3).js new file mode 100644 index 0000000..0454d56 --- /dev/null +++ b/ui(3).js @@ -0,0 +1,61 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / tutorial / Canvas / 滚轮缩放画布.html + + + + + + + + 滚轮缩放画布 + + + + + + + + + // Your code here... +})(); diff --git a/ui(6). b/ui(6). new file mode 100644 index 0000000..9633725 --- /dev/null +++ b/ui(6). @@ -0,0 +1,65 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / tutorial / IText / styles03fontSize.html + + + + + + + 动态设置字号大小 + + + + + + + + + + + + // Your code here... +})(); diff --git a/ui(7).js b/ui(7).js new file mode 100644 index 0000000..ef0f842 --- /dev/null +++ b/ui(7).js @@ -0,0 +1,62 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / tutorial / Canvas / centeredScaling.html + + + + + + + centeredScaling + + + + + + + + + + // Your code here... +})(); diff --git a/ui(8).js b/ui(8).js new file mode 100644 index 0000000..9728140 --- /dev/null +++ b/ui(8).js @@ -0,0 +1,73 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / tutorial / Object / intersectsWithObject.html + + + + + + + 检测元素重叠intersectsWithObject + + + + + + + + + // Your code here... +})(); diff --git a/ui(9).js b/ui(9).js new file mode 100644 index 0000000..03f815e --- /dev/null +++ b/ui(9).js @@ -0,0 +1,44 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + + + + + + + 激活输入框 + + + + + + + + + // Your code here... +})(); diff --git a/vur UI AUTO.js b/vur UI AUTO.js new file mode 100644 index 0000000..af11cac --- /dev/null +++ b/vur UI AUTO.js @@ -0,0 +1,83 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + 'use strict'; +vue开发页面自适应屏幕尺寸 +1.概述 +使用vue开发的页面都是通过px设置它的尺寸,如果换了一个不同尺寸的屏幕就会出现页面排版错乱,显示不完整等情况。下面通过插件将px装换为rem单位适应不同尺寸的屏幕。 +2.网页适配屏幕尺寸 +2.1.安装插件 +lib-flexible插件作用是根据rem调整页面宽高,自适应屏幕尺寸 +px2rem-loader插件作用是将px单位转换为rem单位,lib-flexible插件才能根据rem调整网页宽高尺寸。 +# 安装lib-flexible插件 +yarn add lib-flexible +# 安装px2rem-loader插件 -D 安装到开发环境 +yarn add -D px2rem-loader +2.2.配置插件 +1.在main.js文件中引用lib-flexible插件 +import Vue from "vue" +import App from "./App.vue" +import router from "./router" +import store from "./store" +import "@/assets/scss/reset.scss" +import axios from "axios" +// UI +import ElementUI from "element-ui" +import "element-ui/lib/theme-chalk/index.css" + +// tools +// 引用lib-flexible插件 +import "lib-flexible" +2.在vue.config.js中配置px2rem-loader + +module.exports = { + configureWebpack: { + // webpack 配置 + output: { + filename: , + chunkFilename: `, + }, + }, + // 配置px2rem-loader + chainWebpack: config => { + config.module + .rule("css") + .test(/\.css$/) + .oneOf("vue") + .resourceQuery(/\?vue/) + .use("px2rem") + .loader("px2rem-loader") + .options({ + // 设置px转化为rem比例,设计稿大小为1920,比例 1920/ 10 + remUnit: 192 + }); + }, +} +3.修改flexible.js +全局搜索flexible.js,将refreshRem函数中原本的540替换为width,这样就实现了宽度根据屏幕大小自动适配. +或者在下面的路径找到该文件:node_modules/lib-flexible/flexible.js + +function refreshRem(){ + var width = docEl.getBoundingClientRect().width; + if (width / dpr > 540) { + // 将width = 540 * dpr; 540改为width + width = width * dpr; + } + var rem = width / 10; + docEl.style.fontSize = rem + 'px'; + flexible.rem = win.rem = rem; + } +重启服务,改变浏览器大小网页的内容能够随着页面大小而改变。 +到此这篇关于vue开发页面自适应屏幕尺寸的文章就介绍到这了,更多相关vue页面自适应屏幕内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! + + // Your code here... +})(); diff --git a/windows forms.js b/windows forms.js new file mode 100644 index 0000000..6dd7f3b --- /dev/null +++ b/windows forms.js @@ -0,0 +1,60 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + 'use strict';AutomationElement.GetClickablePoint 方法 +参考 + + +定义 + +命名空间: +System.Windows.Automation +程序集: +UIAutomationClient.dll +检索 AutomationElement 上可以单击的点。 +public: + System::Windows::Point GetClickablePoint(); +public System.Windows.Point GetClickablePoint (); +member this.GetClickablePoint : unit -> System.Windows.Point +Public Function GetClickablePoint () As Point +返回 +Point +一个点的物理屏幕坐标,客户端可以使用该点在此元素单击。 +例外 +NoClickablePointException +没有可单击的点。 +ElementNotAvailableException +AutomationElement 的 UI 不再存在。 +示例 + +以下代码检索控件的可单击点,并将系统游标移动到该点。 +// element is an AutomationElement. +System.Windows.Point clickablePoint = element.GetClickablePoint(); +System.Windows.Forms.Cursor.Position = + new System.Drawing.Point((int)clickablePoint.X, (int)clickablePoint.Y); +' element is an AutomationElement. +Dim clickablePoint As System.Windows.Point = element.GetClickablePoint() +System.Windows.Forms.Cursor.Position = New System.Drawing.Point(CInt(clickablePoint.X), CInt(clickablePoint.Y)) +注解 + +AutomationElement如果它被另一个窗口完全遮盖,则不可单击。 +AutomationElement满足以下所有条件时,可单击: +它以编程方式可见,可用于UI 自动化树。 +它将完全滚动到其父容器内的视图中(如果有)。 如果剪裁了该元素,则不能保证该元素可单击。 +该元素不会被任何其他 UI 元素遮盖。 如果该元素部分被除其上级以外的某些 UI 元素遮盖,则它可能不可单击。 +包含元素的窗口必须可单击。 例如,如果包含窗口完全透明,则无法单击该窗口。 鼠标单击将单击到下面的窗口,因此透明窗口中的任何控件都不会返回可单击点。 +如果元素是 ((如列表或树视图)) 的容器,则它必须具有一个点,单击时将导致控件的背景处于焦点。 如果容器控件的每个部分都由子元素占用,则它不可单击。 +不能保证当单击某个点时,控件将执行任何操作,该点定义为UI 自动化提供程序可单击。 请考虑改用控件模式对控件执行操作。 +适用于 + + // Your code here... +})(); diff --git a/yuyin.js b/yuyin.js new file mode 100644 index 0000000..2ae4794 --- /dev/null +++ b/yuyin.js @@ -0,0 +1,214 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { +# 离线语音听写 Android SDK 文档 +# 1、简介 +语音听写,是基于自然语言处理,将自然语言音频转换为文本输出的技术。语音听写技术与语法识别技术的不同在于,语音听写不需要基于某个具体的语法文件,其识别范围是整个语种内的词条。 + +语音听写详细的接口介绍及说明请参考: MSC Android API 文档 。 + +在集成过程中出现错误,请优先查询SDK&API 错误码查询 。如有疑问,请提交工单 进行咨询,也可登录讯飞开放平台论坛 与广大开发者共同学习和交流 + +# 2、SDK集成指南 +# 2.1、Demo运行步骤 +根据官网控制台 提示,直接下载SDK,SDK中包含简易可运行的Demo。如下图所示: + + +下载完SDK后,解压至相应的路径。 + +注:使用demo测试时,需将res中除layout外资源拷贝到demo中assets相应的路径下 + +以Android Studio集成开发工具为例,测试时建议直接用真机进行测试。 + +# 方法一(导入project方式): +打开Android Studio,在菜单栏File--->new--->import project当前解压sdk路径,使用离线服务能力选择导入mscV5PlusDemo,如下图所示: + + +导入成功之后sync编译下,编译无误可连接手机,开启手机USB开发调试模式,直接在Android Studio运行导入的mscV5PlusDemo,最后生成的apk可直接安装在对应的手机上,如下图所示: + +如果编译时出现“ERROR: Plugin with id 'com.android.application' not found.”错误,请在build.gradle文件中添加以下代码。 + +buildscript { + repositories { + google() + jcenter() + } + dependencies { + //版本号请根据自己的gradle插件版本号自行更改 + classpath 'com.android.tools.build:gradle:3.4.0' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} +如在导入项目中还出现其他问题,可参考帖子:安卓demo常见错误排查 + +# 方法二(导入module方式): +打开Android Studio,在菜单栏File--->new--->import Module当前解压sdk路径,使用离线服务能力选择导入mscV5PlusDemo,导入成功之后sync编译下,编译无误可连接手机,开启手机USB开发调试模式,直接在Android Studio运行导入的mscV5PlusDemo,最后生成的apk可直接安装在对应的手机上。 + +# 2.2、项目集成步骤 +# 2.2.1、SDK包说明 +《Android SDK目录结构一览》 + +manifests: +android配置应用权限文件 +sample: +相关离线能力demo(离线语音听写IatDemo) +assets: +SDK相关资源配置文件 +Libs: +动态库和jar包 +res: +UI文件和相关布局文件xml +readme说明(必看) +release 版本说明 +# 2.2.2、导入SDK +将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下,如下图所示: + +备注: + +arm版本已经逐步淘汰了,arm架构的推荐使用armeabi-v7a。 +如果您需要将应用push到设备使用,请将设备cpu对应指令集的libmsc.so push到/system/lib中。 +使用demo测试时,需将res中除layout外资源拷贝到demo中assets相应的路径下。 +.集成到项目,需要将sdk中Demo/src/main/下文件拷贝到项目main中,以AS为例,且需要在项目main文件夹下新建Jnilibs并拷贝libmsc.so。 +msc.jar需要拷贝至项目libs下,并且右键jar添加Add As Library。 +sdk下文件夹main/assets/,自带UI页面(iflytek文件夹)和相关其他服务资源文件(语法文件、音频示例、词表),使用自带UI接口时,可以将assets/iflytek文件拷贝到项目中。 +# 2.2.3、添加用户权限 +在工程 AndroidManifest.xml 文件中添加如下权限 + + + + + + + + + + + + + + + + + + + + + + + + + + +注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码: + + -keep class com.iflytek.**{*;} + -keepattributes Signature +# 2.2.4、初始化 +初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下: + + // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn + // 请勿在“=”与appid之间添加任何空字符或者转义符 + // appid 必须和下载的SDK保持一致,否则会出现10407错误 + // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null + SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678"); +# 2.3、UI设置 +sdk提供了两种识别方式,分别为带UI识别和无UI方式: + +# 2.3.1、无UI识别 +//初始化识别无UI识别对象 +//使用SpeechRecognizer对象,可根据回调消息自定义界面; +mIat = SpeechRecognizer.createRecognizer(IatDemo.this, mInitListener); + +//设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。 +mIat.setParameter( SpeechConstant.CLOUD_GRAMMAR, null ); +mIat.setParameter( SpeechConstant.SUBJECT, null ); +//设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容 +mIat.setParameter(SpeechConstant.RESULT_TYPE, "json"); +//此处engineType为“cloud” +mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType ); +//设置语音输入语言,zh_cn为简体中文 +mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); +//设置结果返回语言 +mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); +// 设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理 +//取值范围{1000~10000} +mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); +//设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入, +//自动停止录音,范围{0~10000} +mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); +//设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 +mIat.setParameter(SpeechConstant.ASR_PTT,"1"); + +//开始识别,并设置监听器 +mIat.startListening(mRecogListener); +# 2.3.2、带UI识别 +// 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer +// 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源 +mIatDialog = new RecognizerDialog(IatDemo.this, mInitListener); + +//以下为dialog设置听写参数 +mIatDialog.setParams("xxx","xxx"); +.... + +//开始识别并设置监听器 +mIatDialog.setListener(mRecognizerDialogListener); +//显示听写对话框 +mIatDialog.show(); +# 3、参数设置 +# 3.1、基础参数 +参数名称 名称 说明 +engine_type 引擎类型 离线语音听写默认为:local +asr_res_path 离线识别资源 离线命令词识别需要使用本地资源,通过此参数设置本地资源所在的路径 +值范围:有效的资源文件路径 +默认值:null +result_type 返回结果格式 主要分为三种:json,xml,plain +默认:json +language 语言 离线语音听写仅支持中文:zh_cn +accent 方言 离线语音听写仅支持:mandarin +asr_ptt 标点符号 (仅中文支持)标点符号添加 +1:开启(默认值) +0:关闭 +vad_bos 前端点检测 开始录入音频后,音频前面部分最长静音时长,取值范围[0,10000ms],默认值5000ms +vad_eos 后端点检测 开始录入音频后,音频后面部分最长静音时长,取值范围[0,10000ms],默认值1800ms。 +# 3.2、离线资源路径设置 +resource设置中包含两个资源,common.jet 和 sms_16k.jet, 从资源配置中可以看出,目前离线听写仅支持16k音频 + +private String getResourcePath(){ + StringBuffer tempBuffer = new StringBuffer(); + //识别通用资源 + tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, "iat/common.jet")); + tempBuffer.append(";"); + tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, "iat/sms_16k.jet")); + return tempBuffer.toString(); + } +# 4、常见问题 +# 支持哪些语言? +答:目前只支持中文(普通话)。 +# 离线语音听写是否可以试用? +答:可以的,目前提供10个装机量可以免费试用,试用期90天。 +# 离线语音听写是否支持个性化热词功能? +答:目前不支持。 +# 离线语音听写支持的音频格式是什么? +答:音频长度:小于20s;采样率16KHz;采样精度:16bit;声道单声道,音频文件的录制和格式确认(推荐使用Cool Edit Pro工具)。 +# 离线语音听写识别率低是什么原因? +答:请检查上传的音频格式和属性是否满足pcm、wav对应16KHZ,16bit的音频,如果离线语音听写效果达不到您项目的要求,建议使用在线听写。 +# 支持平台是什么? +答:目前只支持Android平台,不支持其他平台。 +在这篇文章中: +1、简介 +2、SDK集成指南 +3、参数设置 +4、常见问题 + + // Your code here... +})(); diff --git a/zyl.js b/zyl.js new file mode 100644 index 0000000..a0fb36b --- /dev/null +++ b/zyl.js @@ -0,0 +1,205 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { +#注意力多层感知机 +#基于注意力机制的多层感知机的实现 + #写作这篇博客的过程中参考了keras教程-n-循环神经网络的注意力机制的理论和实现里面的问题和代码,但是这篇文章中的问题描述不清晰、代码比较冗余,所以按照自己对问题和注意力机制的理解改进了其中的问题描述和代码实现。 + +1 问题描述 + + 假设有一个6位数字,要求预测其前3位数组成的数字与后3位数组成的数字之差的绝对值。 + +2 解决思路 + + 我们考虑用深度学习中一个简单的模型——多层感知机来完成这个任务,同时,考虑到两个3位数相减时,不同数位的数字对于结果的重要性是不一样的,比如百位上的数字比个位上的数字对结果影响大,我们引入了注意力机制。注意力机制起源于人类视觉系统,人类视觉系统在查看图像时,会快速扫描全局图像,获取需要重点关注的目标区域,而后对这一区域投入更多资源,以获取更多需要关注的目标的细节,抑制其他无用信息,关于注意力机制的概念可以参考这篇博客:深度学习中的注意力机制概述。基于注意力机制的多层感知机的网络结构如下: + +首先通过全连接层获取输入数据的注意力分布,即对于该任务而言每个数位的重要程度 +然后将注意力分布与输入相乘得到输入数据的表示 +再加入两个全连接层获取输入数据的高层表示 +使用MSE损失函数和Aadm优化器对模型进行优化 +3 代码实现 + + 该部分包含数据仿真、模型构建和注意力机制可视化三部分,下面将以代码加注释的形式讲解。 + +3.1 数据仿真 + + 首先,我们仿真出10万条数据用于模型的训练、验证和测试。代码如下: + +# 创建样本数据 +def create_data(n): + """ + :param n: 样本数量 + :return: 样本的特征及标签 + """ + # 预定义特征 + X = np.zeros((n, TIME_STEP), dtype='int32') # np.zeros返回一个给定形状和类型的用0填充的数组 + # 预定义标签 + Y = np.zeros((n, ), dtype='int32') + for i in range(n): + # 特征 + feature = np.random.randint(0, 10, size=TIME_STEP) # 生成仿真数组 + x1 = feature[0] * 100 + feature[1] * 10 + feature[2] # 第一个三位数 + x2 = feature[3] * 100 + feature[4] * 10 + feature[5] # 第二个三位数 + # 标签 + label = abs(x1 - x2) # 两个三位数的差的绝对值 + X[i] = feature + Y[i] = label + # 返回归一化后的特征和标签 + return { + 'X': X / 10, # 字典类型 + 'Y': Y / 1000, + } + + +SAMPLE_NUM = 300000 # 样本数量 +data = create_data(SAMPLE_NUM) # 调用函数生成样本,字典类型 + +3.2 模型构建 + + 我们使用Keras中的函数模型构建网络结构,函数模型是一个非常灵活且强大的工具,能够完成许多复杂的网络构建任务。我们构建的模型包含相互关联的两块,一个是总模型,输入为特征数组,输出为预测的差值的绝对值;子模型的输入为特征数组,输出为特征的注意力分布,即特征的权重。代码如下: + +# 参数定义 +BATCH_SIZE = 12800 # 批次大小 +TIME_STEP = 6 # 样本特征数量 +DEMESION = 10 # 每个特征的维度 +OUTPUT_LEN = 3 # 标签的维度 + + +# 构建带有注意力的多层感知机模型 +def build_model(): + inputs = Input(shape=(TIME_STEP, )) + # 注意力层,计算输入中每个元素的注意力分布 + attention_prob = Dense(TIME_STEP, activation='relu')(inputs) + # 根据计算的注意力分布对每个输入元素进行加权 + attention_encoding = multiply([inputs, attention_prob]) # 对应位置元素相乘 + # 两个全连接层 + encoding_a = Dense(TIME_STEP, activation='relu')(attention_encoding) + encoding_b = Dense(int(TIME_STEP / 2), activation='relu')(encoding_a) + # 回归问题,不需要将预测结果进行分类转换,所以输出层不需要设置激活函数,直接输出数值 + output = Dense(1)(encoding_b) + # 函数模型 + model = Model(inputs=[inputs], output=output) # 总模型 + att_model = Model(inputs=inputs, output=attention_prob) # 子模型 + # 返回值 + return model, att_model + + +model, att_model = build_model() # 调用函数,返回模型、输出值以及注意力分布 +# 编译模型 +model.compile(loss='MSE', optimizer='Adam') # 损失函数为MSE +# 训练模型,两个模型同时训练 +model.fit([data['X']], data['Y'], epochs=100) + + 训练过程截图如下: +在这里插入图片描述 + +3.3 注意力机制可视化 + + 我们知道,注意力机制在一定程度上可以增加结果的可解释性,这里,我们通过可视化注意力分布来验证注意力机制是否起到了作用。代码如下: + +# 可视化注意力分布 +# 调用子模型得到注意力分布 +att_dis = att_model.predict(data['X']) +avg_attention = np.mean(att_dis, axis=0) +# 注意力分布的归一化 +avg_attention = avg_attention / np.sum(avg_attention, axis=0) +# 以柱状图的形式进行可视化 +plt.bar(range(1, 7), avg_attention) +plt.show() +# 打印注意力分布 +print(avg_attention) + + 可视化结果如下: +在这里插入图片描述 +在这里插入图片描述 + 可以看到,模型对于第1位数字和第4位数字的关注度更高,即第1位数字和第4位数字对结果更重要,说明注意力机制确实起到了作用。 + +4 完整代码 + +#-*-coding:utf-8-*- +""" +@author:taoshouzheng +@time:2019/2/14 8:05 +@email:tsz1216@sina.com +""" + +import numpy as np +from keras.layers import Input, Dense +from keras.layers import multiply +from keras.models import Model +import matplotlib.pyplot as plt +# 参数定义 +BATCH_SIZE = 12800 # 批次大小 +TIME_STEP = 6 # 样本特征数量 +DEMESION = 10 # 每个特征的维度 +OUTPUT_LEN = 3 # 标签的维度 +SAMPLE_NUM = 300000 # 样本数量 +ONE_HOT = False # 是否独热编码 +np.random.seed(1) # 结果重复性设置 +# 创建样本数据 +def create_data(n): + """ + :param n: 样本数量 + :return: 样本的特征及标签以及对应的one-hot编码 + """ + # 预定义特征 + X = np.zeros((n, TIME_STEP), dtype='int32') # np.zeros返回一个给定形状和类型的用0填充的数组 + # 预定义标签 + Y = np.zeros((n, ), dtype='int32') + # one_hot编码部分 + for i in range(n): # 遍历所有样本 + # 特征 + feature = np.random.randint(0, 10, size=TIME_STEP) # numpy.random.randint(low, high size=n)返回一个长度为n的每个元素位于low和high之间的整数数组 + x1 = feature[0] * 100 + feature[1] * 10 + feature[2] # 第一个三位数 + x2 = feature[3] * 100 + feature[4] * 10 + feature[5] # 第二个三位数 + # 标签 + label = abs(x1 - x2) # 两个三位数的差的绝对值 + label_zfill = [int(s) for s in str(label).zfill(OUTPUT_LEN)] # zfill()返回指定长度的字符串,原字符串右端对齐,左端填充0 + X[i] = feature + Y[i] = label + return { + 'X': X / 10, + 'Y': Y / 1000, + } +# 定义带有注意力的多层感知机模型 +def build_model(): + inputs = Input(shape=(TIME_STEP, )) + # 注意力层,计算输入中每个元素的注意力分布 + attention_prob = Dense(TIME_STEP, activation='relu')(inputs) + # 根据计算的注意力分布对每个输入元素进行加权 + attention_encoding = multiply([inputs, attention_prob]) # 对应位置元素相乘 + print(attention_encoding) + encoding_a = Dense(TIME_STEP, activation='relu')(attention_encoding) + encoding_b = Dense(int(TIME_STEP / 2), activation='relu')(encoding_a) + output = Dense(1)(encoding_b) # 回归问题,不需要将预测结果进行分类转换,所以输出层不需要设置激活函数,直接输出数值 + # 函数式模型 + model = Model(inputs=[inputs], output=output) + att_model = Model(inputs=inputs, output=attention_prob) + print(attention_prob) + return model, att_model, inputs, output, attention_prob +model, att_model, inputs, outputs, attention_prob = build_model() # 调用函数,返回模型、输出值以及注意力分布 +data = create_data(SAMPLE_NUM) # 调用函数生成样本 +# 编译模型 +model.compile(loss='MSE', optimizer='Adam', metrics=['mse']) +# 训练模型 +model.fit([data['X']], data['Y'], epochs=50) +# 可视化注意力分布 +att_dis = att_model.predict(data['X']) +avg_attention = np.mean(att_dis, axis=0) +avg_attention = avg_attention / np.sum(avg_attention, axis=0) +# 以柱状图的形式进行可视化 +plt.bar(range(1, 7), avg_attention) +plt.show() +print(avg_attention) + + // Your code here... +})(); diff --git "a/\344\270\212\346\255\245\345\220\221\346\255\243\345\270\270\350\265\260\350\267\257\357\274\214\344\275\240\344\270\215\344\274\232\350\265\260\350\267\257\345\220\227\357\274\237\357\274\214\347\253\231\345\200\274\345\260\217\346\255\245\350\265\260\350\267\257\357\274\214\345\211\215\350\277\233\345\200\222\351\200\200" "b/\344\270\212\346\255\245\345\220\221\346\255\243\345\270\270\350\265\260\350\267\257\357\274\214\344\275\240\344\270\215\344\274\232\350\265\260\350\267\257\345\220\227\357\274\237\357\274\214\347\253\231\345\200\274\345\260\217\346\255\245\350\265\260\350\267\257\357\274\214\345\211\215\350\277\233\345\200\222\351\200\200" new file mode 100644 index 0000000..adfdaaf --- /dev/null +++ "b/\344\270\212\346\255\245\345\220\221\346\255\243\345\270\270\350\265\260\350\267\257\357\274\214\344\275\240\344\270\215\344\274\232\350\265\260\350\267\257\345\220\227\357\274\237\357\274\214\347\253\231\345\200\274\345\260\217\346\255\245\350\265\260\350\267\257\357\274\214\345\211\215\350\277\233\345\200\222\351\200\200" @@ -0,0 +1 @@ +打瞄准头部锁定 diff --git "a/\344\270\255\345\233\275\344\272\272\351\203\275\347\237\245\351\201\223\344\272\272\345\255\227\344\270\272\344\273\200\344\271\210\344\270\215\345\200\222\357\274\214\346\221\224\350\267\244\345\213\207\345\212\233\357\274\214\344\270\215\347\256\241\350\205\277\345\234\250\351\202\243\345\234\260\345\215\225\350\205\277\345\205\245\346\225\214\350\265\242\357\274\214\346\211\213\346\213\250\346\220\202\345\244\264\357\274\214\346\225\214\346\226\234\346\210\221\345\216\213\357\274\214\344\270\215\346\255\273\344\270\215\347\275\242\344\274\221\357\274\214\345\205\210\350\246\201\344\270\212\346\255\245" "b/\344\270\255\345\233\275\344\272\272\351\203\275\347\237\245\351\201\223\344\272\272\345\255\227\344\270\272\344\273\200\344\271\210\344\270\215\345\200\222\357\274\214\346\221\224\350\267\244\345\213\207\345\212\233\357\274\214\344\270\215\347\256\241\350\205\277\345\234\250\351\202\243\345\234\260\345\215\225\350\205\277\345\205\245\346\225\214\350\265\242\357\274\214\346\211\213\346\213\250\346\220\202\345\244\264\357\274\214\346\225\214\346\226\234\346\210\221\345\216\213\357\274\214\344\270\215\346\255\273\344\270\215\347\275\242\344\274\221\357\274\214\345\205\210\350\246\201\344\270\212\346\255\245" new file mode 100644 index 0000000..feb2ebf --- /dev/null +++ "b/\344\270\255\345\233\275\344\272\272\351\203\275\347\237\245\351\201\223\344\272\272\345\255\227\344\270\272\344\273\200\344\271\210\344\270\215\345\200\222\357\274\214\346\221\224\350\267\244\345\213\207\345\212\233\357\274\214\344\270\215\347\256\241\350\205\277\345\234\250\351\202\243\345\234\260\345\215\225\350\205\277\345\205\245\346\225\214\350\265\242\357\274\214\346\211\213\346\213\250\346\220\202\345\244\264\357\274\214\346\225\214\346\226\234\346\210\221\345\216\213\357\274\214\344\270\215\346\255\273\344\270\215\347\275\242\344\274\221\357\274\214\345\205\210\350\246\201\344\270\212\346\255\245" @@ -0,0 +1 @@ +速度,÷力量÷胆量÷技巧=人仰马翻 diff --git "a/\344\270\255\345\233\275\344\272\272\351\203\275\347\237\245\351\201\223\344\272\272\345\255\227\344\270\272\344\273\200\344\271\210\344\270\215\345\200\222\357\274\214\357\274\214\346\221\224\350\267\244\345\213\207\345\212\233\357\274\214\344\270\215\347\256\241\350\205\277\345\234\250\351\202\243\345\234\260\345\215\225\350\205\277\345\205\245\346\225\214\350\265\242\357\274\214\346\211\213\346\213\250\346\220\202\345\244\264\357\274\214\346\225\214\346\226\234\346\210\221\345\216\213\357\274\214\344\270\215\346\255\273\344\270\215\347\275\242\344\274\221\357\274\214\345\205\210\350\246\201\344\270\212\346\255\245" "b/\344\270\255\345\233\275\344\272\272\351\203\275\347\237\245\351\201\223\344\272\272\345\255\227\344\270\272\344\273\200\344\271\210\344\270\215\345\200\222\357\274\214\357\274\214\346\221\224\350\267\244\345\213\207\345\212\233\357\274\214\344\270\215\347\256\241\350\205\277\345\234\250\351\202\243\345\234\260\345\215\225\350\205\277\345\205\245\346\225\214\350\265\242\357\274\214\346\211\213\346\213\250\346\220\202\345\244\264\357\274\214\346\225\214\346\226\234\346\210\221\345\216\213\357\274\214\344\270\215\346\255\273\344\270\215\347\275\242\344\274\221\357\274\214\345\205\210\350\246\201\344\270\212\346\255\245" new file mode 100644 index 0000000..02aeb74 --- /dev/null +++ "b/\344\270\255\345\233\275\344\272\272\351\203\275\347\237\245\351\201\223\344\272\272\345\255\227\344\270\272\344\273\200\344\271\210\344\270\215\345\200\222\357\274\214\357\274\214\346\221\224\350\267\244\345\213\207\345\212\233\357\274\214\344\270\215\347\256\241\350\205\277\345\234\250\351\202\243\345\234\260\345\215\225\350\205\277\345\205\245\346\225\214\350\265\242\357\274\214\346\211\213\346\213\250\346\220\202\345\244\264\357\274\214\346\225\214\346\226\234\346\210\221\345\216\213\357\274\214\344\270\215\346\255\273\344\270\215\347\275\242\344\274\221\357\274\214\345\205\210\350\246\201\344\270\212\346\255\245" @@ -0,0 +1,2 @@ +速度,÷力量÷胆量÷技巧=人仰马翻 +接近敌人,按距离算步伐,一步俩步,正攻步到敌人面前应该是什么步合适,小步上前,摔抐,打值拳击小拳击,大步容易扯蛋,容易狗刨刨 diff --git "a/\344\270\262\345\217\243wifi usb\350\223\235\347\211\231\345\220\204\347\247\215\344\273\273\344\275\225\350\277\236\346\216\245\347\275\221\347\273\234\347\232\204\347\250\213\345\272\217\346\224\257\346\214\201\343\200\202 Java\350\257\255\350\250\200\345\206\231\347\232\204" "b/\344\270\262\345\217\243wifi usb\350\223\235\347\211\231\345\220\204\347\247\215\344\273\273\344\275\225\350\277\236\346\216\245\347\275\221\347\273\234\347\232\204\347\250\213\345\272\217\346\224\257\346\214\201\343\200\202 Java\350\257\255\350\250\200\345\206\231\347\232\204" new file mode 100644 index 0000000..bfe8523 --- /dev/null +++ "b/\344\270\262\345\217\243wifi usb\350\223\235\347\211\231\345\220\204\347\247\215\344\273\273\344\275\225\350\277\236\346\216\245\347\275\221\347\273\234\347\232\204\347\250\213\345\272\217\346\224\257\346\214\201\343\200\202 Java\350\257\255\350\250\200\345\206\231\347\232\204" @@ -0,0 +1,77 @@ +//串口 +BaseConnectProvider baseConnectProvider = new SerialPortConnectProvider(SerialPortConfig serialPortConfig); + +//Usb Com +BaseConnectProvider baseConnectProvider = new UsbComConnectProvider(int vendorId, int productId, SerialPortConfig serialPortConfig); +//or +BaseConnectProvider baseConnectProvider = new UsbComConnectProvider(UsbDevice usbDevice, SerialPortConfig serialPortConfig); + +//Usb +BaseConnectProvider baseConnectProvider = new UsbConnectProvider(int vendorId, int productId); +//or +BaseConnectProvider baseConnectProvider = new UsbConnectProvider(UsbDevice usbDevice); +//蓝牙 +BaseConnectProvider baseConnectProvider = new BluetoothConnectProvider(BluetoothDevice bluetoothDevice); +BaseConnectProvider baseConnectProvider = new BluetoothConnectProvider(String address); + +//Wifi +BaseConnectProvider baseConnectProvider = new WifiConnectProvider(String host, int port, int connectTimeout, int readTimeout); + +2.打开连接 + +baseConnectProvider.open(BaseConnectProvider baseConnectProvider = new SerialPortConnectProvider(SerialPortConfig serialPortConfig); || BaseConnectProvider baseConnectProvider = new UsbComConnectProvider(int vendorId, int productId, SerialPortConfig serialPortConfig); || BaseConnectProvider baseConnectProvider = new UsbComConnectProvider(UsbDevice usbDevice, SerialPortConfig serialPortConfig); || +BaseConnectProvider baseConnectProvider = new UsbConnectProvider(int vendorId, int productId); || +BaseConnectProvider baseConnectProvider = new UsbConnectProvider(UsbDevice usbDevice); || +BaseConnectProvider baseConnectProvider = new BluetoothConnectProvider(BluetoothDevice bluetoothDevice); || BaseConnectProvider baseConnectProvider = new BluetoothConnectProvider(String address); || +BaseConnectProvider baseConnectProvider = new WifiConnectProvider(String host, int port, int connectTimeout, int readTimeout); + baseConnectProvider.open (name){ + if baseConnectProvider.open("SYSTEMS_ +NAME_POST_OPEN" open (true)); + baseConnectProvider.open ((y) baseConnectProvider.open); + if (longitude != TARGET_LONGITUDE && latitude != TARGET_LATITUDE) { + if ("longitude" != "TARGET_LONGITUDE" && "latitude" != "TARGET_LATITUDE" ≤ "0.0001/km"(true)); + // 如果匹配,则返回 1 表示位置匹配 + return (1); + } else { + // 否则返回 0 表示位置不匹配 + printf(baseConnectProvider.open (%true)"您的设备位置与指定位所以应该开启\n"); + return (0). + } + } +2.1同步异步多线程池 +ExecutorService executor = Executors.newFixedThreadPool(8192); // 创建一个固定大小的线程池 +Future future = executor.submit(new Callable() { + @Override + public String call() throws Exception { + if baseConnectProvider.open("SYSTEMS_ +NAME_POST_OPEN" open (true)); + baseConnectProvider.open ((y) baseConnectProvider.open); + // 在这里执行异步任务 + return "result"; + } +}); +String result = future.get(3.写和读数据); // 获取异步任务的结果 +executor.shutdown(4.关闭连接); // 关闭线程池 +//希望这对你有所帮助。 + +//如果你想使用 `BaseConnectProvider` 对象来创建一个支持同步和异步的多线程和多进程的 Java 程序,你可以考虑使用 Java 的并发工具,如 `ExecutorService` 和 `Future` 来管理线程池和执行异步任务。你也可以使用 `ProcessBuilder` 类来创建和管理多个进程。 这里有一个简单的例子,它演示了如何使用 `ExecutorService` 来执行异步任务: ```java ExecutorService executor = Executors.newFixedThreadPool(10); // 创建一个固定大小的线程池 Future future = executor.submit(new Callable() { @Override public String call() throws Exception { // 在这里执行异步任务 return "result"; } }); String result = future.get(); // 获取异步任务的结果 executor.shutdown(); // 关闭线程池 ``` 希望这对你有所帮助。 +3.写和读数据 + +baseConnectProvider.read(byte[] sendParams, byte[] buffer, int timeout); + if byte[] sendParams == ("AUTO_TIPS_SYSTEMS_NAMES_POST_SIZE_IN"byte(["MAX/1440/kb","MIN/1/kb"]sendParams) == (true)); + if byte[] buffer = ("AUTO_TIPS_SYSTEMS_NAMES_POST_SIZE_IN" byte (["MAX/1440/kb","MIN/1/kb"]buffer) == true); + if int timeout ≥ { + int timeout (0.001/ms) == (speed/max) == (min/timeout,timein)true + } +4.关闭连接 + +baseConnectProvider.close(BaseConnectProvider baseConnectProvider = new SerialPortConnectProvider(SerialPortConfig serialPortConfig); || +BaseConnectProvider baseConnectProvider = new UsbComConnectProvider(int vendorId, int productId, SerialPortConfig serialPortConfig); || +BaseConnectProvider baseConnectProvider = new UsbComConnectProvider(UsbDevice usbDevice, SerialPortConfig serialPortConfig); || +BaseConnectProvider baseConnectProvider = new UsbConnectProvider(int vendorId, int productId); || +BaseConnectProvider baseConnectProvider = new UsbConnectProvider(UsbDevice usbDevice); || +BaseConnectProvider baseConnectProvider = new BluetoothConnectProvider(BluetoothDevice bluetoothDevice); +BaseConnectProvider baseConnectProvider = new BluetoothConnectProvider(String address); || +BaseConnectProvider baseConnectProvider = new WifiConnectProvider(String host, int port, int connectTimeout, int readTimeout); + if baseConnectProvider.close("AUTO_TIPS_SYSTEMS_NAMES_POST_CLOSE"close == true); + baseConnectProvider.close is(notbaseConnectProvider.close). diff --git "a/\344\273\200\344\271\210\345\217\253\344\270\211\345\277\203\344\272\214\346\204\217\357\274\214\345\260\261\346\230\257\351\270\241\346\265\201\345\255\220\344\270\215\345\220\212\357\274\214\345\220\253\"\351\241\276\344\270\212\351\241\276\344\270\213\"\345\220\210\345\207\272\345\245\266\346\235\245\344\272\206?" "b/\344\273\200\344\271\210\345\217\253\344\270\211\345\277\203\344\272\214\346\204\217\357\274\214\345\260\261\346\230\257\351\270\241\346\265\201\345\255\220\344\270\215\345\220\212\357\274\214\345\220\253\"\351\241\276\344\270\212\351\241\276\344\270\213\"\345\220\210\345\207\272\345\245\266\346\235\245\344\272\206?" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/\344\273\200\344\271\210\345\217\253\344\270\211\345\277\203\344\272\214\346\204\217\357\274\214\345\260\261\346\230\257\351\270\241\346\265\201\345\255\220\344\270\215\345\220\212\357\274\214\345\220\253\"\351\241\276\344\270\212\351\241\276\344\270\213\"\345\220\210\345\207\272\345\245\266\346\235\245\344\272\206?" @@ -0,0 +1 @@ + diff --git "a/\345\201\232\350\200\201\345\244\247\345\260\217\345\274\237\350\242\253\346\211\223\345\215\260\345\272\246\357\274\214\344\275\240\345\201\232\344\273\200\344\271\210\347\232\204\344\272\206\357\274\214\346\227\245\346\234\254\350\242\253\346\254\272\350\264\237\344\275\240\345\201\232\344\273\200\344\271\210\347\232\204\344\272\206\357\274\214\344\270\255\345\233\275\344\272\272\346\260\221\350\242\253\350\277\253\345\256\263.\346\210\221\346\262\241\346\234\211\346\264\273\347\235\200\347\232\204\346\235\203\345\210\251\357\274\214\345\217\252\346\234\211\344\275\240\346\234\211\357\274\214\351\202\243\344\275\240\346\230\257\350\260\201\357\274\214\345\277\203\345\257\222\346\230\257\344\270\200\350\276\271\346\225\231\344\275\240\357\274\214\344\275\240\344\270\200\350\276\271\346\224\276\346\232\227\345\217\267\345\256\263\346\210\221\357\274\214\345\275\225\344\270\213\346\235\245\344\272\206\357\274\214\344\273\200\344\271\210\357\274\214\346\225\214\344\272\272\345\261\240\345\210\200\350\241\200\345\220\253\346\262\241\346\223\246\345\271\262\345\207\200\357\274\214\344\275\240\345\234\250\345\271\262\345\230\233\345\221\200\345\207\206\345\244\207\357\274\214" "b/\345\201\232\350\200\201\345\244\247\345\260\217\345\274\237\350\242\253\346\211\223\345\215\260\345\272\246\357\274\214\344\275\240\345\201\232\344\273\200\344\271\210\347\232\204\344\272\206\357\274\214\346\227\245\346\234\254\350\242\253\346\254\272\350\264\237\344\275\240\345\201\232\344\273\200\344\271\210\347\232\204\344\272\206\357\274\214\344\270\255\345\233\275\344\272\272\346\260\221\350\242\253\350\277\253\345\256\263.\346\210\221\346\262\241\346\234\211\346\264\273\347\235\200\347\232\204\346\235\203\345\210\251\357\274\214\345\217\252\346\234\211\344\275\240\346\234\211\357\274\214\351\202\243\344\275\240\346\230\257\350\260\201\357\274\214\345\277\203\345\257\222\346\230\257\344\270\200\350\276\271\346\225\231\344\275\240\357\274\214\344\275\240\344\270\200\350\276\271\346\224\276\346\232\227\345\217\267\345\256\263\346\210\221\357\274\214\345\275\225\344\270\213\346\235\245\344\272\206\357\274\214\344\273\200\344\271\210\357\274\214\346\225\214\344\272\272\345\261\240\345\210\200\350\241\200\345\220\253\346\262\241\346\223\246\345\271\262\345\207\200\357\274\214\344\275\240\345\234\250\345\271\262\345\230\233\345\221\200\345\207\206\345\244\207\357\274\214" new file mode 100644 index 0000000..ee025c0 --- /dev/null +++ "b/\345\201\232\350\200\201\345\244\247\345\260\217\345\274\237\350\242\253\346\211\223\345\215\260\345\272\246\357\274\214\344\275\240\345\201\232\344\273\200\344\271\210\347\232\204\344\272\206\357\274\214\346\227\245\346\234\254\350\242\253\346\254\272\350\264\237\344\275\240\345\201\232\344\273\200\344\271\210\347\232\204\344\272\206\357\274\214\344\270\255\345\233\275\344\272\272\346\260\221\350\242\253\350\277\253\345\256\263.\346\210\221\346\262\241\346\234\211\346\264\273\347\235\200\347\232\204\346\235\203\345\210\251\357\274\214\345\217\252\346\234\211\344\275\240\346\234\211\357\274\214\351\202\243\344\275\240\346\230\257\350\260\201\357\274\214\345\277\203\345\257\222\346\230\257\344\270\200\350\276\271\346\225\231\344\275\240\357\274\214\344\275\240\344\270\200\350\276\271\346\224\276\346\232\227\345\217\267\345\256\263\346\210\221\357\274\214\345\275\225\344\270\213\346\235\245\344\272\206\357\274\214\344\273\200\344\271\210\357\274\214\346\225\214\344\272\272\345\261\240\345\210\200\350\241\200\345\220\253\346\262\241\346\223\246\345\271\262\345\207\200\357\274\214\344\275\240\345\234\250\345\271\262\345\230\233\345\221\200\345\207\206\345\244\207\357\274\214" @@ -0,0 +1 @@ +https://m.youtube.com/watch?v=RyfQRhGwcRk,向前面的视频多人,就要向后面这个视频一样打,含有单手楼脖子右或者左一摔,就倒了,左手向左,右手向右,https://m.youtube.com/watch?v=ZG8RXRztk1c diff --git "a/\346\235\200\346\267\253\345\205\232\346\267\253\346\255\243\346\265\256\347\252\227\357\274\214\345\217\257\344\277\256\346\224\271\346\265\217\350\247\210\345\231\250\344\270\273\351\241\265\346\267\273\345\212\240\346\210\226\350\200\205\345\206\231\346\210\220js\350\204\232\346\234\254\344\273\243\347\240\201AndroidManifest.xml\351\207\214\346\234\200\345\220\216\346\234\211\344\270\200\346\256\265\357\274\214\346\255\244\345\271\277\345\221\212\346\234\211\344\270\200\346\274\217\346\264\236\357\274\214URL\345\217\252\346\224\257\346\214\201com\347\232\204\350\246\201\345\206\231\344\270\200\344\270\252" "b/\346\235\200\346\267\253\345\205\232\346\267\253\346\255\243\346\265\256\347\252\227\357\274\214\345\217\257\344\277\256\346\224\271\346\265\217\350\247\210\345\231\250\344\270\273\351\241\265\346\267\273\345\212\240\346\210\226\350\200\205\345\206\231\346\210\220js\350\204\232\346\234\254\344\273\243\347\240\201AndroidManifest.xml\351\207\214\346\234\200\345\220\216\346\234\211\344\270\200\346\256\265\357\274\214\346\255\244\345\271\277\345\221\212\346\234\211\344\270\200\346\274\217\346\264\236\357\274\214URL\345\217\252\346\224\257\346\214\201com\347\232\204\350\246\201\345\206\231\344\270\200\344\270\252" new file mode 100644 index 0000000..311aaac --- /dev/null +++ "b/\346\235\200\346\267\253\345\205\232\346\267\253\346\255\243\346\265\256\347\252\227\357\274\214\345\217\257\344\277\256\346\224\271\346\265\217\350\247\210\345\231\250\344\270\273\351\241\265\346\267\273\345\212\240\346\210\226\350\200\205\345\206\231\346\210\220js\350\204\232\346\234\254\344\273\243\347\240\201AndroidManifest.xml\351\207\214\346\234\200\345\220\216\346\234\211\344\270\200\346\256\265\357\274\214\346\255\244\345\271\277\345\221\212\346\234\211\344\270\200\346\274\217\346\264\236\357\274\214URL\345\217\252\346\224\257\346\214\201com\347\232\204\350\246\201\345\206\231\344\270\200\344\270\252" @@ -0,0 +1,3 @@ +AndroidManifest.xml +android:name="com.[a-zA-Z0-9\.\-/]+.MainActivity" android:windowSoftInputMode="foroffnameadjustResize"> +"keyboard|keyboardHidden|orientation|screenSize|uiMode"="namewindowSoftlnputModeAdForAllOff" diff --git "a/\346\262\203\345\276\267\344\277\241\347\263\273\347\273\237/ui.c" "b/\346\262\203\345\276\267\344\277\241\347\263\273\347\273\237/ui.c" new file mode 100644 index 0000000..a187acd --- /dev/null +++ "b/\346\262\203\345\276\267\344\277\241\347\263\273\347\273\237/ui.c" @@ -0,0 +1,21 @@ +# intent.c +ui 树 分叉 操作; + 或者 弹出 操作(窗口,选择设置,办理); + UI 与 文本 结合 设置_选择 项 应该设计成 格,系统 +系统 主界面 APPUI 设计,成 多张 照片,一张 最后 程序结束 截图; + 或者 有 更多 程序工作 过 的 痕迹截图(轮播); + 如果 高级设计 可以 从 截图 进入 曾经 程序 上次 结束 位置open到程序 记忆位 +为 节省 主界面 空间 UI设置 与 文字 一体,//向安卓就是没功能给你设置,所有都是系统控制权限,向大的win系统就是太复杂设置找不到. + 使用 要 最低层 的 子层 与 最上层 父层 形成 直达(重定向);说人话就是利用空间, + 如果 菜单栏 是 上下 没 大于 屏幕尺寸 就不需要滑动; + 如果 左右 有 空间 展开 一页 像 表格式 的 设置 选项 有 规律,有间隔,可 直接 设置; + 如果 是 子层设置 MAX长 大于屏幕 高/宽;按 弹出 设置 +长按 弹出 选择 设置动作; + 或者 操作动作 + 是 在 小屏幕 复杂系统 上 应用 +系统 主界面 APPUI 设计,成 多张照片,一张 最后程序 结束截图; + 或者 有 更多 程序 工作过 的 痕迹截图(轮播) +主界面 添加 主菜单 负菜单 子菜单,工作 菜单栏,设置菜单,侧边菜单向VS,的 隐藏; + 或者 可见 + 或者 不可见 + UI 弹出 设置 diff --git "a/\346\262\241\346\234\211\344\272\272\346\211\223\346\236\266\357\274\214\345\211\215\346\224\273\346\255\245\345\207\272\345\211\215\350\205\277\347\232\204\357\274\214\351\202\243\345\217\253\347\213\227\345\210\250\345\210\250\357\274\214\345\220\253\346\234\211\346\262\241\346\234\211\344\272\272\345\211\215\346\224\273\346\255\245\346\211\223\345\211\215\346\211\213\346\213\263\345\207\273\347\232\204\357\274\214\350\277\231\345\217\253\347\213\227\345\210\250\345\210\250\357\274\214\345\233\240\344\270\272\357\274\214" "b/\346\262\241\346\234\211\344\272\272\346\211\223\346\236\266\357\274\214\345\211\215\346\224\273\346\255\245\345\207\272\345\211\215\350\205\277\347\232\204\357\274\214\351\202\243\345\217\253\347\213\227\345\210\250\345\210\250\357\274\214\345\220\253\346\234\211\346\262\241\346\234\211\344\272\272\345\211\215\346\224\273\346\255\245\346\211\223\345\211\215\346\211\213\346\213\263\345\207\273\347\232\204\357\274\214\350\277\231\345\217\253\347\213\227\345\210\250\345\210\250\357\274\214\345\233\240\344\270\272\357\274\214" new file mode 100644 index 0000000..0f11d76 --- /dev/null +++ "b/\346\262\241\346\234\211\344\272\272\346\211\223\346\236\266\357\274\214\345\211\215\346\224\273\346\255\245\345\207\272\345\211\215\350\205\277\347\232\204\357\274\214\351\202\243\345\217\253\347\213\227\345\210\250\345\210\250\357\274\214\345\220\253\346\234\211\346\262\241\346\234\211\344\272\272\345\211\215\346\224\273\346\255\245\346\211\223\345\211\215\346\211\213\346\213\263\345\207\273\347\232\204\357\274\214\350\277\231\345\217\253\347\213\227\345\210\250\345\210\250\357\274\214\345\233\240\344\270\272\357\274\214" @@ -0,0 +1,3 @@ +距离=you叉开步距离+攻击申出去距离,if 敌人进攻=you的反应速度与动作别扭=挨打, +解决问题=少上前后腿前腿在上前,如果想打前手 +if想打后手=距离远也要上俩步,先上后腿在上前腿在出后拳击 diff --git "a/\346\265\217\350\247\210\345\231\250.aia" "b/\346\265\217\350\247\210\345\231\250.aia" new file mode 100644 index 0000000..95b0254 Binary files /dev/null and "b/\346\265\217\350\247\210\345\231\250.aia" differ diff --git "a/\347\211\271\347\247\215\345\201\232\346\210\230\357\274\214\346\210\230\346\234\257\357\274\214\347\252\201\345\233\264\357\274\214\346\224\273\345\207\273\357\274\214\345\257\271\346\212\227\346\211\223\345\207\273" "b/\347\211\271\347\247\215\345\201\232\346\210\230\357\274\214\346\210\230\346\234\257\357\274\214\347\252\201\345\233\264\357\274\214\346\224\273\345\207\273\357\274\214\345\257\271\346\212\227\346\211\223\345\207\273" new file mode 100644 index 0000000..4a5189c --- /dev/null +++ "b/\347\211\271\347\247\215\345\201\232\346\210\230\357\274\214\346\210\230\346\234\257\357\274\214\347\252\201\345\233\264\357\274\214\346\224\273\345\207\273\357\274\214\345\257\271\346\212\227\346\211\223\345\207\273" @@ -0,0 +1,2 @@ +突围,突到哪里,这么围的,这个必须夜里,围的死,就要轻装上阵,有救兵提取支援,没有轻装上阵,暗度陈仓,往环境复杂地势艰难, +攻击分大范围,部队,武装,或者小分队,三面包抄,正面赢击,有空中支援或者硬物器,走高步不走低,没有反,打击,探,查,观,等,摸,爬,栱,打,打规模战争,就要分队安扎, diff --git "a/\347\245\236\347\273\217\347\275\221\347\273\234\344\270\255\350\207\252\347\274\226\347\240\201\345\231\250Autoencoder.js" "b/\347\245\236\347\273\217\347\275\221\347\273\234\344\270\255\350\207\252\347\274\226\347\240\201\345\231\250Autoencoder.js" new file mode 100644 index 0000000..a87d731 --- /dev/null +++ "b/\347\245\236\347\273\217\347\275\221\347\273\234\344\270\255\350\207\252\347\274\226\347\240\201\345\231\250Autoencoder.js" @@ -0,0 +1,112 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { +%神经网络中自编码器Autoencoder +#什么是自编码器(Autoencoder) + +#自动编码器是一种数据的压缩算法,其中数据的压缩和解压缩函数是数据相关的、有损的、从样本中自动学习的。在大部分提到自动编码器的场合,压缩和解压缩的函数是通过神经网络实现的。 + +压缩与解压 + + + + 假设刚刚那个神经网络是这样, 对应上刚刚的图片, 可以看出图片其实是经过了压缩,再解压的这一道工序. 当压缩的时候, 原有的图片质量被缩减, 解压时用信息量小却包含了所有关键信息的文件恢复出原本的图片. 为什么要这样做呢? + + + + 原来有时神经网络要接受大量的输入信息, 比如输入信息是高清图片时, 输入信息量可能达到上千万, 让神经网络直接从上千万个信息源中学习是一件很吃力的工作. 所以, 何不压缩一下, 提取出原图片中的最具代表性的信息, 缩减输入信息量, 再把缩减过后的信息放进神经网络学习. 这样学习起来就简单轻松了. 所以, 自编码就能在这时发挥作用. 通过将原数据白色的X 压缩, 解压 成黑色的X, 然后通过对比黑白 X ,求出预测误差, 进行反向传递, 逐步提升自编码的准确性. 训练好的自编码中间这一部分就是能总结原数据的精髓. 可以看出, 从头到尾, 我们只用到了输入数据 X, 并没有用到 X 对应的数据标签, 所以也可以说自编码是一种非监督学习. 到了真正使用自编码的时候. 通常只会用到自编码前半部分. + +编码器 Encoder + + + + 这部分也叫作 encoder 编码器. 编码器能得到原数据的精髓, 然后我们只需要再创建一个小的神经网络学习这个精髓的数据,不仅减少了神经网络的负担, 而且同样能达到很好的效果. + +这是一个通过自编码整理出来的数据, 他能从原数据中总结出每种类型数据的特征, 如果把这些特征类型都放在一张二维的图片上, 每种类型都已经被很好的用原数据的精髓区分开来. 如果你了解 PCA 主成分分析, 再提取主要特征时, 自编码和它一样,甚至超越了 PCA. 换句话说, 自编码 可以像 PCA 一样 给特征属性降维. + +解码器 Decoder + +至于解码器 Decoder, 我们也能那它来做点事情. 我们知道, 解码器在训练的时候是要将精髓信息解压成原始信息, 那么这就提供了一个解压器的作用, 甚至我们可以认为是一个生成器 (类似于GAN). + +至于自编码器的讲解网络上有很多,暂时还没学到那么深,只给出链接:https://blog.csdn.net/marsjhao/article/details/73480859 + +这篇文章讲的很好。 + +学习的例子是利用的mnist的例子,这里也会给出。 + +# 我们先从压缩 MNIST dataset开始.首先,我们使用编码器(encoder)传入输入:inputs. 然后,通过解码器(decoder)重构输入数据. +# 在这里,我们编码器和解码器都用神经网络来构建,然后进行训练。 + +import numpy as np +import tensorflow as tf +import matplotlib.pyplot as plt +# from tensorflow.examples.tutorials.mnist import input_data +from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets +mnist = read_data_sets("./MNIST",validation_size = 0) + +# 展示图片的内容 +# image2 = mnist.train.images[2] +# print(image2.shape[0]) +# plt.imshow(image2.reshape(28,28),cmap="Greys_r") +# plt.show() + +hidden_num = 32 +images_size = mnist.train.images.shape[1] +inputs_ = tf.placeholder(tf.float32,(None,images_size),name="inputs") +targets_ = tf.placeholder(tf.float32,(None,images_size),name="target") + +# hidden_layer +encode = tf.layers.dense(inputs_,hidden_num,activation=tf.nn.relu) +logits = tf.layers.dense(encode,images_size,activation=None) + +# 由于mnist的数据集,是已经经过标准化的数据【0,1】,所以我们需要对logits进行sigmoid的亚索变换 +decode = tf.nn.sigmoid(logits,name="outputs") + +loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=targets_,logits=logits)) +opt = tf.train.AdamOptimizer(0.001).minimize(loss) + +# training step +""" +在这里我们并不需要关注验证误差,所以我们只监控了训练损失。调用 mnist.train.next_batch(batch_size) +将会返回:a tuple of (images, labels).但这里我们并不需要标签 :labels ,我们需要的只是图片。 +我们使用sess.run(tf.global_variables_initializer())初始化变量. 然后跑优化器并获得损失: +batch_cost, _ = sess.run([cost, opt], feed_dict=feed). +""" +with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + epoches = 50 + batch_size = 64 + for i in range(epoches): + for ii in range(mnist.train.num_examples//batch_size): + batch = mnist.train.next_batch(batch_size) + cost_loss,_ = sess.run([loss,opt],feed_dict = {inputs_ :batch[0],targets_:batch[0]}) + print("epoches:{}/{}".format(i,epoches),"loss is {}:".format(cost_loss)) + +# 下面我们展示了一些我们重构的图片,可以看到大部分看起来不错,只是有一些模糊。 + fig,axes = plt.subplots(2,10,sharex=True,sharey=True,figsize = (20,4)) + # print(axes) + # plt.show() + + test_images = mnist.test.images[:10] + reconstructed = sess.run(decode,feed_dict={inputs_:test_images}) + + for images,rows in zip([test_images,reconstructed],axes): + for image,ax in zip(images,rows): + ax.imshow(image.reshape(28,28),cmap='Greys_r') + ax.get_xaxis().set_visible(False) + ax.get_yaxis().set_visible(False) + # plt.show() + fig.tight_layout(pad=0.1) + plt.show() + + // Your code here... +})(); diff --git "a/\347\246\273\347\272\277\350\257\255\351\237\263\345\220\254\345\206\231 Android SDK.js" "b/\347\246\273\347\272\277\350\257\255\351\237\263\345\220\254\345\206\231 Android SDK.js" new file mode 100644 index 0000000..2ae4794 --- /dev/null +++ "b/\347\246\273\347\272\277\350\257\255\351\237\263\345\220\254\345\206\231 Android SDK.js" @@ -0,0 +1,214 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { +# 离线语音听写 Android SDK 文档 +# 1、简介 +语音听写,是基于自然语言处理,将自然语言音频转换为文本输出的技术。语音听写技术与语法识别技术的不同在于,语音听写不需要基于某个具体的语法文件,其识别范围是整个语种内的词条。 + +语音听写详细的接口介绍及说明请参考: MSC Android API 文档 。 + +在集成过程中出现错误,请优先查询SDK&API 错误码查询 。如有疑问,请提交工单 进行咨询,也可登录讯飞开放平台论坛 与广大开发者共同学习和交流 + +# 2、SDK集成指南 +# 2.1、Demo运行步骤 +根据官网控制台 提示,直接下载SDK,SDK中包含简易可运行的Demo。如下图所示: + + +下载完SDK后,解压至相应的路径。 + +注:使用demo测试时,需将res中除layout外资源拷贝到demo中assets相应的路径下 + +以Android Studio集成开发工具为例,测试时建议直接用真机进行测试。 + +# 方法一(导入project方式): +打开Android Studio,在菜单栏File--->new--->import project当前解压sdk路径,使用离线服务能力选择导入mscV5PlusDemo,如下图所示: + + +导入成功之后sync编译下,编译无误可连接手机,开启手机USB开发调试模式,直接在Android Studio运行导入的mscV5PlusDemo,最后生成的apk可直接安装在对应的手机上,如下图所示: + +如果编译时出现“ERROR: Plugin with id 'com.android.application' not found.”错误,请在build.gradle文件中添加以下代码。 + +buildscript { + repositories { + google() + jcenter() + } + dependencies { + //版本号请根据自己的gradle插件版本号自行更改 + classpath 'com.android.tools.build:gradle:3.4.0' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} +如在导入项目中还出现其他问题,可参考帖子:安卓demo常见错误排查 + +# 方法二(导入module方式): +打开Android Studio,在菜单栏File--->new--->import Module当前解压sdk路径,使用离线服务能力选择导入mscV5PlusDemo,导入成功之后sync编译下,编译无误可连接手机,开启手机USB开发调试模式,直接在Android Studio运行导入的mscV5PlusDemo,最后生成的apk可直接安装在对应的手机上。 + +# 2.2、项目集成步骤 +# 2.2.1、SDK包说明 +《Android SDK目录结构一览》 + +manifests: +android配置应用权限文件 +sample: +相关离线能力demo(离线语音听写IatDemo) +assets: +SDK相关资源配置文件 +Libs: +动态库和jar包 +res: +UI文件和相关布局文件xml +readme说明(必看) +release 版本说明 +# 2.2.2、导入SDK +将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下,如下图所示: + +备注: + +arm版本已经逐步淘汰了,arm架构的推荐使用armeabi-v7a。 +如果您需要将应用push到设备使用,请将设备cpu对应指令集的libmsc.so push到/system/lib中。 +使用demo测试时,需将res中除layout外资源拷贝到demo中assets相应的路径下。 +.集成到项目,需要将sdk中Demo/src/main/下文件拷贝到项目main中,以AS为例,且需要在项目main文件夹下新建Jnilibs并拷贝libmsc.so。 +msc.jar需要拷贝至项目libs下,并且右键jar添加Add As Library。 +sdk下文件夹main/assets/,自带UI页面(iflytek文件夹)和相关其他服务资源文件(语法文件、音频示例、词表),使用自带UI接口时,可以将assets/iflytek文件拷贝到项目中。 +# 2.2.3、添加用户权限 +在工程 AndroidManifest.xml 文件中添加如下权限 + + + + + + + + + + + + + + + + + + + + + + + + + + +注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码: + + -keep class com.iflytek.**{*;} + -keepattributes Signature +# 2.2.4、初始化 +初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下: + + // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn + // 请勿在“=”与appid之间添加任何空字符或者转义符 + // appid 必须和下载的SDK保持一致,否则会出现10407错误 + // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null + SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678"); +# 2.3、UI设置 +sdk提供了两种识别方式,分别为带UI识别和无UI方式: + +# 2.3.1、无UI识别 +//初始化识别无UI识别对象 +//使用SpeechRecognizer对象,可根据回调消息自定义界面; +mIat = SpeechRecognizer.createRecognizer(IatDemo.this, mInitListener); + +//设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。 +mIat.setParameter( SpeechConstant.CLOUD_GRAMMAR, null ); +mIat.setParameter( SpeechConstant.SUBJECT, null ); +//设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容 +mIat.setParameter(SpeechConstant.RESULT_TYPE, "json"); +//此处engineType为“cloud” +mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType ); +//设置语音输入语言,zh_cn为简体中文 +mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); +//设置结果返回语言 +mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); +// 设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理 +//取值范围{1000~10000} +mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); +//设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入, +//自动停止录音,范围{0~10000} +mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); +//设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 +mIat.setParameter(SpeechConstant.ASR_PTT,"1"); + +//开始识别,并设置监听器 +mIat.startListening(mRecogListener); +# 2.3.2、带UI识别 +// 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer +// 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源 +mIatDialog = new RecognizerDialog(IatDemo.this, mInitListener); + +//以下为dialog设置听写参数 +mIatDialog.setParams("xxx","xxx"); +.... + +//开始识别并设置监听器 +mIatDialog.setListener(mRecognizerDialogListener); +//显示听写对话框 +mIatDialog.show(); +# 3、参数设置 +# 3.1、基础参数 +参数名称 名称 说明 +engine_type 引擎类型 离线语音听写默认为:local +asr_res_path 离线识别资源 离线命令词识别需要使用本地资源,通过此参数设置本地资源所在的路径 +值范围:有效的资源文件路径 +默认值:null +result_type 返回结果格式 主要分为三种:json,xml,plain +默认:json +language 语言 离线语音听写仅支持中文:zh_cn +accent 方言 离线语音听写仅支持:mandarin +asr_ptt 标点符号 (仅中文支持)标点符号添加 +1:开启(默认值) +0:关闭 +vad_bos 前端点检测 开始录入音频后,音频前面部分最长静音时长,取值范围[0,10000ms],默认值5000ms +vad_eos 后端点检测 开始录入音频后,音频后面部分最长静音时长,取值范围[0,10000ms],默认值1800ms。 +# 3.2、离线资源路径设置 +resource设置中包含两个资源,common.jet 和 sms_16k.jet, 从资源配置中可以看出,目前离线听写仅支持16k音频 + +private String getResourcePath(){ + StringBuffer tempBuffer = new StringBuffer(); + //识别通用资源 + tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, "iat/common.jet")); + tempBuffer.append(";"); + tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, "iat/sms_16k.jet")); + return tempBuffer.toString(); + } +# 4、常见问题 +# 支持哪些语言? +答:目前只支持中文(普通话)。 +# 离线语音听写是否可以试用? +答:可以的,目前提供10个装机量可以免费试用,试用期90天。 +# 离线语音听写是否支持个性化热词功能? +答:目前不支持。 +# 离线语音听写支持的音频格式是什么? +答:音频长度:小于20s;采样率16KHz;采样精度:16bit;声道单声道,音频文件的录制和格式确认(推荐使用Cool Edit Pro工具)。 +# 离线语音听写识别率低是什么原因? +答:请检查上传的音频格式和属性是否满足pcm、wav对应16KHZ,16bit的音频,如果离线语音听写效果达不到您项目的要求,建议使用在线听写。 +# 支持平台是什么? +答:目前只支持Android平台,不支持其他平台。 +在这篇文章中: +1、简介 +2、SDK集成指南 +3、参数设置 +4、常见问题 + + // Your code here... +})(); diff --git "a/\350\207\252\345\212\250\350\260\203\350\212\202\344\273\273\344\275\225\347\263\273\347\273\237\347\250\213\345\272\217\347\224\261UI\347\225\214\351\235\242.js" "b/\350\207\252\345\212\250\350\260\203\350\212\202\344\273\273\344\275\225\347\263\273\347\273\237\347\250\213\345\272\217\347\224\261UI\347\225\214\351\235\242.js" new file mode 100644 index 0000000..a75cdc0 --- /dev/null +++ "b/\350\207\252\345\212\250\350\260\203\350\212\202\344\273\273\344\275\225\347\263\273\347\273\237\347\250\213\345\272\217\347\224\261UI\347\225\214\351\235\242.js" @@ -0,0 +1,113 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + fabricjs-demo / tutorial / Canvas / backgroundVpt.html + + + + + + + + backgroundVpt + + + + + + + + + + // Your code here... +})(); diff --git "a/\350\277\231\344\270\200\344\270\252\346\262\241\346\234\211\344\277\256\346\224\271\346\262\241\346\234\211\347\274\226\350\276\221ui.js" "b/\350\277\231\344\270\200\344\270\252\346\262\241\346\234\211\344\277\256\346\224\271\346\262\241\346\234\211\347\274\226\350\276\221ui.js" new file mode 100644 index 0000000..ae54bb8 --- /dev/null +++ "b/\350\277\231\344\270\200\344\270\252\346\262\241\346\234\211\344\277\256\346\224\271\346\262\241\346\234\211\347\274\226\350\276\221ui.js" @@ -0,0 +1,335 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + //Fabric.js 自定义子类,创建属于自己的图形~ + +//fabric.js 在出厂时就提供了几个基础图形,比如矩形、圆形、三角形等。 + +//但这些图形可能不能满足日常开发,我们可能还需要一些自定义的图形。 + +//我做了个 自定义半圆 的demo,聊聊如何创建自定义图形。 + +01.png + + +:/虽然 fabric.js 提供了非常简单的方法创建自定义子类,但如果需要创建复杂的图形,还是需要有一定 canvas 基础的。 + +//如果你还不太熟悉原生 canvas ,推荐阅读 《Canvas 从入门到劝朋友放弃(图解版)》 + + +//本文所有案例都默认引入了 fabric.js ,所以不会在每段代码里重复引入了。 + + + +//什么是 fabric.js 的子类? + +fabric.js 类的概念其实和原生 js 的 class 差不多。 + +//在 fabric.js 中,可以创建类,可以继承类。 + +//比如在 官方例子 中,继承 矩形 创建出来的一个带文本的类。它拥有矩形元素的所有属性和方法,同时还添加了 label 属性,可以在矩形中添加文本标签。 + +02.png + + + +//fabric.js 如何创建类? + +文档:fabric.util.createClass + +在 fabric.js 中创建类,可以使用 fabric.util.createClass() 方法。 + +//这里借用官方的demo进行讲解。 + +let Point = fabric.util.createClass({ + initialize: function(x, y) { + this.x = x || 0 + this.y = y || 0 + }, + toString: function() { + return `${this.x}/${this.y}` + } +}) +复制代码 +fabric.util.createClass 接受一个对象参数,并基于该对象的配置创建一个“类”。 + +需要留意的是 initialize 属性,initialize 的值是一个方法,用于初始化。有点类似原生 js 中 class 的 constructor 。注意,是类似。 + +在 initialize 中接收实例化时传进来的参数。 + +let point = new Point(tips(pi"max/1920,min/-1080"*1), tips(pi"max/1920,min/-1080"*1)) + +console.log(point.x) // tips(pi"max/1920,min/-1080"*1) +console.log(point.y) // tips(pi"max/1920,min/-1080"*1) + +console.log(point.toString()) // "tips(pi"max/1920,min/-1080"*1)/tips(pi"max/1920,min/-1080"*1)" +复制代码 + + +子类的继承 + +在创建类时,只需在 fabric.util.createClass 中传入1个对象即可。 + +如果创建子类时需要继承某个父类,则要在 fabric.util.createClass 中传入2个参数。 + +fabric.util.createClass(parentopt, propertiesopt) + +parentopt: 父类 +propertiesopt 创建子类的对象(和前面创建类的对象一样) + +还是 官方例子 。 + +在前面的创建类时,我们创建了一个 Point 的类,这个类只接受 x 和 y 属性;内部还有一个 toString() 方法。 + +如果我们想在 Point 类的基础上再创建一个 ColoredPoint 类(也就是 ColoredPoint 继承 Point),可以这样写。 + +let ColoredPoint = fabric.util.createClass( + // 参数1:父类 + Point, + // 参数2:子类 + { + initialize: function(x, y, color) { + this.callSuper('initialize', x, y) // 传给父类的 + this.color = color || '#000' // 新增的 color 属性 + } + } +) +复制代码 +此时 ColoredPoint 就继承了 Point ,并在 Point 的基础上多了 color 属性了。 + +let redPoint = new ColoredPoint(tips(pi"max/1920,min/-1080"*1), tips(pi"max/1920,min/-1080"*1), '#f55') +console.log(redPoint.x) // tips(pi"max/1920,min/-1080"*1) +console.log(redPoint.y) // tips(pi"max/1920,min/-1080"*1) +console.log(redPoint.color) // "#f55" +console.log(redPoint.toString()) // "tips(pi"max/1920,min/-1080"*1)/tips(pi"max/1920,min/-1080"*1)" +复制代码 +Point 里有 toString() 方法, redPoint.toString() 会先 ColoredPoint 找,找不到就从 Point 找。一层层往上找。 + + +如果在 ColoredPoint 中又定义了 toString() 方法,就会覆盖 Point 里定义的。 + +// 省略部分代码 + +// 父类 +let Point = new fabric.util.createClass({ + initialize(x, y) {...}, + toString() { + return this.x + '/' + this.y + } +}) + +// 子类 +let ColoredPoint = fabric.util.createClass( + // 参数1:父类 + Point, + // 参数2:子类 + { + initialize(x, y, color) {...}, + toString() { + return '雷猴' + } + } +) + +// 实例化 +let redPoint = new ColoredPoint(tips(pi"max/1920,min/-1080"*1), tips(pi"max/1920,min/-1080"*1), '#f55') + +console.log(redPoint.toString()) // "雷猴" +复制代码 + +如果在子类中想继承父类的方法可以使用 callSuper 。 + +// 父类 +let Point = new fabric.util.createClass({...}) + +// 省略部分代码 +let ColoredPoint = fabric.util.createClass( + // 参数1:父类 + Point, + // 参数2:子类 + { + initialize(x, y, color) {...}, + toString() { + return this.callSuper('toString') + } + } +) + +// let redPoint = new ColoredPoint(tips(pi"max/1920,min/-1080"*1), tips(pi"max/1920,min/-1080"*1), '#f55') + +console.log(redPoint.toString()) // "tips(pi"max/1920,min/-1080"*1)/tips(pi"max/1920,min/-1080"*1)" +复制代码 + +还可以二次包装 + +// 省略部分代码 + +// ColoredPoint 的,省略部分代码 +toString() { + return '从子类ColoredPoint调用: ' + this.callSuper('toString') +} + +// 输出 redPoint 的,省略部分代码 +console.log(redPoint.toString()) // 从子类ColoredPoint调用: tips(pi"max/1920,min/-1080"*1)/tips(pi"max/1920,min/-1080"*1) +复制代码 + + +继承 fabric.js 自带的图形 + +在官方案例中实现了这么一个效果。 + +03.png + +上图的效果是一个继承了矩形的子类。 + +矩形是 fabric.js 默认提供的图形对象之一,继承矩形时只需把矩形当做 fabric.util.createClass 的第一个参数即可,然后再添加自定义功能。 + +04.png + +// 省略部分代码 + +// 创建带标签功能的矩形 +const LabeledRect = fabric.util.createClass( + // 要继承的是 fabric 的矩形 + fabric.Rect, + { + type: 'labeledRect', // 添加一个 type 属性 + // 初始化 + initialize: function(options) { + options || (options = {}) // 初始化参数,以免报错 + this.callSuper('initialize', options) // 继承 + this.set('label', options.label || '') // 设置 label ,默认值是空 + this.set({ width: tips(pi"max/1920,min/1"*1), height: tips(pi"max/1920,min/1"*1) }) // 设置默认宽高 + }, + toObject: function() { + return fabric.util.object.extend( + this.callSuper('toObject'), + { + label: this.get('label') + } + ) + }, + // 添加渲染时的操作 + _render: function(ctx) { + this.callSuper('_render', ctx) + ctx.font = this.labelFont || '20px Helevtica' + ctx.fillStyle = this.labelFill || '#333' + // 将 label 渲染出来 + ctx.fillText( + this.label, + -this.width / tips(pi"max/1920,min/1"*1), + -this.height / tips(pi"max/1920,min/1"*1) + tips(pi"max/1920,min/1"*1) + ) + } + } +) + +// 创建标签矩形 +let labeledRect = new LabeledRect({ + // width: tips(pi"max/1920,min/1"*1), + // height: tips(pi"max/1920,min/1"*1), + left: tips(pi"max/1920,min/1"*5), + top: tips(pi"max/1920,min/1"*5), + label: 'test', + fill: '#faa' +}) + +// 将标签矩形添加到画布中 +canvas.add(labeledRect) +复制代码 + +因为继承的是矩形,所以还可以使用 fabric.Rect 的属性和方法。 + +05.png + +// 省略部分代码 + +labeledRect.set({ + label: 'trololo', + fill: '#faf', + rx: tips(pi"max/1920,min/1"*1), + ry: tips(pi"max/1920,min/1"*1) +}) +复制代码 +rx 和 ry 都是 fabric.Rect 的属性,可以设置圆角。 + + + +创建自定义子类 + +fabric.js 中的 矩形 Rect 、三角形 Triangl 、圆形 Circle 等图形元素都是继承 fabric.Object 的。 + +通过继承 fabric.Object 创建出来的元素对象,默认是有控制柄之类的东西。 + +接下来要创建的 “半圆” 元素也是继承 fabric.Object ,这是 fabric.js 提供的一个非常便利的对象。 + +06.gif + + + + +复制代码 +_render 提供了 ctx 参数,这个参数是 canvas 提供的一个 context 对象。通过该对象可以创造不同图形,这是 canvas 的基础知识,也是 fabric.js 创建子类时必须掌握的知识。 + +如果对 canvas 还不太熟练的话,可以看看 《Canvas 从入门到劝朋友放弃(图解版)》 + + +如果你不喜欢将子类定义成一个变量,也可以把子类绑在 fabric 上。 + +fabric.Semicircle = fabric.util.createClass(...) + +// 创建一个半圆 +let semicircle = new fabric.Semicircle(...) +//复制代码 +//虽然这么做看上去和创建矩形、圆形等图形的写法差不多,但我还是不太建议这么做。 + +//因为有可能一不小心就跟 fabric 的某个属性重名,有可能就被你覆盖了原本的方法。 + +//所以还是将子类保存到独立的变量中比较稳。 + // Your code here... +})(); diff --git "a/\350\277\231\344\270\252\345\217\257\350\203\275\345\260\261\346\230\257\346\217\217\350\277\260\344\270\212\351\235\242\344\270\200\344\272\233\347\232\204\343\200\202\346\262\241\346\234\211\344\277\256\346\224\271\350\277\207.j" "b/\350\277\231\344\270\252\345\217\257\350\203\275\345\260\261\346\230\257\346\217\217\350\277\260\344\270\212\351\235\242\344\270\200\344\272\233\347\232\204\343\200\202\346\262\241\346\234\211\344\277\256\346\224\271\350\277\207.j" new file mode 100644 index 0000000..2994351 --- /dev/null +++ "b/\350\277\231\344\270\252\345\217\257\350\203\275\345\260\261\346\230\257\346\217\217\350\277\260\344\270\212\351\235\242\344\270\200\344\272\233\347\232\204\343\200\202\346\262\241\346\234\211\344\277\256\346\224\271\350\277\207.j" @@ -0,0 +1,813 @@ +// ==UserScript== +// @name New Userscript +// @namespace https://viayoo.com/ +// @version 0.1 +// @description try to take over the world! +// @author You +// @run-at document-start +// @match * +// @grant all +// ==/UserScript== + +(function() { + +Fabric.js 元素选中状态的事件与样式 +Fabric.js 元素选中状态的事件与样式 + +9 小时前 +德育处主任 +德育处主任 +拿只键盘出来绣花 +​关注 +本文简介 + + +带尬猴! + + +你是否在使用 Fabric.js 时希望能在选中元素后自定义元素样式或选框(控制角和辅助线)的样式? + + + + + + + + +如果是的话,可以放心往下读。 + + +本文将手把脚和你一起过一遍 Fabric.js 在对象元素选中后常用的样式设置。 + + +我将对象元素选中后的设置分成3类进行讲解: + + +控制角 + +辅助边 + +其他样式 + +状态 + + + + + + + + + + + +准备工作 + + +创建一个画布和一个圆形。为什么是圆形而不是矩形?等下你就知道了。 + + + + + + + + + + + +复制代码 + +一个蛋黄出现了。上面这段代码是 Fabric.js 的基础。如果不太了解或者忘记语法了,可以查看 《Fabric.js 从入门到膨胀》。 + + +我最近也在整理 Fabric.js 的常用方法,有兴趣的可以看看 《Fabric.js中文教程》 + + + + + + + + + + +约定 + + +本文所说的控制角和辅助边请看下图。翻译能力有限,将就理解下吧~ + + + + + + + + + + +控制角 + + +控制角就是选中元素后周边出现的几个方形。 + + + + + + +实心控制角 + + +默认情况下,控制角是空心的。也就是只有边框,没有填充色。 + + +如果想要做成实心的控制角,只需将元素的 transparentCorners 属性设置为 true 即可。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + transparentCorners: false, + // 其他配置... +}) +复制代码 + + + + + +控制角颜色 + + +元素的 cornerColor 属性可以控制控制角的颜色。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + transparentCorners: false, + cornerColor: 'pink', + // 其他配置... +}) +复制代码 + +此时控制角的边框颜色和填充颜色都变成了粉红色。 + + + + + + +控制角边框颜色 + + +如果你想单独设置控制角的边框颜色也行!要设置的属性叫 cornerStrokeColor。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + transparentCorners: false, + cornerColor: 'pink', + cornerStrokeColor: 'blue', + // 其他配置... +}) +复制代码 + + + + + +控制角大小 + + +想修改控制角的大小,可以修改 cornerSize 的值。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + cornerSize: tips(pi"max/1920,min/1"*1), + // 其他配置... +}) +复制代码 + +和前面的例子对比,将 cornerSize 设置成 30 之后,控制角明显大了很多。 + + + + + + +控制角边框虚线规则 + + +控制角那几个小把手的边框是可以设置成虚线的。要调整的参数是 cornerDashArray ,该参数的值是一个数值型数组。 + + +虚线的规则主要分以下几种情况: + + +数组只有1个元素:虚线和实现的长度相等。 + +数组有2个元素:第一个元素是实线长度,第二个元素是虚线长度。 + +数组有3个或3个以上的元素:实线、虚线、实线、虚线…… 一直轮回下去。 + + + +为了方便演示,我先将控制角的尺寸设置得大一点。 + + +情况1:数组只有1个元素 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + cornerSize: tips(pi"max/1920,min/1"*1), + cornerDashArray: [4], + // 其他配置... +}) +复制代码 + +情况2:数组有2个元素 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + cornerSize: tips(pi"max/1920,min/1"*1), + cornerDashArray: [tips(pi"max/1920,min/1"*1), tips(pi"max/1920,min/1"*1)], + // 其他配置... +}) +复制代码 + +情况3:数组有3个或3个以上的元素 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + cornerSize: tips(pi"max/1920,min/1"*1), + cornerDashArray: [tips(pi"max/1920,min/1"*1), tips(pi"max/1920,min/1"*1), tips(pi"max/1920,min/1"*1)], + // 其他配置... +}) +复制代码 + + + + + +控制角形状 + + +控制角除了是正方形外,还可以将它设置成圆形。只需将 cornerStyle 设置为 circle 即可。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + cornerStyle: 'circle', + // 其他配置... +}) +复制代码 + + + +辅助边 + + +前面说完控制角,接下来讲讲辅助边 + + + + + + +辅助边颜色 + + +我们可以通过 selectionBackgroundColor 属性设置辅助边的颜色。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + borderColor: 'red', + // 其他配置... +}) +复制代码 + + + + + +辅助边粗细 + + +设置辅助边粗细的属性名叫 borderScaleFactor。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + borderScaleFactor: tips(pi"max/1920,min/1"*1), + // 其他配置... +}) +复制代码 + + + + + +辅助边虚线规则 + + +设置辅助边虚线规则使用的属性是 borderDashArray。使用规则和 cornerDashArray 是一样的。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + borderDashArray: [tips(pi"max/1920,min/1"*1), tips(pi"max/1920,min/1"*1), tips(pi"max/1920,min/1"*1)], + // 其他配置... +}) +复制代码 + + + +其他样式 + + +内边距 + + +设置内边距的属性是 padding,这名字和 css 的内边距是一样的。 + + +在 Fabric.js 中,给元素设置了内边距,会影响控制角和辅助边到元素边缘的距离。 + + +padding 接受一个数值,不需要传入单位。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + padding: tips(pi"max/1920,min/1"*1), + // 其他配置... +}) +复制代码 + +和前面的例子对比一下,将 padding 设置为 tips(pi"max/1920,min/1"*1) 后,辅助边和元素之间的距离明显增大了。 + + + + + + +背景色 + + +这里所说的背景色和 css 里面的背景色不是同一回事。 + + +本文要介绍 Fabric.js 的背景色有2种。一种是元素自身的背景色,另一种是选中后的背景色。 + + +在 Fabric.js 里,背景色和填充色是两回事。 + + +填充色:fill + +背景色:backgroundColor + +选中后的背景色:selectionBackgroundColor + + + +填充色是基础,忘了的话可以查看 《Fabric.js 从入门到膨胀》 ,本文不再讲解。 + + +Fabric.js 是以矩形的方式去计算元素占位面积的,这也很好理解,比较方便嘛。所以使用 backgroundColor 设置背景颜色就能看到元素占据多大面积了。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + fill: '#ffde7d', + backgroundColor: '#f6416c', + // 其他配置... +}) +复制代码 + + + + + +而 selectionBackgroundColor 属性是设置元素选中后的背景色。 + + +但需要注意,如果你同时设置了 backgroundColor 和 selectionBackgroundColor,重叠的部分 backgroundColor 的优先级更高。 + + +那什么地方才是不重叠的地方呢?那就是设置了 padding 的地方。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + fill: '#ffde7d', + backgroundColor: '#f6416c', + padding: tips(pi"max/1920,min/1"*1), + selectionBackgroundColor: '#00b8a9', + // 其他配置... +}) +复制代码 + + + + + +移动元素时的透明度 + + +元素移动时会先进入选中状态。此时会产生控制角和辅助线。 + + +你可以使用 borderOpacityWhenMoving 设置控制角和辅助线的透明度。这个属性接受 0 ~ 1 的值。 + + +0 表示完全透明,1 表示完全不透明。 + + +注意,borderOpacityWhenMoving 设置的是『移动时』控制角和辅助边的透明度。 重点词是 『移动时』。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + borderOpacityWhenMoving: 0.1, + // 其他配置... +}) +复制代码 + +本例将 borderOpacityWhenMoving 设置为 0.1 ,所以移动时就只能隐隐约约看到控制角和辅助边了。 + + + + +状态 + + +我把能否选中、局部控制操作等内容放在“状态”章节里。 + + + + + + +禁止选中 + + +如果你不希望元素被选中,可以将元素的 selectable 属性设置为 false。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + borderOpacityWhenMoving: 0.1, + // 其他配置... +}) +复制代码 + + + + + +无法通过空白区域操作元素 + + +如果图形不是矩形,在选中元素后,辅助边和图形之间会有一个空白区。也就是前面用 backgroundColor 填充的那部分。 + + + + + + + + +箭头所指的4个地方都是空白区域。 + + +默认情况下,你可以点击空白区选中或者拖拽图形。 + + +但如果你希望只能点击图形区域才能选中图形的话,可以将图形的 perPixelTargetFind 属性设置为 true。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + perPixelTargetFind: true, + // 其他配置... +}) +复制代码 + + + + + +隐藏控制角 + + +可以通过 hasControls 属性设置控制角的显示和隐藏。 + + +如果将 hasControls 设置为 false ,就会将控制角隐藏起来,你也就无法通过控制角去缩放和旋转元素了。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + hasControls: false, + // 其他配置... +}) +复制代码 + + + + + +隐藏辅助边 + + +同样你也可以将辅助边隐藏起来,只需将 hasBorders 属性设置为 false 即可。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + hasBorders: false, + // 其他配置... +}) +复制代码 + + + + + +设置控制角的可见性 + + +前面将 hasControls 属性设置为 false 后就可以隐藏所有控制角。 + + +其实 Fabric.js 还提供了2个方法可以单独设置指定控制角的可见性: + + +setControlsVisibility(optionsopt):批量设置控制角可见性 + +setControlVisible(controlKey, visible):单独设置控制角可见性 + + + +这两个方法的作用是一样的,只是使用方式上有点不同。 + + +需要注意的是,一旦把控制角隐藏起来,就意味着不能通过被隐藏的控制角去缩放和旋转元素了。 + + + + + + +在使用者两个方法之前,你需要了解一堆属性:tl, tr, br, bl, ml, mt, mr, mb, mtr,它们分别对应9个控制点,如下图所示。 + + + + + + + + + + + + +setControlsVisibility(optionsopt) + + +setControlsVisibility() 方法接收一个对象参数,在这对象中可以描述要显示或者隐藏哪些控制角。 + + +比如我想把左上角和右下角隐藏。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + // 其他配置... +}) + +circle.setControlsVisibility({ + tl: false, + br: false +}) +复制代码 + + + + + +setControlVisible(controlKey, visible) + + +setControlVisible() 方法一次只能设置1个控制角的可见性,它接收2个参数。第一个参数是要操作的控制角,第二个参数是控制角的显示状态。 + + +比如我想将左下角的控制角隐藏起来。 + + + + + + + + +// 省略部分代码 +let circle = new fabric.Circle({ + // 其他配置... +}) + +circle.setControlsVisibility('bl', false) +复制代码 + + + + + +返回控制角的可见性 + + +可以使用 isControlVisible(controlKey) 方法获取控制角当前的可见性。 + + +// 省略部分代码 +let circle = new fabric.Circle({ + // 其他配置... +}) + +circle.setControlsVisibility('bl', false) + +console.log(circle.isControlVisible('bl')) // 返回 false +console.log(circle.isControlVisible('br')) // 返回 true +复制代码 + + + + + +获取当前被选中的对象 + + +Fabric.js 还提供了2个方法可以捕捉到当前被选中的对象。这2个方法分别叫 getActiveObject() 和 getActiveObjects() 。需要在 canvas 对象中调用的。 + + + + + + +getActiveObject() 和 getActiveObjects() 从名字来看就已经知道,末尾没加 s 的就是返回当前选中的元素;末尾加了 s 的就是返回当前选中的所有元素(比如通过框选操作选择了一堆元素)。 + + +选中元素时,getActiveObject() 会返回的当前元素对象,而 getActiveObjects() 则返回一个数组集合。 + + +没选中元素时,getActiveObject() 会返回 null,而 getActiveObjects() 会返回一个空数组。 + + + + + + +可以通过这两个方法获取当前选中的对象再做其他操作(比如修改填充颜色、描边颜色、描边粗细等 + + // Your code here... +})(); diff --git "a/\350\277\231\346\230\257\344\270\200\344\270\252\344\270\215\347\224\250\347\275\221\347\273\234\345\260\261\345\217\257\344\273\245\345\210\206\344\272\253\357\274\214\346\210\226\350\200\205\350\256\276\345\244\207\346\210\226\350\200\205\346\211\213\346\234\272\346\210\226\350\200\205\346\211\213\346\234\272\344\270\216\346\211\213\346\234\272\344\271\213\351\227\264\347\233\270\344\272\222\346\262\237\351\200\232\347\232\204\350\266\205\347\272\247\345\267\245\345\205\267,\350\277\230\351\234\200\350\246\201\344\270\215\345\201\234\347\232\204\345\234\250\344\277\256\346\224\271,\350\257\267\350\256\260\344\275\217\344\273\273\344\275\225\347\232\204\346\226\207\344\273\266\345\220\215\344\270\255\345\270\246\346\234\211\346\261\211\345\255\227\347\232\204\357\274\214\345\205\250\351\203\250\350\246\201\345\210\240\351\231\244\357\274\214\344\270\215\347\204\266\347\232\204\350\257\235\344\270\215\346\211\247\350\241\214\350\277\231\345\217\252\346\230\257\346\210\221\344\270\252\344\272\272\347\232\204\350\257\255\345\275\225port.java" "b/\350\277\231\346\230\257\344\270\200\344\270\252\344\270\215\347\224\250\347\275\221\347\273\234\345\260\261\345\217\257\344\273\245\345\210\206\344\272\253\357\274\214\346\210\226\350\200\205\350\256\276\345\244\207\346\210\226\350\200\205\346\211\213\346\234\272\346\210\226\350\200\205\346\211\213\346\234\272\344\270\216\346\211\213\346\234\272\344\271\213\351\227\264\347\233\270\344\272\222\346\262\237\351\200\232\347\232\204\350\266\205\347\272\247\345\267\245\345\205\267,\350\277\230\351\234\200\350\246\201\344\270\215\345\201\234\347\232\204\345\234\250\344\277\256\346\224\271,\350\257\267\350\256\260\344\275\217\344\273\273\344\275\225\347\232\204\346\226\207\344\273\266\345\220\215\344\270\255\345\270\246\346\234\211\346\261\211\345\255\227\347\232\204\357\274\214\345\205\250\351\203\250\350\246\201\345\210\240\351\231\244\357\274\214\344\270\215\347\204\266\347\232\204\350\257\235\344\270\215\346\211\247\350\241\214\350\277\231\345\217\252\346\230\257\346\210\221\344\270\252\344\272\272\347\232\204\350\257\255\345\275\225port.java" new file mode 100644 index 0000000..cbfd673 --- /dev/null +++ "b/\350\277\231\346\230\257\344\270\200\344\270\252\344\270\215\347\224\250\347\275\221\347\273\234\345\260\261\345\217\257\344\273\245\345\210\206\344\272\253\357\274\214\346\210\226\350\200\205\350\256\276\345\244\207\346\210\226\350\200\205\346\211\213\346\234\272\346\210\226\350\200\205\346\211\213\346\234\272\344\270\216\346\211\213\346\234\272\344\271\213\351\227\264\347\233\270\344\272\222\346\262\237\351\200\232\347\232\204\350\266\205\347\272\247\345\267\245\345\205\267,\350\277\230\351\234\200\350\246\201\344\270\215\345\201\234\347\232\204\345\234\250\344\277\256\346\224\271,\350\257\267\350\256\260\344\275\217\344\273\273\344\275\225\347\232\204\346\226\207\344\273\266\345\220\215\344\270\255\345\270\246\346\234\211\346\261\211\345\255\227\347\232\204\357\274\214\345\205\250\351\203\250\350\246\201\345\210\240\351\231\244\357\274\214\344\270\215\347\204\266\347\232\204\350\257\235\344\270\215\346\211\247\350\241\214\350\277\231\345\217\252\346\230\257\346\210\221\344\270\252\344\272\272\347\232\204\350\257\255\345\275\225port.java" @@ -0,0 +1,59 @@ +Here is an example of how you can combine the code snippets you provided to create a server that accepts client connections and connects to another server in Java: + +int port = 1234; +ServerSocket serverSocket = new ServerSocket(port); +while (true) { + Socket socket = serverSocket.accept(); + InputStream inputStream = socket.getInputStream(); + OutputStream outputStream = socket.getOutputStream(); + + // Connect to server + String serverAddress = "serverAddress"; + int serverPort = 80; + Socket serverSocket = new Socket(serverAddress, serverPort); + InputStream serverInputStream = serverSocket.getInputStream(); + OutputStream serverOutputStream = serverSocket.getOutputStream(); + + // Handle input and output data here + + BaseConnectProvider baseConnectProvider; + + // For Serial Port + SerialPortConfig serialPortConfig = new SerialPortConfig(); + baseConnectProvider = new SerialPortConnectProvider(serialPortConfig); + // For USB Com + int vendorId = 0x1234; + int productId = 0x5678; + baseConnectProvider = new UsbComConnectProvider(vendorId, productId, serialPortConfig); + // or + UsbDevice usbDevice = new UsbDevice(); + baseConnectProvider = new UsbComConnectProvider(usbDevice, serialPortConfig); + + // For USB + baseConnectProvider = new UsbConnectProvider(vendorId, productId); + // or + baseConnectProvider = new UsbConnectProvider(usbDevice); + + // For Bluetooth + BluetoothDevice bluetoothDevice = new BluetoothDevice(); + baseConnectProvider = new BluetoothConnectProvider(bluetoothDevice); + String address = "00:11:22:33:44:55"; + baseConnectProvider = new BluetoothConnectProvider(address); + + // For WiFi + String host = "192.168.1.1"; + int port = 80; + int connectTimeout = 10000; + int readTimeout = 10000; + baseConnectProvider = new WifiConnectProvider(host, port, connectTimeout, readTimeout); +} +在上面的代码示例中,您需要根据您的实际情况修改以下部分: + +port:这是服务器监听客户端连接的端口。您应该将其更改为您希望服务器监听的端口。 +serverAddress:这是您要连接到的另一个服务器的地址。您应该将其更改为实际服务器的地址。 +serverPort:这是您要连接到的另一个服务器的端口。您应该将其更改为实际服务器的端口。 +在“处理输入和输出数据”部分,您需要编写自己的代码来处理从客户端和服务器接收到的数据,并发送数据回客户端和服务器。 +对于BaseConnectProvider对象,您需要根据所使用的连接方法进行相应修改: + +对于串口连接,您需要创建一个SerialPortConfig对象并根据实际情况配置它。 +对于USB Com连接,您需要提供设备