百度貼吧驗證碼識別研究小記

來源:互聯網
上載者:User

 

在“驗證碼破解實戰一例”中提到曾搗鼓過百度貼吧的驗證碼,不過分割始終做不好,最近整理了下,記在這裡吧。

 

 

效果示範程式下載:TiebaCode.rar

 

 

效果:

 

 

 

 

 

由於分割工作做的不好,示範程式識別過程中有時會多次重新整理驗證碼以達到較好的分割效果。

 

 

另外,之前搗鼓這的時候也順便折騰了下使用python類比百度貼吧發帖,不過一直沒能成功,在此給出類比發帖的原始碼,還望高手看到後能指點指點。

 

#coding=utf8<br />import urllib<br />import urllib2<br />import cookielib<br />import re<br />import time<br />import random</p><p>headers = [('User-Agent' ,'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1')]<br />ck = cookielib.CookieJar()<br />opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ck))<br />opener.addheaders = headers<br />urllib2.install_opener(opener)</p><p>try:<br /> tiebastr = 'abcd'<br /> tiebaurl = 'http://tieba.baidu.com/f?kw='+tiebastr<br /> content = opener.open(tiebaurl).read()</p><p> rs1 = '0'<br /> rs10 = '1'<br /> tn = 'antiAnswerJson'<br /> word = 'abcd'<br /> cm = '59201'<br /> pattern = r'//f/?ct=(/d+)&cm='<br /> regexp = re.compile(pattern)<br /> ct = regexp.findall(content)[0]<br /> pattern = r'<input type="hidden" name="lm" id="lm" value="([^"]*)"'<br /> regexp = re.compile(pattern)<br /> lm = regexp.findall(content)[0]<br /> pattern = r'<input type="hidden" name="str3" id="str3" value="([^"]*)"'<br /> regexp = re.compile(pattern)<br /> str3 = regexp.findall(content)[0]<br /> pattern = r'<input type="hidden" name="str4" id="str4" value="([^"]*)"'<br /> regexp = re.compile(pattern)<br /> str4 = regexp.findall(content)[0]</p><p> jsonVcode_url = 'http://tieba.baidu.com/f?ct='+ct+'&cm='+cm+'&tn=antiAnswerJson&rs1='+rs1+'&rs10='+rs10+'&lm='+lm+'&word='+word<br /> print jsonVcode_url</p><p> pattern = r'<input type="hidden" name="ct" id="ct" value="([^"]*)"'<br /> regexp = re.compile(pattern)<br /> ct = regexp.findall(content)[0]</p><p> content = opener.open(jsonVcode_url).read()<br /> pattern = r'vcodeUrl:"([^"]+)"'<br /> regexp = re.compile(pattern)<br /> vcodeurl = regexp.findall(content)[0]</p><p> vcodeurl = vcodeurl #+ '&t='+str(random.random())<br /> print vcodeurl<br /> content = opener.open(vcodeurl).read()<br /> pattern = r'nbdSignStr:"([^"]+)"'<br /> regexp = re.compile(pattern)</p><p> signstr = regexp.findall(content)[0]</p><p> imgurl = 'http://verify.baidu.com/cgi-bin/genimg?'+signstr #+ '&t='+str(random.random())<br /> response = opener.open(imgurl)<br /> imagedata = response.read()<br /> f=open('code.jpeg', 'wb')<br /> f.write(imagedata)<br /> f.close()</p><p> z = '0'<br /> sc = '0'<br /> cm = '0'<br /> rs = '0'<br /> bs = signstr<br /> str2 = '0'<br /> rs3 = '0'<br /> str1 = ''<br /> rs4 = '1'<br /> code = '1'<br /> rs14 = '0'<br /> ti = 'test'<br /> add_post_submit = ' 發 表 '<br /> co = 'rt'<br /> word1 = raw_input('/ninput verify code:')<br /> post = {'ct':ct, 'tn':'ajaxThreadSubmit', 'word':word, 'lm':lm, 'z':z, 'sc':sc, 'cm':cm, 'rs':rs, 'bs':bs,<br /> 'str2':str2, 'rs3':rs3, 'str3':str3, 'str4':str4, 'str1':str1, 'rs4':rs4, 'code':code, 'rs14':rs14,<br /> 'ti':ti, 'word1':word1, 'co':co, 'add_post_submit':add_post_submit}<br /># postbody = 'ct='+ct+'&tn=ajaxThreadSubmit&word=abc&lm='+lm+'&z=0&sc=0&cm=0&rs=0&bs='+bs+'&str2='+str2+'&rs3='+rs3+'&str3='+str3+'&str4='+str4+'&str1='+str1+'&rs4='+rs4+'&code='+code+'&rs14='+rs14+'&ti='+ti+'&word1='+word1+'&co='+co+'&add_post_submit='+add_post_submit<br /> posturl = 'http://tieba.baidu.com/f'<br /> print urllib.urlencode(post).replace('+', '%20')</p><p> reponse = opener.open(posturl, urllib.urlencode(post).replace('+', '%20'))<br /> rep = reponse.read()<br /> f=open('1.html', 'w')<br /> f.write(rep)<br /> f.close()</p><p>except Exception, e:<br /> pass<br />

 

 

 

