Google AdSense收入$10美元后的收款账号身份验证操作指南 - 阿小信的博客

mikel阅读(23)

来源: Google AdSense收入$10美元后的收款账号身份验证操作指南 – 阿小信的博客

前不久,我使用公司身份注册了一个全新的 Google AdSense 账号,并开发了一个全新的网站成功接入 AdSense 开始赚美元广告费。在网站上线差不多 1 个月的时间,账号累计收入达到了 10 美元。AdSense 账户累计 $10 金额后会触发一个身份验证,这个验证非常关键!只有通过了 Google AdSense 的这个收款身份验证,才能在后续账户收入达到 100 美元时顺利接 Google AdSense 的美元汇款。

这几天一直比较忙,收到邮件后一直没来得及去完成这个操作,刚好马上国庆了又加上今天感冒中,决定放松一下不搞开发了,专门写写文章。这篇文章就专门记录我是如何完成 Google AdSense 收款身份验证的,如果你也是跟我一样新账号刚起步,应该是有一定参考价值的。

注意:自 Google 首次要求验证身份之日起,有 45 天的时间可以提交所需证件。45 天后,如果未提供相关证件,或者提供的证件无法验证身份,那么 Google 将停止在网页上展示广告。

前情提要

  1. 关于我为什么有了个人身份的 AdSense 账号还要注册一个企业账号: 「至暗时刻」失去收入的一周:Google AdSense 身份验证失败,账号被停用!
  2. 如果你也想要开通一个 Google AdSense  账号: Google AdSense 新手接入教程:手把手教你用网站赚取美元收入
  3. 新 AdSense 账号的第一个里程碑: 【一人公司里程碑】全新企业 AdSense 账号历经 28 天,单日收入终于达到了 1 美元——正式进入 1 美元俱乐部!
  4. 新账号当前遇到的问题: 关于 Google AdSense 账号因无效流量被限制广告投放的问题说明与记录

邮件内容回顾

首先我们看两封 AdSense 发来的邮件内容:

这封邮件的收件时间是 2025 年 9 月 21 日 16:52,我的 AdSense 账户收入达到$10 的当天没多久就收到了这封邮件。重点已经用红框标注了。但还是再强调一下,验证是需要填写地址信息,最好一定要用身份证(营业执照)上的地址,否则可能碰上我之前的“至暗时刻”

Google 的验证它只能对比我们的证件地址和填写的地址是否一致,如果填写的地址无法出具对应的具有法律效应的证件来证明就无法通过验证。而身份证(个人)是最方便提供的证明文件。

直接点击邮件中的「立即验证」蓝色按钮就可以登录 AdSense 进行资料提交了。

收到这封邮件后,在 AdSense 页面上也会有红色警告:「请采取行动:您的 AdSense 收款账号中有一些需要核实的信息

点击「前往“收款”页面」或者点击侧边栏菜单中的「收款」-「收款信息」也可以进行验证。

第二封邮件是 2025 年 9 月 23 日 22:21 收到的,这主要是一封$10 成就达成的邮件,里面有一些操作指引:

正如邮件中说的:只要收入达到 100 美元的支付最低限额,我们就会按月收到 Google AdSense 的付款。而 10 美元是验证收款账号身份信息验证的最低限额。

如何进行 Google AdSense 收款账号身份信息验证?

下面我们开始进行 AdSense 收款账号信息验证。通过 AdSense 页面点击那个容易让人产生 PTSD 的红色警告通知前往收款页面,你将会看到一个更加让人 PTSD 发作的大红色警告 ⚠️:

点击上面的「立即验证」按钮,弹出提示框:

因为我是这个是以「公司身份」注册的账号,因此 AdSense 会提示我准备营业执照和本人身份证,如果是「个人身份」注册的账号就只需准备身份证就可以了。

勾选「同意」,并点击蓝色的「开始验证」按钮。下面的步骤是按公司身份的操作截图记录的,个人身份的差不多,按照他的提示上传资料一步一步操作就可以了。

公司身份先要上传公司的注册文件,直接点击「上传」,传我们的营业执照原件照片。注意照片要清晰、完整。

上传后,点击「下一步」:

姓名必须和身份证上一致,ID 类型选择「居民身份证」,上传我们的身份证正反面照片,同样要求完整清晰。

⚠️ 我觉得这里对于「公司类型」的账号姓名是否必须是营业执照上法定代表人的姓名有点疑问。我认为这里的姓名是要填法定代表人姓名的,不然 AdSense 可能无法进行关联。因为我也是第一次操作公司身份的账号,我的营业执照上的法定代表人就是我自己,我不确定这里是否可以上传其他人的身份证。最好保持一致,使用法定代表人的身份证信息,避免不必要的麻烦,毕竟审核申请次数有限,多一次失败就多一个风险。

继续点击「下一步」,填写地址信息,注意,完全按照身份证上的地址进行填写:

深入探索
验证
adsense
邮件
Adsense
AdSense
Google AdSense
身份验证
电子邮件
鉴权
Google-AdSense

最后,点击「提交」即可:

操作还是比较简单的,主要是信息填写要准确。提交后需要等待审核,如果不通过会被退回,审核结果需要等待几天。

最后总结一下,最重要的就是地址容易搞错,但都使用证件上的地址做到 AdSense 有证件可对比大概率就是没问题的。再次强调一下哦,和证件信息保持一致非常重要!!!我在这上面吃过亏的 T_T

这篇文章写于 9 月 30 日,后续如果有成功/失败的情况,我会更新。

本文就到这里,提前祝大家国庆节快乐!


后续更新:

10 月 7 日,收到了「Google AdSense:身份验证成功 」的邮件通知。邮件内容:

已验证您的身份。请登录您的 Google AdSense 账号,若尚未设置主要付款方式,请进行设置。

身份验证通过后,在「收款」-「收款信息」中就可以添加支付方式了。

AdSense添加支付方式

相关阅读: Google AdSense 国内如何收款?中国大陆银行电汇方式接收谷歌广告付款操作指南

10 月 8 日收到「请在 AdSense 或 AdSense YouTube 广告账号中验证您的收款地址」的邮件通知。邮件内容:

我们于 十月 08, 2025 给您在 AdSense 或 AdSense YouTube 广告账号中向我们提供的收款地址寄去了一个 PIN 码,即个人识别码。

您在收到 PIN 码邮件后,请点击本电子邮件中的验证您的地址,然后在验证页面上输入您的 PIN 码。您也可以登录自己的 AdSense 或 AdSense YouTube 广告账号,直接在验证页面上完成这些步骤。

重要提示: 如果在我们给您寄去第一个 PIN 码之日起的 4 个月内,您未使用该 PIN 码验证您的地址,我们将停止在您的网站上投放广告。

遇到了 PIN 码方面的问题?

通常需要等待 3 周时间,才能收到邮寄的 PIN 码。为避免出现任何 PIN 码递送问题,请确保您向我们提供的付款地址正确无误。在此提供几点提示:

  • 在所有付款地址字段中请使用相同的语言
  • 确认您本地的邮局能够识别您的地址
  • 与相关的邮寄服务商或邮局确认您的邮件未转寄到其他地址

如果需要,您可以按照以下步骤更改付款地址:

  1. 在您的 AdSense 或 AdSense YouTube 广告账号中,前往您的收款资料。
  2. 点击“姓名和地址”旁边的图标。
  3. 更新您的付款地址。
  4. 点击“保存”。

从我们给您寄出上一个 PIN 码的时间算起,您可以在 3 周后申请新的 PIN 码。

此时在「收款」-「验证检查」中就能看到「地址验证」中的 PIN 码输入框。等我们收到 PIN 码后填入并提交即可。PIN 是一个空的挂号信,撕开就能看到里面的 PIN 码。

AdSense PIN码验证

这里注意的是,PIN 码邮寄的地址不会单独填写,而是直接邮寄到你账号注册时填写的地址(个人账号是身份证地址/组织账号是营业执照的注册地址),如果地址不能接收 PIN 码可能需要先更新地址。

相关阅读:

【AI】智谱AutoGLM部署教程:AutoDL云服务器+本地PhoneAgent配置 | 慕雪的寒舍

mikel阅读(31)

来源: 【AI】智谱AutoGLM部署教程:AutoDL云服务器+本地PhoneAgent配置 | 慕雪的寒舍

1. 引言
开源地址:https://github.com/zai-org/Open-AutoGLM

一般情况下呢,这里得要介绍一下这个模型,背景信息啊,什么什么的。但慕雪最近很忙没时间写,直接跳过步入正题吧!

总而言之言而总之,这是智谱在25年12月9日开源的,一个专门为手机UI自动化操作开发的大模型,在今年早些时候AutoGLM的手机App就已经上线并可以通过里面的云端虚拟手机进行测试。现在,智谱把模型和本地Agent框架PhoneAgent一并开源,让我们可以自己部署AutoGLM并将其运用到各类UI自动化操作上。

 

