Maison  >  Questions et réponses  >  le corps du texte

problème de connexion et de connexion au site Web Python

Problème : une fois que Python s'est connecté avec succès, il vous indique que vous n'êtes pas connecté lorsque vous vous connectez, ce qui signifie que des cookies sont manquants

J'ai découvert grâce à la capture de paquets Fidder que, par rapport au succès de la connexion manuelle, le package envoyé par Python manque de cookies. Vous trouverez ci-dessous le code, mais j'ai trouvé qu'en utilisant la méthode opener, python enregistrera le cookie pour un accès ultérieur

.
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 Il y a quelques jours751

répondre à tous(3)je répondrai

  • PHPz

    PHPz2017-05-18 11:01:42

    La raison pour laquelle les cookies manquent est la suivante

    Après avoir envoyé une demande de connexion à http://account.oneplus.cn/one...
    Les données renvoyées sont comme ceci
    {u'defaultData' : None, u'errCode' : u'11025', u'ret ' : u'1', u'data' : {u'jumpUrl' : Aucun, u'isCartMerge' : u'false', u'bbscookie' : u'http://www.oneplusbbs.com/set.. ', u'times' : u'0'}, u'page' : Aucun, u'errMsg' : Aucun}
    L'hôte n'a pas renvoyé la demande setsocookie, bbscookie

    La raison pour laquelle la connexion a échoué est que la connexion est une demande de publication et que l'auteur a utilisé get

    Ce qui suit est mon code après la pratique, pour référence seulement

    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)
    

    répondre
    0
  • PHP中文网

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

    Essayez d'utiliser le module de requêtes, cette API est très pratique.
    demandes

    répondre
    0
  • 阿神

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

    account.oneplus.cn et www.oneplus.cn devraient être inter-domaines

    répondre
    0
  • Annulerrépondre