如何用python登录新浪获取code值,解决如何自动登录code

优采云 发布时间: 2021-05-16 18:13

  如何用python登录新浪获取code值,解决如何自动登录code

  我之前编写了有关调用新浪微博api的教程,包括如何使用python登录到新浪并获取调用api所需的代码。在此处发布此段:如果要自动获取代码值,则必须解决它。授权界面后如何获取登录问题,这个问题也困扰了我很长时间

  首先,我是第一次手动登录,然后直接使用chrome查看发送的请求,复制其中的cookie,然后每次发送一个get请求以获取回调网页的代码值,如下所示:如下:

  get_code_url=requests.get(url,cookies=cook).url

code=get_code_url.url[47:]

  说实话,此方法非常方便,无需分析太多的Sina登录方法,但是当我调用api的次数有限时,此方法不起作用

  当应用程序的调用api受限制时,我们可以创建多个新浪帐户和多个应用程序,获取多个App密钥和App Secrets以重复调用,因此必须解决如何自动登录新浪获取的问题。代码

  首先,我们需要分析新浪微博的登录过程。我无法完全使用chrome,edge(即fiddler4)捕获完整的登录过程。最后,我尝试使用firefox成功捕获整个登录过程

  

  

  虽然我只输入了一次帐户密码,但我发送了两个帖子请求

  让我们按请求分析它:

  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]

  接下来,让我们看看第二个发帖请求

  第二个请求是将表格发送到新浪通行证

  

  

  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]

  然后是第三个请求

  第三个请求仍然是发布请求,该请求已发送到具有授权错误的第三方。表单的内容直接在html代码中给出。

  

  

  其中client_id是我们的APP_KEY; redirect_url是我们的回调页面,它是在我们首次创建应用程序时设置的;我不知道regCallback的来源,但是有两个变量,一个是APP_KEY,另一个是我们设置的回调页面。其他表格内容是固定的。请求代码如下:

  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=get_code_url.url[47:]

  通过这种方式,我们成功并自动获得了代码值。原创地址:python模拟登录新浪微博并自动获取调用新浪api所需的代码

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线