如何在requests会话中绕过JS获取DLink路由器XML令牌实现编程发短信?
解决方案:直接请求XML文件获取CSRF Token
完全不需要用无头浏览器,直接在同一个requests会话里请求路由器的/csrf.xml文件就能拿到token,步骤简单直接:
- 维持会话一致性:路由器管理页面依赖会话Cookie做验证,所以必须用同一个
session对象完成所有请求,确保身份状态一致。 - 解析XML提取Token:拿到XML响应后,直接解析
<token>标签里的内容即可。
示例代码如下:
from requests import session import xml.etree.ElementTree as ET # 替换为你的实际参数 ipaddress = "你的路由器管理IP" target_number = "接收短信的手机号" sms_content = "要发送的短信内容" with session() as c: # 1. 请求csrf.xml获取token xml_res = c.get(f"http://{ipaddress}/csrf.xml") root = ET.fromstring(xml_res.content) csrf_token = root.find("token").text # 2. 构造并发送短信请求 sms_url = ( f"http://{ipaddress}/sys_smsmsg.htm?" f"csrftok={csrf_token}&Nsend=1&Nmsgindex=0" f"&S801E2701={target_number}&S801E2801={sms_content}" ) send_res = c.get(sms_url) # 可根据响应状态码或内容判断发送结果 print(f"请求状态码: {send_res.status_code}")
额外说明
- CSRF Token一般在会话有效期内持续有效,无需每次发送短信都重新请求XML;如果遇到token失效的情况,重新请求一次即可。
- 确保你的
requests会话已经完成路由器的登录验证(若管理页面需要登录),否则请求XML或发送短信会被拒绝。
内容的提问来源于stack exchange,提问作者VikSil
相关产品推荐
相关产品推荐

