pytesseract 测试获取查策网编码字体

破解反爬案例:https://blog.csdn.net/qq_42988351/article/details/108797567

import numpy
import pytesseract
from fontTools.ttLib import TTFont
from PIL import Image, ImageDraw, ImageFont


def find_coding(special_coding, cn_code_list, font, count=12):
	"""
	返回其编码和值的对应关系
	"""
	im = Image.new("RGB", (1800, 1000), (255, 255, 255))
	# 就叫白色画板吧
	dr = ImageDraw.Draw(im)
	# 根据count分组:将列表切分成N份,以便于在图片上分行显示
	array_list = numpy.array_split(cn_code_list, count)
	for t in range(count):
		newList = [i.replace("uni", "\\u") for i in array_list[t]]
		text = (" ".join(newList)).encode('utf-8').decode('unicode_escape')
		dr.text((70, 70 * (t + 1)), text, font=font, fill="#000000")
		''''
		查看全部编码:把后面的代码注释就知道一些特殊的编码了
		1.打开百度字体编辑器:http://fontstore.baidu.com/static/editor/index.html
		2.选择woff字体预览
		3.得到对应的特殊编码
		print(text)
		'''
	# im.save("1.jpg")
	# im = Image.open("1.jpg")  # 可以将图片保存到本地,以便于手动打开图片查看
	# 识别中文
	chinese_str = pytesseract.image_to_string(im, lang="chi_sim")
	# OCR识别出来的字符串有空格换行符
	chinese_str = chinese_str.replace(" ", "").replace("\n", "")
	# 查到对应的中文单词匹配字典
	chinese_coding = dict(zip([i for i in cn_code_list], list(chinese_str)))
	# 返回对应编码的字典
	return dict(special_coding, **chinese_coding)


