这篇文章主要介绍了大蟒实现的登录和操作开心网脚本分享,可以登录开心网,登录后发送信息等功能,需要的朋友可以参考下
社交网站(社交网站的缩写)什么的我是一直无爱的,这次蛋疼写了个登录开心网(开心001)并向所有好友发送站内消息的脚本。
开心网在登录的时候做了一些处理,并不传原始密码,从射流研究…分析到的结果是:登录时会生成一个随机的钥匙,然后用这个键和原始密码进行xxtea加密,把加密后的结果再进行sha1加密。之后邮政这个键以及加密后的密码进行登录验证。
以下是很简陋的脚本内容:
#编码:utf-8
'''
开心网操作脚本
作者:piglei2007@gmail.com
版本:1.0
'''
进口关于
导入urllib
导入urllib2
随机导入
导入哈希里布
导入binascii
导入库奇利布
导入简单json
从xxtea导入加密
log in _ URL=' http://www。辛凯001。com/log in/log in _ API。' PHP '
log in _ KEY _ URL=' http://www。辛凯001。' com/'
朋友列表URL=' http://www。辛凯001。com/界面/建议好友。' PHP '
MESSAGE _ SEND _ URL=' http://。辛凯001。com/msg/post。' PHP '
log in _ KEY _ RE=RE。编译(r ' new \ sen登录\(').*?)'')
类登录错误(异常):
'''
登录失败抛出异常
'''
类开心001用户用户(对象):
'''
操作开心001,现有方法:
获取登录密钥-获得用户访问登录页面时分配的加密键
get_rpassword -获得经过xxtea以及sha1加密后的密码
登录-登录
获取朋友列表-获得所有好友,返回字典格式
向所有人发送消息-给所有好友发消息
'''
def __init__(自己,用户名,密码):
self.username=用户名
自我密码=密码
self.cj=cookielib .CookieJar()
opener=URL lib 2。build _ opener(URL lib 2 .HTTPCookieProcessor(self.cj))
opener.addheaders=[
('用户代理,‘Mozilla/5.0(X11;u;FreeBSD i386en-US;rv:1.9.1)壁虎/20090704火狐/3.5'),
('接受',' */* '),
('主机,《www.kaixin001.com》)
]
urllib2.install_opener(开启器)
def获取登录密钥(自身):
'''
获得登录时候的加密键
'''
_ temp=URL lib 2。urlopen(登录密钥URL).阅读()
key=LOGIN_KEY_RE.search(_temp).组(1)
回车键
定义登录(自己):
'''
登录
'''
login_key=self.get_login_key()
r密码=自己。get _ r密码(self。密码、登录密钥)
login_params={
“电子邮件”:self.username
'加密:登录密钥,
' rpasswd': rpassword,
url': '/home/',
版本':' 1 '
}
req=urllib2 .Request(LOGIN_URL,urllib.urlencode(login_params),{
referer ':' http://www .辛凯001。' com/'
})
result=urllib2.urlopen(req).阅读()
# 登录失败
如果结果中出现"错误":
引发LoginError('登录失败,请检查用户名或密码)
'打印'用户%s登录成功!%自我。用户名
返回"确定"
def get_friends_list(self):
'''
获得所有好友列表
'''
get_friends_params={
' t': str(random.random()),
键入':'全部,
}
结果=URL库2。urlopen(FRIEND _ LIST _ URL,urllib。urlencode(get _ friends _ params)).阅读()
friends=simplejson.loads(结果)
'打印'你一共有%s位好友% (len(朋友)- 1)
回报朋友
def send_messages_to_all(self,message=' '):
'''
给所有好友发消息
'''
friends=self.get_friends_list()
send_params={
附件_取消":",
附件_转发":",
attachment_random ':' ',
代码":",
'内容:消息,
forward_thread ":",
rcode ":",
服务':' 0 ',
texttype': 'html ',
uid ':',' .join([str(f[' uid '])for f in friends])
}
结果=URL库2。urlopen(MESSAGE _ SEND _ URL,urllib.urlencode(send_params))
打印结果。geturl()
'打印'消息发送成功'
返回"确定"
def get_rpassword(self,password,key):
'''
获得加密后的密码
'''
比纳斯CII。b2a _ hex(加密(密码,密钥))
r _ password=hashlib。sha1(xxtea _ pw).hexdigest()
返回r _密码
if __name__=='__main__ ':
kxu=Kaixin001User(
用户名='您的用户名,
密码='您的密码'
)
kxu.login()
kxu.send_messages_to_all('此消息由计算机编程语言发送。')
这是脚本中需要用到的xxtea算法的大蟒实现(xxtea.py):
导入结构
_DELTA=0x9E3779B9
def _long2str(v,w):
n=(len(v) - 1) 2
如果女:
m=v[-1]
如果(m n - 3)或(男名):返回''
n=m
s=struct.pack('%iL' % len(v),*v)
如果w否则返回s[0:n]
def _str2long(s,w):
n=透镜
m=(4 - (n 3) 3) n
s=s.ljust(m,' \0 ')
v=list(struct.unpack('%iL' % (m 2),s))
if w: v.append(n)
返回v
定义加密(字符串,密钥):
如果str==“”:返回潜艇用热中子反应堆(submarine thermal reactor的缩写)
v=_str2long(str,True)
k=_str2long(key.ljust(16,' \0 '),False)
n=len(v) - 1
z=v[n]
y=v[0]
总和=0
q=6 52//(北^ 1)
而q 0:
总和=(总和增量)0xffffffff
e=总和2 3
对于xrange(n)中的p:
y=v[p 1]
v[p]=(v[p]((z ^ 5 ^ y ^ 2)(y ^ 3 ^ z ^ 4)^(总和^ y)(k[p ^ 3 ^ e]^ z)))0x ffffffff
z=v[p]
y=v[0]
v[n]=(v[n]((z ^ 5 ^ y ^ 2)(y ^ 3 ^ z ^ 4)^(总和^ y)(k[n ^ 3 ^ e]^ z)))0x ffffffff
z=v[n]
q -=1
return _long2str(v,False)
定义解密(字符串,密钥):
如果str==“”:返回潜艇用热中子反应堆(submarine thermal reactor的缩写)
v=_str2long(str,False)
k=_str2long(key.ljust(16,' \0 '),False)
n=len(v) - 1
z=v[n]
y=v[0]
q=6 52//(北^ 1)
sum=(q * _DELTA)0xffffffff
而(求和!=0):
e=总和2 3
对于xrange(n,0,-1)中的p:
z=v[p - 1]
v[p]=(v[p]-((z ^ 5 ^ y ^ 2)(y ^ 3 ^ z ^ 4)^(总和^ y)(k[p ^ 3 ^ e]^ z)))0x ffffffff
y=v[p]
z=v[n]
v[0]=(v[0]-((z ^ 5 ^ y ^ 2)(y ^ 3 ^ z ^ 4)^(和^ y)(k[0 ^ 3 ^ e]^ z)))0x ffffffff
y=v[0]
总和=(总和-_增量)0xffffffff
return _long2str(v,True)
if __name__=='__main__ ':
打印解密(加密('你好XXTEA!”、' 16字节字符串')、' 16字节字符串)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。