因为是自部署的,数据都在你本地,也就不用担心大模型云端操作的隐私泄露问题了。

2. AutoDL部署AutoGLM模型
2.1. 创建镜像
AutoDL:https://www.autodl.com/home

根据官方在issue里面的回复,AutoGLM模型使用24G显存勉强可以运行,但实际上会占用27G的显存+共享内存,所以,需要在AutoDL上选一个32GB或48GB显存的服务器,cuda版本为12.8以上的,镜像选择PyTorch 2.8.0、Python 3.12(ubuntu22.04)、CUDA 12.8,就可以了。

 

创建镜像并开机之后,可以用ssh工具连这个服务器,也可以直接用控制台里面的jupyterLab链接,jupyterLab本身就带了终端持久运行的能力,不再需要我们安装tmux等其他守护进程工具了。

 

2.2. 下载模型
因为AutoDL是境内服务器,所以推荐去阿里的魔搭社区上下载模型:https://modelscope.cn/models/ZhipuAI/AutoGLM-Phone-9B

下载方式在魔搭社区上也有教程,执行如下命令即可。注意,在AutoDL上一定要进入/root/autodl-tmp数据盘进行操作,否则模型会直接把系统盘塞满,影响系统运行了。

SH
1
2
3
pip install modelscope
# 下载模型到本地,注意一定要有–local_dir参数
modelscope download –model ZhipuAI/AutoGLM-Phone-9B –local_dir /root/autodl-tmp/autoglm-phone-9b

模型大约20GB,在AutoDL上下载大概需要半个小时,耐心等待一下吧。

2.3. 配置vllm运行环境
等待模型下载期间也别闲着,开另外一个终端配置一下vllm的运行环境。

AutoGLM依赖于vllm 0.12.0和transformers 5.0.0rc0,我们可以创建一个conda环境来安装。

vllm 0.12.0在官方release中说明强依赖pytorch 3.9.0和cuda 12.9,但实测在AutoDL的cuda 12.8的环境里面是能可以正常运行无报错的。

执行如下命令,创建一个conda虚拟环境

SH
1
2
3
4
# 创建虚拟环境
conda create -n vllm python=3.12 -y
# 初始化
conda init
首次执行完毕conda init之后,会提示你开另外一个新终端,开一个新终端之后,执行如下命令

SH
1
2
3
conda init
# 激活刚刚创建的虚拟环境
conda activate vllm
执行完毕后,我们就已经进入刚刚新创建的虚拟环境里面了,执行下面两个命令即可。AutoDL的镜像已经默认设置了阿里pypi源,不需要我们修改镜像源了。

SH
1
2
pip install vllm==0.12.0 # 一定要先安装这个
pip install transformers==5.0.0rc0
注意,一定需要先安装vllm,然后再安装transformers[1],安装transformers==5.0.0rc0的时候会出现依赖不匹配的报错,因为vllm 0.12.0依赖的是4.x版本的transformers。可以直接忽略这个依赖版本不匹配的报错,智谱官方在issue里面提到了是能够兼容的,实测也确实OK。

 

其实不安装transformers==5.0.0rc0我也试过,模型也能运行,似乎也没啥问题。但是控制台会有加载解析器正则错误的告警,估计这就是截图里面提到的“新写法”导致的问题了。所以还是老实安装升级吧!

安装完毕这俩库之后,环境就搞定了,可以运行模型了!(当然得等模型下完了才行)

2.4. 运行模型
使用AutoGLM仓库里面给出的vllm命令,运行模型。注意这个命令需要修改我们下载好的模型本地路径,和端口号。AutoDL平台上只有6006和6008端口号是被映射到公网上的,其他端口号都不能使用。

另外,AutoDL租用的服务器提供外网服务需进行实名认证,请确保你的大模型服务不会被滥用生成违规违禁内容,避免罪责到你身上。

SH
1
2
3
4
5
6
7
8
9
10
11
12
# 修改最后的–model模型本地路径和–port绑定端口号
python3 -m vllm.entrypoints.openai.api_server \
–served-model-name autoglm-phone-9b \
–allowed-local-media-path / \
–mm-encoder-tp-mode data \
–mm_processor_cache_type shm \
–mm_processor_kwargs “{\”max_pixels\”:5000000}” \
–max-model-len 25480 \
–chat-template-content-format string \
–limit-mm-per-prompt “{\”image\”:10}” \
–model /root/autodl-tmp/autoglm-phone-9b \
–port 6006
执行这个命令后,vllm就会开始运行并加载模型,出现服务已上线,就是模型加载成功了。

 

回到控制台,点击自定义服务

 

把这里的6006端口号映射的URL复制一份,输入到浏览器里面。如果出现json的返回信息,且终端里面出现了请求日志,那就是模型服务部署成功了!

 

 

2.5. 完整模型加载日志
完整的模型加载日志
PLAINTEXT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
(vllm) root@autodl-container-50604192c4-d9d01c36:~/autodl-tmp# # 修改最后的–model模型本地路径和–port绑定端口号
python3 -m vllm.entrypoints.openai.api_server \
–served-model-name autoglm-phone-9b \
–allowed-local-media-path / \
–mm-encoder-tp-mode data \
–mm_processor_cache_type shm \
–mm_processor_kwargs “{\”max_pixels\”:5000000}” \
–max-model-len 25480 \
–chat-template-content-format string \
–limit-mm-per-prompt “{\”image\”:10}” \
–model /root/autodl-tmp/autoglm-phone-9b \
–port 6006
(APIServer pid=1433) INFO 12-10 22:50:46 [api_server.py:1772] vLLM API server version 0.12.0
(APIServer pid=1433) INFO 12-10 22:50:46 [utils.py:253] non-default args: {‘port’: 6006, ‘chat_template_content_format’: ‘string’, ‘model’: ‘/root/autodl-tmp/autoglm-phone-9b’, ‘allowed_local_media_path’: ‘/’, ‘max_model_len’: 25480, ‘served_model_name’: [‘autoglm-phone-9b’], ‘limit_mm_per_prompt’: {‘image’: 10}, ‘mm_processor_kwargs’: {‘max_pixels’: 5000000}, ‘mm_processor_cache_type’: ‘shm’, ‘mm_encoder_tp_mode’: ‘data’}
(APIServer pid=1433) Unrecognized keys in `rope_parameters` for ‘rope_type’=’default’: {‘partial_rotary_factor’, ‘mrope_section’}
(APIServer pid=1433) INFO 12-10 22:50:46 [model.py:637] Resolved architecture: Glm4vForConditionalGeneration
(APIServer pid=1433) INFO 12-10 22:50:46 [model.py:1750] Using max model len 25480
(APIServer pid=1433) INFO 12-10 22:50:46 [scheduler.py:228] Chunked prefill is enabled with max_num_batched_tokens=2048.
(EngineCore_DP0 pid=1485) INFO 12-10 22:50:55 [core.py:93] Initializing a V1 LLM engine (v0.12.0) with config: model=’/root/autodl-tmp/autoglm-phone-9b’, speculative_config=None, tokenizer=’/root/autodl-tmp/autoglm-phone-9b’, skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, tokenizer_revision=None, trust_remote_code=False, dtype=torch.bfloat16, max_seq_len=25480, download_dir=None, load_format=auto, tensor_parallel_size=1, pipeline_parallel_size=1, data_parallel_size=1, disable_custom_all_reduce=False, quantization=None, enforce_eager=False, kv_cache_dtype=auto, device_config=cuda, structured_outputs_config=StructuredOutputsConfig(backend=’auto’, disable_fallback=False, disable_any_whitespace=False, disable_additional_properties=False, reasoning_parser=”, reasoning_parser_plugin=”, enable_in_reasoning=False), observability_config=ObservabilityConfig(show_hidden_metrics_for_version=None, otlp_traces_endpoint=None, collect_detailed_traces=None, kv_cache_metrics=False, kv_cache_metrics_sample=0.01), seed=0, served_model_name=autoglm-phone-9b, enable_prefix_caching=True, enable_chunked_prefill=True, pooler_config=None, compilation_config={‘level’: None, ‘mode’: <CompilationMode.VLLM_COMPILE: 3>, ‘Debug_dump_path’: None, ‘cache_dir’: ”, ‘compile_cache_save_format’: ‘binary’, ‘backend’: ‘inductor’, ‘custom_ops’: [‘none’], ‘splitting_ops’: [‘vllm::unified_attention’, ‘vllm::unified_attention_with_output’, ‘vllm::unified_mla_attention’, ‘vllm::unified_mla_attention_with_output’, ‘vllm::mamba_mixer2’, ‘vllm::mamba_mixer’, ‘vllm::short_conv’, ‘vllm::linear_attention’, ‘vllm::plamo2_mamba_mixer’, ‘vllm::gdn_attention_core’, ‘vllm::kda_attention’, ‘vllm::sparse_attn_indexer’], ‘compile_mm_encoder’: False, ‘compile_sizes’: [], ‘inductor_compile_config’: {‘enable_auto_functionalized_v2’: False, ‘combo_kernels’: True, ‘benchmark_combo_kernel’: True}, ‘inductor_passes’: {}, ‘cudagraph_mode’: <CUDAGraphMode.FULL_AND_PIECEWISE: (2, 1)>, ‘cudagraph_num_of_warmups’: 1, ‘cudagraph_capture_sizes’: [1, 2, 4, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, 448, 464, 480, 496, 512], ‘cudagraph_copy_inputs’: False, ‘cudagraph_specialize_lora’: True, ‘use_inductor_graph_partition’: False, ‘pass_config’: {‘fuse_norm_quant’: False, ‘fuse_act_quant’: False, ‘fuse_attn_quant’: False, ‘eliminate_noops’: True, ‘enable_sp’: False, ‘fuse_gemm_comms’: False, ‘fuse_allreduce_rms’: False}, ‘max_cudagraph_capture_size’: 512, ‘dynamic_shapes_config’: {‘type’: <DynamicShapesType.BACKED: ‘backed’>}, ‘local_cache_dir’: None}
(EngineCore_DP0 pid=1485) INFO 12-10 22:50:57 [parallel_state.py:1200] world_size=1 rank=0 local_rank=0 distributed_init_method=tcp://172.17.0.10:47959 backend=nccl
(EngineCore_DP0 pid=1485) INFO 12-10 22:50:58 [parallel_state.py:1408] rank 0 in world size 1 is assigned as DP rank 0, PP rank 0, PCP rank 0, TP rank 0, EP rank 0
(EngineCore_DP0 pid=1485) Using a slow image processor as `use_fast` is unset and a slow processor was saved with this model. `use_fast=True` will be the default behavior in v4.52, even if the model was saved with a slow processor. This will result in minor differences in outputs. You’ll still be able to use a slow processor with `use_fast=False`.
(EngineCore_DP0 pid=1485) Keyword argument `max_pixels` is not a valid argument for this processor and will be ignored.
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:05 [gpu_model_runner.py:3467] Starting to load model /root/autodl-tmp/autoglm-phone-9b…
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:05 [cuda.py:411] Using FLASH_ATTN attention backend out of potential backends: [‘FLASH_ATTN’, ‘FLASHINFER’, ‘TRITON_ATTN’, ‘FLEX_ATTENTION’]
Loading safetensors checkpoint shards: 0% Completed | 0/5 [00:00<?, ?it/s]
Loading safetensors checkpoint shards: 20% Completed | 1/5 [00:00<00:00, 4.26it/s]
Loading safetensors checkpoint shards: 40% Completed | 2/5 [00:01<00:02, 1.43it/s]
Loading safetensors checkpoint shards: 60% Completed | 3/5 [00:02<00:01, 1.15it/s]
Loading safetensors checkpoint shards: 80% Completed | 4/5 [00:03<00:00, 1.03it/s]
Loading safetensors checkpoint shards: 100% Completed | 5/5 [00:04<00:00, 1.06s/it]
Loading safetensors checkpoint shards: 100% Completed | 5/5 [00:04<00:00, 1.07it/s]
(EngineCore_DP0 pid=1485)
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:10 [default_loader.py:308] Loading weights took 4.87 seconds
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:11 [gpu_model_runner.py:3549] Model loading took 19.2562 GiB memory and 5.143751 seconds
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:11 [gpu_model_runner.py:4306] Encoder cache will be initialized with a budget of 18622 tokens, and profiled with 1 video items of the maximum feature size.
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:22 [backends.py:655] Using cache directory: /root/.cache/vllm/torch_compile_cache/19b1386448/rank_0_0/backbone for vLLM’s torch.compile
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:22 [backends.py:715] Dynamo bytecode transform time: 7.25 s
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:22 [backends.py:257] Cache the graph for dynamic shape for later use
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:29 [backends.py:288] Compiling a graph for dynamic shape takes 6.80 s
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:30 [monitor.py:34] torch.compile takes 14.05 s in total
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:31 [gpu_worker.py:359] Available KV cache memory: 19.17 GiB
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:32 [kv_cache_utils.py:1286] GPU KV cache size: 502,496 tokens
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:32 [kv_cache_utils.py:1291] Maximum concurrency for 25,480 tokens per request: 19.72x
Capturing CUDA graphs (mixed prefill-decode, PIECEWISE): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 51/51 [00:03<00:00, 16.86it/s]
Capturing CUDA graphs (decode, FULL): 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 35/35 [00:01<00:00, 23.12it/s]
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:37 [gpu_model_runner.py:4466] Graph capturing finished in 5 secs, took 0.69 GiB
(EngineCore_DP0 pid=1485) INFO 12-10 22:51:37 [core.py:254] init engine (profile, create kv cache, warmup model) took 26.32 seconds
(APIServer pid=1433) INFO 12-10 22:51:40 [api_server.py:1520] Supported tasks: [‘generate’]
(APIServer pid=1433) INFO 12-10 22:51:40 [api_server.py:1847] Starting vLLM API server 0 on http://0.0.0.0:6006
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:38] Available routes are:
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /openapi.json, Methods: GET, HEAD
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /docs, Methods: GET, HEAD
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /docs/oauth2-redirect, Methods: GET, HEAD
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /redoc, Methods: GET, HEAD
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /health, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /load, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /pause, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /resume, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /is_paused, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /tokenize, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /detokenize, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/models, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /version, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/responses, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/responses/{response_id}, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/responses/{response_id}/cancel, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/messages, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/chat/completions, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/completions, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/audio/transcriptions, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/audio/translations, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /scale_elastic_ep, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /is_scaling_elastic_ep, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /inference/v1/generate, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /ping, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /ping, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /invocations, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /metrics, Methods: GET
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /classify, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/embeddings, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /score, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/score, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /rerank, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v1/rerank, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /v2/rerank, Methods: POST
(APIServer pid=1433) INFO 12-10 22:51:40 [launcher.py:46] Route: /pooling, Methods: POST
(APIServer pid=1433) INFO: Started server process [1433]
(APIServer pid=1433) INFO: Waiting for application startup.
(APIServer pid=1433) INFO: Application startup complete.

3. 本地使用AutoGLM
3.1. 项目克隆
AutoGLM是一个定制的模型,必须要配合智谱开源的PhoneAgent SDK一起使用,需要本地有Python3.10+的环境

SH
1
2
3
4
5
6
# 克隆仓库
git clone https://github.com/zai-org/Open-AutoGLM.git
# 安装依赖
cd Open-AutoGLM
# 注意不要修改这个文件,只用安装里面给出的openai>=2.9.0和Pillow>=12.0.0
pip install -r requirements.txt
这里只是安装好了SDK的依赖,我们还需要给当前电脑配置ADB、链接手机到电脑上、给手机安装ADBKeyBoard等等操作。

考虑到AutoGLM模型面向的客户群体应该都会配置这些环境,本文就不多赘述了。如果你不太清楚咋配置ADB命令环境,请参考AutoGLM仓库的README,这里直接把README拷贝了过来:

安装ADB:

下载官方 ADB 安装包,并解压到自定义路径
配置环境变量:
MacOS 配置方法:在 Terminal 或者任何命令行工具里执行export PATH=${PATH}:~/Downloads/platform-tools,这里假设解压后的目录为 ~/Downlaods/platform-tools。如果不是请自行调整命令。
Windows 配置方法:可参考 第三方教程 进行配置。
安卓设备开启调试模式:

开发者模式启用:通常启用方法是,找到 设置-关于手机-版本号 然后连续快速点击 10
次左右,直到弹出弹窗显示“开发者模式已启用”。不同手机会有些许差别,如果找不到,可以上网搜索一下教程。
USB 调试启用:启用开发者模式之后,会出现 设置-开发者选项-USB 调试,勾选启用
部分机型在设置开发者选项以后, 可能需要重启设备才能生效. 可以测试一下: 将手机用USB数据线连接到电脑后, adb devices查看是否有设备信息, 如果没有说明连接失败。请务必仔细检查相关权限
安装 ADB Keyboard(用于文本输入,搞UI自动化基本都要装这个):

下载 安装包 并在对应的安卓设备中进行安装。
注意,安装完成后还需要到 设置-输入法 或者 设置-键盘列表 中启用 ADB Keyboard 才能生效
3.2. 运行Agent
安装完毕依赖之后,就可以直接运行了,把模型的base-url改成AutoDL上部署的外网url就可以了

SH
1
2
3
4
python main.py \
–base-url http://你的AutoDL服务地址:8443/v1 \
–model “autoglm-phone-9b” \
“帮我打开美团,买一杯瑞幸的椰香拿铁”
这里提醒一下,手机安装好ADBKeyBoard之后,必须要把手机默认输入法改成ADBKeyBoard,否则Agent在操作的时候还是会呼出给人用的输入法,导致没办法正常输入文字

