Example #1
0
class SinaWeibo(object): 
    def __init__( self ):
	self.WBCLIENT = 'ssologin.js(v1.4.5)'
	self.session = Spider().session


    def encrypt_passwd( self, passwd, pubkey, servertime, nonce):
	key = rsa.PublicKey(int(pubkey, 16), int('10001', 16))
	message = str(servertime) + '\t' + str(nonce) + '\n' + str(passwd)
	passwd = rsa.encrypt(message, key)
	return binascii.b2a_hex(passwd)

    def post_weibo(self, text ):
	data = {
	    'text'      :text,
	    'location'  :'home',
	    'pic_id'    :'',
	    'rank'      :'0',
	    'rankid'    :'',
	    '_surl'     :'',
	    'hottopicid':'',
	    'location'  :'home',
	    'module'    :'stissue',
	    '_t'        :'0',
	}
	ts = long(time.time()*1000)
	self.session.headers['X-Request-With'] = 'XMLHttpRequest'
	resp = self.session.post(
	    'http://weibo.com/aj/mblog/add?_wv=5&__rnd=%s'%(str(ts)),
	    data=data
	)

	if resp.url.find( 'sorry') != -1:
	    raise Exception('POST BLOG FA, %s'%(resp.url))
	return resp

    def wblogin(self, username, password):
	resp = self.session.get(
	    'http://login.sina.com.cn/sso/prelogin.php?'
	    'entry=sso&callback=sinaSSOController.preloginCallBack&'
	    'su=%s&rsakt=mod&client=%s' %
	    (base64.b64encode(username), self.WBCLIENT)
	)

	pre_login_str = re.match(r'[^{]+({.+?})', resp.content).group(1)

	pre_login = json.loads(pre_login_str)
	data = {
	    'entry': 'weibo',
	    'gateway': 1,
	    'from': '',
	    'savestate': 7,
	    'userticket': 1,
	    'ssosimplelogin': 1,
	    'su': base64.b64encode(urllib.quote(username)),
	    'service': 'miniblog',
	    'servertime': pre_login['servertime'],
	    'nonce': pre_login['nonce'],
	    'vsnf': 1,
	    'vsnval': '',
	    'pwencode': 'rsa2',
	    'sp': self.encrypt_passwd(password, pre_login['pubkey'],
				 pre_login['servertime'], pre_login['nonce']),
	    'rsakv' : pre_login['rsakv'],
	    'encoding': 'UTF-8',
	    'prelt': '115',
	    'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.si'
		   'naSSOController.feedBackUrlCallBack',
	    'returntype': 'META'
	}
	resp = self.session.post(
	    'http://login.sina.com.cn/sso/login.php?client=%s' % self.WBCLIENT,
	    data=data
	)

	login_url = re.search(r'replace\([\"\']([^\'\"]+)[\"\']',
			      resp.content).group(1)
	resp = self.session.get(login_url)
	#pat_to_extract_json_result
	pattern = r'\((.+?)\)'
	#pattern = r'[^{]+({.+?}})'
	login_str = re.search(pattern, resp.content).group(1)
	self.loginResult  = json.loads(login_str)
	#self.session.get( self.loginResult['redirect'])
	resp = self.session.get('http://weibo.com/')

	self.session.headers['Referer'] = resp.url 
	self.session.headers['Origin'] = 'http://weibo.com'
	self.session.headers['Host'] = 'weibo.com'