Heim  >  Fragen und Antworten  >  Hauptteil

Problem bei der Anmeldung und Anmeldung auf der Python-Website

Problem: Nachdem sich Python erfolgreich angemeldet hat, werden Sie beim Anmelden aufgefordert, nicht angemeldet zu sein, was bedeutet, dass Cookies fehlen

Durch die Fidder-Paketerfassung habe ich festgestellt, dass dem von Python gesendeten Paket im Vergleich zum manuellen Anmeldeerfolg Cookies fehlen. Unten ist der Code, aber ich habe festgestellt, dass Python das Cookie für den späteren Zugriff speichert

import urllib
from http import cookiejar
import gzip

def 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)
天蓬老师天蓬老师2711 Tage vor750

Antworte allen(3)Ich werde antworten

  • PHPz

    PHPz2017-05-18 11:01:42

    缺少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 re
    import requests
    
    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'
    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)
    

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-18 11:01:42

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

    Antwort
    0
  • 阿神

    阿神2017-05-18 11:01:42

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

    Antwort
    0
  • StornierenAntwort