main.py启动的时候,会对环境进行检查,模型url是否有效进行检查,检查通过了,就会开始任务(如下图所示),这时候你就可以看看你的手机,他是不是真运行起来啦!

 

注意,PhoneAgent是和AutoGLM绑定的,使用其他VL模型是没有用的!

4. The end
部署和使用到这里就结束啦!有什么问题欢迎评论区交流。

我现在就希望AutoGLM能有一个量化版本,能在Mac机器上用ollama之类的工具运行,这样就更好了。9b的模型理论上是可以被32GB内存的Mac加载运行的。不过我个人对大模型不太了解,不确定AutoGLM是否会强依赖Cuda环境,所以我的这个想法可能有失偏颇。

这里额外提一嘴:可能有朋友疑惑,为啥AutoGLM只支持安卓呢?

那是因为iOS的UI自动化,涉及到的Xcode配置、WDA配置、连手机、证书配置、开发者app认证那叫一个繁琐麻烦,不同iOS版本的很多系统级别弹窗样式都不一样,也得专门做适配。

总结来说:就是iOS的生态封闭,自动化配置麻烦。不同iOS系统版本之间变化大,为iOS做适配投入产出比不搞,纯纯是吃力不讨好。可不是安卓这边所有手机都内置的ADB那么方便的!

慕雪个人觉得,为鸿蒙做适配都比iOS容易!所有纯血鸿蒙的手机也都内置了hdc能力,本质上和安卓的adb是一套类似的工具!

脚注:
参考:https://github.com/zai-org/Open-AutoGLM/issues/5 ↩︎

作者: 慕雪年华
链接: https://blog.musnow.top/posts/3465160585/index.html
来源: 慕雪的寒舍
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【零基础入门】Open-AutoGLM 完全指南:Mac 本地部署 AI 手机助理(原理+部署+优化)附上修改后代码-CSDN博客

mikel阅读(21)

来源: 【零基础入门】Open-AutoGLM 完全指南:Mac 本地部署 AI 手机助理(原理+部署+优化)附上修改后代码-CSDN博客

代码路径:
https://github.com/weidadedawei/Open-AutoGLM

目录
1. 什么是 Open-AutoGLM?
2. 核心原理解析
3. 环境准备(超详细)
4. 模型下载与部署
5. 实战操作指南
6. 性能优化详解
7. API 与进阶用法
8. 常见问题 FAQ
1. 什么是 Open-AutoGLM?
1.1 项目简介
Open-AutoGLM 是智谱 AI 开源的手机 AI 助理框架。它能让你的 Mac 变成一个”超级大脑”,通过 USB 或 WiFi 远程控制你的安卓手机,自动完成各种任务。

想象一下这些场景:

“帮我在饿了么点一份黄焖鸡米饭”
“打开微信给妈妈发消息说我今晚不回家吃饭”
“在网易云音乐搜索周杰伦的歌并播放”
“打开 B 站搜索 Python 教程”
这些以前需要你亲自动手的操作,现在只需一句话,AI 就能帮你完成!

1.2 为什么选择本地部署?
对比项 云端 API 模式 本地 MLX 模式
隐私安全 截图上传云端 数据永不出本机
运行成本 按 Token 收费 电费即成本
网络依赖 断网不可用 完全离线可用
响应延迟 网络延迟波动 本地计算稳定
1.3 适合谁?
开发者:想了解 AI Agent 如何工作
隐私敏感用户:不希望手机截图上传云端
极客玩家:想在本地玩转多模态大模型
学习者:想学习 MLX、ADB、多模态模型的实际应用
2. 核心原理解析
2.1 AI Agent 工作原理
Open-AutoGLM 采用经典的 感知-思考-行动 (Perception-Thinking-Action) 循环:

┌─────────────────────────────────────────────────────────────┐
│ Agent 工作循环 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 感 知 │ ──→ │ 思 考 │ ──→ │ 行 动 │ │
│ │ │ │ │ │ │ │
│ │ 截图 │ │ 理解状态 │ │ 点击 │ │
│ │ UI解析 │ │ 规划步骤 │ │ 滑动 │ │
│ │ App状态 │ │ 生成指令 │ │ 输入 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ↑ │ │
│ └──────────────────────────────────┘ │
│ 循环执行 │
└─────────────────────────────────────────────────────────────┘
AI构建项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2.2 三层架构详解
感知层 (Perception Layer)

感知类型 技术实现 数据格式
视觉感知 adb shell screencap -p PNG 图像
结构化感知 adb shell uiautomator dump XML 元素树
状态感知 adb shell dumpsys activity App/Activity 信息
推理层 (Reasoning Layer)

AutoGLM-Phone-9B 是一个 视觉-语言模型 (VLM):

输入: [系统提示] + [任务描述] + [手机截图]

多模态编码器 (Vision Encoder)

Transformer 推理

输出: <think>推理过程</think><answer>{“action”: “Tap”, “element”: [500, 300]}</answer>
AI构建项目
1
2
3
4
5
6
7
模型会先在 <think> 标签中进行推理(类似 ChatGPT o1 的思考过程),然后在 <answer> 标签中输出具体的 JSON 操作指令。

执行层 (Execution Layer)

操作类型 ADB 命令 说明
Tap adb shell input tap x y 点击坐标
Swipe adb shell input swipe x1 y1 x2 y2 滑动
Type adb shell am broadcast -a ADB_INPUT_TEXT 输入文字
Launch adb shell am start -n package/activity 启动应用
2.3 MLX 框架介绍
MLX 是苹果公司专门为 Apple Silicon (M1/M2/M3/M4) 开发的深度学习框架:

统一内存架构:GPU 和 CPU 共享内存,无需复制数据
延迟编译:只编译实际执行的代码路径
原生 Metal 加速:充分利用 Apple GPU
对于本项目,MLX 让我们能在 Mac 上高效运行 9B 参数的多模态模型!

3. 环境准备(超详细)
3.1 系统要求
项目 最低要求 推荐配置
系统版本 macOS 13.3+ macOS 14+ (Sonoma)
芯片 M1 M1 Max / M2 Pro 及以上
内存 16GB (量化后) 32GB+
硬盘 20GB 可用空间 50GB+ SSD
Python 3.10+ 3.11
3.2 安装 Python 环境
方法 A:使用 Homebrew + pyenv(推荐)

# 1. 安装 Homebrew (如果没有)
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”

# 2. 安装 pyenv
brew install pyenv

# 3. 配置 shell (以 zsh 为例)
echo ‘export PYENV_ROOT=”$HOME/.pyenv”‘ >> ~/.zshrc
echo ‘command -v pyenv >/dev/null || export PATH=”$PYENV_ROOT/bin:$PATH”‘ >> ~/.zshrc
echo ‘eval “$(pyenv init -)”‘ >> ~/.zshrc
source ~/.zshrc

# 4. 安装 Python 3.11
pyenv install 3.11.9
pyenv global 3.11.9

# 5. 验证安装
python –version # 应该显示 Python 3.11.9
AI构建项目
bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
方法 B:使用 Conda

# 1. 下载 Miniforge (适合 Apple Silicon 的 Conda)
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh

# 2. 安装
bash Miniforge3-MacOSX-arm64.sh

# 3. 创建虚拟环境
conda create -n autoglm python=3.11
conda activate autoglm
AI构建项目
bash
1
2
3
4
5
6
7
8
9
3.3 安装 ADB 工具
ADB (Android Debug Bridge) 是连接 Mac 和安卓手机的桥梁。

# 使用 Homebrew 安装
brew install Android-platform-tools

# 验证安装
adb version
AI构建项目
bash
1
2
3
4
5
3.4 配置安卓手机
步骤 1:开启开发者模式

打开 设置 → 关于手机
连续点击 版本号 7 次
看到提示”您已进入开发者模式”
不同品牌手机的位置可能略有不同。华为在”关于手机”,小米在”我的设备”。

步骤 2:开启 USB 调试

返回 设置 → 系统 → 开发者选项
开启 USB 调试
开启 USB 安装 (如果有)
关闭 监控 ADB 安装应用 (如果有)
部分手机需要重启后设置才能生效!

步骤 3:连接并授权

使用数据线(不是纯充电线!)连接手机和 Mac
手机上会弹出授权窗口,勾选”始终允许”并点击确定
在终端验证连接:
adb devices
# 输出应该类似:
# List of devices attached
# ABCD1234567890 device
AI构建项目
bash
1
2
3
4
3.5 安装 ADB Keyboard
ADB Keyboard 是一个特殊的输入法,允许通过 ADB 命令输入中文。

下载 APK:ADBKeyboard.apk

通过 ADB 安装:

adb install ADBKeyboard.apk
AI构建项目
bash
1
设置为当前输入法:

手机上进入 设置 → 语言和输入法 → 管理键盘
启用 ADB Keyboard
验证安装:

