您的位置:首页 > 编程语言 > Python开发

Python模拟登陆新浪微博并实现投票功能

2013-04-04 20:50 651 查看
#coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib
import time
from django.template.defaultfilters import urlencode

#获取一个保存cookie的对象
cj = cookielib.LWPCookieJar()
#将一个保存cookie对象,和一个HTTP的cookie的处理器绑定
cookie_support = urllib2.HTTPCookieProcessor(cj)
#创建一个opener,将保存了cookie的http处理器,还有设置一个handler用于处理http的URL的打开
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
#将包含了cookie、http处理器、http的handler的资源和urllib2对象板顶在一起
urllib2.install_opener(opener)

postdata = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'userticket': '1',
'ssosimplelogin': '1',
'vsnf': '1',
'vsnval': '',
'su': '',
'service': 'miniblog',
'servertime': '',
'nonce': '',
'pwencode': 'wsse',
'sp': '',
'encoding': 'UTF-8',
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}

def get_servertime():

url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
data = urllib2.urlopen(url).read()
p = re.compile('\((.*)\)')
try:
json_data = p.search(data).group(1)
data = json.loads(json_data)
servertime = str(data['servertime'])
nonce = data['nonce']
return servertime, nonce
except:
print 'Get severtime error!'
return None

def get_pwd(pwd, servertime, nonce):
pwd1 = hashlib.sha1(pwd).hexdigest()
pwd2 = hashlib.sha1(pwd1).hexdigest()
pwd3_ = pwd2 + servertime + nonce
pwd3 = hashlib.sha1(pwd3_).hexdigest()
return pwd3

def get_user(username):
username_ = urllib.quote(username)
username = base64.encodestring(username_)[:-1]
return username

def main():
username = 'www.crazyant.net'#微博账号
pwd = 'xxx'#微博密码
url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)'
try:
servertime, nonce = get_servertime()
except:
return
global postdata
postdata['servertime'] = servertime
postdata['nonce'] = nonce
postdata['su'] = get_user(username)
postdata['sp'] = get_pwd(pwd, servertime, nonce)
postdata = urllib.urlencode(postdata)
headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'
,'Referer':'http://vote.weibo.com/vid=1890981'
}

#到此已经能够使用urllib2请求新浪任何的内容,登陆成功
req  = urllib2.Request(
url = url,
data = postdata,
headers = headers
)
result = urllib2.urlopen(req)
text = result.read()
#print text
p = re.compile('location\.replace\(\'(.*?)\'\)')
try:
login_url = p.search(text).group(1)
print login_url
#print login_url
urllib2.urlopen(login_url)
print "login success"
except:
print 'Login error!'
#测试读取数据,下面的URL,可以换成任意的地址,都能把内容读取下来
#---------------------------------------------------------
#以下为2012年7月25日21新增:
#对一个投票页面进行投票
#---------------------------------------------------------
#首先请求一下投票页面,这样做只是为了该页面会返回cookie,我们要保存cookie
res = urllib2.urlopen('http://vote.weibo.com/vid=1890981')
#分析了投票的流程,需要如下几个参数的值
votedata={
'item':'1',
'share':'1',
'poll_id':'1890981',
'poll_category':'0',
'_t':'0'
}
#原文的那个headers少了一项Referer,结果导致投票不成功,所以这里加上
headers_more = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'
,'Referer':'http://vote.weibo.com/vid=1890981'
}
#把投票的参数的值进行编码,用于urllib2请求的时候附带
votedata = urllib.urlencode(votedata)
#URL、数据、请求HTTP头,我们伪造了一个请求包
req  = urllib2.Request(
url = 'http://vote.weibo.com/poll/joined',
data = votedata,
headers = headers_more
)
#发出请求包,到页面看一看,投票OK
result = urllib2.urlopen(req)
#把返回的内容存下来看看,其实这一步无必要了
text = result.read()
f = open('out.txt','w')
f.write(text)
print 'ok'
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: