100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > python 模拟登录获取cookie_Python获取新浪微博cookie模拟登录

python 模拟登录获取cookie_Python获取新浪微博cookie模拟登录

时间:2020-09-24 23:42:21

相关推荐

python 模拟登录获取cookie_Python获取新浪微博cookie模拟登录

这次尝试模拟登录微博,获取com网站cookie,cn不可用。

分析网站

首先打开微博登录页面,如果已经登录需要先退出(其他的com登录页应该也是可以的)。

打开chrome调试,查看传输状态。清除记录之后勾选 preserve log,再输入帐号,当输入完帐号鼠标点击空白之后,会触发一个js事件,如上图。打开这个请求网址之后:发现这个json字典数据包含着下一步需要用的登录表单,所以先注意一下,回头再看。

输入密码之后登录,观察数据包。login.php看名字好像就是登录的请求了。 再看看它提交的数据,sp就是密码,su就是帐号。其他的数据怎么得到呢,我们就需要找到它执行的ssologin.js了。

这个包也可以在js中找到,之后打开这个文件会看到一整片没有格式化的js代码,很头疼。可以 查找关键字 rsa2,这一块就是加密代码,很深奥有没有。这一块搞了半天最后还是google出来的.-.-.

OK,到这已经乱了。。。整理一下思路。

我们登录的步骤是:输入帐号 -> 网页返回prelogin,这个里面包含表单信息 -> 网页调用ssologin.js加密数据 -> 提交数据。

我们就需要:获得prelogin数据 -> 用python仿照ssologin.js把数据加密 -> 提交。

上代码

请求prelogin,获取所需参数。用正则表达式截取字典,用eval函数把字符串转换成字典类型,分别获取值。

prelogin_url = r'/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.15)' #noqa

def Prelogin(prelogin_url):

data = requests.get(prelogin_url).content.decode('utf-8')

p = pile('\((.*)\)')

data_str = p.search(data).group(1)

server_data_dict = eval(data_str)

pubkey = server_data_dict['pubkey']

servertime = server_data_dict['servertime']

nonce = server_data_dict['nonce']

rsakv = server_data_dict['rsakv']

return pubkey, servertime, nonce, rsakv

有了上面的数据就可以加密帐号密码了,帐号是由url加密,再用base64加密。密码就比较复杂了,基本按照ssologin.js来。

def RSAEncoder(username, password, pubkey, servertime, nonce):

su_url = urllib.parse.quote_plus(username)

su_encoded = su_url.encode('utf-8')

su = base64.b64encode(su_encoded)

su = su.decode('utf-8')

rsaPublickey = int(pubkey, 16)

e = int('10001', 16)

key = rsa.PublicKey(rsaPublickey, e)

message = str(servertime) + '\t' + str(nonce) + '\n' + str(password)

password = rsa.encrypt(message.encode('utf-8'), key)

sp = binascii.b2a_hex(password)

return su, sp

数据准备好了之后就能填表单了。

def PostData(username, password, pubkey, servertime, nonce, rsakv):

su, sp = RSAEncoder(username, password, pubkey, servertime, nonce)

post_data = {

'encoding': 'UTF-8',

'entry': 'weibo',

'from': '',

'gateway': '1',

'nonce': nonce,

'pagerefer': '',

'prelt': '645',

'pwencode': 'rsa2',

'returntype': 'META',

'rsakv': rsakv,

'savestate': '7',

'servertime': str(servertime),

'service': 'miniblog',

'sp': sp,

'sr': '1920*1080',

'su': su,

'url': '/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', #noqa

'useticket': '1',

'vsnf': '1',

}

return post_data

可以登录了。第一次请求到的网页不是登录成功的页面,而是一个重定向,如图,用正则表达式提取网址,进行访问,成功!

def login(self):

pubkey, servertime, nonce, rsakv = Prelogin(self.prelogin_url)

post_data = PostData(self.username, self.password, pubkey, servertime,

nonce, rsakv)

session = requests.Session()

response = session.post(self.login_url, params=post_data,

headers=self.headers)

text = response.content.decode('gbk')

pa = pile(r'location\.replace\(\'(.*?)\'\)')

redirect_url = pa.search(text).group(1)

response = session.get(redirect_url, headers=self.headers)

print(session.cookies)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。