HarmonyOS应用程序访问控制探究
关于作者
白晓明
宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人
华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL
华为开发者学堂/51CTO学堂/CSDN学堂认证讲师
开放原子开源基金会2023开源贡献之星
一、引言
随着信息技术的飞速发展,移动应用程序已经成为人们生活和工作中不可或缺的一部分。然而,随之而来的是对应用程序安全性的更高要求,尤其在用户隐私保护方面。工信部一直高度重视用户隐私保护,并依据《个人信息保护法》、《电信条例》、《规范互联网信息服务市场秩序若干规定》、《电信和互联网用户个人信息保护规定》等相关法律法规规章,对涉及用户隐私获取做出明确的通知,防止未经用户授权访问用户隐私信息以及用户隐私信息的滥用。
HarmonyOS的应用程序访问控制机制在这种背景下显得尤为重要,不仅可以保护用户的个人信息,还可以提高应用程序的安全性和可靠性,增强用户对应用程序的信任。HarmonyOS应用程序中,默认情况下,应用只能访问有限的系统资源,需要访问额外的系统数据(包括用户个人数据)和功能,应用必须以明确的方式对外提供接口来共享其数据或功能。通过访问控制机制,避免数据或功能被不当或恶意使用。
我将继续深入探究HarmonyOS应用程序访问控制的原理、方法和实践,为开发者和用户提供有益的参考。通过对HarmonyOS访问控制机制的探究,我们可以更好地理解其工作原理和优势,为开发更加安全可靠的应用程序提供指导。同时,我们也可以为用户提供更好的使用体验,让用户更加放心地使用HarmonyOS应用程序。
二、HarmonyOS应用程序访问控制的重要性
1)保护用户数据安全
在移动应用程序中,用户的数据往往包含敏感信息,如个人身份信息、财务信息等。如果应用程序没有有效的访问控制机制,这些数据可能会被恶意应用程序窃取或滥用。HarmonyOS的访问控制机制可以限制应用程序对用户数据的访问权限,从而保护用户数据的安全。HarmonyOS根据不同的授权方式,权限类型分为以下两种:
-
system_grant
(系统授权):在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。申请该权限的应用系统会在用户安装应用时,自动把相应权限授予应用。 -
user_grant
(用户授权):在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感权限,应用被允许执行的操作可能对系统或其他应用产生严重的影响。该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应的权限,从而成功访问操作目标对象。
2)防止应用程序滥用权限
一些应用程序可能会过度申请权限,从而获取用户的隐私信息或进行不必要的操作。HarmonyOS的访问控制机制可以对应用程序的权限进行严格管理,防止应用程序滥用权限。HarmonyOS提出了受限开放的权限,比如允许读写用户公共目录的音频文件ohos.permission.READ_AUDIO/WRITE_AUDIO
,允许应用使用全局悬浮窗的能力ohos.permission.SYSTEM_FLOAT_WINDOW
等权限,若特殊场景需要使用这些受限开放权限,则需要提供相关申请材料到应用市场申请相应权限证书通过后,才可以正常使用。
3)提高系统安全性
HarmonyOS的访问控制机制不仅可以保护用户数据的安全,还可以提高系统的安全性。通过限制应用程序的访问权限,可以防止恶意应用程序对系统进行攻击或破坏。
三、HarmonyOS应用程序访问控制的原理
1)应用权限
HarmonyOS采用了权限管理机制,对应用程序的访问权限进行严格控制。应用程序在安装时需要声明所需的权限,用户在安装应用程序时可以查看这些权限并决定是否授予。在运行时,系统会根据应用程序的权限声明和用户的授权情况,对应用程序的访问请求进行权限检查。
为了防止应用过度索取和滥用权限,HarmonyOS中基于APL(Ability Privilege Level,元能力权限等级)等级,配置了不同的权限开放范围。应用APL等级分为以下三个等级,等级依次提高。
APL级别 | 说明 |
---|---|
normal | 默认情况下,应用的APL等级都是normal等级。 |
system_basic | 该等级的应用服务提供系统基础服务。 |
system_core | 该等级的应用服务提供操作系统核心能力。应用APL等级不允许配置为system_core。 |
根据权限对于不同等级应用有不同的开放范围,权限APL等级对应分为以下三个等级,等级依次提高。
APL级别 | 说明 | 开放范围 |
---|---|---|
normal | 允许应用访问超出默认规则的普通系统资源,如配置Wi-Fi信息、调用相机拍摄等。 这些系统资源的开放(包括数据和功能)对用户隐私以及其他应用带来的风险低。 | APL等级为normal及以上的应用。 |
system_basic | 允许应用访问操作系统基础服务(系统提供或者预置的基础功能)相关的资源,如系统设置、身份认证等。 这些系统资源的开放对用户隐私以及其他应用带来的风险较高。 | - APL等级为system_basic及以上的应用。 - 部分权限对normal级别的应用受限开放,需要额外申请。 |
system_core | 涉及开放操作系统核心资源的访问操作。这部分系统资源是系统最核心的底层服务,如果遭受破坏,操作系统将无法正常运行。 | - APL等级为system_core的应用。 - 仅对系统应用开放。 |
2)沙箱机制
HarmonyOS采用了沙箱机制,系统中运行的应用程序均部署在受限保护的沙箱中,通过沙箱的安全隔离机制,可以限制应用程序的不当行为(如应用间非法访问数据、篡改设备等)。沙箱环境中每个程序都拥有唯一的ID(TokenID),系统基于此ID识别与限制应用的访问行为,从而提高系统的安全性。同时,沙箱机制还可以防止应用程序之间的互相干扰,提高系统的稳定性。
3)系统控件
HarmonyOS提供了系统Picker、安全控件等临时授权的方式替代权限申请,在特定的场景中,应用无需向用户申请权限也可以临时访问受限资源,实现精准化权限管控,更好地保护用户隐私。
-
系统Picker:由系统独立进程实现,在应用拉起Picker,并由用户操作Picker后,应用可以获取Picker返回的资源或结果。举例说明,当应用需要读取用户图片时,可通过使用照片Picker,在用户选择所需要的图片资源后,直接返回该图片资源,而不需要授予应用读取图片文件的权限。
-
安全控件:由系统提供UI控件,应用在界面内集成对应控件,用户点击后,应用将获得临时授权,从而执行相关操作。举例说明,当应用需要分享当前位置时,可使用位置控件,用户点击后,将会在本次前台期间获得精准定位的授权,可以调用位置服务获取精准定位。当发生灭屏、应用切后台、应用退出等任一情况时,临时授权结束。
四、 HarmonyOS应用程序访问控制开发指南
1)选择申请权限的方式
-
最小权限原则:即在应用开发初期,开发者应仔细分析应用的功能和业务逻辑,确定所需的权限,避免过度申请权限,以免引起用户的疑虑和不信任。
-
动态申请权限:即在应用运行时,根据实际业务场景动态申请权限,提高用户体验,减少不必要的权限请求干扰。
在HarmonyOS中每个权限的权限等级、授权方式不同,申请权限的方式也不同,开发者在申请权限前,需要先根据应用权限列表和应用申请权限的方式(参见下表)查看能否申请目标权限。
权限类型 | 授权方式 | 操作路径 |
---|---|---|
所有应用可申请 | system_grant | 声明权限 > 访问接口 |
所有应用可申请 | user_grant | 声明权限 > 向用户申请授权 > 访问接口 |
受限开放权限 | system_grant | 申请使用受限权限 > 声明权限 > 访问接口 |
受限开放权限 | user_grant | 申请使用受限权限 > 声明权限 > 向用户申请授权 > 访问接口 |
以位置服务(Location Kit)为例,应用需要检查是否已经获取用户授权访问设备位置信息,若未获取授权,可以向用户申请需要的位置权限。
权限名称 | 权限级别 | 授权方式 | 说明 |
---|---|---|---|
ohos.permission.LOCATION | normal | user_grant | 允许应用获取设备位置信息。 需要与模糊位置权限一起申请。 |
ohos.permission.APPROXIMATELY_LOCATION | normal | User_grant | 允许应用获取设备模糊位置信息。 |
2)声明权限
根据实际的业务需要确定需要的权限后,需要在module.json5
配置文件的requestPermissions
标签中声明位置服务(Location Kit)所需的权限。
{"module": {..."requestPermissions": [{"name": "ohos.permission.LOCATION", // 权限名称,为系统已定义的权限"reason": "$string:location_reason", // 申请权限的原因,当申请权限为user_grant权限时该字段为必填"usedScene": { // 用于描述权限使用场景,当申请权限为user_grant权限时该字段为必填"abilities": ["EntryAbility"],"when": "inuse" // 调用时机(inuse:使用时;always:始终)}},{"name": "ohos.permission.APPROXIMATELY_LOCATION","reason": "$string:location_reason","usedScene": {"abilities": ["EntryAbility"],"when": "inuse"}}]}
}
3)向用户申请授权封装
大多数应用程序都会根据业务需要向用户申请授权,可利用抽象理念将向用户申请授权代码封装成可复用的模块或组件。通过定义清晰的接口和规范,可以提高代码的可维护性和可扩展性,同时降低不同应用场景的适配难度。
在工程entry
模块src/main/ets
目录下创建common
文件夹,用于存放工程需要的基础公共代码,比如常量类AppConstants
、权限控制工具类PermissionUtil
等。
在common > utils
目录创建ArkTS文件PermissionUtil
,并使用export
导出该类。
/*** @description 权限控制工具类* @author 白晓明*/
export class PermissionUtil {
}
用户每次执行需要目标权限的操作时,应用都必须调用checkAccessToken()
方法检查自身是否已经具有该权限,该方法返回已授权PERMISSION_GRANTED
或未授权PERMISSION_DENIED
。在PermissionUtil
中添加静态方法checkPermissionGrant
用于检查当前应用程序是否已经被授予权限。
/*** 校验应用是否被授予 {permission} 权限* @param permission* @returns*/
static checkPermissionGrant(permission: Permissions): abilityAccessCtrl.GrantStatus {const atManager = abilityAccessCtrl.createAtManager();// 初始化grantStatus为未授权let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;let tokenId: number = 0;try {// 获取应用程序的accessTokenIDconst bundleInfo: bundleManager.BundleInfo =bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);const appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;tokenId = appInfo.accessTokenId;// 校验应用是否被授予权限grantStatus = atManager.checkAccessTokenSync(tokenId, permission);console.log(`检查${permission}权限状态为:${grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED ? "未授权" : "已授权"}`);} catch (error) {const err = error as BusinessError;console.error(`检查${permission}权限异常:${JSON.stringify(err)}`);grantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;}return grantStatus;
}
在校验应用是否被授予权限时,若未授权,需要调用requestPermissionsFromUser()
方法动态向用户申请权限(指应用程序运行时向用户请求授权的过程)。在PermissionUtil
中添加静态方法reqPermissionFromUser
方法动态向用户申请授权。
/*** 动态申请权限* @param permissions* @returns */
static async reqPermissionFromUser(permissions: Permissions[]): Promise<number[]> {console.log(`[AppLogger]动态申请权限开始`);const atManager = abilityAccessCtrl.createAtManager();let result: PermissionRequestResult = { permissions: [], authResults: [] };try {result = await atManager.requestPermissionsFromUser(context, permissions);} catch (error) {const err = error as BusinessError;console.error(`[AppLogger]动态申请权限异常:${JSON.stringify(err)}`);}return result.authResults;
}
4)在UI中向用户申请授权
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'
import { PermissionUtil } from '../common/utils/PermissionUtil';
@Entry
@Component
struct Index {
private locationPermissions: Permissions[] = ['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'];
async aboutToAppear(): Promise<void> {// 校验是否被授予定位权限let flag: boolean = false;for (const permission of this.locationPermissions) {flag = false;const grantStatus: abilityAccessCtrl.GrantStatus = PermissionUtil.checkPermissionGrant(permission);if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {flag = true;}}if (!flag) { // 未授权,则弹出授权提示弹窗await PermissionUtil.reqPermissionFromUser(this.locationPermissions);}}
build() {...}
}
5)效果预览
五、结论
HarmonyOS应用程序访问控制机制是保障用户数据安全和系统安全的重要手段。通过权限管理、沙箱机制、系统控件等多种方法,HarmonyOS可以有效地限制应用程序对系统资源的访问权限,防止应用程序滥用权限和恶意攻击。
相关文章:
HarmonyOS应用程序访问控制探究
关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 一、引言 随着信息技术的飞速发展,移动应用程序已经成为…...
董卫民赴考拉悠然等企业调研,强调加快发展人工智能产业
8月14日,按照省政府重点产业链协同推进机制有关工作安排,省委常委、常务副省长董卫民在成都市调研人工智能产业发展情况,并召开座谈会。他强调,要坚决落实党的二十届三中全会精神和省委省政府决策部署,充分把握人工智能…...
MFC将类A中的事件在类B中处理采用回调函数实现
需求: 在类A的界面上有一个tab控件。tab控件上面有那个页面。在MFC编程中一个tab的一个页面就应该是一个新的类。在tab的一个页面上有一个list控件。现在需要将list控件的点击事件,双击事件等在类A里面处理。 解决: 在类B里面给控件list添加…...
公众号 微信登录
export function getWxCode(that, localhostUrl) { // localhostUrl 当前页面的路径 传这个也可以this.$route.fullPath// console.log(that.$store.state.wxSessionData)// console.log(that.$store.state.wxSessionData.openId)//openId为undefine执行获取openid判断是否没有…...
sanic + webSocket:股票实时行情推送服务实现
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...
Unity动态给按钮各个状态下的图片赋值
Unity动态给按钮各个状态下的图片赋值 using UnityEngine; using UnityEngine.UI; public class ButtonOnClickTest : MonoBehaviour {public Button btn;public Sprite _highlighterSprite;public Sprite _pressedSprite;public Sprite _selectesdSprite;public Sprite _disa…...
xiaomi pad 6PRO 小米平板6 pro hyperOS降级 澎湃os 降级MIUI 14 教程 免解锁BL 降级,168小时解锁绑定
小米平板 6 Pro 机型代号 :liuqin 降级MIUI 14 小米澎湃 OS 正式版 澎湃OS安卓发布日期卡刷包线刷包OS1.0.7.0.UMYCNXM14.02024-07-13miui_LIUQIN_OS1.0.7.0.UMYCNXM_d618a5c980_14.0.zipliuqin_images_OS1.0.7.0.UMYCNXM_20240705.0000.00_14.0_cn_8cbf5920be.…...
MySQL 备份一个表
语法(创建一个与table1结构相同的新表table2,并且将table1的数据复制到table2): create table table2 as select * from table1 举例(备份tb_log表到tb_log_20240815中去): create table tb_log_20240815 as select * from tb_log...
鸿蒙开发入门day10-组件导航
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 组件导航 (Navigation) 设置页面显示模式 设置标题栏模式 设置菜…...
虚拟机Linux的坑 | VMware无法从主机向虚拟机 跨系统复制粘贴拖动 文件/文本
这个情况下,还是没办法跨系统拖拽文件 解决办法: 在终端中输入命令 sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop过程中只要需要选择是否覆盖的地方,都输入&…...
Chat App 项目之解析(二)
Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以…...
数据结构与算法 - 双指针
一、移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12]输出: [1,3,12,0,0]示例 2: 输入: nums …...
Python3网络爬虫开发实战(10)模拟登录(需补充账号池的构建)
文章目录 一、基于 Cookie 的模拟登录二、基于 JWT 模拟登入三、账号池四、基于 Cookie 模拟登录爬取实战五、基于JWT 的模拟登录爬取实战六、构建账号池 很多情况下,网站的一些数据需要登录才能查看,如果需要爬取这部分的数据,就需要实现模拟…...
SQL 调优最佳实践笔记
定义与重要性 SQL 调优:提高SQL性能,减少查询时间和资源消耗。目标:减少查询时间和扫描的数据行数。 基本原则 减少扫描行数:只扫描所需数据。使用合适索引:确保WHERE条件命中最优索引。合适的Join类型:…...
Eclipse的使用配置教程:必要设置、创建工程及可能遇到的问题(很详细,很全面,能解决90%的问题)
Eclipse的使用配置: Ⅰ、Eclipse 的必要配置:1、Eclipse 的安装:其一、将 Eclipse 解压或安装到没有中文且没有空格的路径下。其二、拿到 eclipse.exe 文件,傻瓜式安装即可; 2、设置工作空间(workspace):其一、首次启动…...
遗传算法与深度学习实战(4)——遗传算法详解与实现
遗传算法与深度学习实战(4)——遗传算法详解与实现 0. 前言1. 遗传算法简介1.1 遗传学和减数分裂1.2 类比达尔文进化论 2. 遗传算法的基本流程2.1 创建初始种群2.2 计算适应度2.3 选择、交叉和变异2.4算法终止条件 3. 使用 Python 实现遗传算法3.1 构建种…...
Nginx+Tomcat实现负载均衡、动静分离集群部署
文章目录 一、Nginx实现负载均衡原理1.正向代理和反向代理2.负载均衡模式1. 轮询(Round Robin):2. 最少连接数(Least Connections):3. IP 哈希(IP Hash):4. 加权轮询…...
英语学习8月19日
词根前缀后缀 accomplishment 成就 acid n.酸的,adj.酸的 acidity n.酸性 ace adj.顶尖的 acute adj.敏锐的;急性的;严重的 acuity n.敏锐 obtuse adj.迟钝的;钝角的 acuity n.敏锐,严重 1.前缀ac: 尖&#x…...
关于windows环境使用nginx的一些性能问题
遇到的问题 最近在一个windows环境中部署nginx,遇到了以下问题: 1. nginx启动了九个线程(1master8woekr),但是所有链接都被1个woker接收,其余worker不工作 2. 用户端访问web很慢,登录服务器使…...
“解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“
背景: 今天在日常的工作中, 我想将笔记本分屏到另一个显示屏,我这电脑Windows10,当我按下Windows键P键,提示我"你的电脑不能投影到其他屏幕,请尝试从新安装驱动程序或使用"遇到这种问题。 解决方法1: 1.快…...
第10章 无持久存储的文件系统 (2)
目录 10.1 proc文件系统 10.1.2 数据结构 10.1.3 初始化 10.1.4 装载 proc 文件系统 10.1.5 管理 /proc 数据项 10.1.6 读取和写入信息 10.1.7 进程相关信息 10.1.8 系统控制机制 本专栏文章将有70篇左右,欢迎关注,查看后续文章。 10.1 proc文件…...
云计算实训29——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现
一、mysql主从复制及同步 1、mysql主从自动开机同步 2、配置mysql5.7版本 mysql-5.7.44-linux-glibc2.12-x86_64.tar 启动服务、登录 对数据库进行基本操作 3、使用python操纵mysql数据库 4、编辑python脚本自动化操纵mysql数据库 二、mycat读写分离实现 1.上传jdk和mycat安装…...
AI搜索引擎Perplexica的本地部署(之二)Perplexica的非docker安装
Perplex 是一个开源的AI 驱动的搜索引擎,可以使用 Grok 和 Open AI 等模型在计算机上本地安装和运行。它为学术研究、写作、YouTube 和 Reddit 提供了一系列搜索功能。用户可以通过选择不同的模型、设置本地嵌入模型和探索各种搜索选项来定制他们的体验。该工具演示…...
Oracle环境下在相同参数和数据源的情况,mybatis-plus查询和sql查询结果不一致
场景: 在系统中某个对象执行修改的时候,查询对象为空,造成修改报错 分析: 在传参中有一个eq的参数需要传null,mybatis-plus在执行eq时可能是拼成" null",但是oracle中查null必须要用is null, null是查不出东西的 解决: 改成用sql查询修改,或者加判断如果这个参…...
springboot静态资源访问问题归纳
以下内容基于springboot 2.3.4.RELEASE 1、默认配置的springboot项目,有四个静态资源文件夹,它们是有优先级的,如下: "classpath:/META-INF/resources/", (优先级最高) "classpath:/reso…...
HTML与CSS学习Day01
文章目录 一 、CSS技巧1.1 CSS精灵(CSS Sprites)1.1.1 实现步骤1.1.2 例子 1.2 字体图标1.2.1如何使用字体图标1.2.2 字体图标使用总结 1.3 垂直对齐方式vertical-align1.3.1 值1.3.2 例子 1.4 过渡效果transition1.4.1 CSS过渡效果(transiti…...
Tina-Linux Bootloaer简述
Tina-Linux Bootloaer简述 目录介绍 ubuntuubuntu1804:~/tina-v2.0-sdk/lichee/brandy-2.0$ tree -L 1 . ├── build.sh ├── opensbi ├── spl //boot0 ├── spl-pub //boot0 ├── tools └── u-boot-2018 /ubootTina-Linux 启动流程简述...
【Python】 Scrapyd:Python Web Scraping 的强大分布式调度工具
我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 🎵 许嵩《内线》 在网络爬虫项目中,Scrapy 是 Python 中最流行和…...
吴恩达机器学习课后题-01线性回归
线性回归 一.单变量线性回归题目损失函数(代价函数)梯度下降函数代价函数可视化整体代码 二.多变量线性回归特征归一化(特征缩放)不同学习率比较 正规方程正规方程与梯度下降比较 使用列表创建一维数组使用嵌套列表创建二维数组&a…...
白盒报告-jacoco
使用jacoco--执行nvn test 运行过程: 1、idea执行mvn test ,运行过程如下: a.maven-surefire-plugin:0.8.7执行目标动作:prepare-agent, 目的是:执行目标动作是为了在当前的项目名下生成jecoco.…...
【MySQL】SQL语句执行流程
目录 一、连接器 二、 查缓存 三、分析器 四、优化器 五、执行器 一、连接器 学习 MySQL 的过程中,除了安装,我们要做的第一步就是连接上 MySQL 在一开始我们都是先使用命令行连接 MySQL mysql -h localhost -u root -p 你的密码 使用这个命令…...
Selenium自动化防爬技巧:从入门到精通,保障爬虫稳定运行,通过多种方式和add_argument参数设置来达到破解防爬的目的
在Web自动化测试和爬虫开发中,Selenium作为一种强大的自动化工具,被广泛用于模拟用户行为、数据抓取等场景。然而,随着网站反爬虫技术的日益增强,直接使用Selenium很容易被目标网站识别并阻止。因此,掌握Selenium的防爬…...
从数据类型到变量、作用域、执行上下文
从数据类型到变量、作用域、执行上下文 JS数据类型 分类 1》基本类型:字符串String、数字Number、布尔值Boolean、undefined、null、symbol、bigint 2》引用类型:Object (Object、Array、Function、Date、RegExp、Error、Arguments) Symbol是ES6新出…...
一文读懂:AI时代到底需要什么样的网络?
各位小伙伴们大家好哈,我是老猫。 今天跟大家来聊聊数据中心网络。 提到网络,通常把网络比作高速公路,网卡相当于上下高速公路的闸口,数据包就相当于运送数据的汽车,交通法规就是“传输协议”。 如高速公路也会堵车一…...
基于HarmonyOS的宠物收养系统的设计与实现(一)
基于HarmonyOS的宠物收养系统的设计与实现(一) 本系统是简易的宠物收养系统,为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现(组件导航使用) 官方文档:组…...
严格模式报错
部分参考: Android内存泄露分析之StrictMode - 星辰之力 - 博客园 (cnblogs.com)...
nginx: [emerg] the “ssl“ parameter requires ngx_http_ssl_module in nginx.conf
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:42 查看/usr/local/nginx/conf/nginx.conf文件第42行数据: listen 443 ssl; # server中的配置 原因是:nginx缺少 http_ssl_modul…...
Docker 部署loki日志 用于微服务
因为每次去查看日志都去登录服务器去查询相关日志文件,还有不同的微服务,不同日期的文件夹,超级麻烦,因为之前用过ELK,原本打算用ELK,在做技术调研的时候发现了一个轻量级的日志系统Loki,果断采…...
[Day 57] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的零知識證明技術 一、引言 隨著區塊鏈技術的不斷發展,如何在保護用戶隱私的同時確保數據的完整性和可信度成為了研究的焦點。零知識證明(Zero-Knowledge Proof,ZKP)技術就是其中的一項關鍵技術,它允許一方在不…...
06结构型设计模式——代理模式
一、代理模式简介 代理模式(Proxy Pattern)是一种结构型设计模式(GoF书中解释结构型设计模式:一种用来处理类或对象、模块的组合关系的模式),代理模式是其中的一种,它可以为其他对象提供一种代…...
《深入浅出多模态》(九)多模态经典模型:MiniGPT-v2、MiniGPT5
🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…...
调试和优化大型深度学习模型 - 0 技术介绍
调试和优化大型深度学习模型 - 0 技术介绍 flyfish LLaMA Factory LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上…...
华为S3700交换机配置VLAN的方法
1.VLAN的详细介绍 VLAN(Virtual Local Area Network)即虚拟局域网,是一种将一个物理的局域网在逻辑上划分成多个广播域的技术。 1.1基本概念 1)作用: 隔离广播域:通过将网络划分为不同的 VLAN,广播帧只会在同一 VLAN 内传播,而不会扩散到其他 VLAN 中,从而有效…...
学懂C++(三十八):深入详解C++网络编程:套接字(Socket)开发技术
目录 一、概述与基础概念 1.1 套接字(Socket)概念 1.2 底层原理与网络协议 1.2.1 网络协议 1.2.2 套接字工作原理 二、C套接字编程核心技术 2.1 套接字编程的基本步骤 2.2 套接字编程详细实现 2.2.1 创建套接字 2.2.2 绑定地址 2.2.3 监听和接…...
SpringBoot-配置加载顺序
目录 前言 样例 内部配置加载顺序 样例 小结 前言 我之前写的配置文件,都是放在resources文件夹,根据当前目录下,优先级的高低,判断谁先被加载。但实际开发中,我们写的配置文件并不是,都放…...
第八周:机器学习笔记
第八周机器学习笔记 摘要Abstract机器学习1. 鱼和熊掌和可兼得的机器学习1.1 Deep network v.s. Fat network 2. 为什么用来验证集结果还是不好? Pytorch学习1. 卷积层代码实战2. 最大池化层代码实战3. 非线性激活层代码实战 总结 摘要 本周学习对李宏毅机器学习视…...
音乐怎么剪切掉一部分?5个方法,轻松学会音频分割!(2024全新)
音乐怎么剪切掉一部分?音频文件是娱乐和创作的重要基础。音频在我们日常生活中发挥着重要作用,从音乐播放列表到有趣的视频,它无处不在。无论是音乐爱好者还是内容创作者,我们常常需要对音频文件进行剪切和编辑。想象一下…...
洛谷 CF295D Greg and Caves
题目来源于:洛谷 题目本质:动态规划dp,枚举 解题思路:将整个洞分成两半,一半递增,一半递减。我们分别 DP 求值,最后合并。状态转移方程为:dpi,jk2∑j(j−k1)dpi−1,k1。枚举极…...
【图像处理】在图像处理算法开发中,有哪些常见的主观评价指标和客观评价指标?
主观评价指标 在图像处理算法开发中,主观评价指标依赖于观察者的个人感受和判断,通常用于评估图像的视觉质量。以下是一些常见的主观评价指标: 平均意见分数 (Mean Opinion Score, MOS):通过收集多个评价者的评分并计算平均值来评…...
从零开始学cv-6:图像的灰度变换
文章目录 一,简介:二、图像的线性变换三、分段线性变换四,非线性变换4.1 对数变换4.2 Gamma变换 五,效果: 一,简介: 图像灰度变换涉及对图像中每个像素的灰度值执行数学运算,进而调整图像的视觉…...