adb shell ime list -a | grep ADB
# 应该输出: com.android.adbkeyboard/.AdbIME
AI构建项目
bash
1
2
3.6 安装项目依赖
# 1. 克隆项目
git clone https://github.com/zai-org/Open-AutoGLM.git
cd Open-AutoGLM

# 2. 安装 MLX 相关依赖
pip install mlx “git+https://github.com/Blaizzy/mlx-vlm.git@main” torch torchvision transformers

# 3. 安装项目依赖
pip install -r requirements.txt
pip install -e .

# 4. 验证安装
python -c “import mlx; import phone_agent; print(‘安装成功!’)”
AI构建项目
bash

1
2
3
4
5
6
7
8
9
10
11
12
13
4. 模型下载与部署
4.1 下载模型
方法 A:使用 HuggingFace CLI(推荐)

# 安装 CLI 工具
pip install -U “huggingface_hub[cli]”

# 设置国内镜像(可选,加速下载)
export HF_ENDPOINT=https://hf-mirror.com

# 下载模型(约 20GB)
huggingface-cli download –resume-download zai-org/AutoGLM-Phone-9B –local-dir ./models/AutoGLM-Phone-9B
AI构建项目
bash
1
2
3
4
5
6
7
8
方法 B:使用 ModelScope(国内最快)

pip install modelscope

python -c “from modelscope import snapshot_download; snapshot_download(‘ZhipuAI/AutoGLM-Phone-9B’, local_dir=’./models/AutoGLM-Phone-9B’)”
AI构建项目
bash
1
2
3
4.2 启动运行
下载完成后即可运行:

python main.py –local –model ./models/AutoGLM-Phone-9B “打开微信”
AI构建项目
bash
1
4.3 可选:4-bit 量化(推荐 16GB 内存用户)
如果你的 Mac 内存只有 16GB,或希望更快的推理速度,可以对模型进行量化:

量化效果对比:

对比项 原始模型 (FP16) 4-bit 量化
模型大小 ~20GB ~6.5GB
内存占用 需 32GB+ 16GB 即可
推理速度 较慢 提升约 3x
精度损失 基准 约 1-2%
量化步骤:

# 执行量化转换(约 15-20 分钟)
python -m mlx_vlm.convert \
–hf-path ./models/AutoGLM-Phone-9B \
-q \
–q-bits 4 \
–mlx-path ./autoglm-9b-4bit
AI构建项目
bash
1
2
3
4
5
6
使用量化模型运行:

python main.py –local –model ./autoglm-9b-4bit “打开B站搜索二次元”
AI构建项目
bash
1
5. 实战操作指南
5.1 基础命令
交互模式:

python main.py –local –model ./models/AutoGLM-Phone-9B

# 然后输入任务:
> 打开微信
> 搜索张三并发送消息你好
> 退出
AI构建项目
bash
1
2
3
4
5
6
单任务模式:

python main.py –local –model ./models/AutoGLM-Phone-9B “打开抖音刷5个视频”
AI构建项目
bash
1
5.2 常用参数
参数 说明 示例
–local 使用本地 MLX 推理 –local
–model 模型路径 –model ./models/AutoGLM-Phone-9B
–device-id 指定设备 –device-id 192.168.1.100:5555
–lang 语言 (cn/en) –lang en
–list-apps 列出支持的应用 –list-apps
–list-devices 列出连接的设备 –list-devices
5.3 任务示例
社交通讯:

python main.py –local –model ./models/AutoGLM-Phone-9B “打开微信给张三发消息说:下午三点开会”
AI构建项目
bash
1
电商购物:

python main.py –local –model ./models/AutoGLM-Phone-9B “打开淘宝搜索蓝牙耳机按价格排序”
AI构建项目
bash
1
美食外卖:

python main.py –local –model ./models/AutoGLM-Phone-9B “打开美团外卖点一份黄焖鸡米饭”
AI构建项目
bash
1
视频娱乐:

python main.py –local –model ./models/AutoGLM-Phone-9B “打开B站搜索Python教程”
AI构建项目
bash
1
音乐播放:

python main.py –local –model ./models/AutoGLM-Phone-9B “打开网易云音乐搜索周杰伦的晴天并播放”
AI构建项目
bash
1
5.4 WiFi 远程调试
无需 USB 线也能控制手机!

步骤 1:开启无线调试

确保手机和 Mac 在同一 WiFi 下
进入 开发者选项 → 无线调试
开启无线调试,记下 IP 和端口
步骤 2:连接设备

# 连接远程设备
adb connect 192.168.1.100:5555

# 验证连接
adb devices

# 使用远程设备执行任务
python main.py –local –model ./models/AutoGLM-Phone-9B \
–device-id 192.168.1.100:5555 \
“打开抖音刷视频”
AI构建项目
bash

1
2
3
4
5
6
7
8
9
10
5.5 支持的操作类型
操作 说明
Tap 点击指定坐标
Swipe 滑动屏幕
Type 输入文本
Launch 启动应用
Back 返回上一页
Home 返回桌面
Long Press 长按
Double Tap 双击
Wait 等待页面加载
Take_over 请求人工接管
6. 性能优化详解
6.1 内置优化(自动生效)
我们在代码中实现了三项关键优化:

优化 1:智能图像降采样

现代手机屏幕动辄 2K/4K,直接处理太慢。系统自动将图像长边限制在 1024 像素以内。

原始尺寸 处理后尺寸 像素减少
2400×1080 1024×460 82%
1920×1080 1024×576 72%
优化 2:KV Cache 量化

推理时启用 kv_bits=8,将 KV Cache 从 FP16 量化到 INT8:

显存占用降低约 30%
推理速度略有提升
优化 3:显存强制回收

每步推理后强制执行 mx.clear_cache() 和 gc.collect():

防止”越用越卡”
长时间运行保持稳定
6.2 手动优化建议
关闭不必要的后台应用:MLX 推理需要大量内存
使用有线连接:USB 比 WiFi 更稳定,截图传输更快
降低手机亮度:高亮度截图文件更大
定期重启模型:如果变慢了,Ctrl+C 终止后重新启动
6.3 性能参考
在 Mac Studio M1 Max (32GB) 上使用 4-bit 量化模型:

阶段 耗时
模型加载 约 30 秒
单步推理 13-18 秒
截图获取 0.5-1 秒
完整任务示例:“打开网易云音乐搜索歌曲一滴泪的时间播放”

总步数:6 步
总耗时:约 2 分 18 秒
7. API 与进阶用法
7.1 Python API 调用
from phone_agent import PhoneAgent
from phone_agent.model import ModelConfig
from phone_agent.agent import AgentConfig

# 配置模型
model_config = ModelConfig(
model_name=”./models/AutoGLM-Phone-9B”,
is_local=True,
max_tokens=3000,
temperature=0.1,
)

# 配置 Agent
agent_config = AgentConfig(
max_steps=50,
verbose=True,
lang=”cn”,
)

# 创建并运行
agent = PhoneAgent(
model_config=model_config,
agent_config=agent_config,
)

result = agent.run(“打开抖音刷3个视频”)
print(f”任务结果: {result}”)
AI构建项目
python
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
7.2 自定义回调函数
处理敏感操作和人工接管场景:

def my_confirmation(message: str) -> bool:
“””敏感操作确认(如支付)”””
print(f”检测到敏感操作: {message}”)
return input(“是否继续?(y/n): “).lower() == “y”

def my_takeover(message: str) -> None:
“””人工接管(如登录验证)”””
print(f”需要人工操作: {message}”)
input(“完成后按回车继续…”)

agent = PhoneAgent(
confirmation_callback=my_confirmation,
takeover_callback=my_takeover,
)
AI构建项目
python
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
7.3 批量执行任务
tasks = [
“打开微信给张三发消息:会议改到下午4点”,
“打开支付宝查看余额”,
“打开美团查看最近订单”,
]

for task in tasks:
result = agent.run(task)
print(f”完成: {task}”)
agent.reset()
AI构建项目
python
运行

1
2
3
4
5
6
7
8
9
10
7.4 配置参数参考
ModelConfig 参数:

参数 类型 默认值 说明
model_name str – 模型路径
is_local bool False 使用本地推理
max_tokens int 3000 最大输出 token
temperature float 0.1 采样温度
AgentConfig 参数:

参数 类型 默认值 说明
max_steps int 100 最大执行步数
device_id str None ADB 设备 ID
lang str cn 语言
verbose bool True 显示详细输出
8. 常见问题 FAQ
Q1: 设备未找到
adb devices # 输出为空
AI构建项目
bash
1
解决方案:

adb kill-server
adb start-server
adb devices
AI构建项目
bash
1
2
3
常见原因:

数据线是纯充电线
没有在手机上授权
开发者选项未正确开启
Q2: 模型加载失败 / 下载中断
# 使用断点续传
huggingface-cli download –resume-download zai-org/AutoGLM-Phone-9B –local-dir ./models/AutoGLM-Phone-9B

