Python实现加密参数登录与批量发消息脚本解析
本文以 Python 为例,演示如何分析网页登录接口的加密逻辑,通过提取动态 Key、结合 XXTEA 与 SHA1 算法处理密码参数,完成自动登录并批量向好友发送站内消息。内容涵盖请求头配置、Cookie 维护、API 数据解析及核心加解密代码实现,适用于学习逆向接口机制与自动化脚本编写。
核心目标与原理说明
本脚本旨在解决第三方社交平台常见的“非明文密码传输”问题。平台在登录时会生成一个随机 Key,客户端需先将原始密码与该 Key 进行 XXTEA 对称加密,再将密文进行 SHA1 哈希运算,最终将动态 Key 与加密后的密码组合发送至 API 接口。掌握此流程可复用于各类需要参数预处理的后端交互场景。
第1步:准备运行环境与基础配置
目的:建立可维持会话的请求对象,确保后续请求携带登录态凭证。入口:类初始化方法 __init__。动作:实例化 CookieJar 并挂载至 opener,同时注入标准的 Browser Headers 模拟真实环境。重要参数:User-agent 与 Host。可观察的完成状态:代码加载无误且无依赖报错,具备发起 HTTP 请求的基础条件。
#coding: utf-8
"""
开心网操作脚本(核心技术演示)
"""
import re
import urllib
import urllib2
import random
import hashlib
import binascii
import cookielib
import simplejson
from xxtea import encrypt # 需同级放置 xxtea.py
LOGIN_URL = "http://www.kaixin001.com/login/login_api.php"
LOGIN_KEY_URL = "http://www.kaixin001.com/"
FRIEND_LIST_URL = "http://www.kaixin001.com/interface/suggestfriend.php"
MESSAGE_SEND_URL = "http://www.kaixin001.com/msg/post.php"
class Kaixin001User(object):
def __init__(self, username, password):
self.username = username
self.password = password
self.cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
opener.addheaders = [
("User-agent", "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1) Gecko/20090704 Firefox/3.5"),
("Accept", "*/*"),
("Host", "www.kaixin001.com")
]
urllib2.install_opener(opener)
第2步:获取登录动态 Key
目的:提取前端注入的加密种子,供后续密码处理使用。入口:登录主页 URL。动作:请求页面源码并用正则表达式截取 EnLogin 括号内的随机字符串。重要参数:LOGIN_KEY_RE 编译后的正则对象。可观察的完成状态:get_login_key() 方法返回非空字符串,即为有效的动态 Key。
LOGIN_KEY_RE = re.compile(r"new\sEnLogin\('(.*?)'")
def get_login_key(self):
_temp = urllib2.urlopen(LOGIN_KEY_URL).read()
key = LOGIN_KEY_RE.search(_temp).group(1)
return key
第3步:实现密码加解密逻辑
目的:将明文转换为平台校验格式,规避直传密码的安全拦截。入口:自定义方法 get_rpassword。动作:调用 XXTEA 库将密码与 Key 混合加密,转为十六进制后再经 hashlib.sha1 计算哈希值。重要参数:原始密码与动态 Key。可观察的完成状态:返回固定长度(40位)的十六进制哈希串,可作为 rpasswd 参数提交。
def get_rpassword(self, password, key):
xxtea_pw = binascii.b2a_hex(encrypt(password, key))
r_password = hashlib.sha1(xxtea_pw).hexdigest()
return r_password
# xxtea.py 核心实现片段
import struct
_DELTA = 0x9E3779B9
def encrypt(str, key):
if str == '': return str
v = _str2long(str, True)
k = _str2long(key.ljust(16, "\0"), False)
n = len(v) - 1
z = v[n]; y = v[0]; sum = 0
q = 6 + 52 // (n + 1)
while q > 0:
sum = (sum + _DELTA) & 0xffffffff
e = sum >> 2 & 3
for p in xrange(n):
y = v[p + 1]
v[p] = (v[p] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff
z = v[p]
... # 完整算法见原文档附录
return _long2str(v, False)
第4步:构造请求完成登录验证
目的:携带加密凭证换取服务端授权并建立会话。入口:POST 至 login_api.php。动作:组装 email、encypt、rpasswd 并使用 urlencode 编码,附带 Referer 头伪装来源。重要参数:登录参数字典与 Headers。可观察的完成状态:响应体不包含 errno 字段,且控制台打印 “用户 xxx 登录成功!” 即验证通过。
def login(self):
login_key = self.get_login_key()
rpassword = self.get_rpassword(self.password, login_key)
login_params = {
'email': self.username,
'encypt': login_key,
'rpasswd': rpassword,
'url': '/home/',
'ver': '1'
}
req = urllib2.Request(LOGIN_URL, urllib.urlencode(login_params), {
"Referer": "http://www.kaixin001.com/"
})
result = urllib2.urlopen(req).read()
if "errno" in result:
raise LoginError("登录失败,请检查用户名或密码")
print "用户 %s 登录成功!" % self.username
return 'ok'
第5步:拉取好友列表并批量发送消息
目的:遍历目标账户进行自动化触达。入口:suggestfriend.php 获取列表与 msg/post.php 提交消息。动作:请求 JSON 解析 UID 数组,拼接为逗号分隔字符串;随后构造发信参数并 POST 提交。重要参数:uids 目标账户集与 content 消息正文。可观察的完成状态:接口返回成功重定向链接,控制台输出 “消息发送成功”。
def get_friends_list(self):
get_friends_params = {'t': str(random.random()), 'type': 'all'}
result = urllib2.urlopen(FRIEND_LIST_URL, urllib.urlencode(get_friends_params)).read()
friends = simplejson.loads(result)
print "你一共有 %s 位好友" % (len(friends) - 1)
return friends
def send_messages_to_all(self, message=''):
friends = self.get_friends_list()
send_params = {
'attachment_cancel': '', 'attachment_forwarding': '', 'attachment_random': '',
'code': '', 'content': message, 'forward_thread': '', 'rcode': '',
'service': '0', 'texttype': 'html',
'uids': ",".join([str(f['uid']) for f in friends])
}
result = urllib2.urlopen(MESSAGE_SEND_URL, urllib.urlencode(send_params))
print result.geturl()
print "消息发送成功"
return 'ok'
关键参数与运行状态检查
LOGIN_KEY_RE:正则需准确匹配目标网站前端实际输出的变量名,若网站升级可能导致匹配失效。cookielib.CookieJar():自动管理 Session,后续请求会自动附带登录态凭证,无需手动传递 Token。- 执行
login()后控制台打印“登录成功”表示 Header 伪装与参数拼装已生效;若抛出LoginError则需核对账号权限或验证码拦截策略。
注意事项与排错建议
- 版本兼容性提醒:示例代码基于 Python 2 语法编写(如
print语句、urllib2库、xrange)。在现代 Python 3 环境中,需将print改为函数形式,替换为urllib.request或推荐第三方库requests,并将xrange更正为range。 - 接口变更风险:文中涉及的服务端地址为历史案例演示。实际对接任何新平台时,务必先在开发者工具 Network 面板抓取真实流量,确认当前使用的加密算法(如 AES-GCM、RSA-OAEP 等)与参数命名。
- 安全合规边界:批量自动化操作易触发目标站点的反爬风控。生产环境中应增加请求间隔(如
time.sleep())、控制并发频率,并严格遵守平台 Robots.txt 协议与服务条款,避免对服务器造成负载压力。
简要总结
通过解析前端加密逻辑并结合标准 HTTP 客户端库,可以稳定完成复杂参数的签名、封装与接口调用。上述流程展示了从 Key 抽取、对称/单向哈希转换到会话保持的完整链路,为后续开发数据采集、状态同步或自动化运维脚本提供了可复用的架构参考。
以上就是 Python 解析网页加密参数与自动化登录发消息的详细内容,更多关于 Python 自动化脚本编写与接口调用的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













