如何用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所需的代码