Python实现加密参数登录与批量发消息脚本解析

竹里
竹里
发布时间:2026-10-12| 3人浏览过
原创

本文以 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则需核对账号权限或验证码拦截策略。

注意事项与排错建议

  1. 版本兼容性提醒:示例代码基于 Python 2 语法编写(如print语句、urllib2库、xrange)。在现代 Python 3 环境中,需将print改为函数形式,替换为urllib.request或推荐第三方库requests,并将xrange更正为range。
  2. 接口变更风险:文中涉及的服务端地址为历史案例演示。实际对接任何新平台时,务必先在开发者工具 Network 面板抓取真实流量,确认当前使用的加密算法(如 AES-GCM、RSA-OAEP 等)与参数命名。
  3. 安全合规边界:批量自动化操作易触发目标站点的反爬风控。生产环境中应增加请求间隔(如time.sleep())、控制并发频率,并严格遵守平台 Robots.txt 协议与服务条款,避免对服务器造成负载压力。

简要总结

通过解析前端加密逻辑并结合标准 HTTP 客户端库,可以稳定完成复杂参数的签名、封装与接口调用。上述流程展示了从 Key 抽取、对称/单向哈希转换到会话保持的完整链路,为后续开发数据采集、状态同步或自动化运维脚本提供了可复用的架构参考。

以上就是 Python 解析网页加密参数与自动化登录发消息的详细内容,更多关于 Python 自动化脚本编写与接口调用的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。