网站调用新浪微博内容(之前写过调用新浪微博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值。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线