注意:本示例僅供學習參考~
出於某種原因,明文資訊通過自定義字型進行渲染,達到混淆目的。
舉個例子:
網頁原始碼在正常字型的渲染下,瀏覽者看到的是123這 3 個數字。
如果建立一種自定義字型,把1渲染成5,那麼瀏覽者看到的便是523這 3 個數字。
這樣便達到混淆資訊的效果,常見於對付爬蟲之類的自動化工具。
中找到),儲存成a.ttf檔案。
安裝以下依賴專案
tesseract 4.0 及以上版本,以及簡體中文(chi_sim)和英文(eng)資料檔案。
python tesserocr 最新原始碼(github)版本。
python fonttools 庫。
python pillow 庫。
執行以下**
# -*- coding: utf-8 -*-
本例採用 tesseract ocr 引擎,根據字型檔案自動生成密文與明文的字元對映表,實現解密功能。
@author: 李毅
'''from tesserocr import pytessbaseapi, psm
from pil import image, imagedraw, imagefont
from fonttools.ttlib import ttfont
import string
class ocr(object):
default_config =
def __init__(self, config={}):
c = dict(self.default_config)
c.update(config)
self.api = pytessbaseapi(path=c['data_path'], lang=c['lang'], psm=psm.single_char)
self.img = image.new('rgb', c['image_size'], color='white')
self.draw = imagedraw.draw(self.img)
self.font = imagefont.truetype(c['font'], size=c['font_size'])
self.text_offset = c['text_offset']
if c['white_list']:
self.api.setvariable('tessedit_char_whitelist', c['white_list'])
if c['black_list']:
self.api.setvariable('tessedit_char_blacklist', c['black_list'])
self.font_tool = ttfont(c['font'])
self.empty_char = self._predict_empty_char()
def _predict_empty_char(self):
self.api.setimage(self.img)
return self.api.getutf8text().strip()
def is_char_in_font(self, char):
for t in self.font_tool['cmap'].tables:
if t.isunicode():
if ord(char) in t.cmap:
return true
return false
def predict(self, char):
''' 返回轉換後的字元,或空串'' '''
if not self.is_char_in_font(char):
return char # 若字型無法渲染該字元,則原樣返回。此處可酌情移除。
self.img.paste('white', (0, 0, self.img.size[0], self.img.size[1]))
self.draw.text(self.text_offset, char, fill='black', font=self.font)
self.api.setimage(self.img)
c2 = self.api.getutf8text().strip()
if c2 == self.empty_char:
return '' # 某些字元可能渲染成空白,此時返回空串。
return c2
class decoder(object):
def __init__(self, data_path, font):
self.cache = {} # 快取已知的對映關係。
ocr.default_config.update(dict(data_path=data_path, font=font))
self.ocr_digit = ocr(dict(
lang='eng',
white_list=string.digits,
black_list=string.ascii_letters,
))self.ocr_letter = ocr(dict(
lang='eng',
black_list=string.digits,
white_list=string.ascii_letters,
))self.ocr_other = ocr()
def decode(self, char):
if char not in self.cache:
c2 = self._decode_when_cache_miss(char)
self.cache[char] = c2 or char
return self.cache[char]
def _decode_when_cache_miss(self, char):
ocr = self.ocr_other
if char in string.digits:
ocr = self.ocr_digit
elif char in string.ascii_letters:
ocr = self.ocr_letter
return ocr.predict(char)
if __name__ == '__main__':
s = '''你好,青劃長務, 8175-13-79'''
d = decoder('tessdata/', 'a.ttf')
print(''.join(map(d.decode, s)))
TextView的自定義字型
這裡有兩種實現方法 1 這種實現方法比較簡單。但是只能設定個別的字型,結果可能不是你想要的。winp.settext typeface.default bold winp.settypeface typeface.default bold default bold是系統自帶,當然系統自帶的也有好幾種...
自定義字型的方法
我想有人可能會像我一樣,嘗試搜尋過各種方法,但都不是太理想,有的是載入不成功,有的則是相容性不好,無奈,自己悶頭研究,終於在今天有了個成果,給大家分享一下。這張很明白的展示了各大瀏覽器對字型的支援情況,其中truetype就是ttf格式,這個字型格式標準的瀏覽器都會支援,只有腦殘的ie不認識,它只相...
測試自動化 自動化測試的定義
相關術語 automated testing test tool,automated testing test suite,automated testing test script等.具體參見 http en.wikipedia.org wiki test automation 推薦書籍 1 軟體...