1. 程式人生 > >Python破解12306圖片驗證碼

Python破解12306圖片驗證碼

不知從何時起,12306的登入驗證碼竟然變成了按字找圖,可以說是又提高了一個等次,竟然把影象識別都用上了。不過有些圖片,不得不說有些變態,圖片的清晰圖就更別說了,明顯是從網路上的相簿中搬過來的。


誰知沒多久,網路就驚現破解12306圖片驗證碼的Python程式碼了,作為一個愛玩愛刺激的網蟲,當然要分享一份過來。

程式碼大致流程:

1、將驗證碼圖片下載下來,然後切圖;

2、利用百度識圖進行圖片分析;

3、再利用正則表示式來取出百度識圖的關鍵字,最後輸出。

程式碼:  
 #!/usr/bin/python  
# #  FileName    : fuck12306.py  
# #  Author      : MaoMao Wang <
[email protected]
> # # Created : Mon Mar 16 22:08:41 2015 by ShuYu Wang # # Copyright : Feather (c) 2015 # # Description : fuck fuck 12306 # # Time-stamp: <2015-03-17 10:57:44 andelf> from PIL import Image from PIL import ImageFilter import urllib import urllib2 import re import json # hack CERTIFICATE_VERIFY_FAILED # https://github.com/mtschirs/quizduellapi/issues/2 import ssl if hasattr(ssl, '_create_unverified_context'): ssl._create_default_https_context = ssl._create_unverified_context UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36" pic_url = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.21191171556711197" def get_img(): resp = urllib.urlopen(pic_url) raw = resp.read() with open("./tmp.jpg", 'wb') as fp: fp.write(raw) return Image.open("./tmp.jpg") def get_sub_img(im, x, y): assert 0 <= x <= 3 assert 0 <= y <= 2 WITH = HEIGHT = 68 left = 5 + (67 + 5) * x top = 41 + (67 + 5) * y right = left + 67 bottom = top + 67 return im.crop((left, top, right, bottom)) def baidu_stu_lookup(im): url = "http://stu.baidu.com/n/image?fr=html5&needRawImageUrl=true&id=WU_FILE_0&name=233.png&type=image%2Fpng&lastModifiedDate=Mon+Mar+16+2015+20%3A49%3A11+GMT%2B0800+(CST)&size=" im.save("./query_temp_img.png") raw = open("./query_temp_img.png", 'rb').read() url = url + str(len(raw)) req = urllib2.Request(url, raw, {'Content-Type':'image/png', 'User-Agent':UA}) resp = urllib2.urlopen(req) resp_url = resp.read() # return a pure url url = "http://stu.baidu.com/n/searchpc?queryImageUrl=" + urllib.quote(resp_url) req = urllib2.Request(url, headers={'User-Agent':UA}) resp = urllib2.urlopen(req) html = resp.read() return baidu_stu_html_extract(html) def baidu_stu_html_extract(html): #pattern = re.compile(r'<script type="text/javascript">(.*?)</script>', re.DOTALL | re.MULTILINE) pattern = re.compile(r"keywords:'(.*?)'") matches = pattern.findall(html) if not matches: return '[UNKNOWN]' json_str = matches[0] json_str = json_str.replace('\\x22', '"').replace('\\\\', '\\') #print json_str result = [item['keyword'] for item in json.loads(json_str)] return '|'.join(result) if result else '[UNKNOWN]' def ocr_question_extract(im): #
[email protected]
:madmaze/pytesseract.git global pytesseract try: import pytesseract except: print "[ERROR] pytesseract not installed" return im = im.crop((127, 3, 260, 22)) im = pre_ocr_processing(im) # im.show() return pytesseract.image_to_string(im, lang='chi_sim').strip() def pre_ocr_processing(im): im = im.convert("RGB") width, height = im.size white = im.filter(ImageFilter.BLUR).filter(ImageFilter.MaxFilter(23)) grey = im.convert('L') impix = im.load() whitepix = white.load() greypix = grey.load() for y in range(height): for x in range(width): greypix[x,y] = min(255, max(255 + impix[x,y][0] - whitepix[x,y][0], 255 + impix[x,y][1] - whitepix[x,y][1], 255 + impix[x,y][2] - whitepix[x,y][2])) new_im = grey.copy() binarize(new_im, 150) return new_im def binarize(im, thresh=120): assert 0 < thresh < 255 assert im.mode == 'L' w, h = im.size for y in xrange(0, h): for x in xrange(0, w): if im.getpixel((x,y)) < thresh: im.putpixel((x,y), 0) else: im.putpixel((x,y), 255) if __name__ == '__main__': im = get_img() #im = Image.open("./tmp.jpg") print 'OCR Question:', ocr_question_extract(im) for y in range(2): for x in range(4): im2 = get_sub_img(im, x, y) result = baidu_stu_lookup(im2) print (y,x), result


相關推薦

Python破解12306圖片驗證

不知從何時起,12306的登入驗證碼竟然變成了按字找圖,可以說是又提高了一個等次,竟然把影象識別都用上了。不過有些圖片,不得不說有些變態,圖片的清晰圖就更別說了,明顯是從網路上的相簿中搬過來的。 誰知沒多久,網路就驚現破解12306圖片驗證碼的Python程式碼了,

Python 實現簡單圖片驗證登錄

需要 spa tps dem 圖片背景 round alt word exc 朋友說公司要在測試環境做接口測試,登錄時需要傳入正確的圖片的驗證碼,本著懶省事的原則,推薦他把測試環境的圖片驗證碼寫死,我們公司也是這麽做的^_^。勸說無果/(ㄒoㄒ)/~~,只能通過 OCR 技

