简介:一份专门解决 wxid_ 微信号添加难题的源码工具包,适合普通微信用户、安卓手机使用者以及需要做微信好友引流测试的开发者。这类以 wxid_ 开头的账号由系统自动生成,常规搜索无法直接命中,资源提供一种基于 HTML 的调用方案,用户只需保存页面并按要求填入目标 wxid_,即可生成添加请求。相比通过共同好友、群聊或扫二维码等常规途径,这一方式更为直接,尤其适合安卓手持设备。包内共 3 个文件:主逻辑写在 index.html 中,另附 inscode 环境配置与 .gitignore 版本控制文件,方便在 VS Code、网页编辑器等环境中直接运行和调试。整个压缩包仅 5KB,轻量不占空间,上手成本极低。目前已有 1319 人学习浏览。代码中特别标注了安卓机型需要保留关键空格,避免拼接后的协议被系统拒绝;该方法不仅适用于系统分配的 wxid_ 账号,对自定义微信号同样有效。对于经常受限于微信隐私策略而无法添加好友的用户,这套小工具可省去反复摸索的时间,开箱即用,无论是添加客户、群友还是处理临时会话对象,都能派上用场。
1. wxid到底是什么:为什么拿到的ID搜不到,二维码却能加
有人在群里丢来一串“wxid_xxxxxx”让你加个好友,你在微信里把这段ID粘进搜索框,回车多半是“用户不存在”。更麻烦的是,对方还指望你把这种方法写进脚本,一键批量加人。先说清一个前提:wxid是注册时分配的原始ID,它是账号体系里的唯一标识,但并不是“微信号”。微信添加朋友时接受搜索的字段是用户可修改的微信号、手机号或QQ号,很多版本早已把wxid从可搜索索引里摘出去了。
也就是说,直接拿wxid去搜索框里找人,大概率走不通;但把wxid拼成一条微信自己认识的URL(weixin://contacts/profile/xxx),再把它做成二维码,扫码入口却是通的。标题里的“wxid微信号添加方法[代码]”本质上是这么一回事:把wxid当作输入参数,拼出一条微信客户端能解析的添加路径,然后用代码批量输出二维码。
这套方法适合处理老客户回捞、资料清洗、社群拉新这类场景。你手里有一批wxid,但对方没留手机号,也不方便手动一个个搜,于是需要本地脚本先把wxid转成二维码再分发给对应的人去扫。本文从URL拼接讲到二维码生成,再讲不同账号状态下选哪条路,最后把批量场景里的去重、校验和几个坑一并说清。
2. 从wxid到可扫二维码:URL拼装与qrcode的最小代码
2.1 添加好友二维码的解析逻辑:weixin:// 协议与一次扫码
微信的个人二维码扫码后,客户端解析出来的并不是一串纯数字ID,而是一条自定义协议URL,结构大致是 weixin://contacts/profile/目标标识。这个协议由微信客户端自己注册和解析,外部工具只需要把内容放进二维码,剩下的跳转、查询、弹出添加确认页,都由客户端完成。
一次完整的扫码链路是这样的:手机扫到二维码 → 客户端读取到 weixin:// 开头的内容 → 提取 profile/ 后面的目标标识 → 在账号体系里查询这个名字 → 命中后弹出“添加到通讯录”确认页。这一整条链路里,二维码内容只是一个“快递单”,微信收到后自己拆包查人,二维码本身不需要任何官方接口授权。
这里就引出了整篇文章最关键的一个判断:profile/ 后面到底该填什么。微信客户端拿到这个标识后,按“微信号”去查,所以只有当你的wxid同时是对方当前微信号时,这条路径才成立。对方注册后从没改过微信号,微信号栏里显示的就是wxid_xxx,二维码有效;对方已经改成自定义英文ID,你拿原来的wxid去拼URL,扫码就会提示用户不存在。这个区别后面会在第3章专门展开。
顺带说明,为什么不建议让脚本直接调用客户端接口去加好友:一方面个人号没有公开的添加接口,另一方面即便有现成工具,短时间高频请求极容易被判定为营销行为。离线生成二维码、由人工扫码的方式,既满足“把wxid变成可添加好友入口”的需求,又不触碰风控红线。
2.2 用Python生成二维码:最小可跑代码与参数说明
最常见的做法是用Python的qrcode库,它把编码、矩阵生成和PNG保存都封装好了,十几行就能把wxid变成一张可扫图片。下面这个函数接受一个wxid,输出一张png格式二维码,理论上扫出来就是目标用户的添加页。
import qrcode def wxid_to_qrcode(wxid: str, output: str = "wxid_qr.png"): # 把 wxid 当作微信号拼进官方扫码结构,这样扫出来才会跳“添加朋友” path = "weixin://contacts/profile/{}".format(wxid) qr = qrcode.QRCode( version=4, # 1~40 的整数,数字越大矩阵越密 error_correction=qrcode.constants.ERROR_CORRECT_M, # 容错率中等 box_size=10, # 每个点的像素数,决定整张图分辨率 border=2, # 白边格数,太薄容易扫不出 ) qr.add_data(path) qr.make(fit=False) qr.make_image().save(output) print("已生成:", output) # 用法 wxid_to_qrcode("wxid_example_123")逻辑说明:先把wxid拼成 weixin://contacts/profile/ 开头的URL,再交给qrcode库把这段文本渲染成二维码矩阵,最后保存为PNG。这里刻意用了 fit=False,不给qrcode缩小版本号的机会,保证编码结构与预期一致。
参数说明:version决定矩阵尺寸,version=4约能容纳几十个字符,普通wxid加前缀足够;error_correction建议至少用M,如果这张二维码会被截图压缩或打印在不干胶上,用Q或H更稳;box_size是每格的像素数,10适合屏幕展示,8以下细节偏小;border是白边宽度,官方标准推荐4格,2是下限,再薄就会扫码失败。这组参数不是固定的,我一般在出印刷物料时把box_size调到12,在批量生成电子图片时维持10。
2.3 特殊字符与URL编码:为什么@会让二维码失效
很多wxid不是纯字母数字,里面可能出现@,比如 wxid_a1b2_@c3d4。直接把这种wxid拼进URL再生成二维码,扫出来经常是空白页或者跑到一个无关的账号主页。原因是@在URL语义里被当作参数分隔符的预备符号,微信客户端解析时会从@处把路径截断,导致查询对象变成@之前的残段。
解决方式是先把wxid做一遍URL编码,把特殊字符转成百分号形式,再拼进链接。Python标准库urllib.parse可以干这个,关键点是safe参数要传空字符串,让所有特殊字符都被转义。
import urllib.parse raw_wxid = "wxid_a1b2_@c3d4" safe_wxid = urllib.parse.quote(raw_wxid, safe="") print(safe_wxid) # wxid_a1b2_%40c3d4 url = "weixin://contacts/profile/{}".format(safe_wxid) print(url)逻辑说明:quote把@转成%40,把:和/这类有歧义的字符也一并处理,避免路径被错误切分。微信扫码后会对URL做一次解码,所以用户那边看到的仍是正常ID,不会出现乱码。
在实际项目中,我不会只对个别带@的wxid做处理,而是把URL编码做成流水线里的固定一环。原因很简单:你无法保证上游导出的excel里没有隐藏字符,全量转义比逐个排查更省事,而且多一层编码不会影响有效wxid的扫码结果。
提示:如果生成的二维码被一些扫码工具识别后出现“链接格式不支持”的提示,先检查weixin://后面有没有被加上额外的/或空格,这类细节比编码更容易忽略。
3. 拿到wxid之后:三种可靠的添加路径对比
3.1 方案一:对方未改过微信号,直接扫码添加
适用对象是注册后从未修改过微信号的账号。这类账号在“我→设置→账号与安全→微信号”里显示的仍然是一串wxid_开头的内容,和资料库里拿到的原始ID一致。对这类数据源,第2章的代码可以直接用,拼URL、出二维码、发给对方扫码,链路最短。
怎么判断目标账号是不是这种状态?最直接的办法是让目标用户发一张个人名片截图,看名片上的微信号字段是否以wxid_开头;或者从你自己微信的通讯录里进对方主页,在“更多信息”里找微信号一栏。如果显示的就是wxid_原文,那方案一成立。
还有个细节值得注意:微信里“微信号”一栏显示的内容可能是脱敏的,例如只显示前两个字符和后两个字符。看到这种情况不要急着判断对方改过号,先确认是不是隐私设置把中间部分遮挡了。很多人误判这一步,把有效数据当成失效数据丢掉了。
方案一的代码实现就是第2章的wxid_to_qrcode,不需要额外分支。实际落地时,我一般会在脚本里加一个判断:如果输入本身不是wxid_开头,但仍然是一串字母数字组合,就继续按原样生成二维码,因为新注册账号的微信号不一定带wxid_前缀。
3.2 方案二:对方已改过微信号,先还原当前微信号再走二维码
更多时候你拿到的wxid对应的账号已经设置过自定义微信号,直接用原始ID拼URL,扫码会提示“用户不存在”。这时候要做的不是强行生成二维码,而是先通过正常可见的信息找回对方当前微信号。
常见做法是:在共同群聊里进入对方头像资料页,查看“更多信息”中的“微信号”字段;如果对方关闭了该展示,就只能借助对方的个人二维码——让认识的人扫一下他的码,在“通过名片添加”的确认页里能看到完整微信号。你说到底,这属于正常的信息读取,不涉及任何接口调用。
还有一种场景是对方微信号里保留了wxid的部分前缀,比如 wxid_abc123 改成了 abc123xx。这种数据如果直接拿去生成二维码,大概率会失败,因为这个ID已经不是账号当前的有效标识。处理办法是把这类可疑数据单独列一个待复核清单,不要混进批量生成流程。
方案二的重点不是写更多代码,而是把数据源做分区:未确认状态的wxid和已确认可用微信号是两条处理线路。我习惯在脚本里加一个人工复核输出目录,把无法判断状态的数据单独落盘,避免一把梭全量生成。
3.3 方案三:批量场景下从wxid列表生成二维码
批量生成是实务里最常见的需求。上游导出一个txt文件,每行一个wxid,本地脚本逐行读取、去重、生成二维码。这里除了基本的循环处理,还要注意三点:文件编码统一用UTF-8、输出文件名避开特殊字符、对重复ID做去重。
from pathlib import Path import qrcode import urllib.parse def batch_generate(wxid_file: str, out_dir: str = "qr_out"): out_path = Path(out_dir) out_path.mkdir(exist_ok=True) seen = set() # 去重,防止同一ID生成多张码 for line in Path(wxid_file).read_text(encoding="utf-8").splitlines(): wxid = line.strip() if not wxid or wxid in seen: continue # 空行或重复ID跳过 seen.add(wxid) # 特殊字符全量转义,避免@等符号截断URL safe = urllib.parse.quote(wxid, safe="") url = "weixin://contacts/profile/{}".format(safe) qr = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_M) qr.add_data(url) qr.make(fit=False) # 文件名取@前缀,规避Windows非法字符 file_name = wxid.split("@")[0] + "_qr.png" qr.make_image().save(str(out_path / file_name)) print("已生成:", wxid, "->", url) # 用法 batch_generate("wxid_list.txt", "qr_out")逻辑说明:脚本逐行读取txt,空行和重复ID直接跳过,每个有效wxid拼出URL后生成独立png。set用来去重,避免同一个wxid在列表里出现多次时生成多张内容相同的图片,既浪费空间,也可能引起扫码频率异常。
参数说明:version=5比第2章的最小代码略大,这是为了应对更长的wxid和百分号转义后的长度增长;文件名用split("@")[0]截取wxid的前半段,避免@、/、:等字符在Windows下报文件名非法;输出目录用Path对象管理,兼容Windows和Linux路径分隔符差异。
这套脚本跑完后,目录qr_out里会是与txt行数一致的png文件。它们可以直接通过聊天窗口发给目标用户,也可以打包成一个压缩包,让对方自己挑对应的二维码扫。务必强调一点:脚本到生成二维码这一步就结束了,最终点“添加”的动作留给人工,避免连续请求触发限制。
提示:txt文件如果来自Windows记事本,保存时默认可能是GBK编码,读出来会乱码且ID对不上。统一用UTF-8编码保存再跑脚本,这是批量生成前最容易忽略的一步。
4. wxid添加好友避坑指南:五个易翻车的常见点
4.1 现象:二维码扫了没反应——原因:@字符截断——解决:先quote再拼URL
有一类用户的wxid里带着@,比如 wxid_8f0a_@bb2。不做编码直接拼URL,扫出来的结果要么是空白页,要么跳到某个无关账号主页。原因在前文已经提过:@在URL语义里容易被当作参数边界,微信客户端解析时把路径截断,查询对象变成@之前的残段,自然查不到目标用户。
解决方法是全量编码,不对某个字符抱有侥幸心理,所有wxid都用urllib.parse.quote处理一遍再拼链接。同时加一段打印逻辑,把拼接后的完整URL输出到日志里,遇到问题能直观看到是哪一步出了问题。
4.2 现象:搜索框输入wxid搜不到人——原因:新版客户端把wxid移出可搜索字段——解决:走二维码路径
很多人把wxid直接粘进“搜索→添加朋友”的输入框,然后得到“用户不存在”的反馈。这不是ID错了,而是微信早就把wxid移出了可搜索字段的索引范围。搜索框接受的输入只有手机号、QQ号、邮箱,以及用户自行设置的微信号,原始ID不在此列。
解决方式就是回到二维码路径:把wxid拼成weixin:// contacts/profile格式并生成二维码,扫码后客户端能识别,走的是和搜索不同的解析通道。遇到这种情况不需要去质疑数据源,直接进入二维码生成流程即可。
4.3 现象:昨天生成的二维码今天提示用户不存在——原因:对方改了微信号——解决:重新核对数据
上周还能正常扫出添加页的二维码,这周拿出来扫,客户端提示用户不存在。最常见的原因是对方在这期间修改了“微信号”字段,原来和wxid一致的标识已经失效。微信允许用户修改微信号,改完后旧ID不再作为可查询标识。
解决方法是回到数据源头确认最新状态。如果对方是你的存量好友,直接进他的资料页看当前微信号;如果不是好友,只能通过共同群聊或第三方转发的名片确认。不要反复用同一张旧二维码去扫码验证,那样既浪费时间,也可能因为连续扫码被系统记录。
4.4 现象:批量自动点击添加后账号被限制——原因:高频请求触发风控——解决:离线生成二维码,人工扫码
技术圈子里常有人把这一步做成全自动:脚本调内部接口、循环点击添加按钮、自动处理弹窗。看起来效率拉满,实则风险极高,短时间连续添加陌生人会被系统判定为营销行为,轻则提示操作频繁,重则限制部分功能。
解决方式是只把自动化停在二维码生成这一步,后续的点击动作全部改为人工。你可以把批量生成的二维码打包发给对应的人,由对方自己扫自己添加;或者在内部团队里把二维码按组分发,由运营同事分批扫码操作,控制频率。把工具和“真人操作”的边界划清楚,既能达到建联目的,也不会把账号推到被封的边缘。
提示:涉及账号安全的操作,永远不要想着绕过风控,本期能用不代表下期安全。老老实实做离线生成,才是可持续的方案。
4.5 现象:Windows保存二维码时报文件名非法——原因:特殊字符进入文件名——解决:文件名规范化
Windows文件系统对文件名有严格限制,不能包含/、\、:、*、?、"、<、>、|这些字符。wxid里如果有@还好,如果上游导出的数据里混着其他符号,直接拿wxid当文件名保存,脚本会报错中断。
解决方式是文件名只取wxid的安全前缀,或者用索引编号代替原始ID。第3章的split("@")[0]就是为此设计的,但更稳妥的做法是直接对文件名整体做一次字符替换,把所有非法字符转成下划线,再从处理后的内容截取前30个字符作为文件名,彻底避开这个坑。
5. 进阶:给wxid列表加一道合法性预校验
5.1 生成前的合法性校验:把明显无效的wxid挡在门外
很多人拿到一批wxid就急着生成二维码,效率很高,但坏数据也一并进了产出队列。这些坏ID生成出来的图片扫不出来,发给用户只会增加沟通成本。所以我习惯在批量脚本里加一道预校验,先过滤明显非法的输入,再用正则和长度判断把可疑数据单独挑出来。
import re def is_likely_wxid(text: str) -> bool: if not text or len(text) < 6 or len(text) > 32: return False # 排除URL、路径、文件名场景里会出现干扰的字符 if re.search(r"[\s/\\\\:#*?\"<>|]", text): return False # 只允许字母数字、下划线、@和点号 if re.search(r"[^0-9A-Za-z_@.]", text): return False return True这是一个宽松的判断,不追求百分之百准确,目的是把明显无效的脏数据挡在二维码生成之前。比如空行、带空格的描述文本、被误复制进列表的URL地址,都会在这一步被筛掉。真正的wxid长度一般在6到32之间,前缀多为wxid_,但新号段的格式可能有变化,所以判断时不要在前缀上卡得太死。
用这个函数把输入列表分成两批:合法的进批量生成流程,可疑的落到一个“待人工确认”的txt里。这样既不会漏掉格式少见但真实有效的ID,也不会让垃圾数据污染最终产出。
5.2 验证一张二维码是否有效:一张截图判断
生成后的二维码是否有效,最快的验证方法是用微信自己扫一次。有效二维码扫码后会直接进入目标用户的“添加到通讯录”确认页;如果你的微信和目标用户已经是好友,则会跳转到他的个人资料页。这两种结果都说明二维码本身格式无误。
另一种验证方式是先把二维码发给一个测试账号,用测试账号扫码后确认能弹出添加页,再把这张码正式分发。这种方式适合批量产出的抽检,不必每张都验证,按批次抽3到5张就能覆盖大部分问题。
我现在做这类工具的习惯是先校验再出码,宁可每个ID多花一毫秒的过滤时间,也别让大批量数据里的一两个坏ID在落地阶段变成脏数据,后面回头排查更费神。这套从wxid到二维码的流程跑顺之后,后续加人还是沿用二维码路径,配合文件命名规范和预校验,基本不会再出幺蛾子。希望帮到你。
本文还有配套的精品资源,点击获取