def test():
	all_coding = {'!': '&', '#': '>', '$': 'c', '%': '~', '&': 'H', '(': 'q', ')': 'S', '*': '#', '+': '(', '/': '±',
				  '1': '2', '2': '1', '3': '6', '4': '9', '5': '8', '6': '3', '7': '4', '8': '7', '9': '5', '<': ')',
				  '=': 'R', '>': '/', '?': 'G', '@': 'h', 'A': 'u', 'B': 'd', 'C': 'v', 'D': 'Q', 'E': 'i', 'F': 'B',
				  'G': '&', 'H': 'n', 'I': 'p', 'J': 'I', 'K': 'L', 'L': '%', 'M': '@', 'N': 'Y', 'O': '_', 'P': '^',
				  'Q': 'l', 'R': 'a', 'S': 'P', 'T': 't', 'U': 'U', 'V': 'A', 'W': 'M', 'X': 'D', 'Y': 'z', 'Z': 'w',
				  '^': 'E', '_': 'g', 'a': 'r', 'b': '=', 'c': 'j', 'd': 'V', 'e': 'N', 'f': 'T', 'g': 'C', 'h': '!',
				  'i': 's', 'j': '|', 'k': 'F', 'l': 'b', 'm': 'y', 'n': '?', 'o': 'f', 'p': 'Z', 'q': '<', 'r': 'o',
				  's': 'm', 't': 'W', 'u': 'O', 'v': 'J', 'w': 'e', 'x': 'k', 'y': 'K', 'z': '+', '|': 'x', '~': '*',
				  '±': 'X', '〇': '院', '一': '北', '丁': '一', '七': '授', '万': '括', '三': '并', '下': '费', '不': '步', '与': '阳',
				  '专': '种', '丙': '行', '业': 'O', '东': '书', '个': '五', '中': '三', '为': '合', '主': '商', '乙': '建', '九': '询',
				  '也': '位', '乡': '订', '书': '需', '予': '须', '事': '来', '二': '机', '云': '环', '互': '评', '五': '重', '产': '集',
				  '京': '事', '人': '经', '亿': '南', '从': '快', '件': '首', '任': '名', '份': '物', '企': '值', '优': '字', '会': '格',
				  '位': '百', '体': '镇', '保': '从', '信': '月', '值': '目', '元': '导', '先': '效', '光': '才', '免': '罪', '全': '准',
				  '八': '精', '公': '乡', '六': '展', '册': '企', '再': '贴', '准': '变', '列': '理', '刘': '厂', '创': '东', '利': '王',
				  '别': '易', '制': '纸', '务': '辖', '助': '州', '励': '围', '包': '据', '北': '升', '区': '包', '十': '点', '千': '街',
				  '升': '息', '华': '证', '单': '先', '南': '路', '厂': '限', '厅': '水', '原': '份', '县': '量', '及': '民', '发': '子',
				  '受': '间', '变': '受', '号': '予', '司': '活', '合': '请', '名': '互', '员': '大', '商': '地', '四': '已', '因': '查',
				  '园': '会', '围': '拆', '国': '计', '图': '的', '地': '改', '圳': '技', '型': '施', '城': '列', '域': '全', '基': '阅',
				  '处': '政', '备': '安', '复': '助', '大': '公', '天': '或', '奖': '单', '委': '产', '子': '秀', '字': '京', '学': '圳',
				  '安': '河', '家': '丙', '导': '研', '小': '规', '局': '明', '展': '类', '属': '务', '山': '基', '州': '所', '工': '有',
				  '已': '革', '币': '码', '市': '西', '年': '获', '并': '年', '广': '督', '度': '火', '座': '运', '建': '华', '张': '科',
				  '当': '等', '得': '李', '微': '验', '心': '造', '快': '件', '总': '高', '息': '除', '或': '维', '所': '程', '才': '知',
				  '扶': '设', '批': '型', '技': '广', '报': '收', '拆': '因', '括': '股', '持': '专', '据': '术', '授': '符', '措': '号',
				  '提': '得', '收': '额', '改': '励', '政': '海', '效': '门', '数': '部', '文': '学', '新': '区', '施': '园', '日': '给',
				  '时': '过', '明': '第', '易': '监', '更': '当', '月': '厅', '有': '究', '服': '济', '未': '错', '术': '持', '机': '服',
				  '李': '微', '条': '域', '来': '扶', '查': '龙', '标': '创', '栋': '注', '格': '小', '步': '备', '民': '通', '水': '能',
				  '河': '个', '法': '条', '注': '刘', '活': '处', '济': '座', '海': '未', '深': '原', '湖': '四', '源': '日', '火': '册',
				  '点': '二', '物': '为', '犯': '电', '王': '时', '环': '体', '理': '张', '甲': '云', '申': '复', '电': '度', '百': '质',
				  '的': '山', '监': '任', '目': '管', '省': '批', '督': '下', '知': '标', '码': '金', '研': '还', '秀': '员', '种': '优',
				  '科': '提', '积': '深', '称': '及', '程': '配', '究': '与', '立': '范', '符': '栋', '第': '业', '等': '进', '策': '心',
				  '算': '国', '管': '县', '类': '源', '精': '项', '纸': '乙', '经': '新', '给': '光', '维': '犯', '网': '市', '罪': '人',
				  '者': '申', '联': '委', '股': '报', '能': '丁', '自': '补', '范': '甲', '获': '发', '行': '者', '街': '道', '补': '自',
				  '西': '九', '规': '元', '计': '十', '订': '立', '设': '工', '证': '别', '评': '网', '询': '七', '请': '算', '质': '主',
				  '贴': '总', '贸': '湖', '费': '家', '资': '奖', '路': '数', '辖': '干', '过': '更', '运': '法', '还': '违', '进': '万',
				  '违': '文', '通': '再', '造': '币', '道': '称', '部': '措', '配': '资', '重': '图', '量': '六', '金': '保', '错': '利',
				  '镇': '城', '门': '属', '间': '中', '阅': '亿', '阳': '联', '限': '积', '院': '局', '除': '贸', '集': '信', '需': '也',
				  '革': '策', '项': '不', '须': '制', '额': '司', '首': '免', '验': '省', '高': '天', '龙': '八'}
	chace_str = '者合册第应具步以督法快:'
	result = ''.join([all_coding.get(each, each) for each in chace_str]) if chace_str else ''
	print(f'转换前:({chace_str}), 转换后:({result})')


