首先是weiboLogin.py文件,实现一个类。
1 #! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import sys 5 import urllib 6 import urllib2 7 import cookielib 8 import base64 9 import re 10 import json 11 import hashlib 12 import rsa 13 import binascii 14 15 class weiboLogin: 16 cj = cookielib.LWPCookieJar() 17 cookie_support = urllib2.HTTPCookieProcessor(cj) 18 opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) 19 urllib2.install_opener(opener) 20 postdata = { 21 ‘entry‘: ‘weibo‘, 22 ‘gateway‘: ‘1‘, 23 ‘from‘: ‘‘, 24 ‘savestate‘: ‘7‘, 25 ‘userticket‘: ‘1‘, 26 ‘ssosimplelogin‘: ‘1‘, 27 ‘vsnf‘: ‘1‘, 28 ‘vsnval‘: ‘‘, 29 ‘su‘: ‘‘, 30 ‘service‘: ‘miniblog‘, 31 ‘servertime‘: ‘‘, 32 ‘nonce‘: ‘‘, 33 ‘pwencode‘: ‘rsa2‘, 34 ‘sp‘: ‘‘, 35 ‘encoding‘: ‘UTF-8‘, 36 ‘prelt‘: ‘115‘, 37 ‘rsakv‘: ‘‘, 38 ‘url‘: ‘http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack‘, 39 ‘returntype‘: ‘META‘ 40 } 41 42 def get_servertime(self,username): 43 url = ‘http://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)‘ % username 44 data = urllib2.urlopen(url).read() 45 p = re.compile(‘\((.*)\)‘) 46 try: 47 json_data = p.search(data).group(1) 48 data = json.loads(json_data) 49 servertime = str(data[‘servertime‘]) 50 nonce = data[‘nonce‘] 51 pubkey = data[‘pubkey‘] 52 rsakv = data[‘rsakv‘] 53 return servertime, nonce, pubkey, rsakv 54 except: 55 print ‘Get severtime error!‘ 56 return None 57 58 def get_pwd(self, password, servertime, nonce, pubkey): 59 rsaPublickey = int(pubkey, 16) 60 key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥 61 message = str(servertime) + ‘\t‘ + str(nonce) + ‘\n‘ + str(password) #拼接明文js加密文件中得到 62 passwd = rsa.encrypt(message, key) #加密 63 passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。 64 return passwd 65 66 def get_user(self, username): 67 username_ = urllib.quote(username) 68 username = base64.encodestring(username_)[:-1] 69 return username 70 def get_account(self,filename): 71 f=file(filename) 72 flag = 0 73 for line in f: 74 if flag == 0: 75 username = line.strip() 76 flag +=1 77 else: 78 pwd = line.strip() 79 f.close() 80 return username,pwd 81 def login(self,filename): 82 username,pwd = self.get_account(filename) 83 84 url = ‘http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)‘ 85 try: 86 servertime, nonce, pubkey, rsakv = self.get_servertime(username) 87 print servertime 88 print nonce 89 print pubkey 90 print rsakv 91 except: 92 print ‘get servertime error!‘ 93 return 94 weiboLogin.postdata[‘servertime‘] = servertime 95 weiboLogin.postdata[‘nonce‘] = nonce 96 weiboLogin.postdata[‘rsakv‘] = rsakv 97 weiboLogin.postdata[‘su‘] = self.get_user(username) 98 weiboLogin.postdata[‘sp‘] = self.get_pwd(pwd, servertime, nonce, pubkey) 99 weiboLogin.postdata = urllib.urlencode(weiboLogin.postdata) 100 headers = {‘User-Agent‘:‘Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0 Chrome/20.0.1132.57 Safari/536.11‘} 101 req = urllib2.Request( 102 url = url, 103 data = weiboLogin.postdata, 104 headers = headers 105 ) 106 result = urllib2.urlopen(req) 107 text = result.read() 108 print text 109 p = re.compile(‘location\.replace\(\"(.*)\"\)‘)#此处和之前略有区别,小心! 110 try: 111 login_url = p.search(text).group(1) 112 #print login_url 113 urllib2.urlopen(login_url) 114 print "Login success!" 115 return 1 116 except: 117 print ‘Login error!‘ 118 return 0
然后是main.py文件
1 # -*- coding: utf-8 -*- 2 3 import weiboLogin 4 import urllib 5 import urllib2 6 import time 7 8 filename = ‘./config/account‘#保存微博账号的用户名和密码,第一行为用户名,第二行为密码 9 10 WBLogin = weiboLogin.weiboLogin() 11 if WBLogin.login(filename)==1: 12 print ‘Login success!‘ 13 else: 14 print ‘Login error!‘ 15 exit()
转自 http://blog.csdn.net/monsion/article/details/8656690