Python login and operation happy net script sharing
- 2020-04-02 13:51:25
- OfStack
SNS what I have been loveless, this time I wrote a log into kaixin001 network (kaixin001) and send messages to all friends site script.
Kaixin001.com did some processing when logging in, without transmitting the original password. The result from js analysis is: a random key will be generated when logging in, and then the key and the original password will be used for xxtea encryption, and the encrypted result will be used for sha1 encryption. Then post the key and the encrypted password for login verification.
Here's a crude script:
#coding: utf-8
"""
Happy net operation script
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"newsEnLogin('(.*?)'")
class LoginError(Exception):
"""
The login failure throws an exception
"""
class Kaixin001User(object):
"""
operation kaixin001 , existing methods:
get_login_key - Gets the encryption assigned when the user accesses the login page key
get_rpassword - Get through xxtea As well as sha1 The encrypted password
login - The login
get_friends_list - Get all friends and return to dictionary format
send_messages_to_all - Message all your friends
"""
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):
"""
Gets the login encryption key
"""
_temp = urllib2.urlopen(LOGIN_KEY_URL).read()
key = LOGIN_KEY_RE.search(_temp).group(1)
return key
def login(self):
"""
The login
"""
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()
# Login failed
if "errno" in result:
raise LoginError(" Login failed, please check the user name or password ")
print " The user %s Login successful! " % self.username
return 'ok'
def get_friends_list(self):
"""
Get a list of all friends
"""
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 " You have a total of %s A good friend " % (len(friends) - 1)
return friends
def send_messages_to_all(self, message=''):
"""
Message all your friends
"""
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 " Message sent successfully "
return 'ok'
def get_rpassword(self, password, key):
"""
Gets the encrypted password
"""
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.")
This is the python implementation of the xxtea algorithm (xxtea-py) needed in the script:
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')