if __name__ == '__main__':
	fontPath = r'C:\Users\lenovo\Desktop\ccw.ttf'
	font_file = TTFont(fontPath)
	# 设置字体大小
	font = ImageFont.truetype(fontPath, 45)
	# 1 全部编码
	codeList = font_file.getGlyphOrder()
	# 1.1 中文编码
	cn_code_list = [i for i in codeList if 'uni' in i]
	# 1.2 其他一些编码对应字典值
	special_coding = {'.notdef': ' ', 'five': '5', 'nine': '9', 'seven': '7', 'eight': '8', 'three': '3', 'four': '4',
					  'ampersand': '&', 'six': '6', 'two': '1', 'plusminus': '±', 'one.001': '2', 'asterisk': '*',
					  'asciitilde': '~', 'greater': '>', 'numbersign': '#', 'parenleft': '(', 'parenright': ')',
					  'slash': '/', 'equal': '=', 'dollar': '&', 'exclam': '!', 'bar': '|', 'percent': '%', 'at': '@',
					  'question': '?', 'underscore': '_', 'asciicircum': '^', 'less': '<', 'plus': '+'}
	# 1.3 查找编码的对应字典值
	special_and_chinese_coding = find_coding(special_coding, cn_code_list, font)
	# print(special_and_chinese_coding)
	# 1.4 全部编码集
	all_coding = {}
	sxs = font_file['cmap'].getBestCmap().items()
	for k, v in sxs:
		print(f'map(code="{k}" name="{v}") | key:{chr(k)} Value:{special_and_chinese_coding.get(v, v)}')
		all_coding[chr(k)] = special_and_chinese_coding.get(v, v)
	# print(all_coding)

	# test() # 测试

输出:

map(code="35774" name="uni8BBE") | key:设 Value:map(code="35777" name="uni8BC1") | key:证 Value:map(code="35780" name="uni8BC4") | key:评 Value:map(code="35810" name="uni8BE2") | key:询 Value:map(code="35831" name="uni8BF7") | key:请 Value:map(code="36136" name="uni8D28") | key:质 Value:map(code="36148" name="uni8D34") | key:贴 Value:map(code="36152" name="uni8D38") | key:贸 Value:map(code="36153" name="uni8D39") | key:费 Value:map(code="36164" name="uni8D44") | key:资 Value:map(code="36335" name="uni8DEF") | key:路 Value:map(code="36758" name="uni8F96") | key:辖 Value:map(code="36807" name="uni8FC7") | key:过 Value:map(code="36816" name="uni8FD0") | key:运 Value:map(code="36824" name="uni8FD8") | key:还 Value:map(code="36827" name="uni8FDB") | key:进 Value:map(code="36829" name="uni8FDD") | key:违 Value:map(code="36890" name="uni901A") | key:通 Value:map(code="36896" name="uni9020") | key:造 Value:map(code="36947" name="uni9053") | key:道 Value:map(code="37096" name="uni90E8") | key:部 Value:map(code="37197" name="uni914D") | key:配 Value:map(code="37325" name="uni91CD") | key:重 Value:map(code="37327" name="uni91CF") | key:量 Value:map(code="37329" name="uni91D1") | key:金 Value:map(code="38169" name="uni9519") | key:错 Value:map(code="38215" name="uni9547") | key:镇 Value:map(code="38376" name="uni95E8") | key:门 Value:map(code="38388" name="uni95F4") | key:间 Value:map(code="38405" name="uni9605") | key:阅 Value:亿
map(code="38451" name="uni9633") | key:阳 Value:map(code="38480" name="uni9650") | key:限 Value:map(code="38498" name="uni9662") | key:院 Value:map(code="38500" name="uni9664") | key:除 Value:map(code="38598" name="uni96C6") | key:集 Value:map(code="38656" name="uni9700") | key:需 Value:map(code="38761" name="uni9769") | key:革 Value:map(code="39033" name="uni9879") | key:项 Value:map(code="39035" name="uni987B") | key:须 Value:map(code="39069" name="uni989D") | key:额 Value:map(code="39318" name="uni9996") | key:首 Value:map(code="39564" name="uni9A8C") | key:验 Value:map(code="39640" name="uni9AD8") | key:高 Value:map(code="40857" name="uni9F99") | key:龙 Value:八

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值