This article mainly introduces python login and operation of Kaixin.com script sharing. you can log on to Kaixin.com and send messages after logon. if you need it, you can refer to SNS and other functions that I have never liked, this time, I wrote a script to log on to kaixin001 and send intra-site messages to all friends.
Kaixinnet did some processing during login without passing the original password. the result from js analysis is that a random key will be generated during login, then, use the key and the original password for xxtea encryption, and then encrypt the encrypted result with sha1. Then post the key and the encrypted password for logon verification.
The following is a simple script:
# Coding: UTF-8 "kaixinnet operation script Author: piglei2007@gmail.comVersion: 1.0" import reimport urllibimport urllib2import randomimport hashlibimport binasciiimport cookielibimport simplejsonfrom xxtea import sources =" 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):" logon failure throws an Exception "class Kaixin001User (object):" operating on kaixin001. the existing method is as follows: get_login_key-get the encrypted key get_rpassword allocated when the user accesses the logon page-get the password login encrypted by xxtea and sha1-log on to get_friends_list-get all friends, return the dictionary format send_messages_to_all-send a message to all 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 ): "obtain the encrypted key for logon" "_ temp = urllib2.urlopen (LOGIN_KEY_URL ). read () key = LOGIN_KEY_RE.search (_ temp ). group (1) return key def login (self): "logon" 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 () # logon failed if "errno" in result: raise LoginError ("logon failed, please check username or password") print "User % s login successful! "% Self. username return 'OK' def get_friends_list (self): "get all friends list" "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 friends" % (len (friends)-1) return friends def send_messages_to_all (self, message = ''): "send messages to all friends" friends = self. get_friends_list () send_params = {'attachment _ cancel': '', 'attachment _ forwarding ':'', 'attachment _ random': '', 'code ':'', 'content': message, 'forward _ thread': '', 'rcode':'', 'service': '0', 'texttype': 'HTML ', 'ukids ':",". 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): "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 (xxtea. py) of the xxtea algorithm used 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')