网站调用新浪微博内容(之前写过调用新浪微博api的教程,如何自动登录新浪获取code)
优采云 发布时间: 2022-01-17 10:20网站调用新浪微博内容(之前写过调用新浪微博api的教程,如何自动登录新浪获取code)
之前写过一个调用新浪微博api的教程,包括如何使用python登录新浪并获取调用api所需的代码。在此处粘贴此段落:
自动获取code值是为了解决授权界面后如何登录的问题。这个问题困扰了我很久。
一开始我是第一次手动登录,然后直接用chrome查看发送的请求,复制cookies,每次直接发送get请求获取回调页面获取code值,如下:
get_code_url=requests.get(url,cookies=cook).url
code=get_code_url.url[47:]
说实话,这种方法很方便。新浪登录方法太多不用分析,但是当api调用次数有限的时候,这个方法就行不通了。
当一个应用的调用api受限时,我们可以创建多个新浪账号和多个应用,并获取多个App key和App Secrets进行重复调用。这样就必须解决如何自动登录新浪获取代码的问题。
首先我们要分析一下新浪微博的登录流程。我无法用 chrome、edge、ie 或 fiddler4 完全捕获完整的登录过程。最后,我尝试了firefox,成功捕获了整个登录过程。
虽然只输入了一次账号密码,但是发送了两次post请求
让我们一一分析每个请求:
base64加密后的用户名,后面会讲怎么实现,随便改,大家都知道是什么意思)
请求成功后,服务器会返回一条信息给我们,后面会用到
sinaSSOController.preloginCallBack({ “RETCODE”:0 “servertime”:1450667800, “PCID”: “GZ-fee1d39aaf203ccc63dc783a13ccce11413a”, “随机数”: “1HRSQP”, “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”, “rsakv”: “1330428213” ,"is_openlock":0,"showpin":0,"exectime":18})
servertime、nonce、pubket和rsakv的值是我们后面需要的,需要解析出来:
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]
然后我们看第二个post请求
第二个请求向新浪通发送表单
其中servertime、nonce、pubket和rsakv是我们上次get请求中得到的,su是加密的账号,sp是加密的密码
su的加密方式是base64。先安装一个base64库,然后调用如下函数:
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库
发送此请求后,服务器会返回一个 JSON 数据,其中一个是我们稍后使用的票证
请求和获取票证的代码如下:
postPara = {
'entry': 'openapi',
'gateway': '1',
'from':'',
'savestate': '0',
'userticket': '1',
'pagerefer':'',
'ct': '1800',
's':'1',
'vsnf': '1',
'vsnval': '',
'door':'',
'a*敏*感*词*ey':'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]
然后是第三个请求
第三个请求依然是post请求,请求第三方授权出错,html代码中直接给出这个表单的内容
其中client_id是我们的APP_KEY;redirect_url 是我们的回调页面,在我们第一次构建应用的时候就设置好了;不知道regCallback是从哪里来的,但是有两个变量,一个是APP_KEY,一个是我们设置的Callback page;其他表单内容是固定的。请求代码如下:
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,
'a*敏*感*词*ey62': '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值。