SNS什么的我是一直无爱的,这次蛋疼写了个登录开心网(kaixin001)并向所有好友发送站内消息的脚本。
开心网在登录的时候做了一些处理,并不传原始密码,从js分析到的结果是:登录时会生成一个随机的key,然后用这个key和原始密码进行xxtea加密,把加密后的结果再进行sha1加密。之后post这个key以及加密后的密码进行登录验证。
以下是很简陋的脚本内容:
#coding: utf-8
"""
开心网操作脚本
Author: piglei2007@gmail.com
Version: 1.0
"""
import re
import urllib
import urllib2
import random
import hashlib
import binascii
import cookielib
import simplejson
from xxtea import encrypt
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"
LOGIN_KEY_RE = re.compile(r"new\sEnLogin\('(.*")
class LoginError(Exception):
"""
登录失败抛出异常
"""
class Kaixin001User(object):
"""
操作kaixin001,现有方法:
get_login_key - 获得用户访问登录页面时分配的加密key
get_rpassword - 获得经过xxtea以及sha1加密后的密码
login - 登录
get_friends_list - 获得所有好友,返回字典格式
send_messages_to_all - 给所有好友发消息
"""
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)
def get_login_key(self):
"""
获得登录时候的加密key
"""
_temp = urllib2.urlopen(LOGIN_KEY_URL).read()
key = LOGIN_KEY_RE.search(_temp).group(1)
return key
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'
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'
def get_rpassword(self, password, key):
"""
获得加密后的密码
"""
xxtea_pw = binascii.b2a_hex( encrypt(password, key) )
r_password = hashlib.sha1(xxtea_pw).hexdigest()
return r_password
if __name__ == '__main__':
kxu = Kaixin001User(
username = 'your_username',
password = 'your_password'
)
kxu.login()
kxu.send_messages_to_all("This message is send by Python.")
这是脚本中需要用到的xxtea算法的python实现(xxtea.py):
import struct
_DELTA = 0x9E3779B9
def _long2str(v, w):
n = (len(v) - 1) << 2
if w:
m = v[-1]
if (m < n - 3) or (m > n): return ''
n = m
s = struct.pack('<%iL' % len(v), *v)
return s[0:n] if w else s
def _str2long(s, w):
n = len(s)
m = (4 - (n & 3) & 3) + n
s = s.ljust(m, "\0")
v = list(struct.unpack('<%iL' % (m 2), s))
if w: v.append(n)
return v
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]
y = v[0]
v[n] = (v[n] + ((z 5 ^ y << 2) + (y 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z))) & 0xffffffff
z = v[n]
q -= 1
return _long2str(v, False)
def decrypt(str, key):
if str == '': return str
v = _str2long(str, False)
k = _str2long(key.ljust(16, "\0"), False)
n = len(v) - 1
z = v[n]
y = v[0]
q = 6 + 52 // (n + 1)
sum = (q * _DELTA) & 0xffffffff
while (sum != 0):
e = sum 2 & 3
for p in xrange(n, 0, -1):
z = v[p - 1]
v[p] = (v[p] - ((z 5 ^ y << 2) + (y 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff
y = v[p]
z = v[n]
v[0] = (v[0] - ((z 5 ^ y << 2) + (y 3 ^ z << 4) ^ (sum ^ y) + (k[0 & 3 ^ e] ^ z))) & 0xffffffff
y = v[0]
sum = (sum - _DELTA) & 0xffffffff
return _long2str(v, True)
if __name__ == "__main__":
print decrypt(encrypt('Hello XXTEA!', '16bytelongstring'), '16bytelongstring')
标签:
python,操作开心网脚本
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“python实现的登录和操作开心网脚本分享”评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
2026年09月27日
2026年09月27日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]