# 或使用国内镜像
export HF_ENDPOINT=https://hf-mirror.com
AI构建项目
bash
1
2
3
4
5
Q3: 内存不足 (Killed / MemoryError)
使用 4-bit 量化版本(见 4.3 节)
关闭其他应用
重启 Mac 后再试
Q4: 文本输入不工作
确认已安装 ADB Keyboard
确认已在系统中启用
验证安装:
adb shell ime list -a | grep ADB
AI构建项目
bash
1
Q5: 截图失败 (黑屏)
这是系统安全机制,某些应用(支付、银行)禁止截图。模型会自动请求人工接管。

Q6: 运行变慢 / 卡顿
# 终止并重新启动
Ctrl+C
python main.py –local –model ./models/AutoGLM-Phone-9B “你的任务”
AI构建项目
bash
1
2
3
Q7: WiFi 连接失败
确保手机和电脑在同一 WiFi
确保手机开启了无线调试
检查防火墙是否阻止 5555 端口
Q8: Windows/Linux 编码问题
# Windows
set PYTHONIOENCODING=utf-8

# Linux
export PYTHONIOENCODING=utf-8
AI构建项目
bash
1
2
3
4
5

————————————————
版权声明:本文为CSDN博主「伟大的大威」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010026928/article/details/155782313

ADBKeyBoard 安装 (中文输入)-CSDN博客

mikel阅读(44)

来源: ADBKeyBoard 安装 (中文输入)-CSDN博客

问题:

adb shell input text ‘你好嗎’
is not going to work.
AI构建项目
bash

ADBKeyboard 在这些情况下会有所帮助,尤其是在设备自动化和测试中

1. 下载
github网址:https://github.com/senzhk/ADBKeyBoard?tab=readme-ov-file
apk下载:
https://github.com/senzhk/ADBKeyBoard/blob/master/ADBKeyboard.apk
将下载好的apk放置在cmd命令同一个文件夹中,同时手机开启权限,可通过adb安装应用

 

2. 安装
安装命令:

adb install ADBKeyboard.apk
AI构建项目
bash

设置手机输入法

adb shell ime enable com.Android.adbkeyboard/.AdbIME
adb shell ime set com.Android.adbkeyboard/.AdbIME
AI构建项目
bash
示例
使用案例

import os
import base64

chars = “你好”
charsb64 = str(base64.b64encode(chars.encode(“utf-8”)))[1:]
os.system(“adb shell am broadcast -a ADB_INPUT_B64 –es msg %s” % charsb64)
AI构建项目
python
运行

测试完成,返回原先的输入法:
原先输入法为:com.baidu.input_mi/.ImeService

adb shell ime set com.baidu.input_mi/.ImeService
AI构建项目
bash

其他命令

adb shell ime list -a # Check your available virtual keyboards
adb shell ime reset # Reset to default, don’t care which keyboard was chosen before switch
————————————————
版权声明:本文为CSDN博主「ZHOU_CAMP」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41472205/article/details/144773591

Open-AutoGLM - 智谱开源的手机端AI Agent框架 | AI工具集

mikel阅读(85)

来源: Open-AutoGLM – 智谱开源的手机端AI Agent框架 | AI工具集

Open-AutoGLM 是智谱开源的手机端智能助理框架,基于 AutoGLM 构建,能通过自然语言指令实现手机操作的自动化。Open-AutoGLM通过 Phone Use 能力框架,将自然语言指令转化为实际操作,如点击、滑动、输入等,可在外卖、社交、客服等场景中自动完成任务。框架借助云手机技术保障隐私安全。Open-AutoGLM 开源目的是推动行业共同进步,保护用户隐私,加速 Agent 技术爆发。目前支持 50 多款主流中文应用,提供完整工具链和详细文档,助力开发者快速上手和二次开发。

Open-AutoGLM

Open-AutoGLM的主要功能

  • 自然语言理解与任务执行:用户能用自然语言描述需求,AI 自动解析意图、执行操作。
  • 多模态界面理解:通过视觉语言模型理解手机屏幕内容,识别界面元素进行操作。
  • 自动化操作:支持点击、滑动、输入文本、长按、双击等多种操作,模拟真实用户行为。
  • 敏感操作确认与人工接管:在涉及隐私或敏感操作时,AI 会请求人工确认或接管,确保安全性。
  • 远程调试与控制:支持通过 WiFi 或网络进行远程 ADB 调试,无需物理连接设备即可操作。
  • 支持多款应用:覆盖 50 多款主流中文应用,包括社交通讯、电商购物、美食外卖、视频娱乐等场景。
  • 云手机环境部署:在云端虚拟设备中运行,保障用户隐私和数据安全。

如何使用Open-AutoGLM

  • 准备工作
    • 安装 Python:确保电脑上安装了 Python(推荐 3.10 及以上版本)。
    • 安装 ADB:下载并安装 ADB https://developer.Android.com/studio/releases/platform-tools。安装完成后,将 ADB 的路径添加到系统环境变量中。
    • 配置安卓设备:确保安卓设备已启用开发者模式和USB调试,并连接到电脑。
  • 下载和安装
    • 下载 Open-AutoGLM
      • 访问 Open-AutoGLM GitHub 仓库 https://github.com/zai-org/Open-AutoGLM。
      • 点击页面右上角的 “Code 按钮,选择 “Download ZIP,下载项目代码。
      • 解压下载的文件到本地一个方便的目录(如 C:\Open-AutoGLM 或 ~/Open-AutoGLM)。
    • 安装依赖
      • 打开命令行工具(Windows 的命令提示符或 PowerShell,Mac/Linux 的终端)。
      • 切换到解压后的项目目录:
      • cd path/to/Open-AutoGLM
      • 输入以下命令安装依赖:
      • pip install -r requirements.txt
    • 启动模型服务
      • 输入以下命令启动模型服务(这是必须的步骤,但不需要理解代码):
      • python3 -m vllm.entrypoints.openai.api_server --model zai-org/AutoGLM-Phone-9B --port 8000
      • 如果看到服务启动成功的提示,就可以进行下一步。
  • 运行任务:打开一个新的命令行窗口,输入以下命令执行任务(只需要替换任务描述即可):python main.py --base-url http://localhost:8000/v1 --model "autoglm-phone-9b" "任务描述"

Open-AutoGLM的项目地址

  • GitHub仓库:https://github.com/zai-org/Open-AutoGLM
  • HuggingFace模型库:https://huggingface.co/zai-org/AutoGLM-Phone-9B

Open-AutoGLM的应用场景

  • 外卖点餐:用户只需用自然语言描述需求,Open-AutoGLM 能自动打开美团应用、搜索肯德基、选择全家桶套餐并完成下单操作。
  • 社交媒体互动:在微信、微博等社交应用中,用户可指令 AI“点赞好友的最新动态”或“评论抖音视频”,AI 将自动识别相关内容,执行点赞、评论等互动操作。
  • 办公自动化:在办公软件(如 WPS、Microsoft Office)中,用户通过语音或文字指令“创建一个名为‘项目计划’的文档并写入会议内容”,AI 能完成文档创建和内容编辑。
  • 智能家居控制:通过智能家居应用(如小米智能家居),Open-AutoGLM 能精准识别、控制相应设备,实现家居场景的自动化切换。
  • 交通出行:在地图或打车应用(如高德地图、滴滴出行)中,AI 将实时规划路线,完成叫车操作,方便快捷。

2025:AI 一人公司技术栈(最新实战版) - 今日头条

mikel阅读(34)

来源: 🚀💻 2025:AI 一人公司技术栈(最新实战版) – 今日头条

2025:AI 一人公司技术栈(最新实战版)

这一个月最大的感悟:

独立开发不是在和别人竞争,而是在和自己的时间赛跑。

能自动化的就自动化,能复用的就复用。

把时间浪费在无谓事情上的代价,远比你想得大。

下面是我筛选后的“真正能提高生产力、减少重复劳动”的技术栈。全部亲测高效

1. 核心生产力(三件套)

Cursor

目前最稳的写代码主力。

日常开发 80% 都靠它完成。

2.0 发布后代理能力更强,多线程并行更猛。

Dify

做 AI 原型、自动化工具、内部系统巨快。

私有化后不用担心安全,是真正的“效率倍增器”。

n8n

自动化神器。把能交给机器干的都交出去:

✔ AI 早报

✔ 数据清洗

✔ 工作流触发

✔ 自动提醒

节省时间是指数级的。

2. 前端开发(快速 + 丝滑为主)

Next.js + Tailwind CSS

目前最顺手、最快的组合,没有之一。

Shadcn UI + Lucide Icons

组件好看、定制简单,基本告别自己手搓 UI。

Vercel AI SDK

接 AI 聊天接口就像装插件,一行代码起飞。

和 Next.js 配合简直无敌。

