人人的登录改版后,采用RSA加密后传输密码,该项目用于解决这种情况下人人的模拟登录
使用前先 pip install requests
| #-*-coding:utf-8-*- | |
| # 分段加密 | |
| CHUNK_SIZE = 30 | |
| # RSA加密 | |
| def enctypt(e, m, c): | |
| return pow(c, e, m) | |
| # 加密一段 | |
| def enctyptChunk(e, m, chunk): | |
| chunk = map(ord, chunk) | |
| # 补成偶数长度 | |
| if not len(chunk) % 2 == 0: | |
| chunk.append(0) | |
| nums = [ chunk[i] + (chunk[i+1] << 8) for i in range(0, len(chunk), 2) ] | |
| c = sum([n << i*16 for i, n in enumerate(nums)]) | |
| encypted = enctypt(e, m, c) | |
| # 转成16进制并且去掉开头的0x | |
| return hex(encypted)[2:] | |
| # 加密字符串,如果比较长,则分段加密 | |
| def encryptString(e, m, s): | |
| e, m = int(e, 16), int(m, 16) | |
| chunks = [ s[:CHUNK_SIZE], s[CHUNK_SIZE:] ] if len(s) > CHUNK_SIZE else [s] | |
| result = [enctyptChunk(e, m, chunk) for chunk in chunks] | |
| return ' '.join(result)[:-1] # 去掉最后的'L' | |
| if __name__ == '__main__': | |
| print encyptString('10001', '856381005a1659cb02d13f3837ae6bb0fab86012effb3a41c8b84badce287759', 'abcdef') |
| #-*-coding:utf-8-*- | |
| import requests | |
| import random | |
| import re | |
| from encrypt import encryptString | |
| class RenRen: | |
| def __init__(self): | |
| self.session = requests.Session() | |
| self.token = {} | |
| def loginByCookie(self, cookie_path): | |
| with open(cookie_path) as fp: | |
| cookie_str = fp.read() | |
| cookie_dict = dict([v.split('=', 1) for v in cookie_str.strip().split(';')]) | |
| self.session.cookies = requests.utils.cookiejar_from_dict(cookie_dict) | |
| self.getToken() | |
| def login(self, email, pwd): | |
| key = self.getEncryptKey() | |
| data = { | |
| 'email': email, | |
| 'origURL': 'http://www.renren.com/home', | |
| 'icode': '', | |
| 'domain': 'renren.com', | |
| 'key_id': 1, | |
| 'captcha_type': 'web_login', | |
| 'password': encryptString(key['e'], key['n'], pwd) if key['isEncrypt'] else pwd, | |
| 'rkey': key['rkey'] | |
| } | |
| url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=%f' % random.random() | |
| r = self.post(url, data) | |
| result = r.json() | |
| if result['code']: | |
| print 'login successfully' | |
| r = self.get(result['homeUrl']) | |
| self.getToken(r.text) | |
| else: | |
| print 'login error', r.text | |
| def getEncryptKey(self): | |
| r = requests.get('http://login.renren.com/ajax/getEncryptKey') | |
| return r.json() | |
| def getToken(self, html=''): | |
| p = re.compile("get_check:'(.*)',get_check_x:'(.*)',env") | |
| if not html: | |
| r = self.get('http://www.renren.com') | |
| html = r.text | |
| result = p.search(html) | |
| self.token = { | |
| 'requestToken': result.group(1), | |
| '_rtk': result.group(2) | |
| } | |
| def request(self, url, method, data={}): | |
| if data: | |
| data.update(self.token) | |
| if method == 'get': | |
| return self.session.get(url, data=data) | |
| elif method == 'post': | |
| return self.session.post(url, data=data) | |
| def get(self, url, data={}): | |
| return self.request(url, 'get', data) | |
| def post(self, url, data={}): | |
| return self.request(url, 'post', data) | |
| def getUserInfo(self): | |
| r = self.get('http://notify.renren.com/wpi/getonlinecount.do') | |
| return r.json() | |
| if __name__ == '__main__': | |
| renren = RenRen() | |
| renren.login('email', 'password') | |
| info = renren.getUserInfo() | |
| print 'hello', info['hostname'] |