Python腳本實現(xiàn)蝦米網(wǎng)簽到功能
本文實例講述了Python腳本實現(xiàn)蝦米網(wǎng)簽到功能的方法。分享給大家供大家參考,具體如下:
概述
這個腳本完成了自動登錄蝦米網(wǎng)、簽到的功能。
大致要用到urllib、urllib2、cookielib這幾個模塊。其實就是用python實現(xiàn)向指定的url去post數(shù)據(jù)。
至于我怎么知道在瀏覽器里面登錄和簽到時瀏覽器都向服務器post了什么數(shù)據(jù)的問題,可以用強大的chrome:F12->Network里面可以看得到。有的服務器登錄成功后會讓客戶端瀏覽器跳轉或者立即刷新一次頁面等等,會把登錄時向服務器post的數(shù)據(jù)刷沒掉,那么就要用到強大的抓包軟件——WireShark來分析。比如用chrome:

然后就可以寫了,構造Request Headers和要Post的Data(就是Chrome里的Form Data),ID和Pwd是明文傳輸,呵呵。
代碼
下面是代碼:
# -*- coding: cp936 -*-
'''''
Created on 2012-11-15
@author: liushuai
'''
import urllib, urllib2, cookielib, sys
class LoginXiami:
login_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4'}
signin_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4', 'X-Requested-With':'XMLHttpRequest', 'Content-Length':0, 'Origin':'http://www.xiami.com', 'Referer':'http://www.xiami.com/'}
email = ''
password = ''
cookie = None
cookieFile = './cookie.dat'
def __init__(self, email, pwd):
self.email = email
self.password = pwd
self.cookie = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
urllib2.install_opener(opener)
def login(self):
postdata = {'email':self.email, 'password':self.password, 'done':'http://www.xiami.com', 'submit':'%E7%99%BB+%E5%BD%95'}
postdata = urllib.urlencode(postdata)
print 'Logining...'
req = urllib2.Request(url='http://www.xiami.com/member/login', data=postdata, headers=self.login_header)
result = urllib2.urlopen(req).read()
self.cookie.save(self.cookieFile)
result = str(result).decode('utf-8').encode('gbk')
if 'Email 或者密碼錯誤' in result:
print 'Login failed due to Email or Password error...'
sys.exit()
else :
print 'Login successfully!'
def signIn(self):
postdata = {}
postdata = urllib.urlencode(postdata)
print 'signing...'
req = urllib2.Request(url='http://www.xiami.com/task/signin', data=postdata, headers=self.signin_header)
result = urllib2.urlopen(req).read()
result = str(result).decode('utf-8').encode('gbk')
self.cookie.save(self.cookieFile)
try:
result = int(result)
except ValueError:
print 'signing failed...'
sys.exit()
except:
print 'signing failed due to unknown reasons ...'
sys.exit()
print 'signing successfully!'
print self.email,'have signed', result, 'days continuously...'
if __name__ == '__main__':
user = LoginXiami('你的登錄郵箱', '你的密碼')
user.login()
user.signIn()
然后運行一下腳本就可以登錄、簽到了。

后記
有的Discuz!論壇據(jù)說是為了防止用戶用網(wǎng)頁之外的途徑向服務器post數(shù)據(jù),服務器在每個用戶每次登錄成功后生成一個叫formhash的值,作為表單的隱藏域返回給客戶端(服務端也有保存)。

客戶端在向服務器post數(shù)據(jù)的時候,這個值會作為表單的一項數(shù)據(jù)“神不知鬼不覺”(因為是表單的隱藏域)地一同post過去,服務端收到客戶端的post請求后,和服務端的formhash值作對比,就能知道是否是通過瀏覽器頁面的方式post的數(shù)據(jù)了。
不過如果真的是為了防止這,這個做法真的有用嗎?我試了一下,只需用簡單的正則分析下登錄成功返回的html,找到formhash值,再用上述方法和理論post過去即可,成功的完成了簽到的功能。
反正不管怎么說,就是用腳本“假裝”地完成了一下用瀏覽器登錄并簽到的過程。
附:由于網(wǎng)站可能進行改版或升級,那么向服務器中post的數(shù)據(jù)可能會有變化,那么就要對代碼進行相應調(diào)整,故代碼僅供研究和學習參考之用。
更多關于Python相關內(nèi)容感興趣的讀者可查看本站專題:《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
相關文章
pycharm開發(fā)一個簡單界面和通用mvc模板(操作方法圖解)
這篇文章主要介紹了pycharm開發(fā)最簡單的界面和通用mvc模板的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
一次性徹底講透Python中pd.concat與pd.merge
本文主要介紹了一次性徹底講透Python中pd.concat與pd.merge,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06