3. 后端开发(按项目规模选)

FastAPI

轻量、速度快,小中型项目极度舒适。

NestJS

当项目结构复杂,需要工程化的时候,它绝对稳。

Alembic / Prisma

数据库迁移工具必备,不踩坑。

4. 数据库(按场景选)

PostgreSQL

复杂业务场景的首选,可靠性无敌。

MongoDB

迭代快、结构灵活的小项目最佳搭档。

Supabase

自带认证、文件存储、实时订阅——

一个 SDK 带走后端 40% 工作量。

5. 部署 & 运维(稳定 + 省心)

Docker + Compose

所有环境统一管理,跨机器无痛复刻。

GitHub Actions / GitLab CI

提交即部署,非常适合一人团队。

Cloudflare

安全 + 加速 + CDN,一步到位。

DigitalOcean

配置简单、价格友好,独立开发者首选云。

6. 运营 & 工具(一个人就是一个团队)

Figma

原型 + UI 全都能自己搞定。

Notion

文档、规划、素材库一站式管理。

Stripe

海外支付接入最优方案,不折腾。

最后的感悟

做一人公司,你会突然明白:

沉默的成本最高,重复劳动最贵。

把所有可以复用的流程自动化,把所有能交给 AI 的交出去。

不是为了更快,而是为了把你的时间留给真正重要的事。

能简化的简化,能自动化的自动化,能放弃的果断放弃。

这就是一人公司的生存哲学。

AutoGLM开源:每台手机,都可以成为AI手机

mikel阅读(39)

来源: AutoGLM开源:每台手机,都可以成为AI手机

我们想做的

到底是一件什么事

图片

过去的很长时间,我们一直在回答同一个问题:

如果 AI 真的是“助手”,它能不能像人一样,自己把手机拿起来,把一件事从头做到尾?

在我们的想象里,AI 不该只停留在聊天框里,而是可以走进用户每天真正要点的那些 App 里:

  • 帮你在外卖 App 里完成从选择到下单;
  • 帮你在云手机里,批量处理通知、点赞评论;
  • 帮你在销售、客服、出勤等场景里,自动做完一堆“你自己也不想点的重复动作”。

AutoGLM 想做的,就是这件事:让 AI 真正学会“使用手机”。

32个月

我们具体做到了什么?

图片

用一句简单的话来说:

我们希望 AutoGLM,不仅能“说”,还能“做”。

为了这一句话,我们从 2023 年 4 月——一个大多数人还不知道大模型是什么的时候,完全从零去探索每一个细节,到今天,已经 32 个月了。

1.“乱点” -> “可控”

在最开始的版本里,基于大模型所构建的系统只知道“点”、“滑”等操作,偶尔能完成一个很短的流程,更多时候会迷失在不知所谓的操作中,甚至陷入死循环。

为了解决这类问题,我们花了近一年的时间,去梳理每一个可能的问题,尝试把这些“乱点的手”变成一只“可控的手

  • 建了一整套 Phone Use 能力框架;
  • 把点击、滑动、输入、截图、界面理解这些最基础的动作抽象出来;
  • 让模型学会把一句自然语言拆解为一系列稳定、可回放的操作步骤;
  • 处理掉各种真实世界的“脏信息”:网络波动、弹窗打断、广告遮挡……

2024 年 10 月 25 日,我们发布了第一个能够在真机上稳定完成一条完整操作链路的 AutoGLM,

它被业内视为全球首个具备 Phone Use 能力的 AI Agent。

2.第一个由 AI 发出的红包

2024 年 11 月,AutoGLM 发出了人类历史上第一个由 AI 完成的手机红包:不是脚本录制,不是内嵌 API 调用,而是通过在屏幕上“看见”界面、“理解”含义,一步一步完成点击。

对我们来说,这是一个信号:

从此以后,手机上的很多交互,第一次可以完全由 AI 接手。

Image

3.走向云手机:把能力放到一个更安全的空间

2025 年,我们发布了 AutoGLM 2.0,验证了强化学习的规模扩展定律,提出了 MobileRL、ComputerRL 和 AgentRL 算法,让 AutoGLM 在上千个虚拟设备环境里同时强化学习,极大扩展了 Agent 的准确性和泛化能力。

更关键的是,我们不希望 Agent 直接在用户真实手机、真实微信上肆意操作,于是选择把它放进一台和用户真实世界脱离的虚拟手机里:

  • 这台手机跑在云端;
  • 每一个动作都可以回放、审计、干预;
  • 真正敏感的数据可以严格隔离。

这套设计背后的直觉很简单:

让 AI 会用手机之前,我们要先保证,它不会在不该点的地方胡乱伸手。

除了云手机的选择,我们主动放弃了操作微信等这些离用户隐私较近的 APP。

为什么要开源?

我们真正在意的是什么?

图片

从产品的角度,AutoGLM 已经可以支撑起很多真实场景;从工程的角度,AutoGLM的积累足够写成一大摞技术报告。

那为什么,在这个时间点,我们选择把它开源?

我们想清楚的,大概有三件事。

1.这件事只在一家公司做,是不够的

AI 手机已经是趋势,但如果“会用手机的 AI 能力”只掌握在极少数厂商手里,那意味着:

  • 开发者的创新空间,要看平台愿不愿意开放接口;
  • 用户日常生活中最重要的那台设备,越来越像“别人家的入口”。

AutoGLM 开源的第一层初衷,是把这一层能力变成整个行业可以共同拥有、共同打磨的公共底座。

你可以把它当成一块积木,放进你自己的系统里,也可以把它拆开、重写、改造,那一刻起,它就不再只是“智谱的 AutoGLM”,而是你和你的团队做出来的东西的一部分。

2.让隐私和控制权,真正留在使用方这一侧

我们也很清楚,Phone Use 能力,一旦做大,天然会碰到最敏感的那一部分世界:个人微信、支付、聊天记录、照片相册、企业内部系统。

我们不希望也不应该,把这些东西握在自己手里。

通过开源和私有化部署,企业和开发者可以在自己的合规环境中完整掌控数据、日志和权限。

可以让手机,成为专属自己的 AI 手机。

用一句话概括就是:

技术向整个生态开放,

数据与隐私,永远留在使用方这一侧。

3.把我们走过的路,变成大家在Agent爆发时代的起跑线

AutoGLM是一条很陡的路:我们啃过的技术难题、踩过的坑、重写过的框架,

在很多场景里都可以复用,也值得被复用。

但这还不够,“一花独放不是春”。Agent 的爆发,需要所有人一起参与。

我们更乐见的是:

  • 有团队基于 AutoGLM,做出真正意义上的 AI 原生手机;
  • 有研究者把其中的某个模块拆出来,变成一篇论文、一套新算法;
  • 有个人开发者把一个 Demo 改成自己的项目,在某个小众场景里真正跑起来。

我们希望开源社区:

从今天开始,人人都可以拥有自己的手机 Agent。

你现在能拿到什么

图片

我们开源的,是一整套可以「拿来就用」的能力,而不仅仅是一份概念说明。

具体包括:

  • 训练好的核心模型;
  • Phone Use 能力框架与工具链;
  • 可直接跑通的 Demo,覆盖 50+ 高频中文 App;
  • 针对 Android 的适配层与示例工程;
  • 文档、快速上手指南。

模型会以 MIT 开源许可证的形式开放,而所有代码会以 Apache-2.0 开源许可证的形式,托管在 GitHub 仓库(示例:github.com/zai-org/Open-AutoGLM)中。

你可以把它当成一套现成的基础设施,也可以单独拆用其中的某一部分,甚至可以把它改得面目全非——只要它帮助你更接近你心目中的「AI 原生手机」。

接下来

图片

现在的 AutoGLM 不是一个完美的答案。真实世界的手机和应用,它还远远没有全部见过。未来的 AI 手机生态,也一定会有比我们今天想象得更惊喜的形态。

我们做的,只是把对“AI 会不会用手机”这个问题的一次完整回答,诚实地、原原本本地,交到你们手里。

在 2025 年尾的这个时刻,正如 Andrej Karpathy 所说,

从今天开始,人人都可以拥有自己的手机 Agent。我们面对的大概不只是“Agent 元年”,而更可能是“Agent 的十年”。

接下来,AutoGLM 团队会继续努力,让我们一起推动 Agent 开源和研究,那个梦想中的“贾维斯”,才会真的在我们人人身边出现。

浏览器加载html、css、js的顺序 - 幼儿园技术家 - 博客园

mikel阅读(41)

来源: 浏览器加载html、css、js的顺序 – 幼儿园技术家 – 博客园

为什么要了解浏览器加载流程?

前端性能优化、SEO、首屏渲染速度、闪烁问题、Hydration mismatch 这些常见问题,本质上都与浏览器加载顺序有关,特别是排查的时候会心态爆炸。

例如实际上用 nuxtjs3 写项目的时候,首页加载老是会出现 Hydration completed but contains mismatches.,diu查了好久,把页面渲染顺序都进行调式,最后发现不是页面问题,而是在 nuxt.config.ts 多配置了首页缓存的,导致每次两端渲染不同:

    nitro.prerender.routes: ['/']

    routeRules: {
        "/": { prerender: true },
    },

虽说不是加载流程问题,但是好歹还是能排查一些问题的,掌握的话查起来还是很快的。


浏览器加载网页的完整过程

下面是简化但准确的流程:

HTML 下载 → 解析 HTML → 下载/解析 CSS → 构建渲染树 → Layout → Paint

JavaScript 则会在关键步骤中插入“阻塞点”,它会影响解析顺序与渲染顺序。


一、浏览器加载 HTML(构建 DOM)

浏览器首先从服务器下载 HTML 文件,然后:

  • 从 上到下 解析
  • 一边读一边构建 DOM 树

在解析 HTML 的过程中,如果遇到外部资源,就会触发对应行为:

  • 浏览器会并行下载 CSS
  • 不会阻塞 HTML 解析
  • 但 CSS 解析未完成前无法渲染页面(渲染阻塞)

遇到 <script>(无 async/defr)

  • 阻塞 HTML 解析
  • 下载 JS
  • 执行 JS
  • 继续解析 HTML

也就是 普通 script 会暂停 DOM 的构建


二、CSS 加载与解析(构建 CSSOM)

CSS 文件下载后需要被解析成 CSSOM(CSS 对象模型)。

CSS 是渲染阻塞的

CSSOM 未构建完成 → 浏览器无法进行首次渲染

但 CSS 不会阻塞 HTML 的解析,只会阻塞渲染阶段。


三、DOM + CSSOM → Render Tree(渲染树)

当 DOM 和 CSSOM 都准备好后,浏览器把它们合成 Render Tree:

  • DOM 决定页面结构
  • CSS 决定页面样式

两者合成渲染树后,才可以进行 Layout & Paint。


四、Layout(布局计算)

浏览器计算每个节点的:

  • 大小
  • 位置
  • 盒模型

五、Paint(绘制)

将渲染树绘制到屏幕像素上。

此时用户才看到页面。


六、JavaScript 对加载顺序的影响

JavaScript 的三种加载方式:

1. 普通 <script>(最慢)

阻塞 HTML 解析 → 下载 JS → 执行 JS → 继续解析 HTML

2. <script defer>(推荐)

并行下载 JS
HTML 完成后按顺序执行
不阻塞解析
在 DOMContentLoaded 之前执行

3. <script async>(最快,但不稳定)

并行下载
下载完立即执行(可能打断 HTML 解析)
执行顺序无法保证

浏览器加载流程

UserJS EngineCSS ParserHTML ParserBrowserUserJS EngineCSS ParserHTML ParserBrowser下载并解析 HTML遇到 <link> 开始下载 CSS(不阻塞 HTML)解析 CSS(阻塞渲染)遇到普通 <script> 下载并执行(阻塞 HTML)DOM Tree 构建完毕CSSOM 构建完毕DOM + CSSOM → Render TreeLayout(布局计算)Paint(绘制)页面显示

最终总结(记住这 7 句话就够了)

  1. HTML 自上而下解析,构建 DOM
  2. CSS 加载不阻塞 HTML,但阻塞渲染
  3. 普通 script 会阻塞 HTML 解析
  4. async 脱离顺序执行
  5. defer 按顺序、在 HTML 完成后执行
  6. DOM + CSSOM 才能进行渲染
  7. Layout → Paint 才真正显示页面

如何使用 PostMan 进行并发测试?_postman 并发测试-CSDN博客

mikel阅读(94)

来源: 如何使用 PostMan 进行并发测试?_postman 并发测试-CSDN博客

01、POST篇
要在Postman中对POST请求进行压力测试,可以按照以下步骤进行操作:

打开Postman应用程序并创建一个新的请求集合(Collection)。

在请求集合中创建一个新的请求,并选择HTTP方法为POST。

在请求URL字段中输入要测试的目标URL地址。

在请求主体(Body)部分中输入POST请求的有效载荷(Payload)数据。

配置请求头(Headers)和其他必要的参数。

在Postman界面的右上角,找到“Runner”按钮并点击它。

进入运行器(Runner)界面,选择之前创建的请求集合,并配置运行参数。

可以设置运行器的迭代次数、并发请求数量、延迟时间等选项,根据需要进行调整。

点击“Start Run”按钮开始运行压力测试。

运行结束后,可以查看每个请求的响应结果和性能指标,如响应时间、吞吐量等。

请注意

进行压力测试时要确保目标服务器能够承受相应的负载。此外,压力测试可能会对目标服务器产生一定的负担,请谨慎操作,避免对生产环境或敏感系统造成不良影响。

流程

 

 

 

 

id 和 procureId 均是唯一的,不能插入重复,因此要在Pre-req中设置变量

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】
AI构建项目

Pre-req 脚本 js

在这里(View -> Show Postman Console)可以看到log的内容

 

生成的id: a54dc69c8ba94dffb2a0813fcf88c069

生成的procureId: P20231201132925285867

并发操作步骤

 

结果

 

02、GET篇
添加环境变量

 

 

引用变量

 

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

 

最后: 可以在公众号:自动化测试老司机 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、MySQL数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
————————————————
版权声明:本文为CSDN博主「自动化测试老司机」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_47485438/article/details/138800928

AI面试官:Asp.Net 中使用Log4Net (一) - Ysの陈憨憨 - 博客园

mikel阅读(87)

log4net.config”

来源: AI面试官:Asp.Net 中使用Log4Net (一) – Ysの陈憨憨 – 博客园

1. 先新建一个ASP.NET Core空项目

 

 

1. 什么是log4net?它的作用是什么?

解答:log4net是一个开源的日志记录框架,用于在.NET应用程序中记录日志信息。它可以帮助开发人员将不同级别的日志信息输出到不同的目标(如文件、数据库、控制台等),以便进行应用程序的调试、监控和错误追踪。

案例和代码:假设有一个.NET Core Web API应用程序,我们可以通过集成log4net来记录API请求和异常信息,并将日志信息输出到文件中。

// 首先,通过NuGet安装log4net包

// 在Startup.cs中添加log4net配置
public void ConfigureLogging(IServiceCollection services)
{
    services.AddLogging(builder =>
    {
        builder.AddLog4Net(); // 添加log4net
    });
}

2. log4net日志级别有哪些?如何设置日志级别?

解答:log4net定义了几个日志级别,包括DebugINFOWARNERRORFATAL。可以通过在配置文件或代码中设置<root>或特定<logger>节点的level属性来指定日志级别。

案例和代码:在log4net的配置文件中设置日志级别,例如输出INFO级别及以上的日志信息:

<log4net>
    <root>
        <level value="INFO" />
        <appender-ref ref="FileAppender" />
    </root>
    <!-- 其他appender配置 -->
</log4net>

3. 如何在.NET Core应用程序中使用log4net记录日志?

解答:在.NET Core应用程序中使用log4net需要使用第三方库log4net.Extensions.Logging来进行集成。通过添加log4net的配置,然后在代码中使用ILogger接口来记录日志。

案例和代码:在.NET Core控制台应用程序中使用log4net记录日志:

class Program
{
    private static readonly ILog log = LogManager.GetLogger(typeof(Program));

    static void Main(string[] args)
    {
        // 初始化log4net
        var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
        XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

        log.Info("Application started");

        try
        {
            // 业务逻辑代码
            log.Debug("Some debug information");
        }
        catch (Exception ex)
        {
            log.Error("An error occurred", ex);
        }

        log.Info("Application ended");
    }
}

4. log4net如何输出日志到文件?

解答:可以使用RollingFileAppenderFileAppender来将日志输出到文件。FileAppender每次启动时创建一个新的日志文件,而RollingFileAppender会根据配置的文件大小或日期来生成不同的日志文件。

案例和代码:在log4net的配置文件中添加FileAppender,将日志输出到文件:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="logs/application.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %level %logger - %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="FileAppender" />
    </root>
</log4net>

5. log4net如何将日志信息输出到数据库?

解答:可以使用AdoNetAppender将日志信息输出到数据库。需要配置数据库连接字符串、日志表的结构和相应的SQL语句。

案例和代码:在log4net的配置文件中添加AdoNetAppender,将日志输出到数据库:

<log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
        <!-- 数据库连接字符串 -->
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=True;" />

        <!-- 日志表的结构 -->
        <commandText value="INSERT INTO LogTable (Date, Level, Logger, Message) VALUES (@log_date, @log_level, @logger, @message)" />
        <parameter>
            <parameterName value="@log_date" />
            <dbType value="DateTime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
            <parameterName value="@log_level" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%level" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%logger" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="4000" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%message" />
            </layout>
        </parameter>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="AdoNetAppender" />
    </root>
</log4net>