人人的登录改版后,采用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'] |