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)
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
Essayez d'utiliser le module de requêtes, cette API est très pratique.
demandes
account.oneplus.cn et www.oneplus.cn devraient être inter-domaines