python生成隨機圖片驗證

from PIL import Image,ImageDraw,ImageFont,ImageFilter import random import string chars=string.digits+string.ascii_letters chars=random.s

Python爬取圖片驗證

# -*- coding:utf-8 -*-import requestsfrom bs4 import BeautifulSoupheader = {  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWeb

Python OCR識別圖片驗證(一)

歡迎加入學習交流QQ群:657341423 對於某些網站登入的時候,往往需要輸入驗證碼才能實現登入。如果要爬蟲這類網站,往往總會比這個驗證碼導致無法爬取資料。以下介紹一種比較折中的方法,也是比較可行的方法: 實現思想: 1、通過截圖獲取驗證碼圖片,為什麼要截圖

python】帶圖片驗證的登入自動化實戰

近期在跟進新專案的時候,整體的業務線非常之長,會一直重複登入退出不同賬號的這個流程,所以想從登入開始實現部分的自動化。因為是B/S的架構,所以採用的是selenium的框架來實現。大致實現步驟如下:   1.環境準備   2.驗證碼爬取   3.識別方案選擇   4.影象處理和識別   5.自動化實現 一、

python第一百一十八天---ajax--圖片驗證 + Session

console lte 狀態 狀態碼 創建 ins .py 上層 成功 原生AJAX   Ajax主要就是使用 【XmlHttpRequest】對象來完成請求的操作,該對象在主流瀏覽器中均存在(除早起的IE),Ajax首次出現IE5.5中存在(ActiveX控件)。 1、X

Python #圖片驗證

測試 imp ase 使用 color blog pre ati install //測試環境 Python 2.7 安裝 pip install graphic-verification-code 使用 import gvcode img,code=gvcode.

python實現圖片驗證

stat 模塊 app req param div pytho python ram 1 驗證基礎知識1.1 Python生成隨機驗證碼,需要使用PIL模塊. # 安裝 pip3 install pillow 1.2 創建圖片 from PIL import Imag

python獲取圖片驗證

tor bsp mman imp directory roc nic pytho 取圖 一、安裝linux下圖片處理工具: # which tesseract/usr/bin/tesseract 二、安裝python連接模塊: pip install pytesseract

python生成圖片驗證

per ont 字符 ESS ext ttf 隨機 dom ice import PIL from PIL import Image from PIL import ImageDraw,ImageFont import random def get_r

Python 實現識別弱圖片驗證

data- info clas 明顯 standard 滑動驗證 管理工具 named 實驗室 目前,很多網站為了防止爬蟲肆意模擬瀏覽器登錄,采用增加驗證碼的方式來攔截爬蟲。驗證碼的形式有多種,最常見的就是圖片驗證碼。其他驗證碼的形式有音頻驗證碼,滑動驗證碼等。圖片驗證碼

Python 5分鐘搭建OCR伺服器,基本破解簡單的驗證

Why? OCR(又叫光學字元識別)已經成為Python的一個常用工具。隨著開源庫Tesseract和Ocrad的出現,越來越多的程式設計師用OCR來編寫自己的庫檔案和bot病毒。一個OCR的小例子,如用OCR直接從截圖中提取文字,省去了重新鍵入的麻煩。     &

python生成圖片驗證程式碼

from PIL import Image, ImageDraw, ImageFont import random import string #所有可能的字元,主要是英文字母和數字 characters = string.ascii_letters+string.digits #

Qt – 獲取12306動態驗證圖片

Qt – 獲取12306動態驗證碼圖片 本文轉載自:http://beself.top/2018/09/16/qt-get_12306verificationcode/ 背景 經常出行的人就知道買火車票是一件比較困難的事情,特別是節假日,搶票就更加艱難了,搶票的工具起始也

Python生成圖片驗證

用Python生成圖片驗證碼, Python版本:Python3.6 程式碼如下: # -*-coding:utf-8 -*- from PIL import Image, ImageDraw, ImageFont, ImageFilter import random import

隨機數字圖片驗證的原理、生成和破解

驗證碼的功能一般是防止使用程式惡意註冊、暴力破解或批量發帖而設定的。所謂驗證碼,就是將一串隨機產生的數字或符號,生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由使用者肉眼識別其中的驗證碼資訊,輸入表單提交網站驗證,驗證成功後才能使用某項功能。學習驗證碼的破解/識別技術,不僅可以知道驗證碼的原理,而且

python3爬蟲session處理12306火車票動態圖片驗證登入

一、 實現需求 1、 登入12306 使用者名稱與密碼是明碼登入,無需處理 2、 動態圖片驗證碼 是8張動態圖片,圖片很小 可能要選擇圖片中的1—3個不等圖片 3、 查票與購票 要定位到登入url,及要提交的引數 二、 實現原理 1、

python爬蟲實現登陸簡單圖片驗證識別(Tesseract識別)

Tesseract下載與安裝 附:德國曼海姆大學發行的3.05版本下載 安裝與配置PATH環境變數 安裝略,環境變數只要將目錄新增到PATH路徑,PATH路徑針對於命令列解析。 tesseract 1.png output-l eng -psm 7 -ps

python+pyqt實現12306圖片驗證效果

備份一下  思路:在滑鼠點選位置加一個按鈕,然後再按鈕中的點選事件中寫一個關閉事件. #coding:utf-8 from PyQt4.QtGui import * from PyQt4.QtCore import * from push_button import *