之所以沒能類比成功,自己琢磨著還是驗證碼擷取那部分有問題,程式最後會返回貼吧驗證發帖的js代碼,如下

 

 

{<br />resultNo : 308,<br /> fid : '0',<br /> tid : '0',<br /> vid : '',<br /> sign : '62fa552949d7e546b334a405d7edd2ed',<br />bdauditreason : 0,<br />bdQueryWordEnc : "abcd",<br />isNeedWaitForCheck : function(){<br />var need = false;<br />switch(this.resultNo){<br />case 9:<br />case 20:<br />case 23:<br />need = true;<br />break;<br />default:<br />break;<br />}<br />return need;<br />},<br />Action_FocusTitle : "focusTitle"<br />,<br />Action_FocusContent : "focusContent"<br />,<br />Action_ClearYZM : "clearYZM"<br />,<br />Action_FocusUrl : "focusUrl"<br />,<br />Action_GoToHead : "goToHead"<br />,<br />Action_FlushAndGoToHead : "flushAndGoToHead"<br />,</p><p>getActionType : function(){</p><p>var type = "";<br />switch(this.resultNo){<br />case 10:<br />case 14:<br />case 501:<br />case 15:<br />case 36:<br />case 41:<br />case 42:<br />case 43:<br />case 46:<br />type = this.Action_FocusContent;<br />break;<br />case 11:<br />case 20:<br />type = this.Action_FocusTitle;<br />break;<br />case 17:<br />case 0:<br />type = this.Action_FlushAndGoToHead;<br />break;<br />case 22:<br />case 9:<br />case 23:<br />case 119:<br />case 44:<br />case 100:<br />case 703:<br />case 704:<br />case 705:<br />type = this.Action_GoToHead;<br />break;<br />case 38:<br />case 39:<br />case 40:<br />type = this.Action_ClearYZM;<br />break;<br />case 1120:<br />case 1121:<br />type = this.Action_FocusUrl;<br />break;</p><p>default:<br />break;<br />}<br />return type;<br />}<br />,<br />getMessage : function(){<br />var message = "";<br />if(this.resultNo>=901&&this.resultNo<=950){<br />return "";<br />}<br />switch(this.resultNo){</p><p>case 10:</p><p>message = "貼子內容包含太少的文字";<br />break;</p><p>case 11:</p><p>message = "貼子標題和內容太長";<br />break;</p><p>case 12:</p><p>message = "您的帳號由於違規操作而被封,目前無許可權進行該操作。";<br />break;</p><p>case 13:</p><p>message = "您的網路地址由於非法操作被封";<br />break;</p><p>case 14:</p><p>message = "您發布的貼子已經存在";<br />break;</p><p>case 501:</p><p>case 15:</p><p>message = "請不要發表含有不適當內容的留言<br>請不要發表廣告貼";<br />break;</p><p>case 16:</p><p>message = "對不起,您所輸入的貼吧不存在。由於系統升級維護,建立貼吧功能暫停,希望得到您的諒解!";<br />break;</p><p>case 19:</p><p>case 200:</p><p>case 201:</p><p>case 202:</p><p>message = "您的使用者名稱或者密碼填寫有誤,請確認後再發表";<br />break;</p><p>case 20:</p><p>message = "您發表的貼子的標題包含太少的文字,請修改後再發表";<br />break;</p><p>case 17:</p><p>message = "本吧當前只能瀏覽,不能發貼!";<br />break;</p><p>case 18:</p><p>case 21:<br />message = "其他未知原因";<br />break;</p><p>case 22:<br />message = "您發表的貼子已經成功提交,由於特殊原因我們需要核實該貼內容是否含有不良資訊,我們會在10分鐘內確認,請您耐心等待!";<br />break;</p><p>case 9:<br />message = this.getCheckMessage(this.bdauditreason);<br />break;</p><p>case 33: </p><p>message = "您發貼速度太快了。為了減少惡意灌水和廣告貼,系統對匿名發貼進行嚴格的控制,登入使用者不受影響";</p><p> break;</p><p>case 34: </p><p>message = "您發貼速度太快了。為了減少惡意灌水和廣告帖,系統對匿名發貼進行嚴格的控制,登入使用者不受影響";</p><p> break;</p><p>case 35: </p><p>message = "您發貼速度太快了。為了減少惡意灌水和廣告貼,系統對匿名發貼進行嚴格的控制,登入使用者不受影響";</p><p> break;</p><p>case 36: </p><p> message = "請不要發廣告貼!";</p><p> break;</p><p>case 37: </p><p> message = "您已嘗試提交多次了,請返回後重新整理頁面,方可重新發貼";</p><p> break;</p><p>case 38: </p><p> message = "驗證碼逾時,請重新輸入";</p><p> break;</p><p>case 39: </p><p> message = "由於您多次輸錯驗證碼,請您返回後重新整理頁面,方可重新發貼";</p><p> break;</p><p>case 40: </p><p> message = "驗證碼輸入錯誤,請您返回後重新輸入";</p><p> break;</p><p>case 41: </p><p> message = "您的貼子可能包含不合適的內容,請您確定後再提交";</p><p> break;</p><p>case 42: </p><p> message = "您的發貼行為被系統認為有發廣告嫌疑,請您稍後再發";</p><p> break;</p><p>case 43: </p><p> message = "您的發貼行為或貼子內容有廣告或不合適的特徵,請您確定後再發送";</p><p> break;</p><p>case 23: </p><p> message = "您的貼子已經成功提交,但需要系統審核通過後才能建立貼吧";</p><p> break;</p><p>case 119: </p><p> message = "對不起,本主題的回複數已經達到上限,感謝您的參與,歡迎您瀏覽本吧的其它主題";</p><p> break;</p><p>case 1120: </p><p> message = "抱歉,您輸入的圖片、視頻連結地址錯誤,您可以點擊<a href="http://www.baidu.com/search/post_img.html" mce_href="http://www.baidu.com/search/post_img.html" target='_blank'>查看相關協助</a>或返回修改";</p><p> break;</p><p>case 1121: </p><p> message = "抱歉,視頻服務升級中,您暫時無法發錶帶有視頻的貼子,給您帶來的不便請原諒";</p><p> break; </p><p>case 44: </p><p> message = "對不起,本吧暫時限制部分使用者發表主題貼子,您可以瀏覽或回複本吧其它內容,給您帶來不便希望得到您的諒解。";</p><p> break;</p><p>case 100: </p><p>message = "對不起,本吧暫時限制部分使用者使用完整的貼吧功能,您可以瀏覽本吧其它內容,給您帶來不便希望得到您的諒解。";</p><p>break;</p><p>//會員二期新加</p><p>case 701:</p><p>message = "為了減少惡意灌水和廣告帖,本吧不允許未登入使用者發貼,登入使用者不受影響,給您帶來的不便深表歉意";</p><p>break;</p><p>case 702:</p><p>message = "為了減少惡意灌水和廣告帖,本吧限制部分使用者發貼,給您帶來的不便深表歉意";</p><p>break;</p><p>case 703:<br />message = "為了減少惡意灌水和廣告帖,本吧被設定為僅本吧會員才能發貼,給您帶來的不便深表歉意。<a href="/f?kw=" + this.bdQueryWordEnc + "#1" mce_href="f?kw=" + this.bdQueryWordEnc + "#1" target=_blank>點此申請加入</a>本吧會員";</p><p>break;<br />case 704:</p><p>message = "為了減少惡意灌水和廣告帖,本吧被設定為僅本吧管理團隊才能發貼,給您帶來的不便深表歉意";</p><p>break;</p><p>case 705:</p><p>message = "本吧當前只能瀏覽,不能發貼!";</p><p>break;</p><p>case 706:</p><p>message = "抱歉,本貼暫時無法回複。";</p><p>break;<br />//特殊字元判斷</p><p>case 45:<br />message = "抱歉,您提交的貼吧名稱含特殊字元,目前無法建立,推薦您使用漢字、字母或數字作為貼吧名稱";<br />break;</p><p>case 46:<br />message = "抱歉,您的貼子過長,無法正常提交。建議您精簡或分段後重新提交,謝謝!";<br />break;</p><p>// 富編輯器插視頻圖片隱含錯誤<br />case 800:<br />// errPostVideoUrl<br />break;<br />case 801:<br />// errPostVideoWidth<br />break;<br />case 802:<br />// errPostVideoHeight<br />break;<br />case 803:<br />// errPostImgUrl<br />break;<br />case 804:<br />// errPostImgWidth<br />break;<br />case 805:<br />// errPostImgHeight<br />break;<br />case 806:<br />// errPostVideoAttrNotEnough<br />break;<br />case 807:<br />// errPostImgAttrNotEnough<br />break;<br />case 808:<br />// errPostVideoNumTooMuch<br />break;<br />case 809:<br />// errPostImgNumTooMuch<br />break;<br />case 814:<br />// errPostImgFaceNumTooMuch<br />break;<br />default:<br />message = "未知錯誤";<br />break; </p><p>}</p><p>return message;<br />},<br />getCheckMessage : function(no){<br />var msg = "";</p><p>switch(no) {</p><p>case -61:</p><p>msg = "您的貼子已經成功提交,但為了保證貼子品質,本吧所發的貼子待系統審核通過後才能顯示,請您耐心等待";</p><p>break;</p><p>case -62:</p><p>msg = "您的貼子已經成功提交,但為了保證貼子品質,本吧貼圖的貼子需要審核通過後才能顯示,請您耐心等待";</p><p>break;</p><p> case -74:<br /> case -75:<br /> case -60:</p><p>msg = "您發表的貼子已經成功提交,但系統需要核實該貼子內容是否含有不良資訊,貼子在審核通過後才能顯示,請您耐心等待";</p><p>break;</p><p>case -70:</p><p>msg = "您的貼子已經成功提交,但為了控制廣告貼,需要通過審核後才能發布。登陸署名發貼不受此限制。";</p><p>break;</p><p>case -71:</p><p>msg = "您發表的文章太長了。為了防止灌水,需系統審核後才能顯示,請稍後查看";</p><p>break;</p><p>default:</p><p>msg = "您發表的貼子已經成功提交,但系統需要核實該貼子內容是否含有不良資訊,貼子在審核通過後才能顯示,請您耐心等待";<br />break;</p><p>}<br />return msg;<br />}<br />}

 

成功發帖的resultNo為0,而我的程式的返回結果一直是308,308在上述的js代碼中沒有給出出錯定義,不過我記得之前弄這個的時候一直返回的是38,38給出的出錯原因是驗證碼逾時,我懷疑這個308其實就是38所代表的含義。我曾經對一款百度發貼機發帖過程抓包,其處理驗證碼的部分跟我上面的程式基本沒區別,現在真不知道問題出在哪。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.