python網(wǎng)站登錄并簽到問(wèn)題
問(wèn)題描述
問(wèn)題:python在登錄成功后,簽到時(shí)提示沒(méi)有登錄,也就是缺少cookie
我通過(guò)Fidder抓包發(fā)現(xiàn)和手動(dòng)登錄成功相比,Python發(fā)出去的包缺少cookie下面是代碼,但是我查到用opener方式,python會(huì)保存cookie進(jìn)行后繼的訪問(wèn)
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(’未經(jīng)壓縮, 無(wú)需解壓’) 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)
問(wèn)題解答
回答1:缺少cookie原因是這樣的
發(fā)了login請(qǐng)求后http://account.oneplus.cn/one...返回?cái)?shù)據(jù):是這樣的{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}樓主沒(méi)有重新發(fā)setsocookie請(qǐng)求,bbscookie
還有簽到失敗的原因是,簽到是post請(qǐng)求,樓主用get了
以下是我實(shí)踐后的代碼,僅供參考
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 模塊試試,這個(gè) API 很方便。requests
回答3:account.oneplus.cn和www.oneplus.cn,應(yīng)該是跨域了
相關(guān)文章:
1. python - 為什么match匹配出來(lái)的結(jié)果是<_sre.SRE_Match object; span=(0, 54), match=’’>2. mysql優(yōu)化 - mysql 一張表如果不能確保字段列長(zhǎng)度一致,是不是就不需要用到char。3. Python處理Dict生成json4. mysql updtae追加數(shù)據(jù)sql語(yǔ)句5. python - 請(qǐng)問(wèn)這兩個(gè)地方是為什么呢?6. python - 用os.environ能獲取到的環(huán)境變量,在os.environ.getenv卻得不到,這是為什么?7. javascript - 按鈕鏈接到另一個(gè)網(wǎng)址 怎么通過(guò)百度統(tǒng)計(jì)計(jì)算按鈕的點(diǎn)擊數(shù)量8. python中怎么對(duì)列表以區(qū)間進(jìn)行統(tǒng)計(jì)?9. 請(qǐng)教一個(gè)mysql去重取最新記錄10. 大家都用什么工具管理mysql數(shù)據(jù)庫(kù)?
