problème de connexion et de connexion au site Web Python
天蓬老师
天蓬老师 2017-05-18 10:59:42
0
3
783

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)
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

répondre à tous(3)
PHPzhong

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)
洪涛

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal