您的位置:首页技术文章
文章详情页

python网站登录并签到问题

【字号: 日期:2022-07-03 16:39:44浏览:52作者:猪猪

问题描述

问题:python在登录成功后,签到时提示没有登录,也就是缺少cookie

我通过Fidder抓包发现和手动登录成功相比,Python发出去的包缺少cookie下面是代码,但是我查到用opener方式,python会保存cookie进行后继的访问

import urllibfrom http import cookiejarimport gzipdef getOpener(head): cookie = cookiejar.CookieJar() pre = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(pre) header = [] for key, value in head.items():elem = (key, value)header.append(elem) opener.addheaders = header return opener, cookie#伪装浏览器的头部header = { ’Connection’: ’keep-alive’, ’Accept-Language’: ’zh-CN,zh;q=0.8’, ’Accept’: ’application/json, text/javascript, */*; q=0.01’, ’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36’, ’Accept-Encoding’: ’gzip, deflate, br’, ’Host’:’account.oneplus.cn’, ’X-Requested-With’:’XMLHttpRequest’, ’Origin’: ’http://account.oneplus.cn’,}url = ’http://account.oneplus.cn/onepluslogin’opener, cookie = getOpener(header)def ungzip(data): try:# 尝试解压print(’正在解压.....’)data = gzip.decompress(data)print(’解压完毕!’) except:print(’未经压缩, 无需解压’) return data## email = r’***********’password = ’****’postDict = { ’loginName’: email, ’passWord’: password, ’source’: ’2’, ’remember’: ’0’, ’channel’: ’2’, ’verifyCode’: ’’ }postData = urllib.parse.urlencode(postDict).encode()op = opener.open(url, postData)data = op.read()data = ungzip(data)print(data)#--------签到--------------register_url = ’http://www.oneplusbbs.com/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1’re_op = opener.open(register_url)data = op.read()data = ungzip(data)print(data)

问题解答

回答1:

缺少cookie原因是这样的

发了login请求后http://account.oneplus.cn/one...返回数据:是这样的{u’defaultData’: None, u’errCode’: u’11025’, u’ret’: u’1’, u’data’: {u’jumpUrl’: None, u’isCartMerge’: u’false’, u’bbscookie’: u’http://www.oneplusbbs.com/set...’, u’times’: u’0’}, u’page’: None, u’errMsg’: None}楼主没有重新发setsocookie请求,bbscookie

还有签到失败的原因是,签到是post请求,楼主用get了

以下是我实践后的代码,仅供参考

import reimport requestsheader = { ’Connection’: ’keep-alive’, ’Accept-Language’: ’zh-CN,zh;q=0.8’, ’Accept’: ’application/json, text/javascript, */*; q=0.01’, ’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36’, ’Accept-Encoding’: ’gzip, deflate, br’, ’Host’:’account.oneplus.cn’, ’X-Requested-With’:’XMLHttpRequest’, ’Origin’: ’http://account.oneplus.cn’,}url = ’http://account.oneplus.cn/onepluslogin’email = ’邮箱’password = ’密码’postDict = { ’loginName’: email, ’passWord’: password, ’source’: ’2’, ’remember’: ’0’, ’channel’: ’2’, ’verifyCode’: ’’ }session = requests.Session()r = session.post(url, data=postDict)data = r.json()print(data)r = session.get(data[’data’][’bbscookie’])sign_url = ’http://www.oneplusbbs.com/plugin.php?id=dsu_paulsign:sign’r = session.get(sign_url)m = re.search(’name='formhash' value='([^']+)'’, r.text)formhash = m.group(1)print(formhash)qiandao_url = ’http://www.oneplusbbs.com/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1’form = {’formhash’: formhash,’qdxq’:’fd’,’qdmode’:1,’todaysay’:’helloworld’}r = session.post(qiandao_url, data=form)print(r.text)回答2:

你使用 requests 模块试试,这个 API 很方便。requests

回答3:

account.oneplus.cn和www.oneplus.cn,应该是跨域了

标签: Python 编程
相关文章: