├── __init__.py ├── Qzone ├── __init__.py ├── README.md └── handle_login_qzone.py ├── guazi ├── __init__.py ├── README.md ├── handle_guazi.py └── guazi.js ├── maoyan ├── __init__.py ├── maoyan.woff ├── README.md ├── knn_font.py ├── handle_maoyan.py └── fontdata.txt ├── uxin ├── __init__.py ├── handle_uxin.py ├── uxin.js └── README.md ├── autohome ├── __init__.py ├── koubei │ ├── __init__.py │ ├── koubei.ttf │ ├── README.md │ └── handle_autohome_app_koubei.py └── README.md ├── hongshuwang ├── __init__.py ├── README.md └── handle_hongshuwang.py ├── manhuagui ├── __init__.py ├── README.md ├── md5_test.js └── handle_manhuagui_md5.py ├── meituan ├── __init__.py ├── meishi_business │ ├── __init__.py │ ├── handle_mongo.py │ ├── README.md │ ├── handle_meituan_token.py │ ├── handle_meituan_business_comment.py │ ├── handle_meituan_business_page.py │ ├── handle_meituan_business_detail.py │ └── handle_meituan_business_page_token.py ├── meishi_business_scrapy │ ├── meishi_business_scrapy │ │ ├── __init__.py │ │ ├── spiders │ │ │ ├── __init__.py │ │ │ └── meishi_business.py │ │ ├── middlewares.py │ │ ├── pipelines.py │ │ ├── items.py │ │ └── settings.py │ ├── main.py │ └── scrapy.cfg └── README.md ├── nubia_bbs ├── __init__.py ├── nubia_bbs_from_chrome │ ├── __init__.py │ ├── handle_nubia_bbs.py │ ├── decode_cookie.html │ ├── after_decode_cookie.html │ └── nubia_bbs_js.html ├── nubia_bbs_from_overwrite_js │ ├── __init__.py │ └── overwrite_js.py └── README.md ├── dazhongdianping ├── __init__.py ├── test │ ├── __init__.py │ ├── number.woff │ └── handle_css_font.py ├── shopdesc.woff ├── README.md ├── handle_dianping_css_font.py ├── font_list.py └── font_dict ├── kongzhongwang ├── __init__.py ├── README.md ├── encrypt-js.js ├── login_kongzhongwang.py ├── login-handler-kz-ums-3.0-min.js └── login-handler.js ├── xinrongcaifu ├── __init__.py ├── rsa_study │ ├── __init__.py │ ├── public.pem │ ├── private.pem │ └── handle_rsa.py ├── decode.py └── README.md ├── gongzhonghao.jpg ├── js_tool ├── js_tool.rar └── README.md ├── javascript混淆与反混淆研究.pdf ├── .idea ├── vcs.xml ├── modules.xml ├── misc.xml └── js-reverse.iml ├── 常见js逆向技巧.md ├── JS基础.md ├── README.md ├── .gitignore └── cnvd ├── test.py ├── sha1.js ├── sha256.js └── md5.js /__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Qzone/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /guazi/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /maoyan/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /uxin/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /autohome/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /hongshuwang/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /manhuagui/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /meituan/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nubia_bbs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /autohome/koubei/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dazhongdianping/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /kongzhongwang/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /xinrongcaifu/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dazhongdianping/test/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /meituan/meishi_business/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /xinrongcaifu/rsa_study/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nubia_bbs/nubia_bbs_from_chrome/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nubia_bbs/nubia_bbs_from_overwrite_js/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/meishi_business_scrapy/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gongzhonghao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freedom-wy/js-reverse/HEAD/gongzhonghao.jpg -------------------------------------------------------------------------------- /maoyan/maoyan.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freedom-wy/js-reverse/HEAD/maoyan/maoyan.woff -------------------------------------------------------------------------------- /js_tool/js_tool.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freedom-wy/js-reverse/HEAD/js_tool/js_tool.rar -------------------------------------------------------------------------------- /javascript混淆与反混淆研究.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freedom-wy/js-reverse/HEAD/javascript混淆与反混淆研究.pdf -------------------------------------------------------------------------------- /autohome/koubei/koubei.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freedom-wy/js-reverse/HEAD/autohome/koubei/koubei.ttf -------------------------------------------------------------------------------- /dazhongdianping/shopdesc.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freedom-wy/js-reverse/HEAD/dazhongdianping/shopdesc.woff -------------------------------------------------------------------------------- /dazhongdianping/test/number.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freedom-wy/js-reverse/HEAD/dazhongdianping/test/number.woff -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/main.py: -------------------------------------------------------------------------------- 1 | from scrapy import cmdline 2 | cmdline.execute("scrapy crawl meishi_business".split()) -------------------------------------------------------------------------------- /dazhongdianping/test/handle_css_font.py: -------------------------------------------------------------------------------- 1 | from fontTools.ttLib import TTFont 2 | 3 | 4 | font_file = TTFont("number.woff") 5 | font_file.saveXML("hongshuwang.xml") -------------------------------------------------------------------------------- /js_tool/README.md: -------------------------------------------------------------------------------- 1 | # js调试工具 2 | 解压到一个文件夹下即可使用 3 | *** 4 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 5 | #### bug:dazhuang_python@sina.com 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /xinrongcaifu/decode.py: -------------------------------------------------------------------------------- 1 | import execjs 2 | 3 | 4 | 5 | 6 | with open("AA.base-min.js",'r',encoding='gbk') as f: 7 | f_read = f.read() 8 | 9 | js = execjs.compile(f_read) 10 | print(js.call("test")) 11 | -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/meishi_business_scrapy/spiders/__init__.py: -------------------------------------------------------------------------------- 1 | # This package will contain the spiders of your Scrapy project 2 | # 3 | # Please refer to the documentation for information on how to create and manage 4 | # your spiders. 5 | -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/meishi_business_scrapy/middlewares.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Define here the models for your spider middleware 4 | # 5 | # See documentation in: 6 | # https://doc.scrapy.org/en/latest/topics/spider-middleware.html 7 | -------------------------------------------------------------------------------- /autohome/README.md: -------------------------------------------------------------------------------- 1 | # 汽车之家爬虫 2 | ### 仅限学术交流,如有冒犯,请及时联系本人删除 3 | *** 4 | #### 文件列表: 5 | ##### koubei 汽车之家app端口碑css加密字体逆向 6 | *** 7 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 8 | #### bug:dazhuang_python@sina.com 9 | -------------------------------------------------------------------------------- /xinrongcaifu/rsa_study/public.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PUBLIC KEY----- 2 | MIGJAoGBAI766d3bEYSr4TWSpx0wwuqloksPDNmr+YglDtMeVnk7itP7uRoy5vsT 3 | ERgxe7rzw8PjyG54qINxsYcBR8yAPdZRBZIW2I8pbxDdwCRL8PoVN44DLCMeO7pp 4 | 0Ax938Dow8tPzT6+mMVWkoPRMp8ISmpXW39VwYxRB5p9XUN8myXHAgMBAAE= 5 | -----END RSA PUBLIC KEY----- 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /meituan/README.md: -------------------------------------------------------------------------------- 1 | # 美团数据抓取 2 | *** 3 | #### 文件列表: 4 | ##### meishi_business 美团美食商家数据抓取,包括商家详情页,评论,页码页,token生成 5 | ##### meishi_business_scrapy 美团美食商家数据抓取-scrapy版本,包括商家详情页,评论,页码页 6 | *** 7 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 8 | #### bug:dazhuang_python@sina.com 9 | -------------------------------------------------------------------------------- /maoyan/README.md: -------------------------------------------------------------------------------- 1 | # 猫眼动态css混淆破解 2 | *** 3 | #### 文件列表: 4 | ##### fontdata.txt 样本数据集 5 | ##### handle_maoyan.py 解析程序 6 | ##### knn_font.py 通过KNN近邻算法解析动态css混淆加密 7 | ##### maoyan.woff 字体文件 8 | 9 | *** 10 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 11 | #### bug:dazhuang_python@sina.com 12 | -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/scrapy.cfg: -------------------------------------------------------------------------------- 1 | # Automatically created by: scrapy startproject 2 | # 3 | # For more information about the [deploy] section see: 4 | # https://scrapyd.readthedocs.io/en/latest/deploy.html 5 | 6 | [settings] 7 | default = meishi_business_scrapy.settings 8 | 9 | [deploy] 10 | #url = http://localhost:6800/ 11 | project = meishi_business_scrapy 12 | -------------------------------------------------------------------------------- /Qzone/README.md: -------------------------------------------------------------------------------- 1 | # Qzone登录js逆向研究 2 | *** 3 | #### 文件列表: 4 | ##### handle_login_qzone.py Qzone登录并发送说说 5 | ##### decode_qzone_login.js Qzone登录JS破解 6 | *** 7 | #### 逆向方法: 8 | ##### 1、打断点找到密码加密函数 9 | ##### 2、扣取加密函数逻辑,在本地运行,少什么对象要么创建一个空对象,要么找到该对象创建代码 10 | 11 | *** 12 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 13 | #### bug:dazhuang_python@sina.com 14 | -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/meishi_business_scrapy/pipelines.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Define your item pipelines here 4 | # 5 | # Don't forget to add your pipeline to the ITEM_PIPELINES setting 6 | # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html 7 | 8 | 9 | class MeishiBusinessScrapyPipeline(object): 10 | def process_item(self, item, spider): 11 | return item 12 | -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/meishi_business_scrapy/items.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Define here the models for your scraped items 4 | # 5 | # See documentation in: 6 | # https://doc.scrapy.org/en/latest/topics/items.html 7 | 8 | import scrapy 9 | 10 | 11 | class MeishiBusinessScrapyItem(scrapy.Item): 12 | # define the fields for your item here like: 13 | # name = scrapy.Field() 14 | pass 15 | -------------------------------------------------------------------------------- /manhuagui/README.md: -------------------------------------------------------------------------------- 1 | # 漫画柜MD5值JS逆向研究 2 | *** 3 | #### 文件列表: 4 | ##### handle_manhuagui_md5.py 漫画柜md5值解密程序 5 | ##### md5_test.js 从网页中抠出的js加密代码 6 | *** 7 | #### 逆向方法: 8 | ##### 首先通过抓包并在浏览器中打断点定位到cid值,通过浏览器右侧堆栈区域找到Md5生成代码 9 | ##### 使用正则表达式抠出加密的JS代码,使用正则表达式抠出MD5加密字符串 10 | ##### 使用lzstring解密 11 | *** 12 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 13 | #### bug:dazhuang_python@sina.com 14 | -------------------------------------------------------------------------------- /meituan/meishi_business/handle_mongo.py: -------------------------------------------------------------------------------- 1 | import pymongo 2 | from pymongo.collection import Collection 3 | 4 | 5 | class HandleMeituanMongo(object): 6 | def __init__(self): 7 | client = pymongo.MongoClient(host="192.168.110.129",port=27017) 8 | self.db_name = client['meituan'] 9 | 10 | def handle_save_data(self,item): 11 | data_collection = Collection(self.db_name,'business_detail_info') 12 | data_collection.insert(item) 13 | 14 | 15 | meituan_mongo = HandleMeituanMongo() -------------------------------------------------------------------------------- /guazi/README.md: -------------------------------------------------------------------------------- 1 | # 瓜子二手车JS逆向研究 2 | *** 3 | #### 文件列表: 4 | ##### guazi.js 瓜子二手车设置cookie的JS破解后的明文JS 5 | ##### handle_guazi.py 使用requests请求瓜子二手车网站,并使用execjs读取JS破解文件 6 | *** 7 | #### 逆向方法: 8 | ##### 1、复制除eval外其他所有JS代码 9 | ##### 2、打开chrome开发者模式,并切换到console标签 10 | ##### 3、粘贴js代码,敲回车,即可得到明文JS 11 | ##### 4、使用在线代码格式化,格式化JS代码:[在线格式化代码](http://tool.oschina.net/codeformat/js/) 12 | 13 | *** 14 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 15 | #### bug:dazhuang_python@sina.com 16 | -------------------------------------------------------------------------------- /hongshuwang/README.md: -------------------------------------------------------------------------------- 1 | # 红薯小说网JS逆向研究 2 | *** 3 | #### 文件列表: 4 | ##### handle_hongshuwang.py 读取本地HTML文件,使用execjs调用破解JS 5 | ##### hongshuwang.html 本地HTML文件 6 | ##### hongshuwang.js 红薯网JS破解文件,实际项目中需要使用正则表达式抽取 7 | *** 8 | #### 逆向方法: 9 | ##### 1、打开https://g.hongshu.com/content/93416/13877912.html,复制源代码到本地 10 | ##### 2、删除或注释无关代码,防止保存的本地HTML文件打开后跳转等操作 11 | ##### 3、通过阅读JS代码和打断点确认最终需要获取secWords变量 12 | ##### 4、抽取相关JS代码,使用execjs调用 13 | 14 | *** 15 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 16 | #### bug:dazhuang_python@sina.com 17 | -------------------------------------------------------------------------------- /meituan/meishi_business/README.md: -------------------------------------------------------------------------------- 1 | # 美团美食商家信息抓取 2 | *** 3 | #### 文件列表: 4 | ##### handle_meituan_business_detail.py 美团美食商家信息抓取---未登录 5 | ##### handle_mongo.py 数据存储逻辑 6 | ##### handle_meituan_business_page.py 美团美食商家页码页解析---未登录,可以不解析token直接在页面获取商家ID 7 | ##### handle_meituan_business_comment.py 美团美食商家评论抓取---未登录 8 | *** 9 | #### token破解-1 10 | ##### handle_meituan_token.py 美团美食商家页码页token解析---未成功 11 | ##### meituan_token.html 美团美食商家token获取js---未成功 12 | #### token破解-2 13 | ##### handle_meituan_business_page_token.py 破解美团token程序---按照网上提供的方法已完成破解 14 | *** 15 | #### bug:dazhuang_python@sina.com 16 | -------------------------------------------------------------------------------- /kongzhongwang/README.md: -------------------------------------------------------------------------------- 1 | # 空中网JS逆向研究 2 | *** 3 | #### 文件列表: 4 | ##### login-handler-kz-ums-3.0-min.js 空中网登录JS源文件 5 | ##### login-handler.js 空中网登录JS逆向并格式化后文件 6 | ##### encrypt-js.js 从明文js代码中抠出的密码加密js代码 7 | ##### login_kongzhongwang 使用Python的requests请求登录接口,使用execjs读取js文件 8 | *** 9 | #### 逆向方法: 10 | ##### 1、复制除eval外其他所有JS代码 11 | ##### 2、打开chrome开发者模式,并切换到console标签 12 | ##### 3、粘贴js代码,敲回车,即可得到明文JS 13 | ##### 4、使用在线代码格式化,格式化JS代码:[在线格式化代码](http://tool.oschina.net/codeformat/js/) 14 | 15 | *** 16 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 17 | #### bug:dazhuang_python@sina.com 18 | -------------------------------------------------------------------------------- /autohome/koubei/README.md: -------------------------------------------------------------------------------- 1 | # 汽车之家app端口碑css加密字体破解 2 | ### 仅限学术交流,如有冒犯,请及时联系本人删除 3 | *** 4 | #### 文件列表: 5 | ##### handle_autohome_app_koubei.py 破解程序 6 | ##### koubei.ttf 字体文件 7 | *** 8 | #### 破解方法: 9 | ##### 1、通过浏览器开发者模式,找到页面中文字所使用的css样式 10 | ##### 2、通过抓包等方法找到加载的css文件,通过正则表达式取出字体文件URL 11 | ##### 3、通过[百度字体编辑器解析woff文件](http://fontstore.baidu.com/static/editor/index.html) 可以生成font_list.py文件 12 | ##### 4、使用fontTools处理字体文件,得出对应关系 13 | ##### 5、通过对应关系解析加密字体 14 | ##### 6、破解方法和大众点评css字体加密逆向方法相同 15 | *** 16 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 17 | #### bug:dazhuang_python@sina.com 18 | -------------------------------------------------------------------------------- /.idea/js-reverse.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /xinrongcaifu/README.md: -------------------------------------------------------------------------------- 1 | # 信融财富登录接口密码加密js逆向研究 2 | *** 3 | #### 文件列表: 4 | ##### AA.base-min.js 破解JS 5 | ##### decode.py 使用pyexecjs读取破解JS,实现破解 6 | *** 7 | #### 逆向方法: 8 | ##### 通过password关键字找到js入口 9 | ```javascript 10 | data:{ 11 | username:_form.find('#rapid-userName').val(), 12 | password:AA.Helper.encrypPw(_form.find('#rapid-userPw').val()), 13 | captcha:_form.find('#rapid-captcha').val(), 14 | seed:_form.find('#rapid-seed').val() 15 | } 16 | ``` 17 | ##### 通过encrypPw找到加密方法 18 | ##### 扣取需要的JS代码 19 | 20 | *** 21 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 22 | #### bug:dazhuang_python@sina.com 23 | -------------------------------------------------------------------------------- /dazhongdianping/README.md: -------------------------------------------------------------------------------- 1 | # 大众点评加密字体解密 2 | ### 仅限学术交流,如有冒犯,请及时联系本人删除 3 | *** 4 | #### 文件列表: 5 | ##### font_dict 大众点评页面字体对应关系---部分 6 | ##### font_list.py 大众点评字体文件解析后的中文 7 | ##### handle_dianping_css_font.py 解析大众点评商家详情页 8 | ##### shopdesc.woff 字体文件 9 | *** 10 | #### 破解方法: 11 | ##### 1、通过浏览器开发者模式,找到页面中文字所使用的css样式 12 | ##### 2、通过抓包等方法找到加载的css文件,通过正则表达式取出字体文件URL 13 | ##### 3、通过[百度字体编辑器解析woff文件](http://fontstore.baidu.com/static/editor/index.html) 可以生成font_list.py文件 14 | ##### 4、使用fontTools处理字体文件,得出对应关系 15 | ##### 5、通过对应关系解析加密字体 16 | *** 17 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 18 | #### bug:dazhuang_python@sina.com 19 | -------------------------------------------------------------------------------- /hongshuwang/handle_hongshuwang.py: -------------------------------------------------------------------------------- 1 | import execjs 2 | import re 3 | from lxml import etree 4 | 5 | 6 | class HongShuWang(object): 7 | def handle_js(self,text): 8 | with open("hongshuwang.js", 'r') as f: 9 | f_read = f.read() 10 | 11 | js = execjs.compile(f_read) 12 | for i,j in enumerate(js.call("hongshuwang")): 13 | text = re.sub(''%i,chr(int(j)+1),text) 14 | html = etree.HTML(text) 15 | result = ''.join(html.xpath("//div[@class='rdtext']/p/text()")) 16 | print(result) 17 | 18 | 19 | 20 | if __name__ == '__main__': 21 | hongshuwang = HongShuWang() 22 | with open('hongshuwang.html','r',encoding='utf-8') as f: 23 | text = f.read() 24 | hongshuwang.handle_js(text) -------------------------------------------------------------------------------- /nubia_bbs/README.md: -------------------------------------------------------------------------------- 1 | # 努比亚论坛cookies值JS逆向研究 2 | *** 3 | #### 文件列表: 4 | ##### nubia_bbs_from_chrome 使用selenium调用chrome浏览器逆向js 5 | ###### nubia_bbs_js.html 源文件 6 | ###### after_decode_cookie.html 努比亚论坛cookie值破解程序-破解文件 7 | ###### decode_cookie.html 努比亚论坛cookie值破解程序-替换前 8 | ###### handle_nubia_bbs.py 努比亚论坛cookie值破解python程序 9 | ##### nubia_bbs_from_overwrite_js 通过重写原JS文件到py文件逆向JS 10 | ###### overwrite_js.py 使用Python重写JS逻辑 11 | *** 12 | #### 逆向方法: 13 | ##### 通过fiddler抓包发现第一次请求 https://bbs.nubia.cn/ 时会返回一段JS代码 14 | ##### 通过chrome浏览器调试,发现有debugger反调试,保存fiddler抓取到的js代码到本地 15 | ##### 通过js美化,格式化代码[美化JS代码](https://tool.lu/js/) 16 | ##### 通过chrome浏览器打开本地文件,在debugger情况下找到调用debugger的地方,删除代码,解除反debug 17 | ##### 通过打断点找到arg2即找到了cookie值 18 | 19 | *** 20 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 21 | #### bug:dazhuang_python@sina.com 22 | -------------------------------------------------------------------------------- /常见js逆向技巧.md: -------------------------------------------------------------------------------- 1 | # js-reverse 2 | ### JS逆向研究 3 | #### 1、debugger断点反调试 4 | ##### 点击debugger左侧数字,点击鼠标 右键选择conditional breakpoint,设置条件断点,在弹出的框中输入false,再次刷新页面即可 5 | #### 2、无限debugger断点反调试 6 | ##### (1)、可以取消所有断点 7 | ##### (2)、将调用函数置空,按f8继续下一行代码 8 | #### 3、eval加密 9 | ##### (1)、复制除eval外其他所有JS代码 10 | ##### (2)、打开chrome开发者模式,并切换到console标签 11 | ##### (3)、粘贴js代码,敲回车,即可得到明文JS 12 | ##### (4)、使用在线代码格式化,格式化JS代码:[在线格式化代码](http://tool.oschina.net/codeformat/js/) 13 | #### 4、字体通过css加密 14 | ##### (1)、通过浏览器开发者模式,找到页面中文字所使用的css样式 15 | ##### (2)、通过抓包等方法找到加载的css文件,通过正则表达式取出字体文件URL 16 | ##### (3)、通过[百度字体编辑器解析woff文件](http://fontstore.baidu.com/static/editor/index.html) 可以生成font_list.py文件 17 | ##### (4)、使用fontTools处理字体文件,得出对应关系 18 | ##### (5)、通过对应关系解析加密字体 19 | #### 5、通过RSA加密关键字段,如密码,可以通过关键字找到相应的方法,扣取需要的代码 20 | 21 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 22 | ### bug:dazhuang_python@sina.com 23 | -------------------------------------------------------------------------------- /xinrongcaifu/rsa_study/private.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIICXwIBAAKBgQCO+und2xGEq+E1kqcdMMLqpaJLDwzZq/mIJQ7THlZ5O4rT+7ka 3 | Mub7ExEYMXu688PD48hueKiDcbGHAUfMgD3WUQWSFtiPKW8Q3cAkS/D6FTeOAywj 4 | Hju6adAMfd/A6MPLT80+vpjFVpKD0TKfCEpqV1t/VcGMUQeafV1DfJslxwIDAQAB 5 | AoGAcEgnJCyHI1L/Nt0GE2xZhX+xZZRaGQ5ulTXU4IIwkl/p8/L4N9TFg2JDyGYD 6 | rpsDn2/f1LE4VJESQt0EDmvCM4oiKq/TSxUoZBMq9cVH6QR6DdNFKaxzMXDmJrKV 7 | SbZNQ1bGpFdpDoe3CtWV2Fh8geQVJRRqJuh/r2CV1q1eyWECRQCkLmxrLnFgX8ge 8 | rx6yyXOHb+XAmJNWCoPML6lUAl9Vx1OCQnLsTeJj+qwCmKjTRvFgxjM1M0DpC1nb 9 | wg1cJWljgIZlyQI9AN7xJaV9NbNYJTSRelF1BH28d2MBvJHu4zdBOnOQDCoM9tpv 10 | q2k+gmRuRF/gzmTa/Gd0TF7fETRBEHU3DwJEBLMff2Hw9OVJATfaFRwXJoVZek3j 11 | yc67PxkOK811lSsDhPMJ/yGrnVkLm3drPcEGH9MMnDU/Ymxkwhmn8D9R6PtA3aEC 12 | PGg/UMA6dULgg706DX1Lf4cf+p90L235y4uJ18Az6kw7da6cqwVyclxt51EB+ODW 13 | OVJS4mc2XYAWsJBu5wJED4PlOVYQ1Mns76F59u3JlLcJTa/KESTYlruw7rwqiFaG 14 | 295EIh7E8l5UIB8dWN9P2sYgjT+mIT13vRHV0lzlfGYYfAA= 15 | -----END RSA PRIVATE KEY----- 16 | -------------------------------------------------------------------------------- /xinrongcaifu/rsa_study/handle_rsa.py: -------------------------------------------------------------------------------- 1 | import rsa 2 | 3 | 4 | #生成公钥和私钥 5 | # (public_key,private_key) = rsa.newkeys(1024) 6 | 7 | #保存公钥 8 | # with open("public.pem",'w+') as f: 9 | # f.write(public_key.save_pkcs1().decode()) 10 | 11 | #保存私钥 12 | # with open('private.pem','w+') as f: 13 | # f.write(private_key.save_pkcs1().decode()) 14 | 15 | #加密 16 | #导入公钥 17 | with open("public.pem",'r') as f: 18 | public_key = rsa.PublicKey.load_pkcs1(f.read().encode()) 19 | 20 | #明文 21 | message = "hello world" 22 | 23 | #公钥加密 24 | crypto = rsa.encrypt(message.encode(),public_key) 25 | print(crypto) 26 | 27 | #解密 28 | #导入私钥 29 | with open("private.pem","r") as f: 30 | private_key = rsa.PrivateKey.load_pkcs1(f.read().encode()) 31 | 32 | #私钥解密 33 | message_value = rsa.decrypt(crypto,private_key) 34 | print(message_value.decode()) 35 | 36 | #私钥签名 37 | signature = rsa.sign(message.encode(),private_key,'SHA-1') 38 | print(signature) 39 | #公钥验证 40 | print(rsa.verify(message.encode(),signature,public_key)) -------------------------------------------------------------------------------- /meituan/meishi_business/handle_meituan_token.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | import os 3 | import time 4 | 5 | def handle_webdriver_meituan_token(page_num,uuid): 6 | """ 7 | 通过浏览器加载美团js,获取token 8 | :param page_num: 页码 9 | :param uuid: uuid 10 | :return: token 11 | """ 12 | jv = "https://bj.meituan.com/meishi/api/poi/getPoiList?cityName=北京&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=%s&userId=&uuid=%s&platform=1&partner=126&originUrl=https://bj.meituan.com/meishi/pn%s/&riskLevel=1&optimusCode=10"%(page_num,uuid,page_num) 13 | with open('meituan_token.html') as f: 14 | f.read().replace("bbbb",jv) 15 | file_path = 'file:///' + os.path.abspath('meituan_token.html') 16 | browser = webdriver.Chrome() 17 | browser.get(url=file_path) 18 | # token_data = browser.execute_script('return meituan_token()', jv) # 这里使用execute_script调用了ssss函数,并传入参数jv 19 | print(browser.title) 20 | token_data = browser.title 21 | time.sleep(10) 22 | browser.close() 23 | return token_data 24 | -------------------------------------------------------------------------------- /guazi/handle_guazi.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | import re 4 | 5 | url = 'https://www.guazi.com/bj/buy/o1i7/#bread' 6 | 7 | header = { 8 | "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3610.2 Safari/537.36", 9 | } 10 | 11 | #首次请求返回203状态码,和JS加密文件 12 | response = requests.get(url=url,headers=header) 13 | print(response.text) 14 | #设置返回的编码 15 | response.encoding = 'utf-8' 16 | if '正在打开中,请稍后' in response.text: 17 | #通过正则表达式获取了相关的字段和值 18 | value_search = re.compile(r"anti\('(.*?)','(.*?)'\);") 19 | string = value_search.search(response.text).group(1) 20 | key = value_search.search(response.text).group(2) 21 | #读取,破解的js文件 22 | with open('guazi.js','r') as f: 23 | f_read = f.read() 24 | #使用execjs包来封装这段JS,传入的是读取后的js文件 25 | js = execjs.compile(f_read) 26 | #调用JS文件内的函数 27 | js_return = js.call('anti',string,key) 28 | cookie_value = 'antipas='+js_return 29 | header['Cookie'] = cookie_value 30 | response_second = requests.get(url=url,headers=header) 31 | print(response_second.text) 32 | else: 33 | print(response.text) 34 | 35 | -------------------------------------------------------------------------------- /uxin/handle_uxin.py: -------------------------------------------------------------------------------- 1 | import execjs 2 | import re 3 | import requests 4 | 5 | 6 | class HandleUxin(object): 7 | def __init__(self): 8 | self.index_url = "https://www.xin.com/beijing/i1/" 9 | self.header = { 10 | "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36", 11 | } 12 | 13 | def handle_request(self): 14 | arg1_search = re.compile(r"arg1='(.*?)';") 15 | # 首先获取arg1值 16 | js_response = requests.get(url=self.index_url,headers=self.header) 17 | arg1_value = arg1_search.search(js_response.text).group(1) 18 | # 该值固定 19 | _0x5e8b26 = "3000176000856006061501533003690027800375" 20 | #读取破解JS 21 | with open('uxin.js','r',encoding='utf-8') as f: 22 | f_read = f.read() 23 | js = execjs.compile(f_read) 24 | acw_sc__v2 = js.call("hexXor",_0x5e8b26,arg1_value) 25 | self.header['Cookie'] = "acw_sc__v2="+acw_sc__v2 26 | response = requests.get(url=self.index_url,headers=self.header) 27 | print(response.text) 28 | 29 | 30 | if __name__ == '__main__': 31 | uxin = HandleUxin() 32 | uxin.handle_request() 33 | -------------------------------------------------------------------------------- /JS基础.md: -------------------------------------------------------------------------------- 1 | # js-reverse 2 | ### JS基础 3 | 1、获取时间戳 4 | ```javascript 5 | // 获取时间戳 6 | var time1 = new Date().getTime(); 7 | var time3 = Date.now(); 8 | alert(time1); 9 | // 时间戳转时间 10 | var time2 = new Date(time1).toLocaleString(); 11 | alert(time2); 12 | ``` 13 | 2、声明变量,使用var关键字时声明的是局部变量,不使用var关键字,则为全局变量 14 | 3、||遇真返回,如果全为假,则返回最右值,&&遇假返回 15 | ```javascript 16 | var b = a||0||""||100; 17 | console.log(b); 18 | //var a = 0; 19 | //(1==0)&&(a=100); 20 | //alert(a); 21 | ``` 22 | 4、在两个不同类型值中间使用+,返回值为字符串类型 23 | 5、三元运算符 24 | ```javascript 25 | var a = 0; 26 | a?alert("真"):alert("假"); 27 | // 如果a为真则弹出真,否则弹出假 28 | ``` 29 | 6、return和返回值之间不可换行,否则将返回空,常见于格式化代码后出错 30 | 7、创建对象的两种方法 31 | ```javascript 32 | var obj = {}; 33 | var obj2 = new Object; 34 | ``` 35 | 8、在匿名函数中传window参数 36 | ```javascript 37 | !function(n){ 38 | function i(){ 39 | var a = 5; 40 | return a; 41 | }; 42 | n.test_js = i; 43 | }(window); 44 | 45 | function test(){ 46 | return test_js(); 47 | }; 48 | test(); 49 | ``` 50 | 该段代码在js调试器中会报错,无window对象,此时需要定义window对象 51 | ```javascript 52 | var window = {}; 53 | !function(n){ 54 | function i(){ 55 | var a = 5; 56 | return a; 57 | }; 58 | n.test_js = i; 59 | }(window); 60 | 61 | function test(){ 62 | return window.test_js(); 63 | }; 64 | test(); 65 | ``` 66 | 67 | ### bug:dazhuang_python@sina.com 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # js-reverse 2 | #### 仅限学术交流,如有冒犯请联系作者删除 3 | js_tool js调试工具 4 | ### JS逆向研究 5 | ### 1、[kongzhongwang](https://github.com/freedom-wy/js-reverse/tree/master/kongzhongwang) 空中网登录JS破解 6 | ### 2、[guazi](https://github.com/freedom-wy/js-reverse/tree/master/guazi) 瓜子二手车设置cookie的JS破解 7 | ### 3、[manhuagui](https://github.com/freedom-wy/js-reverse/tree/master/manhuagui) 漫画柜MD5值JS破解 8 | ### 4、[meituan](https://github.com/freedom-wy/js-reverse/tree/master/meituan) 美团美食商家信息抓取 9 | ### 5、[nubia_bbs](https://github.com/freedom-wy/js-reverse/tree/master/nubia_bbs) 努比亚论坛cookie值JS破解 10 | ### 6、[dazhongdianping](https://github.com/freedom-wy/js-reverse/tree/master/dazhongdianping) 大众点评css字体加密破解 11 | ### 7、[hongshuwang](https://github.com/freedom-wy/js-reverse/tree/master/hongshuwang) 红薯网CryptoJS逻辑逆向破解 12 | ### 8、[xinrongcaifu](https://github.com/freedom-wy/js-reverse/tree/master/xinrongcaifu) 信融财富密码rsa加密逻辑分析 13 | ### 9、[Qzone](https://github.com/freedom-wy/js-reverse/tree/master/Qzone) Qzone登录js逆向研究 14 | ### 10、[Uxin](https://github.com/freedom-wy/js-reverse/tree/master/uxin) 优信二手车JS逆向 15 | ### 11、[autohome](https://github.com/freedom-wy/js-reverse/tree/master/autohome) 汽车之家JS逆向 16 | ### 12、[maoyan](https://github.com/freedom-wy/js-reverse/tree/master/maoyan) 猫眼动态css混淆破解 17 | *** 18 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 19 | *** 20 | #### 公众号 21 | 你丫才秃头:不定期分享一些python爬虫,逆向破解相关文章,欢迎大家关注. 22 | ![爬虫工程师之家公众号](gongzhonghao.jpg) 23 | *** 24 | ### bug:dazhuang_python@sina.com 25 | -------------------------------------------------------------------------------- /uxin/uxin.js: -------------------------------------------------------------------------------- 1 | // var arg1 = '3B2439E659770B6D28628B9C454670CEBCDAB8CA'; 2 | 3 | var unsbox = function(arg1) { 4 | var _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24]; 5 | var _0x4da0dc = []; 6 | var _0x12605e = ''; 7 | for (var _0x20a7bf = 0x0; _0x20a7bf < arg1['\x6c\x65\x6e\x67\x74\x68']; _0x20a7bf++) { 8 | var _0x385ee3 = arg1[_0x20a7bf]; 9 | for (var _0x217721 = 0x0; _0x217721 < _0x4b082b.length; _0x217721++) { 10 | if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) { 11 | _0x4da0dc[_0x217721] = _0x385ee3; 12 | } 13 | } 14 | } 15 | _0x12605e = _0x4da0dc['\x6a\x6f\x69\x6e'](''); 16 | return _0x12605e; 17 | }; 18 | 19 | var hexXor= function(_0x4e08d8,arg1) { 20 | var unsbox_value = unsbox(arg1); 21 | var _0x5a5d3b = ''; 22 | for (var _0xe89588 = 0x0; _0xe89588 < unsbox_value.length && _0xe89588 < _0x4e08d8.length; _0xe89588 += 0x2) { 23 | var _0x401af1 = parseInt(unsbox_value.slice(_0xe89588, _0xe89588 + 0x2), 0x10); 24 | var _0x105f59 = parseInt(_0x4e08d8.slice(_0xe89588, _0xe89588 + 0x2), 0x10); 25 | var _0x189e2c = (_0x401af1 ^ _0x105f59).toString(0x10); 26 | if (_0x189e2c.length == 0x1) { 27 | _0x189e2c = '\x30' + _0x189e2c; 28 | } 29 | _0x5a5d3b += _0x189e2c; 30 | } 31 | return _0x5a5d3b; 32 | }; -------------------------------------------------------------------------------- /kongzhongwang/encrypt-js.js: -------------------------------------------------------------------------------- 1 | // 传入明文密码和dc字段 2 | function encrypt(str, pwd) { 3 | // 判空 4 | if (pwd == null || pwd.length <= 0) { 5 | return null 6 | }; 7 | var prand = ""; 8 | for (var i = 0; i < pwd.length; i++) { 9 | // 返回密码的Unicode编码 10 | prand += pwd.charCodeAt(i).toString() 11 | }; 12 | var sPos = Math.floor(prand.length / 5); 13 | var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5)); 14 | var incr = Math.ceil(pwd.length / 2); 15 | var modu = Math.pow(2, 31) - 1; 16 | if (mult < 2) { 17 | return null 18 | }; 19 | var salt = Math.round(Math.random() * 1000000000) % 100000000; 20 | prand += salt; 21 | while (prand.length > 10) { 22 | var a = prand.substring(0, 1); 23 | var b = prand.substring(10, prand.length); 24 | if (b.length > 10) { 25 | prand = b 26 | } else { 27 | prand = (parseInt(a) + parseInt(b)).toString() 28 | } 29 | }; 30 | prand = (mult * prand + incr) % modu; 31 | var enc_chr = ""; 32 | var enc_str = ""; 33 | for (var i = 0; i < str.length; i++) { 34 | enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255)); 35 | if (enc_chr < 16) { 36 | enc_str += "0" + enc_chr.toString(16) 37 | } else enc_str += enc_chr.toString(16); 38 | prand = (mult * prand + incr) % modu 39 | }; 40 | salt = salt.toString(16); 41 | while (salt.length < 8) salt = "0" + salt; 42 | enc_str += salt; 43 | return enc_str 44 | } -------------------------------------------------------------------------------- /meituan/meishi_business/handle_meituan_business_comment.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import time 4 | 5 | 6 | class MeituanBusinessComment(object): 7 | def __init__(self): 8 | self.index_url = "https://www.meituan.com/meishi/1467844/" 9 | self.header = { 10 | # "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" 11 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 12 | } 13 | 14 | def handle_uuid(self): 15 | uuid_search = re.compile(r"uuid=(.*?);") 16 | uuid_response = requests.get(url=self.index_url,headers=self.header) 17 | self.uuid = uuid_search.search(uuid_response.headers['Set-Cookie']).group(1) 18 | 19 | def handle_comment(self): 20 | self.handle_uuid() 21 | """ 22 | https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=4c075f52-c8ba-4116-b02d-5015c4ade7e5&platform=1&partner=126&originUrl=https://www.meituan.com/meishi/1467844/&riskLevel=1&optimusCode=10&id=1467844&userId=&offset=30&pageSize=10&sortType=1 23 | """ 24 | for page in (0,110,10): 25 | comment_url = "https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=%s&platform=1&partner=126&originUrl=https://www.meituan.com/meishi/1467844/&riskLevel=1&optimusCode=10&id=1467844&userId=&offset=%s&pageSize=10&sortType=1"%(self.uuid,page) 26 | response = requests.get(url=comment_url,headers=self.header) 27 | print(response.text) 28 | time.sleep(1) 29 | 30 | meituan_comment = MeituanBusinessComment() 31 | meituan_comment.handle_comment() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit hongshuwang / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /manhuagui/md5_test.js: -------------------------------------------------------------------------------- 1 | window["\x65\x76\x61\x6c"](function(p, a, c, k, e, d) { 2 | e = function(c) { 3 | return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) 4 | } 5 | ; 6 | if (!''.replace(/^/, String)) { 7 | while (c--) 8 | d[e(c)] = k[c] || e(c); 9 | k = [function(e) { 10 | return d[e] 11 | } 12 | ]; 13 | e = function() { 14 | return '\\w+' 15 | } 16 | ; 17 | c = 1; 18 | } 19 | ;while (c--) 20 | if (k[c]) 21 | p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]); 22 | return p; 23 | }('m.n({"o":3,"l":"i","j":"3.2","k":p,"u":"4","v":["x.2.0","t.2.0","q.r.0","s.2.0","9.2.0","7.2.0","8.2.0","5.2.0","6.2.0","10.2.0","11.2.0","12.2.0","13.2.0","14.2.0","15.2.0","16.2.0","f.2.0","e.2.0","h.2.0","g.2.0","b.2.0","a.2.0","d.2.0","c.2.0","y.2.0","S.2.0","V.2.0","U.2.0","X.2.0","W.2.0","R.2.0","Q.2.0","T.2.0","Z.2.0","Y.2.0"],"E":D,"G":F,"A":"/z/w/C/4/","B":1,"H":"","N":M,"P":O,"J":{"I":"L"}}).K();', 62, 69, 'O4UwRgDgPlBWEHMoGYAMAWAnOqgab1QEyC70VKgBymakBspA7KQKxQEEsCMLOByU7F7BgVR8qgRCNAzwZjAIW6Aed0A6qYHJNQEGWge+VAp3KBA/UCw5oDQ5QDKuUSAEsAxlFPGAJkYB2AQwC2IKAGUAsgAkoxxwgAi9gAu9kbWUOjIZIzUDKi8ELZIGKRspg7OUABmxgA2IADOMKicBMwQBWwQwQAWUAUhQQCuRcAAHsBWAJ6wVggA1l0AXlkFsAD6tl01Wdn2uQUuObbGBTUgNsjM+bZGuQD2pv3jpuaOVswFuVAQAE4gAJIrQVCOAFJD6G0ACgCabQB5TxWADC1AAcr8AKIECAARyGAEVERF0NR+MxbCA2kEHjZ0KhMIxMAl7gA3PEoNjIUq0TDYFgUAgMNAsKglVCc0iEokwPkwIA==='['\x73\x70\x6c\x69\x63']('\x7c'), 0, {})) -------------------------------------------------------------------------------- /nubia_bbs/nubia_bbs_from_chrome/handle_nubia_bbs.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import time 3 | from selenium import webdriver 4 | import re 5 | 6 | 7 | 8 | class NubiaBbs(object): 9 | def __init__(self): 10 | self.index_url = "https://bbs.nubia.cn/" 11 | self.header = { 12 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 13 | } 14 | self.nubia_request_session = requests.session() 15 | 16 | def handle_index(self): 17 | """ 18 | 请求努比亚论坛首页获取arg1并替换本地破解文件 19 | :return:after_decode_cookie.html 20 | """ 21 | response = self.nubia_request_session.get(url=self.index_url,headers=self.header) 22 | with open('decode_cookie.html','r') as f1: 23 | html = f1.read() 24 | arg1_search = re.compile(r"var\sarg1='(.*?)';") 25 | arg1_value = arg1_search.search(response.text).group(1) 26 | html = html.replace("&&&",arg1_value) 27 | with open('after_decode_cookie.html','w') as f2: 28 | f2.write(html) 29 | self.nubia_request_session.get(url="https://bbs.nubia.cn/favicon.ico",headers=self.header) 30 | 31 | def selenium_cookie(self): 32 | """ 33 | 通过selenium调用chrome打开after_decode_cookie.html破解文件,获取cookie值 34 | :return:response.text 35 | """ 36 | nubia_selenium = webdriver.Chrome() 37 | nubia_selenium.get("file:///E:\\study\\js-reverse\\nubia_bbs\\after_decode_cookie.html") 38 | time.sleep(5) 39 | cookie_value = nubia_selenium.title 40 | nubia_selenium.quit() 41 | self.nubia_request_session.cookies.set("acw_sc__v2",cookie_value) 42 | response = self.nubia_request_session.get(url=self.index_url,headers=self.header) 43 | print(response.text) 44 | 45 | if __name__ == '__main__': 46 | nubia = NubiaBbs() 47 | nubia.handle_index() 48 | nubia.selenium_cookie() -------------------------------------------------------------------------------- /manhuagui/handle_manhuagui_md5.py: -------------------------------------------------------------------------------- 1 | import lzstring 2 | import re 3 | import requests 4 | 5 | 6 | class Manhuagui(object): 7 | def __init__(self): 8 | self.index_url = "https://www.manhuagui.com/comic/32927/446274.html" 9 | self.header = { 10 | "Connection":"keep-alive", 11 | "Upgrade-Insecure-Requests":"1", 12 | "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36", 13 | "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", 14 | "Accept-Encoding":"gzip, deflate, br", 15 | "Accept-Language":"zh-CN,zh;q=0.9", 16 | } 17 | 18 | def handle_html(self): 19 | """ 20 | 首先请求漫画柜中漫画首页,是用正则表达式匹配加密后的JS代码 21 | :return:加密后的JS代码 22 | """ 23 | js_search = re.compile(r";',\d+,\d+,'(.*?),") 24 | response = requests.get(url=self.index_url,headers=self.header) 25 | self.js_value = js_search.search(response.text).group(1) 26 | 27 | def handle_md5_value(self): 28 | """ 29 | 使用正则表达式匹配出加密字符串,并通过lzstring解密 30 | :return:明文md5值 31 | """ 32 | md5_search = re.compile(r"preInit\|(.*?)\|block_cc") 33 | self.handle_html() 34 | x = lzstring.LZString() 35 | self.js_decode_value = x.decompressFromBase64(self.js_value) 36 | print(self.js_decode_value) 37 | self.md5_value = md5_search.search(self.js_decode_value).group(1) 38 | 39 | def handle_pic(self): 40 | """ 41 | 请求图片URL 42 | :return: 43 | """ 44 | self.handle_md5_value() 45 | pic_url = "https://i.hamreus.com/ps3/dp/yytzdcrhb_zfang/短篇/004 拷贝.jpg.webp?cid=446274&md5=%s"%self.md5_value 46 | print(pic_url) 47 | 48 | 49 | 50 | 51 | if __name__ == '__main__': 52 | manhuagui = Manhuagui() 53 | manhuagui.handle_pic() 54 | -------------------------------------------------------------------------------- /meituan/meishi_business/handle_meituan_business_page.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | import re 4 | from handle_meituan_business_detail import Meituanbusiness 5 | 6 | 7 | class MeituanBusinessPage(object): 8 | """ 9 | 解析美团美食页码页 10 | """ 11 | def __init__(self): 12 | self.index_url = "https://bj.meituan.com/meishi/pn1/" 13 | self.header = { 14 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 15 | } 16 | 17 | def handle_uuid(self): 18 | """ 19 | 获取UUID 20 | :return: uuid 21 | """ 22 | uuid_search = re.compile(r"uuid:\s'(.*?)',") 23 | uuid_response = requests.get(url=self.index_url,headers=self.header) 24 | self.uuid = uuid_search.search(uuid_response.text).group(1) 25 | 26 | 27 | def handle_page(self): 28 | """ 29 | 处理页码页 30 | :return: 31 | """ 32 | # self.handle_uuid() 33 | meituan_business_detail = Meituanbusiness() 34 | data_search = re.compile(r'"poiInfos":(.*?)},"comHeader"') 35 | for page in range(1,11): 36 | # token = handle_webdriver_meituan_token(page_num=page,uuid=self.uuid) 37 | # page_detail_url = "https://bj.meituan.com/meishi/api/poi/getPoiList?cityName=北京&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=%s&userId=&uuid=%s&platform=1&partner=126&originUrl=https://bj.meituan.com/meishi/pn%s/&riskLevel=1&optimusCode=10&_token=%s"%(page,self.uuid,page,token) 38 | # print(page_detail_url) 39 | # 构造页码页 40 | page_url = "http://bj.meituan.com/meishi/sales/pn%s/"%page 41 | page_response = requests.get(url=page_url,headers=self.header) 42 | data = data_search.search(page_response.text).group(1) 43 | for item in json.loads(data): 44 | #解析详情页 45 | meituan_business_detail.handle_detail(item['poiId']) 46 | break 47 | 48 | if __name__ == '__main__': 49 | meituan_business_page = MeituanBusinessPage() 50 | meituan_business_page.handle_page() 51 | -------------------------------------------------------------------------------- /autohome/koubei/handle_autohome_app_koubei.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from fontTools.ttLib import TTFont 3 | from lxml import etree 4 | import re 5 | 6 | 7 | class AutohomeKoubei(object): 8 | def __init__(self): 9 | self.detail_url = "https://k.m.autohome.com.cn/detail/share_01dmqy8fa168vkae9h60vg0000.html" 10 | self.header = { 11 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' 12 | } 13 | self.font_list = [" ","中","低","是","级","排","坐","硬","量","五","下","里","软","矮","八","档","灯","空","过","光","大","手","公","开","地","保","左","机","远","音","性","身","不","三","长","冷","的","泥","皮","二","当","右","了","门","高","和","有","油","味","呢","七","少","小","孩","坏","","电","多","养","动","六","来","加","控","只","副","响","耗","短","自","内","十","外","得","真","无","上","比","启","盘","一","好","雨","路","实","九","问","近","着","更","四","很"] 14 | 15 | def handle_font(self): 16 | ''' 17 | 首先获取ttf字体文件,写入本地 18 | :return: 19 | ''' 20 | response = requests.get(url=self.detail_url,headers=self.header) 21 | ttf_url_search = re.compile(r"src:url\('//(.*?)'\)\sformat\('woff'\);") 22 | ttf_url = 'http://'+ttf_url_search.search(response.text).group(1) 23 | ttf_response = requests.get(url=ttf_url,headers=self.header) 24 | with open('koubei.ttf','wb') as f: 25 | f.write(ttf_response.content) 26 | self.detail = response.text 27 | 28 | def handle_detail(self): 29 | ''' 30 | 处理网页返回数据,进行替换 31 | :return:老朋友的推荐,去看了一几个牌子,头都看晕了,没有结果,决定不了买哪个牌子,九了女儿意见,准备在荣威里面选盘款。性价上最高的就是I5了,看中这款的原因,并不是因为配置高,也不是养力强,而是囊中羞涩,预算控有那么电啊�,而荣威这个品牌过硬,质量可靠,故障率低,朋友买了都说挺一的。暂时没有,还是觉外有点说不过去啊!买车看车子做这个决定,是和女儿共同商量决定的,我看中的是这个牌子的知名度,品质这些方面,女儿的话是喜欢这款车型的十观,女孩子嘛,都是十貌协会,两厢车上较炫酷,十形时尚养感,适合年轻妹子。女儿盘看就中意了。 32 | ''' 33 | font_file = TTFont('koubei.ttf') 34 | # 找出字体和字体文件中编码的对应关系,保存为字典 35 | font_dict = dict(zip(font_file.getGlyphOrder(),self.font_list)) 36 | for key,value in font_dict.items(): 37 | self.detail = self.detail.replace("&#x"+key[3:].lower()+";",value) 38 | html = etree.HTML(self.detail) 39 | print(''.join(html.xpath("//div[@class='matter']/div[@class='item']//span/text()"))) 40 | 41 | 42 | if __name__ == '__main__': 43 | koubei = AutohomeKoubei() 44 | koubei.handle_font() 45 | koubei.handle_detail() -------------------------------------------------------------------------------- /maoyan/knn_font.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import operator 3 | 4 | def classify0(inX, dataSet, labels, k): 5 | #KNN 6 | dataSetSize = dataSet.shape[0] 7 | diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet 8 | sqDiffMat = diffMat**2 9 | sqDistances = sqDiffMat.sum(axis=1) 10 | distances = sqDistances**0.5 11 | sortedDistIndices = distances.argsort() 12 | classCount = {} 13 | for i in range(k): 14 | voteIlabel = labels[sortedDistIndices[i]] 15 | classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 16 | sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) 17 | return sortedClassCount[0][0] 18 | 19 | def file2matrix(): 20 | #构造训练集 21 | with open('fontdata.txt') as file: 22 | arrayOlines = file.readlines() 23 | numberOfLines = len(arrayOlines) 24 | returnMat = np.zeros((numberOfLines,200)) 25 | classLabelVector = [] 26 | index = 0 27 | for line in arrayOlines: 28 | line = line.strip() 29 | listFromLine = line.split('->') 30 | other = listFromLine[1] 31 | a = other.replace('(','').replace(')',"").replace('[','').replace(']','')[:-1].split(',') 32 | returnMat[index,:len(a)] = a 33 | if listFromLine[0] == '1': 34 | classLabelVector.append(1) 35 | elif listFromLine[0] == '2': 36 | classLabelVector.append(2) 37 | elif listFromLine[0] == '3': 38 | classLabelVector.append(3) 39 | elif listFromLine[0] == '4': 40 | classLabelVector.append(4) 41 | elif listFromLine[0] == '5': 42 | classLabelVector.append(5) 43 | elif listFromLine[0] == '6': 44 | classLabelVector.append(6) 45 | elif listFromLine[0] == '7': 46 | classLabelVector.append(7) 47 | elif listFromLine[0] == '8': 48 | classLabelVector.append(8) 49 | elif listFromLine[0] == '9': 50 | classLabelVector.append(9) 51 | elif listFromLine[0] == '0': 52 | classLabelVector.append(0) 53 | index += 1 54 | return returnMat,classLabelVector 55 | 56 | def classifyPerson(font): 57 | returnMats = np.zeros([200]) 58 | returnMats[:len(font)] = font 59 | # 格式化训练集 60 | datingDataMat, datingLabels = file2matrix() 61 | inArr = returnMats 62 | # 传入字体坐标,样本坐标,样本标签,常数 63 | classifierResult = classify0(inArr, datingDataMat, datingLabels, 1) 64 | return classifierResult -------------------------------------------------------------------------------- /nubia_bbs/nubia_bbs_from_overwrite_js/overwrite_js.py: -------------------------------------------------------------------------------- 1 | """ 2 | 掉头发!!! 3 | """ 4 | 5 | import requests 6 | import re 7 | 8 | #1、首先找到reload函数执行位置 9 | # var _0x23a392 = arg1[_0x55f3('0x19', '\x50\x67\x35\x34')](); 10 | # arg2 = _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')](_0x5e8b26); 11 | #2、多次运行发现_0x5e8b26值固定不变3000176000856006061501533003690027800375,需要破解_0x23a392,即unsbox 12 | 13 | 14 | 15 | 16 | def hexXor(): 17 | pass 18 | 19 | """ 20 | function() { 21 | var _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24]; 22 | var _0x4da0dc = []; 23 | var _0x12605e = ''; 24 | for (var _0x20a7bf = 0x0; _0x20a7bf < this['\x6c\x65\x6e\x67\x74\x68']; _0x20a7bf++) { 25 | var _0x385ee3 = this[_0x20a7bf]; 26 | for (var _0x217721 = 0x0; _0x217721 < _0x4b082b[_0x55f3('0x16', '\x61\x48\x2a\x4e')]; _0x217721++) { 27 | if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) { 28 | _0x4da0dc[_0x217721] = _0x385ee3; 29 | } 30 | } 31 | } 32 | _0x12605e = _0x4da0dc['\x6a\x6f\x69\x6e'](''); 33 | return _0x12605e; 34 | }; 35 | """ 36 | def unsbox(arg1): 37 | _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 38 | 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 39 | 0x22, 0x25, 0xc, 0x24] 40 | _0x4da0dc = [] 41 | _0x12605e = '' 42 | for _0x20a7bf in range(0, len(arg1)): 43 | _0x385ee3 = arg1[_0x20a7bf] 44 | for _0x217721 in range(0,len(_0x4b082b)): 45 | if _0x4b082b[_0x217721] == _0x20a7bf + 1: 46 | # _0x4da0dc[_0x217721] = _0x385ee3 47 | _0x4da0dc.append(_0x385ee3) 48 | _0x12605e = "".join(_0x4da0dc) 49 | return _0x12605e 50 | 51 | 52 | header = { 53 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 54 | } 55 | index_response = requests.get(url="https://bbs.nubia.cn/",headers=header) 56 | arg1_search = re.compile(r"arg1='(.*?)';") 57 | arg1 = arg1_search.search(index_response.text).group(1) 58 | -------------------------------------------------------------------------------- /uxin/README.md: -------------------------------------------------------------------------------- 1 | # 优信二手车JS逆向破解 2 | *** 3 | #### 文件列表: 4 | ##### uxin.js 破解JS 5 | ##### handle_uxin.py 使用pyexecjs读取破解JS,实现破解 6 | *** 7 | #### 逆向方法: 8 | ##### 1、解除无限debug,根据chrome开发者工具右侧调用顺序,将无限debug函数置空 9 | ```javascript 10 | _0x355d23 =function(){}; 11 | _0x4db1c = function(){}; 12 | ``` 13 | ##### 2、置空后下断点到arg2和arg1位置 14 | ```javascript 15 | var _0x23a392 = arg1[_0x55f3('0x19', '\x50\x67\x35\x34')](); 16 | arg2 = _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')](_0x5e8b26); 17 | ``` 18 | ##### 3、逐步调试最终定位到只需要如下代码即可得出_0x23a392 19 | ```javascript 20 | String['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65'][_0x55f3('0x14', '\x5a\x2a\x44\x4d')] = function() { 21 | var _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24]; 22 | var _0x4da0dc = []; 23 | var _0x12605e = ''; 24 | for (var _0x20a7bf = 0x0; _0x20a7bf < this['\x6c\x65\x6e\x67\x74\x68']; _0x20a7bf++) { 25 | var _0x385ee3 = this[_0x20a7bf]; 26 | for (var _0x217721 = 0x0; _0x217721 < _0x4b082b[_0x55f3('0x16', '\x61\x48\x2a\x4e')]; _0x217721++) { 27 | if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) { 28 | _0x4da0dc[_0x217721] = _0x385ee3; 29 | } 30 | } 31 | } 32 | _0x12605e = _0x4da0dc['\x6a\x6f\x69\x6e'](''); 33 | return _0x12605e; 34 | }; 35 | ``` 36 | ##### 4、经过多次调试发现,_0x5e8b26值固定,接着调试arg2 = _0x23a392\[_0x55f3\('0x1b', '\x7a\x35\x4f\x26'\)\]\(_0x5e8b26\);找到如下代码 37 | ```javascript 38 | String[_0x55f3('0x5', '\x6e\x5d\x66\x52')][_0x55f3('0x6', '\x50\x67\x35\x34')] = function(_0x4e08d8) { 39 | var _0x5a5d3b = ''; 40 | for (var _0xe89588 = 0x0; _0xe89588 < this[_0x55f3('0x8', '\x29\x68\x52\x63')] && _0xe89588 < _0x4e08d8[_0x55f3('0xa', '\x6a\x45\x26\x5e')]; _0xe89588 += 0x2) { 41 | var _0x401af1 = parseInt(this[_0x55f3('0xb', '\x56\x32\x4b\x45')](_0xe89588, _0xe89588 + 0x2), 0x10); 42 | var _0x105f59 = parseInt(_0x4e08d8[_0x55f3('0xd', '\x58\x4d\x57\x5e')](_0xe89588, _0xe89588 + 0x2), 0x10); 43 | var _0x189e2c = (_0x401af1 ^ _0x105f59)[_0x55f3('0xf', '\x57\x31\x46\x45')](0x10); 44 | if (_0x189e2c[_0x55f3('0x11', '\x4d\x47\x72\x76')] == 0x1) { 45 | _0x189e2c = '\x30' + _0x189e2c; 46 | } 47 | _0x5a5d3b += _0x189e2c; 48 | } 49 | return _0x5a5d3b; 50 | }; 51 | ``` 52 | ##### 5、逐步调试,最终得出arg2值 53 | ##### 6、uxin逆向JS方法和努比亚逆向方法相同,可以改为python代码 54 | 55 | *** 56 | #### 我在慕课网上主讲课程[Python爬虫工程师必学——App数据抓取实战](https://coding.imooc.com/class/283.html),还请各位大神多多支持. 57 | #### bug:dazhuang_python@sina.com 58 | -------------------------------------------------------------------------------- /cnvd/test.py: -------------------------------------------------------------------------------- 1 | import re 2 | import execjs 3 | import requests 4 | import json 5 | 6 | headers = { 7 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' 8 | '(KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', 9 | } 10 | url = 'https://www.cnvd.org.cn/shareData/download/718' 11 | 12 | requests_session = requests.session() 13 | 14 | # 第一个请求,response为第二个请求的__jsl_clearance_s 15 | response1 = requests_session.get(url=url, headers=headers) 16 | js1_search = re.compile(r"cookie=(.*?);location.href=") 17 | # js_response1 = """ 18 | # ('_')+('_')+('j')+('s')+('l')+('_')+('c')+('l')+('e')+('a')+('r')+('a')+('n')+('c')+('e')+('_')+('s')+('=')+(+!+[]+'')+(6+'')+(~~false+'')+(2+5+'')+(2+7+'')+(4+'')+([2]*(3)+'')+((1<<2)+'')+(2+'')+(4+'')+('.')+(+!+[]+'')+(-~[]+'')+(1+8+'')+('|')+('-')+(-~{}+'')+('|')+('O')+('a')+('g')+('S')+('G')+('F')+('W')+('C')+('d')+(-~{}+'')+((1+[4]>>1)+'')+(-~false+'')+('O')+((1<<3)+'')+('v')+('H')+(-~(4)+'')+('b')+('P')+('G')+(1+8+'')+('j')+((2)*[2]+'')+('N')+('H')+(1+5+'')+('s')+('%')+(1+2+'')+('D')+(';')+('m')+('a')+('x')+('-')+('a')+('g')+('e')+('=')+(3+'')+((1+[2])/[2]+'')+((+false)+'')+((+false)+'')+(';')+('p')+('a')+('t')+('h')+('=')+('/') 19 | # """ 20 | js1_result = js1_search.search(response1.text).group(1) 21 | __jsl_clearance_s = execjs.eval(js1_result).split(";")[0].split("=")[1] 22 | # __jsl_clearance_s = execjs.eval(js_response1).split(";")[0].split("=")[1] 23 | requests_session.cookies.set("__jsl_clearance_s", __jsl_clearance_s) 24 | # 第二次请求 25 | response2 = requests_session.get(url=url, headers=headers) 26 | print(response2.request.headers) 27 | sha1_sha256_md5 = json.loads(re.findall(r'};go\((.*?)\)', response2.text)[0]) 28 | # 判断cookie生成方式 29 | js_file = "" 30 | if sha1_sha256_md5['ha'] == 'sha1': 31 | js_file = 'sha1.js' 32 | elif sha1_sha256_md5['ha'] == 'sha256': 33 | js_file = 'sha256.js' 34 | elif sha1_sha256_md5['ha'] == 'md5': 35 | js_file = 'md5.js' 36 | 37 | 38 | parameter = { 39 | "bts": sha1_sha256_md5['bts'], 40 | "chars": sha1_sha256_md5['chars'], 41 | "ct": sha1_sha256_md5['ct'], 42 | "ha": sha1_sha256_md5['ha'], 43 | "tn": sha1_sha256_md5['tn'], 44 | "vt": sha1_sha256_md5['vt'], 45 | "wt": sha1_sha256_md5['wt'] 46 | } 47 | print(parameter) 48 | 49 | print(js_file) 50 | with open(js_file, "r", encoding="utf-8") as f: 51 | js = f.read() 52 | cmp = execjs.compile(js) 53 | end_js = cmp.call("go", parameter).split(";")[0].split("=")[1] 54 | requests_session.cookies.set("__jsl_clearance_s", end_js) 55 | 56 | response3 = requests_session.get(url=url, headers=headers) 57 | with open("test.xml", "w", encoding="utf-8") as f: 58 | f.write(response3.text) 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /dazhongdianping/handle_dianping_css_font.py: -------------------------------------------------------------------------------- 1 | import json 2 | import time 3 | import requests 4 | import re 5 | from fontTools.ttLib import TTFont 6 | from font_list import FONT_LIST 7 | from lxml import etree 8 | 9 | 10 | class HandleDianpingCssFont(object): 11 | def __init__(self): 12 | self.css_url = "http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/f33291305f85acfa9d7d61c58ca617e4.css" 13 | self.header = { 14 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' 15 | } 16 | 17 | def parse_css(self): 18 | """ 19 | 解析css文件,获取字体文件和css对应关系 20 | :return: 21 | """ 22 | font_url_search = re.compile(r'font-family: "(.*?)".*?,url\("//(s3plus\.meituan\.net/v1/.*?\.woff)"\)') 23 | css_font_response = requests.get(url=self.css_url,headers=self.header) 24 | #获取css名称和字体URL文件对应关系 25 | font_url_list = font_url_search.findall(css_font_response.text) 26 | for font_name,font_url in font_url_list: 27 | font_response = requests.get(url="http://"+font_url,headers=self.header) 28 | #将字体文件写入本地 29 | font_name = font_name.split("-")[-1]+".woff" 30 | with open(font_name,'wb') as f: 31 | f.write(font_response.content) 32 | time.sleep(1) 33 | self.parse_font(font_name) 34 | break 35 | 36 | def parse_font(self,file_name): 37 | """ 38 | 处理字体文件,保存字符编码和文字对应关系 39 | :param file_name: 40 | :return: 41 | """ 42 | font_file = TTFont(file_name) 43 | #找出字体和字体文件中编码的对应关系,保存为字典 44 | font_dict = json.dumps(dict(zip(font_file.getGlyphOrder(),FONT_LIST))) 45 | #写入本地,也可以写入数据库 46 | with open("font_dict",'w') as f: 47 | f.write(font_dict) 48 | 49 | def handle_business_detail(self): 50 | """ 51 | 请求大众点评页面 52 | :return: 53 | """ 54 | business_detail_url = "http://www.dianping.com/shop/103986366" 55 | response = requests.get(url=business_detail_url,headers=self.header) 56 | html = etree.HTML(response.text) 57 | #取营业时间 58 | time = html.xpath('//div[@class="other J-other Hide"]//span/svgmtsi/text()') 59 | #读取本地字体对应关系文件 60 | with open('font_dict','r') as f: 61 | f_read = json.loads(f.read()) 62 | for info in time: 63 | key = "uni"+json.dumps(info)[-5:][:-1] 64 | if key in f_read: 65 | print(f_read[key]) 66 | 67 | if __name__ == '__main__': 68 | #最终结果为 "周六周日为周一周五为" 69 | dianping = HandleDianpingCssFont() 70 | # dianping.parse_css() 71 | dianping.handle_business_detail() -------------------------------------------------------------------------------- /kongzhongwang/login_kongzhongwang.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import time 3 | import execjs 4 | import re 5 | 6 | class HandleKongzhongwang(object): 7 | def __init__(self): 8 | self.dc_url = "https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com" 9 | self.login_url = "https://passport.kongzhong.com/login" 10 | self.sso_kgzqrt_url = "https://sso.kongzhong.com/createQRCode" 11 | self.dc_value = "" 12 | self.kongzhongwang_session = requests.session() 13 | self.header = { 14 | "Connection":"keep-alive", 15 | "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36", 16 | "Accept":"*/*", 17 | "Referer":"https://passport.kongzhong.com/login", 18 | "Accept-Encoding":"gzip, deflate, br", 19 | "Accept-Language":"zh-CN,zh;q=0.9", 20 | } 21 | 22 | def handle_dc(self): 23 | """ 24 | 获取dc值 25 | :return: dc值 26 | """ 27 | dc_search = re.compile(r'"dc":"(.*?)"') 28 | #获取KSPSSIONID 29 | self.kongzhongwang_session.get(url=self.login_url,headers=self.header) 30 | #获取SSO-KGZQRT 31 | self.kongzhongwang_session.get(url=self.sso_kgzqrt_url,headers=self.header) 32 | response = self.kongzhongwang_session.get(url=self.dc_url,headers=self.header) 33 | self.dc_value = dc_search.search(response.text).group(1) 34 | 35 | 36 | def handle_password(self,password): 37 | ''' 38 | 处理密码 39 | :param password: 传入密码 40 | :return: 返回加密后密码 41 | ''' 42 | # 获取dc值 43 | self.handle_dc() 44 | #处理密码加密js文件 45 | with open('encrypt-js.js','r',encoding='utf-8') as f: 46 | f_js = execjs.compile(f.read()) 47 | encrypt_password = f_js.call('encrypt',password,self.dc_value) 48 | return encrypt_password 49 | 50 | def handle_login(self,username,password): 51 | """ 52 | 登录空中网 53 | :param username: 用户名 54 | :param password: 密码 55 | :return: 判断登录是否成功 56 | """ 57 | encrypt_password = self.handle_password(password) 58 | login_api = "https://sso.kongzhong.com/ajaxLogin?j=j&&type=1&service=https://passport.kongzhong.com/&username=%s&password=%s&vcode=&toSave=0&_=%s"%(username,encrypt_password,str(int(time.time()*1000))) 59 | print(login_api) 60 | response = self.kongzhongwang_session.get(url=login_api,headers=self.header) 61 | print(response.text) 62 | 63 | if __name__ == '__main__': 64 | kongzhongwang = HandleKongzhongwang() 65 | username = input("请输入用户名:") 66 | password = input("请输入密码:") 67 | kongzhongwang.handle_login(username,password) 68 | 69 | -------------------------------------------------------------------------------- /maoyan/handle_maoyan.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from fontTools.ttLib import TTFont 3 | import re 4 | from maoyan.knn_font import classifyPerson 5 | from lxml import etree 6 | import time 7 | 8 | 9 | 10 | class HandleMaoYan(object): 11 | def __init__(self,movie_id): 12 | self.url = "https://maoyan.com/films/%s"%movie_id 13 | self.header = { 14 | "Connection":"keep-alive", 15 | "Upgrade-Insecure-Requests":"1", 16 | "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36", 17 | "Sec-Fetch-Mode":"navigate", 18 | "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", 19 | "Sec-Fetch-Site":"none", 20 | "Accept-Encoding":"gzip, deflate, br", 21 | "Accept-Language":"zh-CN,zh;q=0.9", 22 | } 23 | 24 | def request_css_font(self): 25 | ''' 26 | 请求字体文件 27 | :return:当前网页源码 28 | ''' 29 | css_response = requests.get(url=self.url,headers=self.header) 30 | # 使用正则表达式匹配woff字体URL 31 | font_url_search = re.compile(r"\/\/.*?\.woff") 32 | font_url = font_url_search.search(css_response.text).group() 33 | if font_url: 34 | font_url = 'http:'+font_url 35 | #请求字体文件 36 | font_file_response = requests.get(url=font_url,headers=self.header) 37 | with open("maoyan.woff",'wb') as f: 38 | f.write(font_file_response.content) 39 | return css_response.text 40 | 41 | def handle_font(self): 42 | ''' 43 | 替换所有的加密字符 44 | :return: 45 | ''' 46 | html = self.request_css_font() 47 | base_font = TTFont('maoyan.woff') 48 | base_list = base_font.getGlyphOrder()[2:] 49 | 50 | font_dict = {} 51 | for font in base_list: 52 | # 获取字体坐标 53 | coordinate = base_font['glyf'][font].coordinates 54 | font_0 = [i for item in coordinate for i in item] 55 | # 使用k邻近值算法确定该坐标是哪个数字 56 | font_dict[font] = classifyPerson(font_0) 57 | 58 | for i in base_list: 59 | pattern = i.replace('uni','&#x').lower() + ';' 60 | html = html.replace(pattern,str(font_dict[i])) 61 | maoyan_html = etree.HTML(html) 62 | value = maoyan_html.xpath("//span[@class='stonefont']/text()") 63 | value_unit = maoyan_html.xpath("//span[@class='unit']/text()")[0] 64 | name = maoyan_html.xpath("//div[@class='movie-brief-container']/h3[@class='name']/text()")[0] 65 | info = {} 66 | info["电影名称"] = name 67 | info["用户评分"] = value[0] 68 | info["评分人数"] = value[1] 69 | info["累计票房"] = value[2] + value_unit 70 | info['url'] = self.url 71 | print(info) 72 | 73 | def woff_to_xml(self): 74 | base_font = TTFont('maoyan2.woff') 75 | base_font.saveXML('maoyan2.xml') 76 | 77 | 78 | 79 | 80 | 81 | if __name__ == '__main__': 82 | movie_id_list = ['1218029','345419','1230121','360504','503342'] 83 | for id in movie_id_list: 84 | maoyan = HandleMaoYan(movie_id=id) 85 | maoyan.handle_font() 86 | # maoyan.woff_to_xml() 87 | time.sleep(2) 88 | -------------------------------------------------------------------------------- /meituan/meishi_business/handle_meituan_business_detail.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import json 4 | from handle_mongo import meituan_mongo 5 | 6 | 7 | 8 | class Meituanbusiness(object): 9 | """ 10 | 处理美团商家详情页 11 | https://www.meituan.com/meishi/6484620/ 12 | """ 13 | def __init__(self): 14 | #MAC下的UA可用。。。 15 | self.header = { 16 | # "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" 17 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 18 | } 19 | 20 | def handle_detail(self,business_id): 21 | business_id = business_id 22 | self.business_detail_url = "https://www.meituan.com/meishi/%s/"%business_id 23 | response = requests.get(url=self.business_detail_url,headers=self.header) 24 | #提取数据区域 25 | data = re.search(r'12315消费争议(.*?)"dealList":', response.text, flags=re.DOTALL) 26 | if data: 27 | # 细节信息 28 | detail_info = re.search(r'"detailInfo":\{"poiId":(\d+),"name":"(.*?)","avgScore":(.*?),"address":"(.*?)","phone":"(.*?)","openTime":"(.*?)","extraInfos":\[(.*?)\],"hasFoodSafeInfo":(.*?),"longitude":(.*?),"latitude":(.*?),"avgPrice":(\d+),"brandId":(\d+),"brandName":"(.*?)",".*?photos":{"frontImgUrl":"(.*?)","albumImgUrls":(.*?)},"recommended":(.*?),"crumbNav":(.*?),"prefer',data.group(1)) 29 | if detail_info: 30 | info = {} 31 | # 商家ID 32 | info['poiId'] = detail_info.group(1) 33 | # 商家名称 34 | info['name'] = detail_info.group(2) 35 | #商家评分 36 | info['avgScore'] = detail_info.group(3) 37 | #商家地址 38 | info['address'] = detail_info.group(4) 39 | #电话 40 | info['phone'] = detail_info.group(5) 41 | #营业时间 42 | info['openTime'] = detail_info.group(6) 43 | #是否有食品安全档案 44 | info['hasFoodSafeInfo'] = detail_info.group(8) 45 | #经纬度 46 | info['longitude'] = detail_info.group(9) 47 | info['latitude'] = detail_info.group(10) 48 | #均价 49 | info['avgPrice'] = detail_info.group(11) 50 | # 品牌ID 51 | info['brandId'] = detail_info.group(12) 52 | # 品牌名称 53 | info['brandName'] = detail_info.group(13) 54 | #商家图片 55 | info['frontImgUrl'] = detail_info.group(14) 56 | #宣传图片 57 | info['albumImgUrls'] = detail_info.group(15) 58 | 59 | # 其他信息解析,wifi,停车位 60 | extraInfos = detail_info.group(7) 61 | if extraInfos: 62 | items = json.loads("[" + extraInfos + "]") 63 | extraInfos = '' 64 | for item in items: 65 | extraInfos = item.get('text') + ',' + extraInfos 66 | info['extraInfos'] = extraInfos[0:-2] 67 | # 推荐菜 68 | info['recommended'] = json.loads(detail_info.group(16)) 69 | meituan_mongo.handle_save_data(info) 70 | 71 | 72 | if __name__ == '__main__': 73 | meituan_business_detail = Meituanbusiness() 74 | meituan_business_detail.handle_detail("6484620") 75 | -------------------------------------------------------------------------------- /kongzhongwang/login-handler-kz-ums-3.0-min.js: -------------------------------------------------------------------------------- 1 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('d 1x={\'1y\':\'1f-1c-1w\',\'1d\':\'1u://1v.1f.1z\',\'c\':\'\',\'k\':\'\',\'h\':e,\'p\':e,\'K\':0,\'Z\':z,\'l\':z,\'1e\':n(){6.h=e;6.p=e;6.K=0;6.Z=M;},\'W\':n(s){6.1e();6.p=s;d 7="1a=j";9(6.c!=e&&C.E(6.c)!=""){7+="&c="+x(6.c)};9(6.k!=e&&C.E(6.k)!=""){7+="&k="+x(6.k)};9(6.l){7+="&l=1"};6.A(7)},\'A\':n(7){9(6.Z==z){N z};9(6.h!=e&&6.h["1b"]=="1"){d g={};g["o"]=6.h["o"];g["c"]=6.h["c"];g["17"]=M;g["F"]=6.h["F"];6.p(g);N z};d 12=6.1d+"/1D";C.1E({1C:z,12:12,D:\'1A\',1B:\'1a\',1a:\'j\',g:7,1o:"j",1n:1m,1r:n(1q){},1p:n(1s){}})},\'1F\':n(u){6.h=u;6.K=y.X(Y y());9(6.p!=e){d g={};9(u["1b"]=="0"){g["c"]=u["c"];g["17"]=z;g["1O"]=u["1N"];9(u["T"]!=e&&u["T"]=="1"){g["T"]=M}m{g["T"]=z}}m 9(u["1b"]=="1"){g["o"]=u["o"];g["c"]=u["c"];g["17"]=M};g["F"]=6.h["F"];6.p(g)};6.Z=M},\'1c\':n(o,r,w,t,s){d I=y.X(Y y())-6.K;9((I/14)>=13){6.h=e};9(6.h==e||6.h==""){6.W(n(g){6.p=s;d 7="";7+="&D=1";9(6.c!=e&&C.E(6.c)!=""){7+="&c="+x(6.c)};7+="&H="+o;7+="&V="+6.18(r,g["F"]);7+="&t="+t;9(w){7+="&q=1"}m{7+="&q=0"};9(6.k!=e&&C.E(6.k)!=""){7+="&k="+x(6.k)};9(6.l){7+="&l=1"};6.A(7)})}m{6.p=s;d 7="";7+="&D=1";9(6.c!=e&&C.E(6.c)!=""){7+="&c="+x(6.c)};7+="&H="+o;7+="&V="+6.18(r,6.h["F"]);7+="&t="+t;9(w){7+="&q=1"}m{7+="&q=0"};9(6.k!=e&&C.E(6.k)!=""){7+="&k="+x(6.k)};9(6.l){7+="&l=1"};6.A(7)}},\'1L\':n(o,Q,w,t,s){d I=y.X(Y y())-6.K;9((I/14)>=13){6.h=e};9(6.h==e||6.h==""){6.W(n(){6.p=s;d 7="";7+="&D=2";7+="&c="+6.c;7+="&H="+o;7+="&t="+t;7+="&Q="+Q;9(w){7+="&q=1"}m{7+="&q=0"};9(6.k!=e){7+="&k="+x(6.k)};9(6.l){7+="&l=1"};6.A(7)})}m{6.p=s;d 7="";7+="&D=2";7+="&c="+6.c;7+="&H="+o;7+="&t="+t;7+="&Q="+Q;9(w){7+="&q=1"}m{7+="&q=0"};9(6.k!=e){7+="&k="+x(6.k)};9(6.l){7+="&l=1"};6.A(7)}},\'1P\':n(o,r,w,s){d I=y.X(Y y())-6.K;9((I/14)>=13){6.h=e};9(6.h==e||6.h==""){6.W(n(){6.p=s;d 7="";7+="&D=1l";7+="&c="+6.c;7+="&H="+o;7+="&V="+r;9(w){7+="&q=1"}m{7+="&q=0"};9(6.l){7+="&l=1"};6.A(7)})}m{6.p=s;d 7="";7+="&D=1l";7+="&c="+6.c;7+="&H="+o;7+="&V="+r;9(w){7+="&q=1"}m{7+="&q=0"};9(6.l){7+="&l=1"};6.A(7)}},\'18\':n(15,r){9(r==e||r.v<=0){N e};d f="";1g(d i=0;i10){d a=f.1i(0,1);d b=f.1i(10,f.v);9(b.v>10){f=b}m{f=(11(a)+11(b)).O()}};f=(S*f+19)%U;d P="";d R="";1g(d i=0;i<15.v;i++){P=11(15.1h(i)^G.1k((f/U)*1t));9(P<16){R+="0"+P.O(16)}m R+=P.O(16);f=(S*f+19)%U};B=B.O(16);1j(B.v<8)B="0"+B;R+=B;N R}};',62,115,'||||||this|param||if|||service|var|null|prand|data|j_data|||targetService|renew|else|function|user|f_call_back|toSave|pwd|call_back|vcode|vData|length|to_save|decodeURIComponent|Date|false|exec_login|salt|jQuery|type|trim|dc|Math|username|tempTime|sPos|timestamp|charAt|true|return|toString|enc_chr|smscode|enc_str|mult|requirevcode|modu|password|check|parse|new|completed||parseInt|url|180|1000|str||logged|encrypt|incr|jsonp|state|login|loginServer|init|kongzhong|for|charCodeAt|substring|while|floor|101|5000|timeout|jsonpCallback|error|json|success|xhr|255|http|sso|agent|KZLoginHandler|id|com|post|dataType|async|ajaxLogin|ajax|jsonpCallbackKongZ|1000000000|100000000|31|random|round|login_sms|pow|kzmsg|errors|login_reg|ceil'.split('|'),0,{})) -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/meishi_business_scrapy/settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Scrapy settings for meishi_business_scrapy project 4 | # 5 | # For simplicity, this file contains only settings considered important or 6 | # commonly used. You can find more settings consulting the documentation: 7 | # 8 | # https://doc.scrapy.org/en/latest/topics/settings.html 9 | # https://doc.scrapy.org/en/latest/topics/downloader-middleware.html 10 | # https://doc.scrapy.org/en/latest/topics/spider-middleware.html 11 | 12 | BOT_NAME = 'meishi_business_scrapy' 13 | 14 | SPIDER_MODULES = ['meishi_business_scrapy.spiders'] 15 | NEWSPIDER_MODULE = 'meishi_business_scrapy.spiders' 16 | 17 | 18 | # Crawl responsibly by identifying yourself (and your website) on the user-agent 19 | USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' 20 | 21 | # Obey robots.txt rules 22 | ROBOTSTXT_OBEY = False 23 | 24 | # Configure maximum concurrent requests performed by Scrapy (default: 16) 25 | #CONCURRENT_REQUESTS = 32 26 | 27 | # Configure a delay for requests for the same website (default: 0) 28 | # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay 29 | # See also autothrottle settings and docs 30 | #DOWNLOAD_DELAY = 3 31 | # The download delay setting will honor only one of: 32 | #CONCURRENT_REQUESTS_PER_DOMAIN = 16 33 | #CONCURRENT_REQUESTS_PER_IP = 16 34 | 35 | # Disable cookies (enabled by default) 36 | #COOKIES_ENABLED = False 37 | 38 | # Disable Telnet Console (enabled by default) 39 | #TELNETCONSOLE_ENABLED = False 40 | 41 | # Override the default request headers: 42 | #DEFAULT_REQUEST_HEADERS = { 43 | # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 44 | # 'Accept-Language': 'en', 45 | #} 46 | 47 | # Enable or disable spider middlewares 48 | # See https://doc.scrapy.org/en/latest/topics/spider-middleware.html 49 | #SPIDER_MIDDLEWARES = { 50 | # 'meishi_business_scrapy.middlewares.MeishiBusinessScrapySpiderMiddleware': 543, 51 | #} 52 | 53 | # Enable or disable downloader middlewares 54 | # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html 55 | # DOWNLOADER_MIDDLEWARES = { 56 | # 'meishi_business_scrapy.middlewares.MeishiBusinessScrapyDownloaderMiddleware': 543, 57 | # } 58 | 59 | # Enable or disable extensions 60 | # See https://doc.scrapy.org/en/latest/topics/extensions.html 61 | #EXTENSIONS = { 62 | # 'scrapy.extensions.telnet.TelnetConsole': None, 63 | #} 64 | 65 | # Configure item pipelines 66 | # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html 67 | #ITEM_PIPELINES = { 68 | # 'meishi_business_scrapy.pipelines.MeishiBusinessScrapyPipeline': 300, 69 | #} 70 | 71 | # Enable and configure the AutoThrottle extension (disabled by default) 72 | # See https://doc.scrapy.org/en/latest/topics/autothrottle.html 73 | #AUTOTHROTTLE_ENABLED = True 74 | # The initial download delay 75 | #AUTOTHROTTLE_START_DELAY = 5 76 | # The maximum download delay to be set in case of high latencies 77 | #AUTOTHROTTLE_MAX_DELAY = 60 78 | # The average number of requests Scrapy should be sending in parallel to 79 | # each remote server 80 | #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 81 | # Enable showing throttling stats for every response received: 82 | #AUTOTHROTTLE_DEBUG = False 83 | 84 | # Enable and configure HTTP caching (disabled by default) 85 | # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings 86 | #HTTPCACHE_ENABLED = True 87 | #HTTPCACHE_EXPIRATION_SECS = 0 88 | #HTTPCACHE_DIR = 'httpcache' 89 | #HTTPCACHE_IGNORE_HTTP_CODES = [] 90 | #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' 91 | -------------------------------------------------------------------------------- /meituan/meishi_business/handle_meituan_business_page_token.py: -------------------------------------------------------------------------------- 1 | import zlib 2 | import re 3 | import requests 4 | import base64 5 | import time 6 | 7 | 8 | 9 | class MeituanToken(object): 10 | """ 11 | 美团token破解 12 | """ 13 | def __init__(self): 14 | self.index_url = "https://bj.meituan.com/meishi/" 15 | self.header = { 16 | # "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" 17 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 18 | } 19 | self.meituan_session = requests.session() 20 | 21 | def handle_uuid(self): 22 | """ 23 | 获取uuid 24 | :return: uuid 25 | """ 26 | uuid_search = re.compile(r"uuid:\s'(.*?)'") 27 | response = self.meituan_session.get(url=self.index_url,headers=self.header) 28 | self.uuid = uuid_search.search(response.text).group(1) 29 | 30 | #生成token 31 | def handle_token(self,value): 32 | """ 33 | 生成token 34 | :return: 加密后的token 35 | """ 36 | # 二进制编码 37 | encode = str(value).encode() 38 | # 二进制压缩 39 | compress = zlib.compress(encode) 40 | # base64编码 41 | b_encode = base64.b64encode(compress) 42 | # 转为字符串 43 | token = str(b_encode, encoding='utf-8') 44 | return token 45 | 46 | #发送请求验证 47 | def handle_page(self,page): 48 | """ 49 | 发送请求验证 50 | :return: 51 | """ 52 | #首先获取uuid 53 | self.handle_uuid() 54 | #拼接sign参数并加密 55 | sign_value = "areaId=0&cateId=0&cityName=北京&dinnerCountAttrId=&optimusCode=10&originUrl=https://bj.meituan.com/meishi/pn%s/&page=%s&partner=126&platform=1&riskLevel=1&sort=&userId=&uuid=%s"%(page,page,self.uuid) 56 | sign = self.handle_token(value=sign_value) 57 | time_ts = int(time.time() * 1000) 58 | #拼接token参数 59 | token_value = {"rId":100900,"ver":"1.0.6","ts":time_ts,"cts":time_ts+100,"brVD":[1034,616],"brR":[[1366,768],[1366,728],24,24],"bI":["https://bj.meituan.com/meishi/",""],"mT":[],"kT":[],"aT":[],"tT":[],"aM":"","sign":sign} 60 | print(token_value) 61 | token = self.handle_token(token_value) 62 | get_data_url = "https://bj.meituan.com/meishi/api/poi/getPoiList?cityName=北京&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=1&userId=&uuid=%s&platform=1&partner=126&originUrl=https://bj.meituan.com/meishi/&riskLevel=1&optimusCode=10&_token=%s"%(self.uuid,token) 63 | print(get_data_url) 64 | response = self.meituan_session.get(url=get_data_url,headers=self.header) 65 | print(response.text) 66 | 67 | 68 | #破解token加密字符串 69 | def decode_token(self): 70 | """ 71 | 破解token加密字符串 72 | :return: 明文token 73 | """ 74 | encry_token = "eJxdj1tvgjAYhv+Kd1yw2NJKQe8QddGpHD1nF9AxKXJQqYBb9t9HTbYlu/iS9336fMnXT+k6fZMGHQXCPoRPHamKrm2VlC7sEqntvBSvKlE1iHW1hzTSQvqP4gcNr+tRiw8KxL2nDlHI6wO6gh0UTFpHI3oLfwoSBfXEPNSpMKWY83M5ACBMulnE+C3Iu7TIQJvLmAFxkyTszBe2SKffFPwm/scW4j9irWTHXORoVqcJRcs6MZw4rJo5dXZsaHqjO7deCOqtqOlk1KxLFy0bmMB6BrPLdEgKQy7xm631bVd2DCbDdeUf+1NQTlQ8XjAQgvetjp6d3d3fn+O54inrS3NxZ9be0/1VLIcn6Nn5nN7l2L6kdsQtHNtGNd6wkSXHfnCv8vF1nx83Bl+71u2Ua5Xlm3ZxMt3V5iMBgJuTpixUtj37iwr3UzovUkSMpafSBak3PE3NRMcBCrThiI8jNmxQXb9X/oqF0tc32QyNhA==" 75 | # base64解码 76 | token_decode = base64.b64decode(encry_token.encode()) 77 | # 二进制解压 78 | token_string = zlib.decompress(token_decode) 79 | #其中的sign值的加密方法和token加密方法相同使用如下参数: 80 | #"areaId=0&cateId=0&cityName=北京&dinnerCountAttrId=&optimusCode=10&originUrl=https://bj.meituan.com/meishi/pn2/&page=2&partner=126&platform=1&riskLevel=1&sort=&userId=&uuid=42fa8d32-f530-4acd-8206-d6dd0bee2d6f" 81 | print(token_string.decode()) 82 | 83 | if __name__ == '__main__': 84 | meituan_page_token = MeituanToken() 85 | meituan_page_token.handle_page(page=1) 86 | # meituan_page_token.decode_token() 87 | -------------------------------------------------------------------------------- /cnvd/sha1.js: -------------------------------------------------------------------------------- 1 | function hash(_0x20318d) { 2 | function _0x1a7239(_0x4adb5, _0x383297) { 3 | return (_0x4adb5 & 2147483647) + (_0x383297 & 2147483647) ^ _0x4adb5 & 2147483648 ^ _0x383297 & 2147483648; 4 | } 5 | 6 | function _0x1f7462(_0x199638) { 7 | var _0x3a5325 = "0123456789abcdef"; 8 | var _0x20b325 = ""; 9 | 10 | for (var _0x5f0433 = 7; _0x5f0433 >= 0; _0x5f0433--) { 11 | _0x20b325 += _0x3a5325["charAt"](_0x199638 >> _0x5f0433 * 4 & 15); 12 | } 13 | 14 | return _0x20b325; 15 | } 16 | 17 | function _0x4a7dc4(_0x320d7d) { 18 | var _0x4702bb = (_0x320d7d["length"] + 8 >> 6) + 1, 19 | _0x2c9053 = new Array(_0x4702bb * 16); 20 | 21 | for (var _0x390523 = 0; _0x390523 < _0x4702bb * 16; _0x390523++) { 22 | _0x2c9053[_0x390523] = 0; 23 | } 24 | 25 | for (_0x390523 = 0; _0x390523 < _0x320d7d["length"]; _0x390523++) { 26 | _0x2c9053[_0x390523 >> 2] |= _0x320d7d["charCodeAt"](_0x390523) << 24 - (_0x390523 & 3) * 8; 27 | } 28 | 29 | _0x2c9053[_0x390523 >> 2] |= 128 << 24 - (_0x390523 & 3) * 8; 30 | _0x2c9053[_0x4702bb * 16 - 1] = _0x320d7d["length"] * 8; 31 | return _0x2c9053; 32 | } 33 | 34 | function _0xfdc9ef(_0x4c0a54, _0x3ffddd) { 35 | return _0x4c0a54 << _0x3ffddd | _0x4c0a54 >>> 32 - _0x3ffddd; 36 | } 37 | 38 | function _0x2aa763(_0x3197b1, _0x46d2a2, _0x1bd1b4, _0x4ba110) { 39 | if (_0x3197b1 < 20) { 40 | return _0x46d2a2 & _0x1bd1b4 | ~_0x46d2a2 & _0x4ba110; 41 | } 42 | 43 | if (_0x3197b1 < 40) { 44 | return _0x46d2a2 ^ _0x1bd1b4 ^ _0x4ba110; 45 | } 46 | 47 | if (_0x3197b1 < 60) { 48 | return _0x46d2a2 & _0x1bd1b4 | _0x46d2a2 & _0x4ba110 | _0x1bd1b4 & _0x4ba110; 49 | } 50 | 51 | return _0x46d2a2 ^ _0x1bd1b4 ^ _0x4ba110; 52 | } 53 | 54 | function _0x255856(_0x560d2d) { 55 | return _0x560d2d < 20 ? 1518500249 : _0x560d2d < 40 ? 1859775393 : _0x560d2d < 60 ? -1894007588 : -899497514; 56 | } 57 | 58 | var _0x4e08f5 = _0x4a7dc4(_0x20318d); 59 | 60 | var _0x177dc5 = new Array(80); 61 | 62 | var _0x4d85db = 1732584193; 63 | 64 | var _0x58a568 = -271733879; 65 | 66 | var _0x4c24a4 = -1732584194; 67 | 68 | var _0x3eef0e = 271733878; 69 | 70 | var _0x40ccda = -1009589776; 71 | 72 | for (var _0x60e373 = 0; _0x60e373 < _0x4e08f5["length"]; _0x60e373 += 16) { 73 | var _0x183dae = _0x4d85db; 74 | var _0x42daa1 = _0x58a568; 75 | var _0xe32d59 = _0x4c24a4; 76 | var _0x175c1c = _0x3eef0e; 77 | var _0x29806e = _0x40ccda; 78 | 79 | for (var _0x2d2564 = 0; _0x2d2564 < 80; _0x2d2564++) { 80 | if (_0x2d2564 < 16) { 81 | _0x177dc5[_0x2d2564] = _0x4e08f5[_0x60e373 + _0x2d2564]; 82 | } else { 83 | _0x177dc5[_0x2d2564] = _0xfdc9ef(_0x177dc5[_0x2d2564 - 3] ^ _0x177dc5[_0x2d2564 - 8] ^ _0x177dc5[_0x2d2564 - 14] ^ _0x177dc5[_0x2d2564 - 16], 1); 84 | } 85 | 86 | t = _0x1a7239(_0x1a7239(_0xfdc9ef(_0x4d85db, 5), _0x2aa763(_0x2d2564, _0x58a568, _0x4c24a4, _0x3eef0e)), _0x1a7239(_0x1a7239(_0x40ccda, _0x177dc5[_0x2d2564]), _0x255856(_0x2d2564))); 87 | _0x40ccda = _0x3eef0e; 88 | _0x3eef0e = _0x4c24a4; 89 | _0x4c24a4 = _0xfdc9ef(_0x58a568, 30); 90 | _0x58a568 = _0x4d85db; 91 | _0x4d85db = t; 92 | } 93 | 94 | _0x4d85db = _0x1a7239(_0x4d85db, _0x183dae); 95 | _0x58a568 = _0x1a7239(_0x58a568, _0x42daa1); 96 | _0x4c24a4 = _0x1a7239(_0x4c24a4, _0xe32d59); 97 | _0x3eef0e = _0x1a7239(_0x3eef0e, _0x175c1c); 98 | _0x40ccda = _0x1a7239(_0x40ccda, _0x29806e); 99 | } 100 | 101 | return _0x1f7462(_0x4d85db) + _0x1f7462(_0x58a568) + _0x1f7462(_0x4c24a4) + _0x1f7462(_0x3eef0e) + _0x1f7462(_0x40ccda); 102 | } 103 | 104 | function go(_0x56990c) { 105 | var _0x146119 = new Date(); 106 | 107 | function _0x12790c(_0x361f7f, _0x2cf202) { 108 | var _0x5d33de = _0x56990c["chars"]["length"]; 109 | 110 | for (var _0x1ea83a = 0; _0x1ea83a < _0x5d33de; _0x1ea83a++) { 111 | for (var _0x1dcbc7 = 0; _0x1dcbc7 < _0x5d33de; _0x1dcbc7++) { 112 | var _0x1ed1a3 = _0x2cf202[0] + _0x56990c["chars"]["substr"](_0x1ea83a, 1) + _0x56990c["chars"]["substr"](_0x1dcbc7, 1) + _0x2cf202[1]; 113 | 114 | if (hash(_0x1ed1a3) == _0x361f7f) { 115 | return [_0x1ed1a3, new Date() - _0x146119]; 116 | } 117 | } 118 | } 119 | } 120 | 121 | var _0x32ffc5 = _0x12790c(_0x56990c["ct"], _0x56990c["bts"]); 122 | 123 | if (_0x32ffc5) { 124 | var _0x4d7d74; 125 | 126 | if (_0x56990c["wt"]) { 127 | _0x4d7d74 = parseInt(_0x56990c["wt"]) > _0x32ffc5[1] ? parseInt(_0x56990c["wt"]) - _0x32ffc5[1] : 500; 128 | } else { 129 | _0x4d7d74 = 1500; 130 | } 131 | 132 | return _0x56990c["tn"] + "=" + _0x32ffc5[0] + ";Max-age=" + _0x56990c["vt"] + "; path = /"; 133 | 134 | }} -------------------------------------------------------------------------------- /meituan/meishi_business_scrapy/meishi_business_scrapy/spiders/meishi_business.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import scrapy 3 | import re 4 | import json 5 | 6 | 7 | class MeishiBusinessSpider(scrapy.Spider): 8 | """ 9 | 构造页码请求,返回商家ID,通过请求商家ID信息返回商家信息,推荐菜信息,评论信息等 10 | """ 11 | name = 'meishi_business' 12 | allowed_domains = ['meituan.com'] 13 | # start_urls = ['http://meituan.com/'] 14 | 15 | def start_requests(self): 16 | """ 17 | 构造页码请求 18 | :return: 19 | """ 20 | #模拟100页 21 | for page in range(1,100): 22 | page_url = "http://bj.meituan.com/meishi/sales/pn%s/" % page 23 | yield scrapy.Request(url=page_url,callback=self.handle_page_response) 24 | break 25 | 26 | def handle_page_response(self,response): 27 | """ 28 | 获取商家ID 29 | :param response:页码返回数据 30 | :return:商家详情页信息 31 | """ 32 | data_search = re.compile(r'"poiInfos":(.*?)},"comHeader"') 33 | data = data_search.search(response.text).group(1) 34 | for item in json.loads(data): 35 | # print(item['poiId']) 36 | business_detail_url = "https://www.meituan.com/meishi/%s/"%item['poiId'] 37 | yield scrapy.Request(url=business_detail_url,callback=self.handle_business_detail) 38 | #获取评论 39 | for offset in range(0,100,10): 40 | business_comment_url = "https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=4c075f52-c8ba-4116-b02d-5015c4ade7e5&platform=1&partner=126&originUrl=https://www.meituan.com/meishi/%s/&riskLevel=1&optimusCode=10&id=%s&userId=&offset=%s&pageSize=10&sortType=1"%(item['poiId'],item['poiId'],offset) 41 | yield scrapy.Request(url=business_comment_url,callback=self.handle_comment_response) 42 | break 43 | break 44 | 45 | 46 | def handle_business_detail(self,response): 47 | """ 48 | 解析商家详情页,获取商家信息和推荐菜信息 49 | :param response: 50 | :return: 51 | """ 52 | # 提取数据区域 53 | data = re.search(r'12315消费争议(.*?)"dealList":', response.text, flags=re.DOTALL) 54 | if data: 55 | # 细节信息 56 | detail_info = re.search( 57 | r'"detailInfo":\{"poiId":(\d+),"name":"(.*?)","avgScore":(.*?),"address":"(.*?)","phone":"(.*?)","openTime":"(.*?)","extraInfos":\[(.*?)\],"hasFoodSafeInfo":(.*?),"longitude":(.*?),"latitude":(.*?),"avgPrice":(\d+),"brandId":(\d+),"brandName":"(.*?)",".*?photos":{"frontImgUrl":"(.*?)","albumImgUrls":(.*?)},"recommended":(.*?),"crumbNav":(.*?),"prefer', 58 | data.group(1)) 59 | if detail_info: 60 | info = {} 61 | # 商家ID 62 | info['poiId'] = detail_info.group(1) 63 | # 商家名称 64 | info['name'] = detail_info.group(2) 65 | # 商家评分 66 | info['avgScore'] = detail_info.group(3) 67 | # 商家地址 68 | info['address'] = detail_info.group(4) 69 | # 电话 70 | info['phone'] = detail_info.group(5) 71 | # 营业时间 72 | info['openTime'] = detail_info.group(6) 73 | # 是否有食品安全档案 74 | info['hasFoodSafeInfo'] = detail_info.group(8) 75 | # 经纬度 76 | info['longitude'] = detail_info.group(9) 77 | info['latitude'] = detail_info.group(10) 78 | # 均价 79 | info['avgPrice'] = detail_info.group(11) 80 | # 品牌ID 81 | info['brandId'] = detail_info.group(12) 82 | # 品牌名称 83 | info['brandName'] = detail_info.group(13) 84 | # 商家图片 85 | info['frontImgUrl'] = detail_info.group(14) 86 | # 宣传图片 87 | info['albumImgUrls'] = detail_info.group(15) 88 | 89 | # 其他信息解析,wifi,停车位 90 | extraInfos = detail_info.group(7) 91 | if extraInfos: 92 | items = json.loads("[" + extraInfos + "]") 93 | extraInfos = '' 94 | for item in items: 95 | extraInfos = item.get('text') + ',' + extraInfos 96 | info['extraInfos'] = extraInfos[0:-2] 97 | # 推荐菜 98 | info['recommended'] = json.loads(detail_info.group(16)) 99 | print(info) 100 | else: 101 | print('提取数据失败,请查看详情页返回情况') 102 | print(response.text) 103 | 104 | def handle_comment_response(self,response): 105 | """ 106 | 评论返回数据 107 | :param response: 108 | :return: 109 | """ 110 | print(response.text) 111 | -------------------------------------------------------------------------------- /Qzone/handle_login_qzone.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | import re 4 | 5 | 6 | 7 | class LoginQzone(object): 8 | def __init__(self,username=None,password=None): 9 | self.username = username 10 | self.password = password 11 | self.qzone_session = requests.session() 12 | self.header = { 13 | "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36", 14 | } 15 | with open("decode_qzone_login.js",'r',encoding='utf-8') as f: 16 | js = f.read() 17 | self.decode_qzone_js = execjs.compile(js) 18 | 19 | def handle_login(self): 20 | """ 21 | 处理Qzone登录 22 | :return: 登录凭据 23 | """ 24 | #获取login_sig 25 | self.qzone_session.get(url="https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https://qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https://qzs.qzone.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=手机QQ空间&pt_qr_link=http://z.qzone.com/download.html&self_regurl=https://qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http://z.qzone.com/download.html&pt_no_auth=1",headers=self.header) 26 | login_sig = self.qzone_session.cookies.get_dict()['pt_login_sig'] 27 | #获取登录时提交的验证码等参数 28 | response_verifycode = self.qzone_session.get(url="https://ssl.ptlogin2.qq.com/check?regmaster=&pt_tea=2&pt_vcode=1&uin="+str(self.username)+"&appid=549000912&js_ver=19081313&js_type=1&login_sig="+login_sig+"&u1=https://qzs.qzone.qq.com/qzone/v5/loginsucc.html?para=izone&r=0.3936066541294625&pt_uistyle=40",headers=self.header) 29 | result_search = re.compile(r"(\(.*?\))") 30 | result_list = eval(result_search.search(response_verifycode.text).group(1)) 31 | v1,v2,v3,v4,v5,v6 = result_list 32 | verifycode = v2 33 | ptvfsession = v4 34 | ptdrvs = v6 35 | #密码 36 | password_encry_value = self.decode_qzone_js.call("test",self.password,v3,verifycode) 37 | login_url = "https://ssl.ptlogin2.qq.com/login?u="+str(self.username)+"&verifycode="+verifycode+"&pt_vcode_v1=0&pt_verifysession_v1="+ptvfsession+"&p="+password_encry_value+"&pt_randsalt=2&u1=https://qzs.qzone.qq.com/qzone/v5/loginsucc.html?para=izone&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=2-27-1567503686472&js_ver=19081313&js_type=1&login_sig="+login_sig+"&pt_uistyle=40&aid=549000912&daid=5&ptdrvs="+ptdrvs 38 | # print(login_url) 39 | #登录 40 | # print(self.qzone_session.cookies.get_dict()) 41 | response = self.qzone_session.get(url=login_url,headers=self.header) 42 | #若登录成功,则返回登录成功信息 43 | if '登录成功' in response.text: 44 | print("登录成功") 45 | self.sign = eval(result_search.search(response.text).group(1)) 46 | return True 47 | else: 48 | print(response.text) 49 | return False 50 | 51 | def handle_message(self): 52 | """ 53 | 发表说说 54 | :return: 55 | """ 56 | if self.handle_login(): 57 | v1,v2,v3,v4,v5,v6 = self.sign 58 | self.qzone_session.get(url=v3,headers=self.header) 59 | #查看登录后个人首页 60 | index_url = "https://user.qzone.qq.com/"+str(self.username) 61 | token_search = re.compile(r'try{return\s"(.*?)";') 62 | #需要在个人首页中找到token值 63 | index_response = self.qzone_session.get(url=index_url,headers=self.header) 64 | token = token_search.search(index_response.text).group(1) 65 | g_tk_value = self.decode_qzone_js.call("g_tk",self.qzone_session.cookies.get_dict()['p_skey']) 66 | post_message_url = "https://user.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_publish_v6?qzonetoken=%s&g_tk=%s"%(token,g_tk_value) 67 | data = { 68 | "syn_tweet_verson": 1, 69 | "paramstr": 1, 70 | "pic_template": "", 71 | "richtype": "", 72 | "richval": "", 73 | "special_url": "", 74 | "subrichtype": "", 75 | "who": 1, 76 | "con": "成功!---该条动态为:使用Python爬虫登录Qzone,并自动发送动态.代码详见:https://github.com/freedom-wy/js-reverse/tree/master/Qzone", 77 | "feedversion": 1, 78 | "ver": 1, 79 | "ugc_right": 1, 80 | "to_sign": 0, 81 | "hostuin": self.username, 82 | "code_version": 1, 83 | "format": "fs", 84 | "qzreferrer": index_url, 85 | } 86 | 87 | print(post_message_url,data,self.qzone_session.cookies.get_dict()) 88 | response = self.qzone_session.post(url=post_message_url,headers=self.header,data=data) 89 | print(response.text) 90 | 91 | if __name__ == '__main__': 92 | username = input("请输入QQ号码:") 93 | password = input("请输入QQ密码:") 94 | qzone = LoginQzone(username=username,password=password) 95 | # qzone.handle_login() 96 | qzone.handle_message() 97 | -------------------------------------------------------------------------------- /cnvd/sha256.js: -------------------------------------------------------------------------------- 1 | function hash(_0x2d2110) { 2 | var _0x2ec7bd = 8; 3 | var _0x5c938d = 0; 4 | 5 | function _0x598c37(_0x2a1e60, _0x3ca9e9) { 6 | var _0x49b932 = (_0x2a1e60 & 65535) + (_0x3ca9e9 & 65535); 7 | 8 | var _0x555a9d = (_0x2a1e60 >> 16) + (_0x3ca9e9 >> 16) + (_0x49b932 >> 16); 9 | 10 | return _0x555a9d << 16 | _0x49b932 & 65535; 11 | } 12 | 13 | function _0x5b3053(_0xa1a1f, _0x31bd51) { 14 | return _0xa1a1f >>> _0x31bd51 | _0xa1a1f << 32 - _0x31bd51; 15 | } 16 | 17 | function _0x45d7f8(_0x2b6a8c, _0x46c89b) { 18 | return _0x2b6a8c >>> _0x46c89b; 19 | } 20 | 21 | function _0x120a7e(_0x3ce1d8, _0x335a81, _0x9fc99f) { 22 | return _0x3ce1d8 & _0x335a81 ^ ~_0x3ce1d8 & _0x9fc99f; 23 | } 24 | 25 | function _0xe0523b(_0x1374b9, _0x9a92d2, _0x4ed035) { 26 | return _0x1374b9 & _0x9a92d2 ^ _0x1374b9 & _0x4ed035 ^ _0x9a92d2 & _0x4ed035; 27 | } 28 | 29 | function _0x495e31(_0x102159) { 30 | return _0x5b3053(_0x102159, 2) ^ _0x5b3053(_0x102159, 13) ^ _0x5b3053(_0x102159, 22); 31 | } 32 | 33 | function _0x1a88f9(_0x2c2406) { 34 | return _0x5b3053(_0x2c2406, 6) ^ _0x5b3053(_0x2c2406, 11) ^ _0x5b3053(_0x2c2406, 25); 35 | } 36 | 37 | function _0x160d7e(_0x2e2bf8) { 38 | return _0x5b3053(_0x2e2bf8, 7) ^ _0x5b3053(_0x2e2bf8, 18) ^ _0x45d7f8(_0x2e2bf8, 3); 39 | } 40 | 41 | function _0x5e3ba6(_0x13170c) { 42 | return _0x5b3053(_0x13170c, 17) ^ _0x5b3053(_0x13170c, 19) ^ _0x45d7f8(_0x13170c, 10); 43 | } 44 | 45 | function _0x29813b(_0x2ec52c, _0x17e7cb) { 46 | var _0x960ccd = new Array(1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298); 47 | 48 | var _0x9df09b = new Array(1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225); 49 | 50 | var _0xb3bfde = new Array(64); 51 | 52 | var _0x3b6059, _0x18ae0e, _0x5817f8, _0x5e21a0, _0x485d46, _0x1a1c4f, _0xc5e18c, _0x80f4d, _0x5dd8e1, _0x514628; 53 | 54 | var _0x5c155c, _0xfeb574; 55 | 56 | _0x2ec52c[_0x17e7cb >> 5] |= 128 << 24 - _0x17e7cb % 32; 57 | _0x2ec52c[(_0x17e7cb + 64 >> 9 << 4) + 15] = _0x17e7cb; 58 | 59 | for (var _0x5dd8e1 = 0; _0x5dd8e1 < _0x2ec52c["length"]; _0x5dd8e1 += 16) { 60 | _0x3b6059 = _0x9df09b[0]; 61 | _0x18ae0e = _0x9df09b[1]; 62 | _0x5817f8 = _0x9df09b[2]; 63 | _0x5e21a0 = _0x9df09b[3]; 64 | _0x485d46 = _0x9df09b[4]; 65 | _0x1a1c4f = _0x9df09b[5]; 66 | _0xc5e18c = _0x9df09b[6]; 67 | _0x80f4d = _0x9df09b[7]; 68 | 69 | for (var _0x514628 = 0; _0x514628 < 64; _0x514628++) { 70 | if (_0x514628 < 16) { 71 | _0xb3bfde[_0x514628] = _0x2ec52c[_0x514628 + _0x5dd8e1]; 72 | } else { 73 | _0xb3bfde[_0x514628] = _0x598c37(_0x598c37(_0x598c37(_0x5e3ba6(_0xb3bfde[_0x514628 - 2]), _0xb3bfde[_0x514628 - 7]), _0x160d7e(_0xb3bfde[_0x514628 - 15])), _0xb3bfde[_0x514628 - 16]); 74 | } 75 | 76 | _0x5c155c = _0x598c37(_0x598c37(_0x598c37(_0x598c37(_0x80f4d, _0x1a88f9(_0x485d46)), _0x120a7e(_0x485d46, _0x1a1c4f, _0xc5e18c)), _0x960ccd[_0x514628]), _0xb3bfde[_0x514628]); 77 | _0xfeb574 = _0x598c37(_0x495e31(_0x3b6059), _0xe0523b(_0x3b6059, _0x18ae0e, _0x5817f8)); 78 | _0x80f4d = _0xc5e18c; 79 | _0xc5e18c = _0x1a1c4f; 80 | _0x1a1c4f = _0x485d46; 81 | _0x485d46 = _0x598c37(_0x5e21a0, _0x5c155c); 82 | _0x5e21a0 = _0x5817f8; 83 | _0x5817f8 = _0x18ae0e; 84 | _0x18ae0e = _0x3b6059; 85 | _0x3b6059 = _0x598c37(_0x5c155c, _0xfeb574); 86 | } 87 | 88 | _0x9df09b[0] = _0x598c37(_0x3b6059, _0x9df09b[0]); 89 | _0x9df09b[1] = _0x598c37(_0x18ae0e, _0x9df09b[1]); 90 | _0x9df09b[2] = _0x598c37(_0x5817f8, _0x9df09b[2]); 91 | _0x9df09b[3] = _0x598c37(_0x5e21a0, _0x9df09b[3]); 92 | _0x9df09b[4] = _0x598c37(_0x485d46, _0x9df09b[4]); 93 | _0x9df09b[5] = _0x598c37(_0x1a1c4f, _0x9df09b[5]); 94 | _0x9df09b[6] = _0x598c37(_0xc5e18c, _0x9df09b[6]); 95 | _0x9df09b[7] = _0x598c37(_0x80f4d, _0x9df09b[7]); 96 | } 97 | 98 | return _0x9df09b; 99 | } 100 | 101 | function _0x5ba792(_0x43a789) { 102 | var _0x3b7b58 = Array(); 103 | 104 | var _0x3cba2b = 255; 105 | 106 | for (var _0x1b124e = 0; _0x1b124e < _0x43a789["length"] * _0x2ec7bd; _0x1b124e += _0x2ec7bd) { 107 | _0x3b7b58[_0x1b124e >> 5] |= (_0x43a789["charCodeAt"](_0x1b124e / _0x2ec7bd) & _0x3cba2b) << 24 - _0x1b124e % 32; 108 | } 109 | 110 | return _0x3b7b58; 111 | } 112 | 113 | function _0x5f26fd(_0x4144cb) { 114 | var _0x1ae422 = new RegExp("\n", "g"); 115 | 116 | _0x4144cb = _0x4144cb["replace"](_0x1ae422, "\n"); 117 | var _0xbdbc42 = ""; 118 | 119 | for (var _0x4761db = 0; _0x4761db < _0x4144cb["length"]; _0x4761db++) { 120 | var _0x5246a7 = _0x4144cb["charCodeAt"](_0x4761db); 121 | 122 | if (_0x5246a7 < 128) { 123 | _0xbdbc42 += String["fromCharCode"](_0x5246a7); 124 | } else { 125 | if (_0x5246a7 > 127 && _0x5246a7 < 2048) { 126 | _0xbdbc42 += String["fromCharCode"](_0x5246a7 >> 6 | 192); 127 | _0xbdbc42 += String["fromCharCode"](_0x5246a7 & 63 | 128); 128 | } else { 129 | _0xbdbc42 += String["fromCharCode"](_0x5246a7 >> 12 | 224); 130 | _0xbdbc42 += String["fromCharCode"](_0x5246a7 >> 6 & 63 | 128); 131 | _0xbdbc42 += String["fromCharCode"](_0x5246a7 & 63 | 128); 132 | } 133 | } 134 | } 135 | 136 | return _0xbdbc42; 137 | } 138 | 139 | function _0x572657(_0x278d0b) { 140 | var _0x1540ad = "0123456789abcdef"; 141 | var _0x3e8bab = ""; 142 | 143 | for (var _0x305be1 = 0; _0x305be1 < _0x278d0b["length"] * 4; _0x305be1++) { 144 | _0x3e8bab += _0x1540ad["charAt"](_0x278d0b[_0x305be1 >> 2] >> (3 - _0x305be1 % 4) * 8 + 4 & 15) + _0x1540ad["charAt"](_0x278d0b[_0x305be1 >> 2] >> (3 - _0x305be1 % 4) * 8 & 15); 145 | } 146 | 147 | return _0x3e8bab; 148 | } 149 | 150 | _0x2d2110 = _0x5f26fd(_0x2d2110); 151 | return _0x572657(_0x29813b(_0x5ba792(_0x2d2110), _0x2d2110["length"] * _0x2ec7bd)); 152 | } 153 | 154 | function go(_0x3f18bd) { 155 | var _0x305909 = new Date(); 156 | 157 | function _0x827b22(_0x1e3ccf, _0x2f24f4) { 158 | var _0x438ba9 = _0x3f18bd["chars"]["length"]; 159 | 160 | for (var _0x578790 = 0; _0x578790 < _0x438ba9; _0x578790++) { 161 | for (var _0x290f3c = 0; _0x290f3c < _0x438ba9; _0x290f3c++) { 162 | var _0x40b20b = _0x2f24f4[0] + _0x3f18bd["chars"]["substr"](_0x578790, 1) + _0x3f18bd["chars"]["substr"](_0x290f3c, 1) + _0x2f24f4[1]; 163 | 164 | if (hash(_0x40b20b) == _0x1e3ccf) { 165 | return [_0x40b20b, new Date() - _0x305909]; 166 | } 167 | } 168 | } 169 | } 170 | 171 | var _0x4e6d7c = _0x827b22(_0x3f18bd["ct"], _0x3f18bd["bts"]); 172 | 173 | if (_0x4e6d7c) { 174 | var _0x26f531; 175 | 176 | if (_0x3f18bd["wt"]) { 177 | _0x26f531 = parseInt(_0x3f18bd["wt"]) > _0x4e6d7c[1] ? parseInt(_0x3f18bd["wt"]) - _0x4e6d7c[1] : 500; 178 | } else { 179 | _0x26f531 = 1500; 180 | } 181 | 182 | return _0x3f18bd["tn"] + "=" + _0x4e6d7c[0] + ";Max-age=" + _0x3f18bd["vt"] + "; path = /"; 183 | } 184 | } 185 | -------------------------------------------------------------------------------- /guazi/guazi.js: -------------------------------------------------------------------------------- 1 | function safeAdd(x, y) { 2 | var lsw = (x & 0xFFFF) + (y & 0xFFFF); 3 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 4 | return (msw << 16) | (lsw & 0xFFFF) 5 | } 6 | 7 | function bitRotateLeft(num, cnt) { 8 | return (num << cnt) | (num >>> (32 - cnt)) 9 | } 10 | 11 | function cmn(q, a, b, x, s, t) { 12 | return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) 13 | } 14 | 15 | function ff(a, b, c, d, x, s, t) { 16 | return cmn((b & c) | ((~b) & d), a, b, x, s, t) 17 | } 18 | 19 | function gg(a, b, c, d, x, s, t) { 20 | return cmn((b & d) | (c & (~d)), a, b, x, s, t) 21 | } 22 | 23 | function hh(a, b, c, d, x, s, t) { 24 | return cmn(b ^ c ^ d, a, b, x, s, t) 25 | } 26 | 27 | function ii(a, b, c, d, x, s, t) { 28 | return cmn(c ^ (b | (~d)), a, b, x, s, t) 29 | } 30 | 31 | function binl(x, len) { 32 | x[len >> 5] |= 0x80 << (len % 32); 33 | x[(((len + 64) >>> 9) << 4) + 14] = len; 34 | var i; 35 | var olda; 36 | var oldb; 37 | var oldc; 38 | var oldd; 39 | var a = 1732584193; 40 | var b = -271733879; 41 | var c = -1732584194; 42 | var d = 271733878; 43 | for (i = 0; i < x.length; i += 16) { 44 | olda = a; 45 | oldb = b; 46 | oldc = c; 47 | oldd = d; 48 | a = ff(a, b, c, d, x[i], 7, -680876936); 49 | d = ff(d, a, b, c, x[i + 1], 12, -389564586); 50 | c = ff(c, d, a, b, x[i + 2], 17, 606105819); 51 | b = ff(b, c, d, a, x[i + 3], 22, -1044525330); 52 | a = ff(a, b, c, d, x[i + 4], 7, -176418897); 53 | d = ff(d, a, b, c, x[i + 5], 12, 1200080426); 54 | c = ff(c, d, a, b, x[i + 6], 17, -1473231341); 55 | b = ff(b, c, d, a, x[i + 7], 22, -45705983); 56 | a = ff(a, b, c, d, x[i + 8], 7, 1770035416); 57 | d = ff(d, a, b, c, x[i + 9], 12, -1958414417); 58 | c = ff(c, d, a, b, x[i + 10], 17, -42063); 59 | b = ff(b, c, d, a, x[i + 11], 22, -1990404162); 60 | a = ff(a, b, c, d, x[i + 12], 7, 1804603682); 61 | d = ff(d, a, b, c, x[i + 13], 12, -40341101); 62 | c = ff(c, d, a, b, x[i + 14], 17, -1502002290); 63 | b = ff(b, c, d, a, x[i + 15], 22, 1236535329); 64 | a = gg(a, b, c, d, x[i + 1], 5, -165796510); 65 | d = gg(d, a, b, c, x[i + 6], 9, -1069501632); 66 | c = gg(c, d, a, b, x[i + 11], 14, 643717713); 67 | b = gg(b, c, d, a, x[i], 20, -373897302); 68 | a = gg(a, b, c, d, x[i + 5], 5, -701558691); 69 | d = gg(d, a, b, c, x[i + 10], 9, 38016083); 70 | c = gg(c, d, a, b, x[i + 15], 14, -660478335); 71 | b = gg(b, c, d, a, x[i + 4], 20, -405537848); 72 | a = gg(a, b, c, d, x[i + 9], 5, 568446438); 73 | d = gg(d, a, b, c, x[i + 14], 9, -1019803690); 74 | c = gg(c, d, a, b, x[i + 3], 14, -187363961); 75 | b = gg(b, c, d, a, x[i + 8], 20, 1163531501); 76 | a = gg(a, b, c, d, x[i + 13], 5, -1444681467); 77 | d = gg(d, a, b, c, x[i + 2], 9, -51403784); 78 | c = gg(c, d, a, b, x[i + 7], 14, 1735328473); 79 | b = gg(b, c, d, a, x[i + 12], 20, -1926607734); 80 | a = hh(a, b, c, d, x[i + 5], 4, -378558); 81 | d = hh(d, a, b, c, x[i + 8], 11, -2022574463); 82 | c = hh(c, d, a, b, x[i + 11], 16, 1839030562); 83 | b = hh(b, c, d, a, x[i + 14], 23, -35309556); 84 | a = hh(a, b, c, d, x[i + 1], 4, -1530992060); 85 | d = hh(d, a, b, c, x[i + 4], 11, 1272893353); 86 | c = hh(c, d, a, b, x[i + 7], 16, -155497632); 87 | b = hh(b, c, d, a, x[i + 10], 23, -1094730640); 88 | a = hh(a, b, c, d, x[i + 13], 4, 681279174); 89 | d = hh(d, a, b, c, x[i], 11, -358537222); 90 | c = hh(c, d, a, b, x[i + 3], 16, -722521979); 91 | b = hh(b, c, d, a, x[i + 6], 23, 76029189); 92 | a = hh(a, b, c, d, x[i + 9], 4, -640364487); 93 | d = hh(d, a, b, c, x[i + 12], 11, -421815835); 94 | c = hh(c, d, a, b, x[i + 15], 16, 530742520); 95 | b = hh(b, c, d, a, x[i + 2], 23, -995338651); 96 | a = ii(a, b, c, d, x[i], 6, -198630844); 97 | d = ii(d, a, b, c, x[i + 7], 10, 1126891415); 98 | c = ii(c, d, a, b, x[i + 14], 15, -1416354905); 99 | b = ii(b, c, d, a, x[i + 5], 21, -57434055); 100 | a = ii(a, b, c, d, x[i + 12], 6, 1700485571); 101 | d = ii(d, a, b, c, x[i + 3], 10, -1894986606); 102 | c = ii(c, d, a, b, x[i + 10], 15, -1051523); 103 | b = ii(b, c, d, a, x[i + 1], 21, -2054922799); 104 | a = ii(a, b, c, d, x[i + 8], 6, 1873313359); 105 | d = ii(d, a, b, c, x[i + 15], 10, -30611744); 106 | c = ii(c, d, a, b, x[i + 6], 15, -1560198380); 107 | b = ii(b, c, d, a, x[i + 13], 21, 1309151649); 108 | a = ii(a, b, c, d, x[i + 4], 6, -145523070); 109 | d = ii(d, a, b, c, x[i + 11], 10, -1120210379); 110 | c = ii(c, d, a, b, x[i + 2], 15, 718787259); 111 | b = ii(b, c, d, a, x[i + 9], 21, -343485551); 112 | a = safeAdd(a, olda); 113 | b = safeAdd(b, oldb); 114 | c = safeAdd(c, oldc); 115 | d = safeAdd(d, oldd) 116 | } 117 | return [a, b, c, d] 118 | } 119 | 120 | function binl2rstr(input) { 121 | var i; 122 | var output = ''; 123 | var length32 = input.length * 32; 124 | for (i = 0; i < length32; i += 8) { 125 | output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF) 126 | } 127 | return output 128 | } 129 | 130 | function rstr2binl(input) { 131 | var i; 132 | var output = []; 133 | output[(input.length >> 2) - 1] = undefined; 134 | for (i = 0; i < output.length; i += 1) { 135 | output[i] = 0 136 | } 137 | var length8 = input.length * 8; 138 | for (i = 0; i < length8; i += 8) { 139 | output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32) 140 | } 141 | return output 142 | } 143 | 144 | function rstr(s) { 145 | return binl2rstr(binl(rstr2binl(s), s.length * 8)) 146 | } 147 | 148 | function rstrHMAC(key, data) { 149 | var i; 150 | var bkey = rstr2binl(key); 151 | var ipad = []; 152 | var opad = []; 153 | var hash; 154 | ipad[15] = opad[15] = undefined; 155 | if (bkey.length > 16) { 156 | bkey = binl(bkey, key.length * 8) 157 | } 158 | for (i = 0; i < 16; i += 1) { 159 | ipad[i] = bkey[i] ^ 0x36363636; 160 | opad[i] = bkey[i] ^ 0x5C5C5C5C 161 | } 162 | hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8); 163 | return binl2rstr(binl(opad.concat(hash), 512 + 128)) 164 | } 165 | 166 | function rstr2hex(input) { 167 | var hexTab = '0123456789abcdef'; 168 | var output = ''; 169 | var x; 170 | var i; 171 | for (i = 0; i < input.length; i += 1) { 172 | x = input.charCodeAt(i); 173 | output += hexTab.charAt((x >>> 4) & 0x0F) + hexTab.charAt(x & 0x0F) 174 | } 175 | return output 176 | } 177 | 178 | function str2rstrUTF8(input) { 179 | return unescape(encodeURIComponent(input)) 180 | } 181 | 182 | function raw(s) { 183 | return rstr(str2rstrUTF8(s)) 184 | } 185 | 186 | function hex(s) { 187 | return rstr2hex(raw(s)) 188 | } 189 | 190 | function uid() { 191 | var text = ""; 192 | var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 193 | var len = Math.floor(Math.random() * 2); 194 | for (var i = 0; i < len; i++) { 195 | text += possible.charAt(Math.floor(Math.random() * possible.length)) 196 | } 197 | return text 198 | } 199 | 200 | function charRun(s) { 201 | s = s.replace(/[a-zA-Z]/g, '#'); 202 | var arr = s.split(''); 203 | for (var i = 0; i < arr.length; i++) { 204 | if (arr[i] == '#') { 205 | arr[i] = uid() 206 | } 207 | } 208 | return arr.join('') 209 | } 210 | 211 | function anti(string, key) { 212 | var estring = hex(string); 213 | return charRun(estring) 214 | } -------------------------------------------------------------------------------- /dazhongdianping/font_list.py: -------------------------------------------------------------------------------- 1 | FONT_LIST = [ 2 | '', 3 | '`', 4 | '1', 5 | '2', 6 | '3', 7 | '4', 8 | '5', 9 | '6', 10 | '7', 11 | '8', 12 | '9', 13 | '0', 14 | '店', 15 | '中', 16 | '美', 17 | '家', 18 | '馆', 19 | '小', 20 | '车', 21 | '大', 22 | '市', 23 | '公', 24 | '酒', 25 | '行', 26 | '国', 27 | '品', 28 | '发', 29 | '电', 30 | '金', 31 | '心', 32 | '业', 33 | '商', 34 | '司', 35 | '超', 36 | '生', 37 | '装', 38 | '园', 39 | '场', 40 | '食', 41 | '有', 42 | '新', 43 | '限', 44 | '天', 45 | '面', 46 | '工', 47 | '服', 48 | '海', 49 | '华', 50 | '水', 51 | '房', 52 | '饰', 53 | '城', 54 | '乐', 55 | '汽', 56 | '香', 57 | '部', 58 | '利', 59 | '子', 60 | '老', 61 | '艺', 62 | '花', 63 | '专', 64 | '东', 65 | '肉', 66 | '菜', 67 | '学', 68 | '福', 69 | '饭', 70 | '人', 71 | '百', 72 | '餐', 73 | '茶', 74 | '务', 75 | '通', 76 | '味', 77 | '所', 78 | '山', 79 | '区', 80 | '门', 81 | '药', 82 | '银', 83 | '农', 84 | '龙', 85 | '停', 86 | '尚', 87 | '安', 88 | '广', 89 | '鑫', 90 | '一', 91 | '容', 92 | '动', 93 | '南', 94 | '具', 95 | '源', 96 | '兴', 97 | '鲜', 98 | '记', 99 | '时', 100 | '机', 101 | '烤', 102 | '文', 103 | '康', 104 | '信', 105 | '果', 106 | '阳', 107 | '理', 108 | '锅', 109 | '宝', 110 | '达', 111 | '地', 112 | '儿', 113 | '衣', 114 | '特', 115 | '产', 116 | '西', 117 | '批', 118 | '坊', 119 | '州', 120 | '牛', 121 | '佳', 122 | '化', 123 | '五', 124 | '米', 125 | '修', 126 | '爱', 127 | '北', 128 | '养', 129 | '卖', 130 | '建', 131 | '材', 132 | '三', 133 | '会', 134 | '鸡', 135 | '室', 136 | '红', 137 | '站', 138 | '德', 139 | '王', 140 | '光', 141 | '名', 142 | '丽', 143 | '油', 144 | '院', 145 | '堂', 146 | '烧', 147 | '江', 148 | '社', 149 | '合', 150 | '星', 151 | '货', 152 | '型', 153 | '村', 154 | '自', 155 | '科', 156 | '快', 157 | '便', 158 | '日', 159 | '民', 160 | '营', 161 | '和', 162 | '活', 163 | '童', 164 | '明', 165 | '器', 166 | '烟', 167 | '育', 168 | '宾', 169 | '精', 170 | '屋', 171 | '经', 172 | '居', 173 | '庄', 174 | '石', 175 | '顺', 176 | '林', 177 | '尔', 178 | '县', 179 | '手', 180 | '厅', 181 | '销', 182 | '用', 183 | '好', 184 | '客', 185 | '火', 186 | '雅', 187 | '盛', 188 | '体', 189 | '旅', 190 | '之', 191 | '鞋', 192 | '辣', 193 | '作', 194 | '粉', 195 | '包', 196 | '楼', 197 | '校', 198 | '鱼', 199 | '平', 200 | '彩', 201 | '上', 202 | '吧', 203 | '保', 204 | '永', 205 | '万', 206 | '物', 207 | '教', 208 | '吃', 209 | '设', 210 | '医', 211 | '正', 212 | '造', 213 | '丰', 214 | '健', 215 | '点', 216 | '汤', 217 | '网', 218 | '庆', 219 | '技', 220 | '斯', 221 | '洗', 222 | '料', 223 | '配', 224 | '汇', 225 | '木', 226 | '缘', 227 | '加', 228 | '麻', 229 | '联', 230 | '卫', 231 | '川', 232 | '泰', 233 | '色', 234 | '世', 235 | '方', 236 | '寓', 237 | '风', 238 | '幼', 239 | '羊', 240 | '烫', 241 | '来', 242 | '高', 243 | '厂', 244 | '兰', 245 | '阿', 246 | '贝', 247 | '皮', 248 | '全', 249 | '女', 250 | '拉', 251 | '成', 252 | '云', 253 | '维', 254 | '贸', 255 | '道', 256 | '术', 257 | '运', 258 | '都', 259 | '口', 260 | '博', 261 | '河', 262 | '瑞', 263 | '宏', 264 | '京', 265 | '际', 266 | '路', 267 | '祥', 268 | '青', 269 | '镇', 270 | '厨', 271 | '培', 272 | '力', 273 | '惠', 274 | '连', 275 | '马', 276 | '鸿', 277 | '钢', 278 | '训', 279 | '影', 280 | '甲', 281 | '助', 282 | '窗', 283 | '布', 284 | '富', 285 | '牌', 286 | '头', 287 | '四', 288 | '多', 289 | '妆', 290 | '吉', 291 | '苑', 292 | '沙', 293 | '恒', 294 | '隆', 295 | '春', 296 | '干', 297 | '饼', 298 | '氏', 299 | '里', 300 | '二', 301 | '管', 302 | "诚", 303 | "制", 304 | "售", 305 | "嘉", 306 | "长", 307 | "轩", 308 | "杂", 309 | "副", 310 | "清", 311 | "计", 312 | "黄", 313 | "讯", 314 | "太", 315 | "鸭", 316 | "号", 317 | "街", 318 | "交", 319 | "与", 320 | "叉", 321 | "附", 322 | "近", 323 | "层", 324 | "旁", 325 | "对", 326 | "巷", 327 | "栋", 328 | "环", 329 | "省", 330 | "桥", 331 | "湖", 332 | "段", 333 | "乡", 334 | "厦", 335 | "府", 336 | "铺", 337 | "内", 338 | "侧", 339 | "元", 340 | "购", 341 | "前", 342 | "幢", 343 | "滨", 344 | "处", 345 | "向", 346 | "座", 347 | "下", 348 | "県", 349 | "凤", 350 | "港", 351 | "开", 352 | "关", 353 | "景", 354 | "泉", 355 | "塘", 356 | "放", 357 | "昌", 358 | "线", 359 | "湾", 360 | "政", 361 | "步", 362 | "宁", 363 | "解", 364 | "白", 365 | "田", 366 | "町", 367 | "溪", 368 | "十", 369 | "八", 370 | "古", 371 | "双", 372 | "胜", 373 | "本", 374 | "单", 375 | "同", 376 | "九", 377 | "迎", 378 | "第", 379 | "台", 380 | "玉", 381 | "锦", 382 | "底", 383 | "后", 384 | "七", 385 | "斜", 386 | "期", 387 | "武", 388 | "岭", 389 | "松", 390 | "角", 391 | "纪", 392 | "朝", 393 | "峰", 394 | "六", 395 | "振", 396 | "珠", 397 | "局", 398 | "岗", 399 | "洲", 400 | "横", 401 | "边", 402 | "济", 403 | "井", 404 | "办", 405 | "汉", 406 | "代", 407 | "临", 408 | "弄", 409 | "团", 410 | "外", 411 | "塔", 412 | "杨", 413 | "铁", 414 | "浦", 415 | "字", 416 | "年", 417 | "岛", 418 | "陵", 419 | "原", 420 | "梅", 421 | "进", 422 | "荣", 423 | "友", 424 | "虹", 425 | "央", 426 | "桂", 427 | "沿", 428 | "事", 429 | "津", 430 | "凯", 431 | "莲", 432 | "丁", 433 | "秀", 434 | "柳", 435 | "集", 436 | "紫", 437 | "旗", 438 | "张", 439 | "谷", 440 | "的", 441 | "是", 442 | "不", 443 | "了", 444 | "很", 445 | "还", 446 | "个", 447 | "也", 448 | "这", 449 | "我", 450 | "就", 451 | "在", 452 | "以", 453 | "可", 454 | "到", 455 | "错", 456 | "没", 457 | "去", 458 | "过", 459 | "感", 460 | "次", 461 | "要", 462 | "比", 463 | "觉", 464 | "看", 465 | "得", 466 | "说", 467 | "常", 468 | "真", 469 | "们", 470 | "但", 471 | "最", 472 | "喜", 473 | "哈", 474 | "么", 475 | "别", 476 | "位", 477 | "能", 478 | "较", 479 | "境", 480 | "非", 481 | "为", 482 | "欢", 483 | "然", 484 | "他", 485 | "挺", 486 | "着", 487 | "价", 488 | "那", 489 | "意", 490 | "种", 491 | "想", 492 | "出", 493 | "员", 494 | "两", 495 | "推", 496 | "做", 497 | "排", 498 | "实", 499 | "分", 500 | "间", 501 | "甜", 502 | "度", 503 | "起", 504 | "满", 505 | "给", 506 | "热", 507 | "完", 508 | "格", 509 | "荐", 510 | "喝", 511 | "等", 512 | "其", 513 | "再", 514 | "几", 515 | "只", 516 | "现", 517 | "朋", 518 | "候", 519 | "样", 520 | "直", 521 | "而", 522 | "买", 523 | "于", 524 | "般", 525 | "豆", 526 | "量", 527 | "选", 528 | "奶", 529 | "打", 530 | "每", 531 | "评", 532 | "少", 533 | "算", 534 | "又", 535 | "因", 536 | "情", 537 | "找", 538 | "些", 539 | "份", 540 | "置", 541 | "适", 542 | "什", 543 | "蛋", 544 | "师", 545 | "气", 546 | "你", 547 | "姐", 548 | "棒", 549 | "试", 550 | "总", 551 | "定", 552 | "啊", 553 | "足", 554 | "级", 555 | "整", 556 | "带", 557 | "虾", 558 | "如", 559 | "态", 560 | "且", 561 | "尝", 562 | "主", 563 | "话", 564 | "强", 565 | "当", 566 | "更", 567 | "板", 568 | "知", 569 | "己", 570 | "无", 571 | "酸", 572 | "让", 573 | "入", 574 | "啦", 575 | "式", 576 | "笑", 577 | "赞", 578 | "片", 579 | "酱", 580 | "差", 581 | "像", 582 | "提", 583 | "队", 584 | "走", 585 | "嫩", 586 | "才", 587 | "刚", 588 | "午", 589 | "接", 590 | "重", 591 | "串", 592 | "回", 593 | "晚", 594 | "微", 595 | "周", 596 | "值", 597 | "费", 598 | "性", 599 | "桌", 600 | "拍", 601 | "跟", 602 | "块", 603 | "调", 604 | "糕" 605 | ] 606 | 607 | if __name__ == '__main__': 608 | print(len(FONT_LIST)) -------------------------------------------------------------------------------- /kongzhongwang/login-handler.js: -------------------------------------------------------------------------------- 1 | var KZLoginHandler = { 2 | 'id': 'kongzhong-login-agent', 3 | 'loginServer': 'http://sso.kongzhong.com', 4 | 'service': '', 5 | 'targetService': '', 6 | 'j_data': null, 7 | 'f_call_back': null, 8 | 'timestamp': 0, 9 | 'completed': false, 10 | 'renew': false, 11 | 'init': function() { 12 | this.j_data = null; 13 | this.f_call_back = null; 14 | this.timestamp = 0; 15 | this.completed = true; 16 | }, 17 | 'check': function(call_back) { 18 | this.init(); 19 | this.f_call_back = call_back; 20 | var param = "jsonp=j"; 21 | if (this.service != null && jQuery.trim(this.service) != "") { 22 | param += "&service=" + decodeURIComponent(this.service) 23 | }; 24 | if (this.targetService != null && jQuery.trim(this.targetService) != "") { 25 | param += "&targetService=" + decodeURIComponent(this.targetService) 26 | }; 27 | if (this.renew) { 28 | param += "&renew=1" 29 | }; 30 | this.exec_login(param) 31 | }, 32 | 'exec_login': function(param) { 33 | if (this.completed == false) { 34 | return false 35 | }; 36 | if (this.j_data != null && this.j_data["state"] == "1") { 37 | var data = {}; 38 | data["user"] = this.j_data["user"]; 39 | data["service"] = this.j_data["service"]; 40 | data["logged"] = true; 41 | data["dc"] = this.j_data["dc"]; 42 | this.f_call_back(data); 43 | return false 44 | }; 45 | var url = this.loginServer + "/ajaxLogin"; 46 | jQuery.ajax({ 47 | async: false, 48 | url: url, 49 | type: 'post', 50 | dataType: 'jsonp', 51 | jsonp: 'j', 52 | data: param, 53 | jsonpCallback: "j", 54 | timeout: 5000, 55 | success: function(json) {}, 56 | error: function(xhr) {} 57 | }) 58 | }, 59 | 'jsonpCallbackKongZ': function(vData) { 60 | this.j_data = vData; 61 | this.timestamp = Date.parse(new Date()); 62 | if (this.f_call_back != null) { 63 | var data = {}; 64 | if (vData["state"] == "0") { 65 | data["service"] = vData["service"]; 66 | data["logged"] = false; 67 | data["errors"] = vData["kzmsg"]; 68 | if (vData["requirevcode"] != null && vData["requirevcode"] == "1") { 69 | data["requirevcode"] = true 70 | } else { 71 | data["requirevcode"] = false 72 | } 73 | } else if (vData["state"] == "1") { 74 | data["user"] = vData["user"]; 75 | data["service"] = vData["service"]; 76 | data["logged"] = true 77 | }; 78 | data["dc"] = this.j_data["dc"]; 79 | this.f_call_back(data) 80 | }; 81 | this.completed = true 82 | }, 83 | 'login': function(user, pwd, to_save, vcode, call_back) { 84 | // 获取时间戳 85 | var tempTime = Date.parse(new Date()) - this.timestamp; 86 | if ((tempTime / 1000) >= 180) { 87 | this.j_data = null 88 | }; 89 | if (this.j_data == null || this.j_data == "") { 90 | // 调用check函数 91 | this.check(function(data) { 92 | this.f_call_back = call_back; 93 | var param = ""; 94 | // 拼接URL 95 | param += "&type=1"; 96 | if (this.service != null && jQuery.trim(this.service) != "") { 97 | param += "&service=" + decodeURIComponent(this.service) 98 | }; 99 | // 拼接URL 100 | param += "&username=" + user; 101 | // 调用encrypt函数,传入密码和dc字段,返回加密后的密码 102 | // dc为https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=时间戳返回的dc值 103 | param += "&password=" + this.encrypt(pwd, data["dc"]); 104 | param += "&vcode=" + vcode; 105 | if (to_save) { 106 | param += "&toSave=1" 107 | } else { 108 | param += "&toSave=0" 109 | }; 110 | if (this.targetService != null && jQuery.trim(this.targetService) != "") { 111 | param += "&targetService=" + decodeURIComponent(this.targetService) 112 | }; 113 | if (this.renew) { 114 | param += "&renew=1" 115 | }; 116 | this.exec_login(param) 117 | }) 118 | } else { 119 | this.f_call_back = call_back; 120 | var param = ""; 121 | param += "&type=1"; 122 | if (this.service != null && jQuery.trim(this.service) != "") { 123 | param += "&service=" + decodeURIComponent(this.service) 124 | }; 125 | param += "&username=" + user; 126 | param += "&password=" + this.encrypt(pwd, this.j_data["dc"]); 127 | param += "&vcode=" + vcode; 128 | if (to_save) { 129 | param += "&toSave=1" 130 | } else { 131 | param += "&toSave=0" 132 | }; 133 | if (this.targetService != null && jQuery.trim(this.targetService) != "") { 134 | param += "&targetService=" + decodeURIComponent(this.targetService) 135 | }; 136 | if (this.renew) { 137 | param += "&renew=1" 138 | }; 139 | this.exec_login(param) 140 | } 141 | }, 142 | 'login_sms': function(user, smscode, to_save, vcode, call_back) { 143 | var tempTime = Date.parse(new Date()) - this.timestamp; 144 | if ((tempTime / 1000) >= 180) { 145 | this.j_data = null 146 | }; 147 | if (this.j_data == null || this.j_data == "") { 148 | this.check(function() { 149 | this.f_call_back = call_back; 150 | var param = ""; 151 | param += "&type=2"; 152 | param += "&service=" + this.service; 153 | param += "&username=" + user; 154 | param += "&vcode=" + vcode; 155 | param += "&smscode=" + smscode; 156 | if (to_save) { 157 | param += "&toSave=1" 158 | } else { 159 | param += "&toSave=0" 160 | }; 161 | if (this.targetService != null) { 162 | param += "&targetService=" + decodeURIComponent(this.targetService) 163 | }; 164 | if (this.renew) { 165 | param += "&renew=1" 166 | }; 167 | this.exec_login(param) 168 | }) 169 | } else { 170 | this.f_call_back = call_back; 171 | var param = ""; 172 | param += "&type=2"; 173 | param += "&service=" + this.service; 174 | param += "&username=" + user; 175 | param += "&vcode=" + vcode; 176 | param += "&smscode=" + smscode; 177 | if (to_save) { 178 | param += "&toSave=1" 179 | } else { 180 | param += "&toSave=0" 181 | }; 182 | if (this.targetService != null) { 183 | param += "&targetService=" + decodeURIComponent(this.targetService) 184 | }; 185 | if (this.renew) { 186 | param += "&renew=1" 187 | }; 188 | this.exec_login(param) 189 | } 190 | }, 191 | 'login_reg': function(user, pwd, to_save, call_back) { 192 | var tempTime = Date.parse(new Date()) - this.timestamp; 193 | if ((tempTime / 1000) >= 180) { 194 | this.j_data = null 195 | }; 196 | if (this.j_data == null || this.j_data == "") { 197 | this.check(function() { 198 | this.f_call_back = call_back; 199 | var param = ""; 200 | param += "&type=101"; 201 | param += "&service=" + this.service; 202 | param += "&username=" + user; 203 | param += "&password=" + pwd; 204 | if (to_save) { 205 | param += "&toSave=1" 206 | } else { 207 | param += "&toSave=0" 208 | }; 209 | if (this.renew) { 210 | param += "&renew=1" 211 | }; 212 | this.exec_login(param) 213 | }) 214 | } else { 215 | this.f_call_back = call_back; 216 | var param = ""; 217 | param += "&type=101"; 218 | param += "&service=" + this.service; 219 | param += "&username=" + user; 220 | param += "&password=" + pwd; 221 | if (to_save) { 222 | param += "&toSave=1" 223 | } else { 224 | param += "&toSave=0" 225 | }; 226 | if (this.renew) { 227 | param += "&renew=1" 228 | }; 229 | this.exec_login(param) 230 | } 231 | }, 232 | 'encrypt': function(str, pwd) { 233 | // 判空 234 | if (pwd == null || pwd.length <= 0) { 235 | return null 236 | }; 237 | var prand = ""; 238 | for (var i = 0; i < pwd.length; i++) { 239 | // 返回密码的Unicode编码 240 | prand += pwd.charCodeAt(i).toString() 241 | }; 242 | var sPos = Math.floor(prand.length / 5); 243 | var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5)); 244 | var incr = Math.ceil(pwd.length / 2); 245 | var modu = Math.pow(2, 31) - 1; 246 | if (mult < 2) { 247 | return null 248 | }; 249 | var salt = Math.round(Math.random() * 1000000000) % 100000000; 250 | prand += salt; 251 | while (prand.length > 10) { 252 | var a = prand.substring(0, 1); 253 | var b = prand.substring(10, prand.length); 254 | if (b.length > 10) { 255 | prand = b 256 | } else { 257 | prand = (parseInt(a) + parseInt(b)).toString() 258 | } 259 | }; 260 | prand = (mult * prand + incr) % modu; 261 | var enc_chr = ""; 262 | var enc_str = ""; 263 | for (var i = 0; i < str.length; i++) { 264 | enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255)); 265 | if (enc_chr < 16) { 266 | enc_str += "0" + enc_chr.toString(16) 267 | } else enc_str += enc_chr.toString(16); 268 | prand = (mult * prand + incr) % modu 269 | }; 270 | salt = salt.toString(16); 271 | while (salt.length < 8) salt = "0" + salt; 272 | enc_str += salt; 273 | return enc_str 274 | } 275 | }; -------------------------------------------------------------------------------- /dazhongdianping/font_dict: -------------------------------------------------------------------------------- 1 | {"glyph00000": "", "x": "`", "unif71a": "1", "unie009": "2", "unie415": "3", "unie77f": "4", "unie8dc": "5", "unif08e": "6", "unie613": "7", "unif764": "8", "unie048": "9", "unie956": "0", "unie47e": "\u5e97", "unie8bf": "\u4e2d", "uniea1d": "\u7f8e", "unie649": "\u5bb6", "unif81f": "\u9986", "unie6f2": "\u5c0f", "unieab1": "\u8f66", "unie81c": "\u5927", "unie325": "\u5e02", "uniead1": "\u516c", "unie14a": "\u9152", "uniee76": "\u884c", "unied1d": "\u56fd", "unif0ae": "\u54c1", "unie32f": "\u53d1", "unief03": "\u7535", "unie9e9": "\u91d1", "unie9b1": "\u5fc3", "unif2b7": "\u4e1a", "unif7d1": "\u5546", "unieb4d": "\u53f8", "unif1ff": "\u8d85", "unif293": "\u751f", "unie4d4": "\u88c5", "unif725": "\u56ed", "unie44b": "\u573a", "unif3c9": "\u98df", "unif7c0": "\u6709", "unie828": "\u65b0", "unie79c": "\u9650", "unif402": "\u5929", "unif512": "\u9762", "unief3c": "\u5de5", "uniea6b": "\u670d", "unieb81": "\u6d77", "unif6ff": "\u534e", "unif330": "\u6c34", "unif397": "\u623f", "unif1d2": "\u9970", "unif152": "\u57ce", "unie7f0": "\u4e50", "unie0e3": "\u6c7d", "uniee97": "\u9999", "unie335": "\u90e8", "unif277": "\u5229", "unieb70": "\u5b50", "unif3db": "\u8001", "unie317": "\u827a", "unieabd": "\u82b1", "unie2c9": "\u4e13", "unif5ed": "\u4e1c", "unie06d": "\u8089", "unie271": "\u83dc", "uniefd7": "\u5b66", "unieaf9": "\u798f", "unieed1": "\u996d", "uniee19": "\u4eba", "uniee86": "\u767e", "unie538": "\u9910", "unie96c": "\u8336", "unie90f": "\u52a1", "unif175": "\u901a", "unie0e6": "\u5473", "unieea6": "\u6240", "unif726": "\u5c71", "unie51e": "\u533a", "unief71": "\u95e8", "uniedc0": "\u836f", "unie087": "\u94f6", "uniea9f": "\u519c", "uniedb2": "\u9f99", "unif5ea": "\u505c", "unif3e0": "\u5c1a", "unie7bf": "\u5b89", "unie2c4": "\u5e7f", "unif09d": "\u946b", "unif8cf": "\u4e00", "unif839": "\u5bb9", "unie9f7": "\u52a8", "unif128": "\u5357", "uniee38": "\u5177", "uniea2c": "\u6e90", "unif5e4": "\u5174", "unif4d6": "\u9c9c", "unif75d": "\u8bb0", "unif8c7": "\u65f6", "unie911": "\u673a", "unif3cf": "\u70e4", "unie63c": "\u6587", "unif758": "\u5eb7", "unif4c2": "\u4fe1", "unif691": "\u679c", "unif459": "\u9633", "unif887": "\u7406", "uniebee": "\u9505", "unif01a": "\u5b9d", "unie5c1": "\u8fbe", "unif7f4": "\u5730", "unie500": "\u513f", "unif5dd": "\u8863", "unif503": "\u7279", "unie738": "\u4ea7", "unie188": "\u897f", "unie08d": "\u6279", "uniee62": "\u574a", "unif0fb": "\u5dde", "unif6df": "\u725b", "unieef9": "\u4f73", "unif7f9": "\u5316", "unif13d": "\u4e94", "uniee7d": "\u7c73", "unieac2": "\u4fee", "unie57c": "\u7231", "unif3da": "\u5317", "unie3c9": "\u517b", "unieda1": "\u5356", "unieeb3": "\u5efa", "unif6bf": "\u6750", "unie1b9": "\u4e09", "unie363": "\u4f1a", "unie3e0": "\u9e21", "unieaef": "\u5ba4", "unied2a": "\u7ea2", "unie4ad": "\u7ad9", "unied05": "\u5fb7", "unif2f3": "\u738b", "unief5b": "\u5149", "unie646": "\u540d", "unie512": "\u4e3d", "unie89c": "\u6cb9", "unif801": "\u9662", "uniea84": "\u5802", "unie531": "\u70e7", "unif338": "\u6c5f", "unif340": "\u793e", "unif4b3": "\u5408", "uniedb5": "\u661f", "unif05b": "\u8d27", "unief36": "\u578b", "unieaa1": "\u6751", "unif142": "\u81ea", "uniec92": "\u79d1", "unie4c2": "\u5feb", "unif5b2": "\u4fbf", "unif792": "\u65e5", "unif651": "\u6c11", "unie5d7": "\u8425", "unied8a": "\u548c", "unif60f": "\u6d3b", "unif7c8": "\u7ae5", "unif106": "\u660e", "uniea9a": "\u5668", "unieb63": "\u70df", "unieabf": "\u80b2", "unie03f": "\u5bbe", "unif841": "\u7cbe", "unif234": "\u5c4b", "unie1b6": "\u7ecf", "unieaec": "\u5c45", "unie077": "\u5e84", "uniec49": "\u77f3", "unie606": "\u987a", "unie2ee": "\u6797", "uniea1c": "\u5c14", "uniebd9": "\u53bf", "uniecf6": "\u624b", "unie22a": "\u5385", "unif7b9": "\u9500", "uniea6a": "\u7528", "unie0a4": "\u597d", "unie2a4": "\u5ba2", "unie330": "\u706b", "unif5f7": "\u96c5", "unied9d": "\u76db", "unif50a": "\u4f53", "unif6d3": "\u65c5", "unif0f5": "\u4e4b", "unieaac": "\u978b", "unie453": "\u8fa3", "unie581": "\u4f5c", "uniea0c": "\u7c89", "unie64a": "\u5305", "unie9bb": "\u697c", "unie19f": "\u6821", "unie107": "\u9c7c", "unie225": "\u5e73", "unie0ca": "\u5f69", "unieab3": "\u4e0a", "unif028": "\u5427", "unie093": "\u4fdd", "unif5d1": "\u6c38", "unif29e": "\u4e07", "uniec31": "\u7269", "unie5cc": "\u6559", "unie148": "\u5403", "unie76e": "\u8bbe", "unie308": "\u533b", "unie8a2": "\u6b63", "unif273": "\u9020", "unie302": "\u4e30", "unie053": "\u5065", "unie2e3": "\u70b9", "unif578": "\u6c64", "unie4ae": "\u7f51", "unif342": "\u5e86", "unie700": "\u6280", "unieba5": "\u65af", "unif254": "\u6d17", "unif49b": "\u6599", "unieb9b": "\u914d", "unieb56": "\u6c47", "unie57f": "\u6728", "unie87a": "\u7f18", "unie779": "\u52a0", "unie0f7": "\u9ebb", "unie8e9": "\u8054", "uniedeb": "\u536b", "unif057": "\u5ddd", "unif242": "\u6cf0", "unie2a7": "\u8272", "unif7f3": "\u4e16", "unif750": "\u65b9", "unie76f": "\u5bd3", "unif495": "\u98ce", "unif878": "\u5e7c", "unie15b": "\u7f8a", "unif110": "\u70eb", "unif685": "\u6765", "unif84f": "\u9ad8", "uniea3d": "\u5382", "uniea20": "\u5170", "unie5e2": "\u963f", "unie0f4": "\u8d1d", "uniec59": "\u76ae", "unie354": "\u5168", "unif5aa": "\u5973", "unie233": "\u62c9", "unif077": "\u6210", "uniea97": "\u4e91", "unif45b": "\u7ef4", "unif0d7": "\u8d38", "unif2b0": "\u9053", "uniec65": "\u672f", "unied37": "\u8fd0", "unie04f": "\u90fd", "unif474": "\u53e3", "uniea4a": "\u535a", "unieb44": "\u6cb3", "unif5e2": "\u745e", "unie885": "\u5b8f", "unif53a": "\u4eac", "unif1ac": "\u9645", "unie9f1": "\u8def", "uniec15": "\u7965", "unif2bb": "\u9752", "unie05c": "\u9547", "unif5f8": "\u53a8", "uniec46": "\u57f9", "uniea81": "\u529b", "unie6b3": "\u60e0", "unie12a": "\u8fde", "unif6bd": "\u9a6c", "unie66f": "\u9e3f", "unif115": "\u94a2", "unie80d": "\u8bad", "unie154": "\u5f71", "unie181": "\u7532", "unie12c": "\u52a9", "unie63f": "\u7a97", "unie552": "\u5e03", "uniee49": "\u5bcc", "unie3ea": "\u724c", "unif8b9": "\u5934", "unie7e5": "\u56db", "unied50": "\u591a", "uniebe4": "\u5986", "unif081": "\u5409", "unie0ed": "\u82d1", "unie147": "\u6c99", "unif5f4": "\u6052", "unie760": "\u9686", "unif05f": "\u6625", "unieda2": "\u5e72", "unif569": "\u997c", "unie1ce": "\u6c0f", "unif08c": "\u91cc", "unif4dd": "\u4e8c", "unif548": "\u7ba1", "unie4a6": "\u8bda", "unie907": "\u5236", "unie02d": "\u552e", "uniee70": "\u5609", "uniee08": "\u957f", "unieb5e": "\u8f69", "unie498": "\u6742", "unie31f": "\u526f", "unif620": "\u6e05", "unif25c": "\u8ba1", "unif4e8": "\u9ec4", "unif25b": "\u8baf", "unif161": "\u592a", "uniec90": "\u9e2d", "unif6f1": "\u53f7", "unif13e": "\u8857", "unie892": "\u4ea4", "unif61f": "\u4e0e", "unif55d": "\u53c9", "unif4a0": "\u9644", "unie833": "\u8fd1", "uniecb5": "\u5c42", "unif8aa": "\u65c1", "unif1d7": "\u5bf9", "unif6a8": "\u5df7", "unie5ca": "\u680b", "unif79a": "\u73af", "unif406": "\u7701", "unie8f8": "\u6865", "unie395": "\u6e56", "unie49e": "\u6bb5", "unie562": "\u4e61", "unif1f4": "\u53a6", "unif56d": "\u5e9c", "unie339": "\u94fa", "unieed4": "\u5185", "unif749": "\u4fa7", "unif26d": "\u5143", "unie91d": "\u8d2d", "unie185": "\u524d", "unie74d": "\u5e62", "unie9fa": "\u6ee8", "unie375": "\u5904", "unieefd": "\u5411", "unie67e": "\u5ea7", "unif507": "\u4e0b", "unie662": "\u770c", "unie38b": "\u51e4", "unieb3b": "\u6e2f", "unie826": "\u5f00", "unie226": "\u5173", "unie59c": "\u666f", "unif1d0": "\u6cc9", "unie708": "\u5858", "unie5b9": "\u653e", "unif6f6": "\u660c", "unif44c": "\u7ebf", "unie3a0": "\u6e7e", "unif1d4": "\u653f", "unif1de": "\u6b65", "unif178": "\u5b81", "uniedbf": "\u89e3", "unie4c3": "\u767d", "unieb9f": "\u7530", "unie520": "\u753a", "unif5c4": "\u6eaa", "unie1f5": "\u5341", "unif001": "\u516b", "unie241": "\u53e4", "unif1b2": "\u53cc", "uniebfb": "\u80dc", "unif4be": "\u672c", "unif165": "\u5355", "uniefcb": "\u540c", "unif8af": "\u4e5d", "unied77": "\u8fce", "unie566": "\u7b2c", "unie5cb": "\u53f0", "unied65": "\u7389", "unie33c": "\u9526", "unieba8": "\u5e95", "unif636": "\u540e", "unie551": "\u4e03", "unif04c": "\u659c", "unif3f2": "\u671f", "unie953": "\u6b66", "unif607": "\u5cad", "unie965": "\u677e", "unif4cc": "\u89d2", "unie517": "\u7eaa", "unif070": "\u671d", "uniead2": "\u5cf0", "uniebbb": "\u516d", "uniea40": "\u632f", "unie8ca": "\u73e0", "unif69a": "\u5c40", "unie751": "\u5c97", "unif8ac": "\u6d32", "unif49c": "\u6a2a", "uniea82": "\u8fb9", "unie960": "\u6d4e", "unie8d4": "\u4e95", "unif276": "\u529e", "unie19d": "\u6c49", "unieab4": "\u4ee3", "unie543": "\u4e34", "unie49f": "\u5f04", "unie437": "\u56e2", "unif86a": "\u5916", "uniec02": "\u5854", "unif4ad": "\u6768", "unie93e": "\u94c1", "unif3f9": "\u6d66", "unied26": "\u5b57", "unie95e": "\u5e74", "unif26f": "\u5c9b", "unie9c1": "\u9675", "unif45a": "\u539f", "unif38c": "\u6885", "unie906": "\u8fdb", "unied5b": "\u8363", "unif42b": "\u53cb", "uniedd2": "\u8679", "uniee94": "\u592e", "unie3d1": "\u6842", "unie839": "\u6cbf", "unif0bd": "\u4e8b", "unie65c": "\u6d25", "unie53b": "\u51ef", "unif869": "\u83b2", "unie210": "\u4e01", "unie8fa": "\u79c0", "unif599": "\u67f3", "unie2f1": "\u96c6", "unie56d": "\u7d2b", "unie807": "\u65d7", "unif5ab": "\u5f20", "unie114": "\u8c37", "unief65": "\u7684", "unif124": "\u662f", "unif542": "\u4e0d", "unie195": "\u4e86", "unif3b4": "\u5f88", "unif401": "\u8fd8", "unif530": "\u4e2a", "unif4ec": "\u4e5f", "unif47b": "\u8fd9", "unif53d": "\u6211", "unie29e": "\u5c31", "unie4f2": "\u5728", "unie5b0": "\u4ee5", "uniec42": "\u53ef", "unie34f": "\u5230", "unif1ae": "\u9519", "unieff4": "\u6ca1", "unif88f": "\u53bb", "unie11e": "\u8fc7", "unie778": "\u611f", "unif4a3": "\u6b21", "uniec2d": "\u8981", "unieacf": "\u6bd4", "unie931": "\u89c9", "unied94": "\u770b", "unie978": "\u5f97", "unie99f": "\u8bf4", "unie01c": "\u5e38", "unif183": "\u771f", "unie7ad": "\u4eec", "unieb0f": "\u4f46", "unieedb": "\u6700", "uniefe3": "\u559c", "unif4e7": "\u54c8", "uniea1f": "\u4e48", "unie89f": "\u522b", "unif769": "\u4f4d", "unif412": "\u80fd", "unif460": "\u8f83", "unif58f": "\u5883", "unif28a": "\u975e", "uniee0e": "\u4e3a", "unie5ba": "\u6b22", "unie217": "\u7136", "unif7f5": "\u4ed6", "unie171": "\u633a", "unif6f3": "\u7740", "unif444": "\u4ef7", "unied12": "\u90a3", "unied09": "\u610f", "unif2a1": "\u79cd", "unif52c": "\u60f3", "uniee6e": "\u51fa", "unie75e": "\u5458", "unif092": "\u4e24", "unie743": "\u63a8", "unie075": "\u505a", "unif4c4": "\u6392", "uniedad": "\u5b9e", "unie2d2": "\u5206", "unif31a": "\u95f4", "unif7e6": "\u751c", "unie630": "\u5ea6", "unieb65": "\u8d77", "unif2df": "\u6ee1", "unie06a": "\u7ed9", "unie8b8": "\u70ed", "unie882": "\u5b8c", "unie3a1": "\u683c", "unie4d2": "\u8350", "unif786": "\u559d", "unieb38": "\u7b49", "unief0f": "\u5176", "unie3ae": "\u518d", "uniece3": "\u51e0", "unie3f3": "\u53ea", "uniee8e": "\u73b0", "uniebb8": "\u670b", "unie15c": "\u5019", "unieb4e": "\u6837", "unief4e": "\u76f4", "uniee93": "\u800c", "unif64f": "\u4e70", "unif8a0": "\u4e8e", "unif1ce": "\u822c", "unif638": "\u8c46", "unie663": "\u91cf", "unie5c7": "\u9009", "unif313": "\u5976", "unif27b": "\u6253", "uniecf7": "\u6bcf", "unif82e": "\u8bc4", "unif46e": "\u5c11", "unie16c": "\u7b97", "uniefce": "\u53c8", "unif2fe": "\u56e0", "unif3b5": "\u60c5", "unie652": "\u627e", "unif061": "\u4e9b", "unie1f4": "\u4efd", "unied80": "\u7f6e", "uniec2e": "\u9002", "unie32a": "\u4ec0", "unif630": "\u86cb", "unie5f1": "\u5e08", "unie00a": "\u6c14", "unie0dd": "\u4f60", "unie3cd": "\u59d0", "unif320": "\u68d2", "uniedfe": "\u8bd5", "unif834": "\u603b", "unie9b0": "\u5b9a", "unif737": "\u554a", "unie514": "\u8db3", "unie564": "\u7ea7", "unif1f1": "\u6574", "uniede9": "\u5e26", "unif7e5": "\u867e", "unif3d8": "\u5982", "unif7bd": "\u6001", "unif75f": "\u4e14", "unif767": "\u5c1d", "unie2c7": "\u4e3b", "unif182": "\u8bdd", "unif5e9": "\u5f3a", "unif448": "\u5f53", "unif392": "\u66f4", "uniec04": "\u677f", "unif268": "\u77e5", "unie168": "\u5df1", "unie310": "\u65e0", "unie786": "\u9178", "unie7cd": "\u8ba9", "uniecd8": "\u5165", "unie3e6": "\u5566", "unie0a7": "\u5f0f", "unie4dc": "\u7b11", "unif8f2": "\u8d5e", "unif3b2": "\u7247", "unif318": "\u9171", "unif714": "\u5dee", "unif41a": "\u50cf", "unie07e": "\u63d0", "unif89b": "\u961f", "unif0e1": "\u8d70", "unie18e": "\u5ae9", "unif310": "\u624d", "unif08a": "\u521a", "unif2d4": "\u5348", "unie84c": "\u63a5", "unif006": "\u91cd", "unieecd": "\u4e32", "unif8c9": "\u56de", "unie46f": "\u665a", "unie8a3": "\u5fae", "uniedbc": "\u5468", "unie650": "\u503c", "unied16": "\u8d39", "unie873": "\u6027", "unie16b": "\u684c", "unif431": "\u62cd", "unif781": "\u8ddf", "unif32f": "\u5757", "unie21e": "\u8c03", "unie400": "\u7cd5"} -------------------------------------------------------------------------------- /maoyan/fontdata.txt: -------------------------------------------------------------------------------- 1 | 2->[(515, 60), (503, -26), (31, -26), (31, 6), (42, 36), (52, 62), (75, 86), (74, 110), (100, 141), (121, 158), (150, 196), (170, 214), (218, 260), (278, 294), (308, 332), (358, 370), (380, 400), (422, 445), (422, 508), (422, 561), (384, 598), (345, 648), (284, 635), (219, 635), (141, 559), (130, 488), (57, 498), (46, 603), (110, 656), (180, 710), (286, 710), (391, 715), (453, 652), (514, 593), (514, 506), (514, 460), (480, 381), (436, 330), (416, 300), (381, 274), (347, 242), (298, 215), (257, 167), (231, 144), (221, 121), (183, 109), (182, 97), (164, 73), (156, 60)], 2 | 5->[(137, 173), (147, 103), (223, 36), (278, 35), (343, 35), (380, 84), (433, 136), (433, 224), (433, 292), (345, 380), (263, 372), (232, 380), (198, 364), (164, 341), (135, 310), (58, 324), (129, 697), (487, 697), (494, 610), (202, 611), (162, 414), (190, 423), (229, 448), (264, 460), (300, 460), (396, 460), (463, 402), (543, 334), (528, 223), (528, 124), (459, 51), (399, -39), (177, -39), (115, 17), (51, 74), (43, 166), (141, 173)], 3 | 4->[(321, -27), (331, 148), (26, 149), (13, 226), (347, 718), (409, 707), (421, 232), (520, 222), (520, 162), (434, 149), (433, -18), (316, -19), (322, 225), (339, 563), (116, 232), (319, 219)], 4 | 7->[(48, 611), (61, 698), (523, 698), (523, 627), (483, 590), (461, 541), (419, 491), (378, 442), (349, 353), (323, 289), (292, 228), (278, 175), (252, 83), (245, -26), (164, -23), (148, 17), (160, 73), (169, 121), (185, 183), (209, 292), (278, 405), (308, 475), (341, 525), (374, 572), (408, 611), (48, 597)], 5 | 1->[(382, -39), (281, -19), (292, 532), (271, 505), (206, 486), (152, 455), (108, 451), (112, 538), (180, 569), (229, 616), (284, 637), (292, 654), (312, 686), (314, 702), (388, 707), (382, -26)], 6 | 0->[(43, 335), (33, 468), (69, 545), (95, 624), (148, 667), (187, 699), (282, 710), (389, 703), (459, 617), (487, 574), (511, 508), (526, 447), (520, 335), (520, 273), (514, 219), (508, 177), (508, 126), (466, 46), (362, -39), (282, -45), (176, -39), (115, 37), (53, 127), (135, 335), (135, 154), (168, 95), (218, 35), (343, 35), (385, 96), (428, 167), (428, 335), (428, 515), (385, 576), (344, 640), (269, 626), (221, 635), (181, 583), (135, 515)], 7 | 6->[(420, 521), (408, 574), (386, 607), (349, 635), (296, 635), (253, 635), (220, 609), (177, 593), (154, 522), (141, 492), (128, 407), (128, 350), (163, 398), (207, 425), (254, 449), (306, 449), (395, 449), (522, 316), (522, 211), (522, 143), (463, 24), (360, -39), (293, -39), (180, -39), (39, 124), (39, 317), (39, 530), (117, 626), (185, 710), (301, 720), (388, 710), (443, 661), (498, 614), (510, 528), (414, 521), (142, 222), (158, 166), (162, 122), (182, 69), (210, 57), (253, 41), (282, 35), (347, 46), (430, 115), (431, 206), (430, 281), (388, 326), (349, 370), (287, 370), (228, 370), (142, 282), (142, 224)], 8 | 3->[(132, 180), (148, 87), (185, 63), (221, 43), (276, 35), (340, 35), (427, 123), (427, 250), (387, 283), (345, 326), (284, 331), (257, 331), (229, 321), (225, 400), (236, 400), (239, 399), (250, 399), (244, 399), (303, 399), (394, 459), (394, 522), (394, 571), (366, 604), (330, 631), (274, 635), (222, 635), (153, 572), (142, 504), (52, 520), (69, 612), (127, 660), (173, 710), (272, 701), (332, 718), (383, 683), (433, 659), (488, 569), (487, 520), (487, 483), (462, 432), (436, 390), (386, 371), (451, 371), (487, 309), (523, 262), (523, 190), (523, 95), (383, -40), (276, -40), (179, -40), (129, 18), (52, 75), (43, 167), (133, 180)], 9 | 9->[(142, 151), (160, 85), (184, 62), (220, 35), (253, 35), (307, 35), (337, 57), (368, 73), (408, 137), (422, 191), (428, 217), (435, 273), (435, 300), (435, 308), (435, 313), (434, 319), (409, 276), (360, 249), (315, 223), (259, 223), (168, 223), (105, 275), (43, 354), (43, 462), (43, 574), (173, 710), (273, 710), (343, 710), (404, 671), (463, 633), (480, 562), (524, 489), (524, 356), (524, 214), (494, 131), (464, 53), (418, -8), (351, -39), (253, -39), (175, -39), (122, 9), (67, 57), (56, 144), (430, 472), (425, 544), (341, 635), (284, 635), (223, 635), (179, 586), (146, 539), (135, 459), (148, 390), (177, 345), (220, 301), (282, 313), (344, 301), (425, 391), (425, 466)], 10 | 8->[(181, 371), (71, 426), (71, 521), (72, 603), (128, 656), (193, 710), (282, 710), (378, 710), (495, 596), (495, 527), (495, 412), (386, 371), (466, 349), (489, 300), (524, 251), (524, 184), (524, 88), (458, 25), (391, -48), (297, -39), (174, -39), (108, 25), (42, 102), (42, 186), (42, 257), (78, 318), (114, 354), (163, 524), (163, 470), (230, 406), (284, 406), (346, 406), (383, 439), (402, 470), (402, 519), (406, 567), (368, 601), (334, 635), (283, 635), (214, 635), (197, 603), (163, 570), (160, 524), (134, 186), (134, 146), (152, 111), (159, 75), (202, 55), (242, 35), (284, 35), (316, 49), (343, 46), (369, 57), (390, 77), (432, 117), (432, 248), (346, 332), (285, 332), (217, 324), (185, 290), (134, 249)] 11 | 6->[(420, 521), (408, 574), (386, 598), (349, 635), (296, 646), (253, 635), (220, 612), (177, 580), (154, 522), (155, 492), (135, 435), (128, 407), (128, 352), (161, 402), (207, 422), (254, 449), (306, 449), (391, 449), (459, 382), (522, 316), (522, 211), (522, 143), (493, 88), (472, 24), (412, -7), (360, -39), (293, -47), (180, -39), (110, 43), (45, 124), (39, 317), (39, 530), (117, 626), (185, 710), (301, 701), (388, 710), (443, 661), (498, 621), (510, 528), (404, 521), (142, 224), (142, 166), (162, 122), (182, 86), (218, 57), (253, 35), (292, 35), (347, 47), (389, 81), (430, 127), (430, 206), (430, 281), (390, 326), (349, 368), (288, 370), (228, 370), (174, 326), (142, 281), (142, 204)], 12 | 3->[(133, 180), (148, 110), (185, 69), (221, 35), (276, 35), (340, 43), (384, 79), (427, 113), (417, 188), (427, 250), (387, 290), (345, 331), (284, 331), (250, 331), (220, 321), (230, 400), (236, 400), (239, 411), (243, 399), (245, 399), (303, 399), (348, 428), (394, 456), (394, 522), (394, 571), (330, 635), (280, 635), (222, 635), (187, 597), (153, 572), (142, 504), (52, 520), (69, 612), (127, 660), (186, 715), (271, 710), (332, 710), (383, 683), (433, 649), (460, 614), (487, 569), (487, 470), (436, 394), (386, 371), (451, 342), (477, 309), (534, 262), (523, 187), (523, 95), (453, 27), (383, -31), (276, -40), (179, -40), (116, 18), (52, 78), (38, 166)], 13 | 8->[(181, 371), (71, 412), (71, 521), (71, 603), (185, 710), (279, 710), (378, 710), (495, 596), (495, 519), (495, 412), (386, 371), (454, 349), (489, 300), (534, 251), (524, 184), (524, 88), (458, 15), (391, -39), (283, -39), (177, -39), (108, 30), (42, 86), (42, 186), (42, 257), (114, 354), (181, 382), (165, 524), (163, 470), (197, 439), (232, 406), (293, 406), (333, 406), (369, 439), (402, 470), (402, 519), (415, 567), (368, 601), (334, 634), (283, 635), (229, 635), (197, 588), (163, 570), (163, 524), (145, 186), (134, 146), (163, 111), (169, 74), (197, 68), (242, 35), (284, 35), (316, 35), (369, 57), (390, 77), (432, 117), (432, 248), (346, 332), (217, 332), (179, 290), (134, 249), (128, 174)], 14 | 4->[(317, -31), (338, 137), (5, 149), (27, 232), (348, 707), (421, 707), (426, 232), (520, 240), (520, 137), (421, 155), (421, -22), (331, -26), (326, 222), (327, 553), (102, 232), (342, 238)], 15 | 1->[(382, -23), (281, -40), (292, 547), (263, 505), (198, 486), (145, 445), (112, 445), (112, 537), (186, 567), (244, 609), (262, 634), (298, 664), (312, 686), (324, 710), (377, 705), (378, -22)], 16 | 5->[(152, 173), (147, 113), (185, 74), (222, 40), (278, 35), (343, 35), (433, 136), (433, 214), (433, 290), (389, 347), (345, 380), (276, 380), (232, 380), (164, 341), (143, 310), (58, 320), (129, 697), (494, 697), (494, 611), (214, 617), (162, 414), (194, 424), (229, 448), (264, 460), (300, 460), (408, 460), (463, 398), (528, 329), (528, 223), (528, 124), (470, 51), (386, -39), (177, -39), (129, 17), (51, 82), (43, 166), (137, 173)], 17 | 7->[(36, 611), (39, 686), (523, 698), (523, 627), (487, 590), (453, 541), (419, 482), (384, 429), (350, 367), (323, 304), (299, 241), (278, 175), (252, 77), (259, -24), (145, -13), (160, 60), (169, 121), (185, 196), (230, 293), (278, 431), (308, 478), (374, 572), (399, 611), (36, 619)], 18 | 0->[(43, 335), (43, 468), (69, 535), (94, 638), (148, 667), (202, 710), (282, 710), (398, 710), (459, 617), (479, 574), (513, 514), (520, 447), (520, 335), (532, 271), (514, 208), (508, 166), (494, 112), (466, 46), (414, 4), (362, -46), (282, -39), (167, -39), (115, 37), (43, 134), (121, 336), (135, 154), (184, 95), (218, 35), (343, 35), (371, 96), (428, 155), (419, 323), (428, 515), (376, 576), (344, 635), (218, 635), (181, 594), (135, 515), (135, 335)], 19 | 2->[(515, 60), (522, -26), (35, -26), (31, 6), (30, 36), (52, 62), (66, 86), (92, 110), (100, 134), (121, 158), (179, 212), (218, 245), (278, 294), (358, 370), (393, 400), (422, 457), (422, 496), (422, 561), (347, 635), (219, 635), (180, 583), (142, 559), (140, 488), (48, 496), (57, 603), (180, 710), (391, 710), (453, 666), (524, 593), (514, 506), (514, 460), (480, 381), (436, 330), (406, 307), (381, 274), (347, 242), (298, 201), (257, 171), (231, 144), (195, 120), (180, 109), (182, 107), (180, 85), (164, 73), (156, 60)], 20 | 9->[(142, 151), (154, 88), (184, 68), (215, 32), (264, 35), (307, 35), (337, 70), (368, 73), (408, 137), (422, 191), (428, 217), (432, 245), (443, 273), (435, 300), (435, 319), (435, 313), (434, 319), (409, 276), (360, 249), (315, 226), (259, 223), (168, 235), (108, 297), (43, 354), (43, 462), (43, 574), (173, 710), (279, 710), (343, 723), (403, 671), (463, 633), (524, 489), (524, 356), (524, 214), (481, 131), (464, 49), (343, -39), (262, -39), (175, -39), (122, 9), (67, 57), (56, 144), (434, 466), (425, 544), (341, 635), (284, 635), (223, 635), (135, 539), (143, 459), (135, 387), (177, 345), (230, 301), (282, 301), (344, 301), (381, 345), (425, 381), (425, 466)], 21 | 9->[(142, 151), (154, 88), (191, 62), (215, 26), (264, 35), (307, 35), (337, 54), (395, 105), (408, 137), (422, 191), (440, 247), (435, 273), (435, 300), (435, 308), (435, 313), (421, 319), (409, 276), (360, 249), (315, 220), (259, 223), (168, 223), (43, 354), (43, 462), (43, 574), (173, 710), (273, 710), (353, 710), (403, 671), (463, 633), (524, 489), (514, 357), (524, 214), (464, 49), (403, -6), (343, -35), (262, -39), (175, -40), (67, 57), (56, 144), (142, 152), (425, 466), (425, 544), (383, 590), (341, 629), (284, 635), (223, 635), (169, 586), (135, 539), (135, 459), (135, 387), (177, 358), (220, 301), (344, 301), (425, 391)], 22 | 7->[(49, 611), (48, 698), (523, 698), (531, 627), (487, 591), (453, 541), (419, 503), (384, 429), (349, 367), (312, 304), (297, 241), (278, 175), (242, 82), (244, -39), (151, -34), (152, 6), (146, 59), (169, 120), (181, 181), (217, 317), (278, 419), (298, 478), (351, 525), (374, 572), (418, 611), (48, 612)], 23 | 0->[(43, 335), (43, 472), (69, 544), (99, 624), (148, 661), (202, 710), (282, 710), (398, 710), (459, 617), (487, 574), (504, 508), (520, 436), (520, 335), (520, 267), (514, 219), (508, 166), (488, 126), (466, 46), (414, 4), (359, -27), (282, -39), (176, -39), (115, 37), (43, 127), (43, 325), (135, 335), (135, 154), (177, 101), (218, 35), (295, 27), (343, 51), (385, 87), (428, 161), (428, 335), (428, 515), (344, 636), (281, 648), (218, 635), (181, 583), (143, 515), (135, 341)], 24 | 1->[(369, -26), (292, -30), (281, 541), (259, 520), (204, 486), (137, 445), (112, 439), (118, 536), (186, 561), (239, 607), (282, 637), (292, 653), (312, 680), (328, 721), (393, 700), (382, -26)], 25 | 8->[(181, 371), (71, 412), (71, 507), (71, 595), (121, 656), (185, 710), (378, 710), (495, 596), (495, 519), (495, 412), (386, 371), (441, 349), (489, 300), (524, 267), (524, 184), (524, 88), (391, -39), (174, -39), (108, 25), (42, 86), (42, 186), (42, 257), (114, 354), (163, 524), (168, 470), (197, 439), (230, 417), (296, 406), (333, 406), (369, 439), (402, 470), (402, 519), (408, 567), (368, 601), (334, 635), (229, 635), (197, 603), (165, 565), (134, 178), (134, 146), (152, 111), (169, 66), (195, 55), (242, 35), (283, 35), (316, 31), (343, 46), (369, 57), (390, 77), (432, 117), (424, 183), (432, 248), (389, 290), (343, 338), (293, 332), (217, 332), (134, 249), (134, 186)], 26 | 2->[(505, 60), (515, -26), (31, -26), (31, 6), (42, 36), (52, 62), (80, 110), (99, 134), (121, 158), (147, 181), (179, 212), (218, 245), (278, 294), (358, 370), (380, 400), (422, 457), (426, 508), (422, 561), (345, 635), (284, 635), (230, 635), (167, 596), (141, 559), (140, 492), (48, 498), (57, 603), (133, 656), (180, 710), (286, 710), (384, 710), (453, 652), (504, 593), (514, 506), (514, 460), (497, 420), (480, 374), (436, 330), (416, 307), (347, 242), (312, 201), (231, 151), (206, 123), (194, 99), (182, 97), (179, 85), (170, 73), (156, 60), (523, 60)], 27 | 5->[(137, 173), (147, 103), (222, 35), (278, 49), (355, 35), (388, 84), (433, 136), (433, 292), (389, 323), (345, 380), (276, 370), (232, 372), (198, 349), (164, 341), (143, 294), (58, 320), (127, 683), (494, 697), (494, 611), (202, 611), (162, 414), (195, 446), (229, 448), (264, 469), (300, 460), (396, 460), (451, 394), (528, 328), (544, 217), (528, 124), (461, 51), (389, -39), (278, -28), (177, -43), (115, 31), (51, 74), (43, 170)], 28 | 6->[(420, 521), (408, 571), (386, 597), (349, 635), (296, 644), (253, 635), (220, 612), (177, 580), (154, 522), (143, 492), (148, 449), (128, 407), (128, 352), (161, 399), (207, 425), (254, 449), (306, 449), (395, 449), (522, 316), (522, 211), (522, 143), (493, 75), (463, 29), (417, -7), (360, -39), (293, -39), (180, -36), (39, 124), (52, 317), (37, 530), (117, 626), (185, 710), (301, 710), (388, 710), (443, 661), (498, 614), (510, 528), (434, 521), (142, 211), (142, 166), (182, 79), (253, 35), (285, 35), (340, 35), (389, 81), (445, 131), (430, 206), (430, 285), (390, 326), (349, 370), (288, 370), (223, 370), (184, 326), (147, 268)], 29 | 3->[(133, 180), (148, 103), (221, 35), (276, 35), (340, 35), (427, 123), (427, 178), (427, 250), (387, 290), (345, 337), (284, 331), (257, 331), (220, 321), (230, 396), (236, 388), (239, 399), (245, 399), (303, 399), (394, 459), (406, 522), (394, 568), (366, 604), (330, 635), (274, 635), (222, 631), (187, 604), (153, 572), (142, 504), (52, 520), (69, 612), (127, 660), (186, 710), (272, 710), (346, 710), (383, 683), (433, 650), (460, 614), (487, 569), (487, 510), (476, 470), (462, 432), (436, 394), (386, 375), (451, 356), (487, 295), (523, 262), (523, 190), (523, 94), (442, 27), (383, -40), (276, -40), (179, -40), (130, 18), (52, 75), (51, 165)], 30 | 4->[(331, -26), (332, 153), (18, 153), (-1, 232), (338, 719), (406, 694), (423, 232), (520, 223), (508, 136), (418, 149), (414, -26), (336, 238), (331, 563), (101, 220), (344, 232)] -------------------------------------------------------------------------------- /cnvd/md5.js: -------------------------------------------------------------------------------- 1 | function hash(_0x258a23) { 2 | function _0x2fcbaa(_0x2469d0, _0x4632e5) { 3 | return _0x2469d0 << _0x4632e5 | _0x2469d0 >>> 32 - _0x4632e5; 4 | } 5 | 6 | function _0x288c9b(_0x515947, _0x151fcb) { 7 | var _0x4ca7ee, _0x3f5d26, _0x3d2f7b, _0x524345, _0x5b13e2; 8 | 9 | _0x3d2f7b = _0x515947 & 2147483648; 10 | _0x524345 = _0x151fcb & 2147483648; 11 | _0x4ca7ee = _0x515947 & 1073741824; 12 | _0x3f5d26 = _0x151fcb & 1073741824; 13 | _0x5b13e2 = (_0x515947 & 1073741823) + (_0x151fcb & 1073741823); 14 | 15 | if (_0x4ca7ee & _0x3f5d26) { 16 | return _0x5b13e2 ^ 2147483648 ^ _0x3d2f7b ^ _0x524345; 17 | } 18 | 19 | if (_0x4ca7ee | _0x3f5d26) { 20 | if (_0x5b13e2 & 1073741824) { 21 | return _0x5b13e2 ^ 3221225472 ^ _0x3d2f7b ^ _0x524345; 22 | } else { 23 | return _0x5b13e2 ^ 1073741824 ^ _0x3d2f7b ^ _0x524345; 24 | } 25 | } else { 26 | return _0x5b13e2 ^ _0x3d2f7b ^ _0x524345; 27 | } 28 | } 29 | 30 | function _0x3b397e(_0x2b2fce, _0x3849ce, _0x327580) { 31 | return _0x2b2fce & _0x3849ce | ~_0x2b2fce & _0x327580; 32 | } 33 | 34 | function _0x5f232a(_0x5be40d, _0x577c65, _0x3ed0d5) { 35 | return _0x5be40d & _0x3ed0d5 | _0x577c65 & ~_0x3ed0d5; 36 | } 37 | 38 | function _0x7ae19c(_0x1cdc2c, _0x3f882a, _0x1b91dd) { 39 | return _0x1cdc2c ^ _0x3f882a ^ _0x1b91dd; 40 | } 41 | 42 | function _0x35843f(_0x1a85ba, _0x201ce3, _0x5a6262) { 43 | return _0x201ce3 ^ (_0x1a85ba | ~_0x5a6262); 44 | } 45 | 46 | function _0xbe9f29(_0x5c79ba, _0x33c9ee, _0x849870, _0x2fefb0, _0x2e81ef, _0x2b950f, _0x23f7fe) { 47 | _0x5c79ba = _0x288c9b(_0x5c79ba, _0x288c9b(_0x288c9b(_0x3b397e(_0x33c9ee, _0x849870, _0x2fefb0), _0x2e81ef), _0x23f7fe)); 48 | return _0x288c9b(_0x2fcbaa(_0x5c79ba, _0x2b950f), _0x33c9ee); 49 | } 50 | 51 | function _0x34708e(_0x16be5c, _0x148c4e, _0x4e92a5, _0x4f8fd1, _0x1cd55b, _0x3fbcab, _0x1972e1) { 52 | _0x16be5c = _0x288c9b(_0x16be5c, _0x288c9b(_0x288c9b(_0x5f232a(_0x148c4e, _0x4e92a5, _0x4f8fd1), _0x1cd55b), _0x1972e1)); 53 | return _0x288c9b(_0x2fcbaa(_0x16be5c, _0x3fbcab), _0x148c4e); 54 | } 55 | 56 | function _0xe53d1(_0x1dce3d, _0x3f4247, _0x261ae8, _0x2280b5, _0x5191fd, _0x8bdfd, _0x133aea) { 57 | _0x1dce3d = _0x288c9b(_0x1dce3d, _0x288c9b(_0x288c9b(_0x7ae19c(_0x3f4247, _0x261ae8, _0x2280b5), _0x5191fd), _0x133aea)); 58 | return _0x288c9b(_0x2fcbaa(_0x1dce3d, _0x8bdfd), _0x3f4247); 59 | } 60 | 61 | function _0x23db4d(_0x33610d, _0x294f16, _0x323c7c, _0x8f5e8b, _0xda9e8b, _0x3ed3f4, _0x57fe07) { 62 | _0x33610d = _0x288c9b(_0x33610d, _0x288c9b(_0x288c9b(_0x35843f(_0x294f16, _0x323c7c, _0x8f5e8b), _0xda9e8b), _0x57fe07)); 63 | return _0x288c9b(_0x2fcbaa(_0x33610d, _0x3ed3f4), _0x294f16); 64 | } 65 | 66 | function _0x5cb345(_0x298ab7) { 67 | var _0x4bf33c; 68 | 69 | var _0x5b53cf = _0x298ab7["length"]; 70 | 71 | var _0x1ceb57 = _0x5b53cf + 8; 72 | 73 | var _0x1a7201 = (_0x1ceb57 - _0x1ceb57 % 64) / 64; 74 | 75 | var _0x44b884 = (_0x1a7201 + 1) * 16; 76 | 77 | var _0xd963c7 = Array(_0x44b884 - 1); 78 | 79 | var _0x59150a = 0; 80 | var _0x1b6a69 = 0; 81 | 82 | while (_0x1b6a69 < _0x5b53cf) { 83 | _0x4bf33c = (_0x1b6a69 - _0x1b6a69 % 4) / 4; 84 | _0x59150a = _0x1b6a69 % 4 * 8; 85 | _0xd963c7[_0x4bf33c] = _0xd963c7[_0x4bf33c] | _0x298ab7["charCodeAt"](_0x1b6a69) << _0x59150a; 86 | _0x1b6a69++; 87 | } 88 | 89 | _0x4bf33c = (_0x1b6a69 - _0x1b6a69 % 4) / 4; 90 | _0x59150a = _0x1b6a69 % 4 * 8; 91 | _0xd963c7[_0x4bf33c] = _0xd963c7[_0x4bf33c] | 128 << _0x59150a; 92 | _0xd963c7[_0x44b884 - 2] = _0x5b53cf << 3; 93 | _0xd963c7[_0x44b884 - 1] = _0x5b53cf >>> 29; 94 | return _0xd963c7; 95 | } 96 | 97 | function _0x2e2f69(_0x277a7f) { 98 | var _0x330c74 = "", 99 | _0x474add = "", 100 | _0x1d9b86, 101 | _0xbd4a17; 102 | 103 | for (_0xbd4a17 = 0; _0xbd4a17 <= 3; _0xbd4a17++) { 104 | _0x1d9b86 = _0x277a7f >>> _0xbd4a17 * 8 & 255; 105 | _0x474add = "0" + _0x1d9b86["toString"](16); 106 | _0x330c74 = _0x330c74 + _0x474add["substr"](_0x474add["length"] - 2, 2); 107 | } 108 | 109 | return _0x330c74; 110 | } 111 | 112 | var _0xa55a23 = Array(); 113 | 114 | var _0x4bb5f7, _0x95068a, _0x45d8a5, _0x3f5040, _0x111d78, _0x2e312c, _0x24af16, _0x11166d, _0x938561; 115 | 116 | var _0x17c2a6 = 7, 117 | _0x174a90 = 12, 118 | _0x212de2 = 17, 119 | _0xdcce9a = 22; 120 | var _0x39cc52 = 5, 121 | _0x417aa3 = 9, 122 | _0x393ddb = 14, 123 | _0x363b61 = 20; 124 | var _0x7cc21d = 4, 125 | _0x2c4a2d = 11, 126 | _0x184eb1 = 16, 127 | _0x2fafaf = 23; 128 | var _0x59aaa1 = 6, 129 | _0xffff3f = 10, 130 | _0x564908 = 15, 131 | _0x5c5d7b = 21; 132 | _0xa55a23 = _0x5cb345(_0x258a23); 133 | _0x2e312c = 1732584193; 134 | _0x24af16 = 4023233417; 135 | _0x11166d = 2562383102; 136 | _0x938561 = 271733878; 137 | 138 | for (_0x4bb5f7 = 0; _0x4bb5f7 < _0xa55a23["length"]; _0x4bb5f7 += 16) { 139 | _0x95068a = _0x2e312c; 140 | _0x45d8a5 = _0x24af16; 141 | _0x3f5040 = _0x11166d; 142 | _0x111d78 = _0x938561; 143 | _0x2e312c = _0xbe9f29(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 0], _0x17c2a6, 3614090360); 144 | _0x938561 = _0xbe9f29(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 1], _0x174a90, 3905402710); 145 | _0x11166d = _0xbe9f29(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 2], _0x212de2, 606105819); 146 | _0x24af16 = _0xbe9f29(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 3], _0xdcce9a, 3250441966); 147 | _0x2e312c = _0xbe9f29(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 4], _0x17c2a6, 4118548399); 148 | _0x938561 = _0xbe9f29(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 5], _0x174a90, 1200080426); 149 | _0x11166d = _0xbe9f29(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 6], _0x212de2, 2821735955); 150 | _0x24af16 = _0xbe9f29(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 7], _0xdcce9a, 4249261313); 151 | _0x2e312c = _0xbe9f29(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 8], _0x17c2a6, 1770035416); 152 | _0x938561 = _0xbe9f29(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 9], _0x174a90, 2336552879); 153 | _0x11166d = _0xbe9f29(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 10], _0x212de2, 4294925233); 154 | _0x24af16 = _0xbe9f29(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 11], _0xdcce9a, 2304563134); 155 | _0x2e312c = _0xbe9f29(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 12], _0x17c2a6, 1804603682); 156 | _0x938561 = _0xbe9f29(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 13], _0x174a90, 4254626195); 157 | _0x11166d = _0xbe9f29(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 14], _0x212de2, 2792965006); 158 | _0x24af16 = _0xbe9f29(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 15], _0xdcce9a, 1236535329); 159 | _0x2e312c = _0x34708e(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 1], _0x39cc52, 4129170786); 160 | _0x938561 = _0x34708e(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 6], _0x417aa3, 3225465664); 161 | _0x11166d = _0x34708e(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 11], _0x393ddb, 643717713); 162 | _0x24af16 = _0x34708e(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 0], _0x363b61, 3921069994); 163 | _0x2e312c = _0x34708e(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 5], _0x39cc52, 3593408605); 164 | _0x938561 = _0x34708e(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 10], _0x417aa3, 38016083); 165 | _0x11166d = _0x34708e(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 15], _0x393ddb, 3634488961); 166 | _0x24af16 = _0x34708e(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 4], _0x363b61, 3889429448); 167 | _0x2e312c = _0x34708e(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 9], _0x39cc52, 568446438); 168 | _0x938561 = _0x34708e(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 14], _0x417aa3, 3275163606); 169 | _0x11166d = _0x34708e(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 3], _0x393ddb, 4107603335); 170 | _0x24af16 = _0x34708e(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 8], _0x363b61, 1163531501); 171 | _0x2e312c = _0x34708e(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 13], _0x39cc52, 2850285829); 172 | _0x938561 = _0x34708e(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 2], _0x417aa3, 4243563512); 173 | _0x11166d = _0x34708e(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 7], _0x393ddb, 1735328473); 174 | _0x24af16 = _0x34708e(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 12], _0x363b61, 2368359562); 175 | _0x2e312c = _0xe53d1(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 5], _0x7cc21d, 4294588738); 176 | _0x938561 = _0xe53d1(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 8], _0x2c4a2d, 2272392833); 177 | _0x11166d = _0xe53d1(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 11], _0x184eb1, 1839030562); 178 | _0x24af16 = _0xe53d1(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 14], _0x2fafaf, 4259657740); 179 | _0x2e312c = _0xe53d1(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 1], _0x7cc21d, 2763975236); 180 | _0x938561 = _0xe53d1(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 4], _0x2c4a2d, 1272893353); 181 | _0x11166d = _0xe53d1(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 7], _0x184eb1, 4139469664); 182 | _0x24af16 = _0xe53d1(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 10], _0x2fafaf, 3200236656); 183 | _0x2e312c = _0xe53d1(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 13], _0x7cc21d, 681279174); 184 | _0x938561 = _0xe53d1(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 0], _0x2c4a2d, 3936430074); 185 | _0x11166d = _0xe53d1(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 3], _0x184eb1, 3572445317); 186 | _0x24af16 = _0xe53d1(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 6], _0x2fafaf, 76029189); 187 | _0x2e312c = _0xe53d1(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 9], _0x7cc21d, 3654602809); 188 | _0x938561 = _0xe53d1(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 12], _0x2c4a2d, 3873151461); 189 | _0x11166d = _0xe53d1(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 15], _0x184eb1, 530742520); 190 | _0x24af16 = _0xe53d1(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 2], _0x2fafaf, 3299628645); 191 | _0x2e312c = _0x23db4d(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 0], _0x59aaa1, 4096336452); 192 | _0x938561 = _0x23db4d(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 7], _0xffff3f, 1126891415); 193 | _0x11166d = _0x23db4d(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 14], _0x564908, 2878612391); 194 | _0x24af16 = _0x23db4d(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 5], _0x5c5d7b, 4237533241); 195 | _0x2e312c = _0x23db4d(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 12], _0x59aaa1, 1700485571); 196 | _0x938561 = _0x23db4d(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 3], _0xffff3f, 2399980690); 197 | _0x11166d = _0x23db4d(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 10], _0x564908, 4293915773); 198 | _0x24af16 = _0x23db4d(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 1], _0x5c5d7b, 2240044497); 199 | _0x2e312c = _0x23db4d(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 8], _0x59aaa1, 1873313359); 200 | _0x938561 = _0x23db4d(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 15], _0xffff3f, 4264355552); 201 | _0x11166d = _0x23db4d(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 6], _0x564908, 2734768916); 202 | _0x24af16 = _0x23db4d(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 13], _0x5c5d7b, 1309151649); 203 | _0x2e312c = _0x23db4d(_0x2e312c, _0x24af16, _0x11166d, _0x938561, _0xa55a23[_0x4bb5f7 + 4], _0x59aaa1, 4149444226); 204 | _0x938561 = _0x23db4d(_0x938561, _0x2e312c, _0x24af16, _0x11166d, _0xa55a23[_0x4bb5f7 + 11], _0xffff3f, 3174756917); 205 | _0x11166d = _0x23db4d(_0x11166d, _0x938561, _0x2e312c, _0x24af16, _0xa55a23[_0x4bb5f7 + 2], _0x564908, 718787259); 206 | _0x24af16 = _0x23db4d(_0x24af16, _0x11166d, _0x938561, _0x2e312c, _0xa55a23[_0x4bb5f7 + 9], _0x5c5d7b, 3951481745); 207 | _0x2e312c = _0x288c9b(_0x2e312c, _0x95068a); 208 | _0x24af16 = _0x288c9b(_0x24af16, _0x45d8a5); 209 | _0x11166d = _0x288c9b(_0x11166d, _0x3f5040); 210 | _0x938561 = _0x288c9b(_0x938561, _0x111d78); 211 | } 212 | 213 | var _0x4ebb27 = _0x2e2f69(_0x2e312c) + _0x2e2f69(_0x24af16) + _0x2e2f69(_0x11166d) + _0x2e2f69(_0x938561); 214 | 215 | return _0x4ebb27["toLowerCase"](); 216 | } 217 | 218 | function go(_0x2ec596) { 219 | var _0x59fbf1 = new Date(); 220 | 221 | function _0x446c5c(_0x45e78a, _0x5ef601) { 222 | var _0x527be2 = _0x2ec596["chars"]["length"]; 223 | 224 | for (var _0x32d209 = 0; _0x32d209 < _0x527be2; _0x32d209++) { 225 | for (var _0x5a38a8 = 0; _0x5a38a8 < _0x527be2; _0x5a38a8++) { 226 | var _0x146333 = _0x5ef601[0] + _0x2ec596["chars"]["substr"](_0x32d209, 1) + _0x2ec596["chars"]["substr"](_0x5a38a8, 1) + _0x5ef601[1]; 227 | 228 | if (hash(_0x146333) == _0x45e78a) { 229 | return [_0x146333, new Date() - _0x59fbf1]; 230 | } 231 | } 232 | } 233 | } 234 | 235 | var _0x81db1a = _0x446c5c(_0x2ec596["ct"], _0x2ec596["bts"]); 236 | 237 | if (_0x81db1a) { 238 | var _0x1e535d; 239 | 240 | if (_0x2ec596["wt"]) { 241 | _0x1e535d = parseInt(_0x2ec596["wt"]) > _0x81db1a[1] ? parseInt(_0x2ec596["wt"]) - _0x81db1a[1] : 500; 242 | } else { 243 | _0x1e535d = 1500; 244 | } 245 | 246 | return _0x2ec596["tn"] + "=" + _0x81db1a[0] + ";Max-age=" + _0x2ec596["vt"] + "; path = /"; 247 | } 248 | } 249 | -------------------------------------------------------------------------------- /nubia_bbs/nubia_bbs_from_chrome/decode_cookie.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nubia_bbs/nubia_bbs_from_chrome/after_decode_cookie.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nubia_bbs/nubia_bbs_from_chrome/nubia_bbs_js.html: -------------------------------------------------------------------------------- 1 | 2 | 325 | --------------------------------------------------------------------------------