用这篇文章来记录一下从头到尾调用新浪api的过程
第一步肯定是要先安装新浪微博的库,安装了pip的同学直接在cmd中执行
pip install weibo
url= APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri =CALLBACK_URL).get_authorize_url()
CALLBACK_URL是在新建一个sina应用的时候就可以设定的,我们一般将它设为如下:
request = client.request_access_token(code, CALLBACK_URL)
access_token = request.access_token
expires_in = request.expires_in
client.set_access_token(access_token, expires_in)
调用api的方式很简单,用授权的client调用即可,api的函数名即是将 新浪api中的名字的斜杠换成双下划线
get_code_url=requests.get(url,cookies=cook).url
code=get_code_url.url[47:]
这方法老实说十分方便,不用分析太多新浪登录的方法,但当我调用api次数受限制之后,这个方法又不管用了
get_arg=requests.get(get_arg_url)
get_arg_content=get_arg.content
get_arg_content_split=get_arg_content.split(',')
servertime=get_arg_content_split[1].split(':')[1]
nonce=get_arg_content_split[3].split(':')[1][1:-1]
pubkey=get_arg_content_split[4].split(':')[1][1:-1]
rsakv=get_arg_content_split[5].split(':')[1][1:-1]
这个get_arg_url就是我上面说的那个请求url
su=base64.encodestring(username)[:-1]
密码的加密方式要稍微复杂一点,还要用到servertime、nonce、
pubket和rsakv:
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password)
sp = rsa.encrypt(message, key) #加密
sp = binascii.b2a_hex(sp) #将加密信息转换为16进制。
密码的加密需要用到binascii库和rsa库
postPara = {
'entry': 'openapi',
'gateway': '1',
'from':'',
'savestate': '0',
'userticket': '1',
'pagerefer':'',
'ct': '1800',
's':'1',
'vsnf': '1',
'vsnval': '',
'door':'',
'appkey':'52laFx',
'su': su,
'service': 'miniblog',
'servertime': servertime,
'nonce': nonce,
'pwencode': 'rsa2',
'rsakv' : rsakv,
'sp': sp,
'sr':'1920*1080',
'encoding': 'UTF-8',
'cdult':'2',
'domain':'weibo.com',
'prelt':'2140',
'returntype': 'TEXT',
}
get_ticket_url='https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1450667802929'
req=requests.post(get_ticket_url,postPara)
print req.content
ticket=req.content.split(',')[1].split(':')[1][1:-1]
fields={
'action': 'login',
'display': 'default',
'withOfficalFlag': '0',
'quick_auth': 'null',
'withOfficalAccount': '',
'scope': '',
'ticket': ticket,
'isLoginSina': '',
'response_type': 'code',
'regCallback': 'https://api.weibo.com/2/oauth2/authorize?client_id='+APP_KEY+'&response_type=code&display=default&redirect_uri='+CALLBACK_URL+'&from=&with_cookie=',
'redirect_uri':CALLBACK_URL,
'client_id':APP_KEY,
'appkey62': '52laFx',
'state': '',
'verifyToken': 'null',
'from': '',
'switchLogin':'0',
'userId':'',
'passwd':''
}
headers = {
"User-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0",
"Referer": url,
"Content-Type": "application/x-www-form-urlencoded"}
post_url='https://api.weibo.com/oauth2/authorize'
get_code_url=requests.post(post_url,data=fields,headers=headers)
最后在从响应成功的get_code_url将code值分析出来即可
code=get_code_url.url[47:]
这样我们就成功自动的获取了code值