Repository: wkunzhi/SpiderCrackDemo Branch: master Commit: 5188ca4056bb Files: 226 Total size: 1.5 MB Directory structure: gitextract_x35_pkb9/ ├── .gitattributes ├── .gitignore ├── README.md ├── 【51Job】查岗位/ │ └── select_job.py ├── 【bilibili】自动登录/ │ ├── README.md │ ├── __init__.py │ └── login.py ├── 【bilibili】视频下载/ │ ├── __init__.py │ └── video_download.py ├── 【双色球】头奖分布/ │ ├── main.py │ └── 近期记录.xlsx ├── 【壁纸】美女壁纸下载器/ │ └── bg_down.py ├── 【大众点评】字体反爬、坐标反爬/ │ ├── 参数生成/ │ │ ├── encryp.js │ │ └── uid.py │ ├── 旧版/ │ │ ├── __init__.py │ │ ├── parse_address_poi.py │ │ └── parse_font_css.py │ └── 最新版7月/ │ ├── README.md │ ├── font.json │ └── main.py ├── 【天眼查】字体加密/ │ └── tyc.py ├── 【抖音】无水印视频解析/ │ ├── README.md │ ├── __init__.py │ └── parse.py ├── 【拼多多】登陆参数生成/ │ ├── PinDuoDuo.py │ ├── README.md │ ├── __init__.py │ └── encryp.js ├── 【文书】app查询接口/ │ └── main.py ├── 【淘宝】自动登陆/ │ ├── auto_login_pyppeteer.py │ └── login_for_sina.py ├── 其他实战/ │ ├── __init__.py │ ├── 【5173网】自动登录/ │ │ ├── auto_login.py │ │ └── encryp.js │ ├── 【9377网】自动登录/ │ │ ├── 9377login.py │ │ └── __init__.py │ ├── 【DNS】自动登录/ │ │ ├── Login.py │ │ ├── __init__.py │ │ └── dns.js │ ├── 【GitHub】自动登录/ │ │ ├── __init__.py │ │ └── login.py │ ├── 【Glidedsky】自动登陆/ │ │ └── login.py │ ├── 【Python加密库】Demo/ │ │ ├── __init__.py │ │ └── encryption.py │ ├── 【TCL金融】自动登录/ │ │ ├── __init__.py │ │ ├── auto_login.py │ │ └── encryp.js │ ├── 【steam】自动登录/ │ │ ├── execute.js │ │ └── login.py │ ├── 【万创帮】自动登录/ │ │ ├── __init__.py │ │ ├── encryp.js │ │ └── spider_login.py │ ├── 【中关村】自动登录/ │ │ ├── README.md │ │ └── login.py │ ├── 【京东】商品数据爬取/ │ │ ├── __init__.py │ │ ├── geckodriver │ │ └── selenium抓取.py │ ├── 【人人网】自动登录/ │ │ ├── enc.js │ │ └── login.py │ ├── 【企业名片】企业查询/ │ │ ├── encryp.js │ │ └── qi_ming.py │ ├── 【国鑫所】自动登录/ │ │ ├── Login.py │ │ ├── __init__.py │ │ └── encryp.js │ ├── 【天眼查】模拟登录/ │ │ ├── __init__.py │ │ └── login.py │ ├── 【天翼】登录/ │ │ ├── login.py │ │ └── v1.js │ ├── 【好莱客】参数解析/ │ │ ├── __init__.py │ │ ├── encryp.js │ │ └── holike.py │ ├── 【小牛在线】登录参数生成/ │ │ ├── __init__.py │ │ ├── encryp.js │ │ └── make_param.py │ ├── 【开鑫贷】登陆参数生成/ │ │ ├── KaiXinDai.py │ │ ├── __init__.py │ │ └── encryp.js │ ├── 【微信】登录参数生成/ │ │ ├── __init__.py │ │ ├── encryp.js │ │ └── make_pwd.py │ ├── 【房价】房价获取/ │ │ ├── README.md │ │ ├── main.py │ │ └── util.py │ ├── 【房天下】自动登录/ │ │ ├── encryp.js │ │ └── login.py │ ├── 【新浪微博】密码解密/ │ │ ├── execute.js │ │ └── main.py │ ├── 【时光网】登陆参数生成/ │ │ ├── encryp.js │ │ └── login.py │ ├── 【易通贷】自动登录/ │ │ ├── __init__.py │ │ ├── auto_login.py │ │ └── encryp.js │ ├── 【汽车之家】参数解密/ │ │ ├── execute.js │ │ └── main.py │ ├── 【满级网】自动登录/ │ │ ├── auto_login.py │ │ └── encryp.js │ ├── 【百度】wap端sig生成/ │ │ ├── make_sig.py │ │ └── v3_update.js │ ├── 【百度】网页找回密码/ │ │ ├── demo.py │ │ ├── dv.js │ │ ├── encryp.js │ │ └── header.py │ ├── 【百度】翻译/ │ │ ├── __init__.py │ │ ├── translate.js │ │ └── translation.py │ ├── 【百度】自动登录/ │ │ ├── README.md │ │ ├── encryp.js │ │ └── login.py │ ├── 【百度街拍】图片下载/ │ │ └── get_image.py │ ├── 【移动】登录参数生成/ │ │ ├── MakeParam.py │ │ ├── __init__.py │ │ └── encryp.js │ ├── 【空中网】自动登录/ │ │ ├── __init__.py │ │ ├── encryp.js │ │ └── spider_login.py │ ├── 【美团】数据解析、token生成/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── create_food_token.py │ │ ├── get_login_cookies.py │ │ ├── parse_food_comments.py │ │ ├── parse_food_info.py │ │ ├── parse_hotel_comments.py │ │ ├── parse_hotel_info.py │ │ ├── parse_play_areas.py │ │ └── parse_play_info.py │ ├── 【试客联盟】登录/ │ │ ├── execute.js │ │ └── login.py │ ├── 【谷雨】数字解密/ │ │ └── GuYu.py │ ├── 【豆瓣】自动登录/ │ │ └── DouBan.py │ ├── 【逗游】自动登录/ │ │ ├── __init__.py │ │ ├── douyou.py │ │ └── encryp.js │ ├── 【金逸电影】自动注册/ │ │ ├── __init__.py │ │ ├── encryp.js │ │ └── register.py │ ├── 【青海移动】登陆参数生成/ │ │ ├── __init__.py │ │ ├── encryp.js │ │ └── make_param.py │ └── 【餐饮】查询信息/ │ ├── FoodInfo.py │ ├── __init__.py │ └── t.html ├── 原创爬虫工具/ │ ├── Cookies/ │ │ ├── MeiTuan/ │ │ │ ├── __init__.py │ │ │ ├── config.py │ │ │ ├── db.py │ │ │ ├── generator.py │ │ │ └── 账号.txt │ │ ├── README.md │ │ └── __init__.py │ ├── DataMigration/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── config.py │ │ ├── db/ │ │ │ ├── MongoDB.py │ │ │ ├── Mysql.py │ │ │ └── __init__.py │ │ └── migration/ │ │ ├── __init__.py │ │ ├── mongo_to_mysql.py │ │ └── mysql_to_mongo.py │ ├── Decode/ │ │ ├── README.md │ │ ├── __init__.py │ │ └── translation.py │ ├── Jsencrypt/ │ │ ├── __init__.py │ │ └── make_encrypt.py │ ├── OSS/ │ │ ├── __init__.py │ │ └── push_to_oss.py │ ├── Proxy/ │ │ ├── KDLProxyPool.py │ │ ├── README.md │ │ ├── XDLProxyPool.py │ │ ├── XDLProxyUseDemo.py │ │ ├── ZhiMaProxyPool.py │ │ └── ZhiMaProxyUseDemo.py │ ├── README.md │ ├── Register/ │ │ ├── MessageCode.py │ │ ├── README.md │ │ └── __init__.py │ └── zok/ │ ├── README.md │ ├── __init__.py │ ├── get_db/ │ │ ├── __init__.py │ │ ├── from_mongodb.py │ │ └── from_mysql.py │ ├── proxies/ │ │ ├── __init__.py │ │ └── proxies.py │ ├── random_UA/ │ │ ├── __init__.py │ │ ├── fake_useragent.json │ │ └── ua_random.py │ ├── repetition/ │ │ ├── __init__.py │ │ └── update_cache.py │ ├── save/ │ │ ├── __init__.py │ │ └── to_mysql.py │ └── zok_config.py ├── 滑动验证码/ │ ├── 【w3c】滑块验证/ │ │ ├── __init__.py │ │ └── w3c.py │ └── 【腾讯】滑块验证/ │ ├── discriminate.py │ └── sel.py └── 项目/ ├── HouseScrapy/ │ ├── requirements │ ├── scrapy.cfg │ ├── settings.py │ ├── spiders/ │ │ ├── __init__.py │ │ └── house.py │ └── toolkits/ │ ├── __init__.py │ ├── fake_useragent.json │ ├── items.py │ ├── make_ua.py │ ├── middlewares.py │ ├── pipelines.py │ └── proxies.py ├── HouseSpider/ │ ├── README.md │ ├── config.py │ ├── db/ │ │ └── __init__.py │ ├── main.py │ └── tool/ │ ├── __init__.py │ ├── parse.py │ ├── proxy.py │ └── toolkit.py ├── MeiTuanArea/ │ ├── MeiTuanArea/ │ │ ├── __init__.py │ │ ├── items.py │ │ ├── middlewares.py │ │ ├── pipelines.py │ │ ├── settings.py │ │ └── spiders/ │ │ ├── __init__.py │ │ ├── area_coord.py │ │ └── areas.py │ ├── README.md │ ├── __init__.py │ ├── scrapy.cfg │ └── 初始化.sql └── README.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.js linguist-language=python ================================================ FILE: .gitignore ================================================ .DS_Store */.DS_Store /.idea */.idea .vscode /.vscode */.vscode /__pycache__ */__pycache__ .README.md ================================================ FILE: README.md ================================================ #

Python3 爬虫实战


python3 spider


Branch


## 简介 包含几十个 python3 爬虫实战案例。如果喜欢请 star 与 fork,这是对我继续更新下去的最大支持 | Author | Zok | | --- | --- | | Email | 362416272@qq.com | | 博客 | https://www.zhangkunzhi.com | ## QQ讨论群 ![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/2019/11/18/wx201911181627012x.png?x-oss-process=image/resize,h_150)
------- ## Python 爬虫实战 > **字体加密** [天眼查](https://github.com/wkunzhi/Python3-Spider/tree/master/【天眼查】字体加密) | [大众点评](https://github.com/wkunzhi/Python3-Spider/tree/master/【大众点评】字体反爬、坐标反爬) | [谷雨](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【谷雨】数字解密) > **验证码【仅作学术讨论】** [w3c-滑块](https://github.com/wkunzhi/Python3-Spider/tree/master/滑动验证码/【w3c】滑块验证) | [腾讯-滑块识别](https://github.com/wkunzhi/Python3-Spider/tree/master/滑动验证码/【腾讯】滑块验证/discriminate.py) | [腾讯滑块拖动 selenium](https://github.com/wkunzhi/Python3-Spider/tree/master/滑动验证码/【腾讯】滑块验证/sel.py) > **参数生成** [拼多多](https://github.com/wkunzhi/Python3-Spider/tree/master/【拼多多】登陆参数生成) 失效! | [小牛在线](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【小牛在线】登录参数生成) | [开鑫贷](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【开鑫贷】登陆参数生成) | [时光网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【时光网】登陆参数生成) | [百度](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度】自动登录) | [公众号密码加密](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【微信】登录参数生成) | [移动](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【移动】登录参数生成) | [好莱客](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【好莱客】参数解析) | [青海移动](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【青海移动】登陆参数生成) | [新浪微博](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【新浪微博】密码解密) | [汽车之家](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【汽车之家】参数解密) | [steam](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【steam】登录) | [百度wap端sig生成](https://github.com/wkunzhi/Python3-Spider/tree/master/%E5%85%B6%E4%BB%96%E5%AE%9E%E6%88%98/%E3%80%90%E7%99%BE%E5%BA%A6%E3%80%91wap%E7%AB%AFsig%E7%94%9F%E6%88%90) > **自动登录** [淘宝](https://github.com/wkunzhi/Python3-Spider/tree/master/【淘宝】自动登陆) | [5173平台](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【5173网】自动登录) | [房天下](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【房天下】自动登录) | [Glidesky](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【Glidedsky】自动登陆) | [中关村](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【中关村】自动登录) | [9377平台](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【9377网】自动登录) | [逗游](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【逗游】自动登录) | [GitHub](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【GitHub】自动登录) | [万创帮](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【万创帮】自动登录) | [空中网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【空中网】自动登录) | [易通贷](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【易通贷】自动登录) | [DNS](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【DNS】自动登录) | [TCL金融](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【TCL金融】自动登录) | [国鑫所](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【国鑫所】自动登录) | [满级网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/满级网) | [试客联盟](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【试客联盟】自动登陆) | [人人网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【人人网】自动登录) | [豆瓣网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【豆瓣】自动登录) | [天翼](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【天翼】登录) > **其他实战** [文书网app查询接口](https://github.com/wkunzhi/Python3-Spider/tree/master/【文书】app查询接口) | [抖音无水印视频解析](https://github.com/wkunzhi/Python3-Spider/tree/master/【抖音】无水印视频解析) | [企业名片查询](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【企业名片】企业查询) | [百度找回密码](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度】网页找回密码) | [美女壁纸下载](https://github.com/wkunzhi/Python3-Spider/tree/master/【双色球】头奖分布) | [美女壁纸下载](https://github.com/wkunzhi/Python3-Spider/tree/master/【壁纸】美女壁纸下载器) | [美团 解析与token生成](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【美团】数据解析、token生成) | [bilibili 视频下载](https://github.com/wkunzhi/Python3-Spider/tree/master/【bilibili】视频下载) | [51job 查岗位](https://github.com/wkunzhi/Python3-Spider/tree/master/【51Job】查岗位) | [百度 翻译](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度】翻译) | [美团 全国区域](https://github.com/wkunzhi/Python3-Spider/tree/master/各站案例/MeiTuanArea) | [企业名片查询](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【餐饮】查询信息) | [金逸电影 注册](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【金逸电影】自动注册) | [Python加密库Demo](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【Python加密库】Demo) | [百度街拍图片下载](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度街拍】图片下载) | [京东商品数据爬取](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【京东】商品数据爬取) | [房价获取](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【房价】房价获取) ## 原创工具 > 此工具包在我另外一个项目中,欢迎 star - [【解密工具】可拓展式解密器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Decode) - [【自动注册】验证短信接收器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Register) - [【付费代理IP池】监控维护器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy) - [【cookies池】-美团cookies池](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Cookies) - [【跨数据库迁移器】-开发中](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/DataMigration) - [【网络图片并发直传OSS】](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/OSS) - [【JS攻防-自动生成encrypt结果】](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Jsencrypt) ## 【推荐】爬虫练习网 > 一个很不错的爬虫练习题网,内涵十几个爬虫题目,由浅到深涵盖 **ip反爬、js反爬、字体反爬、验证码** 等题目。安利给大家,博主已撸完。 - 登录网址 http://www.glidedsky.com/login - 题分排行榜 http://www.glidedsky.com/rank ![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/%E7%88%AC%E8%99%AB%E9%A2%98%E8%AE%B0%E5%BD%95.png?x-oss-process=image/resize,w_400) ---- ##淘宝:自动登录 ![自动登录](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/tglog3.gif) - 打开 `auto_login_pyppeteer.py` Run 代码,输入淘宝账号、密码即可自动登录 ---- ##文书网app [《入门级安卓逆向 - 文书网app爬虫教程》](https://www.zhangkunzhi.com/index.php/archives/162/) ![](https://static.zhangkunzhi.com/typecho/2020/07/24/603402218498341/1595560337.png) ---- ### 美女壁纸下载器 ![美女壁纸下载器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/WX20191106-114450.png) ### 双色球头奖分布词云 ![双色球头奖](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20191107/result.jpg?x-oss-process=image/resize,w_700) ![双色球](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20191107/WX20191108-152008%402x.png?x-oss-process=image/resize,w_700) ### 工具:解码器 ![可拓展式编码转换器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/%E7%89%B9%E6%AE%8A.gif) ### 滑块还原识别 ![可拓展式编码转换器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/bg.png) ![可拓展式编码转换器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/chache.png) ### 腾讯滑块缺口识别 ![缺口识别](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/WX20191011-203441%402x.png?x-oss-process=image/resize,h_200) ## QQ 讨论群 ![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/2019/11/18/wx201911181627012x.png?x-oss-process=image/resize,h_300) ================================================ FILE: 【51Job】查岗位/select_job.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-15 Python: 3.7 import requests from lxml import etree Format_str = 'https://search.51job.com/list/000000,000000,0000,00,9,99,{key},2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=' Headers = { 'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } class GetJob(object): def __init__(self, job_name): self.job = job_name self.get_info() def get_info(self): target_url = Format_str.format(key=self.job) response = requests.get(target_url, headers=Headers) # 编码转换 response.encoding = response.apparent_encoding root = etree.HTML(response.text) self.parse(root) @staticmethod def parse(root): div_list = root.xpath("//div[@class='dw_table']/div[@class='el']") for div in div_list: money = div.xpath("span[@class='t4']/text()") money = money[0] if money else "面议" # 工作名称不可能为空,所以不用判断 a = div.xpath("p/span/a")[0] job_name = a.xpath("text()")[0].strip() job_href = a.xpath("@href")[0] date_time = div.xpath("span[@class='t5']/text()") date_time = date_time[0] if date_time else "没有时间" print(job_name, money, date_time, job_href) with open('job.csv', 'a', encoding='gb18030') as f: job_list = [job_name, date_time, money, job_href, '\n'] f.write(','.join(job_list)) if __name__ == "__main__": key = input("请输入关键词") GetJob(key) ================================================ FILE: 【bilibili】自动登录/README.md ================================================ ## B站自动登录 本案例根据 `selenium` 实现。 ## 效果图 ![image](https://csrftoken.oss-cn-beijing.aliyuncs.com/github/blibili-login-report.png) ## Q&A > ChromeDriver - WebDriver for Chrome ``` 因为是模拟点击,所以需要下载插件。 点击下方链接即可跳转至下载界面。 ``` > 为什么要模拟滑动多次? ``` 因为获取滑块的偏移量,在模拟操作的时候,机器在控制滑动速度的时候比较均匀,可能会被判定为机器。 当然了,我们会在今后给予更好的滑动支持~ ``` [下载ChromeDriver](https://chromedriver.chromium.org/downloads) ## Support ``` 案例于 2020-04-23 前均可用,如有疑问请联系作者。 ``` ## Donate Thanks ~ ================================================ FILE: 【bilibili】自动登录/__init__.py ================================================ #! /usr/bin/env python # -*- coding: utf-8 -*- # Date: 2020/4/23 ================================================ FILE: 【bilibili】自动登录/login.py ================================================ #! /usr/bin/env python # -*- coding: utf-8 -*- # Date: 2020/4/23 import time import base64 import random from io import BytesIO from PIL import Image from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec BROWSER_EXECUTABLE_PATH = "/Users/liuzhichao/PycharmProjects/bilibili/chromedriver" class LoginBli: # 登录URI login_url = "https://passport.bilibili.com/login" def __init__(self, username, password): """初始化 Parameters ---------- username: string B站账号 password: string B站密码 """ self.username = username self.password = password # 定义浏览器 self.browser = webdriver.Chrome(executable_path=BROWSER_EXECUTABLE_PATH) # 定义显示等待 self.wait = WebDriverWait(self.browser, 20) def open(self): """模拟点击登陆 自动打开浏览器, 进入登陆界面 输入用户名, 密码 """ # 打开浏览器, 进入登陆界面 self.browser.get(self.login_url) # 用户名输入框 self.wait.until( ec.presence_of_element_located((By.ID, 'login-username')) ).send_keys(self.username) # 清空用户名输入框 # 密码输入框 self.wait.until( ec.presence_of_element_located((By.ID, 'login-passwd')) ).send_keys(self.password) # 清空密码输入框 # 登录按钮 login_button = self.wait.until( ec.presence_of_element_located((By.XPATH, '//*[@id="geetest-wrap"]/div/div[5]/a[1]')) ) # 点击登录 login_button.click() # 防止因网络波动,图片加载过慢,等待加载出来 time.sleep(2) def get_geetest_image(self): """ 获取极验验证码图片 """ image_name = ["geetest_canvas_fullbg", "geetest_canvas_bg"] image = [] for index in range(0, 2): # 执行js 拿到canvas画布里面的图片数据 js = f'return document.getElementsByClassName("{image_name[index]}")[0].toDataURL("image/png");' # 图片数据 complete_img_data = self.browser.execute_script(js) # base64 编码的图片信息 complete_img_base64 = complete_img_data.split(',')[1] # 转成bytes类型 complete_img = base64.b64decode(complete_img_base64) # 加载图片 return 回去对比 image_c = Image.open(BytesIO(complete_img)) image_c.save(f'image{index + 1}.png') image.append(image_c) return image def is_pixel_similar(self, image1, image2, x, y): """比较两张图片的像素点 注意:像素点比较是有偏差的,需要允许一定范围的误差,我们可以设置一个阈值 """ # 获取两张图片执行位置的像素点 c_pixel = image1.load()[x, y] ic_pixel = image2.load()[x, y] # 阈值 允许误差 threshold = 10 # 对比 if abs(c_pixel[0] - ic_pixel[0]) < threshold and \ abs(c_pixel[1] - ic_pixel[1]) < threshold and \ abs(c_pixel[2] - ic_pixel[2]) < threshold: return True return False def get_slice_gap(self, image1, image2): """获取缺口的偏移量 通过比较两张图片的所有像素点, 获取两张图片是从哪里开始不同 从而得到 移动块 要在 x 方向移动的距离 返回 缺口的偏移量 Parameters ---------- image1: Image instance 完整的图片 image2: Image instance 有缺失的图片 Returns --------- int """ # image2.size:['width', 'height'] for x in range(image1.size[0]): for y in range(image1.size[1]): if not self.is_pixel_similar(image1, image2, x, y): # 移动块只在水平方向移动 只需返回 x return x def get_track(self, distance): """根据偏移量获取移动轨迹 返回 移动轨迹 Parameters ---------- distance: int 偏移量 Returns --------- int """ # 移动轨迹 track = [] # 当前位移 current = 0 # 减速阈值 mid = distance * 4 / 5 # 计算间隔 t = 0.2 # 初速度 v = 0 while current < distance: if current < mid: # 加速度为正2 a = 20 else: # 加速度为负3 a = -30 # 初速度v0 v0 = v # 当前速度v = v0 + at v = v0 + a * t # 移动距离x = v0t + 1/2 * a * t^2 move = v0 * t + 1 / 2 * a * t * t # 当前位移 current += move # 加入轨迹 track.append(round(move)) return track def move_to_gap(self, slider, tracks): """模拟人工将滑块到缺口处 Parameters ---------- slider: Any 滑块 tracks: Any 轨迹 """ ActionChains(self.browser).click_and_hold(slider).perform() for x in tracks: ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform() time.sleep(random.random()) ActionChains(self.browser).release().perform() def get_geetest_button(self): """获取初始验证按钮 """ return self.wait.until(ec.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button'))) def login_success(self): """判定是否登录成功 响应一个布尔值 Returns ---------- bool """ try: # 登录成功后 界面上会有一个消息按钮 return bool( WebDriverWait(self.browser, 5).until(ec.presence_of_element_located( (By.XPATH, '//a[@href="//message.bilibili.com/new"]')) ) ) except Exception as exc: print(exc) return False def login(self): """开始 """ # 打开浏览器, 输入账号 密码, 点击登陆 self.open() # 获取验证图 image2(有缺失的验证图) image1(完整的验证图) image1, image2 = self.get_geetest_image() # 获取缺口的偏移量 gap = self.get_slice_gap(image1, image2) print(f'缺口的偏移量为:{gap}') # 拖动滑块 有误差-8 track = self.get_track(gap - 12) slider = self.get_geetest_button() self.move_to_gap(slider, track) time.sleep(3) if self.login_success(): print('登陆成功,获取 cookie 成功 ~ ') cookies = {cookie["name"]: cookie["value"] for cookie in self.browser.get_cookies()} print(cookies) else: self.login() if __name__ == '__main__': account = input("请输入B站账号 >>>") pwd = input("请输入B站密码 >>>") instance = LoginBli(account, pwd) instance.login() ================================================ FILE: 【bilibili】视频下载/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-09 Python: 3.7 ================================================ FILE: 【bilibili】视频下载/video_download.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-09 Python: 3.7 import requests import urllib.request import time import hashlib import urllib import re from moviepy.editor import * # moviepy==0.2.3.2 class DownVideo(object): """ urllib.urlretrieve 的回调函数: def callbackfunc(blocknum, blocksize, totalsize): @blocknum: 已经下载的数据块 @blocksize: 数据块的大小 @totalsize: 远程文件的大小 """ # start_time = None def __init__(self,start_go): self.start_go = start_go def get_cid_list(self): start_url = 'https://api.bilibili.com/x/web-interface/view?aid=' + re.search(r'/av(\d+)/*', self.start_go).group(1) # 视频质量 quality = 16 # 1080p:80;720p:64;480p:32;360p:16 默认360p headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} html = requests.get(start_url, headers=headers).json() data = html['data'] video_title = data["title"].replace(" ", "_") cid_list = [] if '?p=' in start: # 单独下载分P视频中的一集 p = re.search(r'\?p=(\d+)', start).group(1) cid_list.append(data['pages'][int(p) - 1]) else: # 如果p不存在就是全集下载 cid_list = data['pages'] for item in cid_list: cid = str(item['cid']) title = item['part'] if not title: title = video_title title = re.sub(r'[\/\\:*?"<>|]', '', title) # 替换为空的 print('标题:' + title, 'ID', cid) page = str(item['page']) start_url = start_url + "/?p=" + page video_list = down.get_play_list(start_url, cid, quality) self.start_time = time.time() down.down_video(video_list, title, start_url, page) down.combine_video(video_list, title) print('下载完成了,快去撸视频吧') @staticmethod def get_play_list(start_url, cid, quality): """ 访问API """ entropy = 'rbMCKn@KuamXWlPMoJGsKcbiJKUfkPF_8dABscJntvqhRSETg' appkey, sec = ''.join([chr(ord(i) + 2) for i in entropy[::-1]]).split(':') params = 'appkey=%s&cid=%s&otype=json&qn=%s&quality=%s&type=' % (appkey, cid, quality, quality) chksum = hashlib.md5(bytes(params + sec, 'utf8')).hexdigest() url_api = 'https://interface.bilibili.com/v2/playurl?%s&sign=%s' % (params, chksum) headers = { 'Referer': start_url, 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } html = requests.get(url_api, headers=headers).json() video_list = [html['durl'][0]['url']] return video_list def schedule_cmd(self, blocknum, blocksize, totalsize): speed = (blocknum * blocksize) / (time.time() - self.start_time) speed_str = " Speed: %s" % self.format_size(speed) recv_size = blocknum * blocksize # 设置下载进度条 f = sys.stdout pervent = recv_size / totalsize percent_str = "%.2f%%" % (pervent * 100) n = round(pervent * 50) s = ('#' * n).ljust(50, '-') f.write(percent_str.ljust(8, ' ') + '[' + s + ']' + speed_str) f.flush() f.write('\r') def schedule(self, blocknum, blocksize, totalsize): """时间表 """ speed = (blocknum * blocksize) / (time.time() - self.start_time) speed_str = " Speed: %s" % self.format_size(speed) recv_size = blocknum * blocksize # 设置下载进度条 f = sys.stdout pervent = recv_size / totalsize percent_str = "%.2f%%" % (pervent * 100) n = round(pervent * 50) s = ('#' * n).ljust(50, '-') print(percent_str.ljust(6, ' ') + '-' + speed_str) f.flush() time.sleep(2) @staticmethod def format_size(bytes): """字节bytes转化K\M\G """ try: bytes = float(bytes) kb = bytes / 1024 except: print("传入的字节格式不对") return "Error" if kb >= 1024: M = kb / 1024 if M >= 1024: G = M / 1024 return "%.3fG" % (G) else: return "%.3fM" % (M) else: return "%.3fK" % (kb) def down_video(self, video_list, title, start_url, page): """下载视频 """ num = 1 print('正在下载请稍等...'.format(page)) current_video_path = os.path.join(sys.path[0], 'bilibili下载目录', title) # 当前目录作为下载目录 for i in video_list: opener = urllib.request.build_opener() # 请求头 opener.addheaders = [ # ('Host', 'upos-hz-mirrorks3.acgvideo.com'), #注意修改host,不用也行 ('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0) Gecko/20100101 Firefox/56.0'), ('Accept', '*/*'), ('Accept-Language', 'en-US,en;q=0.5'), ('Accept-Encoding', 'gzip, deflate, br'), ('Range', 'bytes=0-'), # Range 的值要为 bytes=0- 才能下载完整视频 ('Referer', start_url), # 注意修改referer,必须要加的! ('Origin', 'https://www.bilibili.com'), ('Connection', 'keep-alive'), ] urllib.request.install_opener(opener) # 创建文件夹存放下载的视频 if not os.path.exists(current_video_path): os.makedirs(current_video_path) # 开始下载 if len(video_list) > 1: urllib.request.urlretrieve(url=i, filename=os.path.join(current_video_path, r'{}-{}.mp4'.format(title, num)), reporthook=self.schedule_cmd) else: urllib.request.urlretrieve(url=i, filename=os.path.join(current_video_path, r'{}.mp4'.format(title)), reporthook=self.schedule_cmd) num += 1 @staticmethod def combine_video(video_list, title): """合并视频 """ current_video_path = os.path.join(sys.path[0], 'bilibili_video', title) # 当前目录作为下载目录 if len(video_list) >= 2: # 视频大于一段才要合并 print('下载完成,正在合并视频...' + title) # 定义一个数组 L = [] # 访问 video 文件夹 (假设视频都放在这里面) root_dir = current_video_path # 遍历所有文件 for file in sorted(os.listdir(root_dir), key=lambda x: int(x[x.rindex("-") + 1:x.rindex(".")])): # 如果后缀名为 .mp4/.flv if os.path.splitext(file)[1] == '.flv': # 拼接成完整路径 filePath = os.path.join(root_dir, file) # 载入视频 video = VideoFileClip(filePath) # 添加到数组 L.append(video) # 拼接视频 final_clip = concatenate_videoclips(L) # 生成目标视频文件 final_clip.to_videofile(os.path.join(root_dir, r'{}.mp4'.format(title)), fps=24, remove_temp=False) print('视频合并完成' + title) else: # 视频只有一段则直接打印下载完成 print('视频合并完成:' + title) if __name__ == '__main__': start = input('请填写网页链接:') # 例如: https://www.bilibili.com/video/av50782610 # 下载清晰度可以设置 # 实例化下载类 down = DownVideo(start) down.get_cid_list() ================================================ FILE: 【双色球】头奖分布/main.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-11-08 Python: 3.7 import requests import json import pandas as pd import openpyxl import jieba import wordcloud import matplotlib.pyplot as plt class SSQ: def __init__(self, file, font): self.header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36', 'Host': 'www.cwl.gov.cn', 'Referer': 'http://www.cwl.gov.cn/kjxx/ssq/kjgg/' } self.file = file self.font = font self.get_history_url = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=100' self.session = requests.session() def history(self): """爬取最近100期""" _dict = None try: self.session.get('http://www.cwl.gov.cn/kjxx/ssq/kjgg/') _dict = json.loads(self.session.get(self.get_history_url, headers=self.header).text) except TypeError: print('获取历史记录失败') finally: return _dict def clean_data(self, data): """ 清洗数据 :return: """ columns = [] for item in data.get('result'): columns.append([ item.get('code'), item.get('date'), item.get('week'), item.get('red').split(','), item.get('blue'), item.get('sales'), item.get('poolmoney'), item.get('content'), item.get('prizegrades')[0].get('typemoney'), item.get('prizegrades')[0].get('typenum'), item.get('prizegrades')[1].get('typemoney'), item.get('prizegrades')[1].get('typenum'), item.get('prizegrades')[2].get('typemoney'), item.get('prizegrades')[2].get('typenum'), ]) df = pd.DataFrame( columns, columns=["期数", "开奖日期", "星期数", "红球", "蓝球", "销售金额", "奖池", "中奖地区", "一等奖金", "一等奖人数", "二等奖金", "二等奖人数", "三等奖金", "三等奖人数"], # 指定列 ) self.save(df) self.set_data(df) def save(self, df): """储存 """ df.to_excel(self.file) def set_data(self, df): """ 数据预处理 :return: """ cut_text = [] for i in df['中奖地区']: for addr in i.split(',')[:-1]: name, num = jieba.cut(addr[:-1]) for n in range(int(num)): cut_text.append(name) print(" ".join(cut_text)) w = wordcloud.WordCloud(font_path=self.font, background_color="white", scale=4) w.generate(" ".join(cut_text)) plt.imshow(w, interpolation="bilinear") plt.axis("off") # plt.show() # 保存生成的图片 w.to_file('result.jpg') def parse_history(self): """ pandas 载入数据 :return: """ data = self.history() self.clean_data(data) if __name__ == "__main__": """ 请自行准备一个字体文件并导入路径 """ ssq = SSQ('近期记录.xlsx', '你自己准备的字库路径') ssq.parse_history() ================================================ FILE: 【壁纸】美女壁纸下载器/bg_down.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-11-06 Python: 3.7 from requests import get from filetype import guess from os import rename from os import makedirs from os.path import exists from json import loads from contextlib import closing class DownBg: """ 超级高清图片下载 """ def __init__(self): self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" } def down_load(self, file_url, file_full_name, now_photo_count, all_photo_count): # 开始下载图片 with closing(get(file_url, headers=self.headers, stream=True)) as response: chunk_size = 1024 # 单次请求最大值 content_size = int(response.headers['content-length']) # 文件总大小 data_count = 0 # 当前已传输的大小 with open(file_full_name, "wb") as file: for data in response.iter_content(chunk_size=chunk_size): file.write(data) done_block = int((data_count / content_size) * 50) data_count = data_count + len(data) now_jd = (data_count / content_size) * 100 print("\r %s:[%s%s] %d%% %d/%d" % ( file_full_name, done_block * '█', ' ' * (50 - 1 - done_block), now_jd, now_photo_count, all_photo_count), end=" ") # 下载完图片后获取图片扩展名,并为其增加扩展名 file_type = guess(file_full_name) rename(file_full_name, file_full_name + '.' + file_type.extension) def crawler_photo(self, type_id, photo_count): """ :param type_id: 最新 1, 最热 2, 女生 3, 星空 4 :param photo_count: 下载数量 :return: """ type_dict = { '1': '5c68ffb9463b7fbfe72b0db0', '2': '5c69251c9b1c011c41bb97be', '3': '5c81087e6aee28c541eefc26', '4': '5c81f64c96fad8fe211f5367' } url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/{key}?page=1&per_page='.format( key=type_dict.get(str(type_id))) + str(photo_count) # 获取图片列表数据 respond = get(url, headers=self.headers) photo_data = loads(respond.content) # 已经下载的图片张数 now_photo_count = 1 # 所有图片张数 all_photo_count = len(photo_data) # 开始下载并保存5K分辨率壁纸 for photo in photo_data: # 创建一个文件夹存放我们下载的图片 if not exists('./' + str(type_id)): makedirs('./' + str(type_id)) # 准备下载的图片链接 file_url = photo['urls']['raw'] # 准备下载的图片名称,不包含扩展名 file_name_only = file_url.split('/') file_name_only = file_name_only[len(file_name_only) - 1] # 准备保存到本地的完整路径 file_full_name = './' + str(type_id) + '/' + file_name_only # 开始下载图片 self.down_load(file_url, file_full_name, now_photo_count, all_photo_count) now_photo_count = now_photo_count + 1 if __name__ == '__main__': dg = DownBg() wall_paper_id = 1 wall_paper_count = 10 while True: wall_paper_id = input("\n\n壁纸类型:最新壁纸 1, 最热壁纸 2, 女生壁纸 3, 星空壁纸 4\n请输入编号以便选择5K超清壁纸类型:") wall_paper_count = input("请输入要下载的5K超清壁纸的数量:") if wall_paper_id not in ['1', '2', '3', '4'] or not wall_paper_count.isdigit(): print('输入有误') continue print("正在下载5K超清壁纸,请稍等……") dg.crawler_photo(int(wall_paper_id), int(wall_paper_count)) print('\n下载5K高清壁纸成功!') ================================================ FILE: 【大众点评】字体反爬、坐标反爬/参数生成/encryp.js ================================================ function make() { for (var t = 1 * new Date, n = 0; t === 1 * new Date && n < 200;) n++; return t.toString(16) + n.toString(16) } function test(love, you, babby) { var t = (you * babby).toString(16); return make() + "-" + Math.random().toString(16).replace(".", "") + "-" + function () { var t = love, n = void 0, e = void 0, i = [], r = 0; function o(t, n) { var e = void 0, r = 0; for (e = 0; e < n.length; e++) r |= i[e] << 8 * e; return t ^ r } for (n = 0; n < t.length; n++) e = t.charCodeAt(n), i.unshift(255 & e), 4 <= i.length && (r = o(r, i), i = []); return 0 < i.length && (r = o(r, i)), r.toString(16) }() + "-" + t + "-" + make() } function now_uu() { return (65536 * (1 + Math.random()) | 0).toString(16).substring(1) } function puid() { return "owl-" +now_uu() + now_uu() + "-" + now_uu() + "-" + now_uu() + "-" + now_uu() + "-" + now_uu() + now_uu() + now_uu() } ================================================ FILE: 【大众点评】字体反爬、坐标反爬/参数生成/uid.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-11-15 Python: 3.7 import execjs.runtime_names import random import requests import time from faker import Faker info = random.choice([[800, 1024], [900, 1440], [1050, 1680], [1200, 1920], [1200, 1600]]) with open("encryp.js", "r", encoding="utf-8") as f: js = execjs.compile(f.read()) print('引擎', execjs.get().name) uid = js.call('test', Faker().user_agent(), info[0], info[1]) page_id = js.call('puid') headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 'Host': 'catfront.dianping.com', 'Referer': 'http://www.dianping.com/shop/97789651', 'Origin': 'http://www.dianping.com', } headers2 = { 'Cookie': "_lxsdk_cuid=16e8184bc7cc8-00733806cb0caf-d087704-13c680-16e8184bc7cc8;", 'Referer': 'http://www.dianping.com/shop/76311084', 'Host': 'www.dianping.com', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', } sign_url = 'http://catfront.dianping.com/api/pv?v=1&sdk=1.8.13&project=app-pc-main-shop&pageurl=main-shop&pageId={pageId}×tamp={timestamp}®ion=&operator=&network=&container=&os=&unionid={unionid}' session = requests.session() session.get('http://www.dianping.com/shop/76311084', headers=headers2) response = session.post(sign_url.format(pageId=page_id, unionid=uid, timestamp=str(int(round(time.time() * 1000)))), headers=headers) print(uid, page_id) print(response) ================================================ FILE: 【大众点评】字体反爬、坐标反爬/旧版/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-12 Python: 3.7 ================================================ FILE: 【大众点评】字体反爬、坐标反爬/旧版/parse_address_poi.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-03-27 Python: 3.7 def to_base36(value): """converts a decimal integer to a 36 decimal string""" if not isinstance(value, int): raise TypeError("expected int, got %s: %r" % (value.__class__.__name__, value)) if value == 0: return "0" if value < 0: sign = "-" value = -value else: sign = "" result = [] while value: value, mod = divmod(value, 36) result.append("0123456789abcdefghijklmnopqrstuvwxyz"[mod]) return sign + "".join(reversed(result)) def decode(C): """parse poi""" digi = 16 add = 10 plus = 7 cha = 36 I = -1 H = 0 B = '' J = len(C) G = ord(C[-1]) C = C[:-1] J -= 1 for E in range(J): D = int(C[E], cha) - add if D >= add: D = D - plus B += to_base36(D) if D > H: I = E H = D A = int(B[:I], digi) F = int(B[I + 1:], digi) L = (A + F - int(G)) / 2 K = float(F - L) / 100000 L = float(L) / 100000 return {'lng': L, 'lat': K} if __name__ == '__main__': print(decode('HFHSGGZTWSATFG')) ================================================ FILE: 【大众点评】字体反爬、坐标反爬/旧版/parse_font_css.py ================================================ # -*- coding: utf-8 -*- # __author__ = "362416272@QQ.COM" # Date: 2019/3/25 Python: 3.7.2 import re from lxml import etree from requests_html import HTMLSession class DianPing(object): def __init__(self): # 此处以爬取第一页中的评论数为例 self.stat_url = 'http://www.dianping.com/huizhou/ch10/g103' @staticmethod def parse_url(url): # 解析并返回页面内容 session = HTMLSession() response = session.get(url) return response.content.decode() # 定义css的URL地址 def get_css(self, html): svg_text_css = re.search(r'href="([^"]+svgtextcss[^"]+)"', html, re.M) if not svg_text_css: raise Exception("未找到链接") css_url = svg_text_css.group(1) content = self.parse_url('https:' + css_url) return content # 获取定义偏移量的css文件后将结果以字典形式存储 @ staticmethod def get_css_offset(content_css): """ 通过传入页面中任意css获取其对应的偏移量 :return: {'xxx': ['192', '1550']} """ offset_item = re.findall(r'(\.[a-zA-Z0-9-]+)\{background:-(\d+).0px -(\d+).0px', content_css) result = {} for item in offset_item: css_class = item[0][1:] x_offset = item[1] y_offset = item[2] result[css_class] = [x_offset, y_offset] return result # 获取svg url组 @staticmethod def get_svg_url_dict(content_css): items = re.findall(r'span\[class\^="(.*?)"\].*?width: (\d+)px;.*?background-image: url\((.*?)\);', content_css) result = {} for code, size, url in items: svg_list = [int(size), 'https:' + url] result[code] = svg_list return result # 根据偏移量找到对应的数字 def parse_comment_css(self, svg_url, size, x_offset, y_offset): # print(size) # 要用size做像素偏移,做裴勇 svg_html = self.parse_url(svg_url) pattern = re.compile(r'y=.*?(\d+)">(\d+)', re.S) items = re.findall(pattern, svg_html) svg_list = [] for item in items: svg = {'y_key': int(item[0]), 'text': item[1]} svg_list.append(svg) x, y = int(x_offset), int(y_offset) if y <= svg_list[0]['y_key']: return svg_list[0]['text'][x // 12] elif y <= svg_list[1]['y_key']: return svg_list[1]['text'][x // 12] else: return svg_list[2]['text'][x // 12] # 获取点评数 def get_comment_num(self): content = self.parse_url(self.stat_url) html = etree.HTML(content) shops = html.xpath('.//div[@id="shop-all-list"]/ul/li') # 获取到所有店面 content_css = self.get_css(content) css_class_dirt = self.get_css_offset(content_css) # 偏移量字典存储 svg_url_dict = self.get_svg_url_dict(content_css) # svg的url dict储存 for shop in shops: shop_name = shop.xpath('.//div[@class="tit"]/a/@title')[0] # 获取店名 review_num = shop.xpath('.//div[@class="comment"]/a[contains(@class,"review-num")]/b')[0] # 获取可见的数字 num = 0 if review_num.text: # if 有可见字 num = int(review_num.text) for review_node in review_num: """每个字符解密一次""" css_class = review_node.attrib["class"] # 取css名 # 根据css名称获取偏移量 x_offset, y_offset = css_class_dirt[css_class][0], css_class_dirt[css_class][1] # 根据偏移量来找到对应的数字 svg = svg_url_dict[css_class[:2]] if not svg: svg = svg_url_dict[css_class[:3]] size = svg[0] svg_url = svg[1] new_num = self.parse_comment_css(svg_url, size, x_offset, y_offset) num = num * 10 + int(new_num) print("餐馆: {}, 点评数: {}".format(shop_name, num)) if __name__ == '__main__': dian_ping = DianPing() dian_ping.get_comment_num() ================================================ FILE: 【大众点评】字体反爬、坐标反爬/最新版7月/README.md ================================================ # 仅限学术交流 # 如有冒犯请立即联系作者删除 # 安装 **`pip3 install fontTools`** **`pip3 install requests`** **`pip3 install redis`** # 使用 1. 需要开启 redis 库 并配置,默认链接的本机 redis 2. 参考 `main.py` 中的调用代码 **[参考博客链接](https://www.zhangkunzhi.com/archives/72)** ================================================ FILE: 【大众点评】字体反爬、坐标反爬/最新版7月/font.json ================================================ {"FONT_LIST": [ "", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "店", "中", "美", "家", "馆", "小", "车", "大", "市", "公", "酒", "行", "国", "品", "发", "电", "金", "心", "业", "商", "司", "超", "生", "装", "园", "场", "食", "有", "新", "限", "天", "面", "工", "服", "海", "华", "水", "房", "饰", "城", "乐", "汽", "香", "部", "利", "子", "老", "艺", "花", "专", "东", "肉", "菜", "学", "福", "饭", "人", "百", "餐", "茶", "务", "通", "味", "所", "山", "区", "门", "药", "银", "农", "龙", "停", "尚", "安", "广", "鑫", "一", "容", "动", "南", "具", "源", "兴", "鲜", "记", "时", "机", "烤", "文", "康", "信", "果", "阳", "理", "锅", "宝", "达", "地", "儿", "衣", "特", "产", "西", "批", "坊", "州", "牛", "佳", "化", "五", "米", "修", "爱", "北", "养", "卖", "建", "材", "三", "会", "鸡", "室", "红", "站", "德", "王", "光", "名", "丽", "油", "院", "堂", "烧", "江", "社", "合", "星", "货", "型", "村", "自", "科", "快", "便", "日", "民", "营", "和", "活", "童", "明", "器", "烟", "育", "宾", "精", "屋", "经", "居", "庄", "石", "顺", "林", "尔", "县", "手", "厅", "销", "用", "好", "客", "火", "雅", "盛", "体", "旅", "之", "鞋", "辣", "作", "粉", "包", "楼", "校", "鱼", "平", "彩", "上", "吧", "保", "永", "万", "物", "教", "吃", "设", "医", "正", "造", "丰", "健", "点", "汤", "网", "庆", "技", "斯", "洗", "料", "配", "汇", "木", "缘", "加", "麻", "联", "卫", "川", "泰", "色", "世", "方", "寓", "风", "幼", "羊", "烫", "来", "高", "厂", "兰", "阿", "贝", "皮", "全", "女", "拉", "成", "云", "维", "贸", "道", "术", "运", "都", "口", "博", "河", "瑞", "宏", "京", "际", "路", "祥", "青", "镇", "厨", "培", "力", "惠", "连", "马", "鸿", "钢", "训", "影", "甲", "助", "窗", "布", "富", "牌", "头", "四", "多", "妆", "吉", "苑", "沙", "恒", "隆", "春", "干", "饼", "氏", "里", "二", "管", "诚", "制", "售", "嘉", "长", "轩", "杂", "副", "清", "计", "黄", "讯", "太", "鸭", "号", "街", "交", "与", "叉", "附", "近", "层", "旁", "对", "巷", "栋", "环", "省", "桥", "湖", "段", "乡", "厦", "府", "铺", "内", "侧", "元", "购", "前", "幢", "滨", "处", "向", "座", "下", "県", "凤", "港", "开", "关", "景", "泉", "塘", "放", "昌", "线", "湾", "政", "步", "宁", "解", "白", "田", "町", "溪", "十", "八", "古", "双", "胜", "本", "单", "同", "九", "迎", "第", "台", "玉", "锦", "底", "后", "七", "斜", "期", "武", "岭", "松", "角", "纪", "朝", "峰", "六", "振", "珠", "局", "岗", "洲", "横", "边", "济", "井", "办", "汉", "代", "临", "弄", "团", "外", "塔", "杨", "铁", "浦", "字", "年", "岛", "陵", "原", "梅", "进", "荣", "友", "虹", "央", "桂", "沿", "事", "津", "凯", "莲", "丁", "秀", "柳", "集", "紫", "旗", "张", "谷", "的", "是", "不", "了", "很", "还", "个", "也", "这", "我", "就", "在", "以", "可", "到", "错", "没", "去", "过", "感", "次", "要", "比", "觉", "看", "得", "说", "常", "真", "们", "但", "最", "喜", "哈", "么", "别", "位", "能", "较", "境", "非", "为", "欢", "然", "他", "挺", "着", "价", "那", "意", "种", "想", "出", "员", "两", "推", "做", "排", "实", "分", "间", "甜", "度", "起", "满", "给", "热", "完", "格", "荐", "喝", "等", "其", "再", "几", "只", "现", "朋", "候", "样", "直", "而", "买", "于", "般", "豆", "量", "选", "奶", "打", "每", "评", "少", "算", "又", "因", "情", "找", "些", "份", "置", "适", "什", "蛋", "师", "气", "你", "姐", "棒", "试", "总", "定", "啊", "足", "级", "整", "带", "虾", "如", "态", "且", "尝", "主", "话", "强", "当", "更", "板", "知", "己", "无", "酸", "让", "入", "啦", "式", "笑", "赞", "片", "酱", "差", "像", "提", "队", "走", "嫩", "才", "刚", "午", "接", "重", "串", "回", "晚", "微", "周", "值", "费", "性", "桌", "拍", "跟", "块", "调", "糕" ] } ================================================ FILE: 【大众点评】字体反爬、坐标反爬/最新版7月/main.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-25 Python: 3.7 """ 调用例子 实际运用中,导包路径自己填写好就行了 """ import redis import json import requests import re import os from fontTools.ttLib import TTFont HASH_TABLE = 'dianping:font' """ 【已知问题】 页面可能有多个字库(会自动捕获) 需要自己再对应字库中取字即可,请自行拓展 """ class ParseFontClass: def __init__(self, css_url, redis_host='127.0.0.1', redis_port=6379, redis_pass=None): """ redis 默认链接本机 :param redis_host: redis 链接地址 :param redis_port: redis 端口号 :param redis_pass: redis 密码 """ self.name_list = None if redis_pass: pool = redis.ConnectionPool(host=redis_host, port=redis_port, password=redis_pass, decode_responses=True) else: pool = redis.ConnectionPool(host=redis_host, port=redis_port, decode_responses=True) self.r = redis.Redis(connection_pool=pool) with open('font.json', 'r', encoding='utf-8') as f: data = json.load(f) self.FONT_LIST = data.get('FONT_LIST') self.css_url = css_url self.start() def parse_ttf(self, code): clean_code = code.replace(';', '')[-4:] # 只提取匹配区域 result_list = self.r.hmget(HASH_TABLE, self.name_list) # 取出对应字库表(已修复bug) for result in result_list: json_data = json.loads(result) if 'uni' + clean_code in json_data: return json_data['uni' + clean_code] return False def add_hash(self, name, json_data): """新增 hash """ self.r.hset(HASH_TABLE, name, json_data) def check_hash(self, name): """判断 hash key 是否存在 """ return self.r.hexists(HASH_TABLE, name) def get_ttf(self, css_url): """获取字体链接 """ headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' } result = requests.get(css_url, headers=headers) if result.status_code == 200: self.install_ttf(self.get_ttf_urls(result.text)) else: return None def install_ttf(self, ttf_list): """安装字体 """ self.name_list = [ttf[ttf.rfind('/')+1: -5] for ttf in ttf_list] # 提取字库名 # print(name_list) for index, name in enumerate(self.name_list): if self.check_hash(name): # 已存在无需安装 continue # 安装字体 with open(name + '.woff', 'wb+') as f: f.write(requests.get('http://' + ttf_list[index]).content) # 下载写入 font = TTFont(name + '.woff') uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder() # 取出字形保存到uniList中 json_data = json.dumps(dict(zip(uni_list, self.FONT_LIST)), ensure_ascii=False) self.add_hash(name, json_data) os.remove(name + '.woff') # 用完了删掉,节省资源占用 @staticmethod def get_ttf_urls(text): """提取字体链接 """ ttf_urls = [] urls = re.findall(r'url\("//(.*?)"\)', text) for url in urls: if url not in ttf_urls and '.woff' in url: ttf_urls.append(url) return ttf_urls def start(self): self.get_ttf(self.css_url) if __name__ == '__main__': """ 【已知问题】 页面可能有多个字库(会自动捕获) 需要自己再对应字库中取字即可,请自行拓展 """ # 这里需要传入页面中包含字体链接的 css 网址 pf = ParseFontClass('http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/8945b511eb964a95fe071d4852a7ef03.css') # 此处为页面上加密的 新华路 三个字 print(pf.parse_ttf('')) print(pf.parse_ttf('')) print(pf.parse_ttf('')) ================================================ FILE: 【天眼查】字体加密/tyc.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-12-06 Python: 3.7 """ 从网页下载一个字体文件获取对应推导式,动态获取请自行拓展 """ from fontTools.ttLib import TTFont import re font = TTFont('num.woff') # 打开tyc-num.woff font.saveXML('tyc-num.xml') # 保存为tyc-num.xml with open('tyc-num.xml', 'r') as f: xml = f.read() # 读取tyc-num.xml赋值给xml GlyphID = re.findall(r'', xml) # 获得对应关系 print(GlyphID) GlyphIDNameLists = list(set([int(Gname) for Gid, Gname in GlyphID])) # 对应关系数量转换 print(GlyphIDNameLists) DigitalDicts = {str(i): str(GlyphIDNameLists[i - 2]) for i in range(2, len(GlyphIDNameLists)+2)} # 数字对应关系的字典推导式 print(DigitalDicts) GlyphIDDicts = {str(Gname): DigitalDicts[Gid] for Gid, Gname in GlyphID} # 通过数字对应关系生成源代码跟页面显示的字典推导式 print('-' * 39 + '数字对应关系的字典推导式' + '-' * 39) print(DigitalDicts) print('-' * 27 + '通过数字对应关系生成源代码跟页面显示的字典推导式' + '-' * 27) print(GlyphIDDicts) ================================================ FILE: 【抖音】无水印视频解析/README.md ================================================ 这是一份抖音无水印单个视频的解析代码 ================================================ FILE: 【抖音】无水印视频解析/__init__.py ================================================ # -*- encoding: utf-8 -*- # Auth: Zok Email: 362416272@qq.com # Date: 2020/3/6 ================================================ FILE: 【抖音】无水印视频解析/parse.py ================================================ # -*- encoding: utf-8 -*- # Auth: Zok Email: 362416272@qq.com # Date: 2020/3/6 import re import requests import json class ParseVideo: def __init__(self, share): path = self.get_url(share) self.url = 'https://v.douyin.com/' + path + '/' self.headers = { 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', } self.session = requests.session() self.first_url = None @staticmethod def get_url(share_url): return re.search(r'https://v\.douyin\.com/(.*?)/', share_url).group(1) def go_location(self): response = self.session.get(self.url, headers=self.headers) self.first_url = response.url result = re.search(r'itemId: "(.*?)",[\s\S]*?uid: "(.*?)",[\s\S]*?authorName: "(.*?)",[\s\S]*?dytk: "(.*?)"', response.text) return result def go_message(self, ret): url = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' + ret.group(1) + '&dytk=' + ret.group(4) response = self.session.get(url, headers=self.headers) json_data = json.loads(response.text) user_id = ret.group(2) user_name = ret.group(3).encode('utf-8').decode('unicode_escape') if json_data.get('status_code') != 0: print('解析失败') exit() item_list = json_data.get('item_list')[0] aweme_id = item_list.get('aweme_id') desc = item_list.get('desc') comment_count = item_list.get('statistics').get('comment_count') digg_count = item_list.get('statistics').get('digg_count') video = item_list.get('video') cover = video.get('origin_cover').get('url_list')[0] play_addr = video.get('play_addr_lowbr').get('url_list')[0] play_addr_response = self.session.get(play_addr, headers=self.headers, allow_redirects=False) msg = """ 用户id:{user_id} 用户名:{user_name} 作品id:{aweme_id} 标题: {desc} 评论数: {comment_count} 点赞数: {digg_count} 封面地址:{cover} 无水印视频:{addr} """.format( user_id=user_id, user_name=user_name, aweme_id=aweme_id, desc=desc, comment_count=comment_count, digg_count=digg_count, cover=cover, addr=play_addr_response.headers['location'] ) print(msg) def start(self): result = self.go_location() self.go_message(result) if __name__ == '__main__': # text = '#在抖音,记录美好生活#要逆天!北京地坛医院证实新冠病毒攻击中枢神经系统 https://v.douyin.com/tW7qrw/ 复制此链接,打开【抖音短视频】,直接观看视频!' text = input('请输入分享链接>>>') pv = ParseVideo(text) pv.start() ================================================ FILE: 【拼多多】登陆参数生成/PinDuoDuo.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-23 Python: 3.7 import execjs.runtime_names """ pip3 install execjs npm i jsdom -g """ class PingDuoDuoSpider(object): """ 拼多多加密解析 """ def __init__(self, password): # 初始化 print('引擎', execjs.get().name) self.password = password def make(self): with open("encryp.js", "r", encoding="utf-8") as f: ctx = execjs.compile(f.read()) ret = ctx.call("test", self.password) print(ret) if __name__ == '__main__': key = input("输入字符串") pdd = PingDuoDuoSpider(key) pdd.make() ================================================ FILE: 【拼多多】登陆参数生成/README.md ================================================ # 解密过程参考博客 [博客链接](https://www.zhangkunzhi.com/archives/67) ================================================ FILE: 【拼多多】登陆参数生成/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-23 Python: 3.7 ================================================ FILE: 【拼多多】登陆参数生成/encryp.js ================================================ // 定义 navigator 与 window var navigator = {}; var window = this; // 等于当前对象 var a = {default_key_size: 1024, default_public_exponent: "010001", log: false, key: e} var e = "0123456789abcdefghijklmnopqrstuvwxyz"; function n(t) { return e.charAt(t) } function r(t, e) { return t & e } function o(t, e) { return t | e } function i(t, e) { return t ^ e } function a(t, e) { return t & ~e } function s(t) { if (0 == t) return -1; var e = 0; return 0 == (65535 & t) && (t >>= 16, e += 16), 0 == (255 & t) && (t >>= 8, e += 8), 0 == (15 & t) && (t >>= 4, e += 4), 0 == (3 & t) && (t >>= 2, e += 2), 0 == (1 & t) && ++e, e } function c(t) { for (var e = 0; 0 != t;) t &= t - 1, ++e; return e } var u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", l = "="; function f(t) { var e, n, r = ""; for (e = 0; e + 3 <= t.length; e += 3) n = parseInt(t.substring(e, e + 3), 16), r += u.charAt(n >> 6) + u.charAt(63 & n); for (e + 1 == t.length ? (n = parseInt(t.substring(e, e + 1), 16), r += u.charAt(n << 2)) : e + 2 == t.length && (n = parseInt(t.substring(e, e + 2), 16), r += u.charAt(n >> 2) + u.charAt((3 & n) << 4)); (3 & r.length) > 0;) r += l; return r } function p(t) { var e, r = "", o = 0, i = 0; for (e = 0; e < t.length && t.charAt(e) != l; ++e) { var a = u.indexOf(t.charAt(e)); a < 0 || (0 == o ? (r += n(a >> 2), i = 3 & a, o = 1) : 1 == o ? (r += n(i << 2 | a >> 4), i = 15 & a, o = 2) : 2 == o ? (r += n(i), r += n(a >> 2), i = 3 & a, o = 3) : (r += n(i << 2 | a >> 4), r += n(15 & a), o = 0)) } return 1 == o && (r += n(i << 2)), r } /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ var d, h, m = function(t, e) { return (m = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(t, e) { t.__proto__ = e } || function(t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) } )(t, e) }, g = { decode: function(t) { var e; if (void 0 === d) { var n = "0123456789ABCDEF", r = " \f\n\r\t \u2028\u2029"; for (d = {}, e = 0; e < 16; ++e) d[n.charAt(e)] = e; for (n = n.toLowerCase(), e = 10; e < 16; ++e) d[n.charAt(e)] = e; for (e = 0; e < r.length; ++e) d[r.charAt(e)] = -1 } var o = [], i = 0, a = 0; for (e = 0; e < t.length; ++e) { var s = t.charAt(e); if ("=" == s) break; if (-1 != (s = d[s])) { if (void 0 === s) throw new Error("Illegal character at offset " + e); i |= s, ++a >= 2 ? (o[o.length] = i, i = 0, a = 0) : i <<= 4 } } if (a) throw new Error("Hex encoding incomplete: 4 bits missing"); return o } }, v = { decode: function(t) { var e; if (void 0 === h) { var n = "= \f\n\r\t \u2028\u2029"; for (h = Object.create(null), e = 0; e < 64; ++e) h["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e)] = e; for (e = 0; e < n.length; ++e) h[n.charAt(e)] = -1 } var r = [], o = 0, i = 0; for (e = 0; e < t.length; ++e) { var a = t.charAt(e); if ("=" == a) break; if (-1 != (a = h[a])) { if (void 0 === a) throw new Error("Illegal character at offset " + e); o |= a, ++i >= 4 ? (r[r.length] = o >> 16, r[r.length] = o >> 8 & 255, r[r.length] = 255 & o, o = 0, i = 0) : o <<= 6 } } switch (i) { case 1: throw new Error("Base64 encoding incomplete: at least 2 bits missing"); case 2: r[r.length] = o >> 10; break; case 3: r[r.length] = o >> 16, r[r.length] = o >> 8 & 255 } return r }, re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/, unarmor: function(t) { var e = v.re.exec(t); if (e) if (e[1]) t = e[1]; else { if (!e[2]) throw new Error("RegExp out of sync"); t = e[2] } return v.decode(t) } }, y = function() { function t(t) { this.buf = [+t || 0] } return t.prototype.mulAdd = function(t, e) { var n, r, o = this.buf, i = o.length; for (n = 0; n < i; ++n) (r = o[n] * t + e) < 1e13 ? e = 0 : r -= 1e13 * (e = 0 | r / 1e13), o[n] = r; e > 0 && (o[n] = e) }, t.prototype.sub = function(t) { var e, n, r = this.buf, o = r.length; for (e = 0; e < o; ++e) (n = r[e] - t) < 0 ? (n += 1e13, t = 1) : t = 0, r[e] = n; for (; 0 === r[r.length - 1];) r.pop() }, t.prototype.toString = function(t) { if (10 != (t || 10)) throw new Error("only base 10 is supported"); for (var e = this.buf, n = e[e.length - 1].toString(), r = e.length - 2; r >= 0; --r) n += (1e13 + e[r]).toString().substring(1); return n }, t.prototype.valueOf = function() { for (var t = this.buf, e = 0, n = t.length - 1; n >= 0; --n) e = 1e13 * e + t[n]; return e }, t.prototype.simplify = function() { var t = this.buf; return 1 == t.length ? t[0] : this }, t }(), _ = "…", x = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, b = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/; function w(t, e) { return t.length > e && (t = t.substring(0, e) + _), t } var S, E = function() { function t(e, n) { this.hexDigits = "0123456789ABCDEF", e instanceof t ? (this.enc = e.enc, this.pos = e.pos) : (this.enc = e, this.pos = n) } return t.prototype.get = function(t) { if (void 0 === t && (t = this.pos++), t >= this.enc.length) throw new Error("Requesting byte offset " + t + " on a stream of length " + this.enc.length); return "string" == typeof this.enc ? this.enc.charCodeAt(t) : this.enc[t] }, t.prototype.hexByte = function(t) { return this.hexDigits.charAt(t >> 4 & 15) + this.hexDigits.charAt(15 & t) }, t.prototype.hexDump = function(t, e, n) { for (var r = "", o = t; o < e; ++o) if (r += this.hexByte(this.get(o)), !0 !== n) switch (15 & o) { case 7: r += " "; break; case 15: r += "\n"; break; default: r += " " } return r }, t.prototype.isASCII = function(t, e) { for (var n = t; n < e; ++n) { var r = this.get(n); if (r < 32 || r > 176) return !1 } return !0 }, t.prototype.parseStringISO = function(t, e) { for (var n = "", r = t; r < e; ++r) n += String.fromCharCode(this.get(r)); return n }, t.prototype.parseStringUTF = function(t, e) { for (var n = "", r = t; r < e;) { var o = this.get(r++); n += o < 128 ? String.fromCharCode(o) : o > 191 && o < 224 ? String.fromCharCode((31 & o) << 6 | 63 & this.get( r++)) : String.fromCharCode((15 & o) << 12 | (63 & this.get(r++)) << 6 | 63 & this.get(r++)) } return n }, t.prototype.parseStringBMP = function(t, e) { for (var n, r, o = "", i = t; i < e;) n = this.get(i++), r = this.get(i++), o += String.fromCharCode(n << 8 | r); return o }, t.prototype.parseTime = function(t, e, n) { var r = this.parseStringISO(t, e), o = (n ? x : b).exec(r); return o ? (n && (o[1] = +o[1], o[1] += +o[1] < 70 ? 2e3 : 1900), r = o[1] + "-" + o[2] + "-" + o[3] + " " + o[4], o[5] && (r += ":" + o[5], o[6] && (r += ":" + o[6], o[7] && (r += "." + o[7]))), o[8] && (r += " UTC", "Z" != o[8] && (r += o[8], o[9] && (r += ":" + o[9]))), r) : "Unrecognized time: " + r }, t.prototype.parseInteger = function(t, e) { for (var n, r = this.get(t), o = r > 127, i = o ? 255 : 0, a = ""; r == i && ++t < e;) r = this.get(t); if (0 == (n = e - t)) return o ? -1 : 0; if (n > 4) { for (a = r, n <<= 3; 0 == (128 & (+a ^ i));) a = +a << 1, --n; a = "(" + n + " bit)\n" } o && (r -= 256); for (var s = new y(r), c = t + 1; c < e; ++c) s.mulAdd(256, this.get(c)); return a + s.toString() }, t.prototype.parseBitString = function(t, e, n) { for (var r = this.get(t), o = (e - t - 1 << 3) - r, i = "(" + o + " bit)\n", a = "", s = t + 1; s < e; ++s) { for (var c = this.get(s), u = s == e - 1 ? r : 0, l = 7; l >= u; --l) a += c >> l & 1 ? "1" : "0"; if (a.length > n) return i + w(a, n) } return i + a }, t.prototype.parseOctetString = function(t, e, n) { if (this.isASCII(t, e)) return w(this.parseStringISO(t, e), n); var r = e - t, o = "(" + r + " byte)\n"; r > (n /= 2) && (e = t + n); for (var i = t; i < e; ++i) o += this.hexByte(this.get(i)); return r > n && (o += _), o }, t.prototype.parseOID = function(t, e, n) { for (var r = "", o = new y, i = 0, a = t; a < e; ++a) { var s = this.get(a); if (o.mulAdd(128, 127 & s), i += 7, !(128 & s)) { if ("" === r) if ((o = o.simplify()) instanceof y) o.sub(80), r = "2." + o.toString(); else { var c = o < 80 ? o < 40 ? 0 : 1 : 2; r = c + "." + (o - 40 * c) } else r += "." + o.toString(); if (r.length > n) return w(r, n); o = new y, i = 0 } } return i > 0 && (r += ".incomplete"), r }, t }(), O = function() { function t(t, e, n, r, o) { if (!(r instanceof C)) throw new Error("Invalid tag value."); this.stream = t, this.header = e, this.length = n, this.tag = r, this.sub = o } return t.prototype.typeName = function() { switch (this.tag.tagClass) { case 0: switch (this.tag.tagNumber) { case 0: return "EOC"; case 1: return "BOOLEAN"; case 2: return "INTEGER"; case 3: return "BIT_STRING"; case 4: return "OCTET_STRING"; case 5: return "NULL"; case 6: return "OBJECT_IDENTIFIER"; case 7: return "ObjectDescriptor"; case 8: return "EXTERNAL"; case 9: return "REAL"; case 10: return "ENUMERATED"; case 11: return "EMBEDDED_PDV"; case 12: return "UTF8String"; case 16: return "SEQUENCE"; case 17: return "SET"; case 18: return "NumericString"; case 19: return "PrintableString"; case 20: return "TeletexString"; case 21: return "VideotexString"; case 22: return "IA5String"; case 23: return "UTCTime"; case 24: return "GeneralizedTime"; case 25: return "GraphicString"; case 26: return "VisibleString"; case 27: return "GeneralString"; case 28: return "UniversalString"; case 30: return "BMPString" } return "Universal_" + this.tag.tagNumber.toString(); case 1: return "Application_" + this.tag.tagNumber.toString(); case 2: return "[" + this.tag.tagNumber.toString() + "]"; case 3: return "Private_" + this.tag.tagNumber.toString() } }, t.prototype.content = function(t) { if (void 0 === this.tag) return null; void 0 === t && (t = 1 / 0); var e = this.posContent(), n = Math.abs(this.length); if (!this.tag.isUniversal()) return null !== this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(e, e + n, t); switch (this.tag.tagNumber) { case 1: return 0 === this.stream.get(e) ? "false" : "true"; case 2: return this.stream.parseInteger(e, e + n); case 3: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(e, e + n, t); case 4: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(e, e + n, t); case 6: return this.stream.parseOID(e, e + n, t); case 16: case 17: return null !== this.sub ? "(" + this.sub.length + " elem)" : "(no elem)"; case 12: return w(this.stream.parseStringUTF(e, e + n), t); case 18: case 19: case 20: case 21: case 22: case 26: return w(this.stream.parseStringISO(e, e + n), t); case 30: return w(this.stream.parseStringBMP(e, e + n), t); case 23: case 24: return this.stream.parseTime(e, e + n, 23 == this.tag.tagNumber) } return null }, t.prototype.toString = function() { return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (null === this.sub ? "null" : this.sub.length) + "]" }, t.prototype.toPrettyString = function(t) { void 0 === t && (t = ""); var e = t + this.typeName() + " @" + this.stream.pos; if (this.length >= 0 && (e += "+"), e += this.length, this.tag.tagConstructed ? e += " (constructed)" : !this.tag.isUniversal() || 3 != this.tag.tagNumber && 4 != this.tag.tagNumber || null === this.sub || (e += " (encapsulates)"), e += "\n", null !== this.sub) { t += " "; for (var n = 0, r = this.sub.length; n < r; ++n) e += this.sub[n].toPrettyString(t) } return e }, t.prototype.posStart = function() { return this.stream.pos }, t.prototype.posContent = function() { return this.stream.pos + this.header }, t.prototype.posEnd = function() { return this.stream.pos + this.header + Math.abs(this.length) }, t.prototype.toHexString = function() { return this.stream.hexDump(this.posStart(), this.posEnd(), !0) }, t.decodeLength = function(t) { var e = t.get(), n = 127 & e; if (n == e) return n; if (n > 6) throw new Error("Length over 48 bits not supported at position " + (t.pos - 1)); if (0 === n) return null; e = 0; for (var r = 0; r < n; ++r) e = 256 * e + t.get(); return e }, t.prototype.getHexStringValue = function() { var t = this.toHexString(), e = 2 * this.header, n = 2 * this.length; return t.substr(e, n) }, t.decode = function(e) { var n; n = e instanceof E ? e : new E(e, 0); var r = new E(n), o = new C(n), i = t.decodeLength(n), a = n.pos, s = a - r.pos, c = null, u = function() { var e = []; if (null !== i) { for (var r = a + i; n.pos < r;) e[e.length] = t.decode(n); if (n.pos != r) throw new Error("Content size is not correct for container starting at offset " + a) } else try { for (;;) { var o = t.decode(n); if (o.tag.isEOC()) break; e[e.length] = o } i = a - n.pos } catch (t) { throw new Error("Exception while decoding undefined length content: " + t) } return e }; if (o.tagConstructed) c = u(); else if (o.isUniversal() && (3 == o.tagNumber || 4 == o.tagNumber)) try { if (3 == o.tagNumber && 0 != n.get()) throw new Error("BIT STRINGs with unused bits cannot encapsulate."); c = u(); for (var l = 0; l < c.length; ++l) if (c[l].tag.isEOC()) throw new Error("EOC is not supposed to be actual content.") } catch (t) { c = null } if (null === c) { if (null === i) throw new Error("We can't skip over an invalid tag with undefined length at offset " + a); n.pos = a + Math.abs(i) } return new t(r, s, i, o, c) }, t }(), C = function() { function t(t) { var e = t.get(); if (this.tagClass = e >> 6, this.tagConstructed = 0 != (32 & e), this.tagNumber = 31 & e, 31 == this.tagNumber) { var n = new y; do { e = t.get(), n.mulAdd(128, 127 & e) } while (128 & e); this.tagNumber = n.simplify() } } return t.prototype.isUniversal = function() { return 0 === this.tagClass }, t.prototype.isEOC = function() { return 0 === this.tagClass && 0 === this.tagNumber }, t }(), T = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 ], k = (1 << 26) / T[T.length - 1], A = function() { function t(t, e, n) { null != t && ("number" == typeof t ? this.fromNumber(t, e, n) : null == e && "string" != typeof t ? this.fromString( t, 256) : this.fromString(t, e)) } return t.prototype.toString = function(t) { if (this.s < 0) return "-" + this.negate().toString(t); var e; if (16 == t) e = 4; else if (8 == t) e = 3; else if (2 == t) e = 1; else if (32 == t) e = 5; else { if (4 != t) return this.toRadix(t); e = 2 } var r, o = (1 << e) - 1, i = !1, a = "", s = this.t, c = this.DB - s * this.DB % e; if (s-- > 0) for (c < this.DB && (r = this[s] >> c) > 0 && (i = !0, a = n(r)); s >= 0;) c < e ? (r = (this[s] & (1 << c) - 1) << e - c, r |= this[--s] >> (c += this.DB - e)) : (r = this[s] >> (c -= e) & o, c <= 0 && (c += this.DB, --s)), r > 0 && (i = !0), i && (a += n(r)); return i ? a : "0" }, t.prototype.negate = function() { var e = N(); return t.ZERO.subTo(this, e), e }, t.prototype.abs = function() { return this.s < 0 ? this.negate() : this }, t.prototype.compareTo = function(t) { var e = this.s - t.s; if (0 != e) return e; var n = this.t; if (0 != (e = n - t.t)) return this.s < 0 ? -e : e; for (; --n >= 0;) if (0 != (e = this[n] - t[n])) return e; return 0 }, t.prototype.bitLength = function() { return this.t <= 0 ? 0 : this.DB * (this.t - 1) + H(this[this.t - 1] ^ this.s & this.DM) }, t.prototype.mod = function(e) { var n = N(); return this.abs().divRemTo(e, null, n), this.s < 0 && n.compareTo(t.ZERO) > 0 && e.subTo(n, n), n }, t.prototype.modPowInt = function(t, e) { var n; return n = t < 256 || e.isEven() ? new P(e) : new D(e), this.exp(t, n) }, t.prototype.clone = function() { var t = N(); return this.copyTo(t), t }, t.prototype.intValue = function() { if (this.s < 0) { if (1 == this.t) return this[0] - this.DV; if (0 == this.t) return -1 } else { if (1 == this.t) return this[0]; if (0 == this.t) return 0 } return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0] }, t.prototype.byteValue = function() { return 0 == this.t ? this.s : this[0] << 24 >> 24 }, t.prototype.shortValue = function() { return 0 == this.t ? this.s : this[0] << 16 >> 16 }, t.prototype.signum = function() { return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1 }, t.prototype.toByteArray = function() { var t = this.t, e = []; e[0] = this.s; var n, r = this.DB - t * this.DB % 8, o = 0; if (t-- > 0) for (r < this.DB && (n = this[t] >> r) != (this.s & this.DM) >> r && (e[o++] = n | this.s << this.DB - r); t >= 0;) r < 8 ? (n = (this[t] & (1 << r) - 1) << 8 - r, n |= this[--t] >> (r += this.DB - 8)) : (n = this[t] >> (r -= 8) & 255, r <= 0 && (r += this.DB, --t)), 0 != (128 & n) && (n |= -256), 0 == o && (128 & this.s) != (128 & n) && ++o, (o > 0 || n != this.s) && (e[o++] = n); return e }, t.prototype.equals = function(t) { return 0 == this.compareTo(t) }, t.prototype.min = function(t) { return this.compareTo(t) < 0 ? this : t }, t.prototype.max = function(t) { return this.compareTo(t) > 0 ? this : t }, t.prototype.and = function(t) { var e = N(); return this.bitwiseTo(t, r, e), e }, t.prototype.or = function(t) { var e = N(); return this.bitwiseTo(t, o, e), e }, t.prototype.xor = function(t) { var e = N(); return this.bitwiseTo(t, i, e), e }, t.prototype.andNot = function(t) { var e = N(); return this.bitwiseTo(t, a, e), e }, t.prototype.not = function() { for (var t = N(), e = 0; e < this.t; ++e) t[e] = this.DM & ~this[e]; return t.t = this.t, t.s = ~this.s, t }, t.prototype.shiftLeft = function(t) { var e = N(); return t < 0 ? this.rShiftTo(-t, e) : this.lShiftTo(t, e), e }, t.prototype.shiftRight = function(t) { var e = N(); return t < 0 ? this.lShiftTo(-t, e) : this.rShiftTo(t, e), e }, t.prototype.getLowestSetBit = function() { for (var t = 0; t < this.t; ++t) if (0 != this[t]) return t * this.DB + s(this[t]); return this.s < 0 ? this.t * this.DB : -1 }, t.prototype.bitCount = function() { for (var t = 0, e = this.s & this.DM, n = 0; n < this.t; ++n) t += c(this[n] ^ e); return t }, t.prototype.testBit = function(t) { var e = Math.floor(t / this.DB); return e >= this.t ? 0 != this.s : 0 != (this[e] & 1 << t % this.DB) }, t.prototype.setBit = function(t) { return this.changeBit(t, o) }, t.prototype.clearBit = function(t) { return this.changeBit(t, a) }, t.prototype.flipBit = function(t) { return this.changeBit(t, i) }, t.prototype.add = function(t) { var e = N(); return this.addTo(t, e), e }, t.prototype.subtract = function(t) { var e = N(); return this.subTo(t, e), e }, t.prototype.multiply = function(t) { var e = N(); return this.multiplyTo(t, e), e }, t.prototype.divide = function(t) { var e = N(); return this.divRemTo(t, e, null), e }, t.prototype.remainder = function(t) { var e = N(); return this.divRemTo(t, null, e), e }, t.prototype.divideAndRemainder = function(t) { var e = N(), n = N(); return this.divRemTo(t, e, n), [e, n] }, t.prototype.modPow = function(t, e) { var n, r, o = t.bitLength(), i = U(1); if (o <= 0) return i; n = o < 18 ? 1 : o < 48 ? 3 : o < 144 ? 4 : o < 768 ? 5 : 6, r = o < 8 ? new P(e) : e.isEven() ? new B(e) : new D(e); var a = [], s = 3, c = n - 1, u = (1 << n) - 1; if (a[1] = r.convert(this), n > 1) { var l = N(); for (r.sqrTo(a[1], l); s <= u;) a[s] = N(), r.mulTo(l, a[s - 2], a[s]), s += 2 } var f, p, d = t.t - 1, h = !0, m = N(); for (o = H(t[d]) - 1; d >= 0;) { for (o >= c ? f = t[d] >> o - c & u : (f = (t[d] & (1 << o + 1) - 1) << c - o, d > 0 && (f |= t[d - 1] >> this.DB + o - c)), s = n; 0 == (1 & f);) f >>= 1, --s; if ((o -= s) < 0 && (o += this.DB, --d), h) a[f].copyTo(i), h = !1; else { for (; s > 1;) r.sqrTo(i, m), r.sqrTo(m, i), s -= 2; s > 0 ? r.sqrTo(i, m) : (p = i, i = m, m = p), r.mulTo(m, a[f], i) } for (; d >= 0 && 0 == (t[d] & 1 << o);) r.sqrTo(i, m), p = i, i = m, m = p, --o < 0 && (o = this.DB - 1, --d) } return r.revert(i) }, t.prototype.modInverse = function(e) { var n = e.isEven(); if (this.isEven() && n || 0 == e.signum()) return t.ZERO; for (var r = e.clone(), o = this.clone(), i = U(1), a = U(0), s = U(0), c = U(1); 0 != r.signum();) { for (; r.isEven();) r.rShiftTo(1, r), n ? (i.isEven() && a.isEven() || (i.addTo(this, i), a.subTo(e, a)), i.rShiftTo(1, i)) : a.isEven() || a.subTo(e, a), a.rShiftTo(1, a); for (; o.isEven();) o.rShiftTo(1, o), n ? (s.isEven() && c.isEven() || (s.addTo(this, s), c.subTo(e, c)), s.rShiftTo(1, s)) : c.isEven() || c.subTo(e, c), c.rShiftTo(1, c); r.compareTo(o) >= 0 ? (r.subTo(o, r), n && i.subTo(s, i), a.subTo(c, a)) : (o.subTo(r, o), n && s.subTo(i, s), c.subTo(a, c)) } return 0 != o.compareTo(t.ONE) ? t.ZERO : c.compareTo(e) >= 0 ? c.subtract(e) : c.signum() < 0 ? (c.addTo(e, c), c.signum() < 0 ? c.add(e) : c) : c }, t.prototype.pow = function(t) { return this.exp(t, new I) }, t.prototype.gcd = function(t) { var e = this.s < 0 ? this.negate() : this.clone(), n = t.s < 0 ? t.negate() : t.clone(); if (e.compareTo(n) < 0) { var r = e; e = n, n = r } var o = e.getLowestSetBit(), i = n.getLowestSetBit(); if (i < 0) return e; for (o < i && (i = o), i > 0 && (e.rShiftTo(i, e), n.rShiftTo(i, n)); e.signum() > 0;) (o = e.getLowestSetBit()) > 0 && e.rShiftTo(o, e), (o = n.getLowestSetBit()) > 0 && n.rShiftTo(o, n), e.compareTo(n) >= 0 ? (e.subTo(n, e), e.rShiftTo(1, e)) : (n.subTo(e, n), n.rShiftTo(1, n)); return i > 0 && n.lShiftTo(i, n), n }, t.prototype.isProbablePrime = function(t) { var e, n = this.abs(); if (1 == n.t && n[0] <= T[T.length - 1]) { for (e = 0; e < T.length; ++e) if (n[0] == T[e]) return !0; return !1 } if (n.isEven()) return !1; for (e = 1; e < T.length;) { for (var r = T[e], o = e + 1; o < T.length && r < k;) r *= T[o++]; for (r = n.modInt(r); e < o;) if (r % T[e++] == 0) return !1 } return n.millerRabin(t) }, t.prototype.copyTo = function(t) { for (var e = this.t - 1; e >= 0; --e) t[e] = this[e]; t.t = this.t, t.s = this.s }, t.prototype.fromInt = function(t) { this.t = 1, this.s = t < 0 ? -1 : 0, t > 0 ? this[0] = t : t < -1 ? this[0] = t + this.DV : this.t = 0 }, t.prototype.fromString = function(e, n) { var r; if (16 == n) r = 4; else if (8 == n) r = 3; else if (256 == n) r = 8; else if (2 == n) r = 1; else if (32 == n) r = 5; else { if (4 != n) return void this.fromRadix(e, n); r = 2 } this.t = 0, this.s = 0; for (var o = e.length, i = !1, a = 0; --o >= 0;) { var s = 8 == r ? 255 & +e[o] : F(e, o); s < 0 ? "-" == e.charAt(o) && (i = !0) : (i = !1, 0 == a ? this[this.t++] = s : a + r > this.DB ? (this[this.t - 1] |= (s & (1 << this.DB - a) - 1) << a, this[this.t++] = s >> this.DB - a) : this[this.t - 1] |= s << a, (a += r) >= this.DB && (a -= this.DB)) } 8 == r && 0 != (128 & +e[0]) && (this.s = -1, a > 0 && (this[this.t - 1] |= (1 << this.DB - a) - 1 << a)), this.clamp(), i && t.ZERO.subTo(this, this) }, t.prototype.clamp = function() { for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t;) --this.t }, t.prototype.dlShiftTo = function(t, e) { var n; for (n = this.t - 1; n >= 0; --n) e[n + t] = this[n]; for (n = t - 1; n >= 0; --n) e[n] = 0; e.t = this.t + t, e.s = this.s }, t.prototype.drShiftTo = function(t, e) { for (var n = t; n < this.t; ++n) e[n - t] = this[n]; e.t = Math.max(this.t - t, 0), e.s = this.s }, t.prototype.lShiftTo = function(t, e) { for (var n = t % this.DB, r = this.DB - n, o = (1 << r) - 1, i = Math.floor(t / this.DB), a = this.s << n & this .DM, s = this.t - 1; s >= 0; --s) e[s + i + 1] = this[s] >> r | a, a = (this[s] & o) << n; for (var s = i - 1; s >= 0; --s) e[s] = 0; e[i] = a, e.t = this.t + i + 1, e.s = this.s, e.clamp() }, t.prototype.rShiftTo = function(t, e) { e.s = this.s; var n = Math.floor(t / this.DB); if (n >= this.t) e.t = 0; else { var r = t % this.DB, o = this.DB - r, i = (1 << r) - 1; e[0] = this[n] >> r; for (var a = n + 1; a < this.t; ++a) e[a - n - 1] |= (this[a] & i) << o, e[a - n] = this[a] >> r; r > 0 && (e[this.t - n - 1] |= (this.s & i) << o), e.t = this.t - n, e.clamp() } }, t.prototype.subTo = function(t, e) { for (var n = 0, r = 0, o = Math.min(t.t, this.t); n < o;) r += this[n] - t[n], e[n++] = r & this.DM, r >>= this.DB; if (t.t < this.t) { for (r -= t.s; n < this.t;) r += this[n], e[n++] = r & this.DM, r >>= this.DB; r += this.s } else { for (r += this.s; n < t.t;) r -= t[n], e[n++] = r & this.DM, r >>= this.DB; r -= t.s } e.s = r < 0 ? -1 : 0, r < -1 ? e[n++] = this.DV + r : r > 0 && (e[n++] = r), e.t = n, e.clamp() }, t.prototype.multiplyTo = function(e, n) { var r = this.abs(), o = e.abs(), i = r.t; for (n.t = i + o.t; --i >= 0;) n[i] = 0; for (i = 0; i < o.t; ++i) n[i + r.t] = r.am(0, o[i], n, i, 0, r.t); n.s = 0, n.clamp(), this.s != e.s && t.ZERO.subTo(n, n) }, t.prototype.squareTo = function(t) { for (var e = this.abs(), n = t.t = 2 * e.t; --n >= 0;) t[n] = 0; for (n = 0; n < e.t - 1; ++n) { var r = e.am(n, e[n], t, 2 * n, 0, 1); (t[n + e.t] += e.am(n + 1, 2 * e[n], t, 2 * n + 1, r, e.t - n - 1)) >= e.DV && (t[n + e.t] -= e.DV, t[n + e.t + 1] = 1) } t.t > 0 && (t[t.t - 1] += e.am(n, e[n], t, 2 * n, 0, 1)), t.s = 0, t.clamp() }, t.prototype.divRemTo = function(e, n, r) { var o = e.abs(); if (!(o.t <= 0)) { var i = this.abs(); if (i.t < o.t) return null != n && n.fromInt(0), void(null != r && this.copyTo(r)); null == r && (r = N()); var a = N(), s = this.s, c = e.s, u = this.DB - H(o[o.t - 1]); u > 0 ? (o.lShiftTo(u, a), i.lShiftTo(u, r)) : (o.copyTo(a), i.copyTo(r)); var l = a.t, f = a[l - 1]; if (0 != f) { var p = f * (1 << this.F1) + (l > 1 ? a[l - 2] >> this.F2 : 0), d = this.FV / p, h = (1 << this.F1) / p, m = 1 << this.F2, g = r.t, v = g - l, y = null == n ? N() : n; for (a.dlShiftTo(v, y), r.compareTo(y) >= 0 && (r[r.t++] = 1, r.subTo(y, r)), t.ONE.dlShiftTo(l, y), y.subTo(a, a); a.t < l;) a[a.t++] = 0; for (; --v >= 0;) { var _ = r[--g] == f ? this.DM : Math.floor(r[g] * d + (r[g - 1] + m) * h); if ((r[g] += a.am(0, _, r, v, 0, l)) < _) for (a.dlShiftTo(v, y), r.subTo(y, r); r[g] < --_;) r.subTo(y, r) } null != n && (r.drShiftTo(l, n), s != c && t.ZERO.subTo(n, n)), r.t = l, r.clamp(), u > 0 && r.rShiftTo(u, r), s < 0 && t.ZERO.subTo(r, r) } } }, t.prototype.invDigit = function() { if (this.t < 1) return 0; var t = this[0]; if (0 == (1 & t)) return 0; var e = 3 & t; return (e = (e = (e = (e = e * (2 - (15 & t) * e) & 15) * (2 - (255 & t) * e) & 255) * (2 - ((65535 & t) * e & 65535)) & 65535) * (2 - t * e % this.DV) % this.DV) > 0 ? this.DV - e : -e }, t.prototype.isEven = function() { return 0 == (this.t > 0 ? 1 & this[0] : this.s) }, t.prototype.exp = function(e, n) { if (e > 4294967295 || e < 1) return t.ONE; var r = N(), o = N(), i = n.convert(this), a = H(e) - 1; for (i.copyTo(r); --a >= 0;) if (n.sqrTo(r, o), (e & 1 << a) > 0) n.mulTo(o, i, r); else { var s = r; r = o, o = s } return n.revert(r) }, t.prototype.chunkSize = function(t) { return Math.floor(Math.LN2 * this.DB / Math.log(t)) }, t.prototype.toRadix = function(t) { if (null == t && (t = 10), 0 == this.signum() || t < 2 || t > 36) return "0"; var e = this.chunkSize(t), n = Math.pow(t, e), r = U(n), o = N(), i = N(), a = ""; for (this.divRemTo(r, o, i); o.signum() > 0;) a = (n + i.intValue()).toString(t).substr(1) + a, o.divRemTo(r, o, i); return i.intValue().toString(t) + a }, t.prototype.fromRadix = function(e, n) { this.fromInt(0), null == n && (n = 10); for (var r = this.chunkSize(n), o = Math.pow(n, r), i = !1, a = 0, s = 0, c = 0; c < e.length; ++c) { var u = F(e, c); u < 0 ? "-" == e.charAt(c) && 0 == this.signum() && (i = !0) : (s = n * s + u, ++a >= r && (this.dMultiply(o), this.dAddOffset(s, 0), a = 0, s = 0)) } a > 0 && (this.dMultiply(Math.pow(n, a)), this.dAddOffset(s, 0)), i && t.ZERO.subTo(this, this) }, t.prototype.fromNumber = function(e, n, r) { if ("number" == typeof n) if (e < 2) this.fromInt(1); else for (this.fromNumber(e, r), this.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), o, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(n);) this.dAddOffset(2, 0), this.bitLength() > e && this.subTo(t.ONE.shiftLeft(e - 1), this); else { var i = [], a = 7 & e; i.length = 1 + (e >> 3), n.nextBytes(i), a > 0 ? i[0] &= (1 << a) - 1 : i[0] = 0, this.fromString(i, 256) } }, t.prototype.bitwiseTo = function(t, e, n) { var r, o, i = Math.min(t.t, this.t); for (r = 0; r < i; ++r) n[r] = e(this[r], t[r]); if (t.t < this.t) { for (o = t.s & this.DM, r = i; r < this.t; ++r) n[r] = e(this[r], o); n.t = this.t } else { for (o = this.s & this.DM, r = i; r < t.t; ++r) n[r] = e(o, t[r]); n.t = t.t } n.s = e(this.s, t.s), n.clamp() }, t.prototype.changeBit = function(e, n) { var r = t.ONE.shiftLeft(e); return this.bitwiseTo(r, n, r), r }, t.prototype.addTo = function(t, e) { for (var n = 0, r = 0, o = Math.min(t.t, this.t); n < o;) r += this[n] + t[n], e[n++] = r & this.DM, r >>= this.DB; if (t.t < this.t) { for (r += t.s; n < this.t;) r += this[n], e[n++] = r & this.DM, r >>= this.DB; r += this.s } else { for (r += this.s; n < t.t;) r += t[n], e[n++] = r & this.DM, r >>= this.DB; r += t.s } e.s = r < 0 ? -1 : 0, r > 0 ? e[n++] = r : r < -1 && (e[n++] = this.DV + r), e.t = n, e.clamp() }, t.prototype.dMultiply = function(t) { this[this.t] = this.am(0, t - 1, this, 0, 0, this.t), ++this.t, this.clamp() }, t.prototype.dAddOffset = function(t, e) { if (0 != t) { for (; this.t <= e;) this[this.t++] = 0; for (this[e] += t; this[e] >= this.DV;) this[e] -= this.DV, ++e >= this.t && (this[this.t++] = 0), ++this[e] } }, t.prototype.multiplyLowerTo = function(t, e, n) { var r = Math.min(this.t + t.t, e); for (n.s = 0, n.t = r; r > 0;) n[--r] = 0; for (var o = n.t - this.t; r < o; ++r) n[r + this.t] = this.am(0, t[r], n, r, 0, this.t); for (var o = Math.min(t.t, e); r < o; ++r) this.am(0, t[r], n, r, 0, e - r); n.clamp() }, t.prototype.multiplyUpperTo = function(t, e, n) { --e; var r = n.t = this.t + t.t - e; for (n.s = 0; --r >= 0;) n[r] = 0; for (r = Math.max(e - this.t, 0); r < t.t; ++r) n[this.t + r - e] = this.am(e - r, t[r], n, 0, 0, this.t + r - e); n.clamp(), n.drShiftTo(1, n) }, t.prototype.modInt = function(t) { if (t <= 0) return 0; var e = this.DV % t, n = this.s < 0 ? t - 1 : 0; if (this.t > 0) if (0 == e) n = this[0] % t; else for (var r = this.t - 1; r >= 0; --r) n = (e * n + this[r]) % t; return n }, t.prototype.millerRabin = function(e) { var n = this.subtract(t.ONE), r = n.getLowestSetBit(); if (r <= 0) return !1; var o = n.shiftRight(r); (e = e + 1 >> 1) > T.length && (e = T.length); for (var i = N(), a = 0; a < e; ++a) { i.fromInt(T[Math.floor(Math.random() * T.length)]); var s = i.modPow(o, this); if (0 != s.compareTo(t.ONE) && 0 != s.compareTo(n)) { for (var c = 1; c++ < r && 0 != s.compareTo(n);) if (0 == (s = s.modPowInt(2, this)).compareTo(t.ONE)) return !1; if (0 != s.compareTo(n)) return !1 } } return !0 }, t.prototype.square = function() { var t = N(); return this.squareTo(t), t }, t.prototype.gcda = function(t, e) { var n = this.s < 0 ? this.negate() : this.clone(), r = t.s < 0 ? t.negate() : t.clone(); if (n.compareTo(r) < 0) { var o = n; n = r, r = o } var i = n.getLowestSetBit(), a = r.getLowestSetBit(); if (a < 0) e(n); else { i < a && (a = i), a > 0 && (n.rShiftTo(a, n), r.rShiftTo(a, r)); var s = function() { (i = n.getLowestSetBit()) > 0 && n.rShiftTo(i, n), (i = r.getLowestSetBit()) > 0 && r.rShiftTo(i, r), n.compareTo(r) >= 0 ? (n.subTo(r, n), n.rShiftTo(1, n)) : (r.subTo(n, r), r.rShiftTo(1, r)), n.signum() > 0 ? setTimeout(s, 0) : (a > 0 && r.lShiftTo(a, r), setTimeout(function() { e(r) }, 0)) }; setTimeout(s, 10) } }, t.prototype.fromNumberAsync = function(e, n, r, i) { if ("number" == typeof n) if (e < 2) this.fromInt(1); else { this.fromNumber(e, r), this.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), o, this), this.isEven() && this.dAddOffset(1, 0); var a = this, s = function() { a.dAddOffset(2, 0), a.bitLength() > e && a.subTo(t.ONE.shiftLeft(e - 1), a), a.isProbablePrime(n) ? setTimeout(function() { i() }, 0) : setTimeout(s, 0) }; setTimeout(s, 0) } else { var c = [], u = 7 & e; c.length = 1 + (e >> 3), n.nextBytes(c), u > 0 ? c[0] &= (1 << u) - 1 : c[0] = 0, this.fromString(c, 256) } }, t }(), I = function() { function t() {} return t.prototype.convert = function(t) { return t }, t.prototype.revert = function(t) { return t }, t.prototype.mulTo = function(t, e, n) { t.multiplyTo(e, n) }, t.prototype.sqrTo = function(t, e) { t.squareTo(e) }, t }(), P = function() { function t(t) { this.m = t } return t.prototype.convert = function(t) { return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t }, t.prototype.revert = function(t) { return t }, t.prototype.reduce = function(t) { t.divRemTo(this.m, null, t) }, t.prototype.mulTo = function(t, e, n) { t.multiplyTo(e, n), this.reduce(n) }, t.prototype.sqrTo = function(t, e) { t.squareTo(e), this.reduce(e) }, t }(), D = function() { function t(t) { this.m = t, this.mp = t.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << t.DB - 15) - 1, this.mt2 = 2 * t.t } return t.prototype.convert = function(t) { var e = N(); return t.abs().dlShiftTo(this.m.t, e), e.divRemTo(this.m, null, e), t.s < 0 && e.compareTo(A.ZERO) > 0 && this.m.subTo(e, e), e }, t.prototype.revert = function(t) { var e = N(); return t.copyTo(e), this.reduce(e), e }, t.prototype.reduce = function(t) { for (; t.t <= this.mt2;) t[t.t++] = 0; for (var e = 0; e < this.m.t; ++e) { var n = 32767 & t[e], r = n * this.mpl + ((n * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM; for (n = e + this.m.t, t[n] += this.m.am(0, r, t, e, 0, this.m.t); t[n] >= t.DV;) t[n] -= t.DV, t[++n]++ } t.clamp(), t.drShiftTo(this.m.t, t), t.compareTo(this.m) >= 0 && t.subTo(this.m, t) }, t.prototype.mulTo = function(t, e, n) { t.multiplyTo(e, n), this.reduce(n) }, t.prototype.sqrTo = function(t, e) { t.squareTo(e), this.reduce(e) }, t }(), B = function() { function t(t) { this.m = t, this.r2 = N(), this.q3 = N(), A.ONE.dlShiftTo(2 * t.t, this.r2), this.mu = this.r2.divide(t) } return t.prototype.convert = function(t) { if (t.s < 0 || t.t > 2 * this.m.t) return t.mod(this.m); if (t.compareTo(this.m) < 0) return t; var e = N(); return t.copyTo(e), this.reduce(e), e }, t.prototype.revert = function(t) { return t }, t.prototype.reduce = function(t) { for (t.drShiftTo(this.m.t - 1, this.r2), t.t > this.m.t + 1 && (t.t = this.m.t + 1, t.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0;) t.dAddOffset(1, this.m.t + 1); for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0;) t.subTo(this.m, t) }, t.prototype.mulTo = function(t, e, n) { t.multiplyTo(e, n), this.reduce(n) }, t.prototype.sqrTo = function(t, e) { t.squareTo(e), this.reduce(e) }, t }(); function N() { return new A(null) } function j(t, e) { return new A(t, e) } "Microsoft Internet Explorer" == navigator.appName ? (A.prototype.am = function(t, e, n, r, o, i) { for (var a = 32767 & e, s = e >> 15; --i >= 0;) { var c = 32767 & this[t], u = this[t++] >> 15, l = s * c + u * a; c = a * c + ((32767 & l) << 15) + n[r] + (1073741823 & o), o = (c >>> 30) + (l >>> 15) + s * u + (o >>> 30), n[r++] = 1073741823 & c } return o }, S = 30) : "Netscape" != navigator.appName ? (A.prototype.am = function(t, e, n, r, o, i) { for (; --i >= 0;) { var a = e * this[t++] + n[r] + o; o = Math.floor(a / 67108864), n[r++] = 67108863 & a } return o }, S = 26) : (A.prototype.am = function(t, e, n, r, o, i) { for (var a = 16383 & e, s = e >> 14; --i >= 0;) { var c = 16383 & this[t], u = this[t++] >> 14, l = s * c + u * a; c = a * c + ((16383 & l) << 14) + n[r] + o, o = (c >> 28) + (l >> 14) + s * u, n[r++] = 268435455 & c } return o }, S = 28), A.prototype.DB = S, A.prototype.DM = (1 << S) - 1, A.prototype.DV = 1 << S, A.prototype.FV = Math.pow(2, 52), A.prototype.F1 = 52 - S, A.prototype.F2 = 2 * S - 52; var M, R, L = []; for (M = "0".charCodeAt(0), R = 0; R <= 9; ++R) L[M++] = R; for (M = "a".charCodeAt(0), R = 10; R < 36; ++R) L[M++] = R; for (M = "A".charCodeAt(0), R = 10; R < 36; ++R) L[M++] = R; function F(t, e) { var n = L[t.charCodeAt(e)]; return null == n ? -1 : n } function U(t) { var e = N(); return e.fromInt(t), e } function H(t) { var e, n = 1; return 0 != (e = t >>> 16) && (t = e, n += 16), 0 != (e = t >> 8) && (t = e, n += 8), 0 != (e = t >> 4) && (t = e, n += 4), 0 != (e = t >> 2) && (t = e, n += 2), 0 != (e = t >> 1) && (t = e, n += 1), n } A.ZERO = U(0), A.ONE = U(1); var q, z, V = function() { function t() { this.i = 0, this.j = 0, this.S = [] } return t.prototype.init = function(t) { var e, n, r; for (e = 0; e < 256; ++e) this.S[e] = e; for (n = 0, e = 0; e < 256; ++e) n = n + this.S[e] + t[e % t.length] & 255, r = this.S[e], this.S[e] = this.S[n], this.S[n] = r; this.i = 0, this.j = 0 }, t.prototype.next = function() { var t; return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, t = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = t, this.S[t + this.S[this.i] & 255] }, t }(), W = 256, K = null; if (null == K) { K = [], z = 0; var G = void 0; if (window.crypto && window.crypto.getRandomValues) { var $ = new Uint32Array(256); for (window.crypto.getRandomValues($), G = 0; G < $.length; ++G) K[z++] = 255 & $[G] } var X = function(t) { if (this.count = this.count || 0, this.count >= 256 || z >= W) window.removeEventListener ? window.removeEventListener("mousemove", X, !1) : window.detachEvent && window.detachEvent( "onmousemove", X); else try { var e = t.x + t.y; K[z++] = 255 & e, this.count += 1 } catch (t) {} }; window.addEventListener ? window.addEventListener("mousemove", X, !1) : window.attachEvent && window.attachEvent( "onmousemove", X) } function Q() { if (null == q) { for (q = new V; z < W;) { var t = Math.floor(65536 * Math.random()); K[z++] = 255 & t } for (q.init(K), z = 0; z < K.length; ++z) K[z] = 0; z = 0 } return q.next() } var Y = function() { function t() {} return t.prototype.nextBytes = function(t) { for (var e = 0; e < t.length; ++e) t[e] = Q() }, t }(), J = function() { function t() { this.n = null, this.e = 0, this.d = null, this.p = null, this.q = null, this.dmp1 = null, this.dmq1 = null, this.coeff = null } return t.prototype.doPublic = function(t) { return t.modPowInt(this.e, this.n) }, t.prototype.doPrivate = function(t) { if (null == this.p || null == this.q) return t.modPow(this.d, this.n); for (var e = t.mod(this.p).modPow(this.dmp1, this.p), n = t.mod(this.q).modPow(this.dmq1, this.q); e.compareTo(n) < 0;) e = e.add(this.p); return e.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n) }, t.prototype.setPublic = function(t, e) { null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = j(t, 16), this.e = parseInt(e, 16)) : console.error("Invalid RSA public key") }, t.prototype.encrypt = function(t) { var e = function(t, e) { if (e < t.length + 11) return console.error("Message too long for RSA"), null; for (var n = [], r = t.length - 1; r >= 0 && e > 0;) { var o = t.charCodeAt(r--); o < 128 ? n[--e] = o : o > 127 && o < 2048 ? (n[--e] = 63 & o | 128, n[--e] = o >> 6 | 192) : (n[--e] = 63 & o | 128, n[--e] = o >> 6 & 63 | 128, n[--e] = o >> 12 | 224) } n[--e] = 0; for (var i = new Y, a = []; e > 2;) { for (a[0] = 0; 0 == a[0];) i.nextBytes(a); n[--e] = a[0] } return n[--e] = 2, n[--e] = 0, new A(n) }(t, this.n.bitLength() + 7 >> 3); if (null == e) return null; var n = this.doPublic(e); if (null == n) return null; var r = n.toString(16); return 0 == (1 & r.length) ? r : "0" + r }, t.prototype.setPrivate = function(t, e, n) { null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = j(t, 16), this.e = parseInt(e, 16), this.d = j(n, 16)) : console.error("Invalid RSA private key") }, t.prototype.setPrivateEx = function(t, e, n, r, o, i, a, s) { null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = j(t, 16), this.e = parseInt(e, 16), this.d = j(n, 16), this.p = j(r, 16), this.q = j(o, 16), this.dmp1 = j(i, 16), this.dmq1 = j(a, 16), this.coeff = j(s, 16)) : console.error("Invalid RSA private key") }, t.prototype.generate = function(t, e) { var n = new Y, r = t >> 1; this.e = parseInt(e, 16); for (var o = new A(e, 16);;) { for (; this.p = new A(t - r, 1, n), 0 != this.p.subtract(A.ONE).gcd(o).compareTo(A.ONE) || !this.p.isProbablePrime(10);) ; for (; this.q = new A(r, 1, n), 0 != this.q.subtract(A.ONE).gcd(o).compareTo(A.ONE) || !this.q.isProbablePrime(10);) ; if (this.p.compareTo(this.q) <= 0) { var i = this.p; this.p = this.q, this.q = i } var a = this.p.subtract(A.ONE), s = this.q.subtract(A.ONE), c = a.multiply(s); if (0 == c.gcd(o).compareTo(A.ONE)) { this.n = this.p.multiply(this.q), this.d = o.modInverse(c), this.dmp1 = this.d.mod(a), this.dmq1 = this.d.mod(s), this.coeff = this.q.modInverse(this.p); break } } }, t.prototype.decrypt = function(t) { var e = j(t, 16), n = this.doPrivate(e); return null == n ? null : function(t, e) { for (var n = t.toByteArray(), r = 0; r < n.length && 0 == n[r];) ++r; if (n.length - r != e - 1 || 2 != n[r]) return null; for (++r; 0 != n[r];) if (++r >= n.length) return null; for (var o = ""; ++r < n.length;) { var i = 255 & n[r]; i < 128 ? o += String.fromCharCode(i) : i > 191 && i < 224 ? (o += String.fromCharCode((31 & i) << 6 | 63 & n[ r + 1]), ++r) : (o += String.fromCharCode((15 & i) << 12 | (63 & n[r + 1]) << 6 | 63 & n[r + 2]), r += 2) } return o }(n, this.n.bitLength() + 7 >> 3) }, t.prototype.generateAsync = function(t, e, n) { var r = new Y, o = t >> 1; this.e = parseInt(e, 16); var i = new A(e, 16), a = this, s = function() { var e = function() { if (a.p.compareTo(a.q) <= 0) { var t = a.p; a.p = a.q, a.q = t } var e = a.p.subtract(A.ONE), r = a.q.subtract(A.ONE), o = e.multiply(r); 0 == o.gcd(i).compareTo(A.ONE) ? (a.n = a.p.multiply(a.q), a.d = i.modInverse(o), a.dmp1 = a.d.mod(e), a.dmq1 = a.d.mod(r), a.coeff = a.q.modInverse(a.p), setTimeout(function() { n() }, 0)) : setTimeout(s, 0) }, c = function() { a.q = N(), a.q.fromNumberAsync(o, 1, r, function() { a.q.subtract(A.ONE).gcda(i, function(t) { 0 == t.compareTo(A.ONE) && a.q.isProbablePrime(10) ? setTimeout(e, 0) : setTimeout(c, 0) }) }) }, u = function() { a.p = N(), a.p.fromNumberAsync(t - o, 1, r, function() { a.p.subtract(A.ONE).gcda(i, function(t) { 0 == t.compareTo(A.ONE) && a.p.isProbablePrime(10) ? setTimeout(c, 0) : setTimeout(u, 0) }) }) }; setTimeout(u, 0) }; setTimeout(s, 0) }, t.prototype.sign = function(t, e, n) { var r = function(t) { return Z[t] || "" }(n), o = r + e(t).toString(), i = function(t, e) { if (e < t.length + 22) return console.error("Message too long for RSA"), null; for (var n = e - t.length - 6, r = "", o = 0; o < n; o += 2) r += "ff"; return j("0001" + r + "00" + t, 16) }(o, this.n.bitLength() / 4); if (null == i) return null; var a = this.doPrivate(i); if (null == a) return null; var s = a.toString(16); return 0 == (1 & s.length) ? s : "0" + s }, t.prototype.verify = function(t, e, n) { var r = j(e, 16), o = this.doPublic(r); if (null == o) return null; var i = o.toString(16).replace(/^1f+00/, ""), a = function(t) { for (var e in Z) if (Z.hasOwnProperty(e)) { var n = Z[e], r = n.length; if (t.substr(0, r) == n) return t.substr(r) } return t } /*! Copyright (c) 2011, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html version: 2.9.0 */ (i); return a == n(t).toString() }, t }(), Z = { md2: "3020300c06082a864886f70d020205000410", md5: "3020300c06082a864886f70d020505000410", sha1: "3021300906052b0e03021a05000414", sha224: "302d300d06096086480165030402040500041c", sha256: "3031300d060960864801650304020105000420", sha384: "3041300d060960864801650304020205000430", sha512: "3051300d060960864801650304020305000440", ripemd160: "3021300906052b2403020105000414" }, tt = {}; tt.lang = { extend: function(t, e, n) { if (!e || !t) throw new Error("YAHOO.lang.extend failed, please check that all dependencies are included."); var r = function() {}; if (r.prototype = e.prototype, t.prototype = new r, t.prototype.constructor = t, t.superclass = e.prototype, e.prototype.constructor == Object.prototype.constructor && (e.prototype.constructor = e), n) { var o; for (o in n) t.prototype[o] = n[o]; var i = function() {}, a = ["toString", "valueOf"]; try { /MSIE/.test(navigator.userAgent) && (i = function(t, e) { for (o = 0; o < a.length; o += 1) { var n = a[o], r = e[n]; "function" == typeof r && r != Object.prototype[n] && (t[n] = r) } }) } catch (t) {} i(t.prototype, n) } } }; /** * @fileOverview * @name asn1-1.0.js * @author Kenji Urushima kenji.urushima@gmail.com * @version asn1 1.0.13 (2017-Jun-02) * @since jsrsasign 2.1 * @license MIT License */ var et = {}; void 0 !== et.asn1 && et.asn1 || (et.asn1 = {}), et.asn1.ASN1Util = new function() { this.integerToByteHex = function(t) { var e = t.toString(16); return e.length % 2 == 1 && (e = "0" + e), e }, this.bigIntToMinTwosComplementsHex = function(t) { var e = t.toString(16); if ("-" != e.substr(0, 1)) e.length % 2 == 1 ? e = "0" + e : e.match(/^[0-7]/) || (e = "00" + e); else { var n = e.substr(1), r = n.length; r % 2 == 1 ? r += 1 : e.match(/^[0-7]/) || (r += 2); for (var o = "", i = 0; i < r; i++) o += "f"; var a = new A(o, 16), s = a.xor(t).add(A.ONE); e = s.toString(16).replace(/^-/, "") } return e }, this.getPEMStringFromHex = function(t, e) { return hextopem(t, e) }, this.newObject = function(t) { var e = et, n = e.asn1, r = n.DERBoolean, o = n.DERInteger, i = n.DERBitString, a = n.DEROctetString, s = n.DERNull, c = n.DERObjectIdentifier, u = n.DEREnumerated, l = n.DERUTF8String, f = n.DERNumericString, p = n.DERPrintableString, d = n.DERTeletexString, h = n.DERIA5String, m = n.DERUTCTime, g = n.DERGeneralizedTime, v = n.DERSequence, y = n.DERSet, _ = n.DERTaggedObject, x = n.ASN1Util.newObject, b = Object.keys(t); if (1 != b.length) throw "key of param shall be only one."; var w = b[0]; if (-1 == ":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf( ":" + w + ":")) throw "undefined key: " + w; if ("bool" == w) return new r(t[w]); if ("int" == w) return new o(t[w]); if ("bitstr" == w) return new i(t[w]); if ("octstr" == w) return new a(t[w]); if ("null" == w) return new s(t[w]); if ("oid" == w) return new c(t[w]); if ("enum" == w) return new u(t[w]); if ("utf8str" == w) return new l(t[w]); if ("numstr" == w) return new f(t[w]); if ("prnstr" == w) return new p(t[w]); if ("telstr" == w) return new d(t[w]); if ("ia5str" == w) return new h(t[w]); if ("utctime" == w) return new m(t[w]); if ("gentime" == w) return new g(t[w]); if ("seq" == w) { for (var S = t[w], E = [], O = 0; O < S.length; O++) { var C = x(S[O]); E.push(C) } return new v({ array: E }) } if ("set" == w) { for (var S = t[w], E = [], O = 0; O < S.length; O++) { var C = x(S[O]); E.push(C) } return new y({ array: E }) } if ("tag" == w) { var T = t[w]; if ("[object Array]" === Object.prototype.toString.call(T) && 3 == T.length) { var k = x(T[2]); return new _({ tag: T[0], explicit: T[1], obj: k }) } var A = {}; if (void 0 !== T.explicit && (A.explicit = T.explicit), void 0 !== T.tag && (A.tag = T.tag), void 0 === T.obj) throw "obj shall be specified for 'tag'."; return A.obj = x(T.obj), new _(A) } }, this.jsonToASN1HEX = function(t) { var e = this.newObject(t); return e.getEncodedHex() } }, et.asn1.ASN1Util.oidHexToInt = function(t) { for (var e = "", n = parseInt(t.substr(0, 2), 16), r = Math.floor(n / 40), o = n % 40, e = r + "." + o, i = "", a = 2; a < t.length; a += 2) { var s = parseInt(t.substr(a, 2), 16), c = ("00000000" + s.toString(2)).slice(-8); if (i += c.substr(1, 7), "0" == c.substr(0, 1)) { var u = new A(i, 2); e = e + "." + u.toString(10), i = "" } } return e }, et.asn1.ASN1Util.oidIntToHex = function(t) { var e = function(t) { var e = t.toString(16); return 1 == e.length && (e = "0" + e), e }, n = function(t) { var n = "", r = new A(t, 10), o = r.toString(2), i = 7 - o.length % 7; 7 == i && (i = 0); for (var a = "", s = 0; s < i; s++) a += "0"; o = a + o; for (var s = 0; s < o.length - 1; s += 7) { var c = o.substr(s, 7); s != o.length - 7 && (c = "1" + c), n += e(parseInt(c, 2)) } return n }; if (!t.match(/^[0-9.]+$/)) throw "malformed oid string: " + t; var r = "", o = t.split("."), i = 40 * parseInt(o[0]) + parseInt(o[1]); r += e(i), o.splice(0, 2); for (var a = 0; a < o.length; a++) r += n(o[a]); return r }, et.asn1.ASN1Object = function() { this.getLengthHexFromValue = function() { if (void 0 === this.hV || null == this.hV) throw "this.hV is null or undefined."; if (this.hV.length % 2 == 1) throw "value hex must be even length: n=" + "".length + ",v=" + this.hV; var t = this.hV.length / 2, e = t.toString(16); if (e.length % 2 == 1 && (e = "0" + e), t < 128) return e; var n = e.length / 2; if (n > 15) throw "ASN.1 length too long to represent by 8x: n = " + t.toString(16); var r = 128 + n; return r.toString(16) + e }, this.getEncodedHex = function() { return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1), this.hTLV }, this.getValueHex = function() { return this.getEncodedHex(), this.hV }, this.getFreshValueHex = function() { return "" } }, et.asn1.DERAbstractString = function(t) { et.asn1.DERAbstractString.superclass.constructor.call(this), this.getString = function() { return this.s }, this.setString = function(t) { this.hTLV = null, this.isModified = !0, this.s = t, this.hV = stohex(this.s) }, this.setStringHex = function(t) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = t }, this.getFreshValueHex = function() { return this.hV }, void 0 !== t && ("string" == typeof t ? this.setString(t) : void 0 !== t.str ? this.setString(t.str) : void 0 !== t.hex && this.setStringHex(t.hex)) }, tt.lang.extend(et.asn1.DERAbstractString, et.asn1.ASN1Object), et.asn1.DERAbstractTime = function(t) { et.asn1.DERAbstractTime.superclass.constructor.call(this), this.localDateToUTC = function(t) { utc = t.getTime() + 6e4 * t.getTimezoneOffset(); var e = new Date(utc); return e }, this.formatDate = function(t, e, n) { var r = this.zeroPadding, o = this.localDateToUTC(t), i = String(o.getFullYear()); "utc" == e && (i = i.substr(2, 2)); var a = r(String(o.getMonth() + 1), 2), s = r(String(o.getDate()), 2), c = r(String(o.getHours()), 2), u = r(String(o.getMinutes()), 2), l = r(String(o.getSeconds()), 2), f = i + a + s + c + u + l; if (!0 === n) { var p = o.getMilliseconds(); if (0 != p) { var d = r(String(p), 3); d = d.replace(/[0]+$/, ""), f = f + "." + d } } return f + "Z" }, this.zeroPadding = function(t, e) { return t.length >= e ? t : new Array(e - t.length + 1).join("0") + t }, this.getString = function() { return this.s }, this.setString = function(t) { this.hTLV = null, this.isModified = !0, this.s = t, this.hV = stohex(t) }, this.setByDateValue = function(t, e, n, r, o, i) { var a = new Date(Date.UTC(t, e - 1, n, r, o, i, 0)); this.setByDate(a) }, this.getFreshValueHex = function() { return this.hV } }, tt.lang.extend(et.asn1.DERAbstractTime, et.asn1.ASN1Object), et.asn1.DERAbstractStructured = function(t) { et.asn1.DERAbstractString.superclass.constructor.call(this), this.setByASN1ObjectArray = function(t) { this.hTLV = null, this.isModified = !0, this.asn1Array = t }, this.appendASN1Object = function(t) { this.hTLV = null, this.isModified = !0, this.asn1Array.push(t) }, this.asn1Array = new Array, void 0 !== t && void 0 !== t.array && (this.asn1Array = t.array) }, tt.lang.extend(et.asn1.DERAbstractStructured, et.asn1.ASN1Object), et.asn1.DERBoolean = function() { et.asn1.DERBoolean.superclass.constructor.call(this), this.hT = "01", this.hTLV = "0101ff" }, tt.lang.extend(et.asn1.DERBoolean, et.asn1.ASN1Object), et.asn1.DERInteger = function(t) { et.asn1.DERInteger.superclass.constructor.call(this), this.hT = "02", this.setByBigInteger = function(t) { this.hTLV = null, this.isModified = !0, this.hV = et.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t) }, this.setByInteger = function(t) { var e = new A(String(t), 10); this.setByBigInteger(e) }, this.setValueHex = function(t) { this.hV = t }, this.getFreshValueHex = function() { return this.hV }, void 0 !== t && (void 0 !== t.bigint ? this.setByBigInteger(t.bigint) : void 0 !== t.int ? this.setByInteger(t.int) : "number" == typeof t ? this.setByInteger(t) : void 0 !== t.hex && this.setValueHex(t.hex)) }, tt.lang.extend(et.asn1.DERInteger, et.asn1.ASN1Object), et.asn1.DERBitString = function(t) { if (void 0 !== t && void 0 !== t.obj) { var e = et.asn1.ASN1Util.newObject(t.obj); t.hex = "00" + e.getEncodedHex() } et.asn1.DERBitString.superclass.constructor.call(this), this.hT = "03", this.setHexValueIncludingUnusedBits = function(t) { this.hTLV = null, this.isModified = !0, this.hV = t }, this.setUnusedBitsAndHexValue = function(t, e) { if (t < 0 || 7 < t) throw "unused bits shall be from 0 to 7: u = " + t; var n = "0" + t; this.hTLV = null, this.isModified = !0, this.hV = n + e }, this.setByBinaryString = function(t) { var e = 8 - (t = t.replace(/0+$/, "")).length % 8; 8 == e && (e = 0); for (var n = 0; n <= e; n++) t += "0"; for (var r = "", n = 0; n < t.length - 1; n += 8) { var o = t.substr(n, 8), i = parseInt(o, 2).toString(16); 1 == i.length && (i = "0" + i), r += i } this.hTLV = null, this.isModified = !0, this.hV = "0" + e + r }, this.setByBooleanArray = function(t) { for (var e = "", n = 0; n < t.length; n++) 1 == t[n] ? e += "1" : e += "0"; this.setByBinaryString(e) }, this.newFalseArray = function(t) { for (var e = new Array(t), n = 0; n < t; n++) e[n] = !1; return e }, this.getFreshValueHex = function() { return this.hV }, void 0 !== t && ("string" == typeof t && t.toLowerCase().match(/^[0-9a-f]+$/) ? this.setHexValueIncludingUnusedBits( t) : void 0 !== t.hex ? this.setHexValueIncludingUnusedBits(t.hex) : void 0 !== t.bin ? this.setByBinaryString( t.bin) : void 0 !== t.array && this.setByBooleanArray(t.array)) }, tt.lang.extend(et.asn1.DERBitString, et.asn1.ASN1Object), et.asn1.DEROctetString = function(t) { if (void 0 !== t && void 0 !== t.obj) { var e = et.asn1.ASN1Util.newObject(t.obj); t.hex = e.getEncodedHex() } et.asn1.DEROctetString.superclass.constructor.call(this, t), this.hT = "04" }, tt.lang.extend(et.asn1.DEROctetString, et.asn1.DERAbstractString), et.asn1.DERNull = function() { et.asn1.DERNull.superclass.constructor.call(this), this.hT = "05", this.hTLV = "0500" }, tt.lang.extend(et.asn1.DERNull, et.asn1.ASN1Object), et.asn1.DERObjectIdentifier = function(t) { var e = function(t) { var e = t.toString(16); return 1 == e.length && (e = "0" + e), e }, n = function(t) { var n = "", r = new A(t, 10), o = r.toString(2), i = 7 - o.length % 7; 7 == i && (i = 0); for (var a = "", s = 0; s < i; s++) a += "0"; o = a + o; for (var s = 0; s < o.length - 1; s += 7) { var c = o.substr(s, 7); s != o.length - 7 && (c = "1" + c), n += e(parseInt(c, 2)) } return n }; et.asn1.DERObjectIdentifier.superclass.constructor.call(this), this.hT = "06", this.setValueHex = function(t) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = t }, this.setValueOidString = function(t) { if (!t.match(/^[0-9.]+$/)) throw "malformed oid string: " + t; var r = "", o = t.split("."), i = 40 * parseInt(o[0]) + parseInt(o[1]); r += e(i), o.splice(0, 2); for (var a = 0; a < o.length; a++) r += n(o[a]); this.hTLV = null, this.isModified = !0, this.s = null, this.hV = r }, this.setValueName = function(t) { var e = et.asn1.x509.OID.name2oid(t); if ("" === e) throw "DERObjectIdentifier oidName undefined: " + t; this.setValueOidString(e) }, this.getFreshValueHex = function() { return this.hV }, void 0 !== t && ("string" == typeof t ? t.match(/^[0-2].[0-9.]+$/) ? this.setValueOidString(t) : this.setValueName( t) : void 0 !== t.oid ? this.setValueOidString(t.oid) : void 0 !== t.hex ? this.setValueHex(t.hex) : void 0 !== t.name && this.setValueName(t.name)) }, tt.lang.extend(et.asn1.DERObjectIdentifier, et.asn1.ASN1Object), et.asn1.DEREnumerated = function(t) { et.asn1.DEREnumerated.superclass.constructor.call(this), this.hT = "0a", this.setByBigInteger = function(t) { this.hTLV = null, this.isModified = !0, this.hV = et.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t) }, this.setByInteger = function(t) { var e = new A(String(t), 10); this.setByBigInteger(e) }, this.setValueHex = function(t) { this.hV = t }, this.getFreshValueHex = function() { return this.hV }, void 0 !== t && (void 0 !== t.int ? this.setByInteger(t.int) : "number" == typeof t ? this.setByInteger(t) : void 0 !== t.hex && this.setValueHex(t.hex)) }, tt.lang.extend(et.asn1.DEREnumerated, et.asn1.ASN1Object), et.asn1.DERUTF8String = function(t) { et.asn1.DERUTF8String.superclass.constructor.call(this, t), this.hT = "0c" }, tt.lang.extend(et.asn1.DERUTF8String, et.asn1.DERAbstractString), et.asn1.DERNumericString = function(t) { et.asn1.DERNumericString.superclass.constructor.call(this, t), this.hT = "12" }, tt.lang.extend(et.asn1.DERNumericString, et.asn1.DERAbstractString), et.asn1.DERPrintableString = function(t) { et.asn1.DERPrintableString.superclass.constructor.call(this, t), this.hT = "13" }, tt.lang.extend(et.asn1.DERPrintableString, et.asn1.DERAbstractString), et.asn1.DERTeletexString = function(t) { et.asn1.DERTeletexString.superclass.constructor.call(this, t), this.hT = "14" }, tt.lang.extend(et.asn1.DERTeletexString, et.asn1.DERAbstractString), et.asn1.DERIA5String = function(t) { et.asn1.DERIA5String.superclass.constructor.call(this, t), this.hT = "16" }, tt.lang.extend(et.asn1.DERIA5String, et.asn1.DERAbstractString), et.asn1.DERUTCTime = function(t) { et.asn1.DERUTCTime.superclass.constructor.call(this, t), this.hT = "17", this.setByDate = function(t) { this.hTLV = null, this.isModified = !0, this.date = t, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s) }, this.getFreshValueHex = function() { return void 0 === this.date && void 0 === this.s && (this.date = new Date, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s)), this.hV }, void 0 !== t && (void 0 !== t.str ? this.setString(t.str) : "string" == typeof t && t.match(/^[0-9]{12}Z$/) ? this.setString(t) : void 0 !== t.hex ? this.setStringHex(t.hex) : void 0 !== t.date && this.setByDate(t.date)) }, tt.lang.extend(et.asn1.DERUTCTime, et.asn1.DERAbstractTime), et.asn1.DERGeneralizedTime = function(t) { et.asn1.DERGeneralizedTime.superclass.constructor.call(this, t), this.hT = "18", this.withMillis = !1, this.setByDate = function(t) { this.hTLV = null, this.isModified = !0, this.date = t, this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s) }, this.getFreshValueHex = function() { return void 0 === this.date && void 0 === this.s && (this.date = new Date, this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s)), this.hV }, void 0 !== t && (void 0 !== t.str ? this.setString(t.str) : "string" == typeof t && t.match(/^[0-9]{14}Z$/) ? this.setString(t) : void 0 !== t.hex ? this.setStringHex(t.hex) : void 0 !== t.date && this.setByDate(t.date), !0 === t.millis && (this.withMillis = !0)) }, tt.lang.extend(et.asn1.DERGeneralizedTime, et.asn1.DERAbstractTime), et.asn1.DERSequence = function(t) { et.asn1.DERSequence.superclass.constructor.call(this, t), this.hT = "30", this.getFreshValueHex = function() { for (var t = "", e = 0; e < this.asn1Array.length; e++) { var n = this.asn1Array[e]; t += n.getEncodedHex() } return this.hV = t, this.hV } }, tt.lang.extend(et.asn1.DERSequence, et.asn1.DERAbstractStructured), et.asn1.DERSet = function(t) { et.asn1.DERSet.superclass.constructor.call(this, t), this.hT = "31", this.sortFlag = !0, this.getFreshValueHex = function() { for (var t = new Array, e = 0; e < this.asn1Array.length; e++) { var n = this.asn1Array[e]; t.push(n.getEncodedHex()) } return 1 == this.sortFlag && t.sort(), this.hV = t.join(""), this.hV }, void 0 !== t && void 0 !== t.sortflag && 0 == t.sortflag && (this.sortFlag = !1) }, tt.lang.extend(et.asn1.DERSet, et.asn1.DERAbstractStructured), et.asn1.DERTaggedObject = function(t) { et.asn1.DERTaggedObject.superclass.constructor.call(this), this.hT = "a0", this.hV = "", this.isExplicit = !0, this.asn1Object = null, this.setASN1Object = function(t, e, n) { this.hT = e, this.isExplicit = t, this.asn1Object = n, this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = n.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, e), this.isModified = !1) }, this.getFreshValueHex = function() { return this.hV }, void 0 !== t && (void 0 !== t.tag && (this.hT = t.tag), void 0 !== t.explicit && (this.isExplicit = t.explicit), void 0 !== t.obj && (this.asn1Object = t.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object))) }, tt.lang.extend(et.asn1.DERTaggedObject, et.asn1.ASN1Object); var nt = function(t) { function e(n) { var r = t.call(this) || this; return n && ("string" == typeof n ? r.parseKey(n) : (e.hasPrivateKeyProperty(n) || e.hasPublicKeyProperty(n)) && r.parsePropertiesFrom(n)), r } return function(t, e) { function n() { this.constructor = t } m(t, e), t.prototype = null === e ? Object.create(e) : (n.prototype = e.prototype, new n) }(e, t), e.prototype.parseKey = function(t) { try { var e = 0, n = 0, r = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/.test(t) ? g.decode(t) : v.unarmor(t), o = O.decode(r); if (3 === o.sub.length && (o = o.sub[2].sub[0]), 9 === o.sub.length) { e = o.sub[1].getHexStringValue(), this.n = j(e, 16), n = o.sub[2].getHexStringValue(), this.e = parseInt(n, 16); var i = o.sub[3].getHexStringValue(); this.d = j(i, 16); var a = o.sub[4].getHexStringValue(); this.p = j(a, 16); var s = o.sub[5].getHexStringValue(); this.q = j(s, 16); var c = o.sub[6].getHexStringValue(); this.dmp1 = j(c, 16); var u = o.sub[7].getHexStringValue(); this.dmq1 = j(u, 16); var l = o.sub[8].getHexStringValue(); this.coeff = j(l, 16) } else { if (2 !== o.sub.length) return !1; var f = o.sub[1], p = f.sub[0]; e = p.sub[0].getHexStringValue(), this.n = j(e, 16), n = p.sub[1].getHexStringValue(), this.e = parseInt(n, 16) } return !0 } catch (t) { return !1 } }, e.prototype.getPrivateBaseKey = function() { var t = { array: [new et.asn1.DERInteger({ int: 0 }), new et.asn1.DERInteger({ bigint: this.n }), new et.asn1.DERInteger({ int: this.e }), new et.asn1.DERInteger({ bigint: this.d }), new et.asn1.DERInteger({ bigint: this.p }), new et.asn1.DERInteger({ bigint: this.q }), new et.asn1.DERInteger({ bigint: this.dmp1 }), new et.asn1.DERInteger({ bigint: this.dmq1 }), new et.asn1.DERInteger({ bigint: this.coeff })] }, e = new et.asn1.DERSequence(t); return e.getEncodedHex() }, e.prototype.getPrivateBaseKeyB64 = function() { return f(this.getPrivateBaseKey()) }, e.prototype.getPublicBaseKey = function() { var t = new et.asn1.DERSequence({ array: [new et.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }), new et.asn1.DERNull] }), e = new et.asn1.DERSequence({ array: [new et.asn1.DERInteger({ bigint: this.n }), new et.asn1.DERInteger({ int: this.e })] }), n = new et.asn1.DERBitString({ hex: "00" + e.getEncodedHex() }), r = new et.asn1.DERSequence({ array: [t, n] }); return r.getEncodedHex() }, e.prototype.getPublicBaseKeyB64 = function() { return f(this.getPublicBaseKey()) }, e.wordwrap = function(t, e) { if (e = e || 64, !t) return t; var n = "(.{1," + e + "})( +|$\n?)|(.{1," + e + "})"; return t.match(RegExp(n, "g")).join("\n") }, e.prototype.getPrivateKey = function() { var t = "-----BEGIN RSA PRIVATE KEY-----\n"; return t += e.wordwrap(this.getPrivateBaseKeyB64()) + "\n", t += "-----END RSA PRIVATE KEY-----" }, e.prototype.getPublicKey = function() { var t = "-----BEGIN PUBLIC KEY-----\n"; return t += e.wordwrap(this.getPublicBaseKeyB64()) + "\n", t += "-----END PUBLIC KEY-----" }, e.hasPublicKeyProperty = function(t) { return (t = t || {}).hasOwnProperty("n") && t.hasOwnProperty("e") }, e.hasPrivateKeyProperty = function(t) { return (t = t || {}).hasOwnProperty("n") && t.hasOwnProperty("e") && t.hasOwnProperty("d") && t.hasOwnProperty( "p") && t.hasOwnProperty("q") && t.hasOwnProperty("dmp1") && t.hasOwnProperty("dmq1") && t.hasOwnProperty( "coeff") }, e.prototype.parsePropertiesFrom = function(t) { this.n = t.n, this.e = t.e, t.hasOwnProperty("d") && (this.d = t.d, this.p = t.p, this.q = t.q, this.dmp1 = t.dmp1, this.dmq1 = t.dmq1, this.coeff = t.coeff) }, e }(J), rt = function() { function t(t) { t = t || {}, this.default_key_size = parseInt(t.default_key_size, 10) || 1024, this.default_public_exponent = t.default_public_exponent || "010001", this.log = t.log || !1, this.key = null } return t.prototype.setKey = function(t) { this.log && this.key && console.warn("A key was already set, overriding existing."), this.key = new nt(t) }, t.prototype.setPrivateKey = function(t) { this.setKey(t) }, t.prototype.setPublicKey = function(t) { this.setKey(t) }, t.prototype.decrypt = function(t) { try { return this.getKey().decrypt(p(t)) } catch (t) { return !1 } }, t.prototype.encrypt = function(t) { try { return f(this.getKey().encrypt(t)) } catch (t) { return !1 } }, t.prototype.sign = function(t, e, n) { try { return f(this.getKey().sign(t, e, n)) } catch (t) { return !1 } }, t.prototype.verify = function(t, e, n) { try { return this.getKey().verify(t, p(e), n) } catch (t) { return !1 } }, t.prototype.getKey = function(t) { if (!this.key) { if (this.key = new nt, t && "[object Function]" === {}.toString.call(t)) return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, t); this.key.generate(this.default_key_size, this.default_public_exponent) } return this.key }, t.prototype.getPrivateKey = function() { return this.getKey().getPrivateKey() }, t.prototype.getPrivateKeyB64 = function() { return this.getKey().getPrivateBaseKeyB64() }, t.prototype.getPublicKey = function() { return this.getKey().getPublicKey() }, t.prototype.getPublicKeyB64 = function() { return this.getKey().getPublicBaseKeyB64() }, t.version = "3.0.0-rc.1", t }(); // 1. 将上面这一坨匿名函数掐头去尾留中间,将其暴露出来, 这样才能使这个匿名函数暴露出来。 // 2. 改写 将 rt 解密对象,赋值给 JSEncrypt JSEncrypt = rt // 自己写一个 func 来调用加密, 摘抄加密处如何使用的即可 function test(text){ var p = new JSEncrypt; // 上面刚刚得到的JSEncrpyt 正好new 一个赋值给 p // 经过测试 PublickKey 为固定值,摘抄即可 p.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOJ3pYE2cYqdHAnQhd0akAQ6tKiepF6ZCXnYix8HyZJapWm5aeJRmXpWPaH2l+tZzgwOELJLu0BYk6eefWpd79Zm63+cSRdRqhgSv3/Anh4XVjBBewc26KUKMq5MWnEVCyjEDZSzUvCnDiVOl+Uid9tRRr1ZrBMKsXwSgjvge0NwIDAQAB"), password = p.encrypt(a); // 适当改写 return password }; test('密码') ================================================ FILE: 【文书】app查询接口/main.py ================================================ # __author__ = "zok" 362416272@qq.com # Date: 2020/7/24 Python:3.7 import requests import time import random import json import base64 import pyDes from datetime import datetime class TripleDesUtils: def encryption(self, data: str, key, iv) -> str: """3des 加密 """ _encryption_result = pyDes.triple_des(key, pyDes.CBC, iv, None, pyDes.PAD_PKCS5).encrypt(data) _encryption_result = self._base64encode(_encryption_result).decode() return _encryption_result def decrypt(self, data: str, key, iv) -> str: """3des 解密 """ data = self._base64decode(data) _decrypt_result = pyDes.triple_des(key, pyDes.CBC, iv, None, pyDes.PAD_PKCS5).decrypt(data).decode('utf-8') return _decrypt_result @staticmethod def _base64encode(data): try: _b64encode_result = base64.b64encode(data) except Exception as e: raise Exception(f"base64 encode error:{e}") return _b64encode_result @staticmethod def _base64decode(data): try: _b64decode_result = base64.b64decode(data) except Exception as e: raise Exception(f"base64 decode error:{e}") return _b64decode_result class WenShu: def __init__(self): self.js = None @staticmethod def get_now_data(): """时间 """ return datetime.now().strftime('%Y%m%d') @staticmethod def random_key(): """字符串 """ random_str = '' base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' length = len(base_str) - 1 for i in range(24): random_str += base_str[random.randint(0, length)] return random_str @staticmethod def make_id(): """id """ return datetime.now().strftime('%Y%m%d%H%M%S') def make_cipher_text(self): """生成 ciphertext """ time_13 = str(int(round(time.time() * 1000))) key = self.random_key() now = self.get_now_data() _str = des3.encryption(time_13, key, now) _str = key + now + _str new_str = '' for i in _str: if i != 1: new_str += " " new_str += str(bin(ord(i))[2:]) msg = """【key生成】: {key}\n【now生成】: {now}\n【_str生成】: {_str}\n【ciphertext生成】: {ciphertext}""".format(key=key, now=now, _str=_str, ciphertext=new_str) print(msg) return new_str.strip() def make_request(self): """生成明文的请求 data 内容 【这里需要根据实际需求修改请求内容】自行抓包研究!! """ info = { "id": self.make_id(), # 年月日时分秒 "command": "queryDoc", # 固定 "params": { "devid": "41d861ffe5b347d28454dc3f07dd4212", # 设备号 "devtype": "1", "ciphertext": self.make_cipher_text(), "pageSize": "20", "sortFields": "s50:desc", # 固定 "pageNum": "1", "queryCondition": [{ "key": "s8", "value": "02" }] # 关键词 + 搜索文本的类型; } } return info def to_index(self): url = 'http://wenshuapp.court.gov.cn/appinterface/rest.q4w' headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; MIX 2 MIUI/V11.0.2.0.PDECNXM)', 'Host': 'wenshuapp.court.gov.cn', 'Connection': 'Keep-Alive', 'Accept-Encoding': 'gzip', } txt = str(self.make_request()) request = base64.b64encode(txt.encode('utf-8')).decode('utf-8') data = { 'request': request } msg = """【明文请求体】: {txt}\n【密文请求体】: {data}\n【官网速度较慢,耐心等待】....""".format(txt=txt, data=data) print(msg) response = requests.post(url, headers=headers, data=data) if 'HTTP Status 503' in response.text: print('【服务器繁忙】 爬的人太多了, 请重试') exit() data = json.loads(response.text) content = data.get('data').get('content') key = data.get('data').get('secretKey') iv = self.get_now_data() msg = """【页面访问结果】: {text}\n【捕获key】:{key}\n【捕获iv】:{iv}\n【捕获content】:{content}""".format(text=response.text, key=key, iv=iv, content=content) print(msg) self.parse_html(content, key, iv) def parse_html(self, content, key, iv): _str = des3.decrypt(content, key, iv) print("【解密返回结果】:", _str) des3 = TripleDesUtils() if __name__ == '__main__': """ 《入门级安卓逆向 - 文书网app爬虫》 https://www.zhangkunzhi.com/index.php/archives/162/ """ ws = WenShu() ws.to_index() ================================================ FILE: 【淘宝】自动登陆/auto_login_pyppeteer.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-6 Python: 3.7 import time import random import asyncio import pyppeteer class LoginTaoBao: """ 类异步 """ pyppeteer.DEBUG = True page = None async def _injection_js(self): """注入js """ await self.page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,' '{ webdriver:{ get: () => false } }) }') # 本页刷新后值不变 async def _init(self): """初始化浏览器 """ browser = await pyppeteer.launch({'headless': False, # 'userDataDir': './userdata', 'args': [ '--window-size={1300},{600}' '--disable-extensions', '--hide-scrollbars', '--disable-bundled-ppapi-flash', '--mute-audio', '--no-sandbox', '--disable-setuid-sandbox', '--disable-gpu', '--disable-infobars' ], 'dumpio': True }) self.page = await browser.newPage() # 设置浏览器头部 await self.page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299') # 设置浏览器大小 await self.page.setViewport({'width': 1200, 'height': 600}) async def get_cookie(self): cookies_list = await self.page.cookies() cookies = '' for cookie in cookies_list: str_cookie = '{0}={1};' str_cookie = str_cookie.format(cookie.get('name'), cookie.get('value')) cookies += str_cookie print(cookies) return cookies async def mouse_slider(self): """滑动滑块 """ await asyncio.sleep(3) try: await self.page.hover('#nc_1_n1z') # 鼠标按下按钮 await self.page.mouse.down() # 移动鼠标 await self.page.mouse.move(2000, 0, {'steps': 30}) # 松开鼠标 await self.page.mouse.up() await asyncio.sleep(2) except Exception as e: print(e, ' :错误') return None else: await asyncio.sleep(3) # 获取元素内容 slider_again = await self.page.querySelectorEval('#nc_1__scale_text', 'node => node.textContent') if slider_again != '验证通过': return None else: print('验证通过') return True async def main(self, username_, pwd_): """登陆 """ # 初始化浏览器 await self._init() # 注入js await self._injection_js() # 打开淘宝登陆页面 await self.page.goto('https://login.taobao.com') # await self.page.goto('https://www.taobao.com') # time.sleep(1000000) # 点击密码登陆按钮 await self.page.click('div.login-switch') time.sleep(random.random() * 2) # 输入用户名 await self.page.type('#TPL_username_1', username_, {'delay': random.randint(100, 151) - 50}) # 输入密码 await self.page.type('#TPL_password_1', pwd_, {'delay': random.randint(100, 151)}) time.sleep(random.random() * 2) # 获取滑块元素 slider = await self.page.Jeval('#nocaptcha', 'node => node.style') if slider: print('有滑块') # 移动滑块 flag = await self.mouse_slider() if not flag: print('滑动滑块失败') return None time.sleep(random.random() + 1.5) # 点击登陆 print('点击登陆') await self.page.click('#J_SubmitStatic') await asyncio.sleep(1000) print('点击登陆') await self.page.keyboard.press('Enter') cookies = await self.get_cookie() time.sleep(10000) if __name__ == '__main__': username = input('请输入淘宝用户名') password = input('密码') login = LoginTaoBao() loop = asyncio.get_event_loop() task = asyncio.ensure_future(login.main(username, password)) loop.run_until_complete(task) ================================================ FILE: 【淘宝】自动登陆/login_for_sina.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-11 Python: 3.7 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class TB_Spider: def __init__(self, username, password): """初始化参数""" url = 'https://login.taobao.com/member/login.jhtml' self.url = url options = webdriver.ChromeOptions() # 不加载图片,加快访问速度 options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 设置为开发者模式,避免被识别 options.add_experimental_option('excludeSwitches', ['enable-automation']) self.browser = webdriver.Chrome(executable_path='./chromedriver', options=options) self.wait = WebDriverWait(self.browser, 40) # 初始化用户名 self.username = username # 初始化密码 self.password = password def run(self): """登陆接口""" self.browser.get(self.url) try: # 这里设置等待:等待输入框 login_element = self.wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '.qrcode-login > .login-links > .forget-pwd'))) login_element.click() sina_login = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.weibo-login'))) sina_login.click() weibo_user = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.username > .W_input'))) weibo_user.send_keys(self.username) sina_password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.password > .W_input'))) sina_password.send_keys(self.password) submit = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.btn_tip > a > span'))) submit.click() taobao_name = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.site-nav-bd > ul.site-nav-bd-l > li#J_SiteNavLogin > div.site-nav-menu-hd > div.site-nav-user > a.site-nav-login-info-nick '))) # 登陆成功打印提示信息 print("登陆成功:%s" % taobao_name.text) except Exception: self.browser.close() print("登陆失败") if __name__ == "__main__": name = input("请输入你的微博用户名:") pas = input("请输入密码:") spider = TB_Spider(name, pas) spider.run() ================================================ FILE: 其他实战/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-11 Python: 3.7 ================================================ FILE: 其他实战/【5173网】自动登录/auto_login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-26 Python: 3.7 import re import requests import execjs.runtime_names class YX(object): """ 易通贷自动登陆 """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.session = requests.session() self.url = 'https://passport.5173.com/' self.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'Host': 'passport.5173.com', } print('引擎', execjs.get().name) def make_pwd(self, key): with open("encryp.js", "r", encoding="utf-8") as f: ctx = execjs.compile(f.read()) return ctx.call("make_js", self.pwd, key) def make_data(self, token, key): data = { 'userName': self.user, 'password': self.make_pwd(key), 'mobileNo': '', 'captcha': '', 'smsCaptcha': '', 'category': '', 'passpod': '', 'smsLogin': '0', '__validationToken__': token, '__validationDna__': '', } return data def login(self): """start """ response = self.session.get(self.url) info = re.search(r'SecurityToken:"(.*?)",[\s\S]*?PasswordKey:"(.*?)",', response.text) try: token = info.group(1) key = info.group(2) data = self.make_data(token, key) result = self.session.post(self.url, data=data, headers=self.headers) if '5173auth' in str(result.cookies): print(result.cookies) print('【登陆成功】') else: print('【登陆失败】') except AttributeError: print('【获取key失败】') if __name__ == '__main__': username = input('请输入账号') password = input('密码') yx = YX(username, password) yx.login() ================================================ FILE: 其他实战/【5173网】自动登录/encryp.js ================================================ var hexcase = 0, b64pad = "", chrsz = 8; function hex_md5(b) { return binl2hex(core_md5(str2binl(b), b.length * chrsz)) } function b64_md5(b) { return binl2b64(core_md5(str2binl(b), b.length * chrsz)) } function str_md5(b) { return binl2str(core_md5(str2binl(b), b.length * chrsz)) } function hex_hmac_md5(b, a) { return binl2hex(core_hmac_md5(b, a)) } function b64_hmac_md5(b, a) { return binl2b64(core_hmac_md5(b, a)) } function str_hmac_md5(b, a) { return binl2str(core_hmac_md5(b, a)) } function md5_vm_test() { return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72" } function core_md5(b, a) { b[a >> 5] |= 128 << a % 32; b[(a + 64 >>> 9 << 4) + 14] = a; a = 1732584193; for (var c = -271733879, d = -1732584194, e = 271733878, f = 0; f < b.length; f += 16) { var g = a, h = c, i = d, j = e; a = md5_ff(a, c, d, e, b[f + 0], 7, -680876936); e = md5_ff(e, a, c, d, b[f + 1], 12, -389564586); d = md5_ff(d, e, a, c, b[f + 2], 17, 606105819); c = md5_ff(c, d, e, a, b[f + 3], 22, -1044525330); a = md5_ff(a, c, d, e, b[f + 4], 7, -176418897); e = md5_ff(e, a, c, d, b[f + 5], 12, 1200080426); d = md5_ff(d, e, a, c, b[f + 6], 17, -1473231341); c = md5_ff(c, d, e, a, b[f + 7], 22, -45705983); a = md5_ff(a, c, d, e, b[f + 8], 7, 1770035416); e = md5_ff(e, a, c, d, b[f + 9], 12, -1958414417); d = md5_ff(d, e, a, c, b[f + 10], 17, -42063); c = md5_ff(c, d, e, a, b[f + 11], 22, -1990404162); a = md5_ff(a, c, d, e, b[f + 12], 7, 1804603682); e = md5_ff(e, a, c, d, b[f + 13], 12, -40341101); d = md5_ff(d, e, a, c, b[f + 14], 17, -1502002290); c = md5_ff(c, d, e, a, b[f + 15], 22, 1236535329); a = md5_gg(a, c, d, e, b[f + 1], 5, -165796510); e = md5_gg(e, a, c, d, b[f + 6], 9, -1069501632); d = md5_gg(d, e, a, c, b[f + 11], 14, 643717713); c = md5_gg(c, d, e, a, b[f + 0], 20, -373897302); a = md5_gg(a, c, d, e, b[f + 5], 5, -701558691); e = md5_gg(e, a, c, d, b[f + 10], 9, 38016083); d = md5_gg(d, e, a, c, b[f + 15], 14, -660478335); c = md5_gg(c, d, e, a, b[f + 4], 20, -405537848); a = md5_gg(a, c, d, e, b[f + 9], 5, 568446438); e = md5_gg(e, a, c, d, b[f + 14], 9, -1019803690); d = md5_gg(d, e, a, c, b[f + 3], 14, -187363961); c = md5_gg(c, d, e, a, b[f + 8], 20, 1163531501); a = md5_gg(a, c, d, e, b[f + 13], 5, -1444681467); e = md5_gg(e, a, c, d, b[f + 2], 9, -51403784); d = md5_gg(d, e, a, c, b[f + 7], 14, 1735328473); c = md5_gg(c, d, e, a, b[f + 12], 20, -1926607734); a = md5_hh(a, c, d, e, b[f + 5], 4, -378558); e = md5_hh(e, a, c, d, b[f + 8], 11, -2022574463); d = md5_hh(d, e, a, c, b[f + 11], 16, 1839030562); c = md5_hh(c, d, e, a, b[f + 14], 23, -35309556); a = md5_hh(a, c, d, e, b[f + 1], 4, -1530992060); e = md5_hh(e, a, c, d, b[f + 4], 11, 1272893353); d = md5_hh(d, e, a, c, b[f + 7], 16, -155497632); c = md5_hh(c, d, e, a, b[f + 10], 23, -1094730640); a = md5_hh(a, c, d, e, b[f + 13], 4, 681279174); e = md5_hh(e, a, c, d, b[f + 0], 11, -358537222); d = md5_hh(d, e, a, c, b[f + 3], 16, -722521979); c = md5_hh(c, d, e, a, b[f + 6], 23, 76029189); a = md5_hh(a, c, d, e, b[f + 9], 4, -640364487); e = md5_hh(e, a, c, d, b[f + 12], 11, -421815835); d = md5_hh(d, e, a, c, b[f + 15], 16, 530742520); c = md5_hh(c, d, e, a, b[f + 2], 23, -995338651); a = md5_ii(a, c, d, e, b[f + 0], 6, -198630844); e = md5_ii(e, a, c, d, b[f + 7], 10, 1126891415); d = md5_ii(d, e, a, c, b[f + 14], 15, -1416354905); c = md5_ii(c, d, e, a, b[f + 5], 21, -57434055); a = md5_ii(a, c, d, e, b[f + 12], 6, 1700485571); e = md5_ii(e, a, c, d, b[f + 3], 10, -1894986606); d = md5_ii(d, e, a, c, b[f + 10], 15, -1051523); c = md5_ii(c, d, e, a, b[f + 1], 21, -2054922799); a = md5_ii(a, c, d, e, b[f + 8], 6, 1873313359); e = md5_ii(e, a, c, d, b[f + 15], 10, -30611744); d = md5_ii(d, e, a, c, b[f + 6], 15, -1560198380); c = md5_ii(c, d, e, a, b[f + 13], 21, 1309151649); a = md5_ii(a, c, d, e, b[f + 4], 6, -145523070); e = md5_ii(e, a, c, d, b[f + 11], 10, -1120210379); d = md5_ii(d, e, a, c, b[f + 2], 15, 718787259); c = md5_ii(c, d, e, a, b[f + 9], 21, -343485551); a = safe_add(a, g); c = safe_add(c, h); d = safe_add(d, i); e = safe_add(e, j) } return Array(a, c, d, e) } function md5_cmn(b, a, c, d, e, f) { return safe_add(bit_rol(safe_add(safe_add(a, b), safe_add(d, f)), e), c) } function md5_ff(b, a, c, d, e, f, g) { return md5_cmn(a & c | ~a & d, b, a, e, f, g) } function md5_gg(b, a, c, d, e, f, g) { return md5_cmn(a & d | c & ~d, b, a, e, f, g) } function md5_hh(b, a, c, d, e, f, g) { return md5_cmn(a ^ c ^ d, b, a, e, f, g) } function md5_ii(b, a, c, d, e, f, g) { return md5_cmn(c ^ (a | ~d), b, a, e, f, g) } function core_hmac_md5(b, a) { var c = str2binl(b); if (c.length > 16) c = core_md5(c, b.length * chrsz); var d = Array(16); b = Array(16); for (var e = 0; e < 16; e++) { d[e] = c[e] ^ 909522486; b[e] = c[e] ^ 1549556828 } a = core_md5(d.concat(str2binl(a)), 512 + a.length * chrsz); return core_md5(b.concat(a), 640) } function safe_add(b, a) { var c = (b & 65535) + (a & 65535); return (b >> 16) + (a >> 16) + (c >> 16) << 16 | c & 65535 } function bit_rol(b, a) { return b << a | b >>> 32 - a } function str2binl(b) { for (var a = Array(), c = (1 << chrsz) - 1, d = 0; d < b.length * chrsz; d += chrsz) a[d >> 5] |= (b.charCodeAt(d / chrsz) & c) << d % 32; return a } function binl2str(b) { for (var a = "", c = (1 << chrsz) - 1, d = 0; d < b.length * 32; d += chrsz) a += String.fromCharCode(b[d >> 5] >>> d % 32 & c); return a } function binl2hex(b) { for (var a = hexcase ? "0123456789ABCDEF" : "0123456789abcdef", c = "", d = 0; d < b.length * 4; d++) c += a.charAt(b[d >> 2] >> d % 4 * 8 + 4 & 15) + a.charAt(b[d >> 2] >> d % 4 * 8 & 15); return c } function binl2b64(b) { for (var a = "", c = 0; c < b.length * 4; c += 3) for (var d = (b[c >> 2] >> 8 * (c % 4) & 255) << 16 | (b[c + 1 >> 2] >> 8 * ((c + 1) % 4) & 255) << 8 | b[c + 2 >> 2] >> 8 * ((c + 2) % 4) & 255, e = 0; e < 4; e++) a += c * 8 + e * 6 > b.length * 32 ? b64pad : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d >> 6 * (3 - e) & 63); return a } function make_js(pwd, a) { return hex_md5(hex_md5(pwd).substr(8, 16) + a) }; ================================================ FILE: 其他实战/【9377网】自动登录/9377login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-23 Python: 3.7 import requests class Login9377: """9377游戏平台自动登陆 """ def __init__(self, username, password): self.headers = { 'Upgrade-Insecure-Requests': '1', 'Host': 'wvw.9377.com', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' } if len(password) < 6 or len(username) < 6: print('请输入正确账号密码!') exit() self.username = username self.password = password self.login_url = 'http://wvw.9377.com/login.php' self.host = 'https://www.9377.com/' self.session = requests.session() def login(self): """登陆 """ data = { 'do': 'login', 'gourl': self.host, 'login_save': '1', 'username': self.username, 'password': self.password } self.session.get(self.login_url, headers=self.headers) result = self.session.post(self.login_url, headers=self.headers, data=data) self.check(result) def check(self, result): """检测登陆状态 """ if self.username in str(result.cookies): print('登陆成功') else: print('用户名或密码错误') if __name__ == '__main__': name = input('输入账号') word = input('输入密码') lg = Login9377(name, word) lg.login() ================================================ FILE: 其他实战/【9377网】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-24 Python: 3.7 ================================================ FILE: 其他实战/【DNS】自动登录/Login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-08 Python: 3.7 import requests import re import execjs.runtime_names class DNS: def __init__(self, user, pwd): self.user = user self.pwd = pwd self.js = None self.url = 'https://www.dns.com/login.html' self.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'Host': 'www.dns.com' } self.read_js() def get_token(self): response = requests.get(self.url, headers=self.headers) try: token = re.search(r'', response.text).group(1) print(token) except AttributeError: print('token 捕获失败') def read_js(self): with open("dns.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def login(self): data = { '_token': self.get_token(), 'password': self.js.call('aes', self.pwd), 'email': self.js.call('aes', self.user), 'redirectTo': 'https://www.dns.com/dashboard', } response = requests.post(self.url, data=data, headers=self.headers) print(response) if __name__ == '__main__': username = input('请输入账号') password = input('密码') dns = DNS(username, password) dns.login() ================================================ FILE: 其他实战/【DNS】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【DNS】自动登录/dns.js ================================================ /** * CryptoJS core components. */ var CryptoJS = CryptoJS || (function (Math, undefined) { /* * Local polyfil of Object.create */ var create = Object.create || (function () { function F() {}; return function (obj) { var subtype; F.prototype = obj; subtype = new F(); F.prototype = null; return subtype; }; }()) /** * CryptoJS namespace. */ var C = {}; /** * Library namespace. */ var C_lib = C.lib = {}; /** * Base object for prototypal inheritance. */ var Base = C_lib.Base = (function () { return { /** * Creates a new object that inherits from this object. * * @param {Object} overrides Properties to copy into the new object. * * @return {Object} The new object. * * @static * * @example * * var MyType = CryptoJS.lib.Base.extend({ * field: 'value', * * method: function () { * } * }); */ extend: function (overrides) { // Spawn var subtype = create(this); // Augment if (overrides) { subtype.mixIn(overrides); } // Create default initializer if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { subtype.init = function () { subtype.$super.init.apply(this, arguments); }; } // Initializer's prototype is the subtype object subtype.init.prototype = subtype; // Reference supertype subtype.$super = this; return subtype; }, /** * Extends this object and runs the init method. * Arguments to create() will be passed to init(). * * @return {Object} The new object. * * @static * * @example * * var instance = MyType.create(); */ create: function () { var instance = this.extend(); instance.init.apply(instance, arguments); return instance; }, /** * Initializes a newly created object. * Override this method to add some logic when your objects are created. * * @example * * var MyType = CryptoJS.lib.Base.extend({ * init: function () { * // ... * } * }); */ init: function () { }, /** * Copies properties into this object. * * @param {Object} properties The properties to mix in. * * @example * * MyType.mixIn({ * field: 'value' * }); */ mixIn: function (properties) { for (var propertyName in properties) { if (properties.hasOwnProperty(propertyName)) { this[propertyName] = properties[propertyName]; } } // IE won't copy toString using the loop above if (properties.hasOwnProperty('toString')) { this.toString = properties.toString; } }, /** * Creates a copy of this object. * * @return {Object} The clone. * * @example * * var clone = instance.clone(); */ clone: function () { return this.init.prototype.extend(this); } }; }()); /** * An array of 32-bit words. * * @property {Array} words The array of 32-bit words. * @property {number} sigBytes The number of significant bytes in this word array. */ var WordArray = C_lib.WordArray = Base.extend({ /** * Initializes a newly created word array. * * @param {Array} words (Optional) An array of 32-bit words. * @param {number} sigBytes (Optional) The number of significant bytes in the words. * * @example * * var wordArray = CryptoJS.lib.WordArray.create(); * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); */ init: function (words, sigBytes) { words = this.words = words || []; if (sigBytes != undefined) { this.sigBytes = sigBytes; } else { this.sigBytes = words.length * 4; } }, /** * Converts this word array to a string. * * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex * * @return {string} The stringified word array. * * @example * * var string = wordArray + ''; * var string = wordArray.toString(); * var string = wordArray.toString(CryptoJS.enc.Utf8); */ toString: function (encoder) { return (encoder || Hex).stringify(this); }, /** * Concatenates a word array to this word array. * * @param {WordArray} wordArray The word array to append. * * @return {WordArray} This word array. * * @example * * wordArray1.concat(wordArray2); */ concat: function (wordArray) { // Shortcuts var thisWords = this.words; var thatWords = wordArray.words; var thisSigBytes = this.sigBytes; var thatSigBytes = wordArray.sigBytes; // Clamp excess bits this.clamp(); // Concat if (thisSigBytes % 4) { // Copy one byte at a time for (var i = 0; i < thatSigBytes; i++) { var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); } } else { // Copy one word at a time for (var i = 0; i < thatSigBytes; i += 4) { thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; } } this.sigBytes += thatSigBytes; // Chainable return this; }, /** * Removes insignificant bits. * * @example * * wordArray.clamp(); */ clamp: function () { // Shortcuts var words = this.words; var sigBytes = this.sigBytes; // Clamp words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); words.length = Math.ceil(sigBytes / 4); }, /** * Creates a copy of this word array. * * @return {WordArray} The clone. * * @example * * var clone = wordArray.clone(); */ clone: function () { var clone = Base.clone.call(this); clone.words = this.words.slice(0); return clone; }, /** * Creates a word array filled with random bytes. * * @param {number} nBytes The number of random bytes to generate. * * @return {WordArray} The random word array. * * @static * * @example * * var wordArray = CryptoJS.lib.WordArray.random(16); */ random: function (nBytes) { var words = []; var r = (function (m_w) { var m_w = m_w; var m_z = 0x3ade68b1; var mask = 0xffffffff; return function () { m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; var result = ((m_z << 0x10) + m_w) & mask; result /= 0x100000000; result += 0.5; return result * (Math.random() > .5 ? 1 : -1); } }); for (var i = 0, rcache; i < nBytes; i += 4) { var _r = r((rcache || Math.random()) * 0x100000000); rcache = _r() * 0x3ade67b7; words.push((_r() * 0x100000000) | 0); } return new WordArray.init(words, nBytes); } }); /** * Encoder namespace. */ var C_enc = C.enc = {}; /** * Hex encoding strategy. */ var Hex = C_enc.Hex = { /** * Converts a word array to a hex string. * * @param {WordArray} wordArray The word array. * * @return {string} The hex string. * * @static * * @example * * var hexString = CryptoJS.enc.Hex.stringify(wordArray); */ stringify: function (wordArray) { // Shortcuts var words = wordArray.words; var sigBytes = wordArray.sigBytes; // Convert var hexChars = []; for (var i = 0; i < sigBytes; i++) { var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; hexChars.push((bite >>> 4).toString(16)); hexChars.push((bite & 0x0f).toString(16)); } return hexChars.join(''); }, /** * Converts a hex string to a word array. * * @param {string} hexStr The hex string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Hex.parse(hexString); */ parse: function (hexStr) { // Shortcut var hexStrLength = hexStr.length; // Convert var words = []; for (var i = 0; i < hexStrLength; i += 2) { words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); } return new WordArray.init(words, hexStrLength / 2); } }; /** * Latin1 encoding strategy. */ var Latin1 = C_enc.Latin1 = { /** * Converts a word array to a Latin1 string. * * @param {WordArray} wordArray The word array. * * @return {string} The Latin1 string. * * @static * * @example * * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); */ stringify: function (wordArray) { // Shortcuts var words = wordArray.words; var sigBytes = wordArray.sigBytes; // Convert var latin1Chars = []; for (var i = 0; i < sigBytes; i++) { var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; latin1Chars.push(String.fromCharCode(bite)); } return latin1Chars.join(''); }, /** * Converts a Latin1 string to a word array. * * @param {string} latin1Str The Latin1 string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); */ parse: function (latin1Str) { // Shortcut var latin1StrLength = latin1Str.length; // Convert var words = []; for (var i = 0; i < latin1StrLength; i++) { words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); } return new WordArray.init(words, latin1StrLength); } }; /** * UTF-8 encoding strategy. */ var Utf8 = C_enc.Utf8 = { /** * Converts a word array to a UTF-8 string. * * @param {WordArray} wordArray The word array. * * @return {string} The UTF-8 string. * * @static * * @example * * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); */ stringify: function (wordArray) { try { return decodeURIComponent(escape(Latin1.stringify(wordArray))); } catch (e) { throw new Error('Malformed UTF-8 data'); } }, /** * Converts a UTF-8 string to a word array. * * @param {string} utf8Str The UTF-8 string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); */ parse: function (utf8Str) { return Latin1.parse(unescape(encodeURIComponent(utf8Str))); } }; /** * Abstract buffered block algorithm template. * * The property blockSize must be implemented in a concrete subtype. * * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 */ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ /** * Resets this block algorithm's data buffer to its initial state. * * @example * * bufferedBlockAlgorithm.reset(); */ reset: function () { // Initial values this._data = new WordArray.init(); this._nDataBytes = 0; }, /** * Adds new data to this block algorithm's buffer. * * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. * * @example * * bufferedBlockAlgorithm._append('data'); * bufferedBlockAlgorithm._append(wordArray); */ _append: function (data) { // Convert string to WordArray, else assume WordArray already if (typeof data == 'string') { data = Utf8.parse(data); } // Append this._data.concat(data); this._nDataBytes += data.sigBytes; }, /** * Processes available data blocks. * * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. * * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. * * @return {WordArray} The processed data. * * @example * * var processedData = bufferedBlockAlgorithm._process(); * var processedData = bufferedBlockAlgorithm._process(!!'flush'); */ _process: function (doFlush) { // Shortcuts var data = this._data; var dataWords = data.words; var dataSigBytes = data.sigBytes; var blockSize = this.blockSize; var blockSizeBytes = blockSize * 4; // Count blocks ready var nBlocksReady = dataSigBytes / blockSizeBytes; if (doFlush) { // Round up to include partial blocks nBlocksReady = Math.ceil(nBlocksReady); } else { // Round down to include only full blocks, // less the number of blocks that must remain in the buffer nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); } // Count words ready var nWordsReady = nBlocksReady * blockSize; // Count bytes ready var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); // Process blocks if (nWordsReady) { for (var offset = 0; offset < nWordsReady; offset += blockSize) { // Perform concrete-algorithm logic this._doProcessBlock(dataWords, offset); } // Remove processed words var processedWords = dataWords.splice(0, nWordsReady); data.sigBytes -= nBytesReady; } // Return processed words return new WordArray.init(processedWords, nBytesReady); }, /** * Creates a copy of this object. * * @return {Object} The clone. * * @example * * var clone = bufferedBlockAlgorithm.clone(); */ clone: function () { var clone = Base.clone.call(this); clone._data = this._data.clone(); return clone; }, _minBufferSize: 0 }); /** * Abstract hasher template. * * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) */ var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ /** * Configuration options. */ cfg: Base.extend(), /** * Initializes a newly created hasher. * * @param {Object} cfg (Optional) The configuration options to use for this hash computation. * * @example * * var hasher = CryptoJS.algo.SHA256.create(); */ init: function (cfg) { // Apply config defaults this.cfg = this.cfg.extend(cfg); // Set initial values this.reset(); }, /** * Resets this hasher to its initial state. * * @example * * hasher.reset(); */ reset: function () { // Reset data buffer BufferedBlockAlgorithm.reset.call(this); // Perform concrete-hasher logic this._doReset(); }, /** * Updates this hasher with a message. * * @param {WordArray|string} messageUpdate The message to append. * * @return {Hasher} This hasher. * * @example * * hasher.update('message'); * hasher.update(wordArray); */ update: function (messageUpdate) { // Append this._append(messageUpdate); // Update the hash this._process(); // Chainable return this; }, /** * Finalizes the hash computation. * Note that the finalize operation is effectively a destructive, read-once operation. * * @param {WordArray|string} messageUpdate (Optional) A final message update. * * @return {WordArray} The hash. * * @example * * var hash = hasher.finalize(); * var hash = hasher.finalize('message'); * var hash = hasher.finalize(wordArray); */ finalize: function (messageUpdate) { // Final message update if (messageUpdate) { this._append(messageUpdate); } // Perform concrete-hasher logic var hash = this._doFinalize(); return hash; }, blockSize: 512/32, /** * Creates a shortcut function to a hasher's object interface. * * @param {Hasher} hasher The hasher to create a helper for. * * @return {Function} The shortcut function. * * @static * * @example * * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); */ _createHelper: function (hasher) { return function (message, cfg) { return new hasher.init(cfg).finalize(message); }; }, /** * Creates a shortcut function to the HMAC's object interface. * * @param {Hasher} hasher The hasher to use in this HMAC helper. * * @return {Function} The shortcut function. * * @static * * @example * * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); */ _createHmacHelper: function (hasher) { return function (message, key) { return new C_algo.HMAC.init(hasher, key).finalize(message); }; } }); /** * Algorithm namespace. */ var C_algo = C.algo = {}; return C; }(Math)); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var C_enc = C.enc; /** * Base64 encoding strategy. */ var Base64 = C_enc.Base64 = { /** * Converts a word array to a Base64 string. * * @param {WordArray} wordArray The word array. * * @return {string} The Base64 string. * * @static * * @example * * var base64String = CryptoJS.enc.Base64.stringify(wordArray); */ stringify: function (wordArray) { // Shortcuts var words = wordArray.words; var sigBytes = wordArray.sigBytes; var map = this._map; // Clamp excess bits wordArray.clamp(); // Convert var base64Chars = []; for (var i = 0; i < sigBytes; i += 3) { var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; var triplet = (byte1 << 16) | (byte2 << 8) | byte3; for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); } } // Add padding var paddingChar = map.charAt(64); if (paddingChar) { while (base64Chars.length % 4) { base64Chars.push(paddingChar); } } return base64Chars.join(''); }, /** * Converts a Base64 string to a word array. * * @param {string} base64Str The Base64 string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Base64.parse(base64String); */ parse: function (base64Str) { // Shortcuts var base64StrLength = base64Str.length; var map = this._map; var reverseMap = this._reverseMap; if (!reverseMap) { reverseMap = this._reverseMap = []; for (var j = 0; j < map.length; j++) { reverseMap[map.charCodeAt(j)] = j; } } // Ignore padding var paddingChar = map.charAt(64); if (paddingChar) { var paddingIndex = base64Str.indexOf(paddingChar); if (paddingIndex !== -1) { base64StrLength = paddingIndex; } } // Convert return parseLoop(base64Str, base64StrLength, reverseMap); }, _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' }; function parseLoop(base64Str, base64StrLength, reverseMap) { var words = []; var nBytes = 0; for (var i = 0; i < base64StrLength; i++) { if (i % 4) { var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); nBytes++; } } return WordArray.create(words, nBytes); } }()); (function (Math) { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; // Constants table var T = []; // Compute constants (function () { for (var i = 0; i < 64; i++) { T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; } }()); /** * MD5 hash algorithm. */ var MD5 = C_algo.MD5 = Hasher.extend({ _doReset: function () { this._hash = new WordArray.init([ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 ]); }, _doProcessBlock: function (M, offset) { // Swap endian for (var i = 0; i < 16; i++) { // Shortcuts var offset_i = offset + i; var M_offset_i = M[offset_i]; M[offset_i] = ( (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) ); } // Shortcuts var H = this._hash.words; var M_offset_0 = M[offset + 0]; var M_offset_1 = M[offset + 1]; var M_offset_2 = M[offset + 2]; var M_offset_3 = M[offset + 3]; var M_offset_4 = M[offset + 4]; var M_offset_5 = M[offset + 5]; var M_offset_6 = M[offset + 6]; var M_offset_7 = M[offset + 7]; var M_offset_8 = M[offset + 8]; var M_offset_9 = M[offset + 9]; var M_offset_10 = M[offset + 10]; var M_offset_11 = M[offset + 11]; var M_offset_12 = M[offset + 12]; var M_offset_13 = M[offset + 13]; var M_offset_14 = M[offset + 14]; var M_offset_15 = M[offset + 15]; // Working varialbes var a = H[0]; var b = H[1]; var c = H[2]; var d = H[3]; // Computation a = FF(a, b, c, d, M_offset_0, 7, T[0]); d = FF(d, a, b, c, M_offset_1, 12, T[1]); c = FF(c, d, a, b, M_offset_2, 17, T[2]); b = FF(b, c, d, a, M_offset_3, 22, T[3]); a = FF(a, b, c, d, M_offset_4, 7, T[4]); d = FF(d, a, b, c, M_offset_5, 12, T[5]); c = FF(c, d, a, b, M_offset_6, 17, T[6]); b = FF(b, c, d, a, M_offset_7, 22, T[7]); a = FF(a, b, c, d, M_offset_8, 7, T[8]); d = FF(d, a, b, c, M_offset_9, 12, T[9]); c = FF(c, d, a, b, M_offset_10, 17, T[10]); b = FF(b, c, d, a, M_offset_11, 22, T[11]); a = FF(a, b, c, d, M_offset_12, 7, T[12]); d = FF(d, a, b, c, M_offset_13, 12, T[13]); c = FF(c, d, a, b, M_offset_14, 17, T[14]); b = FF(b, c, d, a, M_offset_15, 22, T[15]); a = GG(a, b, c, d, M_offset_1, 5, T[16]); d = GG(d, a, b, c, M_offset_6, 9, T[17]); c = GG(c, d, a, b, M_offset_11, 14, T[18]); b = GG(b, c, d, a, M_offset_0, 20, T[19]); a = GG(a, b, c, d, M_offset_5, 5, T[20]); d = GG(d, a, b, c, M_offset_10, 9, T[21]); c = GG(c, d, a, b, M_offset_15, 14, T[22]); b = GG(b, c, d, a, M_offset_4, 20, T[23]); a = GG(a, b, c, d, M_offset_9, 5, T[24]); d = GG(d, a, b, c, M_offset_14, 9, T[25]); c = GG(c, d, a, b, M_offset_3, 14, T[26]); b = GG(b, c, d, a, M_offset_8, 20, T[27]); a = GG(a, b, c, d, M_offset_13, 5, T[28]); d = GG(d, a, b, c, M_offset_2, 9, T[29]); c = GG(c, d, a, b, M_offset_7, 14, T[30]); b = GG(b, c, d, a, M_offset_12, 20, T[31]); a = HH(a, b, c, d, M_offset_5, 4, T[32]); d = HH(d, a, b, c, M_offset_8, 11, T[33]); c = HH(c, d, a, b, M_offset_11, 16, T[34]); b = HH(b, c, d, a, M_offset_14, 23, T[35]); a = HH(a, b, c, d, M_offset_1, 4, T[36]); d = HH(d, a, b, c, M_offset_4, 11, T[37]); c = HH(c, d, a, b, M_offset_7, 16, T[38]); b = HH(b, c, d, a, M_offset_10, 23, T[39]); a = HH(a, b, c, d, M_offset_13, 4, T[40]); d = HH(d, a, b, c, M_offset_0, 11, T[41]); c = HH(c, d, a, b, M_offset_3, 16, T[42]); b = HH(b, c, d, a, M_offset_6, 23, T[43]); a = HH(a, b, c, d, M_offset_9, 4, T[44]); d = HH(d, a, b, c, M_offset_12, 11, T[45]); c = HH(c, d, a, b, M_offset_15, 16, T[46]); b = HH(b, c, d, a, M_offset_2, 23, T[47]); a = II(a, b, c, d, M_offset_0, 6, T[48]); d = II(d, a, b, c, M_offset_7, 10, T[49]); c = II(c, d, a, b, M_offset_14, 15, T[50]); b = II(b, c, d, a, M_offset_5, 21, T[51]); a = II(a, b, c, d, M_offset_12, 6, T[52]); d = II(d, a, b, c, M_offset_3, 10, T[53]); c = II(c, d, a, b, M_offset_10, 15, T[54]); b = II(b, c, d, a, M_offset_1, 21, T[55]); a = II(a, b, c, d, M_offset_8, 6, T[56]); d = II(d, a, b, c, M_offset_15, 10, T[57]); c = II(c, d, a, b, M_offset_6, 15, T[58]); b = II(b, c, d, a, M_offset_13, 21, T[59]); a = II(a, b, c, d, M_offset_4, 6, T[60]); d = II(d, a, b, c, M_offset_11, 10, T[61]); c = II(c, d, a, b, M_offset_2, 15, T[62]); b = II(b, c, d, a, M_offset_9, 21, T[63]); // Intermediate hash value H[0] = (H[0] + a) | 0; H[1] = (H[1] + b) | 0; H[2] = (H[2] + c) | 0; H[3] = (H[3] + d) | 0; }, _doFinalize: function () { // Shortcuts var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); var nBitsTotalL = nBitsTotal; dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) ); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) ); data.sigBytes = (dataWords.length + 1) * 4; // Hash final blocks this._process(); // Shortcuts var hash = this._hash; var H = hash.words; // Swap endian for (var i = 0; i < 4; i++) { // Shortcut var H_i = H[i]; H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); } // Return final computed hash return hash; }, clone: function () { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone; } }); function FF(a, b, c, d, x, s, t) { var n = a + ((b & c) | (~b & d)) + x + t; return ((n << s) | (n >>> (32 - s))) + b; } function GG(a, b, c, d, x, s, t) { var n = a + ((b & d) | (c & ~d)) + x + t; return ((n << s) | (n >>> (32 - s))) + b; } function HH(a, b, c, d, x, s, t) { var n = a + (b ^ c ^ d) + x + t; return ((n << s) | (n >>> (32 - s))) + b; } function II(a, b, c, d, x, s, t) { var n = a + (c ^ (b | ~d)) + x + t; return ((n << s) | (n >>> (32 - s))) + b; } /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.MD5('message'); * var hash = CryptoJS.MD5(wordArray); */ C.MD5 = Hasher._createHelper(MD5); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacMD5(message, key); */ C.HmacMD5 = Hasher._createHmacHelper(MD5); }(Math)); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; // Reusable object var W = []; /** * SHA-1 hash algorithm. */ var SHA1 = C_algo.SHA1 = Hasher.extend({ _doReset: function () { this._hash = new WordArray.init([ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]); }, _doProcessBlock: function (M, offset) { // Shortcut var H = this._hash.words; // Working variables var a = H[0]; var b = H[1]; var c = H[2]; var d = H[3]; var e = H[4]; // Computation for (var i = 0; i < 80; i++) { if (i < 16) { W[i] = M[offset + i] | 0; } else { var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; W[i] = (n << 1) | (n >>> 31); } var t = ((a << 5) | (a >>> 27)) + e + W[i]; if (i < 20) { t += ((b & c) | (~b & d)) + 0x5a827999; } else if (i < 40) { t += (b ^ c ^ d) + 0x6ed9eba1; } else if (i < 60) { t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; } else /* if (i < 80) */ { t += (b ^ c ^ d) - 0x359d3e2a; } e = d; d = c; c = (b << 30) | (b >>> 2); b = a; a = t; } // Intermediate hash value H[0] = (H[0] + a) | 0; H[1] = (H[1] + b) | 0; H[2] = (H[2] + c) | 0; H[3] = (H[3] + d) | 0; H[4] = (H[4] + e) | 0; }, _doFinalize: function () { // Shortcuts var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; data.sigBytes = dataWords.length * 4; // Hash final blocks this._process(); // Return final computed hash return this._hash; }, clone: function () { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone; } }); /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.SHA1('message'); * var hash = CryptoJS.SHA1(wordArray); */ C.SHA1 = Hasher._createHelper(SHA1); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacSHA1(message, key); */ C.HmacSHA1 = Hasher._createHmacHelper(SHA1); }()); (function (Math) { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; // Initialization and round constants tables var H = []; var K = []; // Compute constants (function () { function isPrime(n) { var sqrtN = Math.sqrt(n); for (var factor = 2; factor <= sqrtN; factor++) { if (!(n % factor)) { return false; } } return true; } function getFractionalBits(n) { return ((n - (n | 0)) * 0x100000000) | 0; } var n = 2; var nPrime = 0; while (nPrime < 64) { if (isPrime(n)) { if (nPrime < 8) { H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); } K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); nPrime++; } n++; } }()); // Reusable object var W = []; /** * SHA-256 hash algorithm. */ var SHA256 = C_algo.SHA256 = Hasher.extend({ _doReset: function () { this._hash = new WordArray.init(H.slice(0)); }, _doProcessBlock: function (M, offset) { // Shortcut var H = this._hash.words; // Working variables var a = H[0]; var b = H[1]; var c = H[2]; var d = H[3]; var e = H[4]; var f = H[5]; var g = H[6]; var h = H[7]; // Computation for (var i = 0; i < 64; i++) { if (i < 16) { W[i] = M[offset + i] | 0; } else { var gamma0x = W[i - 15]; var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ ((gamma0x << 14) | (gamma0x >>> 18)) ^ (gamma0x >>> 3); var gamma1x = W[i - 2]; var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ ((gamma1x << 13) | (gamma1x >>> 19)) ^ (gamma1x >>> 10); W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; } var ch = (e & f) ^ (~e & g); var maj = (a & b) ^ (a & c) ^ (b & c); var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); var t1 = h + sigma1 + ch + K[i] + W[i]; var t2 = sigma0 + maj; h = g; g = f; f = e; e = (d + t1) | 0; d = c; c = b; b = a; a = (t1 + t2) | 0; } // Intermediate hash value H[0] = (H[0] + a) | 0; H[1] = (H[1] + b) | 0; H[2] = (H[2] + c) | 0; H[3] = (H[3] + d) | 0; H[4] = (H[4] + e) | 0; H[5] = (H[5] + f) | 0; H[6] = (H[6] + g) | 0; H[7] = (H[7] + h) | 0; }, _doFinalize: function () { // Shortcuts var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; data.sigBytes = dataWords.length * 4; // Hash final blocks this._process(); // Return final computed hash return this._hash; }, clone: function () { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone; } }); /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.SHA256('message'); * var hash = CryptoJS.SHA256(wordArray); */ C.SHA256 = Hasher._createHelper(SHA256); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacSHA256(message, key); */ C.HmacSHA256 = Hasher._createHmacHelper(SHA256); }(Math)); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var C_enc = C.enc; /** * UTF-16 BE encoding strategy. */ var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { /** * Converts a word array to a UTF-16 BE string. * * @param {WordArray} wordArray The word array. * * @return {string} The UTF-16 BE string. * * @static * * @example * * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); */ stringify: function (wordArray) { // Shortcuts var words = wordArray.words; var sigBytes = wordArray.sigBytes; // Convert var utf16Chars = []; for (var i = 0; i < sigBytes; i += 2) { var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; utf16Chars.push(String.fromCharCode(codePoint)); } return utf16Chars.join(''); }, /** * Converts a UTF-16 BE string to a word array. * * @param {string} utf16Str The UTF-16 BE string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); */ parse: function (utf16Str) { // Shortcut var utf16StrLength = utf16Str.length; // Convert var words = []; for (var i = 0; i < utf16StrLength; i++) { words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); } return WordArray.create(words, utf16StrLength * 2); } }; /** * UTF-16 LE encoding strategy. */ C_enc.Utf16LE = { /** * Converts a word array to a UTF-16 LE string. * * @param {WordArray} wordArray The word array. * * @return {string} The UTF-16 LE string. * * @static * * @example * * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); */ stringify: function (wordArray) { // Shortcuts var words = wordArray.words; var sigBytes = wordArray.sigBytes; // Convert var utf16Chars = []; for (var i = 0; i < sigBytes; i += 2) { var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); utf16Chars.push(String.fromCharCode(codePoint)); } return utf16Chars.join(''); }, /** * Converts a UTF-16 LE string to a word array. * * @param {string} utf16Str The UTF-16 LE string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); */ parse: function (utf16Str) { // Shortcut var utf16StrLength = utf16Str.length; // Convert var words = []; for (var i = 0; i < utf16StrLength; i++) { words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); } return WordArray.create(words, utf16StrLength * 2); } }; function swapEndian(word) { return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); } }()); (function () { // Check if typed arrays are supported if (typeof ArrayBuffer != 'function') { return; } // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; // Reference original init var superInit = WordArray.init; // Augment WordArray.init to handle typed arrays var subInit = WordArray.init = function (typedArray) { // Convert buffers to uint8 if (typedArray instanceof ArrayBuffer) { typedArray = new Uint8Array(typedArray); } // Convert other array views to uint8 if ( typedArray instanceof Int8Array || (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || typedArray instanceof Int16Array || typedArray instanceof Uint16Array || typedArray instanceof Int32Array || typedArray instanceof Uint32Array || typedArray instanceof Float32Array || typedArray instanceof Float64Array ) { typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); } // Handle Uint8Array if (typedArray instanceof Uint8Array) { // Shortcut var typedArrayByteLength = typedArray.byteLength; // Extract bytes var words = []; for (var i = 0; i < typedArrayByteLength; i++) { words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); } // Initialize this word array superInit.call(this, words, typedArrayByteLength); } else { // Else call normal init superInit.apply(this, arguments); } }; subInit.prototype = WordArray; }()); /** @preserve (c) 2012 by Cédric Mesnil. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ (function (Math) { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; // Constants table var _zl = WordArray.create([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); var _zr = WordArray.create([ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); var _sl = WordArray.create([ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); var _sr = WordArray.create([ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); /** * RIPEMD160 hash algorithm. */ var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ _doReset: function () { this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); }, _doProcessBlock: function (M, offset) { // Swap endian for (var i = 0; i < 16; i++) { // Shortcuts var offset_i = offset + i; var M_offset_i = M[offset_i]; // Swap M[offset_i] = ( (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) ); } // Shortcut var H = this._hash.words; var hl = _hl.words; var hr = _hr.words; var zl = _zl.words; var zr = _zr.words; var sl = _sl.words; var sr = _sr.words; // Working variables var al, bl, cl, dl, el; var ar, br, cr, dr, er; ar = al = H[0]; br = bl = H[1]; cr = cl = H[2]; dr = dl = H[3]; er = el = H[4]; // Computation var t; for (var i = 0; i < 80; i += 1) { t = (al + M[offset+zl[i]])|0; if (i<16){ t += f1(bl,cl,dl) + hl[0]; } else if (i<32) { t += f2(bl,cl,dl) + hl[1]; } else if (i<48) { t += f3(bl,cl,dl) + hl[2]; } else if (i<64) { t += f4(bl,cl,dl) + hl[3]; } else {// if (i<80) { t += f5(bl,cl,dl) + hl[4]; } t = t|0; t = rotl(t,sl[i]); t = (t+el)|0; al = el; el = dl; dl = rotl(cl, 10); cl = bl; bl = t; t = (ar + M[offset+zr[i]])|0; if (i<16){ t += f5(br,cr,dr) + hr[0]; } else if (i<32) { t += f4(br,cr,dr) + hr[1]; } else if (i<48) { t += f3(br,cr,dr) + hr[2]; } else if (i<64) { t += f2(br,cr,dr) + hr[3]; } else {// if (i<80) { t += f1(br,cr,dr) + hr[4]; } t = t|0; t = rotl(t,sr[i]) ; t = (t+er)|0; ar = er; er = dr; dr = rotl(cr, 10); cr = br; br = t; } // Intermediate hash value t = (H[1] + cl + dr)|0; H[1] = (H[2] + dl + er)|0; H[2] = (H[3] + el + ar)|0; H[3] = (H[4] + al + br)|0; H[4] = (H[0] + bl + cr)|0; H[0] = t; }, _doFinalize: function () { // Shortcuts var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) ); data.sigBytes = (dataWords.length + 1) * 4; // Hash final blocks this._process(); // Shortcuts var hash = this._hash; var H = hash.words; // Swap endian for (var i = 0; i < 5; i++) { // Shortcut var H_i = H[i]; // Swap H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); } // Return final computed hash return hash; }, clone: function () { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone; } }); function f1(x, y, z) { return ((x) ^ (y) ^ (z)); } function f2(x, y, z) { return (((x)&(y)) | ((~x)&(z))); } function f3(x, y, z) { return (((x) | (~(y))) ^ (z)); } function f4(x, y, z) { return (((x) & (z)) | ((y)&(~(z)))); } function f5(x, y, z) { return ((x) ^ ((y) |(~(z)))); } function rotl(x,n) { return (x<>>(32-n)); } /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.RIPEMD160('message'); * var hash = CryptoJS.RIPEMD160(wordArray); */ C.RIPEMD160 = Hasher._createHelper(RIPEMD160); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacRIPEMD160(message, key); */ C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); }(Math)); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var C_enc = C.enc; var Utf8 = C_enc.Utf8; var C_algo = C.algo; /** * HMAC algorithm. */ var HMAC = C_algo.HMAC = Base.extend({ /** * Initializes a newly created HMAC. * * @param {Hasher} hasher The hash algorithm to use. * @param {WordArray|string} key The secret key. * * @example * * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); */ init: function (hasher, key) { // Init hasher hasher = this._hasher = new hasher.init(); // Convert string to WordArray, else assume WordArray already if (typeof key == 'string') { key = Utf8.parse(key); } // Shortcuts var hasherBlockSize = hasher.blockSize; var hasherBlockSizeBytes = hasherBlockSize * 4; // Allow arbitrary length keys if (key.sigBytes > hasherBlockSizeBytes) { key = hasher.finalize(key); } // Clamp excess bits key.clamp(); // Clone key for inner and outer pads var oKey = this._oKey = key.clone(); var iKey = this._iKey = key.clone(); // Shortcuts var oKeyWords = oKey.words; var iKeyWords = iKey.words; // XOR keys with pad constants for (var i = 0; i < hasherBlockSize; i++) { oKeyWords[i] ^= 0x5c5c5c5c; iKeyWords[i] ^= 0x36363636; } oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; // Set initial values this.reset(); }, /** * Resets this HMAC to its initial state. * * @example * * hmacHasher.reset(); */ reset: function () { // Shortcut var hasher = this._hasher; // Reset hasher.reset(); hasher.update(this._iKey); }, /** * Updates this HMAC with a message. * * @param {WordArray|string} messageUpdate The message to append. * * @return {HMAC} This HMAC instance. * * @example * * hmacHasher.update('message'); * hmacHasher.update(wordArray); */ update: function (messageUpdate) { this._hasher.update(messageUpdate); // Chainable return this; }, /** * Finalizes the HMAC computation. * Note that the finalize operation is effectively a destructive, read-once operation. * * @param {WordArray|string} messageUpdate (Optional) A final message update. * * @return {WordArray} The HMAC. * * @example * * var hmac = hmacHasher.finalize(); * var hmac = hmacHasher.finalize('message'); * var hmac = hmacHasher.finalize(wordArray); */ finalize: function (messageUpdate) { // Shortcut var hasher = this._hasher; // Compute HMAC var innerHash = hasher.finalize(messageUpdate); hasher.reset(); var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); return hmac; } }); }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var WordArray = C_lib.WordArray; var C_algo = C.algo; var SHA1 = C_algo.SHA1; var HMAC = C_algo.HMAC; /** * Password-Based Key Derivation Function 2 algorithm. */ var PBKDF2 = C_algo.PBKDF2 = Base.extend({ /** * Configuration options. * * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) * @property {Hasher} hasher The hasher to use. Default: SHA1 * @property {number} iterations The number of iterations to perform. Default: 1 */ cfg: Base.extend({ keySize: 128/32, hasher: SHA1, iterations: 1 }), /** * Initializes a newly created key derivation function. * * @param {Object} cfg (Optional) The configuration options to use for the derivation. * * @example * * var kdf = CryptoJS.algo.PBKDF2.create(); * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); */ init: function (cfg) { this.cfg = this.cfg.extend(cfg); }, /** * Computes the Password-Based Key Derivation Function 2. * * @param {WordArray|string} password The password. * @param {WordArray|string} salt A salt. * * @return {WordArray} The derived key. * * @example * * var key = kdf.compute(password, salt); */ compute: function (password, salt) { // Shortcut var cfg = this.cfg; // Init HMAC var hmac = HMAC.create(cfg.hasher, password); // Initial values var derivedKey = WordArray.create(); var blockIndex = WordArray.create([0x00000001]); // Shortcuts var derivedKeyWords = derivedKey.words; var blockIndexWords = blockIndex.words; var keySize = cfg.keySize; var iterations = cfg.iterations; // Generate key while (derivedKeyWords.length < keySize) { var block = hmac.update(salt).finalize(blockIndex); hmac.reset(); // Shortcuts var blockWords = block.words; var blockWordsLength = blockWords.length; // Iterations var intermediate = block; for (var i = 1; i < iterations; i++) { intermediate = hmac.finalize(intermediate); hmac.reset(); // Shortcut var intermediateWords = intermediate.words; // XOR intermediate with block for (var j = 0; j < blockWordsLength; j++) { blockWords[j] ^= intermediateWords[j]; } } derivedKey.concat(block); blockIndexWords[0]++; } derivedKey.sigBytes = keySize * 4; return derivedKey; } }); /** * Computes the Password-Based Key Derivation Function 2. * * @param {WordArray|string} password The password. * @param {WordArray|string} salt A salt. * @param {Object} cfg (Optional) The configuration options to use for this computation. * * @return {WordArray} The derived key. * * @static * * @example * * var key = CryptoJS.PBKDF2(password, salt); * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); */ C.PBKDF2 = function (password, salt, cfg) { return PBKDF2.create(cfg).compute(password, salt); }; }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var WordArray = C_lib.WordArray; var C_algo = C.algo; var MD5 = C_algo.MD5; /** * This key derivation function is meant to conform with EVP_BytesToKey. * www.openssl.org/docs/crypto/EVP_BytesToKey.html */ var EvpKDF = C_algo.EvpKDF = Base.extend({ /** * Configuration options. * * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) * @property {Hasher} hasher The hash algorithm to use. Default: MD5 * @property {number} iterations The number of iterations to perform. Default: 1 */ cfg: Base.extend({ keySize: 128/32, hasher: MD5, iterations: 1 }), /** * Initializes a newly created key derivation function. * * @param {Object} cfg (Optional) The configuration options to use for the derivation. * * @example * * var kdf = CryptoJS.algo.EvpKDF.create(); * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); */ init: function (cfg) { this.cfg = this.cfg.extend(cfg); }, /** * Derives a key from a password. * * @param {WordArray|string} password The password. * @param {WordArray|string} salt A salt. * * @return {WordArray} The derived key. * * @example * * var key = kdf.compute(password, salt); */ compute: function (password, salt) { // Shortcut var cfg = this.cfg; // Init hasher var hasher = cfg.hasher.create(); // Initial values var derivedKey = WordArray.create(); // Shortcuts var derivedKeyWords = derivedKey.words; var keySize = cfg.keySize; var iterations = cfg.iterations; // Generate key while (derivedKeyWords.length < keySize) { if (block) { hasher.update(block); } var block = hasher.update(password).finalize(salt); hasher.reset(); // Iterations for (var i = 1; i < iterations; i++) { block = hasher.finalize(block); hasher.reset(); } derivedKey.concat(block); } derivedKey.sigBytes = keySize * 4; return derivedKey; } }); /** * Derives a key from a password. * * @param {WordArray|string} password The password. * @param {WordArray|string} salt A salt. * @param {Object} cfg (Optional) The configuration options to use for this computation. * * @return {WordArray} The derived key. * * @static * * @example * * var key = CryptoJS.EvpKDF(password, salt); * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); */ C.EvpKDF = function (password, salt, cfg) { return EvpKDF.create(cfg).compute(password, salt); }; }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var C_algo = C.algo; var SHA256 = C_algo.SHA256; /** * SHA-224 hash algorithm. */ var SHA224 = C_algo.SHA224 = SHA256.extend({ _doReset: function () { this._hash = new WordArray.init([ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]); }, _doFinalize: function () { var hash = SHA256._doFinalize.call(this); hash.sigBytes -= 4; return hash; } }); /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.SHA224('message'); * var hash = CryptoJS.SHA224(wordArray); */ C.SHA224 = SHA256._createHelper(SHA224); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacSHA224(message, key); */ C.HmacSHA224 = SHA256._createHmacHelper(SHA224); }()); (function (undefined) { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var X32WordArray = C_lib.WordArray; /** * x64 namespace. */ var C_x64 = C.x64 = {}; /** * A 64-bit word. */ var X64Word = C_x64.Word = Base.extend({ /** * Initializes a newly created 64-bit word. * * @param {number} high The high 32 bits. * @param {number} low The low 32 bits. * * @example * * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); */ init: function (high, low) { this.high = high; this.low = low; } /** * Bitwise NOTs this word. * * @return {X64Word} A new x64-Word object after negating. * * @example * * var negated = x64Word.not(); */ // not: function () { // var high = ~this.high; // var low = ~this.low; // return X64Word.create(high, low); // }, /** * Bitwise ANDs this word with the passed word. * * @param {X64Word} word The x64-Word to AND with this word. * * @return {X64Word} A new x64-Word object after ANDing. * * @example * * var anded = x64Word.and(anotherX64Word); */ // and: function (word) { // var high = this.high & word.high; // var low = this.low & word.low; // return X64Word.create(high, low); // }, /** * Bitwise ORs this word with the passed word. * * @param {X64Word} word The x64-Word to OR with this word. * * @return {X64Word} A new x64-Word object after ORing. * * @example * * var ored = x64Word.or(anotherX64Word); */ // or: function (word) { // var high = this.high | word.high; // var low = this.low | word.low; // return X64Word.create(high, low); // }, /** * Bitwise XORs this word with the passed word. * * @param {X64Word} word The x64-Word to XOR with this word. * * @return {X64Word} A new x64-Word object after XORing. * * @example * * var xored = x64Word.xor(anotherX64Word); */ // xor: function (word) { // var high = this.high ^ word.high; // var low = this.low ^ word.low; // return X64Word.create(high, low); // }, /** * Shifts this word n bits to the left. * * @param {number} n The number of bits to shift. * * @return {X64Word} A new x64-Word object after shifting. * * @example * * var shifted = x64Word.shiftL(25); */ // shiftL: function (n) { // if (n < 32) { // var high = (this.high << n) | (this.low >>> (32 - n)); // var low = this.low << n; // } else { // var high = this.low << (n - 32); // var low = 0; // } // return X64Word.create(high, low); // }, /** * Shifts this word n bits to the right. * * @param {number} n The number of bits to shift. * * @return {X64Word} A new x64-Word object after shifting. * * @example * * var shifted = x64Word.shiftR(7); */ // shiftR: function (n) { // if (n < 32) { // var low = (this.low >>> n) | (this.high << (32 - n)); // var high = this.high >>> n; // } else { // var low = this.high >>> (n - 32); // var high = 0; // } // return X64Word.create(high, low); // }, /** * Rotates this word n bits to the left. * * @param {number} n The number of bits to rotate. * * @return {X64Word} A new x64-Word object after rotating. * * @example * * var rotated = x64Word.rotL(25); */ // rotL: function (n) { // return this.shiftL(n).or(this.shiftR(64 - n)); // }, /** * Rotates this word n bits to the right. * * @param {number} n The number of bits to rotate. * * @return {X64Word} A new x64-Word object after rotating. * * @example * * var rotated = x64Word.rotR(7); */ // rotR: function (n) { // return this.shiftR(n).or(this.shiftL(64 - n)); // }, /** * Adds this word with the passed word. * * @param {X64Word} word The x64-Word to add with this word. * * @return {X64Word} A new x64-Word object after adding. * * @example * * var added = x64Word.add(anotherX64Word); */ // add: function (word) { // var low = (this.low + word.low) | 0; // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; // var high = (this.high + word.high + carry) | 0; // return X64Word.create(high, low); // } }); /** * An array of 64-bit words. * * @property {Array} words The array of CryptoJS.x64.Word objects. * @property {number} sigBytes The number of significant bytes in this word array. */ var X64WordArray = C_x64.WordArray = Base.extend({ /** * Initializes a newly created word array. * * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. * @param {number} sigBytes (Optional) The number of significant bytes in the words. * * @example * * var wordArray = CryptoJS.x64.WordArray.create(); * * var wordArray = CryptoJS.x64.WordArray.create([ * CryptoJS.x64.Word.create(0x00010203, 0x04050607), * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) * ]); * * var wordArray = CryptoJS.x64.WordArray.create([ * CryptoJS.x64.Word.create(0x00010203, 0x04050607), * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) * ], 10); */ init: function (words, sigBytes) { words = this.words = words || []; if (sigBytes != undefined) { this.sigBytes = sigBytes; } else { this.sigBytes = words.length * 8; } }, /** * Converts this 64-bit word array to a 32-bit word array. * * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. * * @example * * var x32WordArray = x64WordArray.toX32(); */ toX32: function () { // Shortcuts var x64Words = this.words; var x64WordsLength = x64Words.length; // Convert var x32Words = []; for (var i = 0; i < x64WordsLength; i++) { var x64Word = x64Words[i]; x32Words.push(x64Word.high); x32Words.push(x64Word.low); } return X32WordArray.create(x32Words, this.sigBytes); }, /** * Creates a copy of this word array. * * @return {X64WordArray} The clone. * * @example * * var clone = x64WordArray.clone(); */ clone: function () { var clone = Base.clone.call(this); // Clone "words" array var words = clone.words = this.words.slice(0); // Clone each X64Word object var wordsLength = words.length; for (var i = 0; i < wordsLength; i++) { words[i] = words[i].clone(); } return clone; } }); }()); (function (Math) { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_x64 = C.x64; var X64Word = C_x64.Word; var C_algo = C.algo; // Constants tables var RHO_OFFSETS = []; var PI_INDEXES = []; var ROUND_CONSTANTS = []; // Compute Constants (function () { // Compute rho offset constants var x = 1, y = 0; for (var t = 0; t < 24; t++) { RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; var newX = y % 5; var newY = (2 * x + 3 * y) % 5; x = newX; y = newY; } // Compute pi index constants for (var x = 0; x < 5; x++) { for (var y = 0; y < 5; y++) { PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; } } // Compute round constants var LFSR = 0x01; for (var i = 0; i < 24; i++) { var roundConstantMsw = 0; var roundConstantLsw = 0; for (var j = 0; j < 7; j++) { if (LFSR & 0x01) { var bitPosition = (1 << j) - 1; if (bitPosition < 32) { roundConstantLsw ^= 1 << bitPosition; } else /* if (bitPosition >= 32) */ { roundConstantMsw ^= 1 << (bitPosition - 32); } } // Compute next LFSR if (LFSR & 0x80) { // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 LFSR = (LFSR << 1) ^ 0x71; } else { LFSR <<= 1; } } ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); } }()); // Reusable objects for temporary values var T = []; (function () { for (var i = 0; i < 25; i++) { T[i] = X64Word.create(); } }()); /** * SHA-3 hash algorithm. */ var SHA3 = C_algo.SHA3 = Hasher.extend({ /** * Configuration options. * * @property {number} outputLength * The desired number of bits in the output hash. * Only values permitted are: 224, 256, 384, 512. * Default: 512 */ cfg: Hasher.cfg.extend({ outputLength: 512 }), _doReset: function () { var state = this._state = [] for (var i = 0; i < 25; i++) { state[i] = new X64Word.init(); } this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; }, _doProcessBlock: function (M, offset) { // Shortcuts var state = this._state; var nBlockSizeLanes = this.blockSize / 2; // Absorb for (var i = 0; i < nBlockSizeLanes; i++) { // Shortcuts var M2i = M[offset + 2 * i]; var M2i1 = M[offset + 2 * i + 1]; // Swap endian M2i = ( (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) ); M2i1 = ( (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) ); // Absorb message into state var lane = state[i]; lane.high ^= M2i1; lane.low ^= M2i; } // Rounds for (var round = 0; round < 24; round++) { // Theta for (var x = 0; x < 5; x++) { // Mix column lanes var tMsw = 0, tLsw = 0; for (var y = 0; y < 5; y++) { var lane = state[x + 5 * y]; tMsw ^= lane.high; tLsw ^= lane.low; } // Temporary values var Tx = T[x]; Tx.high = tMsw; Tx.low = tLsw; } for (var x = 0; x < 5; x++) { // Shortcuts var Tx4 = T[(x + 4) % 5]; var Tx1 = T[(x + 1) % 5]; var Tx1Msw = Tx1.high; var Tx1Lsw = Tx1.low; // Mix surrounding columns var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); for (var y = 0; y < 5; y++) { var lane = state[x + 5 * y]; lane.high ^= tMsw; lane.low ^= tLsw; } } // Rho Pi for (var laneIndex = 1; laneIndex < 25; laneIndex++) { // Shortcuts var lane = state[laneIndex]; var laneMsw = lane.high; var laneLsw = lane.low; var rhoOffset = RHO_OFFSETS[laneIndex]; // Rotate lanes if (rhoOffset < 32) { var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); } else /* if (rhoOffset >= 32) */ { var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); } // Transpose lanes var TPiLane = T[PI_INDEXES[laneIndex]]; TPiLane.high = tMsw; TPiLane.low = tLsw; } // Rho pi at x = y = 0 var T0 = T[0]; var state0 = state[0]; T0.high = state0.high; T0.low = state0.low; // Chi for (var x = 0; x < 5; x++) { for (var y = 0; y < 5; y++) { // Shortcuts var laneIndex = x + 5 * y; var lane = state[laneIndex]; var TLane = T[laneIndex]; var Tx1Lane = T[((x + 1) % 5) + 5 * y]; var Tx2Lane = T[((x + 2) % 5) + 5 * y]; // Mix rows lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); } } // Iota var lane = state[0]; var roundConstant = ROUND_CONSTANTS[round]; lane.high ^= roundConstant.high; lane.low ^= roundConstant.low;; } }, _doFinalize: function () { // Shortcuts var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; var blockSizeBits = this.blockSize * 32; // Add padding dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; data.sigBytes = dataWords.length * 4; // Hash final blocks this._process(); // Shortcuts var state = this._state; var outputLengthBytes = this.cfg.outputLength / 8; var outputLengthLanes = outputLengthBytes / 8; // Squeeze var hashWords = []; for (var i = 0; i < outputLengthLanes; i++) { // Shortcuts var lane = state[i]; var laneMsw = lane.high; var laneLsw = lane.low; // Swap endian laneMsw = ( (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) ); laneLsw = ( (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) ); // Squeeze state to retrieve hash hashWords.push(laneLsw); hashWords.push(laneMsw); } // Return final computed hash return new WordArray.init(hashWords, outputLengthBytes); }, clone: function () { var clone = Hasher.clone.call(this); var state = clone._state = this._state.slice(0); for (var i = 0; i < 25; i++) { state[i] = state[i].clone(); } return clone; } }); /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.SHA3('message'); * var hash = CryptoJS.SHA3(wordArray); */ C.SHA3 = Hasher._createHelper(SHA3); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacSHA3(message, key); */ C.HmacSHA3 = Hasher._createHmacHelper(SHA3); }(Math)); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var Hasher = C_lib.Hasher; var C_x64 = C.x64; var X64Word = C_x64.Word; var X64WordArray = C_x64.WordArray; var C_algo = C.algo; function X64Word_create() { return X64Word.create.apply(X64Word, arguments); } // Constants var K = [ X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) ]; // Reusable objects var W = []; (function () { for (var i = 0; i < 80; i++) { W[i] = X64Word_create(); } }()); /** * SHA-512 hash algorithm. */ var SHA512 = C_algo.SHA512 = Hasher.extend({ _doReset: function () { this._hash = new X64WordArray.init([ new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) ]); }, _doProcessBlock: function (M, offset) { // Shortcuts var H = this._hash.words; var H0 = H[0]; var H1 = H[1]; var H2 = H[2]; var H3 = H[3]; var H4 = H[4]; var H5 = H[5]; var H6 = H[6]; var H7 = H[7]; var H0h = H0.high; var H0l = H0.low; var H1h = H1.high; var H1l = H1.low; var H2h = H2.high; var H2l = H2.low; var H3h = H3.high; var H3l = H3.low; var H4h = H4.high; var H4l = H4.low; var H5h = H5.high; var H5l = H5.low; var H6h = H6.high; var H6l = H6.low; var H7h = H7.high; var H7l = H7.low; // Working variables var ah = H0h; var al = H0l; var bh = H1h; var bl = H1l; var ch = H2h; var cl = H2l; var dh = H3h; var dl = H3l; var eh = H4h; var el = H4l; var fh = H5h; var fl = H5l; var gh = H6h; var gl = H6l; var hh = H7h; var hl = H7l; // Rounds for (var i = 0; i < 80; i++) { // Shortcut var Wi = W[i]; // Extend message if (i < 16) { var Wih = Wi.high = M[offset + i * 2] | 0; var Wil = Wi.low = M[offset + i * 2 + 1] | 0; } else { // Gamma0 var gamma0x = W[i - 15]; var gamma0xh = gamma0x.high; var gamma0xl = gamma0x.low; var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); // Gamma1 var gamma1x = W[i - 2]; var gamma1xh = gamma1x.high; var gamma1xl = gamma1x.low; var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] var Wi7 = W[i - 7]; var Wi7h = Wi7.high; var Wi7l = Wi7.low; var Wi16 = W[i - 16]; var Wi16h = Wi16.high; var Wi16l = Wi16.low; var Wil = gamma0l + Wi7l; var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); var Wil = Wil + gamma1l; var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); var Wil = Wil + Wi16l; var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); Wi.high = Wih; Wi.low = Wil; } var chh = (eh & fh) ^ (~eh & gh); var chl = (el & fl) ^ (~el & gl); var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); var majl = (al & bl) ^ (al & cl) ^ (bl & cl); var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); // t1 = h + sigma1 + ch + K[i] + W[i] var Ki = K[i]; var Kih = Ki.high; var Kil = Ki.low; var t1l = hl + sigma1l; var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); var t1l = t1l + chl; var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); var t1l = t1l + Kil; var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); var t1l = t1l + Wil; var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); // t2 = sigma0 + maj var t2l = sigma0l + majl; var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); // Update working variables hh = gh; hl = gl; gh = fh; gl = fl; fh = eh; fl = el; el = (dl + t1l) | 0; eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; dh = ch; dl = cl; ch = bh; cl = bl; bh = ah; bl = al; al = (t1l + t2l) | 0; ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; } // Intermediate hash value H0l = H0.low = (H0l + al); H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); H1l = H1.low = (H1l + bl); H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); H2l = H2.low = (H2l + cl); H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); H3l = H3.low = (H3l + dl); H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); H4l = H4.low = (H4l + el); H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); H5l = H5.low = (H5l + fl); H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); H6l = H6.low = (H6l + gl); H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); H7l = H7.low = (H7l + hl); H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); }, _doFinalize: function () { // Shortcuts var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; data.sigBytes = dataWords.length * 4; // Hash final blocks this._process(); // Convert hash to 32-bit word array before returning var hash = this._hash.toX32(); // Return final computed hash return hash; }, clone: function () { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone; }, blockSize: 1024/32 }); /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.SHA512('message'); * var hash = CryptoJS.SHA512(wordArray); */ C.SHA512 = Hasher._createHelper(SHA512); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacSHA512(message, key); */ C.HmacSHA512 = Hasher._createHmacHelper(SHA512); }()); (function () { // Shortcuts var C = CryptoJS; var C_x64 = C.x64; var X64Word = C_x64.Word; var X64WordArray = C_x64.WordArray; var C_algo = C.algo; var SHA512 = C_algo.SHA512; /** * SHA-384 hash algorithm. */ var SHA384 = C_algo.SHA384 = SHA512.extend({ _doReset: function () { this._hash = new X64WordArray.init([ new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) ]); }, _doFinalize: function () { var hash = SHA512._doFinalize.call(this); hash.sigBytes -= 16; return hash; } }); /** * Shortcut function to the hasher's object interface. * * @param {WordArray|string} message The message to hash. * * @return {WordArray} The hash. * * @static * * @example * * var hash = CryptoJS.SHA384('message'); * var hash = CryptoJS.SHA384(wordArray); */ C.SHA384 = SHA512._createHelper(SHA384); /** * Shortcut function to the HMAC's object interface. * * @param {WordArray|string} message The message to hash. * @param {WordArray|string} key The secret key. * * @return {WordArray} The HMAC. * * @static * * @example * * var hmac = CryptoJS.HmacSHA384(message, key); */ C.HmacSHA384 = SHA512._createHmacHelper(SHA384); }()); /** * Cipher core components. */ CryptoJS.lib.Cipher || (function (undefined) { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var WordArray = C_lib.WordArray; var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; var C_enc = C.enc; var Utf8 = C_enc.Utf8; var Base64 = C_enc.Base64; var C_algo = C.algo; var EvpKDF = C_algo.EvpKDF; /** * Abstract base cipher template. * * @property {number} keySize This cipher's key size. Default: 4 (128 bits) * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. */ var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ /** * Configuration options. * * @property {WordArray} iv The IV to use for this operation. */ cfg: Base.extend(), /** * Creates this cipher in encryption mode. * * @param {WordArray} key The key. * @param {Object} cfg (Optional) The configuration options to use for this operation. * * @return {Cipher} A cipher instance. * * @static * * @example * * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); */ createEncryptor: function (key, cfg) { return this.create(this._ENC_XFORM_MODE, key, cfg); }, /** * Creates this cipher in decryption mode. * * @param {WordArray} key The key. * @param {Object} cfg (Optional) The configuration options to use for this operation. * * @return {Cipher} A cipher instance. * * @static * * @example * * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); */ createDecryptor: function (key, cfg) { return this.create(this._DEC_XFORM_MODE, key, cfg); }, /** * Initializes a newly created cipher. * * @param {number} xformMode Either the encryption or decryption transormation mode constant. * @param {WordArray} key The key. * @param {Object} cfg (Optional) The configuration options to use for this operation. * * @example * * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); */ init: function (xformMode, key, cfg) { // Apply config defaults this.cfg = this.cfg.extend(cfg); // Store transform mode and key this._xformMode = xformMode; this._key = key; // Set initial values this.reset(); }, /** * Resets this cipher to its initial state. * * @example * * cipher.reset(); */ reset: function () { // Reset data buffer BufferedBlockAlgorithm.reset.call(this); // Perform concrete-cipher logic this._doReset(); }, /** * Adds data to be encrypted or decrypted. * * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. * * @return {WordArray} The data after processing. * * @example * * var encrypted = cipher.process('data'); * var encrypted = cipher.process(wordArray); */ process: function (dataUpdate) { // Append this._append(dataUpdate); // Process available blocks return this._process(); }, /** * Finalizes the encryption or decryption process. * Note that the finalize operation is effectively a destructive, read-once operation. * * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. * * @return {WordArray} The data after final processing. * * @example * * var encrypted = cipher.finalize(); * var encrypted = cipher.finalize('data'); * var encrypted = cipher.finalize(wordArray); */ finalize: function (dataUpdate) { // Final data update if (dataUpdate) { this._append(dataUpdate); } // Perform concrete-cipher logic var finalProcessedData = this._doFinalize(); return finalProcessedData; }, keySize: 128/32, ivSize: 128/32, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, /** * Creates shortcut functions to a cipher's object interface. * * @param {Cipher} cipher The cipher to create a helper for. * * @return {Object} An object with encrypt and decrypt shortcut functions. * * @static * * @example * * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); */ _createHelper: (function () { function selectCipherStrategy(key) { if (typeof key == 'string') { return PasswordBasedCipher; } else { return SerializableCipher; } } return function (cipher) { return { encrypt: function (message, key, cfg) { return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); }, decrypt: function (ciphertext, key, cfg) { return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); } }; }; }()) }); /** * Abstract base stream cipher template. * * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) */ var StreamCipher = C_lib.StreamCipher = Cipher.extend({ _doFinalize: function () { // Process partial blocks var finalProcessedBlocks = this._process(!!'flush'); return finalProcessedBlocks; }, blockSize: 1 }); /** * Mode namespace. */ var C_mode = C.mode = {}; /** * Abstract base block cipher mode template. */ var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ /** * Creates this mode for encryption. * * @param {Cipher} cipher A block cipher instance. * @param {Array} iv The IV words. * * @static * * @example * * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); */ createEncryptor: function (cipher, iv) { return this.Encryptor.create(cipher, iv); }, /** * Creates this mode for decryption. * * @param {Cipher} cipher A block cipher instance. * @param {Array} iv The IV words. * * @static * * @example * * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); */ createDecryptor: function (cipher, iv) { return this.Decryptor.create(cipher, iv); }, /** * Initializes a newly created mode. * * @param {Cipher} cipher A block cipher instance. * @param {Array} iv The IV words. * * @example * * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); */ init: function (cipher, iv) { this._cipher = cipher; this._iv = iv; } }); /** * Cipher Block Chaining mode. */ var CBC = C_mode.CBC = (function () { /** * Abstract base CBC mode. */ var CBC = BlockCipherMode.extend(); /** * CBC encryptor. */ CBC.Encryptor = CBC.extend({ /** * Processes the data block at offset. * * @param {Array} words The data words to operate on. * @param {number} offset The offset where the block starts. * * @example * * mode.processBlock(data.words, offset); */ processBlock: function (words, offset) { // Shortcuts var cipher = this._cipher; var blockSize = cipher.blockSize; // XOR and encrypt xorBlock.call(this, words, offset, blockSize); cipher.encryptBlock(words, offset); // Remember this block to use with next block this._prevBlock = words.slice(offset, offset + blockSize); } }); /** * CBC decryptor. */ CBC.Decryptor = CBC.extend({ /** * Processes the data block at offset. * * @param {Array} words The data words to operate on. * @param {number} offset The offset where the block starts. * * @example * * mode.processBlock(data.words, offset); */ processBlock: function (words, offset) { // Shortcuts var cipher = this._cipher; var blockSize = cipher.blockSize; // Remember this block to use with next block var thisBlock = words.slice(offset, offset + blockSize); // Decrypt and XOR cipher.decryptBlock(words, offset); xorBlock.call(this, words, offset, blockSize); // This block becomes the previous block this._prevBlock = thisBlock; } }); function xorBlock(words, offset, blockSize) { // Shortcut var iv = this._iv; // Choose mixing block if (iv) { var block = iv; // Remove IV for subsequent blocks this._iv = undefined; } else { var block = this._prevBlock; } // XOR blocks for (var i = 0; i < blockSize; i++) { words[offset + i] ^= block[i]; } } return CBC; }()); /** * Padding namespace. */ var C_pad = C.pad = {}; /** * PKCS #5/7 padding strategy. */ var Pkcs7 = C_pad.Pkcs7 = { /** * Pads data using the algorithm defined in PKCS #5/7. * * @param {WordArray} data The data to pad. * @param {number} blockSize The multiple that the data should be padded to. * * @static * * @example * * CryptoJS.pad.Pkcs7.pad(wordArray, 4); */ pad: function (data, blockSize) { // Shortcut var blockSizeBytes = blockSize * 4; // Count padding bytes var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; // Create padding word var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; // Create padding var paddingWords = []; for (var i = 0; i < nPaddingBytes; i += 4) { paddingWords.push(paddingWord); } var padding = WordArray.create(paddingWords, nPaddingBytes); // Add padding data.concat(padding); }, /** * Unpads data that had been padded using the algorithm defined in PKCS #5/7. * * @param {WordArray} data The data to unpad. * * @static * * @example * * CryptoJS.pad.Pkcs7.unpad(wordArray); */ unpad: function (data) { // Get number of padding bytes from last byte var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; // Remove padding data.sigBytes -= nPaddingBytes; } }; /** * Abstract base block cipher template. * * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) */ var BlockCipher = C_lib.BlockCipher = Cipher.extend({ /** * Configuration options. * * @property {Mode} mode The block mode to use. Default: CBC * @property {Padding} padding The padding strategy to use. Default: Pkcs7 */ cfg: Cipher.cfg.extend({ mode: CBC, padding: Pkcs7 }), reset: function () { // Reset cipher Cipher.reset.call(this); // Shortcuts var cfg = this.cfg; var iv = cfg.iv; var mode = cfg.mode; // Reset block mode if (this._xformMode == this._ENC_XFORM_MODE) { var modeCreator = mode.createEncryptor; } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { var modeCreator = mode.createDecryptor; // Keep at least one block in the buffer for unpadding this._minBufferSize = 1; } if (this._mode && this._mode.__creator == modeCreator) { this._mode.init(this, iv && iv.words); } else { this._mode = modeCreator.call(mode, this, iv && iv.words); this._mode.__creator = modeCreator; } }, _doProcessBlock: function (words, offset) { this._mode.processBlock(words, offset); }, _doFinalize: function () { // Shortcut var padding = this.cfg.padding; // Finalize if (this._xformMode == this._ENC_XFORM_MODE) { // Pad data padding.pad(this._data, this.blockSize); // Process final blocks var finalProcessedBlocks = this._process(!!'flush'); } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { // Process final blocks var finalProcessedBlocks = this._process(!!'flush'); // Unpad data padding.unpad(finalProcessedBlocks); } return finalProcessedBlocks; }, blockSize: 128/32 }); /** * A collection of cipher parameters. * * @property {WordArray} ciphertext The raw ciphertext. * @property {WordArray} key The key to this ciphertext. * @property {WordArray} iv The IV used in the ciphering operation. * @property {WordArray} salt The salt used with a key derivation function. * @property {Cipher} algorithm The cipher algorithm. * @property {Mode} mode The block mode used in the ciphering operation. * @property {Padding} padding The padding scheme used in the ciphering operation. * @property {number} blockSize The block size of the cipher. * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. */ var CipherParams = C_lib.CipherParams = Base.extend({ /** * Initializes a newly created cipher params object. * * @param {Object} cipherParams An object with any of the possible cipher parameters. * * @example * * var cipherParams = CryptoJS.lib.CipherParams.create({ * ciphertext: ciphertextWordArray, * key: keyWordArray, * iv: ivWordArray, * salt: saltWordArray, * algorithm: CryptoJS.algo.AES, * mode: CryptoJS.mode.CBC, * padding: CryptoJS.pad.PKCS7, * blockSize: 4, * formatter: CryptoJS.format.OpenSSL * }); */ init: function (cipherParams) { this.mixIn(cipherParams); }, /** * Converts this cipher params object to a string. * * @param {Format} formatter (Optional) The formatting strategy to use. * * @return {string} The stringified cipher params. * * @throws Error If neither the formatter nor the default formatter is set. * * @example * * var string = cipherParams + ''; * var string = cipherParams.toString(); * var string = cipherParams.toString(CryptoJS.format.OpenSSL); */ toString: function (formatter) { return (formatter || this.formatter).stringify(this); } }); /** * Format namespace. */ var C_format = C.format = {}; /** * OpenSSL formatting strategy. */ var OpenSSLFormatter = C_format.OpenSSL = { /** * Converts a cipher params object to an OpenSSL-compatible string. * * @param {CipherParams} cipherParams The cipher params object. * * @return {string} The OpenSSL-compatible string. * * @static * * @example * * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); */ stringify: function (cipherParams) { // Shortcuts var ciphertext = cipherParams.ciphertext; var salt = cipherParams.salt; // Format if (salt) { var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); } else { var wordArray = ciphertext; } return wordArray.toString(Base64); }, /** * Converts an OpenSSL-compatible string to a cipher params object. * * @param {string} openSSLStr The OpenSSL-compatible string. * * @return {CipherParams} The cipher params object. * * @static * * @example * * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); */ parse: function (openSSLStr) { // Parse base64 var ciphertext = Base64.parse(openSSLStr); // Shortcut var ciphertextWords = ciphertext.words; // Test for salt if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { // Extract salt var salt = WordArray.create(ciphertextWords.slice(2, 4)); // Remove salt from ciphertext ciphertextWords.splice(0, 4); ciphertext.sigBytes -= 16; } return CipherParams.create({ ciphertext: ciphertext, salt: salt }); } }; /** * A cipher wrapper that returns ciphertext as a serializable cipher params object. */ var SerializableCipher = C_lib.SerializableCipher = Base.extend({ /** * Configuration options. * * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL */ cfg: Base.extend({ format: OpenSSLFormatter }), /** * Encrypts a message. * * @param {Cipher} cipher The cipher algorithm to use. * @param {WordArray|string} message The message to encrypt. * @param {WordArray} key The key. * @param {Object} cfg (Optional) The configuration options to use for this operation. * * @return {CipherParams} A cipher params object. * * @static * * @example * * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); */ encrypt: function (cipher, message, key, cfg) { // Apply config defaults cfg = this.cfg.extend(cfg); // Encrypt var encryptor = cipher.createEncryptor(key, cfg); var ciphertext = encryptor.finalize(message); // Shortcut var cipherCfg = encryptor.cfg; // Create and return serializable cipher params return CipherParams.create({ ciphertext: ciphertext, key: key, iv: cipherCfg.iv, algorithm: cipher, mode: cipherCfg.mode, padding: cipherCfg.padding, blockSize: cipher.blockSize, formatter: cfg.format }); }, /** * Decrypts serialized ciphertext. * * @param {Cipher} cipher The cipher algorithm to use. * @param {CipherParams|string} ciphertext The ciphertext to decrypt. * @param {WordArray} key The key. * @param {Object} cfg (Optional) The configuration options to use for this operation. * * @return {WordArray} The plaintext. * * @static * * @example * * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); */ decrypt: function (cipher, ciphertext, key, cfg) { // Apply config defaults cfg = this.cfg.extend(cfg); // Convert string to CipherParams ciphertext = this._parse(ciphertext, cfg.format); // Decrypt var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); return plaintext; }, /** * Converts serialized ciphertext to CipherParams, * else assumed CipherParams already and returns ciphertext unchanged. * * @param {CipherParams|string} ciphertext The ciphertext. * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. * * @return {CipherParams} The unserialized ciphertext. * * @static * * @example * * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); */ _parse: function (ciphertext, format) { if (typeof ciphertext == 'string') { return format.parse(ciphertext, this); } else { return ciphertext; } } }); /** * Key derivation function namespace. */ var C_kdf = C.kdf = {}; /** * OpenSSL key derivation function. */ var OpenSSLKdf = C_kdf.OpenSSL = { /** * Derives a key and IV from a password. * * @param {string} password The password to derive from. * @param {number} keySize The size in words of the key to generate. * @param {number} ivSize The size in words of the IV to generate. * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. * * @return {CipherParams} A cipher params object with the key, IV, and salt. * * @static * * @example * * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); */ execute: function (password, keySize, ivSize, salt) { // Generate random salt if (!salt) { salt = WordArray.random(64/8); } // Derive key and IV var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); // Separate key and IV var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); key.sigBytes = keySize * 4; // Return params return CipherParams.create({ key: key, iv: iv, salt: salt }); } }; /** * A serializable cipher wrapper that derives the key from a password, * and returns ciphertext as a serializable cipher params object. */ var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ /** * Configuration options. * * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL */ cfg: SerializableCipher.cfg.extend({ kdf: OpenSSLKdf }), /** * Encrypts a message using a password. * * @param {Cipher} cipher The cipher algorithm to use. * @param {WordArray|string} message The message to encrypt. * @param {string} password The password. * @param {Object} cfg (Optional) The configuration options to use for this operation. * * @return {CipherParams} A cipher params object. * * @static * * @example * * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); */ encrypt: function (cipher, message, password, cfg) { // Apply config defaults cfg = this.cfg.extend(cfg); // Derive key and other params var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); // Add IV to config cfg.iv = derivedParams.iv; // Encrypt var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); // Mix in derived params ciphertext.mixIn(derivedParams); return ciphertext; }, /** * Decrypts serialized ciphertext using a password. * * @param {Cipher} cipher The cipher algorithm to use. * @param {CipherParams|string} ciphertext The ciphertext to decrypt. * @param {string} password The password. * @param {Object} cfg (Optional) The configuration options to use for this operation. * * @return {WordArray} The plaintext. * * @static * * @example * * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); */ decrypt: function (cipher, ciphertext, password, cfg) { // Apply config defaults cfg = this.cfg.extend(cfg); // Convert string to CipherParams ciphertext = this._parse(ciphertext, cfg.format); // Derive key and other params var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); // Add IV to config cfg.iv = derivedParams.iv; // Decrypt var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); return plaintext; } }); }()); /** * Cipher Feedback block mode. */ CryptoJS.mode.CFB = (function () { var CFB = CryptoJS.lib.BlockCipherMode.extend(); CFB.Encryptor = CFB.extend({ processBlock: function (words, offset) { // Shortcuts var cipher = this._cipher; var blockSize = cipher.blockSize; generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); // Remember this block to use with next block this._prevBlock = words.slice(offset, offset + blockSize); } }); CFB.Decryptor = CFB.extend({ processBlock: function (words, offset) { // Shortcuts var cipher = this._cipher; var blockSize = cipher.blockSize; // Remember this block to use with next block var thisBlock = words.slice(offset, offset + blockSize); generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); // This block becomes the previous block this._prevBlock = thisBlock; } }); function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { // Shortcut var iv = this._iv; // Generate keystream if (iv) { var keystream = iv.slice(0); // Remove IV for subsequent blocks this._iv = undefined; } else { var keystream = this._prevBlock; } cipher.encryptBlock(keystream, 0); // Encrypt for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i]; } } return CFB; }()); /** * Electronic Codebook block mode. */ CryptoJS.mode.ECB = (function () { var ECB = CryptoJS.lib.BlockCipherMode.extend(); ECB.Encryptor = ECB.extend({ processBlock: function (words, offset) { this._cipher.encryptBlock(words, offset); } }); ECB.Decryptor = ECB.extend({ processBlock: function (words, offset) { this._cipher.decryptBlock(words, offset); } }); return ECB; }()); /** * ANSI X.923 padding strategy. */ CryptoJS.pad.AnsiX923 = { pad: function (data, blockSize) { // Shortcuts var dataSigBytes = data.sigBytes; var blockSizeBytes = blockSize * 4; // Count padding bytes var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; // Compute last byte position var lastBytePos = dataSigBytes + nPaddingBytes - 1; // Pad data.clamp(); data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); data.sigBytes += nPaddingBytes; }, unpad: function (data) { // Get number of padding bytes from last byte var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; // Remove padding data.sigBytes -= nPaddingBytes; } }; /** * ISO 10126 padding strategy. */ CryptoJS.pad.Iso10126 = { pad: function (data, blockSize) { // Shortcut var blockSizeBytes = blockSize * 4; // Count padding bytes var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; // Pad data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); }, unpad: function (data) { // Get number of padding bytes from last byte var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; // Remove padding data.sigBytes -= nPaddingBytes; } }; /** * ISO/IEC 9797-1 Padding Method 2. */ CryptoJS.pad.Iso97971 = { pad: function (data, blockSize) { // Add 0x80 byte data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); // Zero pad the rest CryptoJS.pad.ZeroPadding.pad(data, blockSize); }, unpad: function (data) { // Remove zero padding CryptoJS.pad.ZeroPadding.unpad(data); // Remove one more byte -- the 0x80 byte data.sigBytes--; } }; /** * Output Feedback block mode. */ CryptoJS.mode.OFB = (function () { var OFB = CryptoJS.lib.BlockCipherMode.extend(); var Encryptor = OFB.Encryptor = OFB.extend({ processBlock: function (words, offset) { // Shortcuts var cipher = this._cipher var blockSize = cipher.blockSize; var iv = this._iv; var keystream = this._keystream; // Generate keystream if (iv) { keystream = this._keystream = iv.slice(0); // Remove IV for subsequent blocks this._iv = undefined; } cipher.encryptBlock(keystream, 0); // Encrypt for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i]; } } }); OFB.Decryptor = Encryptor; return OFB; }()); /** * A noop padding strategy. */ CryptoJS.pad.NoPadding = { pad: function () { }, unpad: function () { } }; (function (undefined) { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var CipherParams = C_lib.CipherParams; var C_enc = C.enc; var Hex = C_enc.Hex; var C_format = C.format; var HexFormatter = C_format.Hex = { /** * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. * * @param {CipherParams} cipherParams The cipher params object. * * @return {string} The hexadecimally encoded string. * * @static * * @example * * var hexString = CryptoJS.format.Hex.stringify(cipherParams); */ stringify: function (cipherParams) { return cipherParams.ciphertext.toString(Hex); }, /** * Converts a hexadecimally encoded ciphertext string to a cipher params object. * * @param {string} input The hexadecimally encoded string. * * @return {CipherParams} The cipher params object. * * @static * * @example * * var cipherParams = CryptoJS.format.Hex.parse(hexString); */ parse: function (input) { var ciphertext = Hex.parse(input); return CipherParams.create({ ciphertext: ciphertext }); } }; }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var BlockCipher = C_lib.BlockCipher; var C_algo = C.algo; // Lookup tables var SBOX = []; var INV_SBOX = []; var SUB_MIX_0 = []; var SUB_MIX_1 = []; var SUB_MIX_2 = []; var SUB_MIX_3 = []; var INV_SUB_MIX_0 = []; var INV_SUB_MIX_1 = []; var INV_SUB_MIX_2 = []; var INV_SUB_MIX_3 = []; // Compute lookup tables (function () { // Compute double table var d = []; for (var i = 0; i < 256; i++) { if (i < 128) { d[i] = i << 1; } else { d[i] = (i << 1) ^ 0x11b; } } // Walk GF(2^8) var x = 0; var xi = 0; for (var i = 0; i < 256; i++) { // Compute sbox var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; SBOX[x] = sx; INV_SBOX[sx] = x; // Compute multiplication var x2 = d[x]; var x4 = d[x2]; var x8 = d[x4]; // Compute sub bytes, mix columns tables var t = (d[sx] * 0x101) ^ (sx * 0x1010100); SUB_MIX_0[x] = (t << 24) | (t >>> 8); SUB_MIX_1[x] = (t << 16) | (t >>> 16); SUB_MIX_2[x] = (t << 8) | (t >>> 24); SUB_MIX_3[x] = t; // Compute inv sub bytes, inv mix columns tables var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); INV_SUB_MIX_3[sx] = t; // Compute next counter if (!x) { x = xi = 1; } else { x = x2 ^ d[d[d[x8 ^ x2]]]; xi ^= d[d[xi]]; } } }()); // Precomputed Rcon lookup var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; /** * AES block cipher algorithm. */ var AES = C_algo.AES = BlockCipher.extend({ _doReset: function () { // Skip reset of nRounds has been set before and key did not change if (this._nRounds && this._keyPriorReset === this._key) { return; } // Shortcuts var key = this._keyPriorReset = this._key; var keyWords = key.words; var keySize = key.sigBytes / 4; // Compute number of rounds var nRounds = this._nRounds = keySize + 6; // Compute number of key schedule rows var ksRows = (nRounds + 1) * 4; // Compute key schedule var keySchedule = this._keySchedule = []; for (var ksRow = 0; ksRow < ksRows; ksRow++) { if (ksRow < keySize) { keySchedule[ksRow] = keyWords[ksRow]; } else { var t = keySchedule[ksRow - 1]; if (!(ksRow % keySize)) { // Rot word t = (t << 8) | (t >>> 24); // Sub word t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; // Mix Rcon t ^= RCON[(ksRow / keySize) | 0] << 24; } else if (keySize > 6 && ksRow % keySize == 4) { // Sub word t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; } keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; } } // Compute inv key schedule var invKeySchedule = this._invKeySchedule = []; for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { var ksRow = ksRows - invKsRow; if (invKsRow % 4) { var t = keySchedule[ksRow]; } else { var t = keySchedule[ksRow - 4]; } if (invKsRow < 4 || ksRow <= 4) { invKeySchedule[invKsRow] = t; } else { invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; } } }, encryptBlock: function (M, offset) { this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); }, decryptBlock: function (M, offset) { // Swap 2nd and 4th rows var t = M[offset + 1]; M[offset + 1] = M[offset + 3]; M[offset + 3] = t; this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); // Inv swap 2nd and 4th rows var t = M[offset + 1]; M[offset + 1] = M[offset + 3]; M[offset + 3] = t; }, _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { // Shortcut var nRounds = this._nRounds; // Get input, add round key var s0 = M[offset] ^ keySchedule[0]; var s1 = M[offset + 1] ^ keySchedule[1]; var s2 = M[offset + 2] ^ keySchedule[2]; var s3 = M[offset + 3] ^ keySchedule[3]; // Key schedule row counter var ksRow = 4; // Rounds for (var round = 1; round < nRounds; round++) { // Shift rows, sub bytes, mix columns, add round key var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; // Update state s0 = t0; s1 = t1; s2 = t2; s3 = t3; } // Shift rows, sub bytes, add round key var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; // Set output M[offset] = t0; M[offset + 1] = t1; M[offset + 2] = t2; M[offset + 3] = t3; }, keySize: 256/32 }); /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); */ C.AES = BlockCipher._createHelper(AES); }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var BlockCipher = C_lib.BlockCipher; var C_algo = C.algo; // Permuted Choice 1 constants var PC1 = [ 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 ]; // Permuted Choice 2 constants var PC2 = [ 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 ]; // Cumulative bit shift constants var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; // SBOXes and round permutation constants var SBOX_P = [ { 0x0: 0x808200, 0x10000000: 0x8000, 0x20000000: 0x808002, 0x30000000: 0x2, 0x40000000: 0x200, 0x50000000: 0x808202, 0x60000000: 0x800202, 0x70000000: 0x800000, 0x80000000: 0x202, 0x90000000: 0x800200, 0xa0000000: 0x8200, 0xb0000000: 0x808000, 0xc0000000: 0x8002, 0xd0000000: 0x800002, 0xe0000000: 0x0, 0xf0000000: 0x8202, 0x8000000: 0x0, 0x18000000: 0x808202, 0x28000000: 0x8202, 0x38000000: 0x8000, 0x48000000: 0x808200, 0x58000000: 0x200, 0x68000000: 0x808002, 0x78000000: 0x2, 0x88000000: 0x800200, 0x98000000: 0x8200, 0xa8000000: 0x808000, 0xb8000000: 0x800202, 0xc8000000: 0x800002, 0xd8000000: 0x8002, 0xe8000000: 0x202, 0xf8000000: 0x800000, 0x1: 0x8000, 0x10000001: 0x2, 0x20000001: 0x808200, 0x30000001: 0x800000, 0x40000001: 0x808002, 0x50000001: 0x8200, 0x60000001: 0x200, 0x70000001: 0x800202, 0x80000001: 0x808202, 0x90000001: 0x808000, 0xa0000001: 0x800002, 0xb0000001: 0x8202, 0xc0000001: 0x202, 0xd0000001: 0x800200, 0xe0000001: 0x8002, 0xf0000001: 0x0, 0x8000001: 0x808202, 0x18000001: 0x808000, 0x28000001: 0x800000, 0x38000001: 0x200, 0x48000001: 0x8000, 0x58000001: 0x800002, 0x68000001: 0x2, 0x78000001: 0x8202, 0x88000001: 0x8002, 0x98000001: 0x800202, 0xa8000001: 0x202, 0xb8000001: 0x808200, 0xc8000001: 0x800200, 0xd8000001: 0x0, 0xe8000001: 0x8200, 0xf8000001: 0x808002 }, { 0x0: 0x40084010, 0x1000000: 0x4000, 0x2000000: 0x80000, 0x3000000: 0x40080010, 0x4000000: 0x40000010, 0x5000000: 0x40084000, 0x6000000: 0x40004000, 0x7000000: 0x10, 0x8000000: 0x84000, 0x9000000: 0x40004010, 0xa000000: 0x40000000, 0xb000000: 0x84010, 0xc000000: 0x80010, 0xd000000: 0x0, 0xe000000: 0x4010, 0xf000000: 0x40080000, 0x800000: 0x40004000, 0x1800000: 0x84010, 0x2800000: 0x10, 0x3800000: 0x40004010, 0x4800000: 0x40084010, 0x5800000: 0x40000000, 0x6800000: 0x80000, 0x7800000: 0x40080010, 0x8800000: 0x80010, 0x9800000: 0x0, 0xa800000: 0x4000, 0xb800000: 0x40080000, 0xc800000: 0x40000010, 0xd800000: 0x84000, 0xe800000: 0x40084000, 0xf800000: 0x4010, 0x10000000: 0x0, 0x11000000: 0x40080010, 0x12000000: 0x40004010, 0x13000000: 0x40084000, 0x14000000: 0x40080000, 0x15000000: 0x10, 0x16000000: 0x84010, 0x17000000: 0x4000, 0x18000000: 0x4010, 0x19000000: 0x80000, 0x1a000000: 0x80010, 0x1b000000: 0x40000010, 0x1c000000: 0x84000, 0x1d000000: 0x40004000, 0x1e000000: 0x40000000, 0x1f000000: 0x40084010, 0x10800000: 0x84010, 0x11800000: 0x80000, 0x12800000: 0x40080000, 0x13800000: 0x4000, 0x14800000: 0x40004000, 0x15800000: 0x40084010, 0x16800000: 0x10, 0x17800000: 0x40000000, 0x18800000: 0x40084000, 0x19800000: 0x40000010, 0x1a800000: 0x40004010, 0x1b800000: 0x80010, 0x1c800000: 0x0, 0x1d800000: 0x4010, 0x1e800000: 0x40080010, 0x1f800000: 0x84000 }, { 0x0: 0x104, 0x100000: 0x0, 0x200000: 0x4000100, 0x300000: 0x10104, 0x400000: 0x10004, 0x500000: 0x4000004, 0x600000: 0x4010104, 0x700000: 0x4010000, 0x800000: 0x4000000, 0x900000: 0x4010100, 0xa00000: 0x10100, 0xb00000: 0x4010004, 0xc00000: 0x4000104, 0xd00000: 0x10000, 0xe00000: 0x4, 0xf00000: 0x100, 0x80000: 0x4010100, 0x180000: 0x4010004, 0x280000: 0x0, 0x380000: 0x4000100, 0x480000: 0x4000004, 0x580000: 0x10000, 0x680000: 0x10004, 0x780000: 0x104, 0x880000: 0x4, 0x980000: 0x100, 0xa80000: 0x4010000, 0xb80000: 0x10104, 0xc80000: 0x10100, 0xd80000: 0x4000104, 0xe80000: 0x4010104, 0xf80000: 0x4000000, 0x1000000: 0x4010100, 0x1100000: 0x10004, 0x1200000: 0x10000, 0x1300000: 0x4000100, 0x1400000: 0x100, 0x1500000: 0x4010104, 0x1600000: 0x4000004, 0x1700000: 0x0, 0x1800000: 0x4000104, 0x1900000: 0x4000000, 0x1a00000: 0x4, 0x1b00000: 0x10100, 0x1c00000: 0x4010000, 0x1d00000: 0x104, 0x1e00000: 0x10104, 0x1f00000: 0x4010004, 0x1080000: 0x4000000, 0x1180000: 0x104, 0x1280000: 0x4010100, 0x1380000: 0x0, 0x1480000: 0x10004, 0x1580000: 0x4000100, 0x1680000: 0x100, 0x1780000: 0x4010004, 0x1880000: 0x10000, 0x1980000: 0x4010104, 0x1a80000: 0x10104, 0x1b80000: 0x4000004, 0x1c80000: 0x4000104, 0x1d80000: 0x4010000, 0x1e80000: 0x4, 0x1f80000: 0x10100 }, { 0x0: 0x80401000, 0x10000: 0x80001040, 0x20000: 0x401040, 0x30000: 0x80400000, 0x40000: 0x0, 0x50000: 0x401000, 0x60000: 0x80000040, 0x70000: 0x400040, 0x80000: 0x80000000, 0x90000: 0x400000, 0xa0000: 0x40, 0xb0000: 0x80001000, 0xc0000: 0x80400040, 0xd0000: 0x1040, 0xe0000: 0x1000, 0xf0000: 0x80401040, 0x8000: 0x80001040, 0x18000: 0x40, 0x28000: 0x80400040, 0x38000: 0x80001000, 0x48000: 0x401000, 0x58000: 0x80401040, 0x68000: 0x0, 0x78000: 0x80400000, 0x88000: 0x1000, 0x98000: 0x80401000, 0xa8000: 0x400000, 0xb8000: 0x1040, 0xc8000: 0x80000000, 0xd8000: 0x400040, 0xe8000: 0x401040, 0xf8000: 0x80000040, 0x100000: 0x400040, 0x110000: 0x401000, 0x120000: 0x80000040, 0x130000: 0x0, 0x140000: 0x1040, 0x150000: 0x80400040, 0x160000: 0x80401000, 0x170000: 0x80001040, 0x180000: 0x80401040, 0x190000: 0x80000000, 0x1a0000: 0x80400000, 0x1b0000: 0x401040, 0x1c0000: 0x80001000, 0x1d0000: 0x400000, 0x1e0000: 0x40, 0x1f0000: 0x1000, 0x108000: 0x80400000, 0x118000: 0x80401040, 0x128000: 0x0, 0x138000: 0x401000, 0x148000: 0x400040, 0x158000: 0x80000000, 0x168000: 0x80001040, 0x178000: 0x40, 0x188000: 0x80000040, 0x198000: 0x1000, 0x1a8000: 0x80001000, 0x1b8000: 0x80400040, 0x1c8000: 0x1040, 0x1d8000: 0x80401000, 0x1e8000: 0x400000, 0x1f8000: 0x401040 }, { 0x0: 0x80, 0x1000: 0x1040000, 0x2000: 0x40000, 0x3000: 0x20000000, 0x4000: 0x20040080, 0x5000: 0x1000080, 0x6000: 0x21000080, 0x7000: 0x40080, 0x8000: 0x1000000, 0x9000: 0x20040000, 0xa000: 0x20000080, 0xb000: 0x21040080, 0xc000: 0x21040000, 0xd000: 0x0, 0xe000: 0x1040080, 0xf000: 0x21000000, 0x800: 0x1040080, 0x1800: 0x21000080, 0x2800: 0x80, 0x3800: 0x1040000, 0x4800: 0x40000, 0x5800: 0x20040080, 0x6800: 0x21040000, 0x7800: 0x20000000, 0x8800: 0x20040000, 0x9800: 0x0, 0xa800: 0x21040080, 0xb800: 0x1000080, 0xc800: 0x20000080, 0xd800: 0x21000000, 0xe800: 0x1000000, 0xf800: 0x40080, 0x10000: 0x40000, 0x11000: 0x80, 0x12000: 0x20000000, 0x13000: 0x21000080, 0x14000: 0x1000080, 0x15000: 0x21040000, 0x16000: 0x20040080, 0x17000: 0x1000000, 0x18000: 0x21040080, 0x19000: 0x21000000, 0x1a000: 0x1040000, 0x1b000: 0x20040000, 0x1c000: 0x40080, 0x1d000: 0x20000080, 0x1e000: 0x0, 0x1f000: 0x1040080, 0x10800: 0x21000080, 0x11800: 0x1000000, 0x12800: 0x1040000, 0x13800: 0x20040080, 0x14800: 0x20000000, 0x15800: 0x1040080, 0x16800: 0x80, 0x17800: 0x21040000, 0x18800: 0x40080, 0x19800: 0x21040080, 0x1a800: 0x0, 0x1b800: 0x21000000, 0x1c800: 0x1000080, 0x1d800: 0x40000, 0x1e800: 0x20040000, 0x1f800: 0x20000080 }, { 0x0: 0x10000008, 0x100: 0x2000, 0x200: 0x10200000, 0x300: 0x10202008, 0x400: 0x10002000, 0x500: 0x200000, 0x600: 0x200008, 0x700: 0x10000000, 0x800: 0x0, 0x900: 0x10002008, 0xa00: 0x202000, 0xb00: 0x8, 0xc00: 0x10200008, 0xd00: 0x202008, 0xe00: 0x2008, 0xf00: 0x10202000, 0x80: 0x10200000, 0x180: 0x10202008, 0x280: 0x8, 0x380: 0x200000, 0x480: 0x202008, 0x580: 0x10000008, 0x680: 0x10002000, 0x780: 0x2008, 0x880: 0x200008, 0x980: 0x2000, 0xa80: 0x10002008, 0xb80: 0x10200008, 0xc80: 0x0, 0xd80: 0x10202000, 0xe80: 0x202000, 0xf80: 0x10000000, 0x1000: 0x10002000, 0x1100: 0x10200008, 0x1200: 0x10202008, 0x1300: 0x2008, 0x1400: 0x200000, 0x1500: 0x10000000, 0x1600: 0x10000008, 0x1700: 0x202000, 0x1800: 0x202008, 0x1900: 0x0, 0x1a00: 0x8, 0x1b00: 0x10200000, 0x1c00: 0x2000, 0x1d00: 0x10002008, 0x1e00: 0x10202000, 0x1f00: 0x200008, 0x1080: 0x8, 0x1180: 0x202000, 0x1280: 0x200000, 0x1380: 0x10000008, 0x1480: 0x10002000, 0x1580: 0x2008, 0x1680: 0x10202008, 0x1780: 0x10200000, 0x1880: 0x10202000, 0x1980: 0x10200008, 0x1a80: 0x2000, 0x1b80: 0x202008, 0x1c80: 0x200008, 0x1d80: 0x0, 0x1e80: 0x10000000, 0x1f80: 0x10002008 }, { 0x0: 0x100000, 0x10: 0x2000401, 0x20: 0x400, 0x30: 0x100401, 0x40: 0x2100401, 0x50: 0x0, 0x60: 0x1, 0x70: 0x2100001, 0x80: 0x2000400, 0x90: 0x100001, 0xa0: 0x2000001, 0xb0: 0x2100400, 0xc0: 0x2100000, 0xd0: 0x401, 0xe0: 0x100400, 0xf0: 0x2000000, 0x8: 0x2100001, 0x18: 0x0, 0x28: 0x2000401, 0x38: 0x2100400, 0x48: 0x100000, 0x58: 0x2000001, 0x68: 0x2000000, 0x78: 0x401, 0x88: 0x100401, 0x98: 0x2000400, 0xa8: 0x2100000, 0xb8: 0x100001, 0xc8: 0x400, 0xd8: 0x2100401, 0xe8: 0x1, 0xf8: 0x100400, 0x100: 0x2000000, 0x110: 0x100000, 0x120: 0x2000401, 0x130: 0x2100001, 0x140: 0x100001, 0x150: 0x2000400, 0x160: 0x2100400, 0x170: 0x100401, 0x180: 0x401, 0x190: 0x2100401, 0x1a0: 0x100400, 0x1b0: 0x1, 0x1c0: 0x0, 0x1d0: 0x2100000, 0x1e0: 0x2000001, 0x1f0: 0x400, 0x108: 0x100400, 0x118: 0x2000401, 0x128: 0x2100001, 0x138: 0x1, 0x148: 0x2000000, 0x158: 0x100000, 0x168: 0x401, 0x178: 0x2100400, 0x188: 0x2000001, 0x198: 0x2100000, 0x1a8: 0x0, 0x1b8: 0x2100401, 0x1c8: 0x100401, 0x1d8: 0x400, 0x1e8: 0x2000400, 0x1f8: 0x100001 }, { 0x0: 0x8000820, 0x1: 0x20000, 0x2: 0x8000000, 0x3: 0x20, 0x4: 0x20020, 0x5: 0x8020820, 0x6: 0x8020800, 0x7: 0x800, 0x8: 0x8020000, 0x9: 0x8000800, 0xa: 0x20800, 0xb: 0x8020020, 0xc: 0x820, 0xd: 0x0, 0xe: 0x8000020, 0xf: 0x20820, 0x80000000: 0x800, 0x80000001: 0x8020820, 0x80000002: 0x8000820, 0x80000003: 0x8000000, 0x80000004: 0x8020000, 0x80000005: 0x20800, 0x80000006: 0x20820, 0x80000007: 0x20, 0x80000008: 0x8000020, 0x80000009: 0x820, 0x8000000a: 0x20020, 0x8000000b: 0x8020800, 0x8000000c: 0x0, 0x8000000d: 0x8020020, 0x8000000e: 0x8000800, 0x8000000f: 0x20000, 0x10: 0x20820, 0x11: 0x8020800, 0x12: 0x20, 0x13: 0x800, 0x14: 0x8000800, 0x15: 0x8000020, 0x16: 0x8020020, 0x17: 0x20000, 0x18: 0x0, 0x19: 0x20020, 0x1a: 0x8020000, 0x1b: 0x8000820, 0x1c: 0x8020820, 0x1d: 0x20800, 0x1e: 0x820, 0x1f: 0x8000000, 0x80000010: 0x20000, 0x80000011: 0x800, 0x80000012: 0x8020020, 0x80000013: 0x20820, 0x80000014: 0x20, 0x80000015: 0x8020000, 0x80000016: 0x8000000, 0x80000017: 0x8000820, 0x80000018: 0x8020820, 0x80000019: 0x8000020, 0x8000001a: 0x8000800, 0x8000001b: 0x0, 0x8000001c: 0x20800, 0x8000001d: 0x820, 0x8000001e: 0x20020, 0x8000001f: 0x8020800 } ]; // Masks that select the SBOX input var SBOX_MASK = [ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f ]; /** * DES block cipher algorithm. */ var DES = C_algo.DES = BlockCipher.extend({ _doReset: function () { // Shortcuts var key = this._key; var keyWords = key.words; // Select 56 bits according to PC1 var keyBits = []; for (var i = 0; i < 56; i++) { var keyBitPos = PC1[i] - 1; keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; } // Assemble 16 subkeys var subKeys = this._subKeys = []; for (var nSubKey = 0; nSubKey < 16; nSubKey++) { // Create subkey var subKey = subKeys[nSubKey] = []; // Shortcut var bitShift = BIT_SHIFTS[nSubKey]; // Select 48 bits according to PC2 for (var i = 0; i < 24; i++) { // Select from the left 28 key bits subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); // Select from the right 28 key bits subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); } // Since each subkey is applied to an expanded 32-bit input, // the subkey can be broken into 8 values scaled to 32-bits, // which allows the key to be used without expansion subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); for (var i = 1; i < 7; i++) { subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); } subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); } // Compute inverse subkeys var invSubKeys = this._invSubKeys = []; for (var i = 0; i < 16; i++) { invSubKeys[i] = subKeys[15 - i]; } }, encryptBlock: function (M, offset) { this._doCryptBlock(M, offset, this._subKeys); }, decryptBlock: function (M, offset) { this._doCryptBlock(M, offset, this._invSubKeys); }, _doCryptBlock: function (M, offset, subKeys) { // Get input this._lBlock = M[offset]; this._rBlock = M[offset + 1]; // Initial permutation exchangeLR.call(this, 4, 0x0f0f0f0f); exchangeLR.call(this, 16, 0x0000ffff); exchangeRL.call(this, 2, 0x33333333); exchangeRL.call(this, 8, 0x00ff00ff); exchangeLR.call(this, 1, 0x55555555); // Rounds for (var round = 0; round < 16; round++) { // Shortcuts var subKey = subKeys[round]; var lBlock = this._lBlock; var rBlock = this._rBlock; // Feistel function var f = 0; for (var i = 0; i < 8; i++) { f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; } this._lBlock = rBlock; this._rBlock = lBlock ^ f; } // Undo swap from last round var t = this._lBlock; this._lBlock = this._rBlock; this._rBlock = t; // Final permutation exchangeLR.call(this, 1, 0x55555555); exchangeRL.call(this, 8, 0x00ff00ff); exchangeRL.call(this, 2, 0x33333333); exchangeLR.call(this, 16, 0x0000ffff); exchangeLR.call(this, 4, 0x0f0f0f0f); // Set output M[offset] = this._lBlock; M[offset + 1] = this._rBlock; }, keySize: 64/32, ivSize: 64/32, blockSize: 64/32 }); // Swap bits across the left and right words function exchangeLR(offset, mask) { var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; this._rBlock ^= t; this._lBlock ^= t << offset; } function exchangeRL(offset, mask) { var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; this._lBlock ^= t; this._rBlock ^= t << offset; } /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); */ C.DES = BlockCipher._createHelper(DES); /** * Triple-DES block cipher algorithm. */ var TripleDES = C_algo.TripleDES = BlockCipher.extend({ _doReset: function () { // Shortcuts var key = this._key; var keyWords = key.words; // Create DES instances this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); }, encryptBlock: function (M, offset) { this._des1.encryptBlock(M, offset); this._des2.decryptBlock(M, offset); this._des3.encryptBlock(M, offset); }, decryptBlock: function (M, offset) { this._des3.decryptBlock(M, offset); this._des2.encryptBlock(M, offset); this._des1.decryptBlock(M, offset); }, keySize: 192/32, ivSize: 64/32, blockSize: 64/32 }); /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); */ C.TripleDES = BlockCipher._createHelper(TripleDES); }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var StreamCipher = C_lib.StreamCipher; var C_algo = C.algo; /** * RC4 stream cipher algorithm. */ var RC4 = C_algo.RC4 = StreamCipher.extend({ _doReset: function () { // Shortcuts var key = this._key; var keyWords = key.words; var keySigBytes = key.sigBytes; // Init sbox var S = this._S = []; for (var i = 0; i < 256; i++) { S[i] = i; } // Key setup for (var i = 0, j = 0; i < 256; i++) { var keyByteIndex = i % keySigBytes; var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; j = (j + S[i] + keyByte) % 256; // Swap var t = S[i]; S[i] = S[j]; S[j] = t; } // Counters this._i = this._j = 0; }, _doProcessBlock: function (M, offset) { M[offset] ^= generateKeystreamWord.call(this); }, keySize: 256/32, ivSize: 0 }); function generateKeystreamWord() { // Shortcuts var S = this._S; var i = this._i; var j = this._j; // Generate keystream word var keystreamWord = 0; for (var n = 0; n < 4; n++) { i = (i + 1) % 256; j = (j + S[i]) % 256; // Swap var t = S[i]; S[i] = S[j]; S[j] = t; keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); } // Update counters this._i = i; this._j = j; return keystreamWord; } /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); */ C.RC4 = StreamCipher._createHelper(RC4); /** * Modified RC4 stream cipher algorithm. */ var RC4Drop = C_algo.RC4Drop = RC4.extend({ /** * Configuration options. * * @property {number} drop The number of keystream words to drop. Default 192 */ cfg: RC4.cfg.extend({ drop: 192 }), _doReset: function () { RC4._doReset.call(this); // Drop for (var i = this.cfg.drop; i > 0; i--) { generateKeystreamWord.call(this); } } }); /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); */ C.RC4Drop = StreamCipher._createHelper(RC4Drop); }()); /** @preserve * Counter block mode compatible with Dr Brian Gladman fileenc.c * derived from CryptoJS.mode.CTR * Jan Hruby jhruby.web@gmail.com */ CryptoJS.mode.CTRGladman = (function () { var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); function incWord(word) { if (((word >> 24) & 0xff) === 0xff) { //overflow var b1 = (word >> 16)&0xff; var b2 = (word >> 8)&0xff; var b3 = word & 0xff; if (b1 === 0xff) // overflow b1 { b1 = 0; if (b2 === 0xff) { b2 = 0; if (b3 === 0xff) { b3 = 0; } else { ++b3; } } else { ++b2; } } else { ++b1; } word = 0; word += (b1 << 16); word += (b2 << 8); word += b3; } else { word += (0x01 << 24); } return word; } function incCounter(counter) { if ((counter[0] = incWord(counter[0])) === 0) { // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 counter[1] = incWord(counter[1]); } return counter; } var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ processBlock: function (words, offset) { // Shortcuts var cipher = this._cipher var blockSize = cipher.blockSize; var iv = this._iv; var counter = this._counter; // Generate keystream if (iv) { counter = this._counter = iv.slice(0); // Remove IV for subsequent blocks this._iv = undefined; } incCounter(counter); var keystream = counter.slice(0); cipher.encryptBlock(keystream, 0); // Encrypt for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i]; } } }); CTRGladman.Decryptor = Encryptor; return CTRGladman; }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var StreamCipher = C_lib.StreamCipher; var C_algo = C.algo; // Reusable objects var S = []; var C_ = []; var G = []; /** * Rabbit stream cipher algorithm */ var Rabbit = C_algo.Rabbit = StreamCipher.extend({ _doReset: function () { // Shortcuts var K = this._key.words; var iv = this.cfg.iv; // Swap endian for (var i = 0; i < 4; i++) { K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); } // Generate initial state values var X = this._X = [ K[0], (K[3] << 16) | (K[2] >>> 16), K[1], (K[0] << 16) | (K[3] >>> 16), K[2], (K[1] << 16) | (K[0] >>> 16), K[3], (K[2] << 16) | (K[1] >>> 16) ]; // Generate initial counter values var C = this._C = [ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) ]; // Carry bit this._b = 0; // Iterate the system four times for (var i = 0; i < 4; i++) { nextState.call(this); } // Modify the counters for (var i = 0; i < 8; i++) { C[i] ^= X[(i + 4) & 7]; } // IV setup if (iv) { // Shortcuts var IV = iv.words; var IV_0 = IV[0]; var IV_1 = IV[1]; // Generate four subvectors var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); var i1 = (i0 >>> 16) | (i2 & 0xffff0000); var i3 = (i2 << 16) | (i0 & 0x0000ffff); // Modify counter values C[0] ^= i0; C[1] ^= i1; C[2] ^= i2; C[3] ^= i3; C[4] ^= i0; C[5] ^= i1; C[6] ^= i2; C[7] ^= i3; // Iterate the system four times for (var i = 0; i < 4; i++) { nextState.call(this); } } }, _doProcessBlock: function (M, offset) { // Shortcut var X = this._X; // Iterate the system nextState.call(this); // Generate four keystream words S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); for (var i = 0; i < 4; i++) { // Swap endian S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); // Encrypt M[offset + i] ^= S[i]; } }, blockSize: 128/32, ivSize: 64/32 }); function nextState() { // Shortcuts var X = this._X; var C = this._C; // Save old counter values for (var i = 0; i < 8; i++) { C_[i] = C[i]; } // Calculate new counter values C[0] = (C[0] + 0x4d34d34d + this._b) | 0; C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; // Calculate the g-values for (var i = 0; i < 8; i++) { var gx = X[i] + C[i]; // Construct high and low argument for squaring var ga = gx & 0xffff; var gb = gx >>> 16; // Calculate high and low result of squaring var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); // High XOR low G[i] = gh ^ gl; } // Calculate new state values X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; } /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); */ C.Rabbit = StreamCipher._createHelper(Rabbit); }()); /** * Counter block mode. */ CryptoJS.mode.CTR = (function () { var CTR = CryptoJS.lib.BlockCipherMode.extend(); var Encryptor = CTR.Encryptor = CTR.extend({ processBlock: function (words, offset) { // Shortcuts var cipher = this._cipher var blockSize = cipher.blockSize; var iv = this._iv; var counter = this._counter; // Generate keystream if (iv) { counter = this._counter = iv.slice(0); // Remove IV for subsequent blocks this._iv = undefined; } var keystream = counter.slice(0); cipher.encryptBlock(keystream, 0); // Increment counter counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 // Encrypt for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i]; } } }); CTR.Decryptor = Encryptor; return CTR; }()); (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var StreamCipher = C_lib.StreamCipher; var C_algo = C.algo; // Reusable objects var S = []; var C_ = []; var G = []; /** * Rabbit stream cipher algorithm. * * This is a legacy version that neglected to convert the key to little-endian. * This error doesn't affect the cipher's security, * but it does affect its compatibility with other implementations. */ var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ _doReset: function () { // Shortcuts var K = this._key.words; var iv = this.cfg.iv; // Generate initial state values var X = this._X = [ K[0], (K[3] << 16) | (K[2] >>> 16), K[1], (K[0] << 16) | (K[3] >>> 16), K[2], (K[1] << 16) | (K[0] >>> 16), K[3], (K[2] << 16) | (K[1] >>> 16) ]; // Generate initial counter values var C = this._C = [ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) ]; // Carry bit this._b = 0; // Iterate the system four times for (var i = 0; i < 4; i++) { nextState.call(this); } // Modify the counters for (var i = 0; i < 8; i++) { C[i] ^= X[(i + 4) & 7]; } // IV setup if (iv) { // Shortcuts var IV = iv.words; var IV_0 = IV[0]; var IV_1 = IV[1]; // Generate four subvectors var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); var i1 = (i0 >>> 16) | (i2 & 0xffff0000); var i3 = (i2 << 16) | (i0 & 0x0000ffff); // Modify counter values C[0] ^= i0; C[1] ^= i1; C[2] ^= i2; C[3] ^= i3; C[4] ^= i0; C[5] ^= i1; C[6] ^= i2; C[7] ^= i3; // Iterate the system four times for (var i = 0; i < 4; i++) { nextState.call(this); } } }, _doProcessBlock: function (M, offset) { // Shortcut var X = this._X; // Iterate the system nextState.call(this); // Generate four keystream words S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); for (var i = 0; i < 4; i++) { // Swap endian S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); // Encrypt M[offset + i] ^= S[i]; } }, blockSize: 128/32, ivSize: 64/32 }); function nextState() { // Shortcuts var X = this._X; var C = this._C; // Save old counter values for (var i = 0; i < 8; i++) { C_[i] = C[i]; } // Calculate new counter values C[0] = (C[0] + 0x4d34d34d + this._b) | 0; C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; // Calculate the g-values for (var i = 0; i < 8; i++) { var gx = X[i] + C[i]; // Construct high and low argument for squaring var ga = gx & 0xffff; var gb = gx >>> 16; // Calculate high and low result of squaring var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); // High XOR low G[i] = gh ^ gl; } // Calculate new state values X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; } /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); */ C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); }()); /** * Zero padding strategy. */ CryptoJS.pad.ZeroPadding = { pad: function (data, blockSize) { // Shortcut var blockSizeBytes = blockSize * 4; // Pad data.clamp(); data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); }, unpad: function (data) { // Shortcut var dataWords = data.words; // Unpad var i = data.sigBytes - 1; while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { i--; } data.sigBytes = i + 1; } }; function aes(val) { var k = CryptoJS.enc.Utf8.parse('1234567890abcDEF'); var iv = CryptoJS.enc.Utf8.parse('1234567890abcDEF'); return CryptoJS.AES.encrypt(val, k, {iv: iv, mode:CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding}).toString(); } ================================================ FILE: 其他实战/【GitHub】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-18 Python: 3.7 ================================================ FILE: 其他实战/【GitHub】自动登录/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-11 Python: 3.7 """ 1. get login html token 2. login """ import requests from lxml import etree class Login(object): def __init__(self, username, password): self.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', 'Referer': 'https://github.com/', 'Host': 'github.com' } self.login_url = 'https://github.com/login' self.post_url = 'https://github.com/session' self.session = requests.Session() self.username = username self.password = password def login_GitHub(self): """ 模拟登陆 :return: """ post_data = { 'commit': 'Sign in', 'utf8': '✓', 'authenticity_token': self.get_token(), 'login': self.username, 'password': self.password } response = self.session.post(self.post_url, data=post_data, headers=self.headers) if response.status_code == 200: html = etree.HTML(response.content.decode()) if html.xpath('/html/body/div[1]/header/div[7]/details/summary'): pro_list = html.xpath('//ul[@class="list-style-none"]/li/div/a/span[2]/text()') print("登录成功!正在拉取你的所有项目..") print(pro_list) else: print('账号或密码错误') else: print("登录失败!") def get_token(self): """ 获取token :return: """ response = self.session.get(self.login_url, headers=self.headers) html = etree.HTML(response.content.decode()) token = html.xpath('//input[@name="authenticity_token"]/@value')[0] return token if __name__ == '__main__': user = input('请输入您的账号: ') key = input('请输入您的密码: ') login = Login(user, key) login.login_GitHub() ================================================ FILE: 其他实战/【Glidedsky】自动登陆/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-25 Python: 3.7 import requests import re import json class Gli: """ 自动登陆 Glidedsky http://www.glidedsky.com/login """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.url = 'http://www.glidedsky.com/login' self.session = requests.session() self.headers = { 'Host': 'www.glidedsky.com', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', } def get_token(self): response = self.session.get(self.url, headers=self.headers) _token = re.search(r'name="csrf-token" content="(.*?)">', response.text).group(1) return _token def login(self): data = {'_token': self.get_token(), 'email': self.user, 'password': self.pwd} self.session.post(self.url, data=data) # print(self.session.cookies) cookies = requests.utils.dict_from_cookiejar(self.session.cookies) # cookies 输出 with open('toolkit/cookies.json', 'w', encoding='utf-8') as f: f.write(json.dumps(cookies)) # print(cookies) if __name__ == '__main__': username = input('请输入用户名') password = input('请输入密码') g = Gli(username, password) g.login() ================================================ FILE: 其他实战/【Python加密库】Demo/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-11 Python: 3.7 ================================================ FILE: 其他实战/【Python加密库】Demo/encryption.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-10 Python: 3.7 import base64 import rsa import hashlib import hmac from Crypto.Cipher import AES from pyDes import des, CBC, PAD_PKCS5 from Crypto.Cipher import DES3 class UseAES: """ AES 除了MODE_SIV模式key长度为:32, 48, or 64, 其余key长度为16, 24 or 32 详细见AES内部文档 CBC模式传入iv参数 本例使用常用的ECB模式 """ def __init__(self, key): if len(key) > 32: key = key[:32] self.key = self.to_16(key) @staticmethod def to_16(key): """ 转为16倍数的bytes数据 :param key: :return: """ key = bytes(key, encoding="utf8") while len(key) % 16 != 0: key += b'\0' return key # 返回bytes def aes(self): return AES.new(self.key, AES.MODE_ECB) # 初始化加密器 def encrypt(self, text): aes = self.aes() return str(base64.encodebytes(aes.encrypt(self.to_16(text))), encoding='utf8').replace('\n', '') # 加密 def decode_bytes(self, text): aes = self.aes() return str(aes.decrypt(base64.decodebytes(bytes( text, encoding='utf8'))).rstrip(b'\0').decode("utf8")) # 解密 class UseRSA: """ 生成密钥可保存.pem格式文件 1024位的证书,加密时最大支持117个字节,解密时为128; 2048位的证书,加密时最大支持245个字节,解密时为256。 加密大文件时需要先用AES或者DES加密,再用RSA加密密钥,详细见文档 文档:https://stuvel.eu/files/python-rsa-doc/usage.html#generating-keys """ def __init__(self, number=1024): """ :param number: 公钥、私钥 """ self.pubkey, self.private_key = rsa.newkeys(number) def encrypt(self, _str): """ :param _str: str :return: bytes """ content = _str.encode('utf-8') crypto = rsa.encrypt(content, self.pubkey) return crypto def decrypt(self, text): """ :param text:bytes :return: str """ content = rsa.decrypt(text, self.private_key) con = content.decode('utf-8') return con @staticmethod def save_pem(path_name, text): """ :param path_name: 保存路径 :param text: str :return:bytes """ if "PEM" in path_name.upper(): path_name = path_name[:-4] with open('{}.pem'.format(path_name), 'bw') as f: f.write(text.save_pkcs1()) def read_pem(self, path_name, key_type): """ :param path_name: 密钥文件 :param key_type:类型 :return: """ if 'pubkey' in key_type: self.pubkey = rsa.PublicKey.load_pkcs1(path_name) else: self.private_key = rsa.PublicKey.load_pkcs1(path_name) return True def sign(self, message, pr_key=None, hash_method='SHA-1'): """ 生成明文的哈希签名以便还原后对照 :param message: str :param pr_key: :param hash_method: 哈希的模式 :return: """ if not pr_key: pr_key = self.private_key return rsa.sign(message.encode(), pr_key, hash_method) def check_sign(self, mess, result, pubkey=None): """ 验证签名:传入解密后明文、签名、公钥,验证成功返回哈希方法,失败则报错 :param mess: str :param result: bytes :param pubkey: :return: str """ if None == pubkey: pubkey = self.private_key try: result = rsa.verify(mess, result, pubkey) return result except: return False class UseDES: """ des(key,[mode], [IV], [pad], [pad mode]) key:必须正好8字节 mode(模式):ECB、CBC iv:CBC模式中必须提供长8字节 pad:填充字符 加密填充模式PAD_NORMAL or PAD_PKCS5 """ def __init__(self, key, iv): if not isinstance(key, bytes): key = bytes(key, encoding="utf8") if not isinstance(iv, bytes): iv = bytes(iv, encoding="utf8") self.key = key self.iv = iv def encrypt(self, text): """ DES 加密 :param text: 原始字符串 :return: 加密后字符串,bytes """ if not isinstance(text, bytes): text = bytes(text, "utf-8") secret_key = self.key iv = self.iv k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) en = k.encrypt(text, padmode=PAD_PKCS5) return en def des_crypt(self, text): """ DES 解密 :param text: 加密后的字符串,bytes :return: 解密后的字符串 """ secret_key = self.key iv = self.iv k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) de = k.decrypt(text, padmode=PAD_PKCS5) return de.decode() class UseDES3: """ new(key, mode, *args, **kwargs) key:必须8bytes倍数介于16-24 mode: iv:初始化向量适用于MODE_CBC、MODE_CFB、MODE_OFB、MODE_OPENPGP,4种模式 ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB``长度为8bytes ```MODE_OPENPGP```加密时8bytes解密时10bytes 未提供默认随机生成 nonce:仅在 ``MODE_EAX`` and ``MODE_CTR``模式中使用 ``MODE_EAX``建议16bytes ``MODE_CTR``建议[0, 7]长度 未提供则随机生成 segment_size:分段大小,仅在 ``MODE_CFB``模式中使用,长度为8倍数,未指定则默认为8 mac_len: 适用``MODE_EAX``模式,身份验证标记的长度(字节),它不能超过8(默认值) initial_value:适用```MODE_CTR```,计数器的初始值计数器块。默认为**0**。 """ def __init__(self, key): self.key = key self.mode = DES3.MODE_ECB def encrypt(self, text): """ 传入明文 :param text:bytes类型,长度是KEY的倍数 :return: """ if not isinstance(text, bytes): text = bytes(text, 'utf-8') x = len(text) % 8 text = text + b'\0' * x de = DES3.new(self.key, self.mode) cipher_text = de.encrypt(text) return cipher_text def decrypt(self, text): de = DES3.new(self.key, self.mode) plain_text = de.decrypt(text) st = str(plain_text.decode("utf-8")).rstrip('\0') return st def use_md5(test): if not isinstance(test, bytes): test = bytes(test, 'utf-8') m = hashlib.md5() m.update(test) return m.hexdigest() def use_hmac(key, text): if not isinstance(key, bytes): key = bytes(key, 'utf-8') if not isinstance(text, bytes): text = bytes(text, 'utf-8') h = hmac.new(key, text, digestmod='MD5') return h.hexdigest() def use_sha(text): if not isinstance(text, bytes): text = bytes(text, 'utf-8') sha = hashlib.sha1(text) encrypts = sha.hexdigest() return encrypts if __name__ == '__main__': # AES aes_test = UseAES("TestKey") a = aes_test.encrypt("AES加密") b = aes_test.decode_bytes(a) print(b) # RSA rsa_test = UseRSA() a = rsa_test.encrypt("RSA加密") b = rsa_test.decrypt(a) print(b) # DES des_test = UseDES(b"12345678", b"12345678") a = des_test.encrypt("DES加密") b = des_test.des_crypt(a) print(b) # DES3 des3_test = UseDES3(b"123456789qazxswe") a = des3_test.encrypt("测试加密") b = des3_test.decrypt(a) print(b) # MD5 md5_test = use_md5("MD5") print(md5_test) # HMAC hmac_test = use_hmac("123456", "测试") print(hmac_test) # SHA sha_test = use_sha("SHA") print(sha_test) ================================================ FILE: 其他实战/【TCL金融】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【TCL金融】自动登录/auto_login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-10 Python: 3.7 import requests import execjs.runtime_names class SpiderLogin: """ TCL 个人金融 https://weixin.tjinsuo.com/#login/mine """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.js = None self.url = 'https://weixin.tjinsuo.com/service/user/login' self.load_js() print('引擎', execjs.get().name) def load_js(self): """js 调用 """ with open("encryp.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def auto_login(self): """登陆 """ ret = self.js.call('make', self.pwd) rand_key, word = ret.split('||') print(rand_key, word) headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', 'Host': 'weixin.tjinsuo.com', 'terminalType': 'BEST_WX', 'Accept': 'application/json' } data = 'mobile={user}&password={pwd}&cipherkey=&message=&randKey={rand_key}'.format(user=self.user, pwd=word, rand_key=rand_key) response = requests.post(self.url, headers=headers, data=data) print(response.text) print(response) if __name__ == '__main__': username = input('请输入账号') password = input('密码') wcb = SpiderLogin(username, password) wcb.auto_login() ================================================ FILE: 其他实战/【TCL金融】自动登录/encryp.js ================================================ t = {} "use strict"; var s = ""; var a = 1; t.generateKey = ""; t.password = ""; t.getUUID = function () { var e = "0123456789abcdef".split(""); var t = [], s = Math.random, a; t[8] = t[13] = t[18] = t[23] = "-"; t[14] = "4"; for (var i = 0; i < 36; i++) { if (!t[i]) { a = 0 | s() * 16; t[i] = e[i == 19 ? a & 3 | 8 : a & 15] } } return t.join("") }; t.getRandomStringFromUUID = function (e) { var s = t.getUUID(); while (s.length < e) { s = s + "--" + t.getUUID() } return s.substring(0, e) }; t.getRandomString = function (e) { var t = ""; var s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/-_="; for (var a = 0; a < e; a++) { t += s.charAt(Math.floor(Math.random() * s.length)) } return t }; t.readFromFile = function (e) { var t = ""; var s = new ActiveXObject("Scripting.FileSystemObject"); var i = s.OpenTextFile(e, a, true); while (!i.AtEndOfStream) { var n = i.ReadLine(); if (t == "") { t = n } else { t += "\n" + n } } i.Close(); return t }; t.saveToFile = function (e, t) { var s = new ActiveXObject("Scripting.FileSystemObject"); var a = s.CreateTextFile(e, true, true); var i = t.split("\n"); for (var n = 0; n < i.length; n++) { a.WriteLine(i[n]) } a.Close(); alert(e + " saved!") }; t.do_generate = function () { var e = t.getRandomString(24); t.generateKey = encodeURI(encodeURI(e)); return t.generateKey }; t.stringToHex = function (e) { var t, s, a = []; for (var i = 0; i < e.length; i++) { t = e.charCodeAt(i); s = []; do { s.push(t); t = t >> 8 } while (t); a = a.concat(s.reverse()) } var n = ""; for (var i = 0; i < a.length; i++) { n += a[i].toString(16) } return n }; t.do_load_key = function () { var e = showModalDialog("selectFile.htm", "Select " + document.cpccrypto.algorithm.value + " Key", "width:400px;height:400px;resizeable:yes;"); var s = t.readFromFile(e); document.cpccrypto.cipherkey.value = s }; t.do_save_key = function () { if (s == "") { alert("Currently no " + document.cpccrypto.algorithm.value + " Key to save!\n" + "Please generate first!"); return } var e = showModalDialog("selectFolder.htm", "Select " + document.cpccrypto.algorithm.value + " Key Save Folder", "width:400px;height:400px;resizeable:yes;"); var a = e + document.cpccrypto.algorithm.value + ".key"; t.saveToFile(a, symetricKey) }; t.do_load_plain = function () { var e = showModalDialog("selectFile.htm", "", "width:400px;height:400px;resizeable:yes;"); var s = t.readFromFile(e); document.cpccrypto.plaintext.value = s }; t.suffix_8Blank = function (e) { for (var t = 0; t < 8; t++) { e += " " } return e }; t.checkCipherKey = function () { return true }; t.do_encrypt = function () { if (t.checkCipherKey() == false) { return } return t.stringToHexForDES(t.des(t.generateKey, t.suffix_8Blank(t.password), 1, 0)) }; t.do_load_cipher = function () { var e = showModalDialog("selectFile.htm", "", "width:400px;height:400px;resizeable:yes;"); var s = t.readFromFile(e); document.cpccrypto.ciphertext.value = s }; t.fix_des_result = function (e) { var t; for (t = e.length - 1; t >= 0; t--) { if (e.charCodeAt(t) > 16 && e.charCodeAt(t) != 32) { break } } return e.substring(0, t + 1) }; t.do_decrypt = function () { if (t.checkCipherKey() == false) { return } return t.fix_des_result(t.des(t.generateKey, t.hexToStringForDES(t.encodeKey), 0, 0)) }; t.des = function (e, s, a, i, n, r) { var o = new Array(16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756); var l = new Array(-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, - 2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, - 2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344); var p = new Array(520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584); var d = new Array(8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928); var u = new Array(256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080); var c = new Array(536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312); var h = new Array(2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154); var f = new Array(268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696); var m = t.des_createKeys(e); var v = 0, g, y, b, w, _, x, T, L, C; var S, I, P, k; var A, M; var D = s.length; var R = 0; var N = m.length == 32 ? 3 : 9; if (N == 3) { C = a ? new Array(0, 32, 2) : new Array(30, -2, -2) } else { C = a ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array(94, 62, -2, 32, 64, 2, 30, -2, -2) } if (r == 2) s += " "; else if (r == 1) { b = 8 - D % 8; s += String.fromCharCode(b, b, b, b, b, b, b, b); if (b == 8) D += 8 } else if (!r) s += "\x00\x00\x00\x00\x00\x00\x00\x00"; var E = ""; var z = ""; if (i == 1) { S = n.charCodeAt(v++) << 24 | n.charCodeAt(v++) << 16 | n.charCodeAt(v++) << 8 | n.charCodeAt(v++); P = n.charCodeAt(v++) << 24 | n.charCodeAt(v++) << 16 | n.charCodeAt(v++) << 8 | n.charCodeAt(v++); v = 0 } while (v < D) { T = s.charCodeAt(v++) << 24 | s.charCodeAt(v++) << 16 | s.charCodeAt(v++) << 8 | s.charCodeAt(v++); L = s.charCodeAt(v++) << 24 | s.charCodeAt(v++) << 16 | s.charCodeAt(v++) << 8 | s.charCodeAt(v++); if (i == 1) { if (a) { T ^= S; L ^= P } else { I = S; k = P; S = T; P = L } } b = (T >>> 4 ^ L) & 252645135; L ^= b; T ^= b << 4; b = (T >>> 16 ^ L) & 65535; L ^= b; T ^= b << 16; b = (L >>> 2 ^ T) & 858993459; T ^= b; L ^= b << 2; b = (L >>> 8 ^ T) & 16711935; T ^= b; L ^= b << 8; b = (T >>> 1 ^ L) & 1431655765; L ^= b; T ^= b << 1; T = T << 1 | T >>> 31; L = L << 1 | L >>> 31; for (y = 0; y < N; y += 3) { A = C[y + 1]; M = C[y + 2]; for (g = C[y]; g != A; g += M) { _ = L ^ m[g]; x = (L >>> 4 | L << 28) ^ m[g + 1]; b = T; T = L; L = b ^ (l[_ >>> 24 & 63] | d[_ >>> 16 & 63] | c[_ >>> 8 & 63] | f[_ & 63] | o[x >>> 24 & 63] | p[x >>> 16 & 63] | u[x >>> 8 & 63] | h[x & 63]) } b = T; T = L; L = b } T = T >>> 1 | T << 31; L = L >>> 1 | L << 31; b = (T >>> 1 ^ L) & 1431655765; L ^= b; T ^= b << 1; b = (L >>> 8 ^ T) & 16711935; T ^= b; L ^= b << 8; b = (L >>> 2 ^ T) & 858993459; T ^= b; L ^= b << 2; b = (T >>> 16 ^ L) & 65535; L ^= b; T ^= b << 16; b = (T >>> 4 ^ L) & 252645135; L ^= b; T ^= b << 4; if (i == 1) { if (a) { S = T; P = L } else { T ^= I; L ^= k } } z += String.fromCharCode(T >>> 24, T >>> 16 & 255, T >>> 8 & 255, T & 255, L >>> 24, L >>> 16 & 255, L >>> 8 & 255, L & 255); R += 8; if (R == 512) { E += z; z = ""; R = 0 } } return E + z }; t.des_createKeys = function (e) { var t = new Array(0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516, 536871424, 536871428, 66048, 66052, 536936960, 536936964), s = new Array(0, 1, 1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833, 67109120, 67109121, 68157696, 68157697), a = new Array(0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272), i = new Array(0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072, 2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144), n = new Array(0, 262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112, 266256), r = new Array(0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456, 33554464, 33555488), o = new Array(0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746), l = new Array(0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496, 131072, 196608, 133120, 198656, 537001984, 537067520, 537004032, 537069568), p = new Array(0, 262144, 0, 262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578), d = new Array(0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024, 268436480, 1032, 268436488), u = new Array(0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768, 1056800), c = new Array(0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864, 83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744), h = new Array(0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840, 524304, 528400, 134742032, 134746128), f = new Array(0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261); var m = e.length > 8 ? 3 : 1; var v = new Array(32 * m); var g = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0); var y, b, w = 0, _ = 0, x; for (var T = 0; T < m; T++) { var L = e.charCodeAt(w++) << 24 | e.charCodeAt(w++) << 16 | e.charCodeAt(w++) << 8 | e.charCodeAt(w++); var C = e.charCodeAt(w++) << 24 | e.charCodeAt(w++) << 16 | e.charCodeAt(w++) << 8 | e.charCodeAt(w++); x = (L >>> 4 ^ C) & 252645135; C ^= x; L ^= x << 4; x = (C >>> -16 ^ L) & 65535; L ^= x; C ^= x << -16; x = (L >>> 2 ^ C) & 858993459; C ^= x; L ^= x << 2; x = (C >>> -16 ^ L) & 65535; L ^= x; C ^= x << -16; x = (L >>> 1 ^ C) & 1431655765; C ^= x; L ^= x << 1; x = (C >>> 8 ^ L) & 16711935; L ^= x; C ^= x << 8; x = (L >>> 1 ^ C) & 1431655765; C ^= x; L ^= x << 1; x = L << 8 | C >>> 20 & 240; L = C << 24 | C << 8 & 16711680 | C >>> 8 & 65280 | C >>> 24 & 240; C = x; for (var S = 0; S < g.length; S++) { if (g[S]) { L = L << 2 | L >>> 26; C = C << 2 | C >>> 26 } else { L = L << 1 | L >>> 27; C = C << 1 | C >>> 27 } L &= -15; C &= -15; y = t[L >>> 28] | s[L >>> 24 & 15] | a[L >>> 20 & 15] | i[L >>> 16 & 15] | n[L >>> 12 & 15] | r[L >>> 8 & 15] | o[L >>> 4 & 15]; b = l[C >>> 28] | p[C >>> 24 & 15] | d[C >>> 20 & 15] | u[C >>> 16 & 15] | c[C >>> 12 & 15] | h[C >>> 8 & 15] | f[C >>> 4 & 15]; x = (b >>> 16 ^ y) & 65535; v[_++] = y ^ x; v[_++] = b ^ x << 16 } } return v }; t.stringToHexForDES = function (e) { var t = "0x"; var s = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"); for (var a = 0; a < e.length; a++) { t += s[e.charCodeAt(a) >> 4] + s[e.charCodeAt(a) & 15] } return t }; t.hexToStringForDES = function (e) { var t = ""; for (var s = e.substr(0, 2) == "0x" ? 2 : 0; s < e.length; s += 2) { t += String.fromCharCode(parseInt(e.substr(s, 2), 16)) } return t }; t.encodeDES = function (e) { if (t.generateKey != "") { t.password = e; t.encodeKey = t.do_encrypt() } return t.encodeKey }; t.decodeDES = function () { if (t.generateKey != "" && t.password != "") var e = t.do_decrypt(); return e } function make(pwd) { randKey = t.do_generate(); password = t.encodeDES(pwd); return randKey + '||' + password } ================================================ FILE: 其他实战/【steam】自动登录/execute.js ================================================ var navigator = {}; // Copyright (c) 2005 Tom Wu // All Rights Reserved. // See "LICENSE" for details. /* * Copyright (c) 2003-2005 Tom Wu * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * In addition, the following condition applies: * * All redistributions must retain an intact copy of this copyright notice * and disclaimer. */ // Basic JavaScript BN library - subset useful for RSA encryption. // Bits per digit var dbits; // JavaScript engine analysis var canary = 0xdeadbeefcafe; var j_lm = ((canary & 0xffffff) == 0xefcafe); // (public) Constructor function BigInteger(a, b, c) { if (a != null) if ("number" == typeof a) this.fromNumber(a, b, c); else if (b == null && "string" != typeof a) this.fromString(a, 256); else this.fromString(a, b); } // return new, unset BigInteger function nbi() { return new BigInteger(null); } // am: Compute w_j += (x*this_i), propagate carries, // c is initial carry, returns final carry. // c < 3*dvalue, x < 2*dvalue, this_i < dvalue // We need to select the fastest one that works in this environment. // am1: use a single mult and divide to get the high bits, // max digit bits should be 26 because // max internal value = 2*dvalue^2-2*dvalue (< 2^53) function am1(i, x, w, j, c, n) { while (--n >= 0) { var v = x * this[i++] + w[j] + c; c = Math.floor(v / 0x4000000); w[j++] = v & 0x3ffffff; } return c; } // am2 avoids a big mult-and-extract completely. // Max digit bits should be <= 30 because we do bitwise ops // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) function am2(i, x, w, j, c, n) { var xl = x & 0x7fff, xh = x >> 15; while (--n >= 0) { var l = this[i] & 0x7fff; var h = this[i++] >> 15; var m = xh * l + h * xl; l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); w[j++] = l & 0x3fffffff; } return c; } // Alternately, set max digit bits to 28 since some // browsers slow down when dealing with 32-bit numbers. function am3(i, x, w, j, c, n) { var xl = x & 0x3fff, xh = x >> 14; while (--n >= 0) { var l = this[i] & 0x3fff; var h = this[i++] >> 14; var m = xh * l + h * xl; l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; c = (l >> 28) + (m >> 14) + xh * h; w[j++] = l & 0xfffffff; } return c; } if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) { BigInteger.prototype.am = am2; dbits = 30; } else if (j_lm && (navigator.appName != "Netscape")) { BigInteger.prototype.am = am1; dbits = 26; } else { // Mozilla/Netscape seems to prefer am3 BigInteger.prototype.am = am3; dbits = 28; } BigInteger.prototype.DB = dbits; BigInteger.prototype.DM = ((1 << dbits) - 1); BigInteger.prototype.DV = (1 << dbits); var BI_FP = 52; BigInteger.prototype.FV = Math.pow(2, BI_FP); BigInteger.prototype.F1 = BI_FP - dbits; BigInteger.prototype.F2 = 2 * dbits - BI_FP; // Digit conversions var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; var BI_RC = new Array(); var rr, vv; rr = "0".charCodeAt(0); for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; rr = "a".charCodeAt(0); for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; rr = "A".charCodeAt(0); for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; function int2char(n) { return BI_RM.charAt(n); } function intAt(s, i) { var c = BI_RC[s.charCodeAt(i)]; return (c == null) ? -1 : c; } // (protected) copy this to r function bnpCopyTo(r) { for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; r.t = this.t; r.s = this.s; } // (protected) set from integer value x, -DV <= x < DV function bnpFromInt(x) { this.t = 1; this.s = (x < 0) ? -1 : 0; if (x > 0) this[0] = x; else if (x < -1) this[0] = x + DV; else this.t = 0; } // return bigint initialized to value function nbv(i) { var r = nbi(); r.fromInt(i); return r; } // (protected) set from string and radix function bnpFromString(s, b) { var k; if (b == 16) k = 4; else if (b == 8) k = 3; else if (b == 256) k = 8; // byte array else if (b == 2) k = 1; else if (b == 32) k = 5; else if (b == 4) k = 2; else { this.fromRadix(s, b); return; } this.t = 0; this.s = 0; var i = s.length, mi = false, sh = 0; while (--i >= 0) { var x = (k == 8) ? s[i] & 0xff : intAt(s, i); if (x < 0) { if (s.charAt(i) == "-") mi = true; continue; } mi = false; if (sh == 0) this[this.t++] = x; else if (sh + k > this.DB) { this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; this[this.t++] = (x >> (this.DB - sh)); } else this[this.t - 1] |= x << sh; sh += k; if (sh >= this.DB) sh -= this.DB; } if (k == 8 && (s[0] & 0x80) != 0) { this.s = -1; if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; } this.clamp(); if (mi) BigInteger.ZERO.subTo(this, this); } // (protected) clamp off excess high words function bnpClamp() { var c = this.s & this.DM; while (this.t > 0 && this[this.t - 1] == c) --this.t; } // (public) return string representation in given radix function bnToString(b) { if (this.s < 0) return "-" + this.negate().toString(b); var k; if (b == 16) k = 4; else if (b == 8) k = 3; else if (b == 2) k = 1; else if (b == 32) k = 5; else if (b == 4) k = 2; else return this.toRadix(b); var km = (1 << k) - 1, d, m = false, r = "", i = this.t; var p = this.DB - (i * this.DB) % k; if (i-- > 0) { if (p < this.DB && (d = this[i] >> p) > 0) { m = true; r = int2char(d); } while (i >= 0) { if (p < k) { d = (this[i] & ((1 << p) - 1)) << (k - p); d |= this[--i] >> (p += this.DB - k); } else { d = (this[i] >> (p -= k)) & km; if (p <= 0) { p += this.DB; --i; } } if (d > 0) m = true; if (m) r += int2char(d); } } return m ? r : "0"; } // (public) -this function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this, r); return r; } // (public) |this| function bnAbs() { return (this.s < 0) ? this.negate() : this; } // (public) return + if this > a, - if this < a, 0 if equal function bnCompareTo(a) { var r = this.s - a.s; if (r != 0) return r; var i = this.t; r = i - a.t; if (r != 0) return r; while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; return 0; } // returns bit length of the integer x function nbits(x) { var r = 1, t; if ((t = x >>> 16) != 0) { x = t; r += 16; } if ((t = x >> 8) != 0) { x = t; r += 8; } if ((t = x >> 4) != 0) { x = t; r += 4; } if ((t = x >> 2) != 0) { x = t; r += 2; } if ((t = x >> 1) != 0) { x = t; r += 1; } return r; } // (public) return the number of bits in "this" function bnBitLength() { if (this.t <= 0) return 0; return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)); } // (protected) r = this << n*DB function bnpDLShiftTo(n, r) { var i; for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; for (i = n - 1; i >= 0; --i) r[i] = 0; r.t = this.t + n; r.s = this.s; } // (protected) r = this >> n*DB function bnpDRShiftTo(n, r) { for (var i = n; i < this.t; ++i) r[i - n] = this[i]; r.t = Math.max(this.t - n, 0); r.s = this.s; } // (protected) r = this << n function bnpLShiftTo(n, r) { var bs = n % this.DB; var cbs = this.DB - bs; var bm = (1 << cbs) - 1; var ds = Math.floor(n / this.DB), c = (this.s << bs) & this.DM, i; for (i = this.t - 1; i >= 0; --i) { r[i + ds + 1] = (this[i] >> cbs) | c; c = (this[i] & bm) << bs; } for (i = ds - 1; i >= 0; --i) r[i] = 0; r[ds] = c; r.t = this.t + ds + 1; r.s = this.s; r.clamp(); } // (protected) r = this >> n function bnpRShiftTo(n, r) { r.s = this.s; var ds = Math.floor(n / this.DB); if (ds >= this.t) { r.t = 0; return; } var bs = n % this.DB; var cbs = this.DB - bs; var bm = (1 << bs) - 1; r[0] = this[ds] >> bs; for (var i = ds + 1; i < this.t; ++i) { r[i - ds - 1] |= (this[i] & bm) << cbs; r[i - ds] = this[i] >> bs; } if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; r.t = this.t - ds; r.clamp(); } // (protected) r = this - a function bnpSubTo(a, r) { var i = 0, c = 0, m = Math.min(a.t, this.t); while (i < m) { c += this[i] - a[i]; r[i++] = c & this.DM; c >>= this.DB; } if (a.t < this.t) { c -= a.s; while (i < this.t) { c += this[i]; r[i++] = c & this.DM; c >>= this.DB; } c += this.s; } else { c += this.s; while (i < a.t) { c -= a[i]; r[i++] = c & this.DM; c >>= this.DB; } c -= a.s; } r.s = (c < 0) ? -1 : 0; if (c < -1) r[i++] = this.DV + c; else if (c > 0) r[i++] = c; r.t = i; r.clamp(); } // (protected) r = this * a, r != this,a (HAC 14.12) // "this" should be the larger one if appropriate. function bnpMultiplyTo(a, r) { var x = this.abs(), y = a.abs(); var i = x.t; r.t = i + y.t; while (--i >= 0) r[i] = 0; for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); r.s = 0; r.clamp(); if (this.s != a.s) BigInteger.ZERO.subTo(r, r); } // (protected) r = this^2, r != this (HAC 14.16) function bnpSquareTo(r) { var x = this.abs(); var i = r.t = 2 * x.t; while (--i >= 0) r[i] = 0; for (i = 0; i < x.t - 1; ++i) { var c = x.am(i, x[i], r, 2 * i, 0, 1); if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { r[i + x.t] -= x.DV; r[i + x.t + 1] = 1; } } if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); r.s = 0; r.clamp(); } // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) // r != q, this != m. q or r may be null. function bnpDivRemTo(m, q, r) { var pm = m.abs(); if (pm.t <= 0) return; var pt = this.abs(); if (pt.t < pm.t) { if (q != null) q.fromInt(0); if (r != null) this.copyTo(r); return; } if (r == null) r = nbi(); var y = nbi(), ts = this.s, ms = m.s; var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus if (nsh > 0) { pm.lShiftTo(nsh, y); pt.lShiftTo(nsh, r); } else { pm.copyTo(y); pt.copyTo(r); } var ys = y.t; var y0 = y[ys - 1]; if (y0 == 0) return; var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0); var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2; var i = r.t, j = i - ys, t = (q == null) ? nbi() : q; y.dlShiftTo(j, t); if (r.compareTo(t) >= 0) { r[r.t++] = 1; r.subTo(t, r); } BigInteger.ONE.dlShiftTo(ys, t); t.subTo(y, y); // "negative" y so we can replace sub with am later while (y.t < ys) y[y.t++] = 0; while (--j >= 0) { // Estimate quotient digit var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out y.dlShiftTo(j, t); r.subTo(t, r); while (r[i] < --qd) r.subTo(t, r); } } if (q != null) { r.drShiftTo(ys, q); if (ts != ms) BigInteger.ZERO.subTo(q, q); } r.t = ys; r.clamp(); if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder if (ts < 0) BigInteger.ZERO.subTo(r, r); } // (public) this mod a function bnMod(a) { var r = nbi(); this.abs().divRemTo(a, null, r); if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); return r; } // Modular reduction using "classic" algorithm function Classic(m) { this.m = m; } function cConvert(x) { if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); else return x; } function cRevert(x) { return x; } function cReduce(x) { x.divRemTo(this.m, null, x); } function cMulTo(x, y, r) { x.multiplyTo(y, r); this.reduce(r); } function cSqrTo(x, r) { x.squareTo(r); this.reduce(r); } Classic.prototype.convert = cConvert; Classic.prototype.revert = cRevert; Classic.prototype.reduce = cReduce; Classic.prototype.mulTo = cMulTo; Classic.prototype.sqrTo = cSqrTo; // (protected) return "-1/this % 2^DB"; useful for Mont. reduction // justification: // xy == 1 (mod m) // xy = 1+km // xy(2-xy) = (1+km)(1-km) // x[y(2-xy)] = 1-k^2m^2 // x[y(2-xy)] == 1 (mod m^2) // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. // JS multiply "overflows" differently from C/C++, so care is needed here. function bnpInvDigit() { if (this.t < 1) return 0; var x = this[0]; if ((x & 1) == 0) return 0; var y = x & 3; // y == 1/x mod 2^2 y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 // last step - calculate inverse mod DV directly; // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits // we really want the negative inverse, and -DV < y < DV return (y > 0) ? this.DV - y : -y; } // Montgomery reduction function Montgomery(m) { this.m = m; this.mp = m.invDigit(); this.mpl = this.mp & 0x7fff; this.mph = this.mp >> 15; this.um = (1 << (m.DB - 15)) - 1; this.mt2 = 2 * m.t; } // xR mod m function montConvert(x) { var r = nbi(); x.abs().dlShiftTo(this.m.t, r); r.divRemTo(this.m, null, r); if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); return r; } // x/R mod m function montRevert(x) { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } // x = x/R mod m (HAC 14.32) function montReduce(x) { while (x.t <= this.mt2) // pad x so am has enough room later x[x.t++] = 0; for (var i = 0; i < this.m.t; ++i) { // faster way of calculating u0 = x[i]*mp mod DV var j = x[i] & 0x7fff; var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM; // use am to combine the multiply-shift-add into one call j = i + this.m.t; x[j] += this.m.am(0, u0, x, i, 0, this.m.t); // propagate carry while (x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; } } x.clamp(); x.drShiftTo(this.m.t, x); if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); } // r = "x^2/R mod m"; x != r function montSqrTo(x, r) { x.squareTo(r); this.reduce(r); } // r = "xy/R mod m"; x,y != r function montMulTo(x, y, r) { x.multiplyTo(y, r); this.reduce(r); } Montgomery.prototype.convert = montConvert; Montgomery.prototype.revert = montRevert; Montgomery.prototype.reduce = montReduce; Montgomery.prototype.mulTo = montMulTo; Montgomery.prototype.sqrTo = montSqrTo; // (protected) true iff this is even function bnpIsEven() { return ((this.t > 0) ? (this[0] & 1) : this.s) == 0; } // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) function bnpExp(e, z) { if (e > 0xffffffff || e < 1) return BigInteger.ONE; var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e) - 1; g.copyTo(r); while (--i >= 0) { z.sqrTo(r, r2); if ((e & (1 << i)) > 0) z.mulTo(r2, g, r); else { var t = r; r = r2; r2 = t; } } return z.revert(r); } // (public) this^e % m, 0 <= e < 2^32 function bnModPowInt(e, m) { var z; if (e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m); return this.exp(e, z); } // protected BigInteger.prototype.copyTo = bnpCopyTo; BigInteger.prototype.fromInt = bnpFromInt; BigInteger.prototype.fromString = bnpFromString; BigInteger.prototype.clamp = bnpClamp; BigInteger.prototype.dlShiftTo = bnpDLShiftTo; BigInteger.prototype.drShiftTo = bnpDRShiftTo; BigInteger.prototype.lShiftTo = bnpLShiftTo; BigInteger.prototype.rShiftTo = bnpRShiftTo; BigInteger.prototype.subTo = bnpSubTo; BigInteger.prototype.multiplyTo = bnpMultiplyTo; BigInteger.prototype.squareTo = bnpSquareTo; BigInteger.prototype.divRemTo = bnpDivRemTo; BigInteger.prototype.invDigit = bnpInvDigit; BigInteger.prototype.isEven = bnpIsEven; BigInteger.prototype.exp = bnpExp; // public BigInteger.prototype.toString = bnToString; BigInteger.prototype.negate = bnNegate; BigInteger.prototype.abs = bnAbs; BigInteger.prototype.compareTo = bnCompareTo; BigInteger.prototype.bitLength = bnBitLength; BigInteger.prototype.mod = bnMod; BigInteger.prototype.modPowInt = bnModPowInt; // "constants" BigInteger.ZERO = nbv(0); BigInteger.ONE = nbv(1); // Copyright (c) 2005 Tom Wu // All Rights Reserved. // See "LICENSE" for details. // Extended JavaScript BN functions, required for RSA private ops. // (public) function bnClone() { var r = nbi(); this.copyTo(r); return r; } // (public) return value as integer function bnIntValue() { if (this.s < 0) { if (this.t == 1) return this[0] - this.DV; else if (this.t == 0) return -1; } else if (this.t == 1) return this[0]; else if (this.t == 0) return 0; // assumes 16 < DB < 32 return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; } // (public) return value as byte function bnByteValue() { return (this.t == 0) ? this.s : (this[0] << 24) >> 24; } // (public) return value as short (assumes DB>=16) function bnShortValue() { return (this.t == 0) ? this.s : (this[0] << 16) >> 16; } // (protected) return x s.t. r^x < DV function bnpChunkSize(r) { return Math.floor(Math.LN2 * this.DB / Math.log(r)); } // (public) 0 if this == 0, 1 if this > 0 function bnSigNum() { if (this.s < 0) return -1; else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; else return 1; } // (protected) convert to radix string function bnpToRadix(b) { if (b == null) b = 10; if (this.signum() == 0 || b < 2 || b > 36) return "0"; var cs = this.chunkSize(b); var a = Math.pow(b, cs); var d = nbv(a), y = nbi(), z = nbi(), r = ""; this.divRemTo(d, y, z); while (y.signum() > 0) { r = (a + z.intValue()).toString(b).substr(1) + r; y.divRemTo(d, y, z); } return z.intValue().toString(b) + r; } // (protected) convert from radix string function bnpFromRadix(s, b) { this.fromInt(0); if (b == null) b = 10; var cs = this.chunkSize(b); var d = Math.pow(b, cs), mi = false, j = 0, w = 0; for (var i = 0; i < s.length; ++i) { var x = intAt(s, i); if (x < 0) { if (s.charAt(i) == "-" && this.signum() == 0) mi = true; continue; } w = b * w + x; if (++j >= cs) { this.dMultiply(d); this.dAddOffset(w, 0); j = 0; w = 0; } } if (j > 0) { this.dMultiply(Math.pow(b, j)); this.dAddOffset(w, 0); } if (mi) BigInteger.ZERO.subTo(this, this); } // (protected) alternate constructor function bnpFromNumber(a, b, c) { if ("number" == typeof b) { // new BigInteger(int,int,RNG) if (a < 2) this.fromInt(1); else { this.fromNumber(a, c); if (!this.testBit(a - 1)) // force MSB set this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); if (this.isEven()) this.dAddOffset(1, 0); // force odd while (!this.isProbablePrime(b)) { this.dAddOffset(2, 0); if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); } } } else { // new BigInteger(int,RNG) var x = new Array(), t = a & 7; x.length = (a >> 3) + 1; b.nextBytes(x); if (t > 0) x[0] &= ((1 << t) - 1); else x[0] = 0; this.fromString(x, 256); } } // (public) convert to bigendian byte array function bnToByteArray() { var i = this.t, r = new Array(); r[0] = this.s; var p = this.DB - (i * this.DB) % 8, d, k = 0; if (i-- > 0) { if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) r[k++] = d | (this.s << (this.DB - p)); while (i >= 0) { if (p < 8) { d = (this[i] & ((1 << p) - 1)) << (8 - p); d |= this[--i] >> (p += this.DB - 8); } else { d = (this[i] >> (p -= 8)) & 0xff; if (p <= 0) { p += this.DB; --i; } } if ((d & 0x80) != 0) d |= -256; if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k; if (k > 0 || d != this.s) r[k++] = d; } } return r; } function bnEquals(a) { return (this.compareTo(a) == 0); } function bnMin(a) { return (this.compareTo(a) < 0) ? this : a; } function bnMax(a) { return (this.compareTo(a) > 0) ? this : a; } // (protected) r = this op a (bitwise) function bnpBitwiseTo(a, op, r) { var i, f, m = Math.min(a.t, this.t); for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); if (a.t < this.t) { f = a.s & this.DM; for (i = m; i < this.t; ++i) r[i] = op(this[i], f); r.t = this.t; } else { f = this.s & this.DM; for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); r.t = a.t; } r.s = op(this.s, a.s); r.clamp(); } // (public) this & a function op_and(x, y) { return x & y; } function bnAnd(a) { var r = nbi(); this.bitwiseTo(a, op_and, r); return r; } // (public) this | a function op_or(x, y) { return x | y; } function bnOr(a) { var r = nbi(); this.bitwiseTo(a, op_or, r); return r; } // (public) this ^ a function op_xor(x, y) { return x ^ y; } function bnXor(a) { var r = nbi(); this.bitwiseTo(a, op_xor, r); return r; } // (public) this & ~a function op_andnot(x, y) { return x & ~y; } function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a, op_andnot, r); return r; } // (public) ~this function bnNot() { var r = nbi(); for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; r.t = this.t; r.s = ~this.s; return r; } // (public) this << n function bnShiftLeft(n) { var r = nbi(); if (n < 0) this.rShiftTo(-n, r); else this.lShiftTo(n, r); return r; } // (public) this >> n function bnShiftRight(n) { var r = nbi(); if (n < 0) this.lShiftTo(-n, r); else this.rShiftTo(n, r); return r; } // return index of lowest 1-bit in x, x < 2^31 function lbit(x) { if (x == 0) return -1; var r = 0; if ((x & 0xffff) == 0) { x >>= 16; r += 16; } if ((x & 0xff) == 0) { x >>= 8; r += 8; } if ((x & 0xf) == 0) { x >>= 4; r += 4; } if ((x & 3) == 0) { x >>= 2; r += 2; } if ((x & 1) == 0) ++r; return r; } // (public) returns index of lowest 1-bit (or -1 if none) function bnGetLowestSetBit() { for (var i = 0; i < this.t; ++i) if (this[i] != 0) return i * this.DB + lbit(this[i]); if (this.s < 0) return this.t * this.DB; return -1; } // return number of 1 bits in x function cbit(x) { var r = 0; while (x != 0) { x &= x - 1; ++r; } return r; } // (public) return number of set bits function bnBitCount() { var r = 0, x = this.s & this.DM; for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); return r; } // (public) true iff nth bit is set function bnTestBit(n) { var j = Math.floor(n / this.DB); if (j >= this.t) return (this.s != 0); return ((this[j] & (1 << (n % this.DB))) != 0); } // (protected) this op (1<>= this.DB; } if (a.t < this.t) { c += a.s; while (i < this.t) { c += this[i]; r[i++] = c & this.DM; c >>= this.DB; } c += this.s; } else { c += this.s; while (i < a.t) { c += a[i]; r[i++] = c & this.DM; c >>= this.DB; } c += a.s; } r.s = (c < 0) ? -1 : 0; if (c > 0) r[i++] = c; else if (c < -1) r[i++] = this.DV + c; r.t = i; r.clamp(); } // (public) this + a function bnAdd(a) { var r = nbi(); this.addTo(a, r); return r; } // (public) this - a function bnSubtract(a) { var r = nbi(); this.subTo(a, r); return r; } // (public) this * a function bnMultiply(a) { var r = nbi(); this.multiplyTo(a, r); return r; } // (public) this / a function bnDivide(a) { var r = nbi(); this.divRemTo(a, r, null); return r; } // (public) this % a function bnRemainder(a) { var r = nbi(); this.divRemTo(a, null, r); return r; } // (public) [this/a,this%a] function bnDivideAndRemainder(a) { var q = nbi(), r = nbi(); this.divRemTo(a, q, r); return new Array(q, r); } // (protected) this *= n, this >= 0, 1 < n < DV function bnpDMultiply(n) { this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); ++this.t; this.clamp(); } // (protected) this += n << w words, this >= 0 function bnpDAddOffset(n, w) { while (this.t <= w) this[this.t++] = 0; this[w] += n; while (this[w] >= this.DV) { this[w] -= this.DV; if (++w >= this.t) this[this.t++] = 0; ++this[w]; } } // A "null" reducer function NullExp() {} function nNop(x) { return x; } function nMulTo(x, y, r) { x.multiplyTo(y, r); } function nSqrTo(x, r) { x.squareTo(r); } NullExp.prototype.convert = nNop; NullExp.prototype.revert = nNop; NullExp.prototype.mulTo = nMulTo; NullExp.prototype.sqrTo = nSqrTo; // (public) this^e function bnPow(e) { return this.exp(e, new NullExp()); } // (protected) r = lower n words of "this * a", a.t <= n // "this" should be the larger one if appropriate. function bnpMultiplyLowerTo(a, n, r) { var i = Math.min(this.t + a.t, n); r.s = 0; // assumes a,this >= 0 r.t = i; while (i > 0) r[--i] = 0; var j; for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); r.clamp(); } // (protected) r = "this * a" without lower n words, n > 0 // "this" should be the larger one if appropriate. function bnpMultiplyUpperTo(a, n, r) { --n; var i = r.t = this.t + a.t - n; r.s = 0; // assumes a,this >= 0 while (--i >= 0) r[i] = 0; for (i = Math.max(n - this.t, 0); i < a.t; ++i) r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); r.clamp(); r.drShiftTo(1, r); } // Barrett modular reduction function Barrett(m) { // setup Barrett this.r2 = nbi(); this.q3 = nbi(); BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); this.mu = this.r2.divide(m); this.m = m; } function barrettConvert(x) { if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); else if (x.compareTo(this.m) < 0) return x; else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } } function barrettRevert(x) { return x; } // x = x mod m (HAC 14.42) function barrettReduce(x) { x.drShiftTo(this.m.t - 1, this.r2); if (x.t > this.m.t + 1) { x.t = this.m.t + 1; x.clamp(); } this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); x.subTo(this.r2, x); while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); } // r = x^2 mod m; x != r function barrettSqrTo(x, r) { x.squareTo(r); this.reduce(r); } // r = x*y mod m; x,y != r function barrettMulTo(x, y, r) { x.multiplyTo(y, r); this.reduce(r); } Barrett.prototype.convert = barrettConvert; Barrett.prototype.revert = barrettRevert; Barrett.prototype.reduce = barrettReduce; Barrett.prototype.mulTo = barrettMulTo; Barrett.prototype.sqrTo = barrettSqrTo; // (public) this^e % m (HAC 14.85) function bnModPow(e, m) { var i = e.bitLength(), k, r = nbv(1), z; if (i <= 0) return r; else if (i < 18) k = 1; else if (i < 48) k = 3; else if (i < 144) k = 4; else if (i < 768) k = 5; else k = 6; if (i < 8) z = new Classic(m); else if (m.isEven()) z = new Barrett(m); else z = new Montgomery(m); // precomputation var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1; g[1] = z.convert(this); if (k > 1) { var g2 = nbi(); z.sqrTo(g[1], g2); while (n <= km) { g[n] = nbi(); z.mulTo(g2, g[n - 2], g[n]); n += 2; } } var j = e.t - 1, w, is1 = true, r2 = nbi(), t; i = nbits(e[j]) - 1; while (j >= 0) { if (i >= k1) w = (e[j] >> (i - k1)) & km; else { w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); if (j > 0) w |= e[j - 1] >> (this.DB + i - k1); } n = k; while ((w & 1) == 0) { w >>= 1; --n; } if ((i -= n) < 0) { i += this.DB; --j; } if (is1) { // ret == 1, don't bother squaring or multiplying it g[w].copyTo(r); is1 = false; } else { while (n > 1) { z.sqrTo(r, r2); z.sqrTo(r2, r); n -= 2; } if (n > 0) z.sqrTo(r, r2); else { t = r; r = r2; r2 = t; } z.mulTo(r2, g[w], r); } while (j >= 0 && (e[j] & (1 << i)) == 0) { z.sqrTo(r, r2); t = r; r = r2; r2 = t; if (--i < 0) { i = this.DB - 1; --j; } } } return z.revert(r); } // (public) gcd(this,a) (HAC 14.54) function bnGCD(a) { var x = (this.s < 0) ? this.negate() : this.clone(); var y = (a.s < 0) ? a.negate() : a.clone(); if (x.compareTo(y) < 0) { var t = x; x = y; y = t; } var i = x.getLowestSetBit(), g = y.getLowestSetBit(); if (g < 0) return x; if (i < g) g = i; if (g > 0) { x.rShiftTo(g, x); y.rShiftTo(g, y); } while (x.signum() > 0) { if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); if (x.compareTo(y) >= 0) { x.subTo(y, x); x.rShiftTo(1, x); } else { y.subTo(x, y); y.rShiftTo(1, y); } } if (g > 0) y.lShiftTo(g, y); return y; } // (protected) this % n, n < 2^26 function bnpModInt(n) { if (n <= 0) return 0; var d = this.DV % n, r = (this.s < 0) ? n - 1 : 0; if (this.t > 0) if (d == 0) r = this[0] % n; else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; return r; } // (public) 1/this % m (HAC 14.61) function bnModInverse(m) { var ac = m.isEven(); if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; var u = m.clone(), v = this.clone(); var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); while (u.signum() != 0) { while (u.isEven()) { u.rShiftTo(1, u); if (ac) { if (!a.isEven() || !b.isEven()) { a.addTo(this, a); b.subTo(m, b); } a.rShiftTo(1, a); } else if (!b.isEven()) b.subTo(m, b); b.rShiftTo(1, b); } while (v.isEven()) { v.rShiftTo(1, v); if (ac) { if (!c.isEven() || !d.isEven()) { c.addTo(this, c); d.subTo(m, d); } c.rShiftTo(1, c); } else if (!d.isEven()) d.subTo(m, d); d.rShiftTo(1, d); } if (u.compareTo(v) >= 0) { u.subTo(v, u); if (ac) a.subTo(c, a); b.subTo(d, b); } else { v.subTo(u, v); if (ac) c.subTo(a, c); d.subTo(b, d); } } if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; if (d.compareTo(m) >= 0) return d.subtract(m); if (d.signum() < 0) d.addTo(m, d); else return d; if (d.signum() < 0) return d.add(m); else return d; } var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509 ]; var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; // (public) test primality with certainty >= 1-.5^t function bnIsProbablePrime(t) { var i, x = this.abs(); if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { for (i = 0; i < lowprimes.length; ++i) if (x[0] == lowprimes[i]) return true; return false; } if (x.isEven()) return false; i = 1; while (i < lowprimes.length) { var m = lowprimes[i], j = i + 1; while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; m = x.modInt(m); while (i < j) if (m % lowprimes[i++] == 0) return false; } return x.millerRabin(t); } // (protected) true if probably prime (HAC 4.24, Miller-Rabin) function bnpMillerRabin(t) { var n1 = this.subtract(BigInteger.ONE); var k = n1.getLowestSetBit(); if (k <= 0) return false; var r = n1.shiftRight(k); t = (t + 1) >> 1; if (t > lowprimes.length) t = lowprimes.length; var a = nbi(); for (var i = 0; i < t; ++i) { a.fromInt(lowprimes[i]); var y = a.modPow(r, this); if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { var j = 1; while (j++ < k && y.compareTo(n1) != 0) { y = y.modPowInt(2, this); if (y.compareTo(BigInteger.ONE) == 0) return false; } if (y.compareTo(n1) != 0) return false; } } return true; } // protected BigInteger.prototype.chunkSize = bnpChunkSize; BigInteger.prototype.toRadix = bnpToRadix; BigInteger.prototype.fromRadix = bnpFromRadix; BigInteger.prototype.fromNumber = bnpFromNumber; BigInteger.prototype.bitwiseTo = bnpBitwiseTo; BigInteger.prototype.changeBit = bnpChangeBit; BigInteger.prototype.addTo = bnpAddTo; BigInteger.prototype.dMultiply = bnpDMultiply; BigInteger.prototype.dAddOffset = bnpDAddOffset; BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; BigInteger.prototype.modInt = bnpModInt; BigInteger.prototype.millerRabin = bnpMillerRabin; // public BigInteger.prototype.clone = bnClone; BigInteger.prototype.intValue = bnIntValue; BigInteger.prototype.byteValue = bnByteValue; BigInteger.prototype.shortValue = bnShortValue; BigInteger.prototype.signum = bnSigNum; BigInteger.prototype.toByteArray = bnToByteArray; BigInteger.prototype.equals = bnEquals; BigInteger.prototype.min = bnMin; BigInteger.prototype.max = bnMax; BigInteger.prototype.and = bnAnd; BigInteger.prototype.or = bnOr; BigInteger.prototype.xor = bnXor; BigInteger.prototype.andNot = bnAndNot; BigInteger.prototype.not = bnNot; BigInteger.prototype.shiftLeft = bnShiftLeft; BigInteger.prototype.shiftRight = bnShiftRight; BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; BigInteger.prototype.bitCount = bnBitCount; BigInteger.prototype.testBit = bnTestBit; BigInteger.prototype.setBit = bnSetBit; BigInteger.prototype.clearBit = bnClearBit; BigInteger.prototype.flipBit = bnFlipBit; BigInteger.prototype.add = bnAdd; BigInteger.prototype.subtract = bnSubtract; BigInteger.prototype.multiply = bnMultiply; BigInteger.prototype.divide = bnDivide; BigInteger.prototype.remainder = bnRemainder; BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; BigInteger.prototype.modPow = bnModPow; BigInteger.prototype.modInverse = bnModInverse; BigInteger.prototype.pow = bnPow; BigInteger.prototype.gcd = bnGCD; BigInteger.prototype.isProbablePrime = bnIsProbablePrime; // BigInteger interfaces not implemented in jsbn: // BigInteger(int signum, byte[] magnitude) // double doubleValue() // float floatValue() // int hashCode() // long longValue() // static BigInteger valueOf(long val) var RSAPublicKey = function($modulus_hex, $encryptionExponent_hex) { this.modulus = new BigInteger($modulus_hex, 16); this.encryptionExponent = new BigInteger($encryptionExponent_hex, 16); }; var Base64 = { base64: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode: function($input) { if (!$input) { return false; } var $output = ""; var $chr1, $chr2, $chr3; var $enc1, $enc2, $enc3, $enc4; var $i = 0; do { $chr1 = $input.charCodeAt($i++); $chr2 = $input.charCodeAt($i++); $chr3 = $input.charCodeAt($i++); $enc1 = $chr1 >> 2; $enc2 = (($chr1 & 3) << 4) | ($chr2 >> 4); $enc3 = (($chr2 & 15) << 2) | ($chr3 >> 6); $enc4 = $chr3 & 63; if (isNaN($chr2)) $enc3 = $enc4 = 64; else if (isNaN($chr3)) $enc4 = 64; $output += this.base64.charAt($enc1) + this.base64.charAt($enc2) + this.base64.charAt($enc3) + this.base64.charAt( $enc4); } while ($i < $input.length); return $output; }, decode: function($input) { if (!$input) return false; $input = $input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); var $output = ""; var $enc1, $enc2, $enc3, $enc4; var $i = 0; do { $enc1 = this.base64.indexOf($input.charAt($i++)); $enc2 = this.base64.indexOf($input.charAt($i++)); $enc3 = this.base64.indexOf($input.charAt($i++)); $enc4 = this.base64.indexOf($input.charAt($i++)); $output += String.fromCharCode(($enc1 << 2) | ($enc2 >> 4)); if ($enc3 != 64) $output += String.fromCharCode((($enc2 & 15) << 4) | ($enc3 >> 2)); if ($enc4 != 64) $output += String.fromCharCode((($enc3 & 3) << 6) | $enc4); } while ($i < $input.length); return $output; } }; var Hex = { hex: "0123456789abcdef", encode: function($input) { if (!$input) return false; var $output = ""; var $k; var $i = 0; do { $k = $input.charCodeAt($i++); $output += this.hex.charAt(($k >> 4) & 0xf) + this.hex.charAt($k & 0xf); } while ($i < $input.length); return $output; }, decode: function($input) { if (!$input) return false; $input = $input.replace(/[^0-9abcdef]/g, ""); var $output = ""; var $i = 0; do { $output += String.fromCharCode(((this.hex.indexOf($input.charAt($i++)) << 4) & 0xf0) | (this.hex.indexOf($input .charAt($i++)) & 0xf)); } while ($i < $input.length); return $output; } }; var RSA = { getPublicKey: function($modulus_hex, $exponent_hex) { return new RSAPublicKey($modulus_hex, $exponent_hex); }, encrypt: function($data, $pubkey) { if (!$pubkey) return false; $data = this.pkcs1pad2($data, ($pubkey.modulus.bitLength() + 7) >> 3); if (!$data) return false; $data = $data.modPowInt($pubkey.encryptionExponent, $pubkey.modulus); if (!$data) return false; $data = $data.toString(16); if (($data.length & 1) == 1) $data = "0" + $data; return Base64.encode(Hex.decode($data)); }, pkcs1pad2: function($data, $keysize) { if ($keysize < $data.length + 11) return null; var $buffer = []; var $i = $data.length - 1; while ($i >= 0 && $keysize > 0) $buffer[--$keysize] = $data.charCodeAt($i--); $buffer[--$keysize] = 0; while ($keysize > 2) $buffer[--$keysize] = Math.floor(Math.random() * 254) + 1; $buffer[--$keysize] = 2; $buffer[--$keysize] = 0; return new BigInteger($buffer); } }; function get_pwd(pwd,publickey_mod,publickey_exp) { var pubKey = RSA.getPublicKey(publickey_mod, publickey_exp); return RSA.encrypt(pwd, pubKey); } ================================================ FILE: 其他实战/【steam】自动登录/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-12-11 Python: 3.7 import execjs import requests, json, re def Get_parameters(username): """steam 登录 只处理了密码加密。其他请自行拓展 :return 公钥和一个参数; """ import time try: url = "https://store.steampowered.com/login/getrsakey/" headers = { 'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', 'Host': 'store.steampowered.com', 'Referer': 'https://store.steampowered.com/login/?redir=&redir_ssl=1', 'Origin': 'https://store.steampowered.com' } data = { 'donotcache': int(round(time.time() * 1000)), 'username': username, } res = requests.post(url=url, headers=headers, data=data) publickey_mod = json.loads(res.text).get('publickey_mod') publickey_exp = json.loads(res.text).get('publickey_exp') return publickey_mod, publickey_exp except Exception as err: print('访问失败', err) def main(pwd, publickey_mod, publickey_exp): """ :param pwd: :param publickey_mod: :param publickey_exp: :return sign: """ with open('execute.js', 'r', encoding='utf-8') as f: js = execjs.compile(f.read()) print('引擎', execjs.get().name) sign = js.call('get_pwd', pwd, publickey_mod, publickey_exp) return sign if __name__ == '__main__': username = input('请输入账户:') pwd = input('请输入密码:') publickey_mod, publickey_exp = Get_parameters(username) sign = main(pwd, publickey_mod, publickey_exp) print(sign) ================================================ FILE: 其他实战/【万创帮】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【万创帮】自动登录/encryp.js ================================================ function c(x, c) { x[c >> 5] |= 128 << c % 32, x[(c + 64 >>> 9 << 4) + 14] = c; for (var a = 1732584193, _ = -271733879, y = -1732584194, d = 271733878, i = 0; i < x.length; i += 16) { var b = a, B = _, D = y, E = d; a = h(a, _, y, d, x[i + 0], 7, -680876936), d = h(d, a, _, y, x[i + 1], 12, -389564586), y = h(y, d, a, _, x[i + 2], 17, 606105819), _ = h(_, y, d, a, x[i + 3], 22, -1044525330), a = h(a, _, y, d, x[i + 4], 7, -176418897), d = h(d, a, _, y, x[i + 5], 12, 1200080426), y = h(y, d, a, _, x[i + 6], 17, -1473231341), _ = h(_, y, d, a, x[i + 7], 22, -45705983), a = h(a, _, y, d, x[i + 8], 7, 1770035416), d = h(d, a, _, y, x[i + 9], 12, -1958414417), y = h(y, d, a, _, x[i + 10], 17, -42063), _ = h(_, y, d, a, x[i + 11], 22, -1990404162), a = h(a, _, y, d, x[i + 12], 7, 1804603682), d = h(d, a, _, y, x[i + 13], 12, -40341101), y = h(y, d, a, _, x[i + 14], 17, -1502002290), _ = h(_, y, d, a, x[i + 15], 22, 1236535329), a = g(a, _, y, d, x[i + 1], 5, -165796510), d = g(d, a, _, y, x[i + 6], 9, -1069501632), y = g(y, d, a, _, x[i + 11], 14, 643717713), _ = g(_, y, d, a, x[i + 0], 20, -373897302), a = g(a, _, y, d, x[i + 5], 5, -701558691), d = g(d, a, _, y, x[i + 10], 9, 38016083), y = g(y, d, a, _, x[i + 15], 14, -660478335), _ = g(_, y, d, a, x[i + 4], 20, -405537848), a = g(a, _, y, d, x[i + 9], 5, 568446438), d = g(d, a, _, y, x[i + 14], 9, -1019803690), y = g(y, d, a, _, x[i + 3], 14, -187363961), _ = g(_, y, d, a, x[i + 8], 20, 1163531501), a = g(a, _, y, d, x[i + 13], 5, -1444681467), d = g(d, a, _, y, x[i + 2], 9, -51403784), y = g(y, d, a, _, x[i + 7], 14, 1735328473), _ = g(_, y, d, a, x[i + 12], 20, -1926607734), a = v(a, _, y, d, x[i + 5], 4, -378558), d = v(d, a, _, y, x[i + 8], 11, -2022574463), y = v(y, d, a, _, x[i + 11], 16, 1839030562), _ = v(_, y, d, a, x[i + 14], 23, -35309556), a = v(a, _, y, d, x[i + 1], 4, -1530992060), d = v(d, a, _, y, x[i + 4], 11, 1272893353), y = v(y, d, a, _, x[i + 7], 16, -155497632), _ = v(_, y, d, a, x[i + 10], 23, -1094730640), a = v(a, _, y, d, x[i + 13], 4, 681279174), d = v(d, a, _, y, x[i + 0], 11, -358537222), y = v(y, d, a, _, x[i + 3], 16, -722521979), _ = v(_, y, d, a, x[i + 6], 23, 76029189), a = v(a, _, y, d, x[i + 9], 4, -640364487), d = v(d, a, _, y, x[i + 12], 11, -421815835), y = v(y, d, a, _, x[i + 15], 16, 530742520), _ = v(_, y, d, a, x[i + 2], 23, -995338651), a = A(a, _, y, d, x[i + 0], 6, -198630844), d = A(d, a, _, y, x[i + 7], 10, 1126891415), y = A(y, d, a, _, x[i + 14], 15, -1416354905), _ = A(_, y, d, a, x[i + 5], 21, -57434055), a = A(a, _, y, d, x[i + 12], 6, 1700485571), d = A(d, a, _, y, x[i + 3], 10, -1894986606), y = A(y, d, a, _, x[i + 10], 15, -1051523), _ = A(_, y, d, a, x[i + 1], 21, -2054922799), a = A(a, _, y, d, x[i + 8], 6, 1873313359), d = A(d, a, _, y, x[i + 15], 10, -30611744), y = A(y, d, a, _, x[i + 6], 15, -1560198380), _ = A(_, y, d, a, x[i + 13], 21, 1309151649), a = A(a, _, y, d, x[i + 4], 6, -145523070), d = A(d, a, _, y, x[i + 11], 10, -1120210379), y = A(y, d, a, _, x[i + 2], 15, 718787259), _ = A(_, y, d, a, x[i + 9], 21, -343485551), a = C(a, b), _ = C(_, B), y = C(y, D), d = C(d, E) } return Array(a, _, y, d) } function a(q, c, a, x, s, t) { return C(y(C(C(c, q), C(x, t)), s), a) } function h(c, h, g, d, x, s, t) { return a(h & g | ~h & d, c, h, x, s, t) } function g(c, h, g, d, x, s, t) { return a(h & d | g & ~d, c, h, x, s, t) } function v(c, h, g, d, x, s, t) { return a(h ^ g ^ d, c, h, x, s, t) } function A(c, h, g, d, x, s, t) { return a(g ^ (h | ~d), c, h, x, s, t) } function _(a, h) { var g = b(a); g.length > 16 && (g = c(g, a.length * U)); for (var v = Array(16), A = Array(16), i = 0; 16 > i; i++) v[i] = 909522486 ^ g[i], A[i] = 1549556828 ^ g[i]; var _ = c(v.concat(b(h)), 512 + h.length * U); return c(A.concat(_), 640) } function C(x, c) { var a = (65535 & x) + (65535 & c), h = (x >> 16) + (c >> 16) + (a >> 16); return h << 16 | 65535 & a } function y(c, a) { return c << a | c >>> 32 - a } function b(c) { for (var a = Array(), h = (1 << U) - 1, i = 0; i < c.length * U; i += U) a[i >> 5] |= (c.charCodeAt(i / U) & h) << i % 32; return a } function B(c) { for (var a = "", h = (1 << U) - 1, i = 0; i < 32 * c.length; i += U) a += String.fromCharCode(c[i >> 5] >>> i % 32 & h); return a } function D(c) { for (var a = F ? "0123456789ABCDEF" : "0123456789abcdef", h = "", i = 0; i < 4 * c.length; i++) h += a.charAt(c[i >> 2] >> i % 4 * 8 + 4 & 15) + a.charAt(c[i >> 2] >> i % 4 * 8 & 15); return h } function E(c) { for (var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", h = "", i = 0; i < 4 * c.length; i += 3) for (var g = (c[i >> 2] >> 8 * (i % 4) & 255) << 16 | (c[i + 1 >> 2] >> 8 * ((i + 1) % 4) & 255) << 8 | c[i + 2 >> 2] >> 8 * ((i + 2) % 4) & 255, v = 0; 4 > v; v++) h += 8 * i + 6 * v > 32 * c.length ? S : a.charAt(g >> 6 * (3 - v) & 63); return h } var F = 0, S = "", U = 8, j = { hex_md5: function (s) { return D(c(b(s), s.length * U)).toUpperCase() }, b64_md5: function (s) { return E(c(b(s), s.length * U)) }, str_md5: function (s) { return B(c(b(s), s.length * U)) }, hex_hmac_md5: function (c, a) { return D(_(c, a)) }, b64_hmac_md5: function (c, a) { return E(_(c, a)) }, str_hmac_md5: function (c, a) { return B(_(c, a)) } }; function make_sigin() { now = (new Date).getTime(); return [j.hex_md5("" + now).toUpperCase(), now] } function make_pwd(pwd) { return j.hex_md5(pwd) } ================================================ FILE: 其他实战/【万创帮】自动登录/spider_login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-03 Python: 3.7 import json import requests import execjs.runtime_names class SpiderLogin: """ 万创帮爬虫登陆 """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.url = 'https://m.wcbchina.com/login/other-login.html' print('引擎', execjs.get().name) def use_js(self): """js 调用 """ with open("encryp.js", "r", encoding="utf-8") as f: js = execjs.compile(f.read()) try: sign, t = js.call("make_sigin") pwd = js.call("make_pwd", self.pwd) return sign, t, pwd except Exception: print('异常数据') def auto_login(self): """登陆 """ sign, t, pwd = self.use_js() headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', 'Referer': 'https://m.wcbchina.com/login/other-login.html' } pay_load = { 'auth': {'sign': sign, 'timestamp': t}, 'password': self.user, 'username': pwd } response = requests.post(self.url, headers=headers, data=json.dumps(pay_load)) print(response.cookies) print(response) if __name__ == '__main__': username = input('请输入账号') password = input('密码') wcb = SpiderLogin(username, password) wcb.auto_login() ================================================ FILE: 其他实战/【中关村】自动登录/README.md ================================================ # 解密过程博客说明 https://www.zhangkunzhi.com/?p=135 ================================================ FILE: 其他实战/【中关村】自动登录/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-29 Python: 3.7 import requests import hashlib import time import json from urllib import parse class ZGC: """ 解析过程说明 https://www.zhangkunzhi.com/?p=135 1. 用的 CryptoJS md5 加密 2. 需要带入 cookies """ def __init__(self, username, password): self.username = username self.password = password self.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', } def get_cookies(self): """取cookies """ _now = time.time() t = str(_now)[:7] _jsonp = int(round(_now * 1000)) pick = 'http://js.zol.com.cn/pvn/pv.ht?&t={t}&c=&callback=_jsonp{_jsonp}'.format(t=t, _jsonp=_jsonp) try: content = requests.get(pick, headers=self.headers).text ipck = json.loads(content[content.find('(')+1:-1]).get('ipck') return parse.quote(ipck) except: print('cookies 获取失败') def login(self, ipck): """登陆 """ _str_now = str(int(time.time())) login_url = 'http://service.zol.com.cn/user/ajax/login2014/login.php' data = { 'userid': self.username, 'pwd': self.make_md5(self.password), 'is_auto': '1', 'backUrl': 'http://www.zol.com.cn/' } cookies = { 'Hm_lpvt_ae5edc2bc4fc71370807f6187f0a2dd0': _str_now, 'Hm_lvt_ae5edc2bc4fc71370807f6187f0a2dd0': _str_now, 'ip_ck': ipck, 'vn': '1', 'lv': _str_now, 'z_pro_city': 's_provice%3Dzhongqing%26s_city%3Dzhongqing', 'z_day': 'ixgo20%3D1' } response = requests.post(login_url, headers=self.headers, data=data, cookies=cookies) msg = json.loads(response.content) return msg @staticmethod def make_md5(_str): """md5 生成 """ # 待加密信息 text = _str + 'zol' # 创建md5对象 m = hashlib.md5() m.update(text.encode(encoding='utf-8')) str_md5 = m.hexdigest() return str_md5 def main(self): ipck = self.get_cookies() msg = self.login(ipck) print(msg) if __name__ == '__main__': user = input('请输入中关村账号') pwd = input('请输入中关村密码') zgc = ZGC(user, pwd) zgc.main() ================================================ FILE: 其他实战/【京东】商品数据爬取/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-12-10 Python: 3.7 ================================================ FILE: 其他实战/【京东】商品数据爬取/selenium抓取.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-11 Python: 3.7 from selenium import webdriver from selenium.webdriver.common.keys import Keys # 键盘按键操作 import time def get_goods(driver): try: goods = driver.find_elements_by_class_name('gl-item') for good in goods: detail_url = good.find_element_by_tag_name('a').get_attribute('href') p_name = good.find_element_by_css_selector('.p-name em').text.replace('\n', '') price = good.find_element_by_css_selector('.p-price i').text p_commit = good.find_element_by_css_selector('.p-commit a').text msg = ''' 商品 : %s 链接 : %s 价钱 :%s 评论 :%s ''' % (p_name, detail_url, price, p_commit) print(msg, end='\n\n') button = driver.find_element_by_partial_link_text('下一页') button.click() time.sleep(1) get_goods(driver) except Exception: pass def spider(url, keyword): driver = webdriver.Firefox() driver.get(url) driver.implicitly_wait(3) # 使用隐式等待 try: input_tag = driver.find_element_by_id('key') input_tag.send_keys(keyword) input_tag.send_keys(Keys.ENTER) get_goods(driver) finally: driver.close() if __name__ == '__main__': spider('https://www.jd.com/', keyword='手机') ================================================ FILE: 其他实战/【人人网】自动登录/enc.js ================================================ function t(e, i, t) { this.e = m(e), this.d = m(i), this.m = m(t), this.chunkSize = 2 * N(this.m), this.radix = 16, this.barrett = new o(this.m) } function n(e, i) { for (var t = new Array, n = i.length, o = 0; n > o;) t[o] = i.charCodeAt(o), o++; for (; t.length % e.chunkSize != 0;) t[o++] = 0; var s, r, a, l = t.length, c = ""; for (o = 0; l > o; o += e.chunkSize) { for (a = new d, s = 0, r = o; r < o + e.chunkSize; ++s) a.digits[s] = t[r++], a.digits[s] += t[r++] << 8; var u = e.barrett.powMod(a, e.e), g = 16 == e.radix ? h(u) : f(u, e.radix); c += g + " " } return c.substring(0, c.length - 1) } function o(e) { this.modulus = c(e), this.k = N(this.modulus) + 1; var i = new d; i.digits[2 * this.k] = 1, this.mu = _(i, this.modulus), this.bkplus1 = new d, this.bkplus1.digits[this.k + 1] = 1, this.modulo = s, this.multiplyMod = r, this.powMod = a } function s(e) { var i = X(e, this.k - 1), t = C(i, this.mu), n = X(t, this.k + 1), o = L(e, this.k + 1), s = C(n, this.modulus), r = L(s, this.k + 1), a = b(o, r); a.isNeg && (a = w(a, this.bkplus1)); for (var l = D(a, this.modulus) >= 0; l;) a = b(a, this.modulus), l = D(a, this.modulus) >= 0; return a } function r(e, i) { var t = C(e, i); return this.modulo(t) } function a(e, i) { var t = new d; t.digits[0] = 1; for (var n = e, o = i; ;) { if (0 != (1 & o.digits[0]) && (t = this.multiplyMod(t, n)), o = M(o, 1), 0 == o.digits[0] && 0 == N(o)) break; n = this.multiplyMod(n, n) } return t } function l(e) { B = e, z = new Array(B); for (var i = 0; i < z.length; i++) z[i] = 0; O = new d, I = new d, I.digits[0] = 1 } function d(e) { "boolean" == typeof e && 1 == e ? this.digits = null : this.digits = z.slice(0), this.isNeg = !1 } function c(e) { var i = new d(!0); return i.digits = e.digits.slice(0), i.isNeg = e.isNeg, i } function u(e) { var i = new d; i.isNeg = 0 > e, e = Math.abs(e); for (var t = 0; e > 0;) i.digits[t++] = e & H, e >>= P; return i } function g(e) { for (var i = "", t = e.length - 1; t > -1; --t) i += e.charAt(t); return i } function f(e, i) { var t = new d; t.digits[0] = i; for (var n = A(e, t), o = Q[n[1].digits[0]]; 1 == D(n[0], O);) n = A(n[0], t), digit = n[1].digits[0], o += Q[n[1].digits[0]]; return (e.isNeg ? "-" : "") + g(o) } function p(e) { var t = 15, n = ""; for (i = 0; i < 4; ++i) n += Z[e & t], e >>>= 4; return g(n) } function h(e) { for (var i = "", t = (N(e), N(e)); t > -1; --t) i += p(e.digits[t]); return i } function v(e) { var i, t = 48, n = t + 9, o = 97, s = o + 25, r = 65, a = 90; return i = e >= t && n >= e ? e - t : e >= r && a >= e ? 10 + e - r : e >= o && s >= e ? 10 + e - o : 0 } function y(e) { for (var i = 0, t = Math.min(e.length, 4), n = 0; t > n; ++n) i <<= 4, i |= v(e.charCodeAt(n)); return i } function m(e) { for (var i = new d, t = e.length, n = t, o = 0; n > 0; n -= 4, ++o) i.digits[o] = y(e.substr(Math.max(n - 4, 0), Math.min(n, 4))); return i } function w(e, i) { var t; if (e.isNeg != i.isNeg) i.isNeg = !i.isNeg, t = b(e, i), i.isNeg = !i.isNeg; else { t = new d; for (var n, o = 0, s = 0; s < e.digits.length; ++s) n = e.digits[s] + i.digits[s] + o, t.digits[s] = 65535 & n, o = Number(n >= R); t.isNeg = e.isNeg } return t } function b(e, i) { var t; if (e.isNeg != i.isNeg) i.isNeg = !i.isNeg, t = w(e, i), i.isNeg = !i.isNeg; else { t = new d; var n, o; o = 0; for (var s = 0; s < e.digits.length; ++s) n = e.digits[s] - i.digits[s] + o, t.digits[s] = 65535 & n, t.digits[s] < 0 && (t.digits[s] += R), o = 0 - Number(0 > n); if (-1 == o) { o = 0; for (var s = 0; s < e.digits.length; ++s) n = 0 - t.digits[s] + o, t.digits[s] = 65535 & n, t.digits[s] < 0 && (t.digits[s] += R), o = 0 - Number(0 > n); t.isNeg = !e.isNeg } else t.isNeg = e.isNeg } return t } function N(e) { for (var i = e.digits.length - 1; i > 0 && 0 == e.digits[i];) --i; return i } function k(e) { var i, t = N(e), n = e.digits[t], o = (t + 1) * q; for (i = o; i > o - q && 0 == (32768 & n); --i) n <<= 1; return i } function C(e, i) { for (var t, n, o, s = new d, r = N(e), a = N(i), l = 0; a >= l; ++l) { for (t = 0, o = l, j = 0; j <= r; ++j, ++o) n = s.digits[o] + e.digits[j] * i.digits[l] + t, s.digits[o] = n & H, t = n >>> P; s.digits[l + r + 1] = t } return s.isNeg = e.isNeg != i.isNeg, s } function x(e, i) { var t, n, o; result = new d, t = N(e), n = 0; for (var s = 0; t >= s; ++s) o = result.digits[s] + e.digits[s] * i + n, result.digits[s] = o & H, n = o >>> P; return result.digits[1 + t] = n, result } function $(e, i, t, n, o) { for (var s = Math.min(i + o, e.length), r = i, a = n; s > r; ++r, ++a) t[a] = e[r] } function F(e, i) { var t = Math.floor(i / q), n = new d; $(e.digits, 0, n.digits, t, n.digits.length - t); for (var o = i % q, s = q - o, r = n.digits.length - 1, a = r - 1; r > 0; --r, --a) n.digits[r] = n.digits[r] << o & H | (n.digits[a] & J[o]) >>> s; return n.digits[0] = n.digits[r] << o & H, n.isNeg = e.isNeg, n } function M(e, i) { var t = Math.floor(i / q), n = new d; $(e.digits, t, n.digits, 0, e.digits.length - t); for (var o = i % q, s = q - o, r = 0, a = r + 1; r < n.digits.length - 1; ++r, ++a) n.digits[r] = n.digits[r] >>> o | (n.digits[a] & W[o]) << s; return n.digits[n.digits.length - 1] >>>= o, n.isNeg = e.isNeg, n } function E(e, i) { var t = new d; return $(e.digits, 0, t.digits, i, t.digits.length - i), t } function X(e, i) { var t = new d; return $(e.digits, i, t.digits, 0, t.digits.length - i), t } function L(e, i) { var t = new d; return $(e.digits, 0, t.digits, 0, i), t } function D(e, i) { if (e.isNeg != i.isNeg) return 1 - 2 * Number(e.isNeg); for (var t = e.digits.length - 1; t >= 0; --t) if (e.digits[t] != i.digits[t]) return e.isNeg ? 1 - 2 * Number(e.digits[t] > i.digits[t]) : 1 - 2 * Number(e.digits[t] < i.digits[t]); return 0 } function A(e, i) { var t, n, o = k(e), s = k(i), r = i.isNeg; if (s > o) return e.isNeg ? (t = c(I), t.isNeg = !i.isNeg, e.isNeg = !1, i.isNeg = !1, n = b(i, e), e.isNeg = !0, i.isNeg = r) : (t = new d, n = c(e)), new Array(t, n); t = new d, n = e; for (var a = Math.ceil(s / q) - 1, l = 0; i.digits[a] < U;) i = F(i, 1), ++l, ++s, a = Math.ceil(s / q) - 1; n = F(n, l), o += l; for (var u = Math.ceil(o / q) - 1, g = E(i, u - a); -1 != D(n, g);) ++t.digits[u - a], n = b(n, g); for (var f = u; f > a; --f) { var p = f >= n.digits.length ? 0 : n.digits[f], h = f - 1 >= n.digits.length ? 0 : n.digits[f - 1], v = f - 2 >= n.digits.length ? 0 : n.digits[f - 2], y = a >= i.digits.length ? 0 : i.digits[a], m = a - 1 >= i.digits.length ? 0 : i.digits[a - 1]; p == y ? t.digits[f - a - 1] = H : t.digits[f - a - 1] = Math.floor((p * R + h) / y); for (var C = t.digits[f - a - 1] * (y * R + m), $ = p * K + (h * R + v); C > $;) --t.digits[f - a - 1], C = t.digits[f - a - 1] * (y * R | m), $ = p * R * R + (h * R + v); g = E(i, f - a - 1), n = b(n, x(g, t.digits[f - a - 1])), n.isNeg && (n = w(n, g), --t.digits[f - a - 1]) } return n = M(n, l), t.isNeg = e.isNeg != r, e.isNeg && (t = r ? w(t, I) : b(t, I), i = M(i, l), n = b(i, n)), 0 == n.digits[0] && 0 == N(n) && (n.isNeg = !1), new Array(t, n) } function _(e, i) { return A(e, i)[0] } getKeys = function (jsonData) { var n = this; var n = JSON.parse(jsonData); 1 == n.isEncrypt && (l(2 * n.maxdigits), T = new t(n.e, "null", n.n), true && undefined) }; var B, z, O, I, P = 16, q = P, R = 65536, U = R >>> 1, K = R * R, H = R - 1; l(20); var Q = (u(1e15), new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z")), Z = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"), J = new Array(0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535), W = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535) function getTime() { let time = new Date; return "&uniqueTimestamp=" + time.getFullYear() + time.getMonth() + time.getDay() + time.getHours() + time.getSeconds() + time.getUTCMilliseconds() } function enc(jsonkey, pwd) { getKeys(jsonkey); return n(T, pwd); } ================================================ FILE: 其他实战/【人人网】自动登录/login.py ================================================ import requests import json import re import execjs.runtime_names class People: def __init__(self, user, pwd): """ 初始化 :param user: 用户名 :param pwd: 密码 """ self.username = user self.pwd = pwd self.ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' self.headers = { 'User-Agent': self.ua, 'Host': 'www.renren.com', } self.session = requests.session() self.json_data = '' print('【JS引擎】', execjs.get().name) with open("enc.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def to_index(self): """ 第一步 - 访问首页 获取 Cookies :return: """ response = self.session.get('http://www.renren.com/', headers=self.headers) print('【主页】', response) def get_key(self): """ 第二步 - 获取加密参数 获取 rkey 以及 密码加密所需参数 :return: """ headers = { 'Referer': 'http://login.renren.com/ajaxproxy.htm', 'User-Agent': self.ua, } response = self.session.get('http://login.renren.com/ajax/getEncryptKey', headers=headers) print('【获取key】', response.text) return response.text def login(self, key_info): """ 第三步 - 登录账号 :param key_info: 第二步获取的参数 :return: """ url = 'http://www.renren.com/ajaxLogin/login?1=1' + self.js.call('getTime') data = { 'email': self.username, 'icode': "", 'origURL': 'http://www.renren.com/home', 'domain': 'renren.com', 'key_id': '1', 'captcha_type': 'web_login', 'password': self.get_password(key_info), 'rkey': json.loads(key_info).get('rkey'), 'f': '' } print('【登录data】', data) print('【登录URL】', url) print('【Cookies】', self.session.cookies) response = self.session.post(url, data=data, headers=self.headers) print('【返回信息】', response.text) response = self.session.get('http://www.renren.com/home', headers=self.headers) print('【登录信息】', re.findall("(.*?)", response.text)) def get_password(self, key_info): """ 调用 js 代码生成参数 :param key_info: :return: """ return self.js.call('enc', key_info, self.pwd) def start(self): """ 启动 :return: """ self.to_index() self.login(self.get_key()) if __name__ == '__main__': """ 启动区域 """ username = input('用户名>>> ') password = input('密码>>> ') pp = People(username, password) pp.start() ================================================ FILE: 其他实战/【企业名片】企业查询/encryp.js ================================================ function deco(e) { u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" d = /[\t\n\f\r ]/g var t = (e = String(e).replace(d, "")).length; t % 4 == 0 && (t = (e = e.replace(/==?$/, "")).length), (t % 4 == 1 || /[^+a-zA-Z0-9/] /.test(e)) && c( "Invalid character: the string to be decoded is not correctly encoded."); for (var n, i, r = 0, o = "", a = -1; ++a < t;) i = u.indexOf(e.charAt(a)), n = r % 4 ? 64 * n + i : i, r++ % 4 && (o += String.fromCharCode(255 & n >> (-2 * r & 6))); return o } function s(t, e, i, n, a, s) { var o, r, c, l, u, d, h, p, f, v, m, g, b, y, C = new Array(16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756), _ = new Array(-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, - 2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, - 2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, - 2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, - 2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344), w = new Array(520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584), x = new Array(8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928), k = new Array(256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080), A = new Array(536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312), T = new Array(2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154), L = new Array(268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696), S = function(t) { for (var e, i, n, a = new Array(0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516, 536871424, 536871428, 66048, 66052, 536936960, 536936964), s = new Array(0, 1, 1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833, 67109120, 67109121, 68157696, 68157697), o = new Array( 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272), r = new Array(0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072, 2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144), c = new Array(0, 262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112, 266256), l = new Array(0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456, 33554464, 33555488), u = new Array( 0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746), d = new Array(0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496, 131072, 196608, 133120, 198656, 537001984, 537067520, 537004032, 537069568), h = new Array(0, 262144, 0, 262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578), p = new Array(0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024, 268436480, 1032, 268436488), f = new Array(0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768, 1056800), v = new Array(0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864, 83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744), m = new Array( 0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840, 524304, 528400, 134742032, 134746128), g = new Array(0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261), b = t.length > 8 ? 3 : 1, y = new Array(32 * b), C = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0), _ = 0, w = 0, x = 0; x < b; x++) { var k = t.charCodeAt(_++) << 24 | t.charCodeAt(_++) << 16 | t.charCodeAt(_++) << 8 | t.charCodeAt(_++), A = t.charCodeAt(_++) << 24 | t.charCodeAt(_++) << 16 | t.charCodeAt(_++) << 8 | t.charCodeAt(_++); k ^= (n = 252645135 & (k >>> 4 ^ A)) << 4, k ^= n = 65535 & ((A ^= n) >>> -16 ^ k), k ^= (n = 858993459 & (k >>> 2 ^ (A ^= n << -16))) << 2, k ^= n = 65535 & ((A ^= n) >>> -16 ^ k), k ^= (n = 1431655765 & (k >>> 1 ^ (A ^= n << -16))) << 1, k ^= n = 16711935 & ((A ^= n) >>> 8 ^ k), n = (k ^= (n = 1431655765 & (k >>> 1 ^ (A ^= n << 8))) << 1) << 8 | (A ^= n) >>> 20 & 240, k = A << 24 | A << 8 & 16711680 | A >>> 8 & 65280 | A >>> 24 & 240, A = n; for (var T = 0; T < C.length; T++) C[T] ? (k = k << 2 | k >>> 26, A = A << 2 | A >>> 26) : (k = k << 1 | k >>> 27, A = A << 1 | A >>> 27), A &= -15, e = a[(k &= -15) >>> 28] | s[k >>> 24 & 15] | o[k >>> 20 & 15] | r[k >>> 16 & 15] | c[k >>> 12 & 15] | l[k >>> 8 & 15] | u[k >>> 4 & 15], i = d[A >>> 28] | h[A >>> 24 & 15] | p[A >>> 20 & 15] | f[A >>> 16 & 15] | v[A >>> 12 & 15] | m[A >>> 8 & 15] | g[A >>> 4 & 15], n = 65535 & (i >>> 16 ^ e), y[w++] = e ^ n, y[w++] = i ^ n << 16 } return y }(t), z = 0, B = e.length, j = 0, I = 32 == S.length ? 3 : 9; p = 3 == I ? i ? new Array(0, 32, 2) : new Array(30, -2, -2) : i ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array( 94, 62, -2, 32, 64, 2, 30, -2, -2), 2 == s ? e += " " : 1 == s ? i && (c = 8 - B % 8, e += String.fromCharCode(c, c, c, c, c, c, c, c), 8 === c && (B += 8)) : s || (e += "\0\0\0\0\0\0\0\0"); var N = "", F = ""; for (1 == n && (f = a.charCodeAt(z++) << 24 | a.charCodeAt(z++) << 16 | a.charCodeAt(z++) << 8 | a.charCodeAt(z++), m = a.charCodeAt(z++) << 24 | a.charCodeAt(z++) << 16 | a.charCodeAt(z++) << 8 | a.charCodeAt(z++), z = 0); z < B;) { for (d = e.charCodeAt(z++) << 24 | e.charCodeAt(z++) << 16 | e.charCodeAt(z++) << 8 | e.charCodeAt(z++), h = e.charCodeAt(z++) << 24 | e.charCodeAt(z++) << 16 | e.charCodeAt(z++) << 8 | e.charCodeAt(z++), 1 == n && (i ? (d ^= f, h ^= m) : (v = f, g = m, f = d, m = h)), d ^= (c = 252645135 & (d >>> 4 ^ h)) << 4, d ^= (c = 65535 & (d >>> 16 ^ (h ^= c))) << 16, d ^= c = 858993459 & ((h ^= c) >>> 2 ^ d), d ^= c = 16711935 & ((h ^= c << 2) >>> 8 ^ d), d = (d ^= (c = 1431655765 & (d >>> 1 ^ (h ^= c << 8))) << 1) << 1 | d >>> 31, h = (h ^= c) << 1 | h >>> 31, r = 0; r < I; r += 3) { for (b = p[r + 1], y = p[r + 2], o = p[r]; o != b; o += y) l = h ^ S[o], u = (h >>> 4 | h << 28) ^ S[o + 1], c = d, d = h, h = c ^ (_[l >>> 24 & 63] | x[l >>> 16 & 63] | A[l >>> 8 & 63] | L[63 & l] | C[u >>> 24 & 63] | w[u >>> 16 & 63] | k[u >>> 8 & 63] | T[63 & u]); c = d, d = h, h = c } h = h >>> 1 | h << 31, h ^= c = 1431655765 & ((d = d >>> 1 | d << 31) >>> 1 ^ h), h ^= (c = 16711935 & (h >>> 8 ^ (d ^= c << 1))) << 8, h ^= (c = 858993459 & (h >>> 2 ^ (d ^= c))) << 2, h ^= c = 65535 & ((d ^= c) >>> 16 ^ h), h ^= c = 252645135 & ((d ^= c << 16) >>> 4 ^ h), d ^= c << 4, 1 == n && (i ? (f = d, m = h) : (d ^= v, h ^= g)), F += String.fromCharCode(d >>> 24, d >>> 16 & 255, d >>> 8 & 255, 255 & d, h >>> 24, h >>> 16 & 255, h >>> 8 & 255, 255 & h), 512 == (j += 8) && (N += F, F = "", j = 0) } if (N = (N += F).replace(/\0*$/g, ""), !i) { if (1 === s) { var O = 0; (B = N.length) && (O = N.charCodeAt(B - 1)), O <= 8 && (N = N.substring(0, B - O)) } N = decodeURIComponent(escape(N)) } return N } key = 'bOnqtWHqs4uLG9v0bT4uO6isvbiT8aIuVXK3Cf4FZEan27IeZt0dPhZFP3MHYAqL3RhRkdtYisAILDIRZo5nRjal8gCdjTfckNWSKqax7UJIx/xuZpX2ESwmDsQtt4VbSRHrXxX7w9M6uJpGQ4pmkhgAOrzMd7krZGWjts+QvDiSZV3ogU9g18dO+kPNgCGAXpbBZe850GQL/ZtXe/MyymSMX0UCdnWyxvW+pylu4NRLgD4QKDDbCbfXhe75ZCPwwQzy7IFgFJAfCZqMFDuHwxVOrX7TFg/8IdMotUhC0bZQul6JtLUt3wONKjFiOWlQcHhESLLL8BASHkfbRWOrZzJD/7NwnCGGBExFM1EaUsqYnhIZCt9iCxC3YUxQcc/YyBynN4yeMy54mZGw1YdnfjBLfZsZcQGJHD5plYuZtZzGtT5axTGEc+wFJIOBM9KqAVDP9EjXQbLx0CzDP4mU22ZXuJ8VI2WFomyKq0c1TmXoRIx/YMaDDW732YTvJ5ip9OWZPtfoIxgUj8Kt+Ma83GHnvhyz1UqqK0WUl33PSRH0Kyy6u01bOnrw9nXApOM+O58xlv84NhqXV5UNXBv2QanbKYFtrLycLqFEG/54JGLQiKg4BywDEK0i+acB5KkLrsZQ0Y5AS0QBQSinyVVeBtXdizI108ZxApOmTsSbrDYDN5kozMF4U9MBgz4MwHjdAJi71d0qFkKLJl0XlLNMweSvL7LqKb2j+hUk1f2TPyT+DLZf6JbS1MpfE6RAhSw9oeb+AeCIN9FjJiBrwFpprshKV5+pQysjVpEaati5KHADN5kozMF4U9MBgz4MwHjdRy1BxsWNdmvecguBop/mUsASDNo08L9AUyNj+lIrbHxAm/LDuLil5IUltqyd6E1dWOJiDCqxQDULkQZHjCnATjkj8jkrQSizXzuvdEZ/bg0cuopNbiBd2ARL4Vwhjkm6PZc5LxdtfRGhangqgGjWOPAveNWmhByFpwVpj8F2dbNqPjYwSvbTkmIVsyAKwooyt+4gsiaCWI9UbR2/tS/pM4Mc+K8UMBnkPkI/hx8dI7WD9lutMTcSmdNi8fsi3W23CviXLZ78f00Z51Qhgunhsn6hLB2OFGq9O2db8T06srefB7vqtIgAoZ9mcDczH/3PHDep62KxbIk=' function get_info(send_info) { return s("5e5062e82f15fe4ca9d24bc5", deco(send_info), 0, 0, "012345677890123", 1) } ================================================ FILE: 其他实战/【企业名片】企业查询/qi_ming.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-11-08 Python: 3.7 import requests import json import execjs.runtime_names with open('encryp.js', 'r', encoding='utf-8') as f: js = execjs.compile(f.read()) print('引擎', execjs.get().name) data = { 'time_interval': '', 'tag': '', 'tag_type': '', 'province': '', 'lunci': '', 'page': '1', 'num': '20', 'unionid': '', } headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36' } response = requests.post('https://vipapi.qimingpian.com/DataList/productListVip', data=data, headers=headers) re_data = json.loads(response.text) data = js.call('get_info', re_data.get('encrypt_data')) print(data.encode('utf-8').decode('unicode_escape')) ================================================ FILE: 其他实战/【国鑫所】自动登录/Login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-10 Python: 3.7 import execjs.runtime_names import requests class GuoXin: """ 国鑫所 https://wechat.gclfax.com/html/register/login.html """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.url = 'https://wechat.gclfax.com/client/index.php' self.js = None self.init_js() def init_js(self): print('引擎', execjs.get().name) with open("encryp.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def login(self): headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', 'Host': 'wechat.gclfax.com', 'Origin': 'https://wechat.gclfax.com', 'Referer': 'https://wechat.gclfax.com/html/register/login.html' } data = { 'OPT': '1', 'name': self.user, 'pwd': self.js.call('test', self.pwd), 'randomId': '', 'code': '', 'openid': '', } response = requests.post(self.url, headers=headers, data=data) print(response.text) print(response) if __name__ == '__main__': username = input('用户名') password = input('密码') gxs = GuoXin(username, password) gxs.login() ================================================ FILE: 其他实战/【国鑫所】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【国鑫所】自动登录/encryp.js ================================================ var CryptoJS = CryptoJS || function(s, p) { var m = {} , l = m.lib = {} , n = function() {} , r = l.Base = { extend: function(b) { n.prototype = this; var h = new n; b && h.mixIn(b); h.hasOwnProperty("init") || (h.init = function() { h.$super.init.apply(this, arguments) } ); h.init.prototype = h; h.$super = this; return h }, create: function() { var b = this.extend(); b.init.apply(b, arguments); return b }, init: function() {}, mixIn: function(b) { for (var h in b) b.hasOwnProperty(h) && (this[h] = b[h]); b.hasOwnProperty("toString") && (this.toString = b.toString) }, clone: function() { return this.init.prototype.extend(this) } } , q = l.WordArray = r.extend({ init: function(b, h) { b = this.words = b || []; this.sigBytes = h != p ? h : 4 * b.length }, toString: function(b) { return (b || t).stringify(this) }, concat: function(b) { var h = this.words , a = b.words , j = this.sigBytes; b = b.sigBytes; this.clamp(); if (j % 4) for (var g = 0; g < b; g++) h[j + g >>> 2] |= (a[g >>> 2] >>> 24 - 8 * (g % 4) & 255) << 24 - 8 * ((j + g) % 4); else if (65535 < a.length) for (g = 0; g < b; g += 4) h[j + g >>> 2] = a[g >>> 2]; else h.push.apply(h, a); this.sigBytes += b; return this }, clamp: function() { var b = this.words , h = this.sigBytes; b[h >>> 2] &= 4294967295 << 32 - 8 * (h % 4); b.length = s.ceil(h / 4) }, clone: function() { var b = r.clone.call(this); b.words = this.words.slice(0); return b }, random: function(b) { for (var h = [], a = 0; a < b; a += 4) h.push(4294967296 * s.random() | 0); return new q.init(h,b) } }) , v = m.enc = {} , t = v.Hex = { stringify: function(b) { var a = b.words; b = b.sigBytes; for (var g = [], j = 0; j < b; j++) { var k = a[j >>> 2] >>> 24 - 8 * (j % 4) & 255; g.push((k >>> 4).toString(16)); g.push((k & 15).toString(16)) } return g.join("") }, parse: function(b) { for (var a = b.length, g = [], j = 0; j < a; j += 2) g[j >>> 3] |= parseInt(b.substr(j, 2), 16) << 24 - 4 * (j % 8); return new q.init(g,a / 2) } } , a = v.Latin1 = { stringify: function(b) { var a = b.words; b = b.sigBytes; for (var g = [], j = 0; j < b; j++) g.push(String.fromCharCode(a[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return g.join("") }, parse: function(b) { for (var a = b.length, g = [], j = 0; j < a; j++) g[j >>> 2] |= (b.charCodeAt(j) & 255) << 24 - 8 * (j % 4); return new q.init(g,a) } } , u = v.Utf8 = { stringify: function(b) { try { return decodeURIComponent(escape(a.stringify(b))) } catch (g) { throw Error("Malformed UTF-8 data"); } }, parse: function(b) { return a.parse(unescape(encodeURIComponent(b))) } } , g = l.BufferedBlockAlgorithm = r.extend({ reset: function() { this._data = new q.init; this._nDataBytes = 0 }, _append: function(b) { "string" == typeof b && (b = u.parse(b)); this._data.concat(b); this._nDataBytes += b.sigBytes }, _process: function(b) { var a = this._data , g = a.words , j = a.sigBytes , k = this.blockSize , m = j / (4 * k) , m = b ? s.ceil(m) : s.max((m | 0) - this._minBufferSize, 0); b = m * k; j = s.min(4 * b, j); if (b) { for (var l = 0; l < b; l += k) this._doProcessBlock(g, l); l = g.splice(0, b); a.sigBytes -= j } return new q.init(l,j) }, clone: function() { var b = r.clone.call(this); b._data = this._data.clone(); return b }, _minBufferSize: 0 }); l.Hasher = g.extend({ cfg: r.extend(), init: function(b) { this.cfg = this.cfg.extend(b); this.reset() }, reset: function() { g.reset.call(this); this._doReset() }, update: function(b) { this._append(b); this._process(); return this }, finalize: function(b) { b && this._append(b); return this._doFinalize() }, blockSize: 16, _createHelper: function(b) { return function(a, g) { return (new b.init(g)).finalize(a) } }, _createHmacHelper: function(b) { return function(a, g) { return (new k.HMAC.init(b,g)).finalize(a) } } }); var k = m.algo = {}; return m }(Math); var CryptoJS=CryptoJS||function(u,l){var d={},n=d.lib={},p=function(){},s=n.Base={extend:function(a){p.prototype=this;var c=new p;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, q=n.WordArray=s.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,m=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var t=0;t>>2]|=(m[t>>>2]>>>24-8*(t%4)&255)<<24-8*((f+t)%4);else if(65535>>2]=m[t>>>2];else c.push.apply(c,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<< 32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=s.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],m=0;m>>2]>>>24-8*(f%4)&255;m.push((t>>>4).toString(16));m.push((t&15).toString(16))}return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f>>3]|=parseInt(a.substr(f, 2),16)<<24-4*(f%8);return new q.init(m,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f>>2]>>>24-8*(f%4)&255));return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new q.init(m,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}}, r=n.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,m=c.words,f=c.sigBytes,t=this.blockSize,b=f/(4*t),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*t;f=u.min(4*a,f);if(a){for(var e=0;e>>2]>>>24-8*(q%4)&255)<<16|(n[q+1>>>2]>>>24-8*((q+1)%4)&255)<<8|n[q+2>>>2]>>>24-8*((q+2)%4)&255,v=0;4>v&&q+0.75*v>>6*(3-v)&63));if(n=s.charAt(64))for(;d.length%4;)d.push(n);return d.join("")},parse:function(d){var n=d.length,p=this._map,s=p.charAt(64);s&&(s=d.indexOf(s),-1!=s&&(n=s));for(var s=[],q=0,w=0;w< n;w++)if(w%4){var v=p.indexOf(d.charAt(w-1))<<2*(w%4),b=p.indexOf(d.charAt(w))>>>6-2*(w%4);s[q>>>2]|=(v|b)<<24-8*(q%4);q++}return l.create(s,q)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(); (function(u){function l(b,e,a,c,m,f,t){b=b+(e&a|~e&c)+m+t;return(b<>>32-f)+e}function d(b,e,a,c,m,f,t){b=b+(e&c|a&~c)+m+t;return(b<>>32-f)+e}function n(b,e,a,c,m,f,t){b=b+(e^a^c)+m+t;return(b<>>32-f)+e}function p(b,e,a,c,m,f,t){b=b+(a^(e|~c))+m+t;return(b<>>32-f)+e}for(var s=CryptoJS,q=s.lib,w=q.WordArray,v=q.Hasher,q=s.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;q=q.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])}, _doProcessBlock:function(r,e){for(var a=0;16>a;a++){var c=e+a,m=r[c];r[c]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var a=this._hash.words,c=r[e+0],m=r[e+1],f=r[e+2],t=r[e+3],y=r[e+4],q=r[e+5],s=r[e+6],w=r[e+7],v=r[e+8],u=r[e+9],x=r[e+10],z=r[e+11],A=r[e+12],B=r[e+13],C=r[e+14],D=r[e+15],g=a[0],h=a[1],j=a[2],k=a[3],g=l(g,h,j,k,c,7,b[0]),k=l(k,g,h,j,m,12,b[1]),j=l(j,k,g,h,f,17,b[2]),h=l(h,j,k,g,t,22,b[3]),g=l(g,h,j,k,y,7,b[4]),k=l(k,g,h,j,q,12,b[5]),j=l(j,k,g,h,s,17,b[6]),h=l(h,j,k,g,w,22,b[7]), g=l(g,h,j,k,v,7,b[8]),k=l(k,g,h,j,u,12,b[9]),j=l(j,k,g,h,x,17,b[10]),h=l(h,j,k,g,z,22,b[11]),g=l(g,h,j,k,A,7,b[12]),k=l(k,g,h,j,B,12,b[13]),j=l(j,k,g,h,C,17,b[14]),h=l(h,j,k,g,D,22,b[15]),g=d(g,h,j,k,m,5,b[16]),k=d(k,g,h,j,s,9,b[17]),j=d(j,k,g,h,z,14,b[18]),h=d(h,j,k,g,c,20,b[19]),g=d(g,h,j,k,q,5,b[20]),k=d(k,g,h,j,x,9,b[21]),j=d(j,k,g,h,D,14,b[22]),h=d(h,j,k,g,y,20,b[23]),g=d(g,h,j,k,u,5,b[24]),k=d(k,g,h,j,C,9,b[25]),j=d(j,k,g,h,t,14,b[26]),h=d(h,j,k,g,v,20,b[27]),g=d(g,h,j,k,B,5,b[28]),k=d(k,g, h,j,f,9,b[29]),j=d(j,k,g,h,w,14,b[30]),h=d(h,j,k,g,A,20,b[31]),g=n(g,h,j,k,q,4,b[32]),k=n(k,g,h,j,v,11,b[33]),j=n(j,k,g,h,z,16,b[34]),h=n(h,j,k,g,C,23,b[35]),g=n(g,h,j,k,m,4,b[36]),k=n(k,g,h,j,y,11,b[37]),j=n(j,k,g,h,w,16,b[38]),h=n(h,j,k,g,x,23,b[39]),g=n(g,h,j,k,B,4,b[40]),k=n(k,g,h,j,c,11,b[41]),j=n(j,k,g,h,t,16,b[42]),h=n(h,j,k,g,s,23,b[43]),g=n(g,h,j,k,u,4,b[44]),k=n(k,g,h,j,A,11,b[45]),j=n(j,k,g,h,D,16,b[46]),h=n(h,j,k,g,f,23,b[47]),g=p(g,h,j,k,c,6,b[48]),k=p(k,g,h,j,w,10,b[49]),j=p(j,k,g,h, C,15,b[50]),h=p(h,j,k,g,q,21,b[51]),g=p(g,h,j,k,A,6,b[52]),k=p(k,g,h,j,t,10,b[53]),j=p(j,k,g,h,x,15,b[54]),h=p(h,j,k,g,m,21,b[55]),g=p(g,h,j,k,v,6,b[56]),k=p(k,g,h,j,D,10,b[57]),j=p(j,k,g,h,s,15,b[58]),h=p(h,j,k,g,B,21,b[59]),g=p(g,h,j,k,y,6,b[60]),k=p(k,g,h,j,z,10,b[61]),j=p(j,k,g,h,f,15,b[62]),h=p(h,j,k,g,u,21,b[63]);a[0]=a[0]+g|0;a[1]=a[1]+h|0;a[2]=a[2]+j|0;a[3]=a[3]+k|0},_doFinalize:function(){var b=this._data,e=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;e[c>>>5]|=128<<24-c%32;var m=u.floor(a/ 4294967296);e[(c+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;e[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(e.length+1);this._process();b=this._hash;e=b.words;for(a=0;4>a;a++)c=e[a],e[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});s.MD5=v._createHelper(q);s.HmacMD5=v._createHmacHelper(q)})(Math); (function(){var u=CryptoJS,l=u.lib,d=l.Base,n=l.WordArray,l=u.algo,p=l.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:l.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,l){for(var p=this.cfg,v=p.hasher.create(),b=n.create(),u=b.words,r=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:r}),reset:function(){v.reset.call(this);var a=this.cfg,c=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var b=a.createEncryptor;else b=a.createDecryptor,this._minBufferSize=1;this._mode=b.call(a, this,c&&c.words)},_doProcessBlock:function(a,c){this._mode.processBlock(a,c)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var c=this._process(!0)}else c=this._process(!0),a.unpad(c);return c},blockSize:4});var e=d.CipherParams=n.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(l.format={}).OpenSSL={stringify:function(a){var c=a.ciphertext;a=a.salt;return(a?p.create([1398893684, 1701076831]).concat(a).concat(c):c).toString(q)},parse:function(a){a=q.parse(a);var c=a.words;if(1398893684==c[0]&&1701076831==c[1]){var b=p.create(c.slice(2,4));c.splice(0,4);a.sigBytes-=16}return e.create({ciphertext:a,salt:b})}},a=d.SerializableCipher=n.extend({cfg:n.extend({format:b}),encrypt:function(a,c,b,d){d=this.cfg.extend(d);var l=a.createEncryptor(b,d);c=l.finalize(c);l=l.cfg;return e.create({ciphertext:c,key:b,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})}, decrypt:function(a,c,b,e){e=this.cfg.extend(e);c=this._parse(c,e.format);return a.createDecryptor(b,e).finalize(c.ciphertext)},_parse:function(a,c){return"string"==typeof a?c.parse(a,this):a}}),l=(l.kdf={}).OpenSSL={execute:function(a,c,b,d){d||(d=p.random(8));a=w.create({keySize:c+b}).compute(a,d);b=p.create(a.words.slice(c),4*b);a.sigBytes=4*c;return e.create({key:a,iv:b,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:l}),encrypt:function(c,b,e,d){d=this.cfg.extend(d);e=d.kdf.execute(e, c.keySize,c.ivSize);d.iv=e.iv;c=a.encrypt.call(this,c,b,e.key,d);c.mixIn(e);return c},decrypt:function(c,b,e,d){d=this.cfg.extend(d);b=this._parse(b,d.format);e=d.kdf.execute(e,c.keySize,c.ivSize,b.salt);d.iv=e.iv;return a.decrypt.call(this,c,b,e.key,d)}})}(); (function(){function u(b,a){var c=(this._lBlock>>>b^this._rBlock)&a;this._rBlock^=c;this._lBlock^=c<>>b^this._lBlock)&a;this._lBlock^=c;this._rBlock^=c<c;c++){var d=q[c]-1;a[c]=b[d>>>5]>>>31-d%32&1}b=this._subKeys=[];for(d=0;16>d;d++){for(var f=b[d]=[],l=v[d],c=0;24>c;c++)f[c/6|0]|=a[(w[c]-1+l)%28]<<31-c%6,f[4+(c/6|0)]|=a[28+(w[c+24]-1+l)%28]<<31-c%6;f[0]=f[0]<<1|f[0]>>>31;for(c=1;7>c;c++)f[c]>>>= 4*(c-1)+3;f[7]=f[7]<<5|f[7]>>>27}a=this._invSubKeys=[];for(c=0;16>c;c++)a[c]=b[15-c]},encryptBlock:function(b,a){this._doCryptBlock(b,a,this._subKeys)},decryptBlock:function(b,a){this._doCryptBlock(b,a,this._invSubKeys)},_doCryptBlock:function(e,a,c){this._lBlock=e[a];this._rBlock=e[a+1];u.call(this,4,252645135);u.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);u.call(this,1,1431655765);for(var d=0;16>d;d++){for(var f=c[d],n=this._lBlock,p=this._rBlock,q=0,r=0;8>r;r++)q|=b[r][((p^ f[r])&x[r])>>>0];this._lBlock=p;this._rBlock=n^q}c=this._lBlock;this._lBlock=this._rBlock;this._rBlock=c;u.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);u.call(this,16,65535);u.call(this,4,252645135);e[a]=this._lBlock;e[a+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});d.DES=n._createHelper(r);s=s.TripleDES=n.extend({_doReset:function(){var b=this._key.words;this._des1=r.createEncryptor(p.create(b.slice(0,2)));this._des2=r.createEncryptor(p.create(b.slice(2,4)));this._des3= r.createEncryptor(p.create(b.slice(4,6)))},encryptBlock:function(b,a){this._des1.encryptBlock(b,a);this._des2.decryptBlock(b,a);this._des3.encryptBlock(b,a)},decryptBlock:function(b,a){this._des3.decryptBlock(b,a);this._des2.encryptBlock(b,a);this._des1.decryptBlock(b,a)},keySize:6,ivSize:2,blockSize:2});d.TripleDES=n._createHelper(s)})(); CryptoJS.mode.ECB=function(){var a=CryptoJS.lib.BlockCipherMode.extend();a.Encryptor=a.extend({processBlock:function(a,b){this._cipher.encryptBlock(a,b)}});a.Decryptor=a.extend({processBlock:function(a,b){this._cipher.decryptBlock(a,b)}});return a}(); function test(pwd) { var key = 'Pog4iu6OqIkKRpDT'; var keyHex = CryptoJS.enc.Utf8.parse(key); var encrypted = CryptoJS.DES.encrypt(pwd, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); var enstr = CryptoJS.enc.Base64.parse(encrypted.toString()); return enstr.toString().toUpperCase(); } ================================================ FILE: 其他实战/【天眼查】模拟登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-18 Python: 3.7 ================================================ FILE: 其他实战/【天眼查】模拟登录/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-13 Python: 3.7 import time from lxml import etree from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class TYC_Spider: def __init__(self, username, password): """初始化参数""" url = 'https://www.tianyancha.com/login' page_url = 'https://www.tianyancha.com/search/ohp1/p{page}?base=cq' self.page_url = page_url self.page = 1 # 当前页数 self.url = url options = webdriver.ChromeOptions() # 不加载图片,加快访问速度 # options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 设置为开发者模式,避免被识别 options.add_experimental_option('excludeSwitches', ['enable-automation']) self.browser = webdriver.Chrome(executable_path='./chromedriver', options=options) self.wait = WebDriverWait(self.browser, 40) # 初始化用户名 self.username = username # 初始化密码 self.password = password def run(self): """登陆接口""" self.browser.get(self.url) try: use_pass = self.wait.until( EC.presence_of_element_located((By.XPATH, '//*[@id="web-content"]/div/div[2]/div/div[2]/div/div[3]/div[1]/div[2]'))) time.sleep(2) use_pass.click() username = self.wait.until( EC.presence_of_element_located((By.XPATH, '//*[@id="web-content"]/div/div[2]/div/div[2]/div/div[3]/div[2]/div[2]/input'))) password = self.wait.until( EC.presence_of_element_located( (By.XPATH, '//*[@id="web-content"]/div/div[2]/div/div[2]/div/div[3]/div[2]/div[3]/input'))) input_to = self.wait.until( EC.presence_of_element_located( (By.XPATH, '//*[@id="web-content"]/div/div[2]/div/div[2]/div/div[3]/div[2]/div[5]'))) username.send_keys(self.username) password.send_keys(self.password) input_to.click() self.wait.until( EC.presence_of_element_located((By.XPATH, '//*[@id="home-main-search"]'))) print('登陆成功') self.go_page() except Exception: self.browser.close() print("登陆失败") def go_page(self): """进入指定页面""" self.browser.get(self.page_url.format(page=str(self.page+1))) # ohp带电话 self.get_info() self.go_page() def get_info(self): """获取当前页面,企业名称+电话号码""" html = self.browser.page_source etr = etree.HTML(html) divs = etr.xpath("//div[@class='search-item sv-search-company']") for div in divs: title = div.xpath('./div/div[3]/div[1]/a/text()') phone = div.xpath('./div/div[3]/div[3]/div[1]/script/text()') if not phone: phone = div.xpath('./div/div[3]/div[3]/div[1]/span[2]/span/text()') if not phone: phone = div.xpath('./div/div[3]/div[4]/div[1]/script/text()') print(title, phone) time.sleep(2) if __name__ == "__main__": name = input("请输入你的微博用户名:") pas = input("请输入密码:") spider = TYC_Spider(name, pas) spider.run() ================================================ FILE: 其他实战/【天翼】登录/login.py ================================================ # -*- encoding: utf-8 -*- # Auth: Zok Email: 362416272@qq.com # Date: 2020/1/23 import requests import re import execjs session = requests.session() UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36' def login(username, password): with open('v1.js', 'r', encoding='utf-8') as f: js = execjs.compile(f.read()) username = js.call('make', username) password = js.call('make', password) url = 'https://e.189.cn/index.do' login_url = 'https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do' response = session.get(url, headers={"User-Agent": UA}) ret = re.search(r'sign=(.*?)&appId=(.*?)¶s=(.*?)&format=(.*?)&clientType=(.*?)&version=(.*?)">', response.text) url = 'https://open.e.189.cn/api/logbox/oauth2/unifyAccountLogin.do?sign=' + ret.group(1) + '&appId=' + ret.group( 2) + '¶s=' + ret.group(3) + '&format=' + ret.group(4) + '&clientType=' + ret.group( 5) + '&version=' + ret.group(6) response = session.get(url, headers={"User-Agent": UA}) text = response.text captchaToken = re.search(r"captchaToken' value='(.*?)'>", text).group(1) ret = re.search(r"clientType = '(.*?)'[\s\S]*?accountType = '(.*?)'[\s\S]*?appKey = '(.*?)'", text) clientType = ret.group(1) accountType = ret.group(2) appKey = ret.group(3) paramId = re.search(r'paramId = "(.*?)"', text).group(1) REQID = re.search(r'reqId = "(.*?)"', text).group(1) lt = re.search(r'lt = "(.*?)"', text).group(1) headers = { 'User-Agent': UA, 'Host': 'open.e.189.cn', 'Origin': 'https://open.e.189.cn', 'Referer': url, 'REQID': REQID, 'lt': lt, } data = { 'appKey': appKey, 'accountType': accountType, 'validateCode': "", # 验证码 'captchaToken': captchaToken, 'returnUrl': 'https://e.189.cn/user/loginMiddle.do?returnUrlMid=https://e.189.cn/user/index.do', 'mailSuffix': '', 'dynamicCheck': 'FALSE', 'clientType': clientType, 'cb_SaveName': '1', 'isOauth2': 'false', 'state': '', 'paramId': paramId, 'userName': username, 'password': password, } response = session.post(login_url, headers=headers, data=data) # print(data) print(response.text) print(execjs.get().name) if execjs.get().name != 'Node.js (V8)': print('请安装V8 引擎') if __name__ == '__main__': user = input('用户名>>>') pwd = input('密码>>>') login(user, pwd) ================================================ FILE: 其他实战/【天翼】登录/v1.js ================================================ var navigator = {}; var window = {}; var JSEncryptExports = {}; ! function(exports) { function BigInteger(a, b, c) { null != a && ("number" == typeof a ? this.fromNumber(a, b, c) : null == b && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b)) } function nbi() { return new BigInteger(null) } function int2char(a) { return BI_RM.charAt(a) } function intAt(a, b) { var c = BI_RC[a.charCodeAt(b)]; return null == c ? -1 : c } function nbv(a) { var b = nbi(); return b.fromInt(a), b } function nbits(a) { var b, c = 1; return 0 != (b = a >>> 16) && (a = b, c += 16), 0 != (b = a >> 8) && (a = b, c += 8), 0 != (b = a >> 4) && (a = b, c += 4), 0 != (b = a >> 2) && (a = b, c += 2), 0 != (b = a >> 1) && (a = b, c += 1), c } function Classic(a) { this.m = a } function Montgomery(a) { this.m = a, this.mp = a.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << a.DB - 15) - 1, this.mt2 = 2 * a.t } function op_and(a, b) { return a & b } function op_or(a, b) { return a | b } function op_xor(a, b) { return a ^ b } function op_andnot(a, b) { return a & ~b } function lbit(a) { if (0 == a) return -1; var b = 0; return 0 == (65535 & a) && (a >>= 16, b += 16), 0 == (255 & a) && (a >>= 8, b += 8), 0 == (15 & a) && (a >>= 4, b += 4), 0 == (3 & a) && (a >>= 2, b += 2), 0 == (1 & a) && ++b, b } function cbit(a) { for (var b = 0; 0 != a;) a &= a - 1, ++b; return b } function NullExp() {} function nNop(a) { return a } function Barrett(a) { this.r2 = nbi(), this.q3 = nbi(), BigInteger.ONE.dlShiftTo(2 * a.t, this.r2), this.mu = this.r2.divide(a), this.m = a } function Arcfour() { this.i = 0, this.j = 0, this.S = new Array } function rng_get_byte() { if (null == rng_state) { for (rng_state = new Arcfour; rng_pptr < rng_psize;) { var a = Math.floor(65536 * Math.random()); rng_pool[rng_pptr++] = 255 & a } for (rng_state.init(rng_pool), rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) rng_pool[rng_pptr] = 0; rng_pptr = 0 } return rng_state.next() } function SecureRandom() {} function parseBigInt(a, b) { return new BigInteger(a, b) } function RSAKey() { this.n = null, this.e = 0, this.d = null, this.p = null, this.q = null, this.dmp1 = null, this.dmq1 = null, this.coeff = null } function hex2b64(a) { var b, c, d = ""; for (b = 0; b + 3 <= a.length; b += 3) c = parseInt(a.substring(b, b + 3), 16), d += b64map.charAt(c >> 6) + b64map.charAt(63 & c); for (b + 1 == a.length ? (c = parseInt(a.substring(b, b + 1), 16), d += b64map.charAt(c << 2)) : b + 2 == a.length && (c = parseInt(a.substring(b, b + 2), 16), d += b64map.charAt(c >> 2) + b64map.charAt((3 & c) << 4)); 0 < (3 & d.length);) d += b64pad; return d } function b64tohex(a) { var b, c, d = "", e = 0; for (b = 0; b < a.length && a.charAt(b) != b64pad; ++b) v = b64map.indexOf(a.charAt(b)), v < 0 || (e = 0 == e ? (d += int2char(v >> 2), c = 3 & v, 1) : 1 == e ? (d += int2char(c << 2 | v >> 4), c = 15 & v, 2) : 2 == e ? (d += int2char(c), d += int2char(v >> 2), c = 3 & v, 3) : (d += int2char(c << 2 | v >> 4), d += int2char(15 & v), 0)); return 1 == e && (d += int2char(c << 2)), d } var dbits; dbits = "Microsoft Internet Explorer" == navigator.appName ? (BigInteger.prototype.am = function(a, b, c, d, e, f) { for (var g = 32767 & b, h = b >> 15; 0 <= --f;) { var i = 32767 & this[a], j = this[a++] >> 15, k = h * i + j * g; e = ((i = g * i + ((32767 & k) << 15) + c[d] + (1073741823 & e)) >>> 30) + (k >>> 15) + h * j + (e >>> 30), c[d++] = 1073741823 & i } return e }, 30) : "Netscape" != navigator.appName ? (BigInteger.prototype.am = function(a, b, c, d, e, f) { for (; 0 <= --f;) { var g = b * this[a++] + c[d] + e; e = Math.floor(g / 67108864), c[d++] = 67108863 & g } return e }, 26) : (BigInteger.prototype.am = function(a, b, c, d, e, f) { for (var g = 16383 & b, h = b >> 14; 0 <= --f;) { var i = 16383 & this[a], j = this[a++] >> 14, k = h * i + j * g; e = ((i = g * i + ((16383 & k) << 14) + c[d] + e) >> 28) + (k >> 14) + h * j, c[d++] = 268435455 & i } return e }, 28), BigInteger.prototype.DB = dbits, BigInteger.prototype.DM = (1 << dbits) - 1, BigInteger.prototype.DV = 1 << dbits; BigInteger.prototype.FV = Math.pow(2, 52), BigInteger.prototype.F1 = 52 - dbits, BigInteger.prototype.F2 = 2 * dbits - 52; var rr, vv, BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz", BI_RC = new Array; for (rr = "0".charCodeAt(0), vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; for (rr = "a".charCodeAt(0), vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; for (rr = "A".charCodeAt(0), vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; Classic.prototype.convert = function(a) { return a.s < 0 || 0 <= a.compareTo(this.m) ? a.mod(this.m) : a }, Classic.prototype.revert = function(a) { return a }, Classic.prototype.reduce = function(a) { a.divRemTo(this.m, null, a) }, Classic.prototype.mulTo = function(a, b, c) { a.multiplyTo(b, c), this.reduce(c) }, Classic.prototype.sqrTo = function(a, b) { a.squareTo(b), this.reduce(b) }, Montgomery.prototype.convert = function(a) { var b = nbi(); return a.abs().dlShiftTo(this.m.t, b), b.divRemTo(this.m, null, b), a.s < 0 && 0 < b.compareTo(BigInteger.ZERO) && this.m.subTo(b, b), b }, Montgomery.prototype.revert = function(a) { var b = nbi(); return a.copyTo(b), this.reduce(b), b }, Montgomery.prototype.reduce = function(a) { for (; a.t <= this.mt2;) a[a.t++] = 0; for (var b = 0; b < this.m.t; ++b) { var c = 32767 & a[b], d = c * this.mpl + ((c * this.mph + (a[b] >> 15) * this.mpl & this.um) << 15) & a.DM; for (a[c = b + this.m.t] += this.m.am(0, d, a, b, 0, this.m.t); a[c] >= a.DV;) a[c] -= a.DV, a[++c]++ } a.clamp(), a.drShiftTo(this.m.t, a), 0 <= a.compareTo(this.m) && a.subTo(this.m, a) }, Montgomery.prototype.mulTo = function(a, b, c) { a.multiplyTo(b, c), this.reduce(c) }, Montgomery.prototype.sqrTo = function(a, b) { a.squareTo(b), this.reduce(b) }, BigInteger.prototype.copyTo = function(a) { for (var b = this.t - 1; 0 <= b; --b) a[b] = this[b]; a.t = this.t, a.s = this.s }, BigInteger.prototype.fromInt = function(a) { this.t = 1, this.s = a < 0 ? -1 : 0, 0 < a ? this[0] = a : a < -1 ? this[0] = a + DV : this.t = 0 }, BigInteger.prototype.fromString = function(a, b) { var c; if (16 == b) c = 4; else if (8 == b) c = 3; else if (256 == b) c = 8; else if (2 == b) c = 1; else if (32 == b) c = 5; else { if (4 != b) return void this.fromRadix(a, b); c = 2 } this.t = 0, this.s = 0; for (var d = a.length, e = !1, f = 0; 0 <= --d;) { var g = 8 == c ? 255 & a[d] : intAt(a, d); g < 0 ? "-" == a.charAt(d) && (e = !0) : (e = !1, 0 == f ? this[this.t++] = g : f + c > this.DB ? (this[this.t - 1] |= (g & (1 << this.DB - f) - 1) << f, this[this.t++] = g >> this.DB - f) : this[this.t - 1] |= g << f, (f += c) >= this.DB && (f -= this.DB)) } 8 == c && 0 != (128 & a[0]) && (this.s = -1, 0 < f && (this[this.t - 1] |= (1 << this.DB - f) - 1 << f)), this.clamp(), e && BigInteger.ZERO.subTo(this, this) }, BigInteger.prototype.clamp = function() { for (var a = this.s & this.DM; 0 < this.t && this[this.t - 1] == a;)--this.t }, BigInteger.prototype.dlShiftTo = function(a, b) { var c; for (c = this.t - 1; 0 <= c; --c) b[c + a] = this[c]; for (c = a - 1; 0 <= c; --c) b[c] = 0; b.t = this.t + a, b.s = this.s }, BigInteger.prototype.drShiftTo = function(a, b) { for (var c = a; c < this.t; ++c) b[c - a] = this[c]; b.t = Math.max(this.t - a, 0), b.s = this.s }, BigInteger.prototype.lShiftTo = function(a, b) { var c, d = a % this.DB, e = this.DB - d, f = (1 << e) - 1, g = Math.floor(a / this.DB), h = this.s << d & this.DM; for (c = this.t - 1; 0 <= c; --c) b[c + g + 1] = this[c] >> e | h, h = (this[c] & f) << d; for (c = g - 1; 0 <= c; --c) b[c] = 0; b[g] = h, b.t = this.t + g + 1, b.s = this.s, b.clamp() }, BigInteger.prototype.rShiftTo = function(a, b) { b.s = this.s; var c = Math.floor(a / this.DB); if (c >= this.t) b.t = 0; else { var d = a % this.DB, e = this.DB - d, f = (1 << d) - 1; b[0] = this[c] >> d; for (var g = c + 1; g < this.t; ++g) b[g - c - 1] |= (this[g] & f) << e, b[g - c] = this[g] >> d; 0 < d && (b[this.t - c - 1] |= (this.s & f) << e), b.t = this.t - c, b.clamp() } }, BigInteger.prototype.subTo = function(a, b) { for (var c = 0, d = 0, e = Math.min(a.t, this.t); c < e;) d += this[c] - a[c], b[c++] = d & this.DM, d >>= this.DB; if (a.t < this.t) { for (d -= a.s; c < this.t;) d += this[c], b[c++] = d & this.DM, d >>= this.DB; d += this.s } else { for (d += this.s; c < a.t;) d -= a[c], b[c++] = d & this.DM, d >>= this.DB; d -= a.s } b.s = d < 0 ? -1 : 0, d < -1 ? b[c++] = this.DV + d : 0 < d && (b[c++] = d), b.t = c, b.clamp() }, BigInteger.prototype.multiplyTo = function(a, b) { var c = this.abs(), d = a.abs(), e = c.t; for (b.t = e + d.t; 0 <= --e;) b[e] = 0; for (e = 0; e < d.t; ++e) b[e + c.t] = c.am(0, d[e], b, e, 0, c.t); b.s = 0, b.clamp(), this.s != a.s && BigInteger.ZERO.subTo(b, b) }, BigInteger.prototype.squareTo = function(a) { for (var b = this.abs(), c = a.t = 2 * b.t; 0 <= --c;) a[c] = 0; for (c = 0; c < b.t - 1; ++c) { var d = b.am(c, b[c], a, 2 * c, 0, 1); (a[c + b.t] += b.am(c + 1, 2 * b[c], a, 2 * c + 1, d, b.t - c - 1)) >= b.DV && (a[c + b.t] -= b.DV, a[c + b.t + 1] = 1) } 0 < a.t && (a[a.t - 1] += b.am(c, b[c], a, 2 * c, 0, 1)), a.s = 0, a.clamp() }, BigInteger.prototype.divRemTo = function(a, b, c) { var d = a.abs(); if (!(d.t <= 0)) { var e = this.abs(); if (e.t < d.t) return null != b && b.fromInt(0), void(null != c && this.copyTo(c)); null == c && (c = nbi()); var f = nbi(), g = this.s, h = a.s, i = this.DB - nbits(d[d.t - 1]); 0 < i ? (d.lShiftTo(i, f), e.lShiftTo(i, c)) : (d.copyTo(f), e.copyTo(c)); var j = f.t, k = f[j - 1]; if (0 != k) { var l = k * (1 << this.F1) + (1 < j ? f[j - 2] >> this.F2 : 0), m = this.FV / l, n = (1 << this.F1) / l, o = 1 << this.F2, p = c.t, q = p - j, r = null == b ? nbi() : b; for (f.dlShiftTo(q, r), 0 <= c.compareTo(r) && (c[c.t++] = 1, c.subTo(r, c)), BigInteger.ONE.dlShiftTo(j, r), r.subTo(f, f); f.t < j;) f[f.t++] = 0; for (; 0 <= --q;) { var s = c[--p] == k ? this.DM : Math.floor(c[p] * m + (c[p - 1] + o) * n); if ((c[p] += f.am(0, s, c, q, 0, j)) < s) for (f.dlShiftTo(q, r), c.subTo(r, c); c[p] < --s;) c.subTo(r, c) } null != b && (c.drShiftTo(j, b), g != h && BigInteger.ZERO.subTo(b, b)), c.t = j, c.clamp(), 0 < i && c.rShiftTo(i, c), g < 0 && BigInteger.ZERO.subTo(c, c) } } }, BigInteger.prototype.invDigit = function() { if (this.t < 1) return 0; var a = this[0]; if (0 == (1 & a)) return 0; var b = 3 & a; return 0 < (b = (b = (b = (b = b * (2 - (15 & a) * b) & 15) * (2 - (255 & a) * b) & 255) * (2 - ((65535 & a) * b & 65535)) & 65535) * (2 - a * b % this.DV) % this.DV) ? this.DV - b : -b }, BigInteger.prototype.isEven = function() { return 0 == (0 < this.t ? 1 & this[0] : this.s) }, BigInteger.prototype.exp = function(a, b) { if (4294967295 < a || a < 1) return BigInteger.ONE; var c = nbi(), d = nbi(), e = b.convert(this), f = nbits(a) - 1; for (e.copyTo(c); 0 <= --f;) if (b.sqrTo(c, d), 0 < (a & 1 << f)) b.mulTo(d, e, c); else { var g = c; c = d, d = g } return b.revert(c) }, BigInteger.prototype.toString = function(a) { if (this.s < 0) return "-" + this.negate().toString(a); var b; if (16 == a) b = 4; else if (8 == a) b = 3; else if (2 == a) b = 1; else if (32 == a) b = 5; else { if (4 != a) return this.toRadix(a); b = 2 } var c, d = (1 << b) - 1, e = !1, f = "", g = this.t, h = this.DB - g * this.DB % b; if (0 < g--) for (h < this.DB && 0 < (c = this[g] >> h) && (e = !0, f = int2char(c)); 0 <= g;) h < b ? (c = (this[g] & (1 << h) - 1) << b - h, c |= this[--g] >> (h += this.DB - b)) : (c = this[g] >> (h -= b) & d, h <= 0 && (h += this.DB, --g)), 0 < c && (e = !0), e && (f += int2char(c)); return e ? f : "0" }, BigInteger.prototype.negate = function() { var a = nbi(); return BigInteger.ZERO.subTo(this, a), a }, BigInteger.prototype.abs = function() { return this.s < 0 ? this.negate() : this }, BigInteger.prototype.compareTo = function(a) { var b = this.s - a.s; if (0 != b) return b; var c = this.t; if (0 != (b = c - a.t)) return this.s < 0 ? -b : b; for (; 0 <= --c;) if (0 != (b = this[c] - a[c])) return b; return 0 }, BigInteger.prototype.bitLength = function() { return this.t <= 0 ? 0 : this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM) }, BigInteger.prototype.mod = function(a) { var b = nbi(); return this.abs().divRemTo(a, null, b), this.s < 0 && 0 < b.compareTo(BigInteger.ZERO) && a.subTo(b, b), b }, BigInteger.prototype.modPowInt = function(a, b) { var c; return c = a < 256 || b.isEven() ? new Classic(b) : new Montgomery(b), this.exp(a, c) }, BigInteger.ZERO = nbv(0), BigInteger.ONE = nbv(1), NullExp.prototype.convert = nNop, NullExp.prototype.revert = nNop, NullExp.prototype.mulTo = function(a, b, c) { a.multiplyTo(b, c) }, NullExp.prototype.sqrTo = function(a, b) { a.squareTo(b) }, Barrett.prototype.convert = function(a) { if (a.s < 0 || a.t > 2 * this.m.t) return a.mod(this.m); if (a.compareTo(this.m) < 0) return a; var b = nbi(); return a.copyTo(b), this.reduce(b), b }, Barrett.prototype.revert = function(a) { return a }, Barrett.prototype.reduce = function(a) { for (a.drShiftTo(this.m.t - 1, this.r2), a.t > this.m.t + 1 && (a.t = this.m.t + 1, a.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); a.compareTo(this.r2) < 0;) a.dAddOffset(1, this.m.t + 1); for (a.subTo(this.r2, a); 0 <= a.compareTo(this.m);) a.subTo(this.m, a) }, Barrett.prototype.mulTo = function(a, b, c) { a.multiplyTo(b, c), this.reduce(c) }, Barrett.prototype.sqrTo = function(a, b) { a.squareTo(b), this.reduce(b) }; var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997], lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; BigInteger.prototype.chunkSize = function(a) { return Math.floor(Math.LN2 * this.DB / Math.log(a)) }, BigInteger.prototype.toRadix = function(a) { if (null == a && (a = 10), 0 == this.signum() || a < 2 || 36 < a) return "0"; var b = this.chunkSize(a), c = Math.pow(a, b), d = nbv(c), e = nbi(), f = nbi(), g = ""; for (this.divRemTo(d, e, f); 0 < e.signum();) g = (c + f.intValue()).toString(a).substr(1) + g, e.divRemTo(d, e, f); return f.intValue().toString(a) + g }, BigInteger.prototype.fromRadix = function(a, b) { this.fromInt(0), null == b && (b = 10); for (var c = this.chunkSize(b), d = Math.pow(b, c), e = !1, f = 0, g = 0, h = 0; h < a.length; ++h) { var i = intAt(a, h); i < 0 ? "-" == a.charAt(h) && 0 == this.signum() && (e = !0) : (g = b * g + i, ++f >= c && (this.dMultiply(d), this.dAddOffset(g, 0), g = f = 0)) } 0 < f && (this.dMultiply(Math.pow(b, f)), this.dAddOffset(g, 0)), e && BigInteger.ZERO.subTo(this, this) }, BigInteger.prototype.fromNumber = function(a, b, c) { if ("number" == typeof b) if (a < 2) this.fromInt(1); else for (this.fromNumber(a, c), this.testBit(a - 1) || this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(b);) this.dAddOffset(2, 0), this.bitLength() > a && this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); else { var d = new Array, e = 7 & a; d.length = 1 + (a >> 3), b.nextBytes(d), 0 < e ? d[0] &= (1 << e) - 1 : d[0] = 0, this.fromString(d, 256) } }, BigInteger.prototype.bitwiseTo = function(a, b, c) { var d, e, f = Math.min(a.t, this.t); for (d = 0; d < f; ++d) c[d] = b(this[d], a[d]); if (a.t < this.t) { for (e = a.s & this.DM, d = f; d < this.t; ++d) c[d] = b(this[d], e); c.t = this.t } else { for (e = this.s & this.DM, d = f; d < a.t; ++d) c[d] = b(e, a[d]); c.t = a.t } c.s = b(this.s, a.s), c.clamp() }, BigInteger.prototype.changeBit = function(a, b) { var c = BigInteger.ONE.shiftLeft(a); return this.bitwiseTo(c, b, c), c }, BigInteger.prototype.addTo = function(a, b) { for (var c = 0, d = 0, e = Math.min(a.t, this.t); c < e;) d += this[c] + a[c], b[c++] = d & this.DM, d >>= this.DB; if (a.t < this.t) { for (d += a.s; c < this.t;) d += this[c], b[c++] = d & this.DM, d >>= this.DB; d += this.s } else { for (d += this.s; c < a.t;) d += a[c], b[c++] = d & this.DM, d >>= this.DB; d += a.s } b.s = d < 0 ? -1 : 0, 0 < d ? b[c++] = d : d < -1 && (b[c++] = this.DV + d), b.t = c, b.clamp() }, BigInteger.prototype.dMultiply = function(a) { this[this.t] = this.am(0, a - 1, this, 0, 0, this.t), ++this.t, this.clamp() }, BigInteger.prototype.dAddOffset = function(a, b) { if (0 != a) { for (; this.t <= b;) this[this.t++] = 0; for (this[b] += a; this[b] >= this.DV;) this[b] -= this.DV, ++b >= this.t && (this[this.t++] = 0), ++this[b] } }, BigInteger.prototype.multiplyLowerTo = function(a, b, c) { var e, d = Math.min(this.t + a.t, b); for (c.s = 0, c.t = d; 0 < d;) c[--d] = 0; for (e = c.t - this.t; d < e; ++d) c[d + this.t] = this.am(0, a[d], c, d, 0, this.t); for (e = Math.min(a.t, b); d < e; ++d) this.am(0, a[d], c, d, 0, b - d); c.clamp() }, BigInteger.prototype.multiplyUpperTo = function(a, b, c) { --b; var d = c.t = this.t + a.t - b; for (c.s = 0; 0 <= --d;) c[d] = 0; for (d = Math.max(b - this.t, 0); d < a.t; ++d) c[this.t + d - b] = this.am(b - d, a[d], c, 0, 0, this.t + d - b); c.clamp(), c.drShiftTo(1, c) }, BigInteger.prototype.modInt = function(a) { if (a <= 0) return 0; var b = this.DV % a, c = this.s < 0 ? a - 1 : 0; if (0 < this.t) if (0 == b) c = this[0] % a; else for (var d = this.t - 1; 0 <= d; --d) c = (b * c + this[d]) % a; return c }, BigInteger.prototype.millerRabin = function(a) { var b = this.subtract(BigInteger.ONE), c = b.getLowestSetBit(); if (c <= 0) return !1; var d = b.shiftRight(c); lowprimes.length < (a = a + 1 >> 1) && (a = lowprimes.length); for (var e = nbi(), f = 0; f < a; ++f) { e.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); var g = e.modPow(d, this); if (0 != g.compareTo(BigInteger.ONE) && 0 != g.compareTo(b)) { for (var h = 1; h++ < c && 0 != g.compareTo(b);) if (0 == (g = g.modPowInt(2, this)).compareTo(BigInteger.ONE)) return !1; if (0 != g.compareTo(b)) return !1 } } return !0 }, BigInteger.prototype.clone = function() { var a = nbi(); return this.copyTo(a), a }, BigInteger.prototype.intValue = function() { if (this.s < 0) { if (1 == this.t) return this[0] - this.DV; if (0 == this.t) return -1 } else { if (1 == this.t) return this[0]; if (0 == this.t) return 0 } return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0] }, BigInteger.prototype.byteValue = function() { return 0 == this.t ? this.s : this[0] << 24 >> 24 }, BigInteger.prototype.shortValue = function() { return 0 == this.t ? this.s : this[0] << 16 >> 16 }, BigInteger.prototype.signum = function() { return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1 }, BigInteger.prototype.toByteArray = function() { var a = this.t, b = new Array; b[0] = this.s; var c, d = this.DB - a * this.DB % 8, e = 0; if (0 < a--) for (d < this.DB && (c = this[a] >> d) != (this.s & this.DM) >> d && (b[e++] = c | this.s << this.DB - d); 0 <= a;) d < 8 ? (c = (this[a] & (1 << d) - 1) << 8 - d, c |= this[--a] >> (d += this.DB - 8)) : (c = this[a] >> (d -= 8) & 255, d <= 0 && (d += this.DB, --a)), 0 != (128 & c) && (c |= -256), 0 == e && (128 & this.s) != (128 & c) && ++e, (0 < e || c != this.s) && (b[e++] = c); return b }, BigInteger.prototype.equals = function(a) { return 0 == this.compareTo(a) }, BigInteger.prototype.min = function(a) { return this.compareTo(a) < 0 ? this : a }, BigInteger.prototype.max = function(a) { return 0 < this.compareTo(a) ? this : a }, BigInteger.prototype.and = function(a) { var b = nbi(); return this.bitwiseTo(a, op_and, b), b }, BigInteger.prototype.or = function(a) { var b = nbi(); return this.bitwiseTo(a, op_or, b), b }, BigInteger.prototype.xor = function(a) { var b = nbi(); return this.bitwiseTo(a, op_xor, b), b }, BigInteger.prototype.andNot = function(a) { var b = nbi(); return this.bitwiseTo(a, op_andnot, b), b }, BigInteger.prototype.not = function() { for (var a = nbi(), b = 0; b < this.t; ++b) a[b] = this.DM & ~this[b]; return a.t = this.t, a.s = ~this.s, a }, BigInteger.prototype.shiftLeft = function(a) { var b = nbi(); return a < 0 ? this.rShiftTo(-a, b) : this.lShiftTo(a, b), b }, BigInteger.prototype.shiftRight = function(a) { var b = nbi(); return a < 0 ? this.lShiftTo(-a, b) : this.rShiftTo(a, b), b }, BigInteger.prototype.getLowestSetBit = function() { for (var a = 0; a < this.t; ++a) if (0 != this[a]) return a * this.DB + lbit(this[a]); return this.s < 0 ? this.t * this.DB : -1 }, BigInteger.prototype.bitCount = function() { for (var a = 0, b = this.s & this.DM, c = 0; c < this.t; ++c) a += cbit(this[c] ^ b); return a }, BigInteger.prototype.testBit = function(a) { var b = Math.floor(a / this.DB); return b >= this.t ? 0 != this.s : 0 != (this[b] & 1 << a % this.DB) }, BigInteger.prototype.setBit = function(a) { return this.changeBit(a, op_or) }, BigInteger.prototype.clearBit = function(a) { return this.changeBit(a, op_andnot) }, BigInteger.prototype.flipBit = function(a) { return this.changeBit(a, op_xor) }, BigInteger.prototype.add = function(a) { var b = nbi(); return this.addTo(a, b), b }, BigInteger.prototype.subtract = function(a) { var b = nbi(); return this.subTo(a, b), b }, BigInteger.prototype.multiply = function(a) { var b = nbi(); return this.multiplyTo(a, b), b }, BigInteger.prototype.divide = function(a) { var b = nbi(); return this.divRemTo(a, b, null), b }, BigInteger.prototype.remainder = function(a) { var b = nbi(); return this.divRemTo(a, null, b), b }, BigInteger.prototype.divideAndRemainder = function(a) { var b = nbi(), c = nbi(); return this.divRemTo(a, b, c), new Array(b, c) }, BigInteger.prototype.modPow = function(a, b) { var c, d, e = a.bitLength(), f = nbv(1); if (e <= 0) return f; c = e < 18 ? 1 : e < 48 ? 3 : e < 144 ? 4 : e < 768 ? 5 : 6, d = e < 8 ? new Classic(b) : b.isEven() ? new Barrett(b) : new Montgomery(b); var g = new Array, h = 3, i = c - 1, j = (1 << c) - 1; if (g[1] = d.convert(this), 1 < c) { var k = nbi(); for (d.sqrTo(g[1], k); h <= j;) g[h] = nbi(), d.mulTo(k, g[h - 2], g[h]), h += 2 } var l, m, n = a.t - 1, o = !0, p = nbi(); for (e = nbits(a[n]) - 1; 0 <= n;) { for (i <= e ? l = a[n] >> e - i & j : (l = (a[n] & (1 << e + 1) - 1) << i - e, 0 < n && (l |= a[n - 1] >> this.DB + e - i)), h = c; 0 == (1 & l);) l >>= 1, --h; if ((e -= h) < 0 && (e += this.DB, --n), o) g[l].copyTo(f), o = !1; else { for (; 1 < h;) d.sqrTo(f, p), d.sqrTo(p, f), h -= 2; 0 < h ? d.sqrTo(f, p) : (m = f, f = p, p = m), d.mulTo(p, g[l], f) } for (; 0 <= n && 0 == (a[n] & 1 << e);) d.sqrTo(f, p), m = f, f = p, p = m, --e < 0 && (e = this.DB - 1, --n) } return d.revert(f) }, BigInteger.prototype.modInverse = function(a) { var b = a.isEven(); if (this.isEven() && b || 0 == a.signum()) return BigInteger.ZERO; for (var c = a.clone(), d = this.clone(), e = nbv(1), f = nbv(0), g = nbv(0), h = nbv(1); 0 != c.signum();) { for (; c.isEven();) c.rShiftTo(1, c), b ? (e.isEven() && f.isEven() || (e.addTo(this, e), f.subTo(a, f)), e.rShiftTo(1, e)) : f.isEven() || f.subTo(a, f), f.rShiftTo(1, f); for (; d.isEven();) d.rShiftTo(1, d), b ? (g.isEven() && h.isEven() || (g.addTo(this, g), h.subTo(a, h)), g.rShiftTo(1, g)) : h.isEven() || h.subTo(a, h), h.rShiftTo(1, h); 0 <= c.compareTo(d) ? (c.subTo(d, c), b && e.subTo(g, e), f.subTo(h, f)) : (d.subTo(c, d), b && g.subTo(e, g), h.subTo(f, h)) } return 0 != d.compareTo(BigInteger.ONE) ? BigInteger.ZERO : 0 <= h.compareTo(a) ? h.subtract(a) : h.signum() < 0 ? (h.addTo(a, h), h.signum() < 0 ? h.add(a) : h) : h }, BigInteger.prototype.pow = function(a) { return this.exp(a, new NullExp) }, BigInteger.prototype.gcd = function(a) { var b = this.s < 0 ? this.negate() : this.clone(), c = a.s < 0 ? a.negate() : a.clone(); if (b.compareTo(c) < 0) { var d = b; b = c, c = d } var e = b.getLowestSetBit(), f = c.getLowestSetBit(); if (f < 0) return b; for (e < f && (f = e), 0 < f && (b.rShiftTo(f, b), c.rShiftTo(f, c)); 0 < b.signum();) 0 < (e = b.getLowestSetBit()) && b.rShiftTo(e, b), 0 < (e = c.getLowestSetBit()) && c.rShiftTo(e, c), 0 <= b.compareTo(c) ? (b.subTo(c, b), b.rShiftTo(1, b)) : (c.subTo(b, c), c.rShiftTo(1, c)); return 0 < f && c.lShiftTo(f, c), c }, BigInteger.prototype.isProbablePrime = function(a) { var b, c = this.abs(); if (1 == c.t && c[0] <= lowprimes[lowprimes.length - 1]) { for (b = 0; b < lowprimes.length; ++b) if (c[0] == lowprimes[b]) return !0; return !1 } if (c.isEven()) return !1; for (b = 1; b < lowprimes.length;) { for (var d = lowprimes[b], e = b + 1; e < lowprimes.length && d < lplim;) d *= lowprimes[e++]; for (d = c.modInt(d); b < e;) if (d % lowprimes[b++] == 0) return !1 } return c.millerRabin(a) }, BigInteger.prototype.square = function() { var a = nbi(); return this.squareTo(a), a }, Arcfour.prototype.init = function(a) { var b, c, d; for (b = 0; b < 256; ++b) this.S[b] = b; for (b = c = 0; b < 256; ++b) c = c + this.S[b] + a[b % a.length] & 255, d = this.S[b], this.S[b] = this.S[c], this.S[c] = d; this.i = 0, this.j = 0 }, Arcfour.prototype.next = function() { var a; return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, a = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = a, this.S[a + this.S[this.i] & 255] }; var rng_state, rng_pool, rng_pptr, rng_psize = 256; if (null == rng_pool) { var t; if (rng_pool = new Array, rng_pptr = 0, window.crypto && window.crypto.getRandomValues) { var z = new Uint32Array(256); for (window.crypto.getRandomValues(z), t = 0; t < z.length; ++t) rng_pool[rng_pptr++] = 255 & z[t] } var onMouseMoveListener = function(a) { if (this.count = this.count || 0, 256 <= this.count || rng_psize <= rng_pptr) window.removeEventListener ? window.removeEventListener("mousemove", onMouseMoveListener) : window.detachEvent && window.detachEvent("onmousemove", onMouseMoveListener); else { this.count += 1; var b = a.x + a.y; rng_pool[rng_pptr++] = 255 & b } }; window.addEventListener ? window.addEventListener("mousemove", onMouseMoveListener) : window.attachEvent && window.attachEvent("onmousemove", onMouseMoveListener) } SecureRandom.prototype.nextBytes = function(a) { var b; for (b = 0; b < a.length; ++b) a[b] = rng_get_byte() }, RSAKey.prototype.doPublic = function(a) { return a.modPowInt(this.e, this.n) }, RSAKey.prototype.setPublic = function(a, b) { null != a && null != b && 0 < a.length && 0 < b.length ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16)) : console.error("Invalid RSA public key") }, RSAKey.prototype.encrypt = function(a) { var b = function(a, b) { if (b < a.length + 11) return console.error("Message too long for RSA"), null; for (var c = new Array, d = a.length - 1; 0 <= d && 0 < b;) { var e = a.charCodeAt(d--); e < 128 ? c[--b] = e : 127 < e && e < 2048 ? (c[--b] = 63 & e | 128, c[--b] = e >> 6 | 192) : (c[--b] = 63 & e | 128, c[--b] = e >> 6 & 63 | 128, c[--b] = e >> 12 | 224) } c[--b] = 0; for (var f = new SecureRandom, g = new Array; 2 < b;) { for (g[0] = 0; 0 == g[0];) f.nextBytes(g); c[--b] = g[0] } return c[--b] = 2, c[--b] = 0, new BigInteger(c) }(a, this.n.bitLength() + 7 >> 3); if (null == b) return null; var c = this.doPublic(b); if (null == c) return null; var d = c.toString(16); return 0 == (1 & d.length) ? d : "0" + d }, RSAKey.prototype.doPrivate = function(a) { if (null == this.p || null == this.q) return a.modPow(this.d, this.n); for (var b = a.mod(this.p).modPow(this.dmp1, this.p), c = a.mod(this.q).modPow(this.dmq1, this.q); b.compareTo(c) < 0;) b = b.add(this.p); return b.subtract(c).multiply(this.coeff).mod(this.p).multiply(this.q).add(c) }, RSAKey.prototype.setPrivate = function(a, b, c) { null != a && null != b && 0 < a.length && 0 < b.length ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16), this.d = parseBigInt(c, 16)) : console.error("Invalid RSA private key") }, RSAKey.prototype.setPrivateEx = function(a, b, c, d, e, f, g, h) { null != a && null != b && 0 < a.length && 0 < b.length ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16), this.d = parseBigInt(c, 16), this.p = parseBigInt(d, 16), this.q = parseBigInt(e, 16), this.dmp1 = parseBigInt(f, 16), this.dmq1 = parseBigInt(g, 16), this.coeff = parseBigInt(h, 16)) : console.error("Invalid RSA private key") }, RSAKey.prototype.generate = function(a, b) { var c = new SecureRandom, d = a >> 1; this.e = parseInt(b, 16); for (var e = new BigInteger(b, 16);;) { for (; this.p = new BigInteger(a - d, 1, c), 0 != this.p.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE) || !this.p.isProbablePrime(10);); for (; this.q = new BigInteger(d, 1, c), 0 != this.q.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE) || !this.q.isProbablePrime(10);); if (this.p.compareTo(this.q) <= 0) { var f = this.p; this.p = this.q, this.q = f } var g = this.p.subtract(BigInteger.ONE), h = this.q.subtract(BigInteger.ONE), i = g.multiply(h); if (0 == i.gcd(e).compareTo(BigInteger.ONE)) { this.n = this.p.multiply(this.q), this.d = e.modInverse(i), this.dmp1 = this.d.mod(g), this.dmq1 = this.d.mod(h), this.coeff = this.q.modInverse(this.p); break } } }, RSAKey.prototype.decrypt = function(a) { var b = parseBigInt(a, 16), c = this.doPrivate(b); return null == c ? null : function(a, b) { for (var c = a.toByteArray(), d = 0; d < c.length && 0 == c[d];)++d; if (c.length - d != b - 1 || 2 != c[d]) return null; for (++d; 0 != c[d];) if (++d >= c.length) return null; for (var e = ""; ++d < c.length;) { var f = 255 & c[d]; f < 128 ? e += String.fromCharCode(f) : 191 < f && f < 224 ? (e += String.fromCharCode((31 & f) << 6 | 63 & c[d + 1]), ++d) : (e += String.fromCharCode((15 & f) << 12 | (63 & c[d + 1]) << 6 | 63 & c[d + 2]), d += 2) } return e }(c, this.n.bitLength() + 7 >> 3) }, function() { RSAKey.prototype.generateAsync = function(a, b, c) { var d = new SecureRandom, e = a >> 1; this.e = parseInt(b, 16); var f = new BigInteger(b, 16), g = this, h = function() { var b = function() { if (g.p.compareTo(g.q) <= 0) { var a = g.p; g.p = g.q, g.q = a } var b = g.p.subtract(BigInteger.ONE), d = g.q.subtract(BigInteger.ONE), e = b.multiply(d); 0 == e.gcd(f).compareTo(BigInteger.ONE) ? (g.n = g.p.multiply(g.q), g.d = f.modInverse(e), g.dmp1 = g.d.mod(b), g.dmq1 = g.d.mod(d), g.coeff = g.q.modInverse(g.p), setTimeout(function() { c() }, 0)) : setTimeout(h, 0) }, i = function() { g.q = nbi(), g.q.fromNumberAsync(e, 1, d, function() { g.q.subtract(BigInteger.ONE).gcda(f, function(a) { 0 == a.compareTo(BigInteger.ONE) && g.q.isProbablePrime(10) ? setTimeout(b, 0) : setTimeout(i, 0) }) }) }, j = function() { g.p = nbi(), g.p.fromNumberAsync(a - e, 1, d, function() { g.p.subtract(BigInteger.ONE).gcda(f, function(a) { 0 == a.compareTo(BigInteger.ONE) && g.p.isProbablePrime(10) ? setTimeout(i, 0) : setTimeout(j, 0) }) }) }; setTimeout(j, 0) }; setTimeout(h, 0) }; BigInteger.prototype.gcda = function(a, b) { var c = this.s < 0 ? this.negate() : this.clone(), d = a.s < 0 ? a.negate() : a.clone(); if (c.compareTo(d) < 0) { var e = c; c = d, d = e } var f = c.getLowestSetBit(), g = d.getLowestSetBit(); if (g < 0) b(c); else { f < g && (g = f), 0 < g && (c.rShiftTo(g, c), d.rShiftTo(g, d)); var h = function() { 0 < (f = c.getLowestSetBit()) && c.rShiftTo(f, c), 0 < (f = d.getLowestSetBit()) && d.rShiftTo(f, d), 0 <= c.compareTo(d) ? (c.subTo(d, c), c.rShiftTo(1, c)) : (d.subTo(c, d), d.rShiftTo(1, d)), 0 < c.signum() ? setTimeout(h, 0) : (0 < g && d.lShiftTo(g, d), setTimeout(function() { b(d) }, 0)) }; setTimeout(h, 10) } }; BigInteger.prototype.fromNumberAsync = function(a, b, c, d) { if ("number" == typeof b) if (a < 2) this.fromInt(1); else { this.fromNumber(a, c), this.testBit(a - 1) || this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this), this.isEven() && this.dAddOffset(1, 0); var e = this, f = function() { e.dAddOffset(2, 0), e.bitLength() > a && e.subTo(BigInteger.ONE.shiftLeft(a - 1), e), e.isProbablePrime(b) ? setTimeout(function() { d() }, 0) : setTimeout(f, 0) }; setTimeout(f, 0) } else { var g = new Array, h = 7 & a; g.length = 1 + (a >> 3), b.nextBytes(g), 0 < h ? g[0] &= (1 << h) - 1 : g[0] = 0, this.fromString(g, 256) } } }(); var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", b64pad = "=", JSX = JSX || {}; JSX.env = JSX.env || {}; var L = JSX, OP = Object.prototype, ADD = ["toString", "valueOf"]; JSX.env.parseUA = function(a) { function c(a) { var b = 0; return parseFloat(a.replace(/\./g, function() { return 1 == b++ ? "" : "." })) } var b, d = navigator, e = { ie: 0, opera: 0, gecko: 0, webkit: 0, chrome: 0, mobile: null, air: 0, ipad: 0, iphone: 0, ipod: 0, ios: null, android: 0, webos: 0, caja: d && d.cajaVersion, secure: !1, os: null }, f = a || navigator && navigator.userAgent, g = window && window.location, h = g && g.href; return e.secure = h && 0 === h.toLowerCase().indexOf("https"), f && (/windows|win32/i.test(f) ? e.os = "windows" : /macintosh/i.test(f) ? e.os = "macintosh" : /rhino/i.test(f) && (e.os = "rhino"), /KHTML/.test(f) && (e.webkit = 1), (b = f.match(/AppleWebKit\/([^\s]*)/)) && b[1] && (e.webkit = c(b[1]), / Mobile\//.test(f) ? (e.mobile = "Apple", (b = f.match(/OS ([^\s]*)/)) && b[1] && (b = c(b[1].replace("_", "."))), e.ios = b, e.ipad = e.ipod = e.iphone = 0, (b = f.match(/iPad|iPod|iPhone/)) && b[0] && (e[b[0].toLowerCase()] = e.ios)) : ((b = f.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/)) && (e.mobile = b[0]), /webOS/.test(f) && (e.mobile = "WebOS", (b = f.match(/webOS\/([^\s]*);/)) && b[1] && (e.webos = c(b[1]))), / Android/.test(f) && (e.mobile = "Android", (b = f.match(/Android ([^\s]*);/)) && b[1] && (e.android = c(b[1])))), (b = f.match(/Chrome\/([^\s]*)/)) && b[1] ? e.chrome = c(b[1]) : (b = f.match(/AdobeAIR\/([^\s]*)/)) && (e.air = b[0])), e.webkit || ((b = f.match(/Opera[\s\/]([^\s]*)/)) && b[1] ? (e.opera = c(b[1]), (b = f.match(/Version\/([^\s]*)/)) && b[1] && (e.opera = c(b[1])), (b = f.match(/Opera Mini[^;]*/)) && (e.mobile = b[0])) : (b = f.match(/MSIE\s([^;]*)/)) && b[1] ? e.ie = c(b[1]) : (b = f.match(/Gecko\/([^\s]*)/)) && (e.gecko = 1, (b = f.match(/rv:([^\s\)]*)/)) && b[1] && (e.gecko = c(b[1]))))), e }, JSX.env.ua = JSX.env.parseUA(), JSX.isFunction = function(a) { return "function" == typeof a || "[object Function]" === OP.toString.apply(a) }, JSX._IEEnumFix = JSX.env.ua.ie ? function(a, b) { var c, d, e; for (c = 0; c < ADD.length; c += 1) e = b[d = ADD[c]], L.isFunction(e) && e != OP[d] && (a[d] = e) } : function() {}, JSX.extend = function(a, b, c) { if (!b || !a) throw new Error("extend failed, please check that all dependencies are included."); function e() {} var d; if (e.prototype = b.prototype, a.prototype = new e, (a.prototype.constructor = a).superclass = b.prototype, b.prototype.constructor == OP.constructor && (b.prototype.constructor = b), c) { for (d in c) L.hasOwnProperty(c, d) && (a.prototype[d] = c[d]); L._IEEnumFix(a.prototype, c) } }, "undefined" != typeof KJUR && KJUR || (KJUR = {}), void 0 !== KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}), KJUR.asn1.ASN1Util = new function() { this.integerToByteHex = function(a) { var b = a.toString(16); return b.length % 2 == 1 && (b = "0" + b), b }, this.bigIntToMinTwosComplementsHex = function(a) { var b = a.toString(16); if ("-" != b.substr(0, 1)) b.length % 2 == 1 ? b = "0" + b : b.match(/^[0-7]/) || (b = "00" + b); else { var d = b.substr(1).length; d % 2 == 1 ? d += 1 : b.match(/^[0-7]/) || (d += 2); for (var e = "", f = 0; f < d; f++) e += "f"; b = new BigInteger(e, 16).xor(a).add(BigInteger.ONE).toString(16).replace(/^-/, "") } return b }, this.getPEMStringFromHex = function(a, b) { var c = CryptoJS.enc.Hex.parse(a), e = CryptoJS.enc.Base64.stringify(c).replace(/(.{64})/g, "$1\r\n"); return "-----BEGIN " + b + "-----\r\n" + (e = e.replace(/\r\n$/, "")) + "\r\n-----END " + b + "-----\r\n" } }, KJUR.asn1.ASN1Object = function() { this.getLengthHexFromValue = function() { if (void 0 === this.hV || null == this.hV) throw "this.hV is null or undefined."; if (this.hV.length % 2 == 1) throw "value hex must be even length: n=" + "".length + ",v=" + this.hV; var b = this.hV.length / 2, c = b.toString(16); if (c.length % 2 == 1 && (c = "0" + c), b < 128) return c; var d = c.length / 2; if (15 < d) throw "ASN.1 length too long to represent by 8x: n = " + b.toString(16); return (128 + d).toString(16) + c }, this.getEncodedHex = function() { return null != this.hTLV && !this.isModified || (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1), this.hTLV }, this.getValueHex = function() { return this.getEncodedHex(), this.hV }, this.getFreshValueHex = function() { return "" } }, KJUR.asn1.DERAbstractString = function(a) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this), this.getString = function() { return this.s }, this.setString = function(a) { this.hTLV = null, this.isModified = !0, this.s = a, this.hV = stohex(this.s) }, this.setStringHex = function(a) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = a }, this.getFreshValueHex = function() { return this.hV }, void 0 !== a && (void 0 !== a.str ? this.setString(a.str) : void 0 !== a.hex && this.setStringHex(a.hex)) }, JSX.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object), KJUR.asn1.DERAbstractTime = function() { KJUR.asn1.DERAbstractTime.superclass.constructor.call(this), this.localDateToUTC = function(a) { return utc = a.getTime() + 6e4 * a.getTimezoneOffset(), new Date(utc) }, this.formatDate = function(a, b) { var c = this.zeroPadding, d = this.localDateToUTC(a), e = String(d.getFullYear()); return "utc" == b && (e = e.substr(2, 2)), e + c(String(d.getMonth() + 1), 2) + c(String(d.getDate()), 2) + c(String(d.getHours()), 2) + c(String(d.getMinutes()), 2) + c(String(d.getSeconds()), 2) + "Z" }, this.zeroPadding = function(a, b) { return a.length >= b ? a : new Array(b - a.length + 1).join("0") + a }, this.getString = function() { return this.s }, this.setString = function(a) { this.hTLV = null, this.isModified = !0, this.s = a, this.hV = stohex(this.s) }, this.setByDateValue = function(a, b, c, d, e, f) { var g = new Date(Date.UTC(a, b - 1, c, d, e, f, 0)); this.setByDate(g) }, this.getFreshValueHex = function() { return this.hV } }, JSX.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object), KJUR.asn1.DERAbstractStructured = function(a) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this), this.setByASN1ObjectArray = function(a) { this.hTLV = null, this.isModified = !0, this.asn1Array = a }, this.appendASN1Object = function(a) { this.hTLV = null, this.isModified = !0, this.asn1Array.push(a) }, this.asn1Array = new Array, void 0 !== a && void 0 !== a.array && (this.asn1Array = a.array) }, JSX.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object), KJUR.asn1.DERBoolean = function() { KJUR.asn1.DERBoolean.superclass.constructor.call(this), this.hT = "01", this.hTLV = "0101ff" }, JSX.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object), KJUR.asn1.DERInteger = function(a) { KJUR.asn1.DERInteger.superclass.constructor.call(this), this.hT = "02", this.setByBigInteger = function(a) { this.hTLV = null, this.isModified = !0, this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(a) }, this.setByInteger = function(a) { var b = new BigInteger(String(a), 10); this.setByBigInteger(b) }, this.setValueHex = function(a) { this.hV = a }, this.getFreshValueHex = function() { return this.hV }, void 0 !== a && (void 0 !== a.bigint ? this.setByBigInteger(a.bigint) : void 0 !== a.int ? this.setByInteger(a.int) : void 0 !== a.hex && this.setValueHex(a.hex)) }, JSX.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object), KJUR.asn1.DERBitString = function(a) { KJUR.asn1.DERBitString.superclass.constructor.call(this), this.hT = "03", this.setHexValueIncludingUnusedBits = function(a) { this.hTLV = null, this.isModified = !0, this.hV = a }, this.setUnusedBitsAndHexValue = function(a, b) { if (a < 0 || 7 < a) throw "unused bits shall be from 0 to 7: u = " + a; var c = "0" + a; this.hTLV = null, this.isModified = !0, this.hV = c + b }, this.setByBinaryString = function(a) { var b = 8 - (a = a.replace(/0+$/, "")).length % 8; 8 == b && (b = 0); for (var c = 0; c <= b; c++) a += "0"; var d = ""; for (c = 0; c < a.length - 1; c += 8) { var e = a.substr(c, 8), f = parseInt(e, 2).toString(16); 1 == f.length && (f = "0" + f), d += f } this.hTLV = null, this.isModified = !0, this.hV = "0" + b + d }, this.setByBooleanArray = function(a) { for (var b = "", c = 0; c < a.length; c++) b += 1 == a[c] ? "1" : "0"; this.setByBinaryString(b) }, this.newFalseArray = function(a) { for (var b = new Array(a), c = 0; c < a; c++) b[c] = !1; return b }, this.getFreshValueHex = function() { return this.hV }, void 0 !== a && (void 0 !== a.hex ? this.setHexValueIncludingUnusedBits(a.hex) : void 0 !== a.bin ? this.setByBinaryString(a.bin) : void 0 !== a.array && this.setByBooleanArray(a.array)) }, JSX.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object), KJUR.asn1.DEROctetString = function(a) { KJUR.asn1.DEROctetString.superclass.constructor.call(this, a), this.hT = "04" }, JSX.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERNull = function() { KJUR.asn1.DERNull.superclass.constructor.call(this), this.hT = "05", this.hTLV = "0500" }, JSX.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object), KJUR.asn1.DERObjectIdentifier = function(a) { var b = function(a) { var b = a.toString(16); return 1 == b.length && (b = "0" + b), b }, c = function(a) { var c = "", e = new BigInteger(a, 10).toString(2), f = 7 - e.length % 7; 7 == f && (f = 0); for (var g = "", h = 0; h < f; h++) g += "0"; e = g + e; for (h = 0; h < e.length - 1; h += 7) { var i = e.substr(h, 7); h != e.length - 7 && (i = "1" + i), c += b(parseInt(i, 2)) } return c }; KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this), this.hT = "06", this.setValueHex = function(a) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = a }, this.setValueOidString = function(a) { if (!a.match(/^[0-9.]+$/)) throw "malformed oid string: " + a; var d = "", e = a.split("."), f = 40 * parseInt(e[0]) + parseInt(e[1]); d += b(f), e.splice(0, 2); for (var g = 0; g < e.length; g++) d += c(e[g]); this.hTLV = null, this.isModified = !0, this.s = null, this.hV = d }, this.setValueName = function(a) { if (void 0 === KJUR.asn1.x509.OID.name2oidList[a]) throw "DERObjectIdentifier oidName undefined: " + a; var b = KJUR.asn1.x509.OID.name2oidList[a]; this.setValueOidString(b) }, this.getFreshValueHex = function() { return this.hV }, void 0 !== a && (void 0 !== a.oid ? this.setValueOidString(a.oid) : void 0 !== a.hex ? this.setValueHex(a.hex) : void 0 !== a.name && this.setValueName(a.name)) }, JSX.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object), KJUR.asn1.DERUTF8String = function(a) { KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a), this.hT = "0c" }, JSX.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString), KJUR.asn1.DERNumericString = function(a) { KJUR.asn1.DERNumericString.superclass.constructor.call(this, a), this.hT = "12" }, JSX.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERPrintableString = function(a) { KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a), this.hT = "13" }, JSX.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERTeletexString = function(a) { KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a), this.hT = "14" }, JSX.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERIA5String = function(a) { KJUR.asn1.DERIA5String.superclass.constructor.call(this, a), this.hT = "16" }, JSX.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString), KJUR.asn1.DERUTCTime = function(a) { KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a), this.hT = "17", this.setByDate = function(a) { this.hTLV = null, this.isModified = !0, this.date = a, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s) }, void 0 !== a && (void 0 !== a.str ? this.setString(a.str) : void 0 !== a.hex ? this.setStringHex(a.hex) : void 0 !== a.date && this.setByDate(a.date)) }, JSX.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime), KJUR.asn1.DERGeneralizedTime = function(a) { KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a), this.hT = "18", this.setByDate = function(a) { this.hTLV = null, this.isModified = !0, this.date = a, this.s = this.formatDate(this.date, "gen"), this.hV = stohex(this.s) }, void 0 !== a && (void 0 !== a.str ? this.setString(a.str) : void 0 !== a.hex ? this.setStringHex(a.hex) : void 0 !== a.date && this.setByDate(a.date)) }, JSX.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime), KJUR.asn1.DERSequence = function(a) { KJUR.asn1.DERSequence.superclass.constructor.call(this, a), this.hT = "30", this.getFreshValueHex = function() { for (var a = "", b = 0; b < this.asn1Array.length; b++) { a += this.asn1Array[b].getEncodedHex() } return this.hV = a, this.hV } }, JSX.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured), KJUR.asn1.DERSet = function(a) { KJUR.asn1.DERSet.superclass.constructor.call(this, a), this.hT = "31", this.getFreshValueHex = function() { for (var a = new Array, b = 0; b < this.asn1Array.length; b++) { var c = this.asn1Array[b]; a.push(c.getEncodedHex()) } return a.sort(), this.hV = a.join(""), this.hV } }, JSX.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured), KJUR.asn1.DERTaggedObject = function(a) { KJUR.asn1.DERTaggedObject.superclass.constructor.call(this), this.hT = "a0", this.hV = "", this.isExplicit = !0, this.asn1Object = null, this.setASN1Object = function(a, b, c) { this.hT = b, this.isExplicit = a, this.asn1Object = c, this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = c.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, b), this.isModified = !1) }, this.getFreshValueHex = function() { return this.hV }, void 0 !== a && (void 0 !== a.tag && (this.hT = a.tag), void 0 !== a.explicit && (this.isExplicit = a.explicit), void 0 !== a.obj && (this.asn1Object = a.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object))) }, JSX.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object), function(a) { "use strict"; var b, c = { decode: function(c) { var d; if (b === a) { var e = "0123456789ABCDEF", f = " \f\n\r\t聽\u2028\u2029"; for (b = [], d = 0; d < 16; ++d) b[e.charAt(d)] = d; for (e = e.toLowerCase(), d = 10; d < 16; ++d) b[e.charAt(d)] = d; for (d = 0; d < f.length; ++d) b[f.charAt(d)] = -1 } var g = [], h = 0, i = 0; for (d = 0; d < c.length; ++d) { var j = c.charAt(d); if ("=" == j) break; if (-1 != (j = b[j])) { if (j === a) throw "Illegal character at offset " + d; h |= j, 2 <= ++i ? (g[g.length] = h, i = h = 0) : h <<= 4 } } if (i) throw "Hex encoding incomplete: 4 bits missing"; return g } }; window.Hex = c }(), function(a) { "use strict"; var b, c = { decode: function(c) { var d; if (b === a) { var f = "= \f\n\r\t聽\u2028\u2029"; for (b = [], d = 0; d < 64; ++d) b["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d)] = d; for (d = 0; d < f.length; ++d) b[f.charAt(d)] = -1 } var g = [], h = 0, i = 0; for (d = 0; d < c.length; ++d) { var j = c.charAt(d); if ("=" == j) break; if (-1 != (j = b[j])) { if (j === a) throw "Illegal character at offset " + d; h |= j, 4 <= ++i ? (g[g.length] = h >> 16, g[g.length] = h >> 8 & 255, g[g.length] = 255 & h, i = h = 0) : h <<= 6 } } switch (i) { case 1: throw "Base64 encoding incomplete: at least 2 bits missing"; case 2: g[g.length] = h >> 10; break; case 3: g[g.length] = h >> 16, g[g.length] = h >> 8 & 255 } return g }, re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/, unarmor: function(a) { var b = c.re.exec(a); if (b) if (b[1]) a = b[1]; else { if (!b[2]) throw "RegExp out of sync"; a = b[2] } return c.decode(a) } }; window.Base64 = c }(), function(a) { "use strict"; function b(a, c) { a instanceof b ? (this.enc = a.enc, this.pos = a.pos) : (this.enc = a, this.pos = c) } function c(a, b, c, d, e) { this.stream = a, this.header = b, this.length = c, this.tag = d, this.sub = e } var d = 100, f_tag = function(a, b) { var c = document.createElement(a); return c.className = b, c }, f_text = function(a) { return document.createTextNode(a) }; b.prototype.get = function(b) { if (b === a && (b = this.pos++), b >= this.enc.length) throw "Requesting byte offset " + b + " on a stream of length " + this.enc.length; return this.enc[b] }, b.prototype.hexDigits = "0123456789ABCDEF", b.prototype.hexByte = function(a) { return this.hexDigits.charAt(a >> 4 & 15) + this.hexDigits.charAt(15 & a) }, b.prototype.hexDump = function(a, b, c) { for (var d = "", e = a; e < b; ++e) if (d += this.hexByte(this.get(e)), !0 !== c) switch (15 & e) { case 7: d += " "; break; case 15: d += "\n"; break; default: d += " " } return d }, b.prototype.parseStringISO = function(a, b) { for (var c = "", d = a; d < b; ++d) c += String.fromCharCode(this.get(d)); return c }, b.prototype.parseStringUTF = function(a, b) { for (var c = "", d = a; d < b;) { var e = this.get(d++); c += String.fromCharCode(e < 128 ? e : 191 < e && e < 224 ? (31 & e) << 6 | 63 & this.get(d++) : (15 & e) << 12 | (63 & this.get(d++)) << 6 | 63 & this.get(d++)) } return c }, b.prototype.parseStringBMP = function(a, b) { for (var c = "", d = a; d < b; d += 2) { var e = this.get(d), f = this.get(d + 1); c += String.fromCharCode((e << 8) + f) } return c }, b.prototype.reTime = /^((?:1[89]|2\d)?\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, b.prototype.parseTime = function(a, b) { var c = this.parseStringISO(a, b), d = this.reTime.exec(c); return d ? (c = d[1] + "-" + d[2] + "-" + d[3] + " " + d[4], d[5] && (c += ":" + d[5], d[6] && (c += ":" + d[6], d[7] && (c += "." + d[7]))), d[8] && (c += " UTC", "Z" != d[8] && (c += d[8], d[9] && (c += ":" + d[9]))), c) : "Unrecognized time: " + c }, b.prototype.parseInteger = function(a, b) { var c = b - a; if (4 < c) { c <<= 3; var d = this.get(a); if (0 === d) c -= 8; else for (; d < 128;) d <<= 1, --c; return "(" + c + " bit)" } for (var e = 0, f = a; f < b; ++f) e = e << 8 | this.get(f); return e }, b.prototype.parseBitString = function(a, b) { var c = this.get(a), d = (b - a - 1 << 3) - c, e = "(" + d + " bit)"; if (d <= 20) { var f = c; e += " "; for (var g = b - 1; a < g; --g) { for (var h = this.get(g), i = f; i < 8; ++i) e += h >> i & 1 ? "1" : "0"; f = 0 } } return e }, b.prototype.parseOctetString = function(a, b) { var c = b - a, f = "(" + c + " byte) "; d < c && (b = a + d); for (var g = a; g < b; ++g) f += this.hexByte(this.get(g)); return d < c && (f += "鈥?"), f }, b.prototype.parseOID = function(a, b) { for (var c = "", d = 0, e = 0, f = a; f < b; ++f) { var g = this.get(f); if (d = d << 7 | 127 & g, e += 7, !(128 & g)) { if ("" === c) { var h = d < 80 ? d < 40 ? 0 : 1 : 2; c = h + "." + (d - 40 * h) } else c += "." + (31 <= e ? "bigint" : d); d = e = 0 } } return c }, c.prototype.typeName = function() { if (this.tag === a) return "unknown"; var b = this.tag >> 6, c = (this.tag, 31 & this.tag); switch (b) { case 0: switch (c) { case 0: return "EOC"; case 1: return "BOOLEAN"; case 2: return "INTEGER"; case 3: return "BIT_STRING"; case 4: return "OCTET_STRING"; case 5: return "NULL"; case 6: return "OBJECT_IDENTIFIER"; case 7: return "ObjectDescriptor"; case 8: return "EXTERNAL"; case 9: return "REAL"; case 10: return "ENUMERATED"; case 11: return "EMBEDDED_PDV"; case 12: return "UTF8String"; case 16: return "SEQUENCE"; case 17: return "SET"; case 18: return "NumericString"; case 19: return "PrintableString"; case 20: return "TeletexString"; case 21: return "VideotexString"; case 22: return "IA5String"; case 23: return "UTCTime"; case 24: return "GeneralizedTime"; case 25: return "GraphicString"; case 26: return "VisibleString"; case 27: return "GeneralString"; case 28: return "UniversalString"; case 30: return "BMPString"; default: return "Universal_" + c.toString(16) } case 1: return "Application_" + c.toString(16); case 2: return "[" + c + "]"; case 3: return "Private_" + c.toString(16) } }, c.prototype.reSeemsASCII = /^[ -~]+$/, c.prototype.content = function() { if (this.tag === a) return null; var b = this.tag >> 6, c = 31 & this.tag, f = this.posContent(), g = Math.abs(this.length); if (0 != b) { if (null !== this.sub) return "(" + this.sub.length + " elem)"; var h = this.stream.parseStringISO(f, f + Math.min(g, d)); return this.reSeemsASCII.test(h) ? h.substring(0, 200) + (200 < h.length ? "鈥?" : "") : this.stream.parseOctetString(f, f + g) } switch (c) { case 1: return 0 === this.stream.get(f) ? "false" : "true"; case 2: return this.stream.parseInteger(f, f + g); case 3: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(f, f + g); case 4: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(f, f + g); case 6: return this.stream.parseOID(f, f + g); case 16: case 17: return "(" + this.sub.length + " elem)"; case 12: return this.stream.parseStringUTF(f, f + g); case 18: case 19: case 20: case 21: case 22: case 26: return this.stream.parseStringISO(f, f + g); case 30: return this.stream.parseStringBMP(f, f + g); case 23: case 24: return this.stream.parseTime(f, f + g) } return null }, c.prototype.toString = function() { return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (null === this.sub ? "null" : this.sub.length) + "]" }, c.prototype.print = function(b) { if (b === a && (b = ""), document.writeln(b + this), null !== this.sub) { b += " "; for (var c = 0, d = this.sub.length; c < d; ++c) this.sub[c].print(b) } }, c.prototype.toPrettyString = function(b) { b === a && (b = ""); var c = b + this.typeName() + " @" + this.stream.pos; if (0 <= this.length && (c += "+"), c += this.length, 32 & this.tag ? c += " (constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (c += " (encapsulates)"), c += "\n", null !== this.sub) { b += " "; for (var d = 0, e = this.sub.length; d < e; ++d) c += this.sub[d].toPrettyString(b) } return c }, c.prototype.toDOM = function() { var a = f_tag("div", "node"); a.asn1 = this; var b = f_tag("div", "head"), c = this.typeName().replace(/_/g, " "); b.innerHTML = c; var d = this.content(); if (null !== d) { d = String(d).replace(/", c += "Length: " + this.header + "+", c += 0 <= this.length ? this.length : -this.length + " (undefined)", 32 & this.tag ? c += "
(constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (c += "
(encapsulates)"), null !== d && (c += "
Value:
" + d + "", "object" == typeof oids && 6 == this.tag)) { var h = oids[d]; h && (h.d && (c += "
" + h.d), h.c && (c += "
" + h.c), h.w && (c += "
(warning!)")) } g.innerHTML = c, a.appendChild(g); var i = f_tag("div", "sub"); if (null !== this.sub) for (var j = 0, k = this.sub.length; j < k; ++j) i.appendChild(this.sub[j].toDOM()); return a.appendChild(i), b.onclick = function() { a.className = "node collapsed" == a.className ? "node" : "node collapsed" }, a }, c.prototype.posStart = function() { return this.stream.pos }, c.prototype.posContent = function() { return this.stream.pos + this.header }, c.prototype.posEnd = function() { return this.stream.pos + this.header + Math.abs(this.length) }, c.prototype.fakeHover = function(a) { this.node.className += " hover", a && (this.head.className += " hover") }, c.prototype.fakeOut = function(a) { var b = / ?hover/; this.node.className = this.node.className.replace(b, ""), a && (this.head.className = this.head.className.replace(b, "")) }, c.prototype.toHexDOM_sub = function(a, b, c, d, e) { if (!(e <= d)) { var g = f_tag("span", b); g.appendChild(f_text(c.hexDump(d, e))), a.appendChild(g) } }, c.prototype.toHexDOM = function(b) { var c = f_tag("span", "hex"); if (b === a && (b = c), this.head.hexNode = c, this.head.onmouseover = function() { this.hexNode.className = "hexCurrent" }, this.head.onmouseout = function() { this.hexNode.className = "hex" }, c.asn1 = this, c.onmouseover = function() { var a = !b.selected; a && (b.selected = this.asn1, this.className = "hexCurrent"), this.asn1.fakeHover(a) }, c.onmouseout = function() { var a = b.selected == this.asn1; this.asn1.fakeOut(a), a && (b.selected = null, this.className = "hex") }, this.toHexDOM_sub(c, "tag", this.stream, this.posStart(), this.posStart() + 1), this.toHexDOM_sub(c, 0 <= this.length ? "dlen" : "ulen", this.stream, this.posStart() + 1, this.posContent()), null === this.sub) c.appendChild(f_text(this.stream.hexDump(this.posContent(), this.posEnd()))); else if (0 < this.sub.length) { var d = this.sub[0], e = this.sub[this.sub.length - 1]; this.toHexDOM_sub(c, "intro", this.stream, this.posContent(), d.posStart()); for (var g = 0, h = this.sub.length; g < h; ++g) c.appendChild(this.sub[g].toHexDOM(b)); this.toHexDOM_sub(c, "outro", this.stream, e.posEnd(), this.posEnd()) } return c }, c.prototype.toHexString = function() { return this.stream.hexDump(this.posStart(), this.posEnd(), !0) }, c.decodeLength = function(a) { var b = a.get(), c = 127 & b; if (c == b) return c; if (3 < c) throw "Length over 24 bits not supported at position " + (a.pos - 1); if (0 == c) return -1; for (var d = b = 0; d < c; ++d) b = b << 8 | a.get(); return b }, c.hasContent = function(a, d, e) { if (32 & a) return !0; if (a < 3 || 4 < a) return !1; var f = new b(e); if (3 == a && f.get(), f.get() >> 6 & 1) return !1; try { var h = c.decodeLength(f); return f.pos - e.pos + h == d } catch (i) { return !1 } }, c.decode = function(a) { a instanceof b || (a = new b(a, 0)); var d = new b(a), e = a.get(), f = c.decodeLength(a), g = a.pos - d.pos, h = null; if (c.hasContent(e, f, a)) { var i = a.pos; if (3 == e && a.get(), h = [], 0 <= f) { for (var j = i + f; a.pos < j;) h[h.length] = c.decode(a); if (a.pos != j) throw "Content size is not correct for container starting at offset " + i } else try { for (;;) { var k = c.decode(a); if (0 === k.tag) break; h[h.length] = k } f = i - a.pos } catch (l) { throw "Exception while decoding undefined length content: " + l } } else a.pos += f; return new c(d, g, f, e, h) }, c.test = function() { for (var a = [{ value: [39], expected: 39 }, { value: [129, 201], expected: 201 }, { value: [131, 254, 220, 186], expected: 16702650 }], d = 0, e = a.length; d < e; ++d) { var f = new b(a[d].value, 0), g = c.decodeLength(f); g != a[d].expected && document.write("In test[" + d + "] expected " + a[d].expected + " got " + g + "\n") } }, window.ASN1 = c }(), ASN1 = window.ASN1 ASN1.prototype.getHexStringValue = function() { var a = this.toHexString(), b = 2 * this.header, c = 2 * this.length; return a.substr(b, c) }, RSAKey.prototype.parseKey = function(a) { try { var b = 0, c = 0, e = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/.test(a) ? Hex.decode(a) : Base64.unarmor(a), f = ASN1.decode(e); if (3 === f.sub.length && (f = f.sub[2].sub[0]), 9 === f.sub.length) { b = f.sub[1].getHexStringValue(), this.n = parseBigInt(b, 16), c = f.sub[2].getHexStringValue(), this.e = parseInt(c, 16); var g = f.sub[3].getHexStringValue(); this.d = parseBigInt(g, 16); var h = f.sub[4].getHexStringValue(); this.p = parseBigInt(h, 16); var i = f.sub[5].getHexStringValue(); this.q = parseBigInt(i, 16); var j = f.sub[6].getHexStringValue(); this.dmp1 = parseBigInt(j, 16); var k = f.sub[7].getHexStringValue(); this.dmq1 = parseBigInt(k, 16); var l = f.sub[8].getHexStringValue(); this.coeff = parseBigInt(l, 16) } else { if (2 !== f.sub.length) return !1; var n = f.sub[1].sub[0]; b = n.sub[0].getHexStringValue(), this.n = parseBigInt(b, 16), c = n.sub[1].getHexStringValue(), this.e = parseInt(c, 16) } return !0 } catch (o) { return !1 } }, RSAKey.prototype.getPrivateBaseKey = function() { var a = { array: [new KJUR.asn1.DERInteger({ int: 0 }), new KJUR.asn1.DERInteger({ bigint: this.n }), new KJUR.asn1.DERInteger({ int: this.e }), new KJUR.asn1.DERInteger({ bigint: this.d }), new KJUR.asn1.DERInteger({ bigint: this.p }), new KJUR.asn1.DERInteger({ bigint: this.q }), new KJUR.asn1.DERInteger({ bigint: this.dmp1 }), new KJUR.asn1.DERInteger({ bigint: this.dmq1 }), new KJUR.asn1.DERInteger({ bigint: this.coeff })] }; return new KJUR.asn1.DERSequence(a).getEncodedHex() }, RSAKey.prototype.getPrivateBaseKeyB64 = function() { return hex2b64(this.getPrivateBaseKey()) }, RSAKey.prototype.getPublicBaseKey = function() { var a = { array: [new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }), new KJUR.asn1.DERNull] }, b = new KJUR.asn1.DERSequence(a); return a = { array: [new KJUR.asn1.DERInteger({ bigint: this.n }), new KJUR.asn1.DERInteger({ int: this.e })] }, a = { hex: "00" + new KJUR.asn1.DERSequence(a).getEncodedHex() }, a = { array: [b, new KJUR.asn1.DERBitString(a)] }, new KJUR.asn1.DERSequence(a).getEncodedHex() }, RSAKey.prototype.getPublicBaseKeyB64 = function() { return hex2b64(this.getPublicBaseKey()) }, RSAKey.prototype.wordwrap = function(a, b) { if (!a) return a; var c = "(.{1," + (b = b || 64) + "})( +|$\n?)|(.{1," + b + "})"; return a.match(RegExp(c, "g")).join("\n") }, RSAKey.prototype.getPrivateKey = function() { var a = "-----BEGIN RSA PRIVATE KEY-----\n"; return (a += this.wordwrap(this.getPrivateBaseKeyB64()) + "\n") + "-----END RSA PRIVATE KEY-----" }, RSAKey.prototype.getPublicKey = function() { var a = "-----BEGIN PUBLIC KEY-----\n"; return (a += this.wordwrap(this.getPublicBaseKeyB64()) + "\n") + "-----END PUBLIC KEY-----" }, RSAKey.prototype.hasPublicKeyProperty = function(a) { return (a = a || {}).hasOwnProperty("n") && a.hasOwnProperty("e") }, RSAKey.prototype.hasPrivateKeyProperty = function(a) { return (a = a || {}).hasOwnProperty("n") && a.hasOwnProperty("e") && a.hasOwnProperty("d") && a.hasOwnProperty("p") && a.hasOwnProperty("q") && a.hasOwnProperty("dmp1") && a.hasOwnProperty("dmq1") && a.hasOwnProperty("coeff") }, RSAKey.prototype.parsePropertiesFrom = function(a) { this.n = a.n, this.e = a.e, a.hasOwnProperty("d") && (this.d = a.d, this.p = a.p, this.q = a.q, this.dmp1 = a.dmp1, this.dmq1 = a.dmq1, this.coeff = a.coeff) }; function JSEncryptRSAKey(a) { RSAKey.call(this), a && ("string" == typeof a ? this.parseKey(a) : (this.hasPrivateKeyProperty(a) || this.hasPublicKeyProperty(a)) && this.parsePropertiesFrom(a)) }(JSEncryptRSAKey.prototype = new RSAKey).constructor = JSEncryptRSAKey; function JSEncrypt(a) { a = a || {}, this.default_key_size = parseInt(a.default_key_size) || 1024, this.default_public_exponent = a.default_public_exponent || "010001", this.log = a.log || !1, this.key = null } JSEncrypt.prototype.setKey = function(a) { this.log && this.key && console.warn("A key was already set, overriding existing."), this.key = new JSEncryptRSAKey(a) }, JSEncrypt.prototype.setPrivateKey = function(a) { this.setKey(a) }, JSEncrypt.prototype.setPublicKey = function(a) { this.setKey(a) }, JSEncrypt.prototype.decrypt = function(a) { try { return this.getKey().decrypt(b64tohex(a)) } catch (b) { return !1 } }, JSEncrypt.prototype.encrypt = function(a) { try { return this.getKey().encrypt(a) } catch (b) { return !1 } }, JSEncrypt.prototype.getKey = function(a) { if (!this.key) { if (this.key = new JSEncryptRSAKey, a && "[object Function]" === {}.toString.call(a)) return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, a); this.key.generate(this.default_key_size, this.default_public_exponent) } return this.key }, JSEncrypt.prototype.getPrivateKey = function() { return this.getKey().getPrivateKey() }, JSEncrypt.prototype.getPrivateKeyB64 = function() { return this.getKey().getPrivateBaseKeyB64() }, JSEncrypt.prototype.getPublicKey = function() { return this.getKey().getPublicKey() }, JSEncrypt.prototype.getPublicKeyB64 = function() { return this.getKey().getPublicBaseKeyB64() }, exports.JSEncrypt = JSEncrypt }(JSEncryptExports); var j_Key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDY7mpaUysvgQkbp0iIn2ezoUyhi1zPFn0HCXloLFWT7uoNkqtrphpQ/63LEcPz1VYzmDuDIf3iGxQKzeoHTiVMSmW6FlhDeqVOG094hFJvZeK4OzA6HVwzwnEW5vIZ7d+u61RV1bsFxmB68+8JXs3ycGcE4anY+YzZJcyOcEGKVQIDAQAB" function make(msg) { JSEncrypt = JSEncryptExports.JSEncrypt; (encrypt = new JSEncrypt).setPublicKey(j_Key); return '{RSA}' + encrypt.encrypt(msg) } Hex = window.Hex; Base64 = window.Base64; ASN1 = window.ASN1; Hex = window.Hex; Base64 = window.Base64; ASN1 = window.ASN1; ================================================ FILE: 其他实战/【好莱客】参数解析/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【好莱客】参数解析/encryp.js ================================================ var key = {}; function get_key_iv(str) { if (str.length < 32) { str += "abcdefghijklmnopqrstuvwxyz1234567890" } str = str.toUpperCase(); key.key = str.substring(0, 16); key.iv = str.substring(16, 32); key.security = "\u4435\u5320\u4d35" return key } var CryptoJS = CryptoJS || function(u, p) { var d = {} , l = d.lib = {} , s = function() {} , t = l.Base = { extend: function(a) { s.prototype = this; var c = new s; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function() { c.$super.init.apply(this, arguments) } ); c.init.prototype = c; c.$super = this; return c }, create: function() { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function() {}, mixIn: function(a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function() { return this.init.prototype.extend(this) } } , r = l.WordArray = t.extend({ init: function(a, c) { a = this.words = a || []; this.sigBytes = c != p ? c : 4 * a.length }, toString: function(a) { return (a || v).stringify(this) }, concat: function(a) { var c = this.words , e = a.words , j = this.sigBytes; a = a.sigBytes; this.clamp(); if (j % 4) for (var k = 0; k < a; k++) c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4); else if (65535 < e.length) for (k = 0; k < a; k += 4) c[j + k >>> 2] = e[k >>> 2]; else c.push.apply(c, e); this.sigBytes += a; return this }, clamp: function() { var a = this.words , c = this.sigBytes; a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4); a.length = u.ceil(c / 4) }, clone: function() { var a = t.clone.call(this); a.words = this.words.slice(0); return a }, random: function(a) { for (var c = [], e = 0; e < a; e += 4) c.push(4294967296 * u.random() | 0); return new r.init(c,a) } }) , w = d.enc = {} , v = w.Hex = { stringify: function(a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) { var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255; e.push((k >>> 4).toString(16)); e.push((k & 15).toString(16)) } return e.join("") }, parse: function(a) { for (var c = a.length, e = [], j = 0; j < c; j += 2) e[j >>> 3] |= parseInt(a.substr(j, 2), 16) << 24 - 4 * (j % 8); return new r.init(e,c / 2) } } , b = w.Latin1 = { stringify: function(a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return e.join("") }, parse: function(a) { for (var c = a.length, e = [], j = 0; j < c; j++) e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4); return new r.init(e,c) } } , x = w.Utf8 = { stringify: function(a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function(a) { return b.parse(unescape(encodeURIComponent(a))) } } , q = l.BufferedBlockAlgorithm = t.extend({ reset: function() { this._data = new r.init; this._nDataBytes = 0 }, _append: function(a) { "string" == typeof a && (a = x.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function(a) { var c = this._data , e = c.words , j = c.sigBytes , k = this.blockSize , b = j / (4 * k) , b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0); a = b * k; j = u.min(4 * a, j); if (a) { for (var q = 0; q < a; q += k) this._doProcessBlock(e, q); q = e.splice(0, a); c.sigBytes -= j } return new r.init(q,j) }, clone: function() { var a = t.clone.call(this); a._data = this._data.clone(); return a }, _minBufferSize: 0 }); l.Hasher = q.extend({ cfg: t.extend(), init: function(a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function() { q.reset.call(this); this._doReset() }, update: function(a) { this._append(a); this._process(); return this }, finalize: function(a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function(a) { return function(b, e) { return (new a.init(e)).finalize(b) } }, _createHmacHelper: function(a) { return function(b, e) { return (new n.HMAC.init(a,e)).finalize(b) } } }); var n = d.algo = {}; return d }(Math); (function() { var u = CryptoJS , p = u.lib.WordArray; u.enc.Base64 = { stringify: function(d) { var l = d.words , p = d.sigBytes , t = this._map; d.clamp(); d = []; for (var r = 0; r < p; r += 3) for (var w = (l[r >>> 2] >>> 24 - 8 * (r % 4) & 255) << 16 | (l[r + 1 >>> 2] >>> 24 - 8 * ((r + 1) % 4) & 255) << 8 | l[r + 2 >>> 2] >>> 24 - 8 * ((r + 2) % 4) & 255, v = 0; 4 > v && r + 0.75 * v < p; v++) d.push(t.charAt(w >>> 6 * (3 - v) & 63)); if (l = t.charAt(64)) for (; d.length % 4; ) d.push(l); return d.join("") }, parse: function(d) { var l = d.length , s = this._map , t = s.charAt(64); t && (t = d.indexOf(t), -1 != t && (l = t)); for (var t = [], r = 0, w = 0; w < l; w++) if (w % 4) { var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4) , b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4); t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4); r++ } return p.create(t, r) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } } )(); (function(u) { function p(b, n, a, c, e, j, k) { b = b + (n & a | ~n & c) + e + k; return (b << j | b >>> 32 - j) + n } function d(b, n, a, c, e, j, k) { b = b + (n & c | a & ~c) + e + k; return (b << j | b >>> 32 - j) + n } function l(b, n, a, c, e, j, k) { b = b + (n ^ a ^ c) + e + k; return (b << j | b >>> 32 - j) + n } function s(b, n, a, c, e, j, k) { b = b + (a ^ (n | ~c)) + e + k; return (b << j | b >>> 32 - j) + n } for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x++) b[x] = 4294967296 * u.abs(u.sin(x + 1)) | 0; r = r.MD5 = v.extend({ _doReset: function() { this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function(q, n) { for (var a = 0; 16 > a; a++) { var c = n + a , e = q[c]; q[c] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360 } var a = this._hash.words , c = q[n + 0] , e = q[n + 1] , j = q[n + 2] , k = q[n + 3] , z = q[n + 4] , r = q[n + 5] , t = q[n + 6] , w = q[n + 7] , v = q[n + 8] , A = q[n + 9] , B = q[n + 10] , C = q[n + 11] , u = q[n + 12] , D = q[n + 13] , E = q[n + 14] , x = q[n + 15] , f = a[0] , m = a[1] , g = a[2] , h = a[3] , f = p(f, m, g, h, c, 7, b[0]) , h = p(h, f, m, g, e, 12, b[1]) , g = p(g, h, f, m, j, 17, b[2]) , m = p(m, g, h, f, k, 22, b[3]) , f = p(f, m, g, h, z, 7, b[4]) , h = p(h, f, m, g, r, 12, b[5]) , g = p(g, h, f, m, t, 17, b[6]) , m = p(m, g, h, f, w, 22, b[7]) , f = p(f, m, g, h, v, 7, b[8]) , h = p(h, f, m, g, A, 12, b[9]) , g = p(g, h, f, m, B, 17, b[10]) , m = p(m, g, h, f, C, 22, b[11]) , f = p(f, m, g, h, u, 7, b[12]) , h = p(h, f, m, g, D, 12, b[13]) , g = p(g, h, f, m, E, 17, b[14]) , m = p(m, g, h, f, x, 22, b[15]) , f = d(f, m, g, h, e, 5, b[16]) , h = d(h, f, m, g, t, 9, b[17]) , g = d(g, h, f, m, C, 14, b[18]) , m = d(m, g, h, f, c, 20, b[19]) , f = d(f, m, g, h, r, 5, b[20]) , h = d(h, f, m, g, B, 9, b[21]) , g = d(g, h, f, m, x, 14, b[22]) , m = d(m, g, h, f, z, 20, b[23]) , f = d(f, m, g, h, A, 5, b[24]) , h = d(h, f, m, g, E, 9, b[25]) , g = d(g, h, f, m, k, 14, b[26]) , m = d(m, g, h, f, v, 20, b[27]) , f = d(f, m, g, h, D, 5, b[28]) , h = d(h, f, m, g, j, 9, b[29]) , g = d(g, h, f, m, w, 14, b[30]) , m = d(m, g, h, f, u, 20, b[31]) , f = l(f, m, g, h, r, 4, b[32]) , h = l(h, f, m, g, v, 11, b[33]) , g = l(g, h, f, m, C, 16, b[34]) , m = l(m, g, h, f, E, 23, b[35]) , f = l(f, m, g, h, e, 4, b[36]) , h = l(h, f, m, g, z, 11, b[37]) , g = l(g, h, f, m, w, 16, b[38]) , m = l(m, g, h, f, B, 23, b[39]) , f = l(f, m, g, h, D, 4, b[40]) , h = l(h, f, m, g, c, 11, b[41]) , g = l(g, h, f, m, k, 16, b[42]) , m = l(m, g, h, f, t, 23, b[43]) , f = l(f, m, g, h, A, 4, b[44]) , h = l(h, f, m, g, u, 11, b[45]) , g = l(g, h, f, m, x, 16, b[46]) , m = l(m, g, h, f, j, 23, b[47]) , f = s(f, m, g, h, c, 6, b[48]) , h = s(h, f, m, g, w, 10, b[49]) , g = s(g, h, f, m, E, 15, b[50]) , m = s(m, g, h, f, r, 21, b[51]) , f = s(f, m, g, h, u, 6, b[52]) , h = s(h, f, m, g, k, 10, b[53]) , g = s(g, h, f, m, B, 15, b[54]) , m = s(m, g, h, f, e, 21, b[55]) , f = s(f, m, g, h, v, 6, b[56]) , h = s(h, f, m, g, x, 10, b[57]) , g = s(g, h, f, m, t, 15, b[58]) , m = s(m, g, h, f, D, 21, b[59]) , f = s(f, m, g, h, z, 6, b[60]) , h = s(h, f, m, g, C, 10, b[61]) , g = s(g, h, f, m, j, 15, b[62]) , m = s(m, g, h, f, A, 21, b[63]); a[0] = a[0] + f | 0; a[1] = a[1] + m | 0; a[2] = a[2] + g | 0; a[3] = a[3] + h | 0 }, _doFinalize: function() { var b = this._data , n = b.words , a = 8 * this._nDataBytes , c = 8 * b.sigBytes; n[c >>> 5] |= 128 << 24 - c % 32; var e = u.floor(a / 4294967296); n[(c + 64 >>> 9 << 4) + 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360; n[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360; b.sigBytes = 4 * (n.length + 1); this._process(); b = this._hash; n = b.words; for (a = 0; 4 > a; a++) c = n[a], n[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360; return b }, clone: function() { var b = v.clone.call(this); b._hash = this._hash.clone(); return b } }); t.MD5 = v._createHelper(r); t.HmacMD5 = v._createHmacHelper(r) } )(Math); (function() { var u = CryptoJS , p = u.lib , d = p.Base , l = p.WordArray , p = u.algo , s = p.EvpKDF = d.extend({ cfg: d.extend({ keySize: 4, hasher: p.MD5, iterations: 1 }), init: function(d) { this.cfg = this.cfg.extend(d) }, compute: function(d, r) { for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q; ) { n && s.update(n); var n = s.update(d).finalize(r); s.reset(); for (var a = 1; a < p; a++) n = s.finalize(n), s.reset(); b.concat(n) } b.sigBytes = 4 * q; return b } }); u.EvpKDF = function(d, l, p) { return s.create(p).compute(d, l) } } )(); CryptoJS.lib.Cipher || function(u) { var p = CryptoJS , d = p.lib , l = d.Base , s = d.WordArray , t = d.BufferedBlockAlgorithm , r = p.enc.Base64 , w = p.algo.EvpKDF , v = d.Cipher = t.extend({ cfg: l.extend(), createEncryptor: function(e, a) { return this.create(this._ENC_XFORM_MODE, e, a) }, createDecryptor: function(e, a) { return this.create(this._DEC_XFORM_MODE, e, a) }, init: function(e, a, b) { this.cfg = this.cfg.extend(b); this._xformMode = e; this._key = a; this.reset() }, reset: function() { t.reset.call(this); this._doReset() }, process: function(e) { this._append(e); return this._process() }, finalize: function(e) { e && this._append(e); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function(e) { return { encrypt: function(b, k, d) { return ("string" == typeof k ? c : a).encrypt(e, b, k, d) }, decrypt: function(b, k, d) { return ("string" == typeof k ? c : a).decrypt(e, b, k, d) } } } }); d.StreamCipher = v.extend({ _doFinalize: function() { return this._process(!0) }, blockSize: 1 }); var b = p.mode = {} , x = function(e, a, b) { var c = this._iv; c ? this._iv = u : c = this._prevBlock; for (var d = 0; d < b; d++) e[a + d] ^= c[d] } , q = (d.BlockCipherMode = l.extend({ createEncryptor: function(e, a) { return this.Encryptor.create(e, a) }, createDecryptor: function(e, a) { return this.Decryptor.create(e, a) }, init: function(e, a) { this._cipher = e; this._iv = a } })).extend(); q.Encryptor = q.extend({ processBlock: function(e, a) { var b = this._cipher , c = b.blockSize; x.call(this, e, a, c); b.encryptBlock(e, a); this._prevBlock = e.slice(a, a + c) } }); q.Decryptor = q.extend({ processBlock: function(e, a) { var b = this._cipher , c = b.blockSize , d = e.slice(a, a + c); b.decryptBlock(e, a); x.call(this, e, a, c); this._prevBlock = d } }); b = b.CBC = q; q = (p.pad = {}).Pkcs7 = { pad: function(a, b) { for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4) l.push(d); c = s.create(l, c); a.concat(c) }, unpad: function(a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; d.BlockCipher = v.extend({ cfg: v.cfg.extend({ mode: b, padding: q }), reset: function() { v.reset.call(this); var a = this.cfg , b = a.iv , a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor; else c = a.createDecryptor, this._minBufferSize = 1; this._mode = c.call(a, this, b && b.words) }, _doProcessBlock: function(a, b) { this._mode.processBlock(a, b) }, _doFinalize: function() { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var b = this._process(!0) } else b = this._process(!0), a.unpad(b); return b }, blockSize: 4 }); var n = d.CipherParams = l.extend({ init: function(a) { this.mixIn(a) }, toString: function(a) { return (a || this.formatter).stringify(this) } }) , b = (p.format = {}).OpenSSL = { stringify: function(a) { var b = a.ciphertext; a = a.salt; return (a ? s.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r) }, parse: function(a) { a = r.parse(a); var b = a.words; if (1398893684 == b[0] && 1701076831 == b[1]) { var c = s.create(b.slice(2, 4)); b.splice(0, 4); a.sigBytes -= 16 } return n.create({ ciphertext: a, salt: c }) } } , a = d.SerializableCipher = l.extend({ cfg: l.extend({ format: b }), encrypt: function(a, b, c, d) { d = this.cfg.extend(d); var l = a.createEncryptor(c, d); b = l.finalize(b); l = l.cfg; return n.create({ ciphertext: b, key: c, iv: l.iv, algorithm: a, mode: l.mode, padding: l.padding, blockSize: a.blockSize, formatter: d.format }) }, decrypt: function(a, b, c, d) { d = this.cfg.extend(d); b = this._parse(b, d.format); return a.createDecryptor(c, d).finalize(b.ciphertext) }, _parse: function(a, b) { return "string" == typeof a ? b.parse(a, this) : a } }) , p = (p.kdf = {}).OpenSSL = { execute: function(a, b, c, d) { d || (d = s.random(8)); a = w.create({ keySize: b + c }).compute(a, d); c = s.create(a.words.slice(b), 4 * c); a.sigBytes = 4 * b; return n.create({ key: a, iv: c, salt: d }) } } , c = d.PasswordBasedCipher = a.extend({ cfg: a.cfg.extend({ kdf: p }), encrypt: function(b, c, d, l) { l = this.cfg.extend(l); d = l.kdf.execute(d, b.keySize, b.ivSize); l.iv = d.iv; b = a.encrypt.call(this, b, c, d.key, l); b.mixIn(d); return b }, decrypt: function(b, c, d, l) { l = this.cfg.extend(l); c = this._parse(c, l.format); d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt); l.iv = d.iv; return a.decrypt.call(this, b, c, d.key, l) } }) }(); (function() { for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++) a[c] = 128 > c ? c << 1 : c << 1 ^ 283; for (var e = 0, j = 0, c = 0; 256 > c; c++) { var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4 , k = k >>> 8 ^ k & 255 ^ 99; l[e] = k; s[k] = e; var z = a[e] , F = a[z] , G = a[F] , y = 257 * a[k] ^ 16843008 * k; t[e] = y << 24 | y >>> 8; r[e] = y << 16 | y >>> 16; w[e] = y << 8 | y >>> 24; v[e] = y; y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e; b[k] = y << 24 | y >>> 8; x[k] = y << 16 | y >>> 16; q[k] = y << 8 | y >>> 24; n[k] = y; e ? (e = z ^ a[a[a[G ^ z]]], j ^= a[a[j]]) : e = j = 1 } var H = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54] , d = d.AES = p.extend({ _doReset: function() { for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++) if (j < d) e[j] = c[j]; else { var k = e[j - 1]; j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24, k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255], k ^= H[j / d | 0] << 24); e[j] = e[j - d] ^ k } c = this._invKeySchedule = []; for (d = 0; d < a; d++) j = a - d, k = d % 4 ? e[j] : e[j - 4], c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>> 8 & 255]] ^ n[l[k & 255]] }, encryptBlock: function(a, b) { this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l) }, decryptBlock: function(a, c) { var d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d; this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s); d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d }, _doCryptBlock: function(a, b, c, d, e, j, l, f) { for (var m = this._nRounds, g = a[b] ^ c[0], h = a[b + 1] ^ c[1], k = a[b + 2] ^ c[2], n = a[b + 3] ^ c[3], p = 4, r = 1; r < m; r++) var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p++] , s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p++] , t = d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p++] , n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p++] , g = q , h = s , k = t; q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p++]; s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p++]; t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p++]; n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p++]; a[b] = q; a[b + 1] = s; a[b + 2] = t; a[b + 3] = n }, keySize: 8 }); u.AES = p._createHelper(d) } )(); // keyObj = {'key': '28496DC85152D9C0', 'iv': '278F6962C0647024', 'security': '䐵匠䴵'} function make_j_password(pwd, security, key, iv){ return security + CryptoJS.AES.encrypt(pwd, CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv) }).toString() } ================================================ FILE: 其他实战/【好莱客】参数解析/holike.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-07 Python: 3.7 import execjs.runtime_names import requests import time import re class MakeParam: """ 好莱客 http://oa.holike.com/login.jsp """ def __init__(self, name, pwd): self.name = name self.pwd = pwd self.js = None self.read_js() def get_key_vi(self): url = 'http://oa.holike.com/resource/js/session.jsp?_={t}&s_ajax=true' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' } response = requests.get(url.format(t=int(round(time.time() * 1000))), headers=headers) try: ret = re.search(r'return "(.*?)";', response.text).group(1) _key = self.js.call('get_key_iv', ret) return _key except AttributeError: print('获取key失败') def read_js(self): with open('encryp.js', 'r', encoding='utf-8') as f: self.js = execjs.compile(f.read()) def make_params(self): obj = self.get_key_vi() j_password = self.js.call("make_j_password", self.pwd, obj.get('security'), obj.get('key'), obj.get('iv')) msg = """ j_username: {user} j_password: {j_password} """.format(user=self.name, j_password=j_password) print(msg) if __name__ == '__main__': username = input('请输入用户名') password = input('请输入密码') hk = MakeParam(username, password) hk.make_params() ================================================ FILE: 其他实战/【小牛在线】登录参数生成/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【小牛在线】登录参数生成/encryp.js ================================================ var window = this; !function(e) { function t(i) { var e = u , t = e.biDivideByRadixPower(i, this.k - 1) , s = e.biMultiply(t, this.mu) , n = e.biDivideByRadixPower(s, this.k + 1) , o = e.biModuloByRadixPower(i, this.k + 1) , r = e.biMultiply(n, this.modulus) , a = e.biModuloByRadixPower(r, this.k + 1) , l = e.biSubtract(o, a); l.isNeg && (l = e.biAdd(l, this.bkplus1)); for (var d = e.biCompare(l, this.modulus) >= 0; d; ) l = e.biSubtract(l, this.modulus), d = e.biCompare(l, this.modulus) >= 0; return l } function s(i, e) { var t = u.biMultiply(i, e); return this.modulo(t) } function n(i, e) { var t = new b; t.digits[0] = 1; for (var s = i, n = e; ; ) { if (0 != (1 & n.digits[0]) && (t = this.multiplyMod(t, s)), n = u.biShiftRight(n, 1), 0 == n.digits[0] && 0 == u.biHighIndex(n)) break; s = this.multiplyMod(s, s) } return t } function o(i) { for (var e = "", t = 0; t < i; t++) e += Math.floor(10 * Math.random()); return e } var r, a, l, d, u = e.RSAUtils || {}, c = 16, h = c, f = 65536, m = f >>> 1, p = f * f, g = f - 1, b = e.BigInt = function(i) { "boolean" == typeof i && 1 == i ? this.digits = null : this.digits = a.slice(0), this.isNeg = !1 } ; u.setMaxDigits = function(i) { r = i, a = new Array(r); for (var e = 0; e < a.length; e++) a[e] = 0; l = new b, d = new b, d.digits[0] = 1 } , u.setMaxDigits(20); var v = 15; u.biFromNumber = function(i) { var e = new b; e.isNeg = i < 0, i = Math.abs(i); for (var t = 0; i > 0; ) e.digits[t++] = i & g, i = Math.floor(i / f); return e } ; var w = u.biFromNumber(1e15); u.biFromDecimal = function(i) { for (var e, t = "-" == i.charAt(0), s = t ? 1 : 0; s < i.length && "0" == i.charAt(s); ) ++s; if (s == i.length) e = new b; else { var n = i.length - s , o = n % v; for (0 == o && (o = v), e = u.biFromNumber(Number(i.substr(s, o))), s += o; s < i.length; ) e = u.biAdd(u.biMultiply(e, w), u.biFromNumber(Number(i.substr(s, v)))), s += v; e.isNeg = t } return e } , u.biCopy = function(i) { var e = new b((!0)); return e.digits = i.digits.slice(0), e.isNeg = i.isNeg, e } , u.reverseStr = function(i) { for (var e = "", t = i.length - 1; t > -1; --t) e += i.charAt(t); return e } ; var x = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; u.biToString = function(i, e) { var t = new b; t.digits[0] = e; for (var s = u.biDivideModulo(i, t), n = x[s[1].digits[0]]; 1 == u.biCompare(s[0], l); ) s = u.biDivideModulo(s[0], t), digit = s[1].digits[0], n += x[s[1].digits[0]]; return (i.isNeg ? "-" : "") + u.reverseStr(n) } , u.biToDecimal = function(i) { var e = new b; e.digits[0] = 10; for (var t = u.biDivideModulo(i, e), s = String(t[1].digits[0]); 1 == u.biCompare(t[0], l); ) t = u.biDivideModulo(t[0], e), s += String(t[1].digits[0]); return (i.isNeg ? "-" : "") + u.reverseStr(s) } ; var y = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; u.digitToHex = function(e) { var t = 15 , s = ""; for (i = 0; i < 4; ++i) s += y[e & t], e >>>= 4; return u.reverseStr(s) } , u.biToHex = function(i) { for (var e = "", t = (u.biHighIndex(i), u.biHighIndex(i)); t > -1; --t) e += u.digitToHex(i.digits[t]); return e } , u.charToHex = function(i) { var e, t = 48, s = t + 9, n = 97, o = n + 25, r = 65, a = 90; return e = i >= t && i <= s ? i - t : i >= r && i <= a ? 10 + i - r : i >= n && i <= o ? 10 + i - n : 0 } , u.hexToDigit = function(i) { for (var e = 0, t = Math.min(i.length, 4), s = 0; s < t; ++s) e <<= 4, e |= u.charToHex(i.charCodeAt(s)); return e } , u.biFromHex = function(i) { for (var e = new b, t = i.length, s = t, n = 0; s > 0; s -= 4, ++n) e.digits[n] = u.hexToDigit(i.substr(Math.max(s - 4, 0), Math.min(s, 4))); return e } , u.biFromString = function(i, e) { var t = "-" == i.charAt(0) , s = t ? 1 : 0 , n = new b , o = new b; o.digits[0] = 1; for (var r = i.length - 1; r >= s; r--) { var a = i.charCodeAt(r) , l = u.charToHex(a) , d = u.biMultiplyDigit(o, l); n = u.biAdd(n, d), o = u.biMultiplyDigit(o, e) } return n.isNeg = t, n } , u.biDump = function(i) { return (i.isNeg ? "-" : "") + i.digits.join(" ") } , u.biAdd = function(i, e) { var t; if (i.isNeg != e.isNeg) e.isNeg = !e.isNeg, t = u.biSubtract(i, e), e.isNeg = !e.isNeg; else { t = new b; for (var s, n = 0, o = 0; o < i.digits.length; ++o) s = i.digits[o] + e.digits[o] + n, t.digits[o] = s % f, n = Number(s >= f); t.isNeg = i.isNeg } return t } , u.biSubtract = function(i, e) { var t; if (i.isNeg != e.isNeg) e.isNeg = !e.isNeg, t = u.biAdd(i, e), e.isNeg = !e.isNeg; else { t = new b; var s, n; n = 0; for (var o = 0; o < i.digits.length; ++o) s = i.digits[o] - e.digits[o] + n, t.digits[o] = s % f, t.digits[o] < 0 && (t.digits[o] += f), n = 0 - Number(s < 0); if (n == -1) { n = 0; for (var o = 0; o < i.digits.length; ++o) s = 0 - t.digits[o] + n, t.digits[o] = s % f, t.digits[o] < 0 && (t.digits[o] += f), n = 0 - Number(s < 0); t.isNeg = !i.isNeg } else t.isNeg = i.isNeg } return t } , u.biHighIndex = function(i) { for (var e = i.digits.length - 1; e > 0 && 0 == i.digits[e]; ) --e; return e } , u.biNumBits = function(i) { var e, t = u.biHighIndex(i), s = i.digits[t], n = (t + 1) * h; for (e = n; e > n - h && 0 == (32768 & s); --e) s <<= 1; return e } , u.biMultiply = function(i, e) { for (var t, s, n, o = new b, r = u.biHighIndex(i), a = u.biHighIndex(e), l = 0; l <= a; ++l) { for (t = 0, n = l, j = 0; j <= r; ++j, ++n) s = o.digits[n] + i.digits[j] * e.digits[l] + t, o.digits[n] = s & g, t = s >>> c; o.digits[l + r + 1] = t } return o.isNeg = i.isNeg != e.isNeg, o } , u.biMultiplyDigit = function(i, e) { var t, s, n; result = new b, t = u.biHighIndex(i), s = 0; for (var o = 0; o <= t; ++o) n = result.digits[o] + i.digits[o] * e + s, result.digits[o] = n & g, s = n >>> c; return result.digits[1 + t] = s, result } , u.arrayCopy = function(i, e, t, s, n) { for (var o = Math.min(e + n, i.length), r = e, a = s; r < o; ++r, ++a) t[a] = i[r] } ; var C = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535]; u.biShiftLeft = function(i, e) { var t = Math.floor(e / h) , s = new b; u.arrayCopy(i.digits, 0, s.digits, t, s.digits.length - t); for (var n = e % h, o = h - n, r = s.digits.length - 1, a = r - 1; r > 0; --r, --a) s.digits[r] = s.digits[r] << n & g | (s.digits[a] & C[n]) >>> o; return s.digits[0] = s.digits[r] << n & g, s.isNeg = i.isNeg, s } ; var S = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535]; u.biShiftRight = function(i, e) { var t = Math.floor(e / h) , s = new b; u.arrayCopy(i.digits, t, s.digits, 0, i.digits.length - t); for (var n = e % h, o = h - n, r = 0, a = r + 1; r < s.digits.length - 1; ++r, ++a) s.digits[r] = s.digits[r] >>> n | (s.digits[a] & S[n]) << o; return s.digits[s.digits.length - 1] >>>= n, s.isNeg = i.isNeg, s } , u.biMultiplyByRadixPower = function(i, e) { var t = new b; return u.arrayCopy(i.digits, 0, t.digits, e, t.digits.length - e), t } , u.biDivideByRadixPower = function(i, e) { var t = new b; return u.arrayCopy(i.digits, e, t.digits, 0, t.digits.length - e), t } , u.biModuloByRadixPower = function(i, e) { var t = new b; return u.arrayCopy(i.digits, 0, t.digits, 0, e), t } , u.biCompare = function(i, e) { if (i.isNeg != e.isNeg) return 1 - 2 * Number(i.isNeg); for (var t = i.digits.length - 1; t >= 0; --t) if (i.digits[t] != e.digits[t]) return i.isNeg ? 1 - 2 * Number(i.digits[t] > e.digits[t]) : 1 - 2 * Number(i.digits[t] < e.digits[t]); return 0 } , u.biDivideModulo = function(i, e) { var t, s, n = u.biNumBits(i), o = u.biNumBits(e), r = e.isNeg; if (n < o) return i.isNeg ? (t = u.biCopy(d), t.isNeg = !e.isNeg, i.isNeg = !1, e.isNeg = !1, s = biSubtract(e, i), i.isNeg = !0, e.isNeg = r) : (t = new b, s = u.biCopy(i)), [t, s]; t = new b, s = i; for (var a = Math.ceil(o / h) - 1, l = 0; e.digits[a] < m; ) e = u.biShiftLeft(e, 1), ++l, ++o, a = Math.ceil(o / h) - 1; s = u.biShiftLeft(s, l), n += l; for (var c = Math.ceil(n / h) - 1, v = u.biMultiplyByRadixPower(e, c - a); u.biCompare(s, v) != -1; ) ++t.digits[c - a], s = u.biSubtract(s, v); for (var w = c; w > a; --w) { var x = w >= s.digits.length ? 0 : s.digits[w] , y = w - 1 >= s.digits.length ? 0 : s.digits[w - 1] , C = w - 2 >= s.digits.length ? 0 : s.digits[w - 2] , S = a >= e.digits.length ? 0 : e.digits[a] , $ = a - 1 >= e.digits.length ? 0 : e.digits[a - 1]; x == S ? t.digits[w - a - 1] = g : t.digits[w - a - 1] = Math.floor((x * f + y) / S); for (var I = t.digits[w - a - 1] * (S * f + $), k = x * p + (y * f + C); I > k; ) --t.digits[w - a - 1], I = t.digits[w - a - 1] * (S * f | $), k = x * f * f + (y * f + C); v = u.biMultiplyByRadixPower(e, w - a - 1), s = u.biSubtract(s, u.biMultiplyDigit(v, t.digits[w - a - 1])), s.isNeg && (s = u.biAdd(s, v), --t.digits[w - a - 1]) } return s = u.biShiftRight(s, l), t.isNeg = i.isNeg != r, i.isNeg && (t = r ? u.biAdd(t, d) : u.biSubtract(t, d), e = u.biShiftRight(e, l), s = u.biSubtract(e, s)), 0 == s.digits[0] && 0 == u.biHighIndex(s) && (s.isNeg = !1), [t, s] } , u.biDivide = function(i, e) { return u.biDivideModulo(i, e)[0] } , u.biModulo = function(i, e) { return u.biDivideModulo(i, e)[1] } , u.biMultiplyMod = function(i, e, t) { return u.biModulo(u.biMultiply(i, e), t) } , u.biPow = function(i, e) { for (var t = d, s = i; ; ) { if (0 != (1 & e) && (t = u.biMultiply(t, s)), e >>= 1, 0 == e) break; s = u.biMultiply(s, s) } return t } , u.biPowMod = function(i, e, t) { for (var s = d, n = i, o = e; ; ) { if (0 != (1 & o.digits[0]) && (s = u.biMultiplyMod(s, n, t)), o = u.biShiftRight(o, 1), 0 == o.digits[0] && 0 == u.biHighIndex(o)) break; n = u.biMultiplyMod(n, n, t) } return s } , e.BarrettMu = function(i) { this.modulus = u.biCopy(i), this.k = u.biHighIndex(this.modulus) + 1; var e = new b; e.digits[2 * this.k] = 1, this.mu = u.biDivide(e, this.modulus), this.bkplus1 = new b, this.bkplus1.digits[this.k + 1] = 1, this.modulo = t, this.multiplyMod = s, this.powMod = n } ; var $ = function(i, t, s, n) { var o = u; this.e = o.biFromHex(i), this.d = o.biFromHex(t), this.m = o.biFromHex(s), this.chunkSize = 2 * o.biHighIndex(this.m), this.radix = 16, this.barrett = new e.BarrettMu(this.m), this.rndLen = n }; u.getKeyPair = function(i, e, t, s) { return new $(i,e,t,s) } , "undefined" == typeof e.twoDigit && (e.twoDigit = function(i) { return (i < 10 ? "0" : "") + String(i) } ); var I = "00d3e5839928d17df7ad0ae809c772cd07615cc6531e49aaa2331ba80d1308d25a67f055d2e5c2e90871e779e6ac8629de1d9203333e3b3aabdb1c90dea66c23db6d6941ec89bb99a1f8e44e0a4207341a58f5e43e49f9b69bff1f3115dda47a27e67c6d4b81895a39065ca1ae278d0dfca752aac9c8ac9d0b25cdea70e17e39db" , k = "010001" , _ = "7"; u.pwdEncode = function(i) { var e = u.getKeyPair(k, "", I, _); return u.encryptedString(e, i) } , u.encryptedString = function(i, e) { for (var t = o(i.rndLen) + e, s = [], n = t.length, r = 0; r < n; ) s[r] = t.charCodeAt(r), r++; for (; s.length % i.chunkSize != 0; ) s[r++] = 0; var a, l, d, c = s.length, h = ""; for (r = 0; r < c; r += i.chunkSize) { for (d = new b, a = 0, l = r; l < r + i.chunkSize; ++a) d.digits[a] = s[l++], d.digits[a] += s[l++] << 8; var f = i.barrett.powMod(d, i.e) , m = 16 == i.radix ? u.biToHex(f) : u.biToString(f, i.radix); h += m + " " } return h.substring(0, h.length - 1) } , u.decryptedString = function(i, e) { var t, s, n, o = e.split(" "), r = ""; for (t = 0; t < o.length; ++t) { var a; for (a = 16 == i.radix ? u.biFromHex(o[t]) : u.biFromString(o[t], i.radix), n = i.barrett.powMod(a, i.d), s = 0; s <= u.biHighIndex(n); ++s) r += String.fromCharCode(255 & n.digits[s], n.digits[s] >> 8) } return 0 == r.charCodeAt(r.length - 1) && (r = r.substring(0, r.length - 1)), r } , u.setMaxDigits(130), e.RSAUtils = u }(window) function get_pwd(pwd){ return RSAUtils.pwdEncode(pwd) } ================================================ FILE: 其他实战/【小牛在线】登录参数生成/make_param.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-29 Python: 3.7 import execjs.runtime_names """ 小牛在线,登陆密码参数解密 https://www.xiaoniu88.com/user/login """ def init_js(): with open("encryp.js", "r", encoding="utf-8") as f: return execjs.compile(f.read()) def make_param(password): js = init_js() pwd = js.call('get_pwd', password) print('加密后密码', pwd) if __name__ == '__main__': password = input('明文密码') make_param(password) ================================================ FILE: 其他实战/【开鑫贷】登陆参数生成/KaiXinDai.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-15 Python: 3.7 import requests import execjs.runtime_names class KaiXinDai: """ 开鑫贷登陆参数解密 https://www.gkkxd.com/userAuth/login """ def __init__(self, pwd): self.js = None self.pwd = pwd self.init_js() @staticmethod def get_dl(): from lxml import etree url = 'https://www.kxjf.com/user/login?mainSiteName=kxd' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'Host': 'www.kxjf.com', 'Referer': 'https://www.gkkxd.com/userAuth/login', } response = requests.get(url, headers=headers) etree = etree.HTML(response.text) dlmy = etree.xpath('//*[@id="dlmy"]/@value')[0] return dlmy def init_js(self): with open('encryp.js', 'r', encoding='utf-8') as f: self.js = execjs.compile(f.read()) def make_param(self): pwd = self.js.call('test', self.get_dl(), self.pwd) print('pwd生成', pwd) if __name__ == '__main__': password = input('请输入用户密码') kxd = KaiXinDai(password) kxd.make_param() ================================================ FILE: 其他实战/【开鑫贷】登陆参数生成/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【开鑫贷】登陆参数生成/encryp.js ================================================ var hexcase = 0; var b64pad = ""; var chrsz = 8; function pwd_encrypt(a, b) { return encrypt_md5_aes(a, b) } function hex_md5(a) { return binl2hex(core_md5(str2binl(a), a.length * chrsz)) } function b64_md5(a) { return binl2b64(core_md5(str2binl(a), a.length * chrsz)) } function hex_hmac_md5(a, b) { return binl2hex(core_hmac_md5(a, b)) } function b64_hmac_md5(a, b) { return binl2b64(core_hmac_md5(a, b)) } function calcMD5(a) { return binl2hex(core_md5(str2binl(a), a.length * chrsz)) } function md5_vm_test() { return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72" } function core_md5(p, k) { p[k >> 5] |= 128 << ((k) % 32); p[(((k + 64) >>> 9) << 4) + 14] = k; var o = 1732584193; var n = -271733879; var m = -1732584194; var l = 271733878; for (var g = 0; g < p.length; g += 16) { var j = o; var h = n; var f = m; var e = l; o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936); l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586); m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819); n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330); o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897); l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426); m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341); n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983); o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416); l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417); m = md5_ff(m, l, o, n, p[g + 10], 17, -42063); n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162); o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682); l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101); m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290); n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329); o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510); l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632); m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713); n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302); o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691); l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083); m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335); n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848); o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438); l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690); m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961); n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501); o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467); l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784); m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473); n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734); o = md5_hh(o, n, m, l, p[g + 5], 4, -378558); l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463); m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562); n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556); o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060); l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353); m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632); n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640); o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174); l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222); m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979); n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189); o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487); l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835); m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520); n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651); o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844); l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415); m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905); n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055); o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571); l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606); m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523); n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799); o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359); l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744); m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380); n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649); o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070); l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379); m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259); n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551); o = safe_add(o, j); n = safe_add(n, h); m = safe_add(m, f); l = safe_add(l, e) } return Array(o, n, m, l) } function md5_cmn(h, e, d, c, g, f) { return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d) } function md5_ff(g, f, k, j, e, i, h) { return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h) } function md5_gg(g, f, k, j, e, i, h) { return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) } function md5_hh(g, f, k, j, e, i, h) { return md5_cmn(f ^ k ^ j, g, f, e, i, h) } function md5_ii(g, f, k, j, e, i, h) { return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) } function core_hmac_md5(c, f) { var e = str2binl(c); if (e.length > 16) { e = core_md5(e, c.length * chrsz) } var a = Array(16) , d = Array(16); for (var b = 0; b < 16; b++) { a[b] = e[b] ^ 909522486; d[b] = e[b] ^ 1549556828 } var g = core_md5(a.concat(str2binl(f)), 512 + f.length * chrsz); return core_md5(d.concat(g), 512 + 128) } function safe_add(a, d) { var c = (a & 65535) + (d & 65535); var b = (a >> 16) + (d >> 16) + (c >> 16); return (b << 16) | (c & 65535) } function bit_rol(a, b) { return (a << b) | (a >>> (32 - b)) } function str2binl(d) { var c = Array(); var a = (1 << chrsz) - 1; for (var b = 0; b < d.length * chrsz; b += chrsz) { c[b >> 5] |= (d.charCodeAt(b / chrsz) & a) << (b % 32) } return c } function binl2hex(c) { var b = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var d = ""; for (var a = 0; a < c.length * 4; a++) { d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15) } return d } function binl2b64(d) { var c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var f = ""; for (var b = 0; b < d.length * 4; b += 3) { var e = (((d[b >> 2] >> 8 * (b % 4)) & 255) << 16) | (((d[b + 1 >> 2] >> 8 * ((b + 1) % 4)) & 255) << 8) | ((d[b + 2 >> 2] >> 8 * ((b + 2) % 4)) & 255); for (var a = 0; a < 4; a++) { if (b * 8 + a * 6 > d.length * 32) { f += b64pad } else { f += c.charAt((e >> 6 * (3 - a)) & 63) } } } return f } var CryptoJS = CryptoJS || function(o, e) { var h = {} , g = h.lib = {} , z = function() {} , y = g.Base = { extend: function(b) { z.prototype = this; var d = new z; b && d.mixIn(b); d.hasOwnProperty("init") || (d.init = function() { d.$super.init.apply(this, arguments) } ); d.init.prototype = d; d.$super = this; return d }, create: function() { var b = this.extend(); b.init.apply(b, arguments); return b }, init: function() {}, mixIn: function(b) { for (var d in b) { b.hasOwnProperty(d) && (this[d] = b[d]) } b.hasOwnProperty("toString") && (this.toString = b.toString) }, clone: function() { return this.init.prototype.extend(this) } } , a = g.WordArray = y.extend({ init: function(b, d) { b = this.words = b || []; this.sigBytes = d != e ? d : 4 * b.length }, toString: function(b) { return (b || m).stringify(this) }, concat: function(b) { var p = this.words , n = b.words , l = this.sigBytes; b = b.sigBytes; this.clamp(); if (l % 4) { for (var d = 0; d < b; d++) { p[l + d >>> 2] |= (n[d >>> 2] >>> 24 - 8 * (d % 4) & 255) << 24 - 8 * ((l + d) % 4) } } else { if (65535 < n.length) { for (d = 0; d < b; d += 4) { p[l + d >>> 2] = n[d >>> 2] } } else { p.push.apply(p, n) } } this.sigBytes += b; return this }, clamp: function() { var b = this.words , d = this.sigBytes; b[d >>> 2] &= 4294967295 << 32 - 8 * (d % 4); b.length = o.ceil(d / 4) }, clone: function() { var b = y.clone.call(this); b.words = this.words.slice(0); return b }, random: function(b) { for (var l = [], d = 0; d < b; d += 4) { l.push(4294967296 * o.random() | 0) } return new a.init(l,b) } }) , k = h.enc = {} , m = k.Hex = { stringify: function(b) { var p = b.words; b = b.sigBytes; for (var n = [], l = 0; l < b; l++) { var d = p[l >>> 2] >>> 24 - 8 * (l % 4) & 255; n.push((d >>> 4).toString(16)); n.push((d & 15).toString(16)) } return n.join("") }, parse: function(b) { for (var n = b.length, l = [], d = 0; d < n; d += 2) { l[d >>> 3] |= parseInt(b.substr(d, 2), 16) << 24 - 4 * (d % 8) } return new a.init(l,n / 2) } } , i = k.Latin1 = { stringify: function(b) { var n = b.words; b = b.sigBytes; for (var l = [], d = 0; d < b; d++) { l.push(String.fromCharCode(n[d >>> 2] >>> 24 - 8 * (d % 4) & 255)) } return l.join("") }, parse: function(b) { for (var n = b.length, l = [], d = 0; d < n; d++) { l[d >>> 2] |= (b.charCodeAt(d) & 255) << 24 - 8 * (d % 4) } return new a.init(l,n) } } , j = k.Utf8 = { stringify: function(b) { try { return decodeURIComponent(escape(i.stringify(b))) } catch (d) { throw Error("Malformed UTF-8 data") } }, parse: function(b) { return i.parse(unescape(encodeURIComponent(b))) } } , c = g.BufferedBlockAlgorithm = y.extend({ reset: function() { this._data = new a.init; this._nDataBytes = 0 }, _append: function(b) { "string" == typeof b && (b = j.parse(b)); this._data.concat(b); this._nDataBytes += b.sigBytes }, _process: function(l) { var t = this._data , s = t.words , p = t.sigBytes , n = this.blockSize , d = p / (4 * n) , d = l ? o.ceil(d) : o.max((d | 0) - this._minBufferSize, 0); l = d * n; p = o.min(4 * l, p); if (l) { for (var r = 0; r < l; r += n) { this._doProcessBlock(s, r) } r = s.splice(0, l); t.sigBytes -= p } return new a.init(r,p) }, clone: function() { var b = y.clone.call(this); b._data = this._data.clone(); return b }, _minBufferSize: 0 }); g.Hasher = c.extend({ cfg: y.extend(), init: function(b) { this.cfg = this.cfg.extend(b); this.reset() }, reset: function() { c.reset.call(this); this._doReset() }, update: function(b) { this._append(b); this._process(); return this }, finalize: function(b) { b && this._append(b); return this._doFinalize() }, blockSize: 16, _createHelper: function(b) { return function(d, l) { return (new b.init(l)).finalize(d) } }, _createHmacHelper: function(b) { return function(d, l) { return (new f.HMAC.init(b,l)).finalize(d) } } }); var f = h.algo = {}; return h }(Math); (function() { var a = CryptoJS , b = a.lib.WordArray; a.enc.Base64 = { stringify: function(j) { var e = j.words , i = j.sigBytes , g = this._map; j.clamp(); j = []; for (var h = 0; h < i; h += 3) { for (var c = (e[h >>> 2] >>> 24 - 8 * (h % 4) & 255) << 16 | (e[h + 1 >>> 2] >>> 24 - 8 * ((h + 1) % 4) & 255) << 8 | e[h + 2 >>> 2] >>> 24 - 8 * ((h + 2) % 4) & 255, f = 0; 4 > f && h + 0.75 * f < i; f++) { j.push(g.charAt(c >>> 6 * (3 - f) & 63)) } } if (e = g.charAt(64)) { for (; j.length % 4; ) { j.push(e) } } return j.join("") }, parse: function(k) { var f = k.length , i = this._map , h = i.charAt(64); h && (h = k.indexOf(h), -1 != h && (f = h)); for (var h = [], j = 0, e = 0; e < f; e++) { if (e % 4) { var g = i.indexOf(k.charAt(e - 1)) << 2 * (e % 4) , c = i.indexOf(k.charAt(e)) >>> 6 - 2 * (e % 4); h[j >>> 2] |= (g | c) << 24 - 8 * (j % 4); j++ } } return b.create(h, j) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } } )(); (function(k) { function c(d, s, l, r, q, p, o) { d = d + (s & l | ~s & r) + q + o; return (d << p | d >>> 32 - p) + s } function f(d, s, l, r, q, p, o) { d = d + (s & r | l & ~r) + q + o; return (d << p | d >>> 32 - p) + s } function e(d, s, l, r, q, p, o) { d = d + (s ^ l ^ r) + q + o; return (d << p | d >>> 32 - p) + s } function n(d, s, l, r, q, p, o) { d = d + (l ^ (s | ~r)) + q + o; return (d << p | d >>> 32 - p) + s } for (var m = CryptoJS, a = m.lib, i = a.WordArray, j = a.Hasher, a = m.algo, g = [], h = 0; 64 > h; h++) { g[h] = 4294967296 * k.abs(k.sin(h + 1)) | 0 } a = a.MD5 = j.extend({ _doReset: function() { this._hash = new i.init([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function(J, L) { for (var U = 0; 16 > U; U++) { var T = L + U , S = J[T]; J[T] = (S << 8 | S >>> 24) & 16711935 | (S << 24 | S >>> 8) & 4278255360 } var U = this._hash.words , T = J[L + 0] , S = J[L + 1] , O = J[L + 2] , N = J[L + 3] , b = J[L + 4] , H = J[L + 5] , y = J[L + 6] , l = J[L + 7] , o = J[L + 8] , K = J[L + 9] , I = J[L + 10] , G = J[L + 11] , p = J[L + 12] , F = J[L + 13] , s = J[L + 14] , d = J[L + 15] , R = U[0] , M = U[1] , Q = U[2] , P = U[3] , R = c(R, M, Q, P, T, 7, g[0]) , P = c(P, R, M, Q, S, 12, g[1]) , Q = c(Q, P, R, M, O, 17, g[2]) , M = c(M, Q, P, R, N, 22, g[3]) , R = c(R, M, Q, P, b, 7, g[4]) , P = c(P, R, M, Q, H, 12, g[5]) , Q = c(Q, P, R, M, y, 17, g[6]) , M = c(M, Q, P, R, l, 22, g[7]) , R = c(R, M, Q, P, o, 7, g[8]) , P = c(P, R, M, Q, K, 12, g[9]) , Q = c(Q, P, R, M, I, 17, g[10]) , M = c(M, Q, P, R, G, 22, g[11]) , R = c(R, M, Q, P, p, 7, g[12]) , P = c(P, R, M, Q, F, 12, g[13]) , Q = c(Q, P, R, M, s, 17, g[14]) , M = c(M, Q, P, R, d, 22, g[15]) , R = f(R, M, Q, P, S, 5, g[16]) , P = f(P, R, M, Q, y, 9, g[17]) , Q = f(Q, P, R, M, G, 14, g[18]) , M = f(M, Q, P, R, T, 20, g[19]) , R = f(R, M, Q, P, H, 5, g[20]) , P = f(P, R, M, Q, I, 9, g[21]) , Q = f(Q, P, R, M, d, 14, g[22]) , M = f(M, Q, P, R, b, 20, g[23]) , R = f(R, M, Q, P, K, 5, g[24]) , P = f(P, R, M, Q, s, 9, g[25]) , Q = f(Q, P, R, M, N, 14, g[26]) , M = f(M, Q, P, R, o, 20, g[27]) , R = f(R, M, Q, P, F, 5, g[28]) , P = f(P, R, M, Q, O, 9, g[29]) , Q = f(Q, P, R, M, l, 14, g[30]) , M = f(M, Q, P, R, p, 20, g[31]) , R = e(R, M, Q, P, H, 4, g[32]) , P = e(P, R, M, Q, o, 11, g[33]) , Q = e(Q, P, R, M, G, 16, g[34]) , M = e(M, Q, P, R, s, 23, g[35]) , R = e(R, M, Q, P, S, 4, g[36]) , P = e(P, R, M, Q, b, 11, g[37]) , Q = e(Q, P, R, M, l, 16, g[38]) , M = e(M, Q, P, R, I, 23, g[39]) , R = e(R, M, Q, P, F, 4, g[40]) , P = e(P, R, M, Q, T, 11, g[41]) , Q = e(Q, P, R, M, N, 16, g[42]) , M = e(M, Q, P, R, y, 23, g[43]) , R = e(R, M, Q, P, K, 4, g[44]) , P = e(P, R, M, Q, p, 11, g[45]) , Q = e(Q, P, R, M, d, 16, g[46]) , M = e(M, Q, P, R, O, 23, g[47]) , R = n(R, M, Q, P, T, 6, g[48]) , P = n(P, R, M, Q, l, 10, g[49]) , Q = n(Q, P, R, M, s, 15, g[50]) , M = n(M, Q, P, R, H, 21, g[51]) , R = n(R, M, Q, P, p, 6, g[52]) , P = n(P, R, M, Q, N, 10, g[53]) , Q = n(Q, P, R, M, I, 15, g[54]) , M = n(M, Q, P, R, S, 21, g[55]) , R = n(R, M, Q, P, o, 6, g[56]) , P = n(P, R, M, Q, d, 10, g[57]) , Q = n(Q, P, R, M, y, 15, g[58]) , M = n(M, Q, P, R, F, 21, g[59]) , R = n(R, M, Q, P, b, 6, g[60]) , P = n(P, R, M, Q, G, 10, g[61]) , Q = n(Q, P, R, M, O, 15, g[62]) , M = n(M, Q, P, R, K, 21, g[63]); U[0] = U[0] + R | 0; U[1] = U[1] + M | 0; U[2] = U[2] + Q | 0; U[3] = U[3] + P | 0 }, _doFinalize: function() { var d = this._data , q = d.words , l = 8 * this._nDataBytes , p = 8 * d.sigBytes; q[p >>> 5] |= 128 << 24 - p % 32; var o = k.floor(l / 4294967296); q[(p + 64 >>> 9 << 4) + 15] = (o << 8 | o >>> 24) & 16711935 | (o << 24 | o >>> 8) & 4278255360; q[(p + 64 >>> 9 << 4) + 14] = (l << 8 | l >>> 24) & 16711935 | (l << 24 | l >>> 8) & 4278255360; d.sigBytes = 4 * (q.length + 1); this._process(); d = this._hash; q = d.words; for (l = 0; 4 > l; l++) { p = q[l], q[l] = (p << 8 | p >>> 24) & 16711935 | (p << 24 | p >>> 8) & 4278255360 } return d }, clone: function() { var d = j.clone.call(this); d._hash = this._hash.clone(); return d } }); m.MD5 = j._createHelper(a); m.HmacMD5 = j._createHmacHelper(a) } )(Math); (function() { var b = CryptoJS , e = b.lib , f = e.Base , a = e.WordArray , e = b.algo , c = e.EvpKDF = f.extend({ cfg: f.extend({ keySize: 4, hasher: e.MD5, iterations: 1 }), init: function(g) { this.cfg = this.cfg.extend(g) }, compute: function(k, g) { for (var i = this.cfg, t = i.hasher.create(), l = a.create(), o = l.words, h = i.keySize, i = i.iterations; o.length < h; ) { j && t.update(j); var j = t.update(k).finalize(g); t.reset(); for (var m = 1; m < i; m++) { j = t.finalize(j), t.reset() } l.concat(j) } l.sigBytes = 4 * h; return l } }); b.EvpKDF = function(i, g, h) { return c.create(h).compute(i, g) } } )(); CryptoJS.lib.Cipher || function(B) { var g = CryptoJS , j = g.lib , i = j.Base , D = j.WordArray , C = j.BufferedBlockAlgorithm , e = g.enc.Base64 , z = g.algo.EvpKDF , A = j.Cipher = C.extend({ cfg: i.extend(), createEncryptor: function(c, b) { return this.create(this._ENC_XFORM_MODE, c, b) }, createDecryptor: function(c, b) { return this.create(this._DEC_XFORM_MODE, c, b) }, init: function(l, d, c) { this.cfg = this.cfg.extend(c); this._xformMode = l; this._key = d; this.reset() }, reset: function() { C.reset.call(this); this._doReset() }, process: function(a) { this._append(a); return this._process() }, finalize: function(a) { a && this._append(a); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function(a) { return { encrypt: function(c, l, n) { return ("string" == typeof l ? k : o).encrypt(a, c, l, n) }, decrypt: function(c, l, n) { return ("string" == typeof l ? k : o).decrypt(a, c, l, n) } } } }); j.StreamCipher = A.extend({ _doFinalize: function() { return this._process(!0) }, blockSize: 1 }); var m = g.mode = {} , y = function(p, n, l) { var r = this._iv; r ? this._iv = B : r = this._prevBlock; for (var q = 0; q < l; q++) { p[n + q] ^= r[q] } } , f = (j.BlockCipherMode = i.extend({ createEncryptor: function(c, b) { return this.Encryptor.create(c, b) }, createDecryptor: function(c, b) { return this.Decryptor.create(c, b) }, init: function(c, b) { this._cipher = c; this._iv = b } })).extend(); f.Encryptor = f.extend({ processBlock: function(n, l) { var d = this._cipher , p = d.blockSize; y.call(this, n, l, p); d.encryptBlock(n, l); this._prevBlock = n.slice(l, l + p) } }); f.Decryptor = f.extend({ processBlock: function(p, n) { var l = this._cipher , r = l.blockSize , q = p.slice(n, n + r); l.decryptBlock(p, n); y.call(this, p, n, r); this._prevBlock = q } }); m = m.CBC = f; f = (g.pad = {}).Pkcs7 = { pad: function(r, p) { for (var u = 4 * p, u = u - r.sigBytes % u, s = u << 24 | u << 16 | u << 8 | u, q = [], t = 0; t < u; t += 4) { q.push(s) } u = D.create(q, u); r.concat(u) }, unpad: function(b) { b.sigBytes -= b.words[b.sigBytes - 1 >>> 2] & 255 } }; j.BlockCipher = A.extend({ cfg: A.cfg.extend({ mode: m, padding: f }), reset: function() { A.reset.call(this); var l = this.cfg , d = l.iv , l = l.mode; if (this._xformMode == this._ENC_XFORM_MODE) { var n = l.createEncryptor } else { n = l.createDecryptor, this._minBufferSize = 1 } this._mode = n.call(l, this, d && d.words) }, _doProcessBlock: function(d, c) { this._mode.processBlock(d, c) }, _doFinalize: function() { var d = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { d.pad(this._data, this.blockSize); var c = this._process(!0) } else { c = this._process(!0), d.unpad(c) } return c }, blockSize: 4 }); var h = j.CipherParams = i.extend({ init: function(b) { this.mixIn(b) }, toString: function(b) { return (b || this.formatter).stringify(this) } }) , m = (g.format = {}).OpenSSL = { stringify: function(d) { var c = d.ciphertext; d = d.salt; return (d ? D.create([1398893684, 1701076831]).concat(d).concat(c) : c).toString(e) }, parse: function(l) { l = e.parse(l); var d = l.words; if (1398893684 == d[0] && 1701076831 == d[1]) { var n = D.create(d.slice(2, 4)); d.splice(0, 4); l.sigBytes -= 16 } return h.create({ ciphertext: l, salt: n }) } } , o = j.SerializableCipher = i.extend({ cfg: i.extend({ format: m }), encrypt: function(q, n, s, r) { r = this.cfg.extend(r); var p = q.createEncryptor(s, r); n = p.finalize(n); p = p.cfg; return h.create({ ciphertext: n, key: s, iv: p.iv, algorithm: q, mode: p.mode, padding: p.padding, blockSize: q.blockSize, formatter: r.format }) }, decrypt: function(n, l, q, p) { p = this.cfg.extend(p); l = this._parse(l, p.format); return n.createDecryptor(q, p).finalize(l.ciphertext) }, _parse: function(d, c) { return "string" == typeof d ? c.parse(d, this) : d } }) , g = (g.kdf = {}).OpenSSL = { execute: function(n, l, q, p) { p || (p = D.random(8)); n = z.create({ keySize: l + q }).compute(n, p); q = D.create(n.words.slice(l), 4 * q); n.sigBytes = 4 * l; return h.create({ key: n, iv: q, salt: p }) } } , k = j.PasswordBasedCipher = o.extend({ cfg: o.cfg.extend({ kdf: g }), encrypt: function(a, q, p, n) { n = this.cfg.extend(n); p = n.kdf.execute(p, a.keySize, a.ivSize); n.iv = p.iv; a = o.encrypt.call(this, a, q, p.key, n); a.mixIn(p); return a }, decrypt: function(a, q, p, n) { n = this.cfg.extend(n); q = this._parse(q, n.format); p = n.kdf.execute(p, a.keySize, a.ivSize, q.salt); n.iv = p.iv; return o.decrypt.call(this, a, q, p.key, n) } }) }(); (function() { for (var C = CryptoJS, K = C.lib.BlockCipher, Q = C.algo, M = [], E = [], D = [], I = [], m = [], A = [], S = [], h = [], J = [], L = [], T = [], R = 0; 256 > R; R++) { T[R] = 128 > R ? R << 1 : R << 1 ^ 283 } for (var P = 0, O = 0, R = 0; 256 > R; R++) { var N = O ^ O << 1 ^ O << 2 ^ O << 3 ^ O << 4 , N = N >>> 8 ^ N & 255 ^ 99; M[P] = N; E[N] = P; var f = T[P] , B = T[f] , o = T[B] , g = 257 * T[N] ^ 16843008 * N; D[P] = g << 24 | g >>> 8; I[P] = g << 16 | g >>> 16; m[P] = g << 8 | g >>> 24; A[P] = g; g = 16843009 * o ^ 65537 * B ^ 257 * f ^ 16843008 * P; S[N] = g << 24 | g >>> 8; h[N] = g << 16 | g >>> 16; J[N] = g << 8 | g >>> 24; L[N] = g; P ? (P = f ^ T[T[T[o ^ f]]], O ^= T[T[O]]) : P = O = 1 } var i = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54] , Q = Q.AES = K.extend({ _doReset: function() { for (var b = this._key, r = b.words, q = b.sigBytes / 4, b = 4 * ((this._nRounds = q + 6) + 1), p = this._keySchedule = [], n = 0; n < b; n++) { if (n < q) { p[n] = r[n] } else { var l = p[n - 1]; n % q ? 6 < q && 4 == n % q && (l = M[l >>> 24] << 24 | M[l >>> 16 & 255] << 16 | M[l >>> 8 & 255] << 8 | M[l & 255]) : (l = l << 8 | l >>> 24, l = M[l >>> 24] << 24 | M[l >>> 16 & 255] << 16 | M[l >>> 8 & 255] << 8 | M[l & 255], l ^= i[n / q | 0] << 24); p[n] = p[n - q] ^ l } } r = this._invKeySchedule = []; for (q = 0; q < b; q++) { n = b - q, l = q % 4 ? p[n] : p[n - 4], r[q] = 4 > q || 4 >= n ? l : S[M[l >>> 24]] ^ h[M[l >>> 16 & 255]] ^ J[M[l >>> 8 & 255]] ^ L[M[l & 255]] } }, encryptBlock: function(d, c) { this._doCryptBlock(d, c, this._keySchedule, D, I, m, A, M) }, decryptBlock: function(b, j) { var e = b[j + 1]; b[j + 1] = b[j + 3]; b[j + 3] = e; this._doCryptBlock(b, j, this._invKeySchedule, S, h, J, L, E); e = b[j + 1]; b[j + 1] = b[j + 3]; b[j + 3] = e }, _doCryptBlock: function(ac, ab, aa, Z, Y, U, G, X) { for (var F = this._nRounds, W = ac[ab] ^ aa[0], V = ac[ab + 1] ^ aa[1], H = ac[ab + 2] ^ aa[2], z = ac[ab + 3] ^ aa[3], y = 4, w = 1; w < F; w++) { var x = Z[W >>> 24] ^ Y[V >>> 16 & 255] ^ U[H >>> 8 & 255] ^ G[z & 255] ^ aa[y++] , v = Z[V >>> 24] ^ Y[H >>> 16 & 255] ^ U[z >>> 8 & 255] ^ G[W & 255] ^ aa[y++] , u = Z[H >>> 24] ^ Y[z >>> 16 & 255] ^ U[W >>> 8 & 255] ^ G[V & 255] ^ aa[y++] , z = Z[z >>> 24] ^ Y[W >>> 16 & 255] ^ U[V >>> 8 & 255] ^ G[H & 255] ^ aa[y++] , W = x , V = v , H = u } x = (X[W >>> 24] << 24 | X[V >>> 16 & 255] << 16 | X[H >>> 8 & 255] << 8 | X[z & 255]) ^ aa[y++]; v = (X[V >>> 24] << 24 | X[H >>> 16 & 255] << 16 | X[z >>> 8 & 255] << 8 | X[W & 255]) ^ aa[y++]; u = (X[H >>> 24] << 24 | X[z >>> 16 & 255] << 16 | X[W >>> 8 & 255] << 8 | X[V & 255]) ^ aa[y++]; z = (X[z >>> 24] << 24 | X[W >>> 16 & 255] << 16 | X[V >>> 8 & 255] << 8 | X[H & 255]) ^ aa[y++]; ac[ab] = x; ac[ab + 1] = v; ac[ab + 2] = u; ac[ab + 3] = z }, keySize: 8 }); C.AES = K._createHelper(Q) } )(); CryptoJS.pad.NoPadding = { pad: function() {}, unpad: function() {} }; function encrypt_md5_aes(c, f) { var g = hex_md5(f); var d = CryptoJS.enc.Utf8.parse(c); var b = CryptoJS.enc.Utf8.parse(c); var e = CryptoJS.enc.Utf8.parse(g); var a = CryptoJS.AES.encrypt(e, d, { iv: b, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding }); return a.toString() } function encrypt_aes(c, f) { var d = CryptoJS.enc.Utf8.parse(c); var b = CryptoJS.enc.Utf8.parse(c); var e = CryptoJS.enc.Utf8.parse(f); var a = CryptoJS.AES.encrypt(e, d, { iv: b, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding }); return a.toString() } function test(dlmy, pwd){ return pwd_encrypt(dlmy, pwd); } ================================================ FILE: 其他实战/【微信】登录参数生成/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-10 Python: 3.7 ================================================ FILE: 其他实战/【微信】登录参数生成/encryp.js ================================================ function e(n, r) { var t = (65535 & n) + (65535 & r) return (n >> 16) + (r >> 16) + (t >> 16) << 16 | 65535 & t } function u(n, r, t, u, o, c) { return e(function(n, r) { return n << r | n >>> 32 - r }(e(e(r, n), e(u, c)), o), t) } function o(n, r, t, e, o, c, f) { return u(r & t | ~r & e, n, r, o, c, f) } function c(n, r, t, e, o, c, f) { return u(r & e | t & ~e, n, r, o, c, f) } function f(n, r, t, e, o, c, f) { return u(r ^ t ^ e, n, r, o, c, f) } function i(n, r, t, e, o, c, f) { return u(t ^ (r | ~e), n, r, o, c, f) } function a(n, r) { n[r >> 5] |= 128 << r % 32, n[14 + (r + 64 >>> 9 << 4)] = r var t, u, a, h, d, g = 1732584193, l = -271733879, v = -1732584194, s = 271733878 for (t = 0; t < n.length; t += 16) u = g, a = l, h = v, d = s, l = i(l = i(l = i(l = i(l = f(l = f(l = f(l = f(l = c(l = c(l = c(l = c(l = o(l = o(l = o(l = o(l, v = o(v, s = o(s, g = o(g, l, v, s, n[t], 7, -680876936), l, v, n[t + 1], 12, -389564586), g, l, n[t + 2], 17, 606105819), s, g, n[t + 3], 22, -1044525330), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 4], 7, -176418897), l, v, n[t + 5], 12, 1200080426), g, l, n[t + 6], 17, -1473231341), s, g, n[t + 7], 22, -45705983), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 8], 7, 1770035416), l, v, n[t + 9], 12, -1958414417), g, l, n[t + 10], 17, -42063), s, g, n[t + 11], 22, -1990404162), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 12], 7, 1804603682), l, v, n[t + 13], 12, -40341101), g, l, n[t + 14], 17, -1502002290), s, g, n[t + 15], 22, 1236535329), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 1], 5, -165796510), l, v, n[t + 6], 9, -1069501632), g, l, n[t + 11], 14, 643717713), s, g, n[t], 20, -373897302), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 5], 5, -701558691), l, v, n[t + 10], 9, 38016083), g, l, n[t + 15], 14, -660478335), s, g, n[t + 4], 20, -405537848), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 9], 5, 568446438), l, v, n[t + 14], 9, -1019803690), g, l, n[t + 3], 14, -187363961), s, g, n[t + 8], 20, 1163531501), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 13], 5, -1444681467), l, v, n[t + 2], 9, -51403784), g, l, n[t + 7], 14, 1735328473), s, g, n[t + 12], 20, -1926607734), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 5], 4, -378558), l, v, n[t + 8], 11, -2022574463), g, l, n[t + 11], 16, 1839030562), s, g, n[t + 14], 23, -35309556), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 1], 4, -1530992060), l, v, n[t + 4], 11, 1272893353), g, l, n[t + 7], 16, -155497632), s, g, n[t + 10], 23, -1094730640), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 13], 4, 681279174), l, v, n[t], 11, -358537222), g, l, n[t + 3], 16, -722521979), s, g, n[t + 6], 23, 76029189), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 9], 4, -640364487), l, v, n[t + 12], 11, -421815835), g, l, n[t + 15], 16, 530742520), s, g, n[t + 2], 23, -995338651), v = i(v, s = i(s, g = i(g, l, v, s, n[t], 6, -198630844), l, v, n[t + 7], 10, 1126891415), g, l, n[t + 14], 15, -1416354905), s, g, n[t + 5], 21, -57434055), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 12], 6, 1700485571), l, v, n[t + 3], 10, -1894986606), g, l, n[t + 10], 15, -1051523), s, g, n[t + 1], 21, -2054922799), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 8], 6, 1873313359), l, v, n[t + 15], 10, -30611744), g, l, n[t + 6], 15, -1560198380), s, g, n[t + 13], 21, 1309151649), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 4], 6, -145523070), l, v, n[t + 11], 10, -1120210379), g, l, n[t + 2], 15, 718787259), s, g, n[t + 9], 21, -343485551), g = e(g, u), l = e(l, a), v = e(v, h), s = e(s, d) return [g, l, v, s] } function h(n) { var r, t = "" for (r = 0; r < 32 * n.length; r += 8) t += String.fromCharCode(n[r >> 5] >>> r % 32 & 255) return t } function d(n) { var r, t = [] for (t[(n.length >> 2) - 1] = void 0, r = 0; r < t.length; r += 1) t[r] = 0 for (r = 0; r < 8 * n.length; r += 8) t[r >> 5] |= (255 & n.charCodeAt(r / 8)) << r % 32 return t } function g(n) { var r, t, e = "" for (t = 0; t < n.length; t += 1) r = n.charCodeAt(t), e += "0123456789abcdef".charAt(r >>> 4 & 15) + "0123456789abcdef".charAt(15 & r) return e } function l(n) { return unescape(encodeURIComponent(n)) } function v(n) { return function(n) { return h(a(d(n), 8 * n.length)) }(l(n)) } function s(n, r) { return function(n, r) { var t, e, u = d(n), o = [], c = [] for (o[15] = c[15] = void 0, u.length > 16 && (u = a(u, 8 * n.length)), t = 0; t < 16; t += 1) o[t] = 909522486 ^ u[t], c[t] = 1549556828 ^ u[t] return e = a(o.concat(d(r)), 512 + 8 * r.length), h(a(c.concat(e), 640)) }(l(n), l(r)) } function make_pwd(n, r, t) { return r ? t ? s(r, n) : function(n, r) { return g(s(n, r)) }(r, n) : t ? v(n) : function(n) { return g(v(n)) }(n) } ================================================ FILE: 其他实战/【微信】登录参数生成/make_pwd.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-22 Python: 3.7 import execjs.runtime_names class WeXin(object): """ wx 登陆密码解析 """ def __init__(self): self.url = 'https://mp.weixin.qq.com/?token=&lang=zh_CN' print('引擎', execjs.get().name) @staticmethod def make_pwd(pwd): with open("encryp.js", "r", encoding="utf-8") as f: ctx = execjs.compile(f.read()) ret = ctx.call("make_pwd", pwd) print(ret) if __name__ == '__main__': pdd = WeXin() pdd.make_pwd('密码') ================================================ FILE: 其他实战/【房价】房价获取/README.md ================================================ # 概述 这不是一个完整的项目,是测试demo,可以获取区域内在售房产单套价格 **代码只是测试了一个最新销售小区中的一栋楼的在售楼房价格** 如果需要更完整的,就联系作者 ================================================ FILE: 其他实战/【房价】房价获取/main.py ================================================ # -*- encoding: utf-8 -*- # Auth: Zok Email: 362416272@qq.com # Date: 2020/2/21 import requests import json import os import sys from urllib import parse sys.path.append(os.path.abspath(os.path.dirname(os.path.dirname(__file__)))) from util import * class Fun: """ So 层 IV: jhf5632s Key:hjkiuy6754edxc32890tfhjkw23xdea """ def __init__(self): self.session = requests.session() def get_list(self): """ 获取楼盘列表 作为演示只获取第一页,中的第一个地产 """ get_list_url = 'https://mobileapi.funi.com/m/community/search.json?page=1&pageSize=20&lng=106.593157&lat=29.541358&cityId=1' response = self.session.get(get_list_url) return json.loads(response.text) def get_building(self, _id): """ 获取楼栋表 """ house_id = _id key = '81$$@$$80$$@$$40$$@$$0$$@$$69$$@$$68$$@$$11$$@$$' + house_id + '$$@$$59$$@$$10$$@$$39$$@$$78$$@$$79$$@$$79$$@$$35$$@$$29$$@$$83$$@$$57$$@$$79$$@$$24$$@$$7$$@$$62$$@$$7$$@$$37$$@$$5$$@$$73$$@$$49$$@$$16$$@$$79$$@$$45$$@$$5' key = des3_encrypt(key) key = parse.quote(key) url = 'https://mobileapi.funi.com/m/community/building211.json?key={key}'.format(key=key) response = self.session.get(url) print('楼栋数据', response.text) return json.loads(response.text) def one_fun(self, infos, _id): """ 通过获取到的楼栋表,取每栋的可售房信息 测试,只取了前三个 :return: """ # 组合楼栋串 这里只取前三栋,作为测试 buildingIdArray = ','.join([item.get('id') for item in infos.get('data')][:3]) url = 'https://mobileapi.funi.com/m/community/buildingAmount.json' data = { 'tal_id': '867686021859176', # ? 固定 'cityId': '1', # 成都,测试这里固定先 'communityId': _id, # 14944 = 蓝光观岭国际社区9期 'buildingIdArray': buildingIdArray, 'tal': 'ANDROID', } response = self.session.post(url, data=data) print('楼栋数据', response.text) return json.loads(response.text) def getHousePrice(self, buildingId, _id): """ 获取房价单间 这里测试,只取获取到得建筑得第一栋 :return: """ bId = buildingId houseId = _id unitId = '1' key = '59$$@$$34$$@$$7$$@$$' + houseId + '$$@$$' + bId + '$$@$$87$$@$$30$$@$$18$$@$$8$$@$$' + unitId + '$$@$$82$$@$$14$$@$$53$$@$$51$$@$$51$$@$$70$$@$$50$$@$$3$$@$$57$$@$$72$$@$$39$$@$$95$$@$$4$$@$$43$$@$$37$$@$$94$$@$$35$$@$$38$$@$$79$$@$$96$$@$$' key = make_str(key) # 这里需要重新处理 key = des3_encrypt(key) key = parse.quote(key) url = 'https://mobileapi.funi.com/m/community/house211.json?key={key}'.format(key=key) response = self.session.get(url) print('房价返回数据', response.text) return json.loads(response.text) def parse_data(self, items): """ 这里只解析,在售状态得!! :param items: :return: """ for item in items.get('data'): house_list = item.get('houseList') for house in house_list: if decrypt_str(house.get('status')) == "已售": continue print('****每户分割线****') print('楼层:', decrypt_str(house.get('floor'))) print('套内:', decrypt_str(house.get('roomNo'))) print('建面:', decrypt_str(house.get('totalArea'))) print('区域:', decrypt_str(house.get('area'))) print('状态:', decrypt_str(house.get('status'))) if house.get('listWaterPrice'): print('【价格】:', decrypt_str(house.get('listWaterPrice'))) # 这里其实还有更多字段,后面有空再研究 def start(self): infos = self.get_list() # 只取一个小区测试 _id = infos.get('data')[0].get('id') data = self.get_building(_id) buildings = self.one_fun(data, _id) # 只取一栋楼测试 buildingId = buildings.get('data')[0].get('buildingId') datas = self.getHousePrice(buildingId, _id) self.parse_data(datas) if __name__ == '__main__': fun = Fun() fun.start() ================================================ FILE: 其他实战/【房价】房价获取/util.py ================================================ # -*- encoding: utf-8 -*- # Auth: Zok Email: 362416272@qq.com # Date: 2020/2/21 from pyDes import * import base64 KEY = b'hjkiuy6754edxc32890tfhjkw23xdea'[:24] # 密钥只需要24位 IV = b'jhf5632s' def des3_encrypt(s): """ 3DES 加密 :param s: 原始字符串 :return: 加密后字符串,16进制 """ k = triple_des(KEY, CBC, IV, pad=None, padmode=PAD_PKCS5) en = k.encrypt(s, padmode=PAD_PKCS5) return base64.b64encode(en).decode('utf-8') def des3_decrypt(s): """ 3DES 解密 :param s: 加密字符串 :return: 明文 """ _str = base64.b64decode(s) k = triple_des(KEY, CBC, IV, pad=None, padmode=PAD_PKCS5) en = k.decrypt(_str, padmode=PAD_PKCS5).decode('utf-8') return en def decrypt_str(s): info = des3_decrypt(s) # 获得 解密后得 base64 content = info[:-6] hIndex = base64.b64decode(info[-6:].replace("==", "")).decode().split("_") content2 = content[int(hIndex[0]):] txt = base64.b64decode( content2[: len(content2)-int(hIndex[1])][::-1] ).decode('utf-8').replace("##", "").replace("{@mk7}", "") return txt def make_str(enB): """ 复写字符串算法 根据传入文档,转换ascii并计算和 并复写算法 for (byte item : enB.getBytes("UTF-8")) { sumResult = Long.valueOf(sumResult.longValue() + ((long) item)); } """ count = 0 for i in enB: count += ord(i) # print('合', count) # 每个字符的 Ascii 码的总和 p = count % len(enB) n = 1 # print('position', p) while p + n < len(enB) and p - n >= 0: enB = rep( rep(enB, p + n, enB[p - n]), p - n, enB[p + n] ) n += 1 return enB def rep(source, index, rep_str): """ 复写的java层字符转换方法 :return: """ str1 = source[0: index] return str1 + rep_str + source[index + 1:] if __name__ == '__main__': decrypt_str("AaDaKV8GxE77rIScVyq7E0rebiFQjhrkq8PUcmR8A22NHhAW58pQkQ==") ================================================ FILE: 其他实战/【房天下】自动登录/encryp.js ================================================ function setMaxDigits(n) { maxDigits = n; ZERO_ARRAY = new Array(maxDigits); for (var t = 0; t < ZERO_ARRAY.length; t++) ZERO_ARRAY[t] = 0; bigZero = new BigInt; bigOne = new BigInt; bigOne.digits[0] = 1 } function BigInt(n) { this.digits = typeof n == "boolean" && n == !0 ? null : ZERO_ARRAY.slice(0); this.isNeg = !1 } function biFromDecimal(n) { for (var u = n.charAt(0) == "-", t = u ? 1 : 0, i, f, r; t < n.length && n.charAt(t) == "0";) ++t; if (t == n.length) i = new BigInt; else { for (f = n.length - t, r = f % dpl10, r == 0 && (r = dpl10), i = biFromNumber(Number(n.substr(t, r))), t += r; t < n.length;) i = biAdd(biMultiply(i, lr10), biFromNumber(Number(n.substr(t, dpl10)))), t += dpl10; i.isNeg = u } return i } function biCopy(n) { var t = new BigInt(!0); return t.digits = n.digits.slice(0), t.isNeg = n.isNeg, t } function biFromNumber(n) { var t = new BigInt, i; for (t.isNeg = n < 0, n = Math.abs(n), i = 0; n > 0;) t.digits[i++] = n & maxDigitVal, n = Math.floor(n / biRadix); return t } function reverseStr(n) { for (var i = "", t = n.length - 1; t > -1; --t) i += n.charAt(t); return i } function biToString(n, t) { var r = new BigInt, i, u; for (r.digits[0] = t, i = biDivideModulo(n, r), u = hexatrigesimalToChar[i[1].digits[0]]; biCompare(i[0], bigZero) == 1;) i = biDivideModulo(i[0], r), digit = i[1].digits[0], u += hexatrigesimalToChar[i[1].digits[0]]; return (n.isNeg ? "-" : "") + reverseStr(u) } function biToDecimal(n) { var i = new BigInt, t, r; for (i.digits[0] = 10, t = biDivideModulo(n, i), r = String(t[1].digits[0]); biCompare(t[0], bigZero) == 1;) t = biDivideModulo(t[0], i), r += String(t[1].digits[0]); return (n.isNeg ? "-" : "") + reverseStr(r) } function digitToHex(n) { var t = ""; for (i = 0; i < 4; ++i) t += hexToChar[n & 15], n >>>= 4; return reverseStr(t) } function biToHex(n) { for (var i = "", r = biHighIndex(n), t = biHighIndex(n); t > -1; --t) i += digitToHex(n.digits[t]); return i } function charToHex(n) { var t = 48 , u = t + 9 , i = 97 , f = i + 25 , r = 65; return n >= t && n <= u ? n - t : n >= r && n <= 90 ? 10 + n - r : n >= i && n <= f ? 10 + n - i : 0 } function hexToDigit(n) { for (var t = 0, r = Math.min(n.length, 4), i = 0; i < r; ++i) t <<= 4, t |= charToHex(n.charCodeAt(i)); return t } function biFromHex(n) { for (var i = new BigInt, u = n.length, t = u, r = 0; t > 0; t -= 4, ++r) i.digits[r] = hexToDigit(n.substr(Math.max(t - 4, 0), Math.min(t, 4))); return i } function biFromString(n, t) { var f = n.charAt(0) == "-", e = f ? 1 : 0, i = new BigInt, r = new BigInt, u; for (r.digits[0] = 1, u = n.length - 1; u >= e; u--) { var o = n.charCodeAt(u) , s = charToHex(o) , h = biMultiplyDigit(r, s); i = biAdd(i, h); r = biMultiplyDigit(r, t) } return i.isNeg = f, i } function biDump(n) { return (n.isNeg ? "-" : "") + n.digits.join(" ") } function biAdd(n, t) { var r, u, f, i; if (n.isNeg != t.isNeg) t.isNeg = !t.isNeg, r = biSubtract(n, t), t.isNeg = !t.isNeg; else { for (r = new BigInt, u = 0, i = 0; i < n.digits.length; ++i) f = n.digits[i] + t.digits[i] + u, r.digits[i] = f % biRadix, u = Number(f >= biRadix); r.isNeg = n.isNeg } return r } function biSubtract(n, t) { var r, f, u, i; if (n.isNeg != t.isNeg) t.isNeg = !t.isNeg, r = biAdd(n, t), t.isNeg = !t.isNeg; else { for (r = new BigInt, u = 0, i = 0; i < n.digits.length; ++i) f = n.digits[i] - t.digits[i] + u, r.digits[i] = f % biRadix, r.digits[i] < 0 && (r.digits[i] += biRadix), u = 0 - Number(f < 0); if (u == -1) { for (u = 0, i = 0; i < n.digits.length; ++i) f = 0 - r.digits[i] + u, r.digits[i] = f % biRadix, r.digits[i] < 0 && (r.digits[i] += biRadix), u = 0 - Number(f < 0); r.isNeg = !n.isNeg } else r.isNeg = n.isNeg } return r } function biHighIndex(n) { for (var t = n.digits.length - 1; t > 0 && n.digits[t] == 0;) --t; return t } function biNumBits(n) { for (var i = biHighIndex(n), r = n.digits[i], u = (i + 1) * bitsPerDigit, t = u; t > u - bitsPerDigit; --t) { if ((r & 32768) != 0) break; r <<= 1 } return t } function biMultiply(n, t) { for (var i = new BigInt, u, o = biHighIndex(n), s = biHighIndex(t), e, f, r = 0; r <= s; ++r) { for (u = 0, f = r, j = 0; j <= o; ++j, ++f) e = i.digits[f] + n.digits[j] * t.digits[r] + u, i.digits[f] = e & maxDigitVal, u = e >>> biRadixBits; i.digits[r + o + 1] = u } return i.isNeg = n.isNeg != t.isNeg, i } function biMultiplyDigit(n, t) { var u, r, f, i; for (result = new BigInt, u = biHighIndex(n), r = 0, i = 0; i <= u; ++i) f = result.digits[i] + n.digits[i] * t + r, result.digits[i] = f & maxDigitVal, r = f >>> biRadixBits; return result.digits[1 + u] = r, result } function arrayCopy(n, t, i, r, u) { for (var o = Math.min(t + u, n.length), f = t, e = r; f < o; ++f, ++e) i[e] = n[f] } function biShiftLeft(n, t) { var e = Math.floor(t / bitsPerDigit), i = new BigInt, u, o, r, f; for (arrayCopy(n.digits, 0, i.digits, e, i.digits.length - e), u = t % bitsPerDigit, o = bitsPerDigit - u, r = i.digits.length - 1, f = r - 1; r > 0; --r, --f) i.digits[r] = i.digits[r] << u & maxDigitVal | (i.digits[f] & highBitMasks[u]) >>> o; return i.digits[0] = i.digits[r] << u & maxDigitVal, i.isNeg = n.isNeg, i } function biShiftRight(n, t) { var e = Math.floor(t / bitsPerDigit), i = new BigInt, u, o, r, f; for (arrayCopy(n.digits, e, i.digits, 0, n.digits.length - e), u = t % bitsPerDigit, o = bitsPerDigit - u, r = 0, f = r + 1; r < i.digits.length - 1; ++r, ++f) i.digits[r] = i.digits[r] >>> u | (i.digits[f] & lowBitMasks[u]) << o; return i.digits[i.digits.length - 1] >>>= u, i.isNeg = n.isNeg, i } function biMultiplyByRadixPower(n, t) { var i = new BigInt; return arrayCopy(n.digits, 0, i.digits, t, i.digits.length - t), i } function biDivideByRadixPower(n, t) { var i = new BigInt; return arrayCopy(n.digits, t, i.digits, 0, i.digits.length - t), i } function biModuloByRadixPower(n, t) { var i = new BigInt; return arrayCopy(n.digits, 0, i.digits, 0, t), i } function biCompare(n, t) { if (n.isNeg != t.isNeg) return 1 - 2 * Number(n.isNeg); for (var i = n.digits.length - 1; i >= 0; --i) if (n.digits[i] != t.digits[i]) return n.isNeg ? 1 - 2 * Number(n.digits[i] > t.digits[i]) : 1 - 2 * Number(n.digits[i] < t.digits[i]); return 0 } function biDivideModulo(n, t) { var a = biNumBits(n), s = biNumBits(t), v = t.isNeg, r, i, u, e, h, o, f, y, p; if (a < s) return n.isNeg ? (r = biCopy(bigOne), r.isNeg = !t.isNeg, n.isNeg = !1, t.isNeg = !1, i = biSubtract(t, n), n.isNeg = !0, t.isNeg = v) : (r = new BigInt, i = biCopy(n)), [r, i]; for (r = new BigInt, i = n, u = Math.ceil(s / bitsPerDigit) - 1, e = 0; t.digits[u] < biHalfRadix;) t = biShiftLeft(t, 1), ++e, ++s, u = Math.ceil(s / bitsPerDigit) - 1; for (i = biShiftLeft(i, e), a += e, h = Math.ceil(a / bitsPerDigit) - 1, o = biMultiplyByRadixPower(t, h - u); biCompare(i, o) != -1;) ++r.digits[h - u], i = biSubtract(i, o); for (f = h; f > u; --f) { var c = f >= i.digits.length ? 0 : i.digits[f] , w = f - 1 >= i.digits.length ? 0 : i.digits[f - 1] , b = f - 2 >= i.digits.length ? 0 : i.digits[f - 2] , l = u >= t.digits.length ? 0 : t.digits[u] , k = u - 1 >= t.digits.length ? 0 : t.digits[u - 1]; for (r.digits[f - u - 1] = c == l ? maxDigitVal : Math.floor((c * biRadix + w) / l), y = r.digits[f - u - 1] * (l * biRadix + k), p = c * biRadixSquared + (w * biRadix + b); y > p;) --r.digits[f - u - 1], y = r.digits[f - u - 1] * (l * biRadix | k), p = c * biRadix * biRadix + (w * biRadix + b); o = biMultiplyByRadixPower(t, f - u - 1); i = biSubtract(i, biMultiplyDigit(o, r.digits[f - u - 1])); i.isNeg && (i = biAdd(i, o), --r.digits[f - u - 1]) } return i = biShiftRight(i, e), r.isNeg = n.isNeg != v, n.isNeg && (r = v ? biAdd(r, bigOne) : biSubtract(r, bigOne), t = biShiftRight(t, e), i = biSubtract(t, i)), i.digits[0] == 0 && biHighIndex(i) == 0 && (i.isNeg = !1), [r, i] } function biDivide(n, t) { return biDivideModulo(n, t)[0] } function biModulo(n, t) { return biDivideModulo(n, t)[1] } function biMultiplyMod(n, t, i) { return biModulo(biMultiply(n, t), i) } function biPow(n, t) { for (var r = bigOne, i = n; ;) { if ((t & 1) != 0 && (r = biMultiply(r, i)), t >>= 1, t == 0) break; i = biMultiply(i, i) } return r } function biPowMod(n, t, i) { for (var f = bigOne, u = n, r = t; ;) { if ((r.digits[0] & 1) != 0 && (f = biMultiplyMod(f, u, i)), r = biShiftRight(r, 1), r.digits[0] == 0 && biHighIndex(r) == 0) break; u = biMultiplyMod(u, u, i) } return f } function BarrettMu(n) { this.modulus = biCopy(n); this.k = biHighIndex(this.modulus) + 1; var t = new BigInt; t.digits[2 * this.k] = 1; this.mu = biDivide(t, this.modulus); this.bkplus1 = new BigInt; this.bkplus1.digits[this.k + 1] = 1; this.modulo = BarrettMu_modulo; this.multiplyMod = BarrettMu_multiplyMod; this.powMod = BarrettMu_powMod } function BarrettMu_modulo(n) { var r = biDivideByRadixPower(n, this.k - 1), u = biMultiply(r, this.mu), f = biDivideByRadixPower(u, this.k + 1), e = biModuloByRadixPower(n, this.k + 1), o = biMultiply(f, this.modulus), s = biModuloByRadixPower(o, this.k + 1), t = biSubtract(e, s), i; for (t.isNeg && (t = biAdd(t, this.bkplus1)), i = biCompare(t, this.modulus) >= 0; i;) t = biSubtract(t, this.modulus), i = biCompare(t, this.modulus) >= 0; return t } function BarrettMu_multiplyMod(n, t) { var i = biMultiply(n, t); return this.modulo(i) } function BarrettMu_powMod(n, t) { var u = new BigInt, r, i; for (u.digits[0] = 1, r = n, i = t; ;) { if ((i.digits[0] & 1) != 0 && (u = this.multiplyMod(u, r)), i = biShiftRight(i, 1), i.digits[0] == 0 && biHighIndex(i) == 0) break; r = this.multiplyMod(r, r) } return u } function RSAKeyPair(n, t, i) { this.e = biFromHex(n); this.d = biFromHex(t); this.m = biFromHex(i); this.digitSize = 2 * biHighIndex(this.m) + 2; this.chunkSize = this.digitSize - 11; this.radix = 16; this.barrett = new BarrettMu(this.m) } function twoDigit(n) { return (n < 10 ? "0" : "") + String(n) } function encryptedString(n, t) { var e, o, s, h, c, i, f, u, v, l, y; if (n.chunkSize > n.digitSize - 11) return "Error"; for (var a = [], p = t.length, r = 0; r < p;) a[r] = t.charCodeAt(r), r++; for (e = a.length, o = "", r = 0; r < e; r += n.chunkSize) { for (c = new BigInt, s = 0, f = r + n.chunkSize > e ? e % n.chunkSize : n.chunkSize, u = [], i = 0; i < f; i++) u[i] = a[r + f - 1 - i]; for (u[f] = 0, v = Math.max(8, n.digitSize - 3 - f), i = 0; i < v; i++) u[f + 1 + i] = Math.floor(Math.random() * 254) + 1; for (u[n.digitSize - 2] = 2, u[n.digitSize - 1] = 0, h = 0; h < n.digitSize; ++s) c.digits[s] = u[h++], c.digits[s] += u[h++] << 8; l = n.barrett.powMod(c, n.e); y = n.radix == 16 ? biToHex(l) : biToString(l, n.radix); o += y + " " } return o.substring(0, o.length - 1) } function decryptedString(n, t) { for (var e = t.split(" "), i = "", r, u, o, f = 0; f < e.length; ++f) for (o = n.radix == 16 ? biFromHex(e[f]) : biFromString(e[f], n.radix), u = n.barrett.powMod(o, n.d), r = 0; r <= biHighIndex(u); ++r) i += String.fromCharCode(u.digits[r] & 255, u.digits[r] >> 8); return i.charCodeAt(i.length - 1) == 0 && (i = i.substring(0, i.length - 1)), i } var biRadixBase = 2, biRadixBits = 16, bitsPerDigit = biRadixBits, biRadix = 65536, biHalfRadix = biRadix >>> 1, biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix - 1, maxInteger = 9999999999999998, maxDigits, ZERO_ARRAY, bigZero, bigOne, dpl10, lr10, hexatrigesimalToChar, hexToChar, highBitMasks, lowBitMasks; setMaxDigits(20); dpl10 = 15; lr10 = biFromNumber(1e15); hexatrigesimalToChar = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; hexToChar = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; highBitMasks = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535]; lowBitMasks = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535]; setMaxDigits(129); function getPwd(pwd) { setMaxDigits(129); var key_to_encode = new RSAKeyPair("010001", "", "978C0A92D2173439707498F0944AA476B1B62595877DD6FA87F6E2AC6DCB3D0BF0B82857439C99B5091192BC134889DFF60C562EC54EFBA4FF2F9D55ADBCCEA4A2FBA80CB398ED501280A007C83AF30C3D1A142D6133C63012B90AB26AC60C898FB66EDC3192C3EC4FF66925A64003B72496099F4F09A9FB72A2CF9E4D770C41"); return encryptedString(key_to_encode, pwd) } ================================================ FILE: 其他实战/【房天下】自动登录/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-26 Python: 3.7 import execjs.runtime_names import requests class Fang: """ 房天下自动登陆 https://passport.fang.com/ """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.js = None self.api = 'https://passport.fang.com/login.api' self.js_init() def js_init(self): print('引擎', execjs.get().name) with open("encryp.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def login(self): data = { 'uid': self.user, 'pwd': self.js.call('getPwd', self.pwd), 'Service': 'soufun-passport-web', 'AutoLogin': '1' } headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'Origin': 'https://passport.fang.com', 'Referer': 'https://passport.fang.com/', } response = requests.post(self.api, data=data, headers=headers) print(response.text) print(response.cookies) if __name__ == '__main__': username = input('输入房天下账号') password = input('输入密码') f = Fang(username, password) f.login() ================================================ FILE: 其他实战/【新浪微博】密码解密/execute.js ================================================ var navigator = {}; var sinaSSOEncoder = sinaSSOEncoder || {}; (function() { var a = 0, b = 8; this.hex_sha1 = function(a) { return i(c(h(a), a.length * b)) }; var c = function(a, b) { a[b >> 5] |= 128 << 24 - b % 32; a[(b + 64 >> 9 << 4) + 15] = b; var c = Array(80), h = 1732584193, i = -271733879, j = -1732584194, k = 271733878, l = -1009589776; for (var m = 0; m < a.length; m += 16) { var n = h, o = i, p = j, q = k, r = l; for (var s = 0; s < 80; s++) { s < 16 ? c[s] = a[m + s] : c[s] = g(c[s - 3] ^ c[s - 8] ^ c[s - 14] ^ c[s - 16], 1); var t = f(f(g(h, 5), d(s, i, j, k)), f(f(l, c[s]), e(s))); l = k; k = j; j = g(i, 30); i = h; h = t } h = f(h, n); i = f(i, o); j = f(j, p); k = f(k, q); l = f(l, r) } return [h, i, j, k, l] }, d = function(a, b, c, d) { return a < 20 ? b & c | ~b & d : a < 40 ? b ^ c ^ d : a < 60 ? b & c | b & d | c & d : b ^ c ^ d }, e = function(a) { return a < 20 ? 1518500249 : a < 40 ? 1859775393 : a < 60 ? -1894007588 : -899497514 }, f = function(a, b) { var c = (a & 65535) + (b & 65535), d = (a >> 16) + (b >> 16) + (c >> 16); return d << 16 | c & 65535 }, g = function(a, b) { return a << b | a >>> 32 - b }, h = function(a) { var c = [], d = (1 << b) - 1; for (var e = 0; e < a.length * b; e += b) c[e >> 5] |= (a.charCodeAt(e / b) & d) << 24 - e % 32; return c }, i = function(b) { var c = a ? "0123456789ABCDEF" : "0123456789abcdef", d = ""; for (var e = 0; e < b.length * 4; e++) d += c.charAt(b[e >> 2] >> (3 - e % 4) * 8 + 4 & 15) + c.charAt(b[e >> 2] >> (3 - e % 4) * 8 & 15); return d }, j = function(a) { var b = "", c = 0; for (; c < a.length; c++) b += "%" + k(a[c]); return decodeURIComponent(b) }, k = function(a) { var b = "0" + a.toString(16); return b.length <= 2 ? b : b.substr(1) }; this.base64 = { encode: function(a) { a = "" + a; if (a == "") return ""; var b = "", c, d, e = "", f, g, h, i = "", j = 0; do { c = a.charCodeAt(j++); d = a.charCodeAt(j++); e = a.charCodeAt(j++); f = c >> 2; g = (c & 3) << 4 | d >> 4; h = (d & 15) << 2 | e >> 6; i = e & 63; isNaN(d) ? h = i = 64 : isNaN(e) && (i = 64); b = b + this._keys.charAt(f) + this._keys.charAt(g) + this._keys.charAt(h) + this._keys.charAt(i); c = d = e = ""; f = g = h = i = "" } while (j < a.length); return b }, decode: function(a, b, c) { var d = function(a, b) { for (var c = 0; c < a.length; c++) if (a[c] === b) return c; return -1 }; typeof a == "string" && (a = a.split("")); var e = [], f, g, h = "", i, j, k, l = ""; a.length % 4 == 0; var m = /[^A-Za-z0-9+\/=]/, n = this._keys.split(""); if (b == "urlsafe") { m = /[^A-Za-z0-9-_=]/; n = this._keys_urlsafe.split("") } if (b == "subp_v2") { m = /[^A-Za-z0-9_=-]/; n = this._subp_v2_keys.split("") } if (b == "subp_v3_3") { m = /[^A-Za-z0-9-_.-]/; n = this._subp_v3_keys_3.split("") } var o = 0; if (b == "binnary") { n = []; for (o = 0; o <= 64; o++) n[o] = o + 128 } if (b != "binnary" && m.test(a.join(""))) return c == "array" ? [] : ""; o = 0; do { i = d(n, a[o++]); j = d(n, a[o++]); k = d(n, a[o++]); l = d(n, a[o++]); f = i << 2 | j >> 4; g = (j & 15) << 4 | k >> 2; h = (k & 3) << 6 | l; e.push(f); k != 64 && k != -1 && e.push(g); l != 64 && l != -1 && e.push(h); f = g = h = ""; i = j = k = l = "" } while (o < a.length); if (c == "array") return e; var p = "", q = 0; for (; q < e.lenth; q++) p += String.fromCharCode(e[q]); return p }, _keys: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", _keys_urlsafe: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=", _subp_v2_keys: "uAL715W8e3jJCcNU0lT_FSXVgxpbEDdQ4vKaIOH2GBPtfzqsmYZo-wRM9i6hynrk=", _subp_v3_keys_3: "5WFh28sGziZTeS1lBxCK-HgPq9IdMUwknybo.LJrQD3uj_Va7pE0XfcNR4AOYvm6t" }; this.Cookie = { decode: function(a) { var b = [], c = a.substr(0, 3), d = a.substr(3); switch (c) { case "v01": for (var e = 0; e < d.length; e += 2) b.push(parseInt(d.substr(e, 2), 16)); return decodeURIComponent(j(sinaSSOEncoder.base64.decode(b, "binnary", "array"))); case "v02": d = d.replace(/\./g, "="); b = sinaSSOEncoder.base64.decode(d, "urlsafe", "array"); return j(sinaSSOEncoder.base64.decode(b, "binnary", "array")); default: return decodeURIComponent(a) } } }; this.getSUBPCookie = { __parse: function(a) { var b, c, d, e, f, g = 0, h, i = {}, k = "", l = ""; if (!a) return i; do { c = a[g]; b = ++g; for (h = g; h < c + b; h++, g++) k += String.fromCharCode(a[h]); e = a[g]; b = ++g; if (k == "status" || k == "flag") for (h = g; h < e + b; h++, g++) l += a[h]; else { l = a.slice(b, e + b); try { l = j(l) } catch (m) { l = "" } g += e } i[k] = l; k = ""; l = "" } while (g < a.length); return i }, decode: function(a) { var b = [], c, d = a.substr(0, 3), e = decodeURIComponent(a.substr(3)); switch (d) { case "002": b = sinaSSOEncoder.base64.decode(e, "subp_v2", "array"); return sinaSSOEncoder.getSUBPCookie.__parse(b); case "003": c = e.substr(0, 1); e = e.substr(1); b = sinaSSOEncoder.base64.decode(e, "subp_v3_" + c, "array"); return sinaSSOEncoder.getSUBPCookie.__parse(b); default: return decodeURIComponent(a) } } } }).call(sinaSSOEncoder); (function() { function bt(a) { var b = bp(a, this.n.bitLength() + 7 >> 3); if (b == null) return null; var c = this.doPublic(b); if (c == null) return null; var d = c.toString(16); return (d.length & 1) == 0 ? d : "0" + d } function bs(a) { return a.modPowInt(this.e, this.n) } function br(a, b) { if (a != null && b != null && a.length > 0 && b.length > 0) { this.n = bm(a, 16); this.e = parseInt(b, 16) } else alert("Invalid RSA public key") } function bq() { this.n = null; this.e = 0; this.d = null; this.p = null; this.q = null; this.dmp1 = null; this.dmq1 = null; this.coeff = null } function bp(a, b) { if (b < a.length + 11) { alert("Message too long for RSA"); return null } var c = [], e = a.length - 1; while (e >= 0 && b > 0) { var f = a.charCodeAt(e--); if (f < 128) c[--b] = f; else if (f > 127 && f < 2048) { c[--b] = f & 63 | 128; c[--b] = f >> 6 | 192 } else { c[--b] = f & 63 | 128; c[--b] = f >> 6 & 63 | 128; c[--b] = f >> 12 | 224 } } c[--b] = 0; var g = new bl, h = []; while (b > 2) { h[0] = 0; while (h[0] == 0) g.nextBytes(h); c[--b] = h[0] } c[--b] = 2; c[--b] = 0; return new d(c) } function bo(a) { return a < 16 ? "0" + a.toString(16) : a.toString(16) } function bn(a, b) { var c = "", d = 0; while (d + b < a.length) { c += a.substring(d, d + b) + "\n"; d += b } return c + a.substring(d, a.length) } function bm(a, b) { return new d(a, b) } function bl() {} function bk(a) { var b; for (b = 0; b < a.length; ++b) a[b] = bj() } function bj() { if (bc == null) { bg(); bc = ba(); bc.init(bd); for (be = 0; be < bd.length; ++be) bd[be] = 0; be = 0 } return bc.next() } function bg() { bf((new Date).getTime()) } function bf(a) { bd[be++] ^= a & 255; bd[be++] ^= a >> 8 & 255; bd[be++] ^= a >> 16 & 255; bd[be++] ^= a >> 24 & 255; be >= bb && (be -= bb) } function ba() { return new Z } function _() { var a; this.i = this.i + 1 & 255; this.j = this.j + this.S[this.i] & 255; a = this.S[this.i]; this.S[this.i] = this.S[this.j]; this.S[this.j] = a; return this.S[a + this.S[this.i] & 255] } function $(a) { var b, c, d; for (b = 0; b < 256; ++b) this.S[b] = b; c = 0; for (b = 0; b < 256; ++b) { c = c + this.S[b] + a[b % a.length] & 255; d = this.S[b]; this.S[b] = this.S[c]; this.S[c] = d } this.i = 0; this.j = 0 } function Z() { this.i = 0; this.j = 0; this.S = [] } function Y(a, b) { var c; a < 256 || b.isEven() ? c = new J(b) : c = new Q(b); return this.exp(a, c) } function X(a, b) { if (a > 4294967295 || a < 1) return d.ONE; var c = e(), f = e(), g = b.convert(this), h = y(a) - 1; g.copyTo(c); while (--h >= 0) { b.sqrTo(c, f); if ((a & 1 << h) > 0) b.mulTo(f, g, c); else { var i = c; c = f; f = i } } return b.revert(c) } function W() { return (this.t > 0 ? this[0] & 1 : this.s) == 0 } function V(a, b, c) { a.multiplyTo(b, c); this.reduce(c) } function U(a, b) { a.squareTo(b); this.reduce(b) } function T(a) { while (a.t <= this.mt2) a[a.t++] = 0; for (var b = 0; b < this.m.t; ++b) { var c = a[b] & 32767, d = c * this.mpl + ((c * this.mph + (a[b] >> 15) * this.mpl & this.um) << 15) & a.DM; c = b + this.m.t; a[c] += this.m.am(0, d, a, b, 0, this.m.t); while (a[c] >= a.DV) { a[c] -= a.DV; a[++c]++ } } a.clamp(); a.drShiftTo(this.m.t, a); a.compareTo(this.m) >= 0 && a.subTo(this.m, a) } function S(a) { var b = e(); a.copyTo(b); this.reduce(b); return b } function R(a) { var b = e(); a.abs().dlShiftTo(this.m.t, b); b.divRemTo(this.m, null, b); a.s < 0 && b.compareTo(d.ZERO) > 0 && this.m.subTo(b, b); return b } function Q(a) { this.m = a; this.mp = a.invDigit(); this.mpl = this.mp & 32767; this.mph = this.mp >> 15; this.um = (1 << a.DB - 15) - 1; this.mt2 = 2 * a.t } function P() { if (this.t < 1) return 0; var a = this[0]; if ((a & 1) == 0) return 0; var b = a & 3; b = b * (2 - (a & 15) * b) & 15; b = b * (2 - (a & 255) * b) & 255; b = b * (2 - ((a & 65535) * b & 65535)) & 65535; b = b * (2 - a * b % this.DV) % this.DV; return b > 0 ? this.DV - b : -b } function O(a, b) { a.squareTo(b); this.reduce(b) } function N(a, b, c) { a.multiplyTo(b, c); this.reduce(c) } function M(a) { a.divRemTo(this.m, null, a) } function L(a) { return a } function K(a) { return a.s < 0 || a.compareTo(this.m) >= 0 ? a.mod(this.m) : a } function J(a) { this.m = a } function I(a) { var b = e(); this.abs().divRemTo(a, null, b); this.s < 0 && b.compareTo(d.ZERO) > 0 && a.subTo(b, b); return b } function H(a, b, c) { var f = a.abs(); if (!(f.t <= 0)) { var g = this.abs(); if (g.t < f.t) { b != null && b.fromInt(0); c != null && this.copyTo(c); return } c == null && (c = e()); var h = e(), i = this.s, j = a.s, k = this.DB - y(f[f.t - 1]); if (k > 0) { f.lShiftTo(k, h); g.lShiftTo(k, c) } else { f.copyTo(h); g.copyTo(c) } var l = h.t, m = h[l - 1]; if (m == 0) return; var n = m * (1 << this.F1) + (l > 1 ? h[l - 2] >> this.F2 : 0), o = this.FV / n, p = (1 << this.F1) / n, q = 1 << this.F2, r = c.t, s = r - l, t = b == null ? e() : b; h.dlShiftTo(s, t); if (c.compareTo(t) >= 0) { c[c.t++] = 1; c.subTo(t, c) } d.ONE.dlShiftTo(l, t); t.subTo(h, h); while (h.t < l) h[h.t++] = 0; while (--s >= 0) { var u = c[--r] == m ? this.DM : Math.floor(c[r] * o + (c[r - 1] + q) * p); if ((c[r] += h.am(0, u, c, s, 0, l)) < u) { h.dlShiftTo(s, t); c.subTo(t, c); while (c[r] < --u) c.subTo(t, c) } } if (b != null) { c.drShiftTo(l, b); i != j && d.ZERO.subTo(b, b) } c.t = l; c.clamp(); k > 0 && c.rShiftTo(k, c); i < 0 && d.ZERO.subTo(c, c) } } function G(a) { var b = this.abs(), c = a.t = 2 * b.t; while (--c >= 0) a[c] = 0; for (c = 0; c < b.t - 1; ++c) { var d = b.am(c, b[c], a, 2 * c, 0, 1); if ((a[c + b.t] += b.am(c + 1, 2 * b[c], a, 2 * c + 1, d, b.t - c - 1)) >= b.DV) { a[c + b.t] -= b.DV; a[c + b.t + 1] = 1 } } a.t > 0 && (a[a.t - 1] += b.am(c, b[c], a, 2 * c, 0, 1)); a.s = 0; a.clamp() } function F(a, b) { var c = this.abs(), e = a.abs(), f = c.t; b.t = f + e.t; while (--f >= 0) b[f] = 0; for (f = 0; f < e.t; ++f) b[f + c.t] = c.am(0, e[f], b, f, 0, c.t); b.s = 0; b.clamp(); this.s != a.s && d.ZERO.subTo(b, b) } function E(a, b) { var c = 0, d = 0, e = Math.min(a.t, this.t); while (c < e) { d += this[c] - a[c]; b[c++] = d & this.DM; d >>= this.DB } if (a.t < this.t) { d -= a.s; while (c < this.t) { d += this[c]; b[c++] = d & this.DM; d >>= this.DB } d += this.s } else { d += this.s; while (c < a.t) { d -= a[c]; b[c++] = d & this.DM; d >>= this.DB } d -= a.s } b.s = d < 0 ? -1 : 0; d < -1 ? b[c++] = this.DV + d : d > 0 && (b[c++] = d); b.t = c; b.clamp() } function D(a, b) { b.s = this.s; var c = Math.floor(a / this.DB); if (c >= this.t) b.t = 0; else { var d = a % this.DB, e = this.DB - d, f = (1 << d) - 1; b[0] = this[c] >> d; for (var g = c + 1; g < this.t; ++g) { b[g - c - 1] |= (this[g] & f) << e; b[g - c] = this[g] >> d } d > 0 && (b[this.t - c - 1] |= (this.s & f) << e); b.t = this.t - c; b.clamp() } } function C(a, b) { var c = a % this.DB, d = this.DB - c, e = (1 << d) - 1, f = Math.floor(a / this.DB), g = this.s << c & this.DM, h; for (h = this.t - 1; h >= 0; --h) { b[h + f + 1] = this[h] >> d | g; g = (this[h] & e) << c } for (h = f - 1; h >= 0; --h) b[h] = 0; b[f] = g; b.t = this.t + f + 1; b.s = this.s; b.clamp() } function B(a, b) { for (var c = a; c < this.t; ++c) b[c - a] = this[c]; b.t = Math.max(this.t - a, 0); b.s = this.s } function A(a, b) { var c; for (c = this.t - 1; c >= 0; --c) b[c + a] = this[c]; for (c = a - 1; c >= 0; --c) b[c] = 0; b.t = this.t + a; b.s = this.s } function z() { return this.t <= 0 ? 0 : this.DB * (this.t - 1) + y(this[this.t - 1] ^ this.s & this.DM) } function y(a) { var b = 1, c; if ((c = a >>> 16) != 0) { a = c; b += 16 } if ((c = a >> 8) != 0) { a = c; b += 8 } if ((c = a >> 4) != 0) { a = c; b += 4 } if ((c = a >> 2) != 0) { a = c; b += 2 } if ((c = a >> 1) != 0) { a = c; b += 1 } return b } function x(a) { var b = this.s - a.s; if (b != 0) return b; var c = this.t; b = c - a.t; if (b != 0) return b; while (--c >= 0) if ((b = this[c] - a[c]) != 0) return b; return 0 } function w() { return this.s < 0 ? this.negate() : this } function v() { var a = e(); d.ZERO.subTo(this, a); return a } function u(a) { if (this.s < 0) return "-" + this.negate().toString(a); var b; if (a == 16) b = 4; else if (a == 8) b = 3; else if (a == 2) b = 1; else if (a == 32) b = 5; else if (a == 4) b = 2; else return this.toRadix(a); var c = (1 << b) - 1, d, e = !1, f = "", g = this.t, h = this.DB - g * this.DB % b; if (g-- > 0) { if (h < this.DB && (d = this[g] >> h) > 0) { e = !0; f = n(d) } while (g >= 0) { if (h < b) { d = (this[g] & (1 << h) - 1) << b - h; d |= this[--g] >> (h += this.DB - b) } else { d = this[g] >> (h -= b) & c; if (h <= 0) { h += this.DB; --g } } d > 0 && (e = !0); e && (f += n(d)) } } return e ? f : "0" } function t() { var a = this.s & this.DM; while (this.t > 0 && this[this.t - 1] == a) --this.t } function s(a, b) { var c; if (b == 16) c = 4; else if (b == 8) c = 3; else if (b == 256) c = 8; else if (b == 2) c = 1; else if (b == 32) c = 5; else if (b == 4) c = 2; else { this.fromRadix(a, b); return } this.t = 0; this.s = 0; var e = a.length, f = !1, g = 0; while (--e >= 0) { var h = c == 8 ? a[e] & 255 : o(a, e); if (h < 0) { a.charAt(e) == "-" && (f = !0); continue } f = !1; if (g == 0) this[this.t++] = h; else if (g + c > this.DB) { this[this.t - 1] |= (h & (1 << this.DB - g) - 1) << g; this[this.t++] = h >> this.DB - g } else this[this.t - 1] |= h << g; g += c; g >= this.DB && (g -= this.DB) } if (c == 8 && (a[0] & 128) != 0) { this.s = -1; g > 0 && (this[this.t - 1] |= (1 << this.DB - g) - 1 << g) } this.clamp(); f && d.ZERO.subTo(this, this) } function r(a) { var b = e(); b.fromInt(a); return b } function q(a) { this.t = 1; this.s = a < 0 ? -1 : 0; a > 0 ? this[0] = a : a < -1 ? this[0] = a + DV : this.t = 0 } function p(a) { for (var b = this.t - 1; b >= 0; --b) a[b] = this[b]; a.t = this.t; a.s = this.s } function o(a, b) { var c = k[a.charCodeAt(b)]; return c == null ? -1 : c } function n(a) { return j.charAt(a) } function h(a, b, c, d, e, f) { var g = b & 16383, h = b >> 14; while (--f >= 0) { var i = this[a] & 16383, j = this[a++] >> 14, k = h * i + j * g; i = g * i + ((k & 16383) << 14) + c[d] + e; e = (i >> 28) + (k >> 14) + h * j; c[d++] = i & 268435455 } return e } function g(a, b, c, d, e, f) { var g = b & 32767, h = b >> 15; while (--f >= 0) { var i = this[a] & 32767, j = this[a++] >> 15, k = h * i + j * g; i = g * i + ((k & 32767) << 15) + c[d] + (e & 1073741823); e = (i >>> 30) + (k >>> 15) + h * j + (e >>> 30); c[d++] = i & 1073741823 } return e } function f(a, b, c, d, e, f) { while (--f >= 0) { var g = b * this[a++] + c[d] + e; e = Math.floor(g / 67108864); c[d++] = g & 67108863 } return e } function e() { return new d(null) } function d(a, b, c) { a != null && ("number" == typeof a ? this.fromNumber(a, b, c) : b == null && "string" != typeof a ? this.fromString( a, 256) : this.fromString(a, b)) } var a, b = 0xdeadbeefcafe, c = (b & 16777215) == 15715070; if (c && navigator.appName == "Microsoft Internet Explorer") { d.prototype.am = g; a = 30 } else if (c && navigator.appName != "Netscape") { d.prototype.am = f; a = 26 } else { d.prototype.am = h; a = 28 } d.prototype.DB = a; d.prototype.DM = (1 << a) - 1; d.prototype.DV = 1 << a; var i = 52; d.prototype.FV = Math.pow(2, i); d.prototype.F1 = i - a; d.prototype.F2 = 2 * a - i; var j = "0123456789abcdefghijklmnopqrstuvwxyz", k = [], l, m; l = "0".charCodeAt(0); for (m = 0; m <= 9; ++m) k[l++] = m; l = "a".charCodeAt(0); for (m = 10; m < 36; ++m) k[l++] = m; l = "A".charCodeAt(0); for (m = 10; m < 36; ++m) k[l++] = m; J.prototype.convert = K; J.prototype.revert = L; J.prototype.reduce = M; J.prototype.mulTo = N; J.prototype.sqrTo = O; Q.prototype.convert = R; Q.prototype.revert = S; Q.prototype.reduce = T; Q.prototype.mulTo = V; Q.prototype.sqrTo = U; d.prototype.copyTo = p; d.prototype.fromInt = q; d.prototype.fromString = s; d.prototype.clamp = t; d.prototype.dlShiftTo = A; d.prototype.drShiftTo = B; d.prototype.lShiftTo = C; d.prototype.rShiftTo = D; d.prototype.subTo = E; d.prototype.multiplyTo = F; d.prototype.squareTo = G; d.prototype.divRemTo = H; d.prototype.invDigit = P; d.prototype.isEven = W; d.prototype.exp = X; d.prototype.toString = u; d.prototype.negate = v; d.prototype.abs = w; d.prototype.compareTo = x; d.prototype.bitLength = z; d.prototype.mod = I; d.prototype.modPowInt = Y; d.ZERO = r(0); d.ONE = r(1); Z.prototype.init = $; Z.prototype.next = _; var bb = 256, bc, bd, be; if (bd == null) { bd = []; be = 0; var bh; if (navigator.appName == "Netscape" && navigator.appVersion < "5" && window.crypto && typeof window.crypto.random == "function") { var bi = window.crypto.random(32); for (bh = 0; bh < bi.length; ++bh) bd[be++] = bi.charCodeAt(bh) & 255 } while (be < bb) { bh = Math.floor(65536 * Math.random()); bd[be++] = bh >>> 8; bd[be++] = bh & 255 } be = 0; bg() } bl.prototype.nextBytes = bk; bq.prototype.doPublic = bs; bq.prototype.setPublic = br; bq.prototype.encrypt = bt; this.RSAKey = bq }).call(sinaSSOEncoder); var me = {}; function get_up(pwd,publickey,time,nonce) { var f = new sinaSSOEncoder.RSAKey; // f.setPublic("EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443", "10001"); // b = f.encrypt([1574248301, "PN9UV0"].join("\t") + "\n" + '123456') f.setPublic(publickey, "10001"); b = f.encrypt([time, nonce].join("\t") + "\n" + pwd) return b } ================================================ FILE: 其他实战/【新浪微博】密码解密/main.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-26 Python: 3.7 import execjs import requests import json import re def Get_parameters(): """微博加密参数有两个 用户名和密码 用户名为 base64加密 此处只解决了密码加密问题 其他的请自行拓展 pubkey,time,nonce :return pubkey,time,nonce """ try: url = "https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=MTc3MjM1NzI1OTA%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1574300620782" headers = { 'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', 'Host': 'login.sina.com.cn', 'Referer': 'https://www.weibo.com/login.php', } res = requests.get(url=url, headers=headers) data = re.findall('sinaSSOController.preloginCallBack\((.*?)\)', res.text, re.S)[0] new_data = json.loads(data) time = new_data.get('servertime') nonce = new_data.get('nonce') pubkey = new_data.get('pubkey') return pubkey, time, nonce except Exception as err: print('访问失败', err) def main(pwd): """ :param pwd: :return: """ with open('execute.js', 'r', encoding='utf-8') as f: js = execjs.compile(f.read()) print('引擎', execjs.get().name) publickey, time, nonce = Get_parameters() sign = js.call('get_up', pwd, publickey, time, nonce) return sign if __name__ == '__main__': pwd = input('请输入密码:') sign = main(pwd) print(sign) ================================================ FILE: 其他实战/【时光网】登陆参数生成/encryp.js ================================================ var CryptoJS = CryptoJS || function (g, w) { var m = {} , q = m.lib = {} , j = q.Base = function () { function a() { } return { extend: function (e) { a.prototype = this; var c = new a; return e && c.mixIn(e), c.$super = this, c }, create: function () { var c = this.extend(); return c.init.apply(c, arguments), c }, init: function () { }, mixIn: function (c) { for (var f in c) { c.hasOwnProperty(f) && (this[f] = c[f]) } c.hasOwnProperty("toString") && (this.toString = c.toString) }, clone: function () { return this.$super.extend(this) } } }() , v = q.WordArray = j.extend({ init: function (a, c) { a = this.words = a || [], this.sigBytes = c != w ? c : 4 * a.length }, toString: function (a) { return (a || x).stringify(this) }, concat: function (a) { var o = this.words , f = a.words , l = this.sigBytes , a = a.sigBytes; this.clamp(); if (l % 4) { for (var c = 0; c < a; c++) { o[l + c >>> 2] |= (f[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((l + c) % 4) } } else { if (65535 < f.length) { for (c = 0; c < a; c += 4) { o[l + c >>> 2] = f[c >>> 2] } } else { o.push.apply(o, f) } } return this.sigBytes += a, this }, clamp: function () { var c = this.words , a = this.sigBytes; c[a >>> 2] &= 4294967295 << 32 - 8 * (a % 4), c.length = g.ceil(a / 4) }, clone: function () { var a = j.clone.call(this); return a.words = this.words.slice(0), a }, random: function (e) { for (var a = [], c = 0; c < e; c += 4) { a.push(4294967296 * g.random() | 0) } return v.create(a, e) } }) , p = m.enc = {} , x = p.Hex = { stringify: function (a) { for (var o = a.words, a = a.sigBytes, f = [], l = 0; l < a; l++) { var c = o[l >>> 2] >>> 24 - 8 * (l % 4) & 255; f.push((c >>> 4).toString(16)), f.push((c & 15).toString(16)) } return f.join("") }, parse: function (a) { for (var i = a.length, c = [], f = 0; f < i; f += 2) { c[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8) } return v.create(c, i / 2) } } , b = p.Latin1 = { stringify: function (a) { for (var i = a.words, a = a.sigBytes, c = [], f = 0; f < a; f++) { c.push(String.fromCharCode(i[f >>> 2] >>> 24 - 8 * (f % 4) & 255)) } return c.join("") }, parse: function (a) { for (var i = a.length, c = [], f = 0; f < i; f++) { c[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4) } return v.create(c, i) } } , h = p.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data") } }, parse: function (a) { return b.parse(unescape(encodeURIComponent(a))) } } , k = q.BufferedBlockAlgorithm = j.extend({ reset: function () { this._data = v.create(), this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = h.parse(a)), this._data.concat(a), this._nDataBytes += a.sigBytes }, _process: function (y) { var f = this._data , s = f.words , e = f.sigBytes , l = this.blockSize , z = e / (4 * l) , z = y ? g.ceil(z) : g.max((z | 0) - this._minBufferSize, 0) , y = z * l , e = g.min(4 * y, e); if (y) { for (var c = 0; c < y; c += l) { this._doProcessBlock(s, c) } c = s.splice(0, y), f.sigBytes -= e } return v.create(c, e) }, clone: function () { var a = j.clone.call(this); return a._data = this._data.clone(), a }, _minBufferSize: 0 }); q.Hasher = k.extend({ init: function () { this.reset() }, reset: function () { k.reset.call(this), this._doReset() }, update: function (a) { return this._append(a), this._process(), this }, finalize: function (a) { return a && this._append(a), this._doFinalize(), this._hash }, clone: function () { var a = k.clone.call(this); return a._hash = this._hash.clone(), a }, blockSize: 16, _createHelper: function (a) { return function (e, c) { return a.create(c).finalize(e) } }, _createHmacHelper: function (a) { return function (e, c) { return d.HMAC.create(a, c).finalize(e) } } }); var d = m.algo = {}; return m }(Math) , CryptoJS = CryptoJS || function (g, w) { var m = {} , q = m.lib = {} , j = q.Base = function () { function a() { } return { extend: function (e) { a.prototype = this; var c = new a; return e && c.mixIn(e), c.$super = this, c }, create: function () { var c = this.extend(); return c.init.apply(c, arguments), c }, init: function () { }, mixIn: function (c) { for (var f in c) { c.hasOwnProperty(f) && (this[f] = c[f]) } c.hasOwnProperty("toString") && (this.toString = c.toString) }, clone: function () { return this.$super.extend(this) } } }() , v = q.WordArray = j.extend({ init: function (a, c) { a = this.words = a || [], this.sigBytes = c != w ? c : 4 * a.length }, toString: function (a) { return (a || x).stringify(this) }, concat: function (a) { var o = this.words , f = a.words , l = this.sigBytes , a = a.sigBytes; this.clamp(); if (l % 4) { for (var c = 0; c < a; c++) { o[l + c >>> 2] |= (f[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((l + c) % 4) } } else { if (65535 < f.length) { for (c = 0; c < a; c += 4) { o[l + c >>> 2] = f[c >>> 2] } } else { o.push.apply(o, f) } } return this.sigBytes += a, this }, clamp: function () { var c = this.words , a = this.sigBytes; c[a >>> 2] &= 4294967295 << 32 - 8 * (a % 4), c.length = g.ceil(a / 4) }, clone: function () { var a = j.clone.call(this); return a.words = this.words.slice(0), a }, random: function (e) { for (var a = [], c = 0; c < e; c += 4) { a.push(4294967296 * g.random() | 0) } return v.create(a, e) } }) , p = m.enc = {} , x = p.Hex = { stringify: function (a) { for (var o = a.words, a = a.sigBytes, f = [], l = 0; l < a; l++) { var c = o[l >>> 2] >>> 24 - 8 * (l % 4) & 255; f.push((c >>> 4).toString(16)), f.push((c & 15).toString(16)) } return f.join("") }, parse: function (a) { for (var i = a.length, c = [], f = 0; f < i; f += 2) { c[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8) } return v.create(c, i / 2) } } , b = p.Latin1 = { stringify: function (a) { for (var i = a.words, a = a.sigBytes, c = [], f = 0; f < a; f++) { c.push(String.fromCharCode(i[f >>> 2] >>> 24 - 8 * (f % 4) & 255)) } return c.join("") }, parse: function (a) { for (var i = a.length, c = [], f = 0; f < i; f++) { c[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4) } return v.create(c, i) } } , h = p.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data") } }, parse: function (a) { return b.parse(unescape(encodeURIComponent(a))) } } , k = q.BufferedBlockAlgorithm = j.extend({ reset: function () { this._data = v.create(), this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = h.parse(a)), this._data.concat(a), this._nDataBytes += a.sigBytes }, _process: function (y) { var f = this._data , s = f.words , e = f.sigBytes , l = this.blockSize , z = e / (4 * l) , z = y ? g.ceil(z) : g.max((z | 0) - this._minBufferSize, 0) , y = z * l , e = g.min(4 * y, e); if (y) { for (var c = 0; c < y; c += l) { this._doProcessBlock(s, c) } c = s.splice(0, y), f.sigBytes -= e } return v.create(c, e) }, clone: function () { var a = j.clone.call(this); return a._data = this._data.clone(), a }, _minBufferSize: 0 }); q.Hasher = k.extend({ init: function () { this.reset() }, reset: function () { k.reset.call(this), this._doReset() }, update: function (a) { return this._append(a), this._process(), this }, finalize: function (a) { return a && this._append(a), this._doFinalize(), this._hash }, clone: function () { var a = k.clone.call(this); return a._hash = this._hash.clone(), a }, blockSize: 16, _createHelper: function (a) { return function (e, c) { return a.create(c).finalize(e) } }, _createHmacHelper: function (a) { return function (e, c) { return d.HMAC.create(a, c).finalize(e) } } }); var d = m.algo = {}; return m }(Math); (function () { var a = CryptoJS , b = a.lib.WordArray; a.enc.Base64 = { stringify: function (c) { var k = c.words , f = c.sigBytes , h = this._map; c.clamp(); for (var c = [], d = 0; d < f; d += 3) { for (var j = (k[d >>> 2] >>> 24 - 8 * (d % 4) & 255) << 16 | (k[d + 1 >>> 2] >>> 24 - 8 * ((d + 1) % 4) & 255) << 8 | k[d + 2 >>> 2] >>> 24 - 8 * ((d + 2) % 4) & 255, g = 0; 4 > g && d + 0.75 * g < f; g++) { c.push(h.charAt(j >>> 6 * (3 - g) & 63)) } } if (k = h.charAt(64)) { for (; c.length % 4;) { c.push(k) } } return c.join("") }, parse: function (d) { var d = d.replace(/\s/g, "") , h = d.length , j = this._map , k = j.charAt(64); k && (k = d.indexOf(k), -1 != k && (h = k)); for (var k = [], i = 0, l = 0; l < h; l++) { if (l % 4) { var c = j.indexOf(d.charAt(l - 1)) << 2 * (l % 4) , g = j.indexOf(d.charAt(l)) >>> 6 - 2 * (l % 4); k[i >>> 2] |= (c | g) << 24 - 8 * (i % 4), i++ } } return b.create(k, i) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } } )(), function (c) { function m(a, x, q, v, f, w, u) { return a = a + (x & q | ~x & v) + f + u, (a << w | a >>> 32 - w) + x } function h(a, x, q, v, f, w, u) { return a = a + (x & v | q & ~v) + f + u, (a << w | a >>> 32 - w) + x } function k(a, x, q, v, f, w, u) { return a = a + (x ^ q ^ v) + f + u, (a << w | a >>> 32 - w) + x } function g(a, x, q, v, f, w, u) { return a = a + (q ^ (x | ~v)) + f + u, (a << w | a >>> 32 - w) + x } var l = CryptoJS , j = l.lib , p = j.WordArray , j = j.Hasher , b = l.algo , d = []; (function () { for (var a = 0; 64 > a; a++) { d[a] = 4294967296 * c.abs(c.sin(a + 1)) | 0 } } )(), b = b.MD5 = j.extend({ _doReset: function () { this._hash = p.create([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function (q, v) { for (var t = 0; 16 > t; t++) { var w = v + t , f = q[w]; q[w] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360 } for (var w = this._hash.words, f = w[0], r = w[1], i = w[2], n = w[3], t = 0; 64 > t; t += 4) { 16 > t ? (f = m(f, r, i, n, q[v + t], 7, d[t]), n = m(n, f, r, i, q[v + t + 1], 12, d[t + 1]), i = m(i, n, f, r, q[v + t + 2], 17, d[t + 2]), r = m(r, i, n, f, q[v + t + 3], 22, d[t + 3])) : 32 > t ? (f = h(f, r, i, n, q[v + (t + 1) % 16], 5, d[t]), n = h(n, f, r, i, q[v + (t + 6) % 16], 9, d[t + 1]), i = h(i, n, f, r, q[v + (t + 11) % 16], 14, d[t + 2]), r = h(r, i, n, f, q[v + t % 16], 20, d[t + 3])) : 48 > t ? (f = k(f, r, i, n, q[v + (3 * t + 5) % 16], 4, d[t]), n = k(n, f, r, i, q[v + (3 * t + 8) % 16], 11, d[t + 1]), i = k(i, n, f, r, q[v + (3 * t + 11) % 16], 16, d[t + 2]), r = k(r, i, n, f, q[v + (3 * t + 14) % 16], 23, d[t + 3])) : (f = g(f, r, i, n, q[v + 3 * t % 16], 6, d[t]), n = g(n, f, r, i, q[v + (3 * t + 7) % 16], 10, d[t + 1]), i = g(i, n, f, r, q[v + (3 * t + 14) % 16], 15, d[t + 2]), r = g(r, i, n, f, q[v + (3 * t + 5) % 16], 21, d[t + 3])) } w[0] = w[0] + f | 0, w[1] = w[1] + r | 0, w[2] = w[2] + i | 0, w[3] = w[3] + n | 0 }, _doFinalize: function () { var a = this._data , o = a.words , f = 8 * this._nDataBytes , i = 8 * a.sigBytes; o[i >>> 5] |= 128 << 24 - i % 32, o[(i + 64 >>> 9 << 4) + 14] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360, a.sigBytes = 4 * (o.length + 1), this._process(), a = this._hash.words; for (o = 0; 4 > o; o++) { f = a[o], a[o] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360 } } }), l.MD5 = j._createHelper(b), l.HmacMD5 = j._createHmacHelper(b) }(Math), function () { var a = CryptoJS , f = a.lib , c = f.Base , d = f.WordArray , f = a.algo , b = f.EvpKDF = c.extend({ cfg: c.extend({ keySize: 4, hasher: f.MD5, iterations: 1 }), init: function (g) { this.cfg = this.cfg.extend(g) }, compute: function (h, q) { for (var l = this.cfg, k = l.hasher.create(), p = d.create(), m = p.words, r = l.keySize, l = l.iterations; m.length < r;) { g && k.update(g); var g = k.update(h).finalize(q); k.reset(); for (var j = 1; j < l; j++) { g = k.finalize(g), k.reset() } p.concat(g) } return p.sigBytes = 4 * r, p } }); a.EvpKDF = function (g, i, h) { return b.create(h).compute(g, i) } }(), CryptoJS.lib.Cipher || function (k) { var C = CryptoJS , x = C.lib , A = x.Base , v = x.WordArray , B = x.BufferedBlockAlgorithm , y = C.enc.Base64 , D = C.algo.EvpKDF , b = x.Cipher = B.extend({ cfg: A.extend(), createEncryptor: function (a, c) { return this.create(this._ENC_XFORM_MODE, a, c) }, createDecryptor: function (a, c) { return this.create(this._DEC_XFORM_MODE, a, c) }, init: function (a, d, c) { this.cfg = this.cfg.extend(c), this._xformMode = a, this._key = d, this.reset() }, reset: function () { B.reset.call(this), this._doReset() }, process: function (a) { return this._append(a), this._process() }, finalize: function (a) { return a && this._append(a), this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function () { return function (a) { return { encrypt: function (e, c, d) { return ("string" == typeof c ? j : z).encrypt(a, e, c, d) }, decrypt: function (e, c, d) { return ("string" == typeof c ? j : z).decrypt(a, e, c, d) } } } }() }); x.StreamCipher = b.extend({ _doFinalize: function () { return this._process(!0) }, blockSize: 1 }); var m = C.mode = {} , w = x.BlockCipherMode = A.extend({ createEncryptor: function (a, c) { return this.Encryptor.create(a, c) }, createDecryptor: function (a, c) { return this.Decryptor.create(a, c) }, init: function (a, c) { this._cipher = a, this._iv = c } }) , m = m.CBC = function () { function c(l, e, f) { var d = this._iv; d ? this._iv = k : d = this._prevBlock; for (var h = 0; h < f; h++) { l[e + h] ^= d[h] } } var a = w.extend(); return a.Encryptor = a.extend({ processBlock: function (d, h) { var l = this._cipher , f = l.blockSize; c.call(this, d, h, f), l.encryptBlock(d, h), this._prevBlock = d.slice(h, h + f) } }), a.Decryptor = a.extend({ processBlock: function (d, h) { var l = this._cipher , f = l.blockSize , o = d.slice(h, h + f); l.decryptBlock(d, h), c.call(this, d, h, f), this._prevBlock = o } }), a }() , g = (C.pad = {}).Pkcs7 = { pad: function (a, i) { for (var c = 4 * i, c = c - a.sigBytes % c, f = c << 24 | c << 16 | c << 8 | c, h = [], d = 0; d < c; d += 4) { h.push(f) } c = v.create(h, c), a.concat(c) }, unpad: function (a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; x.BlockCipher = b.extend({ cfg: b.cfg.extend({ mode: m, padding: g }), reset: function () { b.reset.call(this); var a = this.cfg , d = a.iv , a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) { var c = a.createEncryptor } else { c = a.createDecryptor, this._minBufferSize = 1 } this._mode = c.call(a, this, d && d.words) }, _doProcessBlock: function (a, c) { this._mode.processBlock(a, c) }, _doFinalize: function () { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var c = this._process(!0) } else { c = this._process(!0), a.unpad(c) } return c }, blockSize: 4 }); var q = x.CipherParams = A.extend({ init: function (a) { this.mixIn(a) }, toString: function (a) { return (a || this.formatter).stringify(this) } }) , m = (C.format = {}).OpenSSL = { stringify: function (a) { var c = a.ciphertext , a = a.salt , c = (a ? v.create([1398893684, 1701076831]).concat(a).concat(c) : c).toString(y); return c = c.replace(/(.{64})/g, "$1\n") }, parse: function (a) { var a = y.parse(a) , d = a.words; if (1398893684 == d[0] && 1701076831 == d[1]) { var c = v.create(d.slice(2, 4)); d.splice(0, 4), a.sigBytes -= 16 } return q.create({ ciphertext: a, salt: c }) } } , z = x.SerializableCipher = A.extend({ cfg: A.extend({ format: m }), encrypt: function (a, h, d, f) { var f = this.cfg.extend(f) , c = a.createEncryptor(d, f) , h = c.finalize(h) , c = c.cfg; return q.create({ ciphertext: h, key: d, iv: c.iv, algorithm: a, mode: c.mode, padding: c.padding, blockSize: a.blockSize, formatter: f.format }) }, decrypt: function (a, f, c, d) { return d = this.cfg.extend(d), f = this._parse(f, d.format), a.createDecryptor(c, d).finalize(f.ciphertext) }, _parse: function (a, c) { return "string" == typeof a ? c.parse(a) : a } }) , C = (C.kdf = {}).OpenSSL = { compute: function (a, f, c, d) { return d || (d = v.random(8)), a = D.create({ keySize: f + c }).compute(a, d), c = v.create(a.words.slice(f), 4 * c), a.sigBytes = 4 * f, q.create({ key: a, iv: c, salt: d }) } } , j = x.PasswordBasedCipher = z.extend({ cfg: z.cfg.extend({ kdf: C }), encrypt: function (a, f, c, d) { return d = this.cfg.extend(d), c = d.kdf.compute(c, a.keySize, a.ivSize), d.iv = c.iv, a = z.encrypt.call(this, a, f, c.key, d), a.mixIn(c), a }, decrypt: function (a, f, c, d) { return d = this.cfg.extend(d), f = this._parse(f, d.format), c = d.kdf.compute(c, a.keySize, a.ivSize, f.salt), d.iv = c.iv, z.decrypt.call(this, a, f, c.key, d) } }) }(), function () { function g(a, f) { var c = (this._lBlock >>> a ^ this._rBlock) & f; this._rBlock ^= c, this._lBlock ^= c << a } function w(a, f) { var c = (this._rBlock >>> a ^ this._lBlock) & f; this._lBlock ^= c, this._rBlock ^= c << a } var m = CryptoJS , q = m.lib , j = q.WordArray , q = q.BlockCipher , v = m.algo , p = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4] , x = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32] , b = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28] , h = [{ 0: 8421888, 268435456: 32768, 536870912: 8421378, 805306368: 2, 1073741824: 512, 1342177280: 8421890, 1610612736: 8389122, 1879048192: 8388608, 2147483648: 514, 2415919104: 8389120, 2684354560: 33280, 2952790016: 8421376, 3221225472: 32770, 3489660928: 8388610, 3758096384: 0, 4026531840: 33282, 134217728: 0, 402653184: 8421890, 671088640: 33282, 939524096: 32768, 1207959552: 8421888, 1476395008: 512, 1744830464: 8421378, 2013265920: 2, 2281701376: 8389120, 2550136832: 33280, 2818572288: 8421376, 3087007744: 8389122, 3355443200: 8388610, 3623878656: 32770, 3892314112: 514, 4160749568: 8388608, 1: 32768, 268435457: 2, 536870913: 8421888, 805306369: 8388608, 1073741825: 8421378, 1342177281: 33280, 1610612737: 512, 1879048193: 8389122, 2147483649: 8421890, 2415919105: 8421376, 2684354561: 8388610, 2952790017: 33282, 3221225473: 514, 3489660929: 8389120, 3758096385: 32770, 4026531841: 0, 134217729: 8421890, 402653185: 8421376, 671088641: 8388608, 939524097: 512, 1207959553: 32768, 1476395009: 8388610, 1744830465: 2, 2013265921: 33282, 2281701377: 32770, 2550136833: 8389122, 2818572289: 514, 3087007745: 8421888, 3355443201: 8389120, 3623878657: 0, 3892314113: 33280, 4160749569: 8421378 }, { 0: 1074282512, 16777216: 16384, 33554432: 524288, 50331648: 1074266128, 67108864: 1073741840, 83886080: 1074282496, 100663296: 1073758208, 117440512: 16, 134217728: 540672, 150994944: 1073758224, 167772160: 1073741824, 184549376: 540688, 201326592: 524304, 218103808: 0, 234881024: 16400, 251658240: 1074266112, 8388608: 1073758208, 25165824: 540688, 41943040: 16, 58720256: 1073758224, 75497472: 1074282512, 92274688: 1073741824, 109051904: 524288, 125829120: 1074266128, 142606336: 524304, 159383552: 0, 176160768: 16384, 192937984: 1074266112, 209715200: 1073741840, 226492416: 540672, 243269632: 1074282496, 260046848: 16400, 268435456: 0, 285212672: 1074266128, 301989888: 1073758224, 318767104: 1074282496, 335544320: 1074266112, 352321536: 16, 369098752: 540688, 385875968: 16384, 402653184: 16400, 419430400: 524288, 436207616: 524304, 452984832: 1073741840, 469762048: 540672, 486539264: 1073758208, 503316480: 1073741824, 520093696: 1074282512, 276824064: 540688, 293601280: 524288, 310378496: 1074266112, 327155712: 16384, 343932928: 1073758208, 360710144: 1074282512, 377487360: 16, 394264576: 1073741824, 411041792: 1074282496, 427819008: 1073741840, 444596224: 1073758224, 461373440: 524304, 478150656: 0, 494927872: 16400, 511705088: 1074266128, 528482304: 540672 }, { 0: 260, 1048576: 0, 2097152: 67109120, 3145728: 65796, 4194304: 65540, 5242880: 67108868, 6291456: 67174660, 7340032: 67174400, 8388608: 67108864, 9437184: 67174656, 10485760: 65792, 11534336: 67174404, 12582912: 67109124, 13631488: 65536, 14680064: 4, 15728640: 256, 524288: 67174656, 1572864: 67174404, 2621440: 0, 3670016: 67109120, 4718592: 67108868, 5767168: 65536, 6815744: 65540, 7864320: 260, 8912896: 4, 9961472: 256, 11010048: 67174400, 12058624: 65796, 13107200: 65792, 14155776: 67109124, 15204352: 67174660, 16252928: 67108864, 16777216: 67174656, 17825792: 65540, 18874368: 65536, 19922944: 67109120, 20971520: 256, 22020096: 67174660, 23068672: 67108868, 24117248: 0, 25165824: 67109124, 26214400: 67108864, 27262976: 4, 28311552: 65792, 29360128: 67174400, 30408704: 260, 31457280: 65796, 32505856: 67174404, 17301504: 67108864, 18350080: 260, 19398656: 67174656, 20447232: 0, 21495808: 65540, 22544384: 67109120, 23592960: 256, 24641536: 67174404, 25690112: 65536, 26738688: 67174660, 27787264: 65796, 28835840: 67108868, 29884416: 67109124, 30932992: 67174400, 31981568: 4, 33030144: 65792 }, { 0: 2151682048, 65536: 2147487808, 131072: 4198464, 196608: 2151677952, 262144: 0, 327680: 4198400, 393216: 2147483712, 458752: 4194368, 524288: 2147483648, 589824: 4194304, 655360: 64, 720896: 2147487744, 786432: 2151678016, 851968: 4160, 917504: 4096, 983040: 2151682112, 32768: 2147487808, 98304: 64, 163840: 2151678016, 229376: 2147487744, 294912: 4198400, 360448: 2151682112, 425984: 0, 491520: 2151677952, 557056: 4096, 622592: 2151682048, 688128: 4194304, 753664: 4160, 819200: 2147483648, 884736: 4194368, 950272: 4198464, 1015808: 2147483712, 1048576: 4194368, 1114112: 4198400, 1179648: 2147483712, 1245184: 0, 1310720: 4160, 1376256: 2151678016, 1441792: 2151682048, 1507328: 2147487808, 1572864: 2151682112, 1638400: 2147483648, 1703936: 2151677952, 1769472: 4198464, 1835008: 2147487744, 1900544: 4194304, 1966080: 64, 2031616: 4096, 1081344: 2151677952, 1146880: 2151682112, 1212416: 0, 1277952: 4198400, 1343488: 4194368, 1409024: 2147483648, 1474560: 2147487808, 1540096: 64, 1605632: 2147483712, 1671168: 4096, 1736704: 2147487744, 1802240: 2151678016, 1867776: 4160, 1933312: 2151682048, 1998848: 4194304, 2064384: 4198464 }, { 0: 128, 4096: 17039360, 8192: 262144, 12288: 536870912, 16384: 537133184, 20480: 16777344, 24576: 553648256, 28672: 262272, 32768: 16777216, 36864: 537133056, 40960: 536871040, 45056: 553910400, 49152: 553910272, 53248: 0, 57344: 17039488, 61440: 553648128, 2048: 17039488, 6144: 553648256, 10240: 128, 14336: 17039360, 18432: 262144, 22528: 537133184, 26624: 553910272, 30720: 536870912, 34816: 537133056, 38912: 0, 43008: 553910400, 47104: 16777344, 51200: 536871040, 55296: 553648128, 59392: 16777216, 63488: 262272, 65536: 262144, 69632: 128, 73728: 536870912, 77824: 553648256, 81920: 16777344, 86016: 553910272, 90112: 537133184, 94208: 16777216, 98304: 553910400, 102400: 553648128, 106496: 17039360, 110592: 537133056, 114688: 262272, 118784: 536871040, 122880: 0, 126976: 17039488, 67584: 553648256, 71680: 16777216, 75776: 17039360, 79872: 537133184, 83968: 536870912, 88064: 17039488, 92160: 128, 96256: 553910272, 100352: 262272, 104448: 553910400, 108544: 0, 112640: 553648128, 116736: 16777344, 120832: 262144, 124928: 537133056, 129024: 536871040 }, { 0: 268435464, 256: 8192, 512: 270532608, 768: 270540808, 1024: 268443648, 1280: 2097152, 1536: 2097160, 1792: 268435456, 2048: 0, 2304: 268443656, 2560: 2105344, 2816: 8, 3072: 270532616, 3328: 2105352, 3584: 8200, 3840: 270540800, 128: 270532608, 384: 270540808, 640: 8, 896: 2097152, 1152: 2105352, 1408: 268435464, 1664: 268443648, 1920: 8200, 2176: 2097160, 2432: 8192, 2688: 268443656, 2944: 270532616, 3200: 0, 3456: 270540800, 3712: 2105344, 3968: 268435456, 4096: 268443648, 4352: 270532616, 4608: 270540808, 4864: 8200, 5120: 2097152, 5376: 268435456, 5632: 268435464, 5888: 2105344, 6144: 2105352, 6400: 0, 6656: 8, 6912: 270532608, 7168: 8192, 7424: 268443656, 7680: 270540800, 7936: 2097160, 4224: 8, 4480: 2105344, 4736: 2097152, 4992: 268435464, 5248: 268443648, 5504: 8200, 5760: 270540808, 6016: 270532608, 6272: 270540800, 6528: 270532616, 6784: 8192, 7040: 2105352, 7296: 2097160, 7552: 0, 7808: 268435456, 8064: 268443656 }, { 0: 1048576, 16: 33555457, 32: 1024, 48: 1049601, 64: 34604033, 80: 0, 96: 1, 112: 34603009, 128: 33555456, 144: 1048577, 160: 33554433, 176: 34604032, 192: 34603008, 208: 1025, 224: 1049600, 240: 33554432, 8: 34603009, 24: 0, 40: 33555457, 56: 34604032, 72: 1048576, 88: 33554433, 104: 33554432, 120: 1025, 136: 1049601, 152: 33555456, 168: 34603008, 184: 1048577, 200: 1024, 216: 34604033, 232: 1, 248: 1049600, 256: 33554432, 272: 1048576, 288: 33555457, 304: 34603009, 320: 1048577, 336: 33555456, 352: 34604032, 368: 1049601, 384: 1025, 400: 34604033, 416: 1049600, 432: 1, 448: 0, 464: 34603008, 480: 33554433, 496: 1024, 264: 1049600, 280: 33555457, 296: 34603009, 312: 1, 328: 33554432, 344: 1048576, 360: 1025, 376: 34604032, 392: 33554433, 408: 34603008, 424: 0, 440: 34604033, 456: 1049601, 472: 1024, 488: 33555456, 504: 1048577 }, { 0: 134219808, 1: 131072, 2: 134217728, 3: 32, 4: 131104, 5: 134350880, 6: 134350848, 7: 2048, 8: 134348800, 9: 134219776, 10: 133120, 11: 134348832, 12: 2080, 13: 0, 14: 134217760, 15: 133152, 2147483648: 2048, 2147483649: 134350880, 2147483650: 134219808, 2147483651: 134217728, 2147483652: 134348800, 2147483653: 133120, 2147483654: 133152, 2147483655: 32, 2147483656: 134217760, 2147483657: 2080, 2147483658: 131104, 2147483659: 134350848, 2147483660: 0, 2147483661: 134348832, 2147483662: 134219776, 2147483663: 131072, 16: 133152, 17: 134350848, 18: 32, 19: 2048, 20: 134219776, 21: 134217760, 22: 134348832, 23: 131072, 24: 0, 25: 131104, 26: 134348800, 27: 134219808, 28: 134350880, 29: 133120, 30: 2080, 31: 134217728, 2147483664: 131072, 2147483665: 2048, 2147483666: 134348832, 2147483667: 133152, 2147483668: 32, 2147483669: 134348800, 2147483670: 134217728, 2147483671: 134219808, 2147483672: 134350880, 2147483673: 134217760, 2147483674: 134219776, 2147483675: 0, 2147483676: 133120, 2147483677: 2080, 2147483678: 131104, 2147483679: 134350848 }] , k = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679] , d = v.DES = q.extend({ _doReset: function () { for (var a = this._key.words, u = [], f = 0; 56 > f; f++) { var l = p[f] - 1; u[f] = a[l >>> 5] >>> 31 - l % 32 & 1 } a = this._subKeys = []; for (l = 0; 16 > l; l++) { for (var c = a[l] = [], o = b[l], f = 0; 24 > f; f++) { c[f / 6 | 0] |= u[(x[f] - 1 + o) % 28] << 31 - f % 6, c[4 + (f / 6 | 0)] |= u[28 + (x[f + 24] - 1 + o) % 28] << 31 - f % 6 } c[0] = c[0] << 1 | c[0] >>> 31; for (f = 1; 7 > f; f++) { c[f] >>>= 4 * (f - 1) + 3 } c[7] = c[7] << 5 | c[7] >>> 27 } u = this._invSubKeys = []; for (f = 0; 16 > f; f++) { u[f] = a[15 - f] } }, encryptBlock: function (a, c) { this._doCryptBlock(a, c, this._subKeys) }, decryptBlock: function (a, c) { this._doCryptBlock(a, c, this._invSubKeys) }, _doCryptBlock: function (y, A, t) { this._lBlock = y[A], this._rBlock = y[A + 1], g.call(this, 4, 252645135), g.call(this, 16, 65535), w.call(this, 2, 858993459), w.call(this, 8, 16711935), g.call(this, 1, 1431655765); for (var B = 0; 16 > B; B++) { for (var z = t[B], C = this._lBlock, e = this._rBlock, f = 0, l = 0; 8 > l; l++) { f |= h[l][((e ^ z[l]) & k[l]) >>> 0] } this._lBlock = e, this._rBlock = C ^ f } t = this._lBlock, this._lBlock = this._rBlock, this._rBlock = t, g.call(this, 1, 1431655765), w.call(this, 8, 16711935), w.call(this, 2, 858993459), g.call(this, 16, 65535), g.call(this, 4, 252645135), y[A] = this._lBlock, y[A + 1] = this._rBlock }, keySize: 2, ivSize: 2, blockSize: 2 }); m.DES = q._createHelper(d), v = v.TripleDES = q.extend({ _doReset: function () { var a = this._key.words; this._des1 = d.createEncryptor(j.create(a.slice(0, 2))), this._des2 = d.createEncryptor(j.create(a.slice(2, 4))), this._des3 = d.createEncryptor(j.create(a.slice(4, 6))) }, encryptBlock: function (a, c) { this._des1.encryptBlock(a, c), this._des2.decryptBlock(a, c), this._des3.encryptBlock(a, c) }, decryptBlock: function (a, c) { this._des3.decryptBlock(a, c), this._des2.encryptBlock(a, c), this._des1.decryptBlock(a, c) }, keySize: 6, ivSize: 2, blockSize: 2 }), m.TripleDES = q._createHelper(v) }(), CryptoJS.mode.ECB = function () { var a = CryptoJS.lib.BlockCipherMode.extend(); return a.Encryptor = a.extend({ processBlock: function (b, c) { this._cipher.encryptBlock(b, c) } }), a.Decryptor = a.extend({ processBlock: function (b, c) { this._cipher.decryptBlock(b, c) } }), a }(); function get_pwd(a) { var c = CryptoJS.enc.Utf8.parse("20161216") , b = CryptoJS.DES.encrypt(a, c, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return b.ciphertext.toString() } ================================================ FILE: 其他实战/【时光网】登陆参数生成/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-11 Python: 3.7 import execjs.runtime_names class MTime: """ 时光网登陆,password 加密解析 https://m.mtime.cn/#!/member/signin """ def __init__(self, name, pwd): self.name = name self.pwd = pwd self.url = 'https://m.mtime.cn/Service/callback-comm.mi/user/login.api' self.js = None self.init_js() def init_js(self): print('引擎', execjs.get().name) with open("encryp.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def make_pwd(self): print(self.js.call('get_pwd', self.pwd)) if __name__ == '__main__': username = input('请输入用户名') password = input('输入密码') mt = MTime(username, password) mt.make_pwd() ================================================ FILE: 其他实战/【易通贷】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【易通贷】自动登录/auto_login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-26 Python: 3.7 import requests import execjs.runtime_names class YDT(object): """ 易通贷自动登陆 """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.url = 'https://app.etongdai.com/login/verifylogin' print('引擎', execjs.get().name) @staticmethod def make_pwd(pwd): with open("encryp.js", "r", encoding="utf-8") as f: ctx = execjs.compile(f.read()) return ctx.call("make_js", pwd) def make_data(self): data = { 'loginName': self.user, 'check': 'on', 'next': 'null', 'password': self.make_pwd(self.pwd), } return data def login(self): data = self.make_data() response = requests.post(self.url, data=data) data = response.content.decode('utf-8') print(data) if __name__ == '__main__': username = input('请输入 易通贷账号') password = input('请输入 易通贷密码') ydt = YDT(username, password) ydt.login() ================================================ FILE: 其他实战/【易通贷】自动登录/encryp.js ================================================ var hexcase = 0; var b64pad = ""; var chrsz = 8; function hex_md5(s) { return binl2hex(core_md5(str2binl(s), s.length * chrsz)); } function b64_md5(s) { return binl2b64(core_md5(str2binl(s), s.length * chrsz)); } function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } function calcMD5(s) { return binl2hex(core_md5(str2binl(s), s.length * chrsz)); } function md5_vm_test() { return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; } function core_md5(x, len) { x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for (var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return Array(a, b, c, d); } function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } function core_hmac_md5(key, data) { var bkey = str2binl(key); if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); var ipad = Array(16), opad = Array(16); for (var i = 0; i < 16; i++) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); return core_md5(opad.concat(hash), 512 + 128); } function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } function str2binl(str) { var bin = Array(); var mask = (1 << chrsz) - 1; for (var i = 0; i < str.length * chrsz; i += chrsz) bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32); return bin; } function binl2hex(binarray) { var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; for (var i = 0; i < binarray.length * 4; i++) { str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF); } return str; } function binl2b64(binarray) { var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var str = ""; for (var i = 0; i < binarray.length * 4; i += 3) { var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF); for (var j = 0; j < 4; j++) { if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); } } return str; } function make_js(pwd) { var passwd = hex_md5(pwd + 's^H8').toUpperCase(); return hex_md5(passwd.substring(0, 5) + passwd).toUpperCase(); } ================================================ FILE: 其他实战/【汽车之家】参数解密/execute.js ================================================ var hexcase = 0; var b64pad = ""; var chrsz = 8; function hex_md5(a) { return binl2hex(core_md5(str2binl(a), a.length * chrsz)) } function b64_md5(a) { return binl2b64(core_md5(str2binl(a), a.length * chrsz)) } function hex_hmac_md5(a, b) { return binl2hex(core_hmac_md5(a, b)) } function b64_hmac_md5(a, b) { return binl2b64(core_hmac_md5(a, b)) } function calcMD5(a) { return binl2hex(core_md5(str2binl(a), a.length * chrsz)) } function md5_vm_test() { return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72" } function core_md5(p, k) { p[k >> 5] |= 128 << ((k) % 32); p[(((k + 64) >>> 9) << 4) + 14] = k; var o = 1732584193; var n = -271733879; var m = -1732584194; var l = 271733878; for (var g = 0; g < p.length; g += 16) { var j = o; var h = n; var f = m; var e = l; o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936); l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586); m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819); n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330); o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897); l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426); m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341); n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983); o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416); l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417); m = md5_ff(m, l, o, n, p[g + 10], 17, -42063); n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162); o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682); l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101); m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290); n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329); o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510); l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632); m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713); n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302); o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691); l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083); m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335); n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848); o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438); l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690); m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961); n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501); o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467); l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784); m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473); n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734); o = md5_hh(o, n, m, l, p[g + 5], 4, -378558); l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463); m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562); n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556); o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060); l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353); m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632); n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640); o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174); l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222); m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979); n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189); o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487); l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835); m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520); n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651); o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844); l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415); m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905); n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055); o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571); l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606); m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523); n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799); o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359); l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744); m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380); n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649); o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070); l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379); m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259); n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551); o = safe_add(o, j); n = safe_add(n, h); m = safe_add(m, f); l = safe_add(l, e) } return Array(o, n, m, l) } function md5_cmn(h, e, d, c, g, f) { return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d) } function md5_ff(g, f, k, j, e, i, h) { return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h) } function md5_gg(g, f, k, j, e, i, h) { return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) } function md5_hh(g, f, k, j, e, i, h) { return md5_cmn(f ^ k ^ j, g, f, e, i, h) } function md5_ii(g, f, k, j, e, i, h) { return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) } function core_hmac_md5(c, f) { var e = str2binl(c); if (e.length > 16) { e = core_md5(e, c.length * chrsz) } var a = Array(16) , d = Array(16); for (var b = 0; b < 16; b++) { a[b] = e[b] ^ 909522486; d[b] = e[b] ^ 1549556828 } var g = core_md5(a.concat(str2binl(f)), 512 + f.length * chrsz); return core_md5(d.concat(g), 512 + 128) } function safe_add(a, d) { var c = (a & 65535) + (d & 65535); var b = (a >> 16) + (d >> 16) + (c >> 16); return (b << 16) | (c & 65535) } function bit_rol(a, b) { return (a << b) | (a >>> (32 - b)) } function str2binl(d) { var c = Array(); var a = (1 << chrsz) - 1; for (var b = 0; b < d.length * chrsz; b += chrsz) { c[b >> 5] |= (d.charCodeAt(b / chrsz) & a) << (b % 32) } return c } function binl2hex(c) { var b = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var d = ""; for (var a = 0; a < c.length * 4; a++) { d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15) } return d } function binl2b64(d) { var c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var f = ""; for (var b = 0; b < d.length * 4; b += 3) { var e = (((d[b >> 2] >> 8 * (b % 4)) & 255) << 16) | (((d[b + 1 >> 2] >> 8 * ((b + 1) % 4)) & 255) << 8) | ((d[b + 2 >> 2] >> 8 * ((b + 2) % 4)) & 255); for (var a = 0; a < 4; a++) { if (b * 8 + a * 6 > d.length * 32) { f += b64pad } else { f += c.charAt((e >> 6 * (3 - a)) & 63) } } } return f } ================================================ FILE: 其他实战/【汽车之家】参数解密/main.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-26 Python: 3.7 import execjs def main(pwd): """只解决了pwd的加密,其他请自行拓展 :param pwd: :return: """ with open('execute.js', 'r', encoding='utf-8') as f: js = execjs.compile(f.read()) print('引擎', execjs.get().name) sign = js.call('hex_md5', pwd) return sign if __name__ == '__main__': pwd = input('请输入你的密码:') print(main(pwd)) ================================================ FILE: 其他实战/【满级网】自动登录/auto_login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-26 Python: 3.7 import requests import base64 from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5 from Crypto.PublicKey import RSA class YX(object): """ 满级网自动登陆 官网 www.manjiwang.com http://www.manjiwang.com/Logins/BuyerLogin """ def __init__(self, user, pwd): self.user = user self.pwd = pwd self.url = 'http://www.manjiwang.com/Logins/BuyerLogin' self.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'Host': 'www.manjiwang.com', } self.public_key = """-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC4wHerJc4BSst20Zb07lY9LeZss4OEEhe+SrnLyYy8hGquX/aTQNn+5wnV/+8ierKPgqPGIXPf1ZRww5/6yON+O7dAfJ7BRx85HneIWqwPCZToLck8DN8UXsBuXLMcG7tfMunnnZKenrPsAslN0eKvkYkvz4EPGdvmPwz0NCKXQIDAQAB -----END PUBLIC KEY----- """ def make_pwd(self): rsa_key = RSA.importKey(self.public_key) cipher = Cipher_pksc1_v1_5.new(rsa_key) cipher_text = base64.b64encode(cipher.encrypt(self.pwd.encode())) return cipher_text.decode() def make_data(self): data = { 'account': self.user, 'password': self.make_pwd(), 'returnUrl': '/' } return data def login(self): """start """ data = self.make_data() response = requests.post(self.url, data=data) print(response.text) print(response.cookies) if __name__ == '__main__': username = input('请输入账号') password = input('密码') yx = YX(username, password) yx.login() ================================================ FILE: 其他实战/【满级网】自动登录/encryp.js ================================================ var pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC4wHerJc4BSst20Zb07lY9LeZss4OEEhe+SrnLyYy8hGquX/aTQNn+5wnV/+8ierKPgqPGIXPf1ZRww5/6yON+O7dAfJ7BRx85HneIWqwPCZToLck8DN8UXsBuXLMcG7tfMunnnZKenrPsAslN0eKvkYkvz4EPGdvmPwz0NCKXQIDAQAB"; var window = {}; var navigator = {}; var ASN1 = {}; /*! JSEncrypt v2.3.1 | https://npmcdn.com/jsencrypt@2.3.1/LICENSE.txt */ !function(t, e) { "function" == typeof define && define.amd ? define(["exports"], e) : e("object" == typeof exports && "string" != typeof exports.nodeName ? module.exports : t) }(this, function(t) { function e(t, e, i) { null != t && ("number" == typeof t ? this.fromNumber(t, e, i) : null == e && "string" != typeof t ? this.fromString(t, 256) : this.fromString(t, e)) } function i() { return new e(null) } function r(t, e, i, r, s, n) { for (; --n >= 0; ) { var o = e * this[t++] + i[r] + s; s = Math.floor(o / 67108864), i[r++] = 67108863 & o } return s } function s(t, e, i, r, s, n) { for (var o = 32767 & e, h = e >> 15; --n >= 0; ) { var a = 32767 & this[t] , u = this[t++] >> 15 , c = h * a + u * o; a = o * a + ((32767 & c) << 15) + i[r] + (1073741823 & s), s = (a >>> 30) + (c >>> 15) + h * u + (s >>> 30), i[r++] = 1073741823 & a } return s } function n(t, e, i, r, s, n) { for (var o = 16383 & e, h = e >> 14; --n >= 0; ) { var a = 16383 & this[t] , u = this[t++] >> 14 , c = h * a + u * o; a = o * a + ((16383 & c) << 14) + i[r] + s, s = (a >> 28) + (c >> 14) + h * u, i[r++] = 268435455 & a } return s } function o(t) { return Be.charAt(t) } function h(t, e) { var i = Ke[t.charCodeAt(e)]; return null == i ? -1 : i } function a(t) { for (var e = this.t - 1; e >= 0; --e) t[e] = this[e]; t.t = this.t, t.s = this.s } function u(t) { this.t = 1, this.s = 0 > t ? -1 : 0, t > 0 ? this[0] = t : -1 > t ? this[0] = t + this.DV : this.t = 0 } function c(t) { var e = i(); return e.fromInt(t), e } function f(t, i) { var r; if (16 == i) r = 4; else if (8 == i) r = 3; else if (256 == i) r = 8; else if (2 == i) r = 1; else if (32 == i) r = 5; else { if (4 != i) return void this.fromRadix(t, i); r = 2 } this.t = 0, this.s = 0; for (var s = t.length, n = !1, o = 0; --s >= 0; ) { var a = 8 == r ? 255 & t[s] : h(t, s); 0 > a ? "-" == t.charAt(s) && (n = !0) : (n = !1, 0 == o ? this[this.t++] = a : o + r > this.DB ? (this[this.t - 1] |= (a & (1 << this.DB - o) - 1) << o, this[this.t++] = a >> this.DB - o) : this[this.t - 1] |= a << o, o += r, o >= this.DB && (o -= this.DB)) } 8 == r && 0 != (128 & t[0]) && (this.s = -1, o > 0 && (this[this.t - 1] |= (1 << this.DB - o) - 1 << o)), this.clamp(), n && e.ZERO.subTo(this, this) } function p() { for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t; ) --this.t } function l(t) { if (this.s < 0) return "-" + this.negate().toString(t); var e; if (16 == t) e = 4; else if (8 == t) e = 3; else if (2 == t) e = 1; else if (32 == t) e = 5; else { if (4 != t) return this.toRadix(t); e = 2 } var i, r = (1 << e) - 1, s = !1, n = "", h = this.t, a = this.DB - h * this.DB % e; if (h-- > 0) for (a < this.DB && (i = this[h] >> a) > 0 && (s = !0, n = o(i)); h >= 0; ) e > a ? (i = (this[h] & (1 << a) - 1) << e - a, i |= this[--h] >> (a += this.DB - e)) : (i = this[h] >> (a -= e) & r, 0 >= a && (a += this.DB, --h)), i > 0 && (s = !0), s && (n += o(i)); return s ? n : "0" } function d() { var t = i(); return e.ZERO.subTo(this, t), t } function g() { return this.s < 0 ? this.negate() : this } function m(t) { var e = this.s - t.s; if (0 != e) return e; var i = this.t; if (e = i - t.t, 0 != e) return this.s < 0 ? -e : e; for (; --i >= 0; ) if (0 != (e = this[i] - t[i])) return e; return 0 } function y(t) { var e, i = 1; return 0 != (e = t >>> 16) && (t = e, i += 16), 0 != (e = t >> 8) && (t = e, i += 8), 0 != (e = t >> 4) && (t = e, i += 4), 0 != (e = t >> 2) && (t = e, i += 2), 0 != (e = t >> 1) && (t = e, i += 1), i } function b() { return this.t <= 0 ? 0 : this.DB * (this.t - 1) + y(this[this.t - 1] ^ this.s & this.DM) } function T(t, e) { var i; for (i = this.t - 1; i >= 0; --i) e[i + t] = this[i]; for (i = t - 1; i >= 0; --i) e[i] = 0; e.t = this.t + t, e.s = this.s } function S(t, e) { for (var i = t; i < this.t; ++i) e[i - t] = this[i]; e.t = Math.max(this.t - t, 0), e.s = this.s } function R(t, e) { var i, r = t % this.DB, s = this.DB - r, n = (1 << s) - 1, o = Math.floor(t / this.DB), h = this.s << r & this.DM; for (i = this.t - 1; i >= 0; --i) e[i + o + 1] = this[i] >> s | h, h = (this[i] & n) << r; for (i = o - 1; i >= 0; --i) e[i] = 0; e[o] = h, e.t = this.t + o + 1, e.s = this.s, e.clamp() } function E(t, e) { e.s = this.s; var i = Math.floor(t / this.DB); if (i >= this.t) return void (e.t = 0); var r = t % this.DB , s = this.DB - r , n = (1 << r) - 1; e[0] = this[i] >> r; for (var o = i + 1; o < this.t; ++o) e[o - i - 1] |= (this[o] & n) << s, e[o - i] = this[o] >> r; r > 0 && (e[this.t - i - 1] |= (this.s & n) << s), e.t = this.t - i, e.clamp() } function D(t, e) { for (var i = 0, r = 0, s = Math.min(t.t, this.t); s > i; ) r += this[i] - t[i], e[i++] = r & this.DM, r >>= this.DB; if (t.t < this.t) { for (r -= t.s; i < this.t; ) r += this[i], e[i++] = r & this.DM, r >>= this.DB; r += this.s } else { for (r += this.s; i < t.t; ) r -= t[i], e[i++] = r & this.DM, r >>= this.DB; r -= t.s } e.s = 0 > r ? -1 : 0, -1 > r ? e[i++] = this.DV + r : r > 0 && (e[i++] = r), e.t = i, e.clamp() } function w(t, i) { var r = this.abs() , s = t.abs() , n = r.t; for (i.t = n + s.t; --n >= 0; ) i[n] = 0; for (n = 0; n < s.t; ++n) i[n + r.t] = r.am(0, s[n], i, n, 0, r.t); i.s = 0, i.clamp(), this.s != t.s && e.ZERO.subTo(i, i) } function x(t) { for (var e = this.abs(), i = t.t = 2 * e.t; --i >= 0; ) t[i] = 0; for (i = 0; i < e.t - 1; ++i) { var r = e.am(i, e[i], t, 2 * i, 0, 1); (t[i + e.t] += e.am(i + 1, 2 * e[i], t, 2 * i + 1, r, e.t - i - 1)) >= e.DV && (t[i + e.t] -= e.DV, t[i + e.t + 1] = 1) } t.t > 0 && (t[t.t - 1] += e.am(i, e[i], t, 2 * i, 0, 1)), t.s = 0, t.clamp() } function B(t, r, s) { var n = t.abs(); if (!(n.t <= 0)) { var o = this.abs(); if (o.t < n.t) return null != r && r.fromInt(0), void (null != s && this.copyTo(s)); null == s && (s = i()); var h = i() , a = this.s , u = t.s , c = this.DB - y(n[n.t - 1]); c > 0 ? (n.lShiftTo(c, h), o.lShiftTo(c, s)) : (n.copyTo(h), o.copyTo(s)); var f = h.t , p = h[f - 1]; if (0 != p) { var l = p * (1 << this.F1) + (f > 1 ? h[f - 2] >> this.F2 : 0) , d = this.FV / l , g = (1 << this.F1) / l , m = 1 << this.F2 , v = s.t , b = v - f , T = null == r ? i() : r; for (h.dlShiftTo(b, T), s.compareTo(T) >= 0 && (s[s.t++] = 1, s.subTo(T, s)), e.ONE.dlShiftTo(f, T), T.subTo(h, h); h.t < f; ) h[h.t++] = 0; for (; --b >= 0; ) { var S = s[--v] == p ? this.DM : Math.floor(s[v] * d + (s[v - 1] + m) * g); if ((s[v] += h.am(0, S, s, b, 0, f)) < S) for (h.dlShiftTo(b, T), s.subTo(T, s); s[v] < --S; ) s.subTo(T, s) } null != r && (s.drShiftTo(f, r), a != u && e.ZERO.subTo(r, r)), s.t = f, s.clamp(), c > 0 && s.rShiftTo(c, s), 0 > a && e.ZERO.subTo(s, s) } } } function K(t) { var r = i(); return this.abs().divRemTo(t, null, r), this.s < 0 && r.compareTo(e.ZERO) > 0 && t.subTo(r, r), r } function A(t) { this.m = t } function U(t) { return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t } function O(t) { return t } function V(t) { t.divRemTo(this.m, null, t) } function N(t, e, i) { t.multiplyTo(e, i), this.reduce(i) } function J(t, e) { t.squareTo(e), this.reduce(e) } function I() { if (this.t < 1) return 0; var t = this[0]; if (0 == (1 & t)) return 0; var e = 3 & t; return e = e * (2 - (15 & t) * e) & 15, e = e * (2 - (255 & t) * e) & 255, e = e * (2 - ((65535 & t) * e & 65535)) & 65535, e = e * (2 - t * e % this.DV) % this.DV, e > 0 ? this.DV - e : -e } function P(t) { this.m = t, this.mp = t.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << t.DB - 15) - 1, this.mt2 = 2 * t.t } function M(t) { var r = i(); return t.abs().dlShiftTo(this.m.t, r), r.divRemTo(this.m, null, r), t.s < 0 && r.compareTo(e.ZERO) > 0 && this.m.subTo(r, r), r } function L(t) { var e = i(); return t.copyTo(e), this.reduce(e), e } function q(t) { for (; t.t <= this.mt2; ) t[t.t++] = 0; for (var e = 0; e < this.m.t; ++e) { var i = 32767 & t[e] , r = i * this.mpl + ((i * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM; for (i = e + this.m.t, t[i] += this.m.am(0, r, t, e, 0, this.m.t); t[i] >= t.DV; ) t[i] -= t.DV, t[++i]++ } t.clamp(), t.drShiftTo(this.m.t, t), t.compareTo(this.m) >= 0 && t.subTo(this.m, t) } function C(t, e) { t.squareTo(e), this.reduce(e) } function H(t, e, i) { t.multiplyTo(e, i), this.reduce(i) } function j() { return 0 == (this.t > 0 ? 1 & this[0] : this.s) } function k(t, r) { if (t > 4294967295 || 1 > t) return e.ONE; var s = i() , n = i() , o = r.convert(this) , h = y(t) - 1; for (o.copyTo(s); --h >= 0; ) if (r.sqrTo(s, n), (t & 1 << h) > 0) r.mulTo(n, o, s); else { var a = s; s = n, n = a } return r.revert(s) } function F(t, e) { var i; return i = 256 > t || e.isEven() ? new A(e) : new P(e), this.exp(t, i) } // Copyright (c) 2005-2009 Tom Wu // All Rights Reserved. // See "LICENSE" for details. function _() { var t = i(); return this.copyTo(t), t } function z() { if (this.s < 0) { if (1 == this.t) return this[0] - this.DV; if (0 == this.t) return -1 } else { if (1 == this.t) return this[0]; if (0 == this.t) return 0 } return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0] } function Z() { return 0 == this.t ? this.s : this[0] << 24 >> 24 } function G() { return 0 == this.t ? this.s : this[0] << 16 >> 16 } function $(t) { return Math.floor(Math.LN2 * this.DB / Math.log(t)) } function Y() { return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1 } function W(t) { if (null == t && (t = 10), 0 == this.signum() || 2 > t || t > 36) return "0"; var e = this.chunkSize(t) , r = Math.pow(t, e) , s = c(r) , n = i() , o = i() , h = ""; for (this.divRemTo(s, n, o); n.signum() > 0; ) h = (r + o.intValue()).toString(t).substr(1) + h, n.divRemTo(s, n, o); return o.intValue().toString(t) + h } function Q(t, i) { this.fromInt(0), null == i && (i = 10); for (var r = this.chunkSize(i), s = Math.pow(i, r), n = !1, o = 0, a = 0, u = 0; u < t.length; ++u) { var c = h(t, u); 0 > c ? "-" == t.charAt(u) && 0 == this.signum() && (n = !0) : (a = i * a + c, ++o >= r && (this.dMultiply(s), this.dAddOffset(a, 0), o = 0, a = 0)) } o > 0 && (this.dMultiply(Math.pow(i, o)), this.dAddOffset(a, 0)), n && e.ZERO.subTo(this, this) } function X(t, i, r) { if ("number" == typeof i) if (2 > t) this.fromInt(1); else for (this.fromNumber(t, r), this.testBit(t - 1) || this.bitwiseTo(e.ONE.shiftLeft(t - 1), ht, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(i); ) this.dAddOffset(2, 0), this.bitLength() > t && this.subTo(e.ONE.shiftLeft(t - 1), this); else { var s = new Array , n = 7 & t; s.length = (t >> 3) + 1, i.nextBytes(s), n > 0 ? s[0] &= (1 << n) - 1 : s[0] = 0, this.fromString(s, 256) } } function tt() { var t = this.t , e = new Array; e[0] = this.s; var i, r = this.DB - t * this.DB % 8, s = 0; if (t-- > 0) for (r < this.DB && (i = this[t] >> r) != (this.s & this.DM) >> r && (e[s++] = i | this.s << this.DB - r); t >= 0; ) 8 > r ? (i = (this[t] & (1 << r) - 1) << 8 - r, i |= this[--t] >> (r += this.DB - 8)) : (i = this[t] >> (r -= 8) & 255, 0 >= r && (r += this.DB, --t)), 0 != (128 & i) && (i |= -256), 0 == s && (128 & this.s) != (128 & i) && ++s, (s > 0 || i != this.s) && (e[s++] = i); return e } function et(t) { return 0 == this.compareTo(t) } function it(t) { return this.compareTo(t) < 0 ? this : t } function rt(t) { return this.compareTo(t) > 0 ? this : t } function st(t, e, i) { var r, s, n = Math.min(t.t, this.t); for (r = 0; n > r; ++r) i[r] = e(this[r], t[r]); if (t.t < this.t) { for (s = t.s & this.DM, r = n; r < this.t; ++r) i[r] = e(this[r], s); i.t = this.t } else { for (s = this.s & this.DM, r = n; r < t.t; ++r) i[r] = e(s, t[r]); i.t = t.t } i.s = e(this.s, t.s), i.clamp() } function nt(t, e) { return t & e } function ot(t) { var e = i(); return this.bitwiseTo(t, nt, e), e } function ht(t, e) { return t | e } function at(t) { var e = i(); return this.bitwiseTo(t, ht, e), e } function ut(t, e) { return t ^ e } function ct(t) { var e = i(); return this.bitwiseTo(t, ut, e), e } function ft(t, e) { return t & ~e } function pt(t) { var e = i(); return this.bitwiseTo(t, ft, e), e } function lt() { for (var t = i(), e = 0; e < this.t; ++e) t[e] = this.DM & ~this[e]; return t.t = this.t, t.s = ~this.s, t } function dt(t) { var e = i(); return 0 > t ? this.rShiftTo(-t, e) : this.lShiftTo(t, e), e } function gt(t) { var e = i(); return 0 > t ? this.lShiftTo(-t, e) : this.rShiftTo(t, e), e } function mt(t) { if (0 == t) return -1; var e = 0; return 0 == (65535 & t) && (t >>= 16, e += 16), 0 == (255 & t) && (t >>= 8, e += 8), 0 == (15 & t) && (t >>= 4, e += 4), 0 == (3 & t) && (t >>= 2, e += 2), 0 == (1 & t) && ++e, e } function yt() { for (var t = 0; t < this.t; ++t) if (0 != this[t]) return t * this.DB + mt(this[t]); return this.s < 0 ? this.t * this.DB : -1 } function vt(t) { for (var e = 0; 0 != t; ) t &= t - 1, ++e; return e } function bt() { for (var t = 0, e = this.s & this.DM, i = 0; i < this.t; ++i) t += vt(this[i] ^ e); return t } function Tt(t) { var e = Math.floor(t / this.DB); return e >= this.t ? 0 != this.s : 0 != (this[e] & 1 << t % this.DB) } function St(t, i) { var r = e.ONE.shiftLeft(t); return this.bitwiseTo(r, i, r), r } function Rt(t) { return this.changeBit(t, ht) } function Et(t) { return this.changeBit(t, ft) } function Dt(t) { return this.changeBit(t, ut) } function wt(t, e) { for (var i = 0, r = 0, s = Math.min(t.t, this.t); s > i; ) r += this[i] + t[i], e[i++] = r & this.DM, r >>= this.DB; if (t.t < this.t) { for (r += t.s; i < this.t; ) r += this[i], e[i++] = r & this.DM, r >>= this.DB; r += this.s } else { for (r += this.s; i < t.t; ) r += t[i], e[i++] = r & this.DM, r >>= this.DB; r += t.s } e.s = 0 > r ? -1 : 0, r > 0 ? e[i++] = r : -1 > r && (e[i++] = this.DV + r), e.t = i, e.clamp() } function xt(t) { var e = i(); return this.addTo(t, e), e } function Bt(t) { var e = i(); return this.subTo(t, e), e } function Kt(t) { var e = i(); return this.multiplyTo(t, e), e } function At() { var t = i(); return this.squareTo(t), t } function Ut(t) { var e = i(); return this.divRemTo(t, e, null), e } function Ot(t) { var e = i(); return this.divRemTo(t, null, e), e } function Vt(t) { var e = i() , r = i(); return this.divRemTo(t, e, r), new Array(e,r) } function Nt(t) { this[this.t] = this.am(0, t - 1, this, 0, 0, this.t), ++this.t, this.clamp() } function Jt(t, e) { if (0 != t) { for (; this.t <= e; ) this[this.t++] = 0; for (this[e] += t; this[e] >= this.DV; ) this[e] -= this.DV, ++e >= this.t && (this[this.t++] = 0), ++this[e] } } function It() {} function Pt(t) { return t } function Mt(t, e, i) { t.multiplyTo(e, i) } function Lt(t, e) { t.squareTo(e) } function qt(t) { return this.exp(t, new It) } function Ct(t, e, i) { var r = Math.min(this.t + t.t, e); for (i.s = 0, i.t = r; r > 0; ) i[--r] = 0; var s; for (s = i.t - this.t; s > r; ++r) i[r + this.t] = this.am(0, t[r], i, r, 0, this.t); for (s = Math.min(t.t, e); s > r; ++r) this.am(0, t[r], i, r, 0, e - r); i.clamp() } function Ht(t, e, i) { --e; var r = i.t = this.t + t.t - e; for (i.s = 0; --r >= 0; ) i[r] = 0; for (r = Math.max(e - this.t, 0); r < t.t; ++r) i[this.t + r - e] = this.am(e - r, t[r], i, 0, 0, this.t + r - e); i.clamp(), i.drShiftTo(1, i) } function jt(t) { this.r2 = i(), this.q3 = i(), e.ONE.dlShiftTo(2 * t.t, this.r2), this.mu = this.r2.divide(t), this.m = t } function kt(t) { if (t.s < 0 || t.t > 2 * this.m.t) return t.mod(this.m); if (t.compareTo(this.m) < 0) return t; var e = i(); return t.copyTo(e), this.reduce(e), e } function Ft(t) { return t } function _t(t) { for (t.drShiftTo(this.m.t - 1, this.r2), t.t > this.m.t + 1 && (t.t = this.m.t + 1, t.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0; ) t.dAddOffset(1, this.m.t + 1); for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0; ) t.subTo(this.m, t) } function zt(t, e) { t.squareTo(e), this.reduce(e) } function Zt(t, e, i) { t.multiplyTo(e, i), this.reduce(i) } function Gt(t, e) { var r, s, n = t.bitLength(), o = c(1); if (0 >= n) return o; r = 18 > n ? 1 : 48 > n ? 3 : 144 > n ? 4 : 768 > n ? 5 : 6, s = 8 > n ? new A(e) : e.isEven() ? new jt(e) : new P(e); var h = new Array , a = 3 , u = r - 1 , f = (1 << r) - 1; if (h[1] = s.convert(this), r > 1) { var p = i(); for (s.sqrTo(h[1], p); f >= a; ) h[a] = i(), s.mulTo(p, h[a - 2], h[a]), a += 2 } var l, d, g = t.t - 1, m = !0, v = i(); for (n = y(t[g]) - 1; g >= 0; ) { for (n >= u ? l = t[g] >> n - u & f : (l = (t[g] & (1 << n + 1) - 1) << u - n, g > 0 && (l |= t[g - 1] >> this.DB + n - u)), a = r; 0 == (1 & l); ) l >>= 1, --a; if ((n -= a) < 0 && (n += this.DB, --g), m) h[l].copyTo(o), m = !1; else { for (; a > 1; ) s.sqrTo(o, v), s.sqrTo(v, o), a -= 2; a > 0 ? s.sqrTo(o, v) : (d = o, o = v, v = d), s.mulTo(v, h[l], o) } for (; g >= 0 && 0 == (t[g] & 1 << n); ) s.sqrTo(o, v), d = o, o = v, v = d, --n < 0 && (n = this.DB - 1, --g) } return s.revert(o) } function $t(t) { var e = this.s < 0 ? this.negate() : this.clone() , i = t.s < 0 ? t.negate() : t.clone(); if (e.compareTo(i) < 0) { var r = e; e = i, i = r } var s = e.getLowestSetBit() , n = i.getLowestSetBit(); if (0 > n) return e; for (n > s && (n = s), n > 0 && (e.rShiftTo(n, e), i.rShiftTo(n, i)); e.signum() > 0; ) (s = e.getLowestSetBit()) > 0 && e.rShiftTo(s, e), (s = i.getLowestSetBit()) > 0 && i.rShiftTo(s, i), e.compareTo(i) >= 0 ? (e.subTo(i, e), e.rShiftTo(1, e)) : (i.subTo(e, i), i.rShiftTo(1, i)); return n > 0 && i.lShiftTo(n, i), i } function Yt(t) { if (0 >= t) return 0; var e = this.DV % t , i = this.s < 0 ? t - 1 : 0; if (this.t > 0) if (0 == e) i = this[0] % t; else for (var r = this.t - 1; r >= 0; --r) i = (e * i + this[r]) % t; return i } function Wt(t) { var i = t.isEven(); if (this.isEven() && i || 0 == t.signum()) return e.ZERO; for (var r = t.clone(), s = this.clone(), n = c(1), o = c(0), h = c(0), a = c(1); 0 != r.signum(); ) { for (; r.isEven(); ) r.rShiftTo(1, r), i ? (n.isEven() && o.isEven() || (n.addTo(this, n), o.subTo(t, o)), n.rShiftTo(1, n)) : o.isEven() || o.subTo(t, o), o.rShiftTo(1, o); for (; s.isEven(); ) s.rShiftTo(1, s), i ? (h.isEven() && a.isEven() || (h.addTo(this, h), a.subTo(t, a)), h.rShiftTo(1, h)) : a.isEven() || a.subTo(t, a), a.rShiftTo(1, a); r.compareTo(s) >= 0 ? (r.subTo(s, r), i && n.subTo(h, n), o.subTo(a, o)) : (s.subTo(r, s), i && h.subTo(n, h), a.subTo(o, a)) } return 0 != s.compareTo(e.ONE) ? e.ZERO : a.compareTo(t) >= 0 ? a.subtract(t) : a.signum() < 0 ? (a.addTo(t, a), a.signum() < 0 ? a.add(t) : a) : a } function Qt(t) { var e, i = this.abs(); if (1 == i.t && i[0] <= Ae[Ae.length - 1]) { for (e = 0; e < Ae.length; ++e) if (i[0] == Ae[e]) return !0; return !1 } if (i.isEven()) return !1; for (e = 1; e < Ae.length; ) { for (var r = Ae[e], s = e + 1; s < Ae.length && Ue > r; ) r *= Ae[s++]; for (r = i.modInt(r); s > e; ) if (r % Ae[e++] == 0) return !1 } return i.millerRabin(t) } function Xt(t) { var r = this.subtract(e.ONE) , s = r.getLowestSetBit(); if (0 >= s) return !1; var n = r.shiftRight(s); t = t + 1 >> 1, t > Ae.length && (t = Ae.length); for (var o = i(), h = 0; t > h; ++h) { o.fromInt(Ae[Math.floor(Math.random() * Ae.length)]); var a = o.modPow(n, this); if (0 != a.compareTo(e.ONE) && 0 != a.compareTo(r)) { for (var u = 1; u++ < s && 0 != a.compareTo(r); ) if (a = a.modPowInt(2, this), 0 == a.compareTo(e.ONE)) return !1; if (0 != a.compareTo(r)) return !1 } } return !0 } function te() { this.i = 0, this.j = 0, this.S = new Array } function ee(t) { var e, i, r; for (e = 0; 256 > e; ++e) this.S[e] = e; for (i = 0, e = 0; 256 > e; ++e) i = i + this.S[e] + t[e % t.length] & 255, r = this.S[e], this.S[e] = this.S[i], this.S[i] = r; this.i = 0, this.j = 0 } function ie() { var t; return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, t = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = t, this.S[t + this.S[this.i] & 255] } function re() { return new te } function se() { if (null == Oe) { for (Oe = re(); Je > Ne; ) { var t = Math.floor(65536 * Math.random()); Ve[Ne++] = 255 & t } for (Oe.init(Ve), Ne = 0; Ne < Ve.length; ++Ne) Ve[Ne] = 0; Ne = 0 } return Oe.next() } function ne(t) { var e; for (e = 0; e < t.length; ++e) t[e] = se() } function oe() {} function he(t, i) { return new e(t,i) } function ae(t, i) { if (i < t.length + 11) return console.error("Message too long for RSA"), null; for (var r = new Array, s = t.length - 1; s >= 0 && i > 0; ) { var n = t.charCodeAt(s--); 128 > n ? r[--i] = n : n > 127 && 2048 > n ? (r[--i] = 63 & n | 128, r[--i] = n >> 6 | 192) : (r[--i] = 63 & n | 128, r[--i] = n >> 6 & 63 | 128, r[--i] = n >> 12 | 224) } r[--i] = 0; for (var o = new oe, h = new Array; i > 2; ) { for (h[0] = 0; 0 == h[0]; ) o.nextBytes(h); r[--i] = h[0] } return r[--i] = 2, r[--i] = 0, new e(r) } function ue() { this.n = null, this.e = 0, this.d = null, this.p = null, this.q = null, this.dmp1 = null, this.dmq1 = null, this.coeff = null } function ce(t, e) { null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = he(t, 16), this.e = parseInt(e, 16)) : console.error("Invalid RSA public key") } function fe(t) { return t.modPowInt(this.e, this.n) } function pe(t) { var e = ae(t, this.n.bitLength() + 7 >> 3); if (null == e) return null; var i = this.doPublic(e); if (null == i) return null; var r = i.toString(16); return 0 == (1 & r.length) ? r : "0" + r } function le(t, e) { for (var i = t.toByteArray(), r = 0; r < i.length && 0 == i[r]; ) ++r; if (i.length - r != e - 1 || 2 != i[r]) return null; for (++r; 0 != i[r]; ) if (++r >= i.length) return null; for (var s = ""; ++r < i.length; ) { var n = 255 & i[r]; 128 > n ? s += String.fromCharCode(n) : n > 191 && 224 > n ? (s += String.fromCharCode((31 & n) << 6 | 63 & i[r + 1]), ++r) : (s += String.fromCharCode((15 & n) << 12 | (63 & i[r + 1]) << 6 | 63 & i[r + 2]), r += 2) } return s } function de(t, e, i) { null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = he(t, 16), this.e = parseInt(e, 16), this.d = he(i, 16)) : console.error("Invalid RSA private key") } function ge(t, e, i, r, s, n, o, h) { null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = he(t, 16), this.e = parseInt(e, 16), this.d = he(i, 16), this.p = he(r, 16), this.q = he(s, 16), this.dmp1 = he(n, 16), this.dmq1 = he(o, 16), this.coeff = he(h, 16)) : console.error("Invalid RSA private key") } function me(t, i) { var r = new oe , s = t >> 1; this.e = parseInt(i, 16); for (var n = new e(i,16); ; ) { for (; this.p = new e(t - s,1,r), 0 != this.p.subtract(e.ONE).gcd(n).compareTo(e.ONE) || !this.p.isProbablePrime(10); ) ; for (; this.q = new e(s,1,r), 0 != this.q.subtract(e.ONE).gcd(n).compareTo(e.ONE) || !this.q.isProbablePrime(10); ) ; if (this.p.compareTo(this.q) <= 0) { var o = this.p; this.p = this.q, this.q = o } var h = this.p.subtract(e.ONE) , a = this.q.subtract(e.ONE) , u = h.multiply(a); if (0 == u.gcd(n).compareTo(e.ONE)) { this.n = this.p.multiply(this.q), this.d = n.modInverse(u), this.dmp1 = this.d.mod(h), this.dmq1 = this.d.mod(a), this.coeff = this.q.modInverse(this.p); break } } } function ye(t) { if (null == this.p || null == this.q) return t.modPow(this.d, this.n); for (var e = t.mod(this.p).modPow(this.dmp1, this.p), i = t.mod(this.q).modPow(this.dmq1, this.q); e.compareTo(i) < 0; ) e = e.add(this.p); return e.subtract(i).multiply(this.coeff).mod(this.p).multiply(this.q).add(i) } function ve(t) { var e = he(t, 16) , i = this.doPrivate(e); return null == i ? null : le(i, this.n.bitLength() + 7 >> 3) } function be(t) { var e, i, r = ""; for (e = 0; e + 3 <= t.length; e += 3) i = parseInt(t.substring(e, e + 3), 16), r += Le.charAt(i >> 6) + Le.charAt(63 & i); for (e + 1 == t.length ? (i = parseInt(t.substring(e, e + 1), 16), r += Le.charAt(i << 2)) : e + 2 == t.length && (i = parseInt(t.substring(e, e + 2), 16), r += Le.charAt(i >> 2) + Le.charAt((3 & i) << 4)); (3 & r.length) > 0; ) r += qe; return r } function Te(t) { var e, i, r = "", s = 0; for (e = 0; e < t.length && t.charAt(e) != qe; ++e) v = Le.indexOf(t.charAt(e)), v < 0 || (0 == s ? (r += o(v >> 2), i = 3 & v, s = 1) : 1 == s ? (r += o(i << 2 | v >> 4), i = 15 & v, s = 2) : 2 == s ? (r += o(i), r += o(v >> 2), i = 3 & v, s = 3) : (r += o(i << 2 | v >> 4), r += o(15 & v), s = 0)); return 1 == s && (r += o(i << 2)), r } // Copyright (c) 2005 Tom Wu // All Rights Reserved. // See "LICENSE" for details. var Se, Re = 0xdeadbeefcafe, Ee = 15715070 == (16777215 & Re); Ee && "Microsoft Internet Explorer" == navigator.appName ? (e.prototype.am = s, Se = 30) : Ee && "Netscape" != navigator.appName ? (e.prototype.am = r, Se = 26) : (e.prototype.am = n, Se = 28), e.prototype.DB = Se, e.prototype.DM = (1 << Se) - 1, e.prototype.DV = 1 << Se; var De = 52; e.prototype.FV = Math.pow(2, De), e.prototype.F1 = De - Se, e.prototype.F2 = 2 * Se - De; var we, xe, Be = "0123456789abcdefghijklmnopqrstuvwxyz", Ke = new Array; for (we = "0".charCodeAt(0), xe = 0; 9 >= xe; ++xe) Ke[we++] = xe; for (we = "a".charCodeAt(0), xe = 10; 36 > xe; ++xe) Ke[we++] = xe; for (we = "A".charCodeAt(0), xe = 10; 36 > xe; ++xe) Ke[we++] = xe; A.prototype.convert = U, A.prototype.revert = O, A.prototype.reduce = V, A.prototype.mulTo = N, A.prototype.sqrTo = J, P.prototype.convert = M, P.prototype.revert = L, P.prototype.reduce = q, P.prototype.mulTo = H, P.prototype.sqrTo = C, e.prototype.copyTo = a, e.prototype.fromInt = u, e.prototype.fromString = f, e.prototype.clamp = p, e.prototype.dlShiftTo = T, e.prototype.drShiftTo = S, e.prototype.lShiftTo = R, e.prototype.rShiftTo = E, e.prototype.subTo = D, e.prototype.multiplyTo = w, e.prototype.squareTo = x, e.prototype.divRemTo = B, e.prototype.invDigit = I, e.prototype.isEven = j, e.prototype.exp = k, e.prototype.toString = l, e.prototype.negate = d, e.prototype.abs = g, e.prototype.compareTo = m, e.prototype.bitLength = b, e.prototype.mod = K, e.prototype.modPowInt = F, e.ZERO = c(0), e.ONE = c(1), It.prototype.convert = Pt, It.prototype.revert = Pt, It.prototype.mulTo = Mt, It.prototype.sqrTo = Lt, jt.prototype.convert = kt, jt.prototype.revert = Ft, jt.prototype.reduce = _t, jt.prototype.mulTo = Zt, jt.prototype.sqrTo = zt; var Ae = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997] , Ue = (1 << 26) / Ae[Ae.length - 1]; e.prototype.chunkSize = $, e.prototype.toRadix = W, e.prototype.fromRadix = Q, e.prototype.fromNumber = X, e.prototype.bitwiseTo = st, e.prototype.changeBit = St, e.prototype.addTo = wt, e.prototype.dMultiply = Nt, e.prototype.dAddOffset = Jt, e.prototype.multiplyLowerTo = Ct, e.prototype.multiplyUpperTo = Ht, e.prototype.modInt = Yt, e.prototype.millerRabin = Xt, e.prototype.clone = _, e.prototype.intValue = z, e.prototype.byteValue = Z, e.prototype.shortValue = G, e.prototype.signum = Y, e.prototype.toByteArray = tt, e.prototype.equals = et, e.prototype.min = it, e.prototype.max = rt, e.prototype.and = ot, e.prototype.or = at, e.prototype.xor = ct, e.prototype.andNot = pt, e.prototype.not = lt, e.prototype.shiftLeft = dt, e.prototype.shiftRight = gt, e.prototype.getLowestSetBit = yt, e.prototype.bitCount = bt, e.prototype.testBit = Tt, e.prototype.setBit = Rt, e.prototype.clearBit = Et, e.prototype.flipBit = Dt, e.prototype.add = xt, e.prototype.subtract = Bt, e.prototype.multiply = Kt, e.prototype.divide = Ut, e.prototype.remainder = Ot, e.prototype.divideAndRemainder = Vt, e.prototype.modPow = Gt, e.prototype.modInverse = Wt, e.prototype.pow = qt, e.prototype.gcd = $t, e.prototype.isProbablePrime = Qt, e.prototype.square = At, te.prototype.init = ee, te.prototype.next = ie; var Oe, Ve, Ne, Je = 256; if (null == Ve) { Ve = new Array, Ne = 0; var Ie; if (window.crypto && window.crypto.getRandomValues) { var Pe = new Uint32Array(256); for (window.crypto.getRandomValues(Pe), Ie = 0; Ie < Pe.length; ++Ie) Ve[Ne++] = 255 & Pe[Ie] } var Me = function(t) { if (this.count = this.count || 0, this.count >= 256 || Ne >= Je) return void (window.removeEventListener ? window.removeEventListener("mousemove", Me, !1) : window.detachEvent && window.detachEvent("onmousemove", Me)); try { var e = t.x + t.y; Ve[Ne++] = 255 & e, this.count += 1 } catch (i) {} }; window.addEventListener ? window.addEventListener("mousemove", Me, !1) : window.attachEvent && window.attachEvent("onmousemove", Me) } oe.prototype.nextBytes = ne, ue.prototype.doPublic = fe, ue.prototype.setPublic = ce, ue.prototype.encrypt = pe, ue.prototype.doPrivate = ye, ue.prototype.setPrivate = de, ue.prototype.setPrivateEx = ge, ue.prototype.generate = me, ue.prototype.decrypt = ve, // Copyright (c) 2011 Kevin M Burns Jr. // All Rights Reserved. // See "LICENSE" for details. // // Extension to jsbn which adds facilities for asynchronous RSA key generation // Primarily created to avoid execution timeout on mobile devices // // http://www-cs-students.stanford.edu/~tjw/jsbn/ // // --- function() { var t = function(t, r, s) { var n = new oe , o = t >> 1; this.e = parseInt(r, 16); var h = new e(r,16) , a = this , u = function() { var r = function() { if (a.p.compareTo(a.q) <= 0) { var t = a.p; a.p = a.q, a.q = t } var i = a.p.subtract(e.ONE) , r = a.q.subtract(e.ONE) , n = i.multiply(r); 0 == n.gcd(h).compareTo(e.ONE) ? (a.n = a.p.multiply(a.q), a.d = h.modInverse(n), a.dmp1 = a.d.mod(i), a.dmq1 = a.d.mod(r), a.coeff = a.q.modInverse(a.p), setTimeout(function() { s() }, 0)) : setTimeout(u, 0) } , c = function() { a.q = i(), a.q.fromNumberAsync(o, 1, n, function() { a.q.subtract(e.ONE).gcda(h, function(t) { 0 == t.compareTo(e.ONE) && a.q.isProbablePrime(10) ? setTimeout(r, 0) : setTimeout(c, 0) }) }) } , f = function() { a.p = i(), a.p.fromNumberAsync(t - o, 1, n, function() { a.p.subtract(e.ONE).gcda(h, function(t) { 0 == t.compareTo(e.ONE) && a.p.isProbablePrime(10) ? setTimeout(c, 0) : setTimeout(f, 0) }) }) }; setTimeout(f, 0) }; setTimeout(u, 0) }; ue.prototype.generateAsync = t; var r = function(t, e) { var i = this.s < 0 ? this.negate() : this.clone() , r = t.s < 0 ? t.negate() : t.clone(); if (i.compareTo(r) < 0) { var s = i; i = r, r = s } var n = i.getLowestSetBit() , o = r.getLowestSetBit(); if (0 > o) return void e(i); o > n && (o = n), o > 0 && (i.rShiftTo(o, i), r.rShiftTo(o, r)); var h = function() { (n = i.getLowestSetBit()) > 0 && i.rShiftTo(n, i), (n = r.getLowestSetBit()) > 0 && r.rShiftTo(n, r), i.compareTo(r) >= 0 ? (i.subTo(r, i), i.rShiftTo(1, i)) : (r.subTo(i, r), r.rShiftTo(1, r)), i.signum() > 0 ? setTimeout(h, 0) : (o > 0 && r.lShiftTo(o, r), setTimeout(function() { e(r) }, 0)) }; setTimeout(h, 10) }; e.prototype.gcda = r; var s = function(t, i, r, s) { if ("number" == typeof i) if (2 > t) this.fromInt(1); else { this.fromNumber(t, r), this.testBit(t - 1) || this.bitwiseTo(e.ONE.shiftLeft(t - 1), ht, this), this.isEven() && this.dAddOffset(1, 0); var n = this , o = function() { n.dAddOffset(2, 0), n.bitLength() > t && n.subTo(e.ONE.shiftLeft(t - 1), n), n.isProbablePrime(i) ? setTimeout(function() { s() }, 0) : setTimeout(o, 0) }; setTimeout(o, 0) } else { var h = new Array , a = 7 & t; h.length = (t >> 3) + 1, i.nextBytes(h), a > 0 ? h[0] &= (1 << a) - 1 : h[0] = 0, this.fromString(h, 256) } }; e.prototype.fromNumberAsync = s }(); var Le = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" , qe = "=" , Ce = Ce || {}; Ce.env = Ce.env || {}; var He = Ce , je = Object.prototype , ke = "[object Function]" , Fe = ["toString", "valueOf"]; Ce.env.parseUA = function(t) { var e, i = function(t) { var e = 0; return parseFloat(t.replace(/\./g, function() { return 1 == e++ ? "" : "." })) }, r = navigator, s = { ie: 0, opera: 0, gecko: 0, webkit: 0, chrome: 0, mobile: null, air: 0, ipad: 0, iphone: 0, ipod: 0, ios: null, android: 0, webos: 0, caja: r && r.cajaVersion, secure: !1, os: null }, n = t || navigator && navigator.userAgent, o = window && window.location, h = o && o.href; return s.secure = h && 0 === h.toLowerCase().indexOf("https"), n && (/windows|win32/i.test(n) ? s.os = "windows" : /macintosh/i.test(n) ? s.os = "macintosh" : /rhino/i.test(n) && (s.os = "rhino"), /KHTML/.test(n) && (s.webkit = 1), e = n.match(/AppleWebKit\/([^\s]*)/), e && e[1] && (s.webkit = i(e[1]), / Mobile\//.test(n) ? (s.mobile = "Apple", e = n.match(/OS ([^\s]*)/), e && e[1] && (e = i(e[1].replace("_", "."))), s.ios = e, s.ipad = s.ipod = s.iphone = 0, e = n.match(/iPad|iPod|iPhone/), e && e[0] && (s[e[0].toLowerCase()] = s.ios)) : (e = n.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/), e && (s.mobile = e[0]), /webOS/.test(n) && (s.mobile = "WebOS", e = n.match(/webOS\/([^\s]*);/), e && e[1] && (s.webos = i(e[1]))), / Android/.test(n) && (s.mobile = "Android", e = n.match(/Android ([^\s]*);/), e && e[1] && (s.android = i(e[1])))), e = n.match(/Chrome\/([^\s]*)/), e && e[1] ? s.chrome = i(e[1]) : (e = n.match(/AdobeAIR\/([^\s]*)/), e && (s.air = e[0]))), s.webkit || (e = n.match(/Opera[\s\/]([^\s]*)/), e && e[1] ? (s.opera = i(e[1]), e = n.match(/Version\/([^\s]*)/), e && e[1] && (s.opera = i(e[1])), e = n.match(/Opera Mini[^;]*/), e && (s.mobile = e[0])) : (e = n.match(/MSIE\s([^;]*)/), e && e[1] ? s.ie = i(e[1]) : (e = n.match(/Gecko\/([^\s]*)/), e && (s.gecko = 1, e = n.match(/rv:([^\s\)]*)/), e && e[1] && (s.gecko = i(e[1]))))))), s } , Ce.env.ua = Ce.env.parseUA(), Ce.isFunction = function(t) { return "function" == typeof t || je.toString.apply(t) === ke } , Ce._IEEnumFix = Ce.env.ua.ie ? function(t, e) { var i, r, s; for (i = 0; i < Fe.length; i += 1) r = Fe[i], s = e[r], He.isFunction(s) && s != je[r] && (t[r] = s) } : function() {} , Ce.extend = function(t, e, i) { if (!e || !t) throw new Error("extend failed, please check that all dependencies are included."); var r, s = function() {}; if (s.prototype = e.prototype, t.prototype = new s, t.prototype.constructor = t, t.superclass = e.prototype, e.prototype.constructor == je.constructor && (e.prototype.constructor = e), i) { for (r in i) He.hasOwnProperty(i, r) && (t.prototype[r] = i[r]); He._IEEnumFix(t.prototype, i) } } , /* * asn1.js - ASN.1 DER encoder classes * * Copyright (c) 2013 Kenji Urushima (kenji.urushima@gmail.com) * * This software is licensed under the terms of the MIT License. * http://kjur.github.com/jsrsasign/license * * The above copyright and license notice shall be * included in all copies or substantial portions of the Software. */ /** * @fileOverview * @name asn1-1.0.js * @author Kenji Urushima kenji.urushima@gmail.com * @version 1.0.2 (2013-May-30) * @since 2.1 * @license MIT License */ "undefined" != typeof KJUR && KJUR || (KJUR = {}), "undefined" != typeof KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}), KJUR.asn1.ASN1Util = new function() { this.integerToByteHex = function(t) { var e = t.toString(16); return e.length % 2 == 1 && (e = "0" + e), e } , this.bigIntToMinTwosComplementsHex = function(t) { var i = t.toString(16); if ("-" != i.substr(0, 1)) i.length % 2 == 1 ? i = "0" + i : i.match(/^[0-7]/) || (i = "00" + i); else { var r = i.substr(1) , s = r.length; s % 2 == 1 ? s += 1 : i.match(/^[0-7]/) || (s += 2); for (var n = "", o = 0; s > o; o++) n += "f"; var h = new e(n,16) , a = h.xor(t).add(e.ONE); i = a.toString(16).replace(/^-/, "") } return i } , this.getPEMStringFromHex = function(t, e) { var i = CryptoJS.enc.Hex.parse(t) , r = CryptoJS.enc.Base64.stringify(i) , s = r.replace(/(.{64})/g, "$1\r\n"); return s = s.replace(/\r\n$/, ""), "-----BEGIN " + e + "-----\r\n" + s + "\r\n-----END " + e + "-----\r\n" } } , KJUR.asn1.ASN1Object = function() { var t = ""; this.getLengthHexFromValue = function() { if ("undefined" == typeof this.hV || null == this.hV) throw "this.hV is null or undefined."; if (this.hV.length % 2 == 1) throw "value hex must be even length: n=" + t.length + ",v=" + this.hV; var e = this.hV.length / 2 , i = e.toString(16); if (i.length % 2 == 1 && (i = "0" + i), 128 > e) return i; var r = i.length / 2; if (r > 15) throw "ASN.1 length too long to represent by 8x: n = " + e.toString(16); var s = 128 + r; return s.toString(16) + i } , this.getEncodedHex = function() { return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1), this.hTLV } , this.getValueHex = function() { return this.getEncodedHex(), this.hV } , this.getFreshValueHex = function() { return "" } } , KJUR.asn1.DERAbstractString = function(t) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this); this.getString = function() { return this.s } , this.setString = function(t) { this.hTLV = null, this.isModified = !0, this.s = t, this.hV = stohex(this.s) } , this.setStringHex = function(t) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = t } , this.getFreshValueHex = function() { return this.hV } , "undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex && this.setStringHex(t.hex)) } , Ce.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object), KJUR.asn1.DERAbstractTime = function(t) { KJUR.asn1.DERAbstractTime.superclass.constructor.call(this); this.localDateToUTC = function(t) { utc = t.getTime() + 6e4 * t.getTimezoneOffset(); var e = new Date(utc); return e } , this.formatDate = function(t, e) { var i = this.zeroPadding , r = this.localDateToUTC(t) , s = String(r.getFullYear()); "utc" == e && (s = s.substr(2, 2)); var n = i(String(r.getMonth() + 1), 2) , o = i(String(r.getDate()), 2) , h = i(String(r.getHours()), 2) , a = i(String(r.getMinutes()), 2) , u = i(String(r.getSeconds()), 2); return s + n + o + h + a + u + "Z" } , this.zeroPadding = function(t, e) { return t.length >= e ? t : new Array(e - t.length + 1).join("0") + t } , this.getString = function() { return this.s } , this.setString = function(t) { this.hTLV = null, this.isModified = !0, this.s = t, this.hV = stohex(this.s) } , this.setByDateValue = function(t, e, i, r, s, n) { var o = new Date(Date.UTC(t, e - 1, i, r, s, n, 0)); this.setByDate(o) } , this.getFreshValueHex = function() { return this.hV } } , Ce.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object), KJUR.asn1.DERAbstractStructured = function(t) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this); this.setByASN1ObjectArray = function(t) { this.hTLV = null, this.isModified = !0, this.asn1Array = t } , this.appendASN1Object = function(t) { this.hTLV = null, this.isModified = !0, this.asn1Array.push(t) } , this.asn1Array = new Array, "undefined" != typeof t && "undefined" != typeof t.array && (this.asn1Array = t.array) } , Ce.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object), KJUR.asn1.DERBoolean = function() { KJUR.asn1.DERBoolean.superclass.constructor.call(this), this.hT = "01", this.hTLV = "0101ff" } , Ce.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object), KJUR.asn1.DERInteger = function(t) { KJUR.asn1.DERInteger.superclass.constructor.call(this), this.hT = "02", this.setByBigInteger = function(t) { this.hTLV = null, this.isModified = !0, this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t) } , this.setByInteger = function(t) { var i = new e(String(t),10); this.setByBigInteger(i) } , this.setValueHex = function(t) { this.hV = t } , this.getFreshValueHex = function() { return this.hV } , "undefined" != typeof t && ("undefined" != typeof t.bigint ? this.setByBigInteger(t.bigint) : "undefined" != typeof t["int"] ? this.setByInteger(t["int"]) : "undefined" != typeof t.hex && this.setValueHex(t.hex)) } , Ce.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object), KJUR.asn1.DERBitString = function(t) { KJUR.asn1.DERBitString.superclass.constructor.call(this), this.hT = "03", this.setHexValueIncludingUnusedBits = function(t) { this.hTLV = null, this.isModified = !0, this.hV = t } , this.setUnusedBitsAndHexValue = function(t, e) { if (0 > t || t > 7) throw "unused bits shall be from 0 to 7: u = " + t; var i = "0" + t; this.hTLV = null, this.isModified = !0, this.hV = i + e } , this.setByBinaryString = function(t) { t = t.replace(/0+$/, ""); var e = 8 - t.length % 8; 8 == e && (e = 0); for (var i = 0; e >= i; i++) t += "0"; for (var r = "", i = 0; i < t.length - 1; i += 8) { var s = t.substr(i, 8) , n = parseInt(s, 2).toString(16); 1 == n.length && (n = "0" + n), r += n } this.hTLV = null, this.isModified = !0, this.hV = "0" + e + r } , this.setByBooleanArray = function(t) { for (var e = "", i = 0; i < t.length; i++) e += 1 == t[i] ? "1" : "0"; this.setByBinaryString(e) } , this.newFalseArray = function(t) { for (var e = new Array(t), i = 0; t > i; i++) e[i] = !1; return e } , this.getFreshValueHex = function() { return this.hV } , "undefined" != typeof t && ("undefined" != typeof t.hex ? this.setHexValueIncludingUnusedBits(t.hex) : "undefined" != typeof t.bin ? this.setByBinaryString(t.bin) : "undefined" != typeof t.array && this.setByBooleanArray(t.array)) } , Ce.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object), KJUR.asn1.DEROctetString = function(t) { KJUR.asn1.DEROctetString.superclass.constructor.call(this, t), this.hT = "04" } , Ce.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERNull = function() { KJUR.asn1.DERNull.superclass.constructor.call(this), this.hT = "05", this.hTLV = "0500" } , Ce.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object), KJUR.asn1.DERObjectIdentifier = function(t) { var i = function(t) { var e = t.toString(16); return 1 == e.length && (e = "0" + e), e } , r = function(t) { var r = "" , s = new e(t,10) , n = s.toString(2) , o = 7 - n.length % 7; 7 == o && (o = 0); for (var h = "", a = 0; o > a; a++) h += "0"; n = h + n; for (var a = 0; a < n.length - 1; a += 7) { var u = n.substr(a, 7); a != n.length - 7 && (u = "1" + u), r += i(parseInt(u, 2)) } return r }; KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this), this.hT = "06", this.setValueHex = function(t) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = t } , this.setValueOidString = function(t) { if (!t.match(/^[0-9.]+$/)) throw "malformed oid string: " + t; var e = "" , s = t.split(".") , n = 40 * parseInt(s[0]) + parseInt(s[1]); e += i(n), s.splice(0, 2); for (var o = 0; o < s.length; o++) e += r(s[o]); this.hTLV = null, this.isModified = !0, this.s = null, this.hV = e } , this.setValueName = function(t) { if ("undefined" == typeof KJUR.asn1.x509.OID.name2oidList[t]) throw "DERObjectIdentifier oidName undefined: " + t; var e = KJUR.asn1.x509.OID.name2oidList[t]; this.setValueOidString(e) } , this.getFreshValueHex = function() { return this.hV } , "undefined" != typeof t && ("undefined" != typeof t.oid ? this.setValueOidString(t.oid) : "undefined" != typeof t.hex ? this.setValueHex(t.hex) : "undefined" != typeof t.name && this.setValueName(t.name)) } , Ce.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object), KJUR.asn1.DERUTF8String = function(t) { KJUR.asn1.DERUTF8String.superclass.constructor.call(this, t), this.hT = "0c" } , Ce.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString), KJUR.asn1.DERNumericString = function(t) { KJUR.asn1.DERNumericString.superclass.constructor.call(this, t), this.hT = "12" } , Ce.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERPrintableString = function(t) { KJUR.asn1.DERPrintableString.superclass.constructor.call(this, t), this.hT = "13" } , Ce.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERTeletexString = function(t) { KJUR.asn1.DERTeletexString.superclass.constructor.call(this, t), this.hT = "14" } , Ce.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERIA5String = function(t) { KJUR.asn1.DERIA5String.superclass.constructor.call(this, t), this.hT = "16" } , Ce.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString), KJUR.asn1.DERUTCTime = function(t) { KJUR.asn1.DERUTCTime.superclass.constructor.call(this, t), this.hT = "17", this.setByDate = function(t) { this.hTLV = null, this.isModified = !0, this.date = t, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s) } , "undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex ? this.setStringHex(t.hex) : "undefined" != typeof t.date && this.setByDate(t.date)) } , Ce.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime), KJUR.asn1.DERGeneralizedTime = function(t) { KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, t), this.hT = "18", this.setByDate = function(t) { this.hTLV = null, this.isModified = !0, this.date = t, this.s = this.formatDate(this.date, "gen"), this.hV = stohex(this.s) } , "undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex ? this.setStringHex(t.hex) : "undefined" != typeof t.date && this.setByDate(t.date)) } , Ce.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime), KJUR.asn1.DERSequence = function(t) { KJUR.asn1.DERSequence.superclass.constructor.call(this, t), this.hT = "30", this.getFreshValueHex = function() { for (var t = "", e = 0; e < this.asn1Array.length; e++) { var i = this.asn1Array[e]; t += i.getEncodedHex() } return this.hV = t, this.hV } } , Ce.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured), KJUR.asn1.DERSet = function(t) { KJUR.asn1.DERSet.superclass.constructor.call(this, t), this.hT = "31", this.getFreshValueHex = function() { for (var t = new Array, e = 0; e < this.asn1Array.length; e++) { var i = this.asn1Array[e]; t.push(i.getEncodedHex()) } return t.sort(), this.hV = t.join(""), this.hV } } , Ce.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured), KJUR.asn1.DERTaggedObject = function(t) { KJUR.asn1.DERTaggedObject.superclass.constructor.call(this), this.hT = "a0", this.hV = "", this.isExplicit = !0, this.asn1Object = null, this.setASN1Object = function(t, e, i) { this.hT = e, this.isExplicit = t, this.asn1Object = i, this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = i.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, e), this.isModified = !1) } , this.getFreshValueHex = function() { return this.hV } , "undefined" != typeof t && ("undefined" != typeof t.tag && (this.hT = t.tag), "undefined" != typeof t.explicit && (this.isExplicit = t.explicit), "undefined" != typeof t.obj && (this.asn1Object = t.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object))) } , Ce.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object), // Copyright (c) 2008-2013 Lapo Luchini // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. function(t) { "use strict"; var e, i = {}; i.decode = function(i) { var r; if (e === t) { var s = "0123456789ABCDEF" , n = " \f\n\r  \u2028\u2029"; for (e = [], r = 0; 16 > r; ++r) e[s.charAt(r)] = r; for (s = s.toLowerCase(), r = 10; 16 > r; ++r) e[s.charAt(r)] = r; for (r = 0; r < n.length; ++r) e[n.charAt(r)] = -1 } var o = [] , h = 0 , a = 0; for (r = 0; r < i.length; ++r) { var u = i.charAt(r); if ("=" == u) break; if (u = e[u], -1 != u) { if (u === t) throw "Illegal character at offset " + r; h |= u, ++a >= 2 ? (o[o.length] = h, h = 0, a = 0) : h <<= 4 } } if (a) throw "Hex encoding incomplete: 4 bits missing"; return o } , window.Hex = i }(), // Copyright (c) 2008-2013 Lapo Luchini // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. function(t) { "use strict"; var e, i = {}; i.decode = function(i) { var r; if (e === t) { var s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" , n = "= \f\n\r  \u2028\u2029"; for (e = [], r = 0; 64 > r; ++r) e[s.charAt(r)] = r; for (r = 0; r < n.length; ++r) e[n.charAt(r)] = -1 } var o = [] , h = 0 , a = 0; for (r = 0; r < i.length; ++r) { var u = i.charAt(r); if ("=" == u) break; if (u = e[u], -1 != u) { if (u === t) throw "Illegal character at offset " + r; h |= u, ++a >= 4 ? (o[o.length] = h >> 16, o[o.length] = h >> 8 & 255, o[o.length] = 255 & h, h = 0, a = 0) : h <<= 6 } } switch (a) { case 1: throw "Base64 encoding incomplete: at least 2 bits missing"; case 2: o[o.length] = h >> 10; break; case 3: o[o.length] = h >> 16, o[o.length] = h >> 8 & 255 } return o } , i.re = /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/, i.unarmor = function(t) { var e = i.re.exec(t); if (e) if (e[1]) t = e[1]; else { if (!e[2]) throw "RegExp out of sync"; t = e[2] } return i.decode(t) } , window.Base64 = i }(), // Copyright (c) 2008-2013 Lapo Luchini // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. function(t) { "use strict"; function e(t, i) { t instanceof e ? (this.enc = t.enc, this.pos = t.pos) : (this.enc = t, this.pos = i) } function i(t, e, i, r, s) { this.stream = t, this.header = e, this.length = i, this.tag = r, this.sub = s } var r = 100 , s = "…" , n = { tag: function(t, e) { var i = document.createElement(t); return i.className = e, i }, text: function(t) { return document.createTextNode(t) } }; e.prototype.get = function(e) { if (e === t && (e = this.pos++), e >= this.enc.length) throw "Requesting byte offset " + e + " on a stream of length " + this.enc.length; return this.enc[e] } , e.prototype.hexDigits = "0123456789ABCDEF", e.prototype.hexByte = function(t) { return this.hexDigits.charAt(t >> 4 & 15) + this.hexDigits.charAt(15 & t) } , e.prototype.hexDump = function(t, e, i) { for (var r = "", s = t; e > s; ++s) if (r += this.hexByte(this.get(s)), i !== !0) switch (15 & s) { case 7: r += " "; break; case 15: r += "\n"; break; default: r += " " } return r } , e.prototype.parseStringISO = function(t, e) { for (var i = "", r = t; e > r; ++r) i += String.fromCharCode(this.get(r)); return i } , e.prototype.parseStringUTF = function(t, e) { for (var i = "", r = t; e > r; ) { var s = this.get(r++); i += 128 > s ? String.fromCharCode(s) : s > 191 && 224 > s ? String.fromCharCode((31 & s) << 6 | 63 & this.get(r++)) : String.fromCharCode((15 & s) << 12 | (63 & this.get(r++)) << 6 | 63 & this.get(r++)) } return i } , e.prototype.parseStringBMP = function(t, e) { for (var i = "", r = t; e > r; r += 2) { var s = this.get(r) , n = this.get(r + 1); i += String.fromCharCode((s << 8) + n) } return i } , e.prototype.reTime = /^((?:1[89]|2\d)?\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, e.prototype.parseTime = function(t, e) { var i = this.parseStringISO(t, e) , r = this.reTime.exec(i); return r ? (i = r[1] + "-" + r[2] + "-" + r[3] + " " + r[4], r[5] && (i += ":" + r[5], r[6] && (i += ":" + r[6], r[7] && (i += "." + r[7]))), r[8] && (i += " UTC", "Z" != r[8] && (i += r[8], r[9] && (i += ":" + r[9]))), i) : "Unrecognized time: " + i } , e.prototype.parseInteger = function(t, e) { var i = e - t; if (i > 4) { i <<= 3; var r = this.get(t); if (0 === r) i -= 8; else for (; 128 > r; ) r <<= 1, --i; return "(" + i + " bit)" } for (var s = 0, n = t; e > n; ++n) s = s << 8 | this.get(n); return s } , e.prototype.parseBitString = function(t, e) { var i = this.get(t) , r = (e - t - 1 << 3) - i , s = "(" + r + " bit)"; if (20 >= r) { var n = i; s += " "; for (var o = e - 1; o > t; --o) { for (var h = this.get(o), a = n; 8 > a; ++a) s += h >> a & 1 ? "1" : "0"; n = 0 } } return s } , e.prototype.parseOctetString = function(t, e) { var i = e - t , n = "(" + i + " byte) "; i > r && (e = t + r); for (var o = t; e > o; ++o) n += this.hexByte(this.get(o)); return i > r && (n += s), n } , e.prototype.parseOID = function(t, e) { for (var i = "", r = 0, s = 0, n = t; e > n; ++n) { var o = this.get(n); if (r = r << 7 | 127 & o, s += 7, !(128 & o)) { if ("" === i) { var h = 80 > r ? 40 > r ? 0 : 1 : 2; i = h + "." + (r - 40 * h) } else i += "." + (s >= 31 ? "bigint" : r); r = s = 0 } } return i } , i.prototype.typeName = function() { if (this.tag === t) return "unknown"; var e = this.tag >> 6 , i = (this.tag >> 5 & 1, 31 & this.tag); switch (e) { case 0: switch (i) { case 0: return "EOC"; case 1: return "BOOLEAN"; case 2: return "INTEGER"; case 3: return "BIT_STRING"; case 4: return "OCTET_STRING"; case 5: return "NULL"; case 6: return "OBJECT_IDENTIFIER"; case 7: return "ObjectDescriptor"; case 8: return "EXTERNAL"; case 9: return "REAL"; case 10: return "ENUMERATED"; case 11: return "EMBEDDED_PDV"; case 12: return "UTF8String"; case 16: return "SEQUENCE"; case 17: return "SET"; case 18: return "NumericString"; case 19: return "PrintableString"; case 20: return "TeletexString"; case 21: return "VideotexString"; case 22: return "IA5String"; case 23: return "UTCTime"; case 24: return "GeneralizedTime"; case 25: return "GraphicString"; case 26: return "VisibleString"; case 27: return "GeneralString"; case 28: return "UniversalString"; case 30: return "BMPString"; default: return "Universal_" + i.toString(16) } case 1: return "Application_" + i.toString(16); case 2: return "[" + i + "]"; case 3: return "Private_" + i.toString(16) } } , i.prototype.reSeemsASCII = /^[ -~]+$/, i.prototype.content = function() { if (this.tag === t) return null; var e = this.tag >> 6 , i = 31 & this.tag , n = this.posContent() , o = Math.abs(this.length); if (0 !== e) { if (null !== this.sub) return "(" + this.sub.length + " elem)"; var h = this.stream.parseStringISO(n, n + Math.min(o, r)); return this.reSeemsASCII.test(h) ? h.substring(0, 2 * r) + (h.length > 2 * r ? s : "") : this.stream.parseOctetString(n, n + o) } switch (i) { case 1: return 0 === this.stream.get(n) ? "false" : "true"; case 2: return this.stream.parseInteger(n, n + o); case 3: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(n, n + o); case 4: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(n, n + o); case 6: return this.stream.parseOID(n, n + o); case 16: case 17: return "(" + this.sub.length + " elem)"; case 12: return this.stream.parseStringUTF(n, n + o); case 18: case 19: case 20: case 21: case 22: case 26: return this.stream.parseStringISO(n, n + o); case 30: return this.stream.parseStringBMP(n, n + o); case 23: case 24: return this.stream.parseTime(n, n + o) } return null } , i.prototype.toString = function() { return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (null === this.sub ? "null" : this.sub.length) + "]" } , i.prototype.print = function(e) { if (e === t && (e = ""), document.writeln(e + this), null !== this.sub) { e += " "; for (var i = 0, r = this.sub.length; r > i; ++i) this.sub[i].print(e) } } , i.prototype.toPrettyString = function(e) { e === t && (e = ""); var i = e + this.typeName() + " @" + this.stream.pos; if (this.length >= 0 && (i += "+"), i += this.length, 32 & this.tag ? i += " (constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (i += " (encapsulates)"), i += "\n", null !== this.sub) { e += " "; for (var r = 0, s = this.sub.length; s > r; ++r) i += this.sub[r].toPrettyString(e) } return i } , i.prototype.toDOM = function() { var t = n.tag("div", "node"); t.asn1 = this; var e = n.tag("div", "head") , i = this.typeName().replace(/_/g, " "); e.innerHTML = i; var r = this.content(); if (null !== r) { r = String(r).replace(/", i += "Length: " + this.header + "+", i += this.length >= 0 ? this.length : -this.length + " (undefined)", 32 & this.tag ? i += "
(constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (i += "
(encapsulates)"), null !== r && (i += "
Value:
" + r + "", "object" == typeof oids && 6 == this.tag)) { var h = oids[r]; h && (h.d && (i += "
" + h.d), h.c && (i += "
" + h.c), h.w && (i += "
(warning!)")) } o.innerHTML = i, t.appendChild(o); var a = n.tag("div", "sub"); if (null !== this.sub) for (var u = 0, c = this.sub.length; c > u; ++u) a.appendChild(this.sub[u].toDOM()); return t.appendChild(a), e.onclick = function() { t.className = "node collapsed" == t.className ? "node" : "node collapsed" } , t } , i.prototype.posStart = function() { return this.stream.pos } , i.prototype.posContent = function() { return this.stream.pos + this.header } , i.prototype.posEnd = function() { return this.stream.pos + this.header + Math.abs(this.length) } , i.prototype.fakeHover = function(t) { this.node.className += " hover", t && (this.head.className += " hover") } , i.prototype.fakeOut = function(t) { var e = / ?hover/; this.node.className = this.node.className.replace(e, ""), t && (this.head.className = this.head.className.replace(e, "")) } , i.prototype.toHexDOM_sub = function(t, e, i, r, s) { if (!(r >= s)) { var o = n.tag("span", e); o.appendChild(n.text(i.hexDump(r, s))), t.appendChild(o) } } , i.prototype.toHexDOM = function(e) { var i = n.tag("span", "hex"); if (e === t && (e = i), this.head.hexNode = i, this.head.onmouseover = function() { this.hexNode.className = "hexCurrent" } , this.head.onmouseout = function() { this.hexNode.className = "hex" } , i.asn1 = this, i.onmouseover = function() { var t = !e.selected; t && (e.selected = this.asn1, this.className = "hexCurrent"), this.asn1.fakeHover(t) } , i.onmouseout = function() { var t = e.selected == this.asn1; this.asn1.fakeOut(t), t && (e.selected = null, this.className = "hex") } , this.toHexDOM_sub(i, "tag", this.stream, this.posStart(), this.posStart() + 1), this.toHexDOM_sub(i, this.length >= 0 ? "dlen" : "ulen", this.stream, this.posStart() + 1, this.posContent()), null === this.sub) i.appendChild(n.text(this.stream.hexDump(this.posContent(), this.posEnd()))); else if (this.sub.length > 0) { var r = this.sub[0] , s = this.sub[this.sub.length - 1]; this.toHexDOM_sub(i, "intro", this.stream, this.posContent(), r.posStart()); for (var o = 0, h = this.sub.length; h > o; ++o) i.appendChild(this.sub[o].toHexDOM(e)); this.toHexDOM_sub(i, "outro", this.stream, s.posEnd(), this.posEnd()) } return i } , i.prototype.toHexString = function(t) { return this.stream.hexDump(this.posStart(), this.posEnd(), !0) } , i.decodeLength = function(t) { var e = t.get() , i = 127 & e; if (i == e) return i; if (i > 3) throw "Length over 24 bits not supported at position " + (t.pos - 1); if (0 === i) return -1; e = 0; for (var r = 0; i > r; ++r) e = e << 8 | t.get(); return e } , i.hasContent = function(t, r, s) { if (32 & t) return !0; if (3 > t || t > 4) return !1; var n = new e(s); 3 == t && n.get(); var o = n.get(); if (o >> 6 & 1) return !1; try { var h = i.decodeLength(n); return n.pos - s.pos + h == r } catch (a) { return !1 } } , i.decode = function(t) { t instanceof e || (t = new e(t,0)); var r = new e(t) , s = t.get() , n = i.decodeLength(t) , o = t.pos - r.pos , h = null; if (i.hasContent(s, n, t)) { var a = t.pos; if (3 == s && t.get(), h = [], n >= 0) { for (var u = a + n; t.pos < u; ) h[h.length] = i.decode(t); if (t.pos != u) throw "Content size is not correct for container starting at offset " + a } else try { for (; ; ) { var c = i.decode(t); if (0 === c.tag) break; h[h.length] = c } n = a - t.pos } catch (f) { throw "Exception while decoding undefined length content: " + f } } else t.pos += n; return new i(r,o,n,s,h) } , i.test = function() { for (var t = [{ value: [39], expected: 39 }, { value: [129, 201], expected: 201 }, { value: [131, 254, 220, 186], expected: 16702650 }], r = 0, s = t.length; s > r; ++r) { var n = new e(t[r].value,0) , o = i.decodeLength(n); o != t[r].expected && document.write("In test[" + r + "] expected " + t[r].expected + " got " + o + "\n") } } , window.ASN1 = i }(), ASN1.prototype.getHexStringValue = function() { var t = this.toHexString() , e = 2 * this.header , i = 2 * this.length; return t.substr(e, i) } , ue.prototype.parseKey = function(t) { try { var e = 0 , i = 0 , r = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/ , s = r.test(t) ? Hex.decode(t) : Base64.unarmor(t) , n = ASN1.decode(s); if (3 === n.sub.length && (n = n.sub[2].sub[0]), 9 === n.sub.length) { e = n.sub[1].getHexStringValue(), this.n = he(e, 16), i = n.sub[2].getHexStringValue(), this.e = parseInt(i, 16); var o = n.sub[3].getHexStringValue(); this.d = he(o, 16); var h = n.sub[4].getHexStringValue(); this.p = he(h, 16); var a = n.sub[5].getHexStringValue(); this.q = he(a, 16); var u = n.sub[6].getHexStringValue(); this.dmp1 = he(u, 16); var c = n.sub[7].getHexStringValue(); this.dmq1 = he(c, 16); var f = n.sub[8].getHexStringValue(); this.coeff = he(f, 16) } else { if (2 !== n.sub.length) return !1; var p = n.sub[1] , l = p.sub[0]; e = l.sub[0].getHexStringValue(), this.n = he(e, 16), i = l.sub[1].getHexStringValue(), this.e = parseInt(i, 16) } return !0 } catch (d) { return !1 } } , ue.prototype.getPrivateBaseKey = function() { var t = { array: [new KJUR.asn1.DERInteger({ "int": 0 }), new KJUR.asn1.DERInteger({ bigint: this.n }), new KJUR.asn1.DERInteger({ "int": this.e }), new KJUR.asn1.DERInteger({ bigint: this.d }), new KJUR.asn1.DERInteger({ bigint: this.p }), new KJUR.asn1.DERInteger({ bigint: this.q }), new KJUR.asn1.DERInteger({ bigint: this.dmp1 }), new KJUR.asn1.DERInteger({ bigint: this.dmq1 }), new KJUR.asn1.DERInteger({ bigint: this.coeff })] } , e = new KJUR.asn1.DERSequence(t); return e.getEncodedHex() } , ue.prototype.getPrivateBaseKeyB64 = function() { return be(this.getPrivateBaseKey()) } , ue.prototype.getPublicBaseKey = function() { var t = { array: [new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }), new KJUR.asn1.DERNull] } , e = new KJUR.asn1.DERSequence(t); t = { array: [new KJUR.asn1.DERInteger({ bigint: this.n }), new KJUR.asn1.DERInteger({ "int": this.e })] }; var i = new KJUR.asn1.DERSequence(t); t = { hex: "00" + i.getEncodedHex() }; var r = new KJUR.asn1.DERBitString(t); t = { array: [e, r] }; var s = new KJUR.asn1.DERSequence(t); return s.getEncodedHex() } , ue.prototype.getPublicBaseKeyB64 = function() { return be(this.getPublicBaseKey()) } , ue.prototype.wordwrap = function(t, e) { if (e = e || 64, !t) return t; var i = "(.{1," + e + "})( +|$\n?)|(.{1," + e + "})"; return t.match(RegExp(i, "g")).join("\n") } , ue.prototype.getPrivateKey = function() { var t = "-----BEGIN RSA PRIVATE KEY-----\n"; return t += this.wordwrap(this.getPrivateBaseKeyB64()) + "\n", t += "-----END RSA PRIVATE KEY-----" } , ue.prototype.getPublicKey = function() { var t = "-----BEGIN PUBLIC KEY-----\n"; return t += this.wordwrap(this.getPublicBaseKeyB64()) + "\n", t += "-----END PUBLIC KEY-----" } , ue.prototype.hasPublicKeyProperty = function(t) { return t = t || {}, t.hasOwnProperty("n") && t.hasOwnProperty("e") } , ue.prototype.hasPrivateKeyProperty = function(t) { return t = t || {}, t.hasOwnProperty("n") && t.hasOwnProperty("e") && t.hasOwnProperty("d") && t.hasOwnProperty("p") && t.hasOwnProperty("q") && t.hasOwnProperty("dmp1") && t.hasOwnProperty("dmq1") && t.hasOwnProperty("coeff") } , ue.prototype.parsePropertiesFrom = function(t) { this.n = t.n, this.e = t.e, t.hasOwnProperty("d") && (this.d = t.d, this.p = t.p, this.q = t.q, this.dmp1 = t.dmp1, this.dmq1 = t.dmq1, this.coeff = t.coeff) } ; var _e = function(t) { ue.call(this), t && ("string" == typeof t ? this.parseKey(t) : (this.hasPrivateKeyProperty(t) || this.hasPublicKeyProperty(t)) && this.parsePropertiesFrom(t)) }; _e.prototype = new ue, _e.prototype.constructor = _e; var ze = function(t) { t = t || {}, this.default_key_size = parseInt(t.default_key_size) || 1024, this.default_public_exponent = t.default_public_exponent || "010001", this.log = t.log || !1, this.key = null }; ze.prototype.setKey = function(t) { this.log && this.key && console.warn("A key was already set, overriding existing."), this.key = new _e(t) } , ze.prototype.setPrivateKey = function(t) { this.setKey(t) } , ze.prototype.setPublicKey = function(t) { this.setKey(t) } , ze.prototype.decrypt = function(t) { try { return this.getKey().decrypt(Te(t)) } catch (e) { return !1 } } , ze.prototype.encrypt = function(t) { try { return be(this.getKey().encrypt(t)) } catch (e) { return !1 } } , ze.prototype.getKey = function(t) { if (!this.key) { if (this.key = new _e, t && "[object Function]" === {}.toString.call(t)) return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, t); this.key.generate(this.default_key_size, this.default_public_exponent) } return this.key } , ze.prototype.getPrivateKey = function() { return this.getKey().getPrivateKey() } , ze.prototype.getPrivateKeyB64 = function() { return this.getKey().getPrivateBaseKeyB64() } , ze.prototype.getPublicKey = function() { return this.getKey().getPublicKey() } , ze.prototype.getPublicKeyB64 = function() { return this.getKey().getPublicBaseKeyB64() } , ze.version = "2.3.1", t.JSEncrypt = ze }); function make(pwd) { var encrypt = new JSEncrypt(); encrypt.setPublicKey(pubKey); var enc = encrypt.encrypt(pwd); return enc; } ================================================ FILE: 其他实战/【百度】wap端sig生成/make_sig.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2020-01-13 Python: 3.7 """ wap端 sig 参数生成 应水友需求,帮忙弄的 需要 V8 引擎! """ import execjs import os print(execjs.get().name) with open(os.path.dirname(__file__) + '/v3_update.js') as f: js = execjs.compile(f.read()) # dv 可固定, 用了一些随机参数生成的。 dv = 'tk0.48553508531670751578885709447.0@mmy0VdnCHg9mlXM-7ZM-tbvB8YHXK3MIEg9WNa8V3x9Cqa5kqgOXcFOjca5BJWOB7eNIzY5k9j8VNKUk0~9F~~5rOiHXvivmzzHjJFMXubOG~W8VRln6~l9k0g9mlXM-7ZM-tbvB8YHXK3MIEg9WH~9V7x9Cql5kqgOXcFOjca5BJWOB7eNIzY5k9-9CRWUq__dy0ov8Cpy5k9j8S~W8Cpz9SlXM-7ZM-tbH-JSMIYaUktanm~F9VEg9WEj8VRgOXcFOjca5BJWOB7eNIzYUk0~9kHg9C9~5kEF8WqW9mlx-vvLwvB87Tr4hByj9G~F5kHyGynvrg~5Vty8CEW8Cqy8C9l8VH~8WEl8CHynkRz8WqK8kt-5Vq_jy~56JeOrJXLIKYOq__Hyr9m~~5k0K9k9g9WHj5k0K9Vqg9Cqy9m~lnCp~5k0K9Vqg9Cqa9q__' username = '这是测试' # 用户名 s_code = 'ilvw' # 验证码 verifystring = 'jxOb3456654e9d67a5c02ab155fe9012fb44e5b90ae9b01ca02' # 首页返回的 result = js.call('v3test', dv, s_code, verifystring) print(result) ================================================ FILE: 其他实战/【百度】wap端sig生成/v3_update.js ================================================ window={}; xxoo={}; var _0xe7d2 = ["words", "sigBytes", "length", "stringify", "ceil", "slice", "random", "enc", "Hex", "join", "substr", "push", "fromCharCode", "charCodeAt", "Utf8", "Malformed UTF-8 data", "parse", "BufferedBlockAlgorithm", "_data", "_nDataBytes", "concat", "blockSize", "max", "_minBufferSize", "min", "_doProcessBlock", "splice", "clone", "Hasher", "cfg", "reset", "_append", "_doFinalize", "finalize", "HMAC", "algo", "Cipher", "WordArray", "EvpKDF", "_ENC_XFORM_MODE", "_DEC_XFORM_MODE", "_xformMode", "_key", "_doReset", "_process", "encrypt", "decrypt", "flush", "mode", "BlockCipherMode", "Encryptor", "Decryptor", "_cipher", "_iv", "CBC", "encryptBlock", "_prevBlock", "pad", "Pkcs7", "BlockCipher", "createEncryptor", "createDecryptor", "_mode", "__creator", "unpad", "CipherParams", "formatter", "format", "ciphertext", "_parse", "kdf", "OpenSSL", "PasswordBasedCipher", "ivSize", "key", "execute", "keySize", "salt", "MD5", "hasher", "update", "compute", "Base64", "_map", "clamp", "_reverseMap", "charAt", "indexOf", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", "abs", "sin", "_hash", "floor", "HmacMD5", "_createHmacHelper", "Word", "high", "low", "SHA1", "_createHelper", "HmacSHA1", "_iKey", "_hasher", "_oKey", "0123456789abcdef", "sqrt", "SHA256", "HmacSHA256", "x64", "toX32", "SHA512", "HmacSHA512", "moonshad5moonsh2", "moonshad3moonsh0", "moonshad8moonsh6", "moonshad0moonsh1", "moonshad1moonsh9", "OOOO0O", "O0000O", "O00O0O", "OO0OOO", "screen", "width", "height", "alg", "version", "round", "getTime", "sig", "traceid", "callback", "elapsed", "shaOne", "encryption", "sort", "split", "substring", "ECB", "byteOffset", "byteLength", "Utf16BE", "Utf16LE", "Utf16", "SHA224", "SHA384", "HmacSHA384", "SHA3", "_state", "outputLength", "HmacSHA3", "RIPEMD160", "HmacRIPEMD160", "iterations", "PBKDF2", "CFB", "CTR", "_counter", "OFB", "_keystream", "decryptBlock", "AnsiX923", "Ansix923", "Iso10126", "Iso97971", "ZeroPadding", "NoPadding", "AES", "_nRounds", "_keyPriorReset", "_keySchedule", "_invKeySchedule", "_doCryptBlock", "DES", "_subKeys", "_invSubKeys", "_lBlock", "_rBlock", "TripleDES", "_des2", "_des3", "_des1", "StreamCipher", "RC4", "drop", "RC4Drop", "Rabbit", "RabbitLegacy", "location", "protocol", "//nsclick.baidu.com/v.gif?", "pid=111&type=1023&v=", "&data_source=fe", "&extrajson=", "&monitorType=moonshadErrors", "{eventType:na-moonshad-error}", "&auto_en=na-monitor", "onload", "onerror", "src", "exports", "defineProperty", "undefined", "toStringTag", "Module", "__esModule", "object", "create", "default", "string", "bind", "prototype", "hasOwnProperty", "call", "lib", "Base", "mixIn", "init", "$super", "apply", "toString", "extend"]; !function(c) { !function(x) { for (; --x; ) c.push(c.shift()) }(421) }(_0xe7d2); var _0x19c3 = function(x, c) { return _0xe7d2[x -= 0] }; !function(x, c) { for (var _ in c) x[_] = c[_] }(window, function(_) { var t = {}; function r(x) { if (t[x]) return t[x][_0x19c3("0x0")]; var c = t[x] = { i: x, l: !1, exports: {} }; return _[x].call(c[_0x19c3("0x0")], c, c[_0x19c3("0x0")], r), c.l = !0, c[_0x19c3("0x0")] } return r.m = _, r.c = t, r.d = function(x, c, _) { r.o(x, c) || Object[_0x19c3("0x1")](x, c, { enumerable: !0, get: _ }) } , r.r = function(x) { typeof Symbol !== _0x19c3("0x2") && Symbol[_0x19c3("0x3")] && Object[_0x19c3("0x1")](x, Symbol.toStringTag, { value: _0x19c3("0x4") }), Object[_0x19c3("0x1")](x, _0x19c3("0x5"), { value: !0 }) } , r.t = function(c, x) { if (1 & x && (c = r(c)), 8 & x) return c; if (4 & x && typeof c === _0x19c3("0x6") && c && c[_0x19c3("0x5")]) return c; var _ = Object[_0x19c3("0x7")](null); if (r.r(_), Object.defineProperty(_, _0x19c3("0x8"), { enumerable: !0, value: c }), 2 & x && typeof c != _0x19c3("0x9")) for (var t in c) r.d(_, t, function(x) { return c[x] } [_0x19c3("0xa")](null, t)); return _ } , r.n = function(x) { var c = x && x[_0x19c3("0x5")] ? function() { return x[_0x19c3("0x8")] } : function() { return x } ; return r.d(c, "a", c), c } , r.o = function(x, c) { return Object[_0x19c3("0xb")][_0x19c3("0xc")][_0x19c3("0xd")](x, c) } , r.p = "", r(r.s = 12) }([function(x, c, _) { var t; x.exports = (t = t || function(f) { var _ = Object[_0x19c3("0x7")] || function() { function _() {} return function(x) { var c; return _[_0x19c3("0xb")] = x, c = new _, _[_0x19c3("0xb")] = null, c } }() , x = {} , c = x[_0x19c3("0xe")] = {} , t = c[_0x19c3("0xf")] = { extend: function(x) { var c = _(this); return x && c[_0x19c3("0x10")](x), c[_0x19c3("0xc")]("init") && this.init !== c[_0x19c3("0x11")] || (c[_0x19c3("0x11")] = function() { c[_0x19c3("0x12")].init[_0x19c3("0x13")](this, arguments) } ), (c.init[_0x19c3("0xb")] = c)[_0x19c3("0x12")] = this, c }, create: function() { var x = this.extend(); return x[_0x19c3("0x11")].apply(x, arguments), x }, init: function() {}, mixIn: function(x) { for (var c in x) x.hasOwnProperty(c) && (this[c] = x[c]); x[_0x19c3("0xc")](_0x19c3("0x14")) && (this[_0x19c3("0x14")] = x.toString) }, clone: function() { return this[_0x19c3("0x11")][_0x19c3("0xb")][_0x19c3("0x15")](this) } } , u = c.WordArray = t[_0x19c3("0x15")]({ init: function(x, c) { x = this[_0x19c3("0x16")] = x || [], null != c ? this[_0x19c3("0x17")] = c : this.sigBytes = 4 * x[_0x19c3("0x18")] }, toString: function(x) { return (x || n)[_0x19c3("0x19")](this) }, concat: function(x) { var c = this[_0x19c3("0x16")] , _ = x[_0x19c3("0x16")] , t = this.sigBytes , r = x[_0x19c3("0x17")]; if (this.clamp(), t % 4) for (var n = 0; n < r; n++) { var i = _[n >>> 2] >>> 24 - n % 4 * 8 & 255; c[t + n >>> 2] |= i << 24 - (t + n) % 4 * 8 } else for (var n = 0; n < r; n += 4) c[t + n >>> 2] = _[n >>> 2]; return this[_0x19c3("0x17")] += r, this }, clamp: function() { var x = this[_0x19c3("0x16")] , c = this[_0x19c3("0x17")]; x[c >>> 2] &= 4294967295 << 32 - c % 4 * 8, x[_0x19c3("0x18")] = f[_0x19c3("0x1a")](c / 4) }, clone: function() { var x = t.clone[_0x19c3("0xd")](this); return x[_0x19c3("0x16")] = this[_0x19c3("0x16")][_0x19c3("0x1b")](0), x }, random: function(x) { for (var c, _ = [], t = function(c) { var c = c , _ = 987654321 , t = 4294967295; return function() { var x = ((_ = 36969 * (65535 & _) + (_ >> 16) & t) << 16) + (c = 18e3 * (65535 & c) + (c >> 16) & t) & t; return x /= 4294967296, (x += .5) * (.5 < f[_0x19c3("0x1c")]() ? 1 : -1) } }, r = 0; r < x; r += 4) { var n = t(4294967296 * (c || f[_0x19c3("0x1c")]())); c = 987654071 * n(), _.push(4294967296 * n() | 0) } return new (u[_0x19c3("0x11")])(_,x) } }) , r = x[_0x19c3("0x1d")] = {} , n = r[_0x19c3("0x1e")] = { stringify: function(x) { for (var c = x[_0x19c3("0x16")], _ = x[_0x19c3("0x17")], t = [], r = 0; r < _; r++) { var n = c[r >>> 2] >>> 24 - r % 4 * 8 & 255; t.push((n >>> 4).toString(16)), t.push((15 & n)[_0x19c3("0x14")](16)) } return t[_0x19c3("0x1f")]("") }, parse: function(x) { for (var c = x[_0x19c3("0x18")], _ = [], t = 0; t < c; t += 2) _[t >>> 3] |= parseInt(x[_0x19c3("0x20")](t, 2), 16) << 24 - t % 8 * 4; return new (u[_0x19c3("0x11")])(_,c / 2) } } , i = r.Latin1 = { stringify: function(x) { for (var c = x[_0x19c3("0x16")], _ = x[_0x19c3("0x17")], t = [], r = 0; r < _; r++) { var n = c[r >>> 2] >>> 24 - r % 4 * 8 & 255; t[_0x19c3("0x21")](String[_0x19c3("0x22")](n)) } return t.join("") }, parse: function(x) { for (var c = x[_0x19c3("0x18")], _ = [], t = 0; t < c; t++) _[t >>> 2] |= (255 & x[_0x19c3("0x23")](t)) << 24 - t % 4 * 8; return new (u[_0x19c3("0x11")])(_,c) } } , e = r[_0x19c3("0x24")] = { stringify: function(x) { try { return decodeURIComponent(escape(i[_0x19c3("0x19")](x))) } catch (c) { throw new Error(_0x19c3("0x25")) } }, parse: function(x) { return i[_0x19c3("0x26")](unescape(encodeURIComponent(x))) } } , o = c[_0x19c3("0x27")] = t[_0x19c3("0x15")]({ reset: function() { this[_0x19c3("0x28")] = new u.init, this[_0x19c3("0x29")] = 0 }, _append: function(x) { typeof x == _0x19c3("0x9") && (x = e[_0x19c3("0x26")](x)), this._data[_0x19c3("0x2a")](x), this._nDataBytes += x[_0x19c3("0x17")] }, _process: function(x) { var c = this[_0x19c3("0x28")] , _ = c[_0x19c3("0x16")] , t = c[_0x19c3("0x17")] , r = this[_0x19c3("0x2b")] , n = 4 * r , i = t / n , e = (i = x ? f[_0x19c3("0x1a")](i) : f[_0x19c3("0x2c")]((0 | i) - this[_0x19c3("0x2d")], 0)) * r , o = f[_0x19c3("0x2e")](4 * e, t); if (e) { for (var a = 0; a < e; a += r) this[_0x19c3("0x2f")](_, a); var s = _[_0x19c3("0x30")](0, e); c[_0x19c3("0x17")] -= o } return new (u[_0x19c3("0x11")])(s,o) }, clone: function() { var x = t[_0x19c3("0x31")][_0x19c3("0xd")](this); return x[_0x19c3("0x28")] = this._data[_0x19c3("0x31")](), x }, _minBufferSize: 0 }) , a = (c[_0x19c3("0x32")] = o[_0x19c3("0x15")]({ cfg: t[_0x19c3("0x15")](), init: function(x) { this[_0x19c3("0x33")] = this[_0x19c3("0x33")][_0x19c3("0x15")](x), this[_0x19c3("0x34")]() }, reset: function() { o[_0x19c3("0x34")].call(this), this._doReset() }, update: function(x) { return this[_0x19c3("0x35")](x), this._process(), this }, finalize: function(x) { x && this[_0x19c3("0x35")](x); var c = this[_0x19c3("0x36")](); return c }, blockSize: 16, _createHelper: function(_) { return function(x, c) { return new (_[_0x19c3("0x11")])(c)[_0x19c3("0x37")](x) } }, _createHmacHelper: function(_) { return function(x, c) { return new (a[_0x19c3("0x38")][_0x19c3("0x11")])(_,c)[_0x19c3("0x37")](x) } } }), x[_0x19c3("0x39")] = {}); return x }(Math), t) } , function(x, c, _) { var m; x[_0x19c3("0x0")] = (m = _(0), _(2), void (m[_0x19c3("0xe")][_0x19c3("0x3a")] || function() { var x = m , c = x[_0x19c3("0xe")] , _ = c[_0x19c3("0xf")] , o = c[_0x19c3("0x3b")] , t = c[_0x19c3("0x27")] , r = x.enc , n = (r.Utf8, r.Base64) , i = x[_0x19c3("0x39")] , e = i[_0x19c3("0x3c")] , a = c[_0x19c3("0x3a")] = t.extend({ cfg: _[_0x19c3("0x15")](), createEncryptor: function(x, c) { return this[_0x19c3("0x7")](this[_0x19c3("0x3d")], x, c) }, createDecryptor: function(x, c) { return this[_0x19c3("0x7")](this[_0x19c3("0x3e")], x, c) }, init: function(x, c, _) { this.cfg = this[_0x19c3("0x33")][_0x19c3("0x15")](_), this[_0x19c3("0x3f")] = x, this[_0x19c3("0x40")] = c, this[_0x19c3("0x34")]() }, reset: function() { t[_0x19c3("0x34")][_0x19c3("0xd")](this), this[_0x19c3("0x41")]() }, process: function(x) { return this[_0x19c3("0x35")](x), this[_0x19c3("0x42")]() }, finalize: function(x) { x && this._append(x); var c = this[_0x19c3("0x36")](); return c }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function() { function r(x) { return typeof x == _0x19c3("0x9") ? w : b } return function(t) { return { encrypt: function(x, c, _) { return r(c)[_0x19c3("0x43")](t, x, c, _) }, decrypt: function(x, c, _) { return r(c)[_0x19c3("0x44")](t, x, c, _) } } } }() }) , s = (c.StreamCipher = a.extend({ _doFinalize: function() { var x = this[_0x19c3("0x42")](!!_0x19c3("0x45")); return x }, blockSize: 1 }), x[_0x19c3("0x46")] = {}) , f = c[_0x19c3("0x47")] = _[_0x19c3("0x15")]({ createEncryptor: function(x, c) { return this[_0x19c3("0x48")][_0x19c3("0x7")](x, c) }, createDecryptor: function(x, c) { return this[_0x19c3("0x49")][_0x19c3("0x7")](x, c) }, init: function(x, c) { this[_0x19c3("0x4a")] = x, this[_0x19c3("0x4b")] = c } }) , u = s[_0x19c3("0x4c")] = function() { var x = f[_0x19c3("0x15")](); function n(x, c, _) { var t = this[_0x19c3("0x4b")]; if (t) { var r = t; this[_0x19c3("0x4b")] = void 0 } else var r = this[_0x19c3("0x4e")]; for (var n = 0; n < _; n++) x[c + n] ^= r[n] } return x.Encryptor = x[_0x19c3("0x15")]({ processBlock: function(x, c) { var _ = this._cipher , t = _[_0x19c3("0x2b")]; n[_0x19c3("0xd")](this, x, c, t), _[_0x19c3("0x4d")](x, c), this._prevBlock = x[_0x19c3("0x1b")](c, c + t) } }), x[_0x19c3("0x49")] = x.extend({ processBlock: function(x, c) { var _ = this[_0x19c3("0x4a")] , t = _.blockSize , r = x.slice(c, c + t); _.decryptBlock(x, c), n[_0x19c3("0xd")](this, x, c, t), this[_0x19c3("0x4e")] = r } }), x }() , h = x[_0x19c3("0x4f")] = {} , v = h[_0x19c3("0x50")] = { pad: function(x, c) { for (var _ = 4 * c, t = _ - x[_0x19c3("0x17")] % _, r = t << 24 | t << 16 | t << 8 | t, n = [], i = 0; i < t; i += 4) n.push(r); var e = o[_0x19c3("0x7")](n, t); x[_0x19c3("0x2a")](e) }, unpad: function(x) { var c = 255 & x.words[x[_0x19c3("0x17")] - 1 >>> 2]; x[_0x19c3("0x17")] -= c } } , d = (c[_0x19c3("0x51")] = a[_0x19c3("0x15")]({ cfg: a[_0x19c3("0x33")][_0x19c3("0x15")]({ mode: u, padding: v }), reset: function() { a.reset[_0x19c3("0xd")](this); var x = this[_0x19c3("0x33")] , c = x.iv , _ = x[_0x19c3("0x46")]; if (this[_0x19c3("0x3f")] == this[_0x19c3("0x3d")]) var t = _[_0x19c3("0x52")]; else { var t = _[_0x19c3("0x53")]; this._minBufferSize = 1 } this[_0x19c3("0x54")] && this[_0x19c3("0x54")][_0x19c3("0x55")] == t ? this._mode[_0x19c3("0x11")](this, c && c.words) : (this[_0x19c3("0x54")] = t[_0x19c3("0xd")](_, this, c && c.words), this._mode[_0x19c3("0x55")] = t) }, _doProcessBlock: function(x, c) { this[_0x19c3("0x54")].processBlock(x, c) }, _doFinalize: function() { var x = this[_0x19c3("0x33")].padding; if (this._xformMode == this._ENC_XFORM_MODE) { x.pad(this[_0x19c3("0x28")], this[_0x19c3("0x2b")]); var c = this._process(!!_0x19c3("0x45")) } else { var c = this._process(!0); x[_0x19c3("0x56")](c) } return c }, blockSize: 4 }), c[_0x19c3("0x57")] = _[_0x19c3("0x15")]({ init: function(x) { this[_0x19c3("0x10")](x) }, toString: function(x) { return (x || this[_0x19c3("0x58")])[_0x19c3("0x19")](this) } })) , l = x[_0x19c3("0x59")] = {} , p = l.OpenSSL = { stringify: function(x) { var c = x[_0x19c3("0x5a")] , _ = x.salt; if (_) var t = o[_0x19c3("0x7")]([1398893684, 1701076831])[_0x19c3("0x2a")](_)[_0x19c3("0x2a")](c); else var t = c; return t[_0x19c3("0x14")](n) }, parse: function(x) { var c = n[_0x19c3("0x26")](x) , _ = c.words; if (1398893684 == _[0] && 1701076831 == _[1]) { var t = o[_0x19c3("0x7")](_[_0x19c3("0x1b")](2, 4)); _[_0x19c3("0x30")](0, 4), c[_0x19c3("0x17")] -= 16 } return d[_0x19c3("0x7")]({ ciphertext: c, salt: t }) } } , b = c.SerializableCipher = _.extend({ cfg: _[_0x19c3("0x15")]({ format: p }), encrypt: function(x, c, _, t) { t = this[_0x19c3("0x33")][_0x19c3("0x15")](t); var r = x[_0x19c3("0x52")](_, t) , n = r[_0x19c3("0x37")](c) , i = r[_0x19c3("0x33")]; return d[_0x19c3("0x7")]({ ciphertext: n, key: _, iv: i.iv, algorithm: x, mode: i[_0x19c3("0x46")], padding: i.padding, blockSize: x[_0x19c3("0x2b")], formatter: t.format }) }, decrypt: function(x, c, _, t) { t = this[_0x19c3("0x33")][_0x19c3("0x15")](t), c = this[_0x19c3("0x5b")](c, t[_0x19c3("0x59")]); var r = x[_0x19c3("0x53")](_, t).finalize(c[_0x19c3("0x5a")]); return r }, _parse: function(x, c) { return typeof x == _0x19c3("0x9") ? c[_0x19c3("0x26")](x, this) : x } }) , y = x[_0x19c3("0x5c")] = {} , g = y[_0x19c3("0x5d")] = { execute: function(x, c, _, t) { t = t || o.random(8); var r = e[_0x19c3("0x7")]({ keySize: c + _ }).compute(x, t) , n = o[_0x19c3("0x7")](r[_0x19c3("0x16")].slice(c), 4 * _); return r[_0x19c3("0x17")] = 4 * c, d[_0x19c3("0x7")]({ key: r, iv: n, salt: t }) } } , w = c[_0x19c3("0x5e")] = b[_0x19c3("0x15")]({ cfg: b.cfg.extend({ kdf: g }), encrypt: function(x, c, _, t) { var r = (t = this[_0x19c3("0x33")].extend(t)).kdf.execute(_, x.keySize, x[_0x19c3("0x5f")]); t.iv = r.iv; var n = b.encrypt[_0x19c3("0xd")](this, x, c, r[_0x19c3("0x60")], t); return n[_0x19c3("0x10")](r), n }, decrypt: function(x, c, _, t) { t = this[_0x19c3("0x33")][_0x19c3("0x15")](t), c = this[_0x19c3("0x5b")](c, t.format); var r = t[_0x19c3("0x5c")][_0x19c3("0x61")](_, x[_0x19c3("0x62")], x[_0x19c3("0x5f")], c[_0x19c3("0x63")]); t.iv = r.iv; var n = b[_0x19c3("0x44")][_0x19c3("0xd")](this, x, c, r[_0x19c3("0x60")], t); return n } }) }())) } , function(x, c, _) { var i; x[_0x19c3("0x0")] = (i = _(0), _(6), _(7), function() { var x = i , c = x[_0x19c3("0xe")] , _ = c.Base , s = c.WordArray , t = x[_0x19c3("0x39")] , r = t[_0x19c3("0x64")] , n = t.EvpKDF = _[_0x19c3("0x15")]({ cfg: _[_0x19c3("0x15")]({ keySize: 4, hasher: r, iterations: 1 }), init: function(x) { this.cfg = this[_0x19c3("0x33")][_0x19c3("0x15")](x) }, compute: function(x, c) { for (var _ = this[_0x19c3("0x33")], t = _[_0x19c3("0x65")][_0x19c3("0x7")](), r = s.create(), n = r.words, i = _[_0x19c3("0x62")], e = _.iterations; n[_0x19c3("0x18")] < i; ) { o && t[_0x19c3("0x66")](o); var o = t[_0x19c3("0x66")](x)[_0x19c3("0x37")](c); t.reset(); for (var a = 1; a < e; a++) o = t[_0x19c3("0x37")](o), t[_0x19c3("0x34")](); r[_0x19c3("0x2a")](o) } return r[_0x19c3("0x17")] = 4 * i, r } }); x[_0x19c3("0x3c")] = function(x, c, _) { return n.create(_)[_0x19c3("0x67")](x, c) } }(), i[_0x19c3("0x3c")]) } , function(x, c, _) { var t; x.exports = (t = _(0), function() { var x = t , a = x.lib[_0x19c3("0x3b")]; x[_0x19c3("0x1d")][_0x19c3("0x68")] = { stringify: function(x) { var c = x[_0x19c3("0x16")] , _ = x[_0x19c3("0x17")] , t = this[_0x19c3("0x69")]; x[_0x19c3("0x6a")](); for (var r = [], n = 0; n < _; n += 3) for (var i = (c[n >>> 2] >>> 24 - n % 4 * 8 & 255) << 16 | (c[n + 1 >>> 2] >>> 24 - (n + 1) % 4 * 8 & 255) << 8 | c[n + 2 >>> 2] >>> 24 - (n + 2) % 4 * 8 & 255, e = 0; e < 4 && n + .75 * e < _; e++) r[_0x19c3("0x21")](t.charAt(i >>> 6 * (3 - e) & 63)); var o = t.charAt(64); if (o) for (; r[_0x19c3("0x18")] % 4; ) r[_0x19c3("0x21")](o); return r.join("") }, parse: function(x) { var c = x[_0x19c3("0x18")] , _ = this[_0x19c3("0x69")] , t = this._reverseMap; if (!t) { t = this[_0x19c3("0x6b")] = []; for (var r = 0; r < _[_0x19c3("0x18")]; r++) t[_[_0x19c3("0x23")](r)] = r } var n = _[_0x19c3("0x6c")](64); if (n) { var i = x[_0x19c3("0x6d")](n); -1 !== i && (c = i) } return function o(x, c, _) { for (var t = [], r = 0, n = 0; n < c; n++) if (n % 4) { var i = _[x[_0x19c3("0x23")](n - 1)] << n % 4 * 2 , e = _[x[_0x19c3("0x23")](n)] >>> 6 - n % 4 * 2; t[r >>> 2] |= (i | e) << 24 - r % 4 * 8, r++ } return a[_0x19c3("0x7")](t, r) }(x, c, t) }, _map: _0x19c3("0x6e") } }(), t[_0x19c3("0x1d")][_0x19c3("0x68")]) } , function(x, c, _) { var i; x[_0x19c3("0x0")] = (i = _(0), function(s) { var x = i , c = x[_0x19c3("0xe")] , _ = c[_0x19c3("0x3b")] , t = c[_0x19c3("0x32")] , r = x[_0x19c3("0x39")] , B = []; !function() { for (var x = 0; x < 64; x++) B[x] = 4294967296 * s[_0x19c3("0x6f")](s[_0x19c3("0x70")](x + 1)) | 0 }(); var n = r[_0x19c3("0x64")] = t.extend({ _doReset: function() { this._hash = new (_[_0x19c3("0x11")])([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function(x, c) { for (var _ = 0; _ < 16; _++) { var t = c + _ , r = x[t]; x[t] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8) } var n = this[_0x19c3("0x71")][_0x19c3("0x16")] , i = x[c + 0] , e = x[c + 1] , o = x[c + 2] , a = x[c + 3] , s = x[c + 4] , f = x[c + 5] , u = x[c + 6] , h = x[c + 7] , v = x[c + 8] , d = x[c + 9] , l = x[c + 10] , p = x[c + 11] , b = x[c + 12] , y = x[c + 13] , g = x[c + 14] , w = x[c + 15] , m = n[0] , k = n[1] , S = n[2] , O = n[3]; k = C(k = C(k = C(k = C(k = H(k = H(k = H(k = H(k = z(k = z(k = z(k = z(k = A(k = A(k = A(k = A(k, S = A(S, O = A(O, m = A(m, k, S, O, i, 7, B[0]), k, S, e, 12, B[1]), m, k, o, 17, B[2]), O, m, a, 22, B[3]), S = A(S, O = A(O, m = A(m, k, S, O, s, 7, B[4]), k, S, f, 12, B[5]), m, k, u, 17, B[6]), O, m, h, 22, B[7]), S = A(S, O = A(O, m = A(m, k, S, O, v, 7, B[8]), k, S, d, 12, B[9]), m, k, l, 17, B[10]), O, m, p, 22, B[11]), S = A(S, O = A(O, m = A(m, k, S, O, b, 7, B[12]), k, S, y, 12, B[13]), m, k, g, 17, B[14]), O, m, w, 22, B[15]), S = z(S, O = z(O, m = z(m, k, S, O, e, 5, B[16]), k, S, u, 9, B[17]), m, k, p, 14, B[18]), O, m, i, 20, B[19]), S = z(S, O = z(O, m = z(m, k, S, O, f, 5, B[20]), k, S, l, 9, B[21]), m, k, w, 14, B[22]), O, m, s, 20, B[23]), S = z(S, O = z(O, m = z(m, k, S, O, d, 5, B[24]), k, S, g, 9, B[25]), m, k, a, 14, B[26]), O, m, v, 20, B[27]), S = z(S, O = z(O, m = z(m, k, S, O, y, 5, B[28]), k, S, o, 9, B[29]), m, k, h, 14, B[30]), O, m, b, 20, B[31]), S = H(S, O = H(O, m = H(m, k, S, O, f, 4, B[32]), k, S, v, 11, B[33]), m, k, p, 16, B[34]), O, m, g, 23, B[35]), S = H(S, O = H(O, m = H(m, k, S, O, e, 4, B[36]), k, S, s, 11, B[37]), m, k, h, 16, B[38]), O, m, l, 23, B[39]), S = H(S, O = H(O, m = H(m, k, S, O, y, 4, B[40]), k, S, i, 11, B[41]), m, k, a, 16, B[42]), O, m, u, 23, B[43]), S = H(S, O = H(O, m = H(m, k, S, O, d, 4, B[44]), k, S, b, 11, B[45]), m, k, w, 16, B[46]), O, m, o, 23, B[47]), S = C(S, O = C(O, m = C(m, k, S, O, i, 6, B[48]), k, S, h, 10, B[49]), m, k, g, 15, B[50]), O, m, f, 21, B[51]), S = C(S, O = C(O, m = C(m, k, S, O, b, 6, B[52]), k, S, a, 10, B[53]), m, k, l, 15, B[54]), O, m, e, 21, B[55]), S = C(S, O = C(O, m = C(m, k, S, O, v, 6, B[56]), k, S, w, 10, B[57]), m, k, u, 15, B[58]), O, m, y, 21, B[59]), S = C(S, O = C(O, m = C(m, k, S, O, s, 6, B[60]), k, S, p, 10, B[61]), m, k, o, 15, B[62]), O, m, d, 21, B[63]), n[0] = n[0] + m | 0, n[1] = n[1] + k | 0, n[2] = n[2] + S | 0, n[3] = n[3] + O | 0 }, _doFinalize: function() { var x = this._data , c = x.words , _ = 8 * this[_0x19c3("0x29")] , t = 8 * x[_0x19c3("0x17")]; c[t >>> 5] |= 128 << 24 - t % 32; var r = s[_0x19c3("0x72")](_ / 4294967296) , n = _; c[15 + (64 + t >>> 9 << 4)] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8), c[14 + (64 + t >>> 9 << 4)] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8), x[_0x19c3("0x17")] = 4 * (c.length + 1), this[_0x19c3("0x42")](); for (var i = this[_0x19c3("0x71")], e = i[_0x19c3("0x16")], o = 0; o < 4; o++) { var a = e[o]; e[o] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8) } return i }, clone: function() { var x = t[_0x19c3("0x31")].call(this); return x._hash = this._hash[_0x19c3("0x31")](), x } }); function A(x, c, _, t, r, n, i) { var e = x + (c & _ | ~c & t) + r + i; return (e << n | e >>> 32 - n) + c } function z(x, c, _, t, r, n, i) { var e = x + (c & t | _ & ~t) + r + i; return (e << n | e >>> 32 - n) + c } function H(x, c, _, t, r, n, i) { var e = x + (c ^ _ ^ t) + r + i; return (e << n | e >>> 32 - n) + c } function C(x, c, _, t, r, n, i) { var e = x + (_ ^ (c | ~t)) + r + i; return (e << n | e >>> 32 - n) + c } x[_0x19c3("0x64")] = t._createHelper(n), x[_0x19c3("0x73")] = t[_0x19c3("0x74")](n) }(Math), i[_0x19c3("0x64")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), function() { var x = t , c = x[_0x19c3("0xe")] , r = c[_0x19c3("0xf")] , n = c[_0x19c3("0x3b")] , _ = x.x64 = {}; _[_0x19c3("0x75")] = r[_0x19c3("0x15")]({ init: function(x, c) { this[_0x19c3("0x76")] = x, this[_0x19c3("0x77")] = c } }), _[_0x19c3("0x3b")] = r[_0x19c3("0x15")]({ init: function(x, c) { x = this[_0x19c3("0x16")] = x || [], null != c ? this.sigBytes = c : this[_0x19c3("0x17")] = 8 * x[_0x19c3("0x18")] }, toX32: function() { for (var x = this[_0x19c3("0x16")], c = x[_0x19c3("0x18")], _ = [], t = 0; t < c; t++) { var r = x[t]; _[_0x19c3("0x21")](r[_0x19c3("0x76")]), _[_0x19c3("0x21")](r[_0x19c3("0x77")]) } return n[_0x19c3("0x7")](_, this.sigBytes) }, clone: function() { for (var x = r.clone[_0x19c3("0xd")](this), c = x[_0x19c3("0x16")] = this[_0x19c3("0x16")][_0x19c3("0x1b")](0), _ = c[_0x19c3("0x18")], t = 0; t < _; t++) c[t] = c[t][_0x19c3("0x31")](); return x } }) }(), t) } , function(x, c, _) { var i; x[_0x19c3("0x0")] = (i = _(0), function() { var x = i , c = x[_0x19c3("0xe")] , _ = c[_0x19c3("0x3b")] , t = c[_0x19c3("0x32")] , r = x[_0x19c3("0x39")] , f = [] , n = r[_0x19c3("0x78")] = t[_0x19c3("0x15")]({ _doReset: function() { this[_0x19c3("0x71")] = new (_[_0x19c3("0x11")])([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function(x, c) { for (var _ = this[_0x19c3("0x71")].words, t = _[0], r = _[1], n = _[2], i = _[3], e = _[4], o = 0; o < 80; o++) { if (o < 16) f[o] = 0 | x[c + o]; else { var a = f[o - 3] ^ f[o - 8] ^ f[o - 14] ^ f[o - 16]; f[o] = a << 1 | a >>> 31 } var s = (t << 5 | t >>> 27) + e + f[o]; s += o < 20 ? 1518500249 + (r & n | ~r & i) : o < 40 ? 1859775393 + (r ^ n ^ i) : o < 60 ? (r & n | r & i | n & i) - 1894007588 : (r ^ n ^ i) - 899497514, e = i, i = n, n = r << 30 | r >>> 2, r = t, t = s } _[0] = _[0] + t | 0, _[1] = _[1] + r | 0, _[2] = _[2] + n | 0, _[3] = _[3] + i | 0, _[4] = _[4] + e | 0 }, _doFinalize: function() { var x = this._data , c = x[_0x19c3("0x16")] , _ = 8 * this[_0x19c3("0x29")] , t = 8 * x[_0x19c3("0x17")]; return c[t >>> 5] |= 128 << 24 - t % 32, c[14 + (64 + t >>> 9 << 4)] = Math.floor(_ / 4294967296), c[15 + (64 + t >>> 9 << 4)] = _, x.sigBytes = 4 * c[_0x19c3("0x18")], this[_0x19c3("0x42")](), this[_0x19c3("0x71")] }, clone: function() { var x = t[_0x19c3("0x31")][_0x19c3("0xd")](this); return x[_0x19c3("0x71")] = this[_0x19c3("0x71")].clone(), x } }); x.SHA1 = t[_0x19c3("0x79")](n), x[_0x19c3("0x7a")] = t._createHmacHelper(n) }(), i[_0x19c3("0x78")]) } , function(x, c, _) { var n; x[_0x19c3("0x0")] = (n = _(0), void function() { var x = n , c = x.lib , _ = c[_0x19c3("0xf")] , t = x[_0x19c3("0x1d")] , a = t[_0x19c3("0x24")] , r = x[_0x19c3("0x39")]; r[_0x19c3("0x38")] = _[_0x19c3("0x15")]({ init: function(x, c) { x = this._hasher = new (x[_0x19c3("0x11")]), typeof c == _0x19c3("0x9") && (c = a[_0x19c3("0x26")](c)); var _ = x[_0x19c3("0x2b")] , t = 4 * _; c[_0x19c3("0x17")] > t && (c = x[_0x19c3("0x37")](c)), c.clamp(); for (var r = this._oKey = c[_0x19c3("0x31")](), n = this[_0x19c3("0x7b")] = c[_0x19c3("0x31")](), i = r[_0x19c3("0x16")], e = n.words, o = 0; o < _; o++) i[o] ^= 1549556828, e[o] ^= 909522486; r[_0x19c3("0x17")] = n[_0x19c3("0x17")] = t, this[_0x19c3("0x34")]() }, reset: function() { var x = this[_0x19c3("0x7c")]; x.reset(), x[_0x19c3("0x66")](this[_0x19c3("0x7b")]) }, update: function(x) { return this._hasher[_0x19c3("0x66")](x), this }, finalize: function(x) { var c = this[_0x19c3("0x7c")] , _ = c[_0x19c3("0x37")](x); c[_0x19c3("0x34")](); var t = c[_0x19c3("0x37")](this[_0x19c3("0x7d")][_0x19c3("0x31")]()[_0x19c3("0x2a")](_)); return t } }) }()) } , function(x, c) { function f(x, c) { var _ = (65535 & x) + (65535 & c); return (x >> 16) + (c >> 16) + (_ >> 16) << 16 | 65535 & _ } function e(x, c, _, t, r, n) { return f(function i(x, c) { return x << c | x >>> 32 - c }(f(f(c, x), f(t, n)), r), _) } function u(x, c, _, t, r, n, i) { return e(c & _ | ~c & t, x, c, r, n, i) } function h(x, c, _, t, r, n, i) { return e(c & t | _ & ~t, x, c, r, n, i) } function v(x, c, _, t, r, n, i) { return e(c ^ _ ^ t, x, c, r, n, i) } function d(x, c, _, t, r, n, i) { return e(_ ^ (c | ~t), x, c, r, n, i) } function o(x, c) { x[c >> 5] |= 128 << c % 32, x[14 + (c + 64 >>> 9 << 4)] = c; var _, t, r, n, i, e = 1732584193, o = -271733879, a = -1732584194, s = 271733878; for (_ = 0; _ < x[_0x19c3("0x18")]; _ += 16) o = d(o = d(o = d(o = d(o = v(o = v(o = v(o = v(o = h(o = h(o = h(o = h(o = u(o = u(o = u(o = u(r = o, a = u(n = a, s = u(i = s, e = u(t = e, o, a, s, x[_], 7, -680876936), o, a, x[_ + 1], 12, -389564586), e, o, x[_ + 2], 17, 606105819), s, e, x[_ + 3], 22, -1044525330), a = u(a, s = u(s, e = u(e, o, a, s, x[_ + 4], 7, -176418897), o, a, x[_ + 5], 12, 1200080426), e, o, x[_ + 6], 17, -1473231341), s, e, x[_ + 7], 22, -45705983), a = u(a, s = u(s, e = u(e, o, a, s, x[_ + 8], 7, 1770035416), o, a, x[_ + 9], 12, -1958414417), e, o, x[_ + 10], 17, -42063), s, e, x[_ + 11], 22, -1990404162), a = u(a, s = u(s, e = u(e, o, a, s, x[_ + 12], 7, 1804603682), o, a, x[_ + 13], 12, -40341101), e, o, x[_ + 14], 17, -1502002290), s, e, x[_ + 15], 22, 1236535329), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 1], 5, -165796510), o, a, x[_ + 6], 9, -1069501632), e, o, x[_ + 11], 14, 643717713), s, e, x[_], 20, -373897302), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 5], 5, -701558691), o, a, x[_ + 10], 9, 38016083), e, o, x[_ + 15], 14, -660478335), s, e, x[_ + 4], 20, -405537848), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 9], 5, 568446438), o, a, x[_ + 14], 9, -1019803690), e, o, x[_ + 3], 14, -187363961), s, e, x[_ + 8], 20, 1163531501), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 13], 5, -1444681467), o, a, x[_ + 2], 9, -51403784), e, o, x[_ + 7], 14, 1735328473), s, e, x[_ + 12], 20, -1926607734), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 5], 4, -378558), o, a, x[_ + 8], 11, -2022574463), e, o, x[_ + 11], 16, 1839030562), s, e, x[_ + 14], 23, -35309556), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 1], 4, -1530992060), o, a, x[_ + 4], 11, 1272893353), e, o, x[_ + 7], 16, -155497632), s, e, x[_ + 10], 23, -1094730640), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 13], 4, 681279174), o, a, x[_], 11, -358537222), e, o, x[_ + 3], 16, -722521979), s, e, x[_ + 6], 23, 76029189), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 9], 4, -640364487), o, a, x[_ + 12], 11, -421815835), e, o, x[_ + 15], 16, 530742520), s, e, x[_ + 2], 23, -995338651), a = d(a, s = d(s, e = d(e, o, a, s, x[_], 6, -198630844), o, a, x[_ + 7], 10, 1126891415), e, o, x[_ + 14], 15, -1416354905), s, e, x[_ + 5], 21, -57434055), a = d(a, s = d(s, e = d(e, o, a, s, x[_ + 12], 6, 1700485571), o, a, x[_ + 3], 10, -1894986606), e, o, x[_ + 10], 15, -1051523), s, e, x[_ + 1], 21, -2054922799), a = d(a, s = d(s, e = d(e, o, a, s, x[_ + 8], 6, 1873313359), o, a, x[_ + 15], 10, -30611744), e, o, x[_ + 6], 15, -1560198380), s, e, x[_ + 13], 21, 1309151649), a = d(a, s = d(s, e = d(e, o, a, s, x[_ + 4], 6, -145523070), o, a, x[_ + 11], 10, -1120210379), e, o, x[_ + 2], 15, 718787259), s, e, x[_ + 9], 21, -343485551), e = f(e, t), o = f(o, r), a = f(a, n), s = f(s, i); return [e, o, a, s] } function a(x) { var c, _ = ""; for (c = 0; c < 32 * x[_0x19c3("0x18")]; c += 8) _ += String[_0x19c3("0x22")](x[c >> 5] >>> c % 32 & 255); return _ } function s(x) { var c, _ = []; for (_[(x[_0x19c3("0x18")] >> 2) - 1] = undefined, c = 0; c < _.length; c += 1) _[c] = 0; for (c = 0; c < 8 * x[_0x19c3("0x18")]; c += 8) _[c >> 5] |= (255 & x[_0x19c3("0x23")](c / 8)) << c % 32; return _ } function n(x) { var c, _, t = _0x19c3("0x7e"), r = ""; for (_ = 0; _ < x[_0x19c3("0x18")]; _ += 1) c = x[_0x19c3("0x23")](_), r += t.charAt(c >>> 4 & 15) + t.charAt(15 & c); return r } function _(x) { return unescape(encodeURIComponent(x)) } function i(x) { return function c(x) { return a(o(s(x), 8 * x.length)) }(_(x)) } function l(x, c) { return function e(x, c) { var _, t, r = s(x), n = [], i = []; for (n[15] = i[15] = undefined, 16 < r.length && (r = o(r, 8 * x[_0x19c3("0x18")])), _ = 0; _ < 16; _ += 1) n[_] = 909522486 ^ r[_], i[_] = 1549556828 ^ r[_]; return t = o(n[_0x19c3("0x2a")](s(c)), 512 + 8 * c[_0x19c3("0x18")]), a(o(i[_0x19c3("0x2a")](t), 640)) }(_(x), _(c)) } x[_0x19c3("0x0")] = function p(x, c, _) { return c ? _ ? l(c, x) : function t(x, c) { return n(l(x, c)) }(c, x) : _ ? i(x) : function r(x) { return n(i(x)) }(x) } } , function(x, c, _) { var o; x[_0x19c3("0x0")] = (o = _(0), function(r) { var x = o , c = x[_0x19c3("0xe")] , _ = c.WordArray , t = c.Hasher , n = x[_0x19c3("0x39")] , i = [] , y = []; !function() { function x(x) { for (var c = r[_0x19c3("0x7f")](x), _ = 2; _ <= c; _++) if (!(x % _)) return !1; return !0 } function c(x) { return 4294967296 * (x - (0 | x)) | 0 } for (var _ = 2, t = 0; t < 64; ) x(_) && (t < 8 && (i[t] = c(r.pow(_, .5))), y[t] = c(r.pow(_, 1 / 3)), t++), _++ }(); var g = [] , e = n.SHA256 = t[_0x19c3("0x15")]({ _doReset: function() { this._hash = new (_[_0x19c3("0x11")])(i[_0x19c3("0x1b")](0)) }, _doProcessBlock: function(x, c) { for (var _ = this._hash.words, t = _[0], r = _[1], n = _[2], i = _[3], e = _[4], o = _[5], a = _[6], s = _[7], f = 0; f < 64; f++) { if (f < 16) g[f] = 0 | x[c + f]; else { var u = g[f - 15] , h = (u << 25 | u >>> 7) ^ (u << 14 | u >>> 18) ^ u >>> 3 , v = g[f - 2] , d = (v << 15 | v >>> 17) ^ (v << 13 | v >>> 19) ^ v >>> 10; g[f] = h + g[f - 7] + d + g[f - 16] } var l = t & r ^ t & n ^ r & n , p = (t << 30 | t >>> 2) ^ (t << 19 | t >>> 13) ^ (t << 10 | t >>> 22) , b = s + ((e << 26 | e >>> 6) ^ (e << 21 | e >>> 11) ^ (e << 7 | e >>> 25)) + (e & o ^ ~e & a) + y[f] + g[f]; s = a, a = o, o = e, e = i + b | 0, i = n, n = r, r = t, t = b + (p + l) | 0 } _[0] = _[0] + t | 0, _[1] = _[1] + r | 0, _[2] = _[2] + n | 0, _[3] = _[3] + i | 0, _[4] = _[4] + e | 0, _[5] = _[5] + o | 0, _[6] = _[6] + a | 0, _[7] = _[7] + s | 0 }, _doFinalize: function() { var x = this[_0x19c3("0x28")] , c = x.words , _ = 8 * this._nDataBytes , t = 8 * x[_0x19c3("0x17")]; return c[t >>> 5] |= 128 << 24 - t % 32, c[14 + (64 + t >>> 9 << 4)] = r[_0x19c3("0x72")](_ / 4294967296), c[15 + (64 + t >>> 9 << 4)] = _, x.sigBytes = 4 * c[_0x19c3("0x18")], this._process(), this._hash }, clone: function() { var x = t.clone[_0x19c3("0xd")](this); return x[_0x19c3("0x71")] = this[_0x19c3("0x71")].clone(), x } }); x[_0x19c3("0x80")] = t[_0x19c3("0x79")](e), x[_0x19c3("0x81")] = t._createHmacHelper(e) }(Math), o.SHA256) } , function(x, c, _) { var o; x.exports = (o = _(0), _(5), function() { var x = o , c = x[_0x19c3("0xe")][_0x19c3("0x32")] , _ = x[_0x19c3("0x82")] , t = _[_0x19c3("0x75")] , r = _.WordArray , n = x[_0x19c3("0x39")]; function i() { return t[_0x19c3("0x7")][_0x19c3("0x13")](t, arguments) } var kx = [i(1116352408, 3609767458), i(1899447441, 602891725), i(3049323471, 3964484399), i(3921009573, 2173295548), i(961987163, 4081628472), i(1508970993, 3053834265), i(2453635748, 2937671579), i(2870763221, 3664609560), i(3624381080, 2734883394), i(310598401, 1164996542), i(607225278, 1323610764), i(1426881987, 3590304994), i(1925078388, 4068182383), i(2162078206, 991336113), i(2614888103, 633803317), i(3248222580, 3479774868), i(3835390401, 2666613458), i(4022224774, 944711139), i(264347078, 2341262773), i(604807628, 2007800933), i(770255983, 1495990901), i(1249150122, 1856431235), i(1555081692, 3175218132), i(1996064986, 2198950837), i(2554220882, 3999719339), i(2821834349, 766784016), i(2952996808, 2566594879), i(3210313671, 3203337956), i(3336571891, 1034457026), i(3584528711, 2466948901), i(113926993, 3758326383), i(338241895, 168717936), i(666307205, 1188179964), i(773529912, 1546045734), i(1294757372, 1522805485), i(1396182291, 2643833823), i(1695183700, 2343527390), i(1986661051, 1014477480), i(2177026350, 1206759142), i(2456956037, 344077627), i(2730485921, 1290863460), i(2820302411, 3158454273), i(3259730800, 3505952657), i(3345764771, 106217008), i(3516065817, 3606008344), i(3600352804, 1432725776), i(4094571909, 1467031594), i(275423344, 851169720), i(430227734, 3100823752), i(506948616, 1363258195), i(659060556, 3750685593), i(883997877, 3785050280), i(958139571, 3318307427), i(1322822218, 3812723403), i(1537002063, 2003034995), i(1747873779, 3602036899), i(1955562222, 1575990012), i(2024104815, 1125592928), i(2227730452, 2716904306), i(2361852424, 442776044), i(2428436474, 593698344), i(2756734187, 3733110249), i(3204031479, 2999351573), i(3329325298, 3815920427), i(3391569614, 3928383900), i(3515267271, 566280711), i(3940187606, 3454069534), i(4118630271, 4000239992), i(116418474, 1914138554), i(174292421, 2731055270), i(289380356, 3203993006), i(460393269, 320620315), i(685471733, 587496836), i(852142971, 1086792851), i(1017036298, 365543100), i(1126000580, 2618297676), i(1288033470, 3409855158), i(1501505948, 4234509866), i(1607167915, 987167468), i(1816402316, 1246189591)] , Sx = []; !function() { for (var x = 0; x < 80; x++) Sx[x] = i() }(); var e = n.SHA512 = c[_0x19c3("0x15")]({ _doReset: function() { this._hash = new (r[_0x19c3("0x11")])([new (t[_0x19c3("0x11")])(1779033703,4089235720), new (t[_0x19c3("0x11")])(3144134277,2227873595), new (t[_0x19c3("0x11")])(1013904242,4271175723), new t.init(2773480762,1595750129), new (t[_0x19c3("0x11")])(1359893119,2917565137), new (t[_0x19c3("0x11")])(2600822924,725511199), new t.init(528734635,4215389547), new (t[_0x19c3("0x11")])(1541459225,327033209)]) }, _doProcessBlock: function(x, c) { for (var _ = this._hash[_0x19c3("0x16")], t = _[0], r = _[1], n = _[2], i = _[3], e = _[4], o = _[5], a = _[6], s = _[7], f = t.high, u = t[_0x19c3("0x77")], h = r.high, v = r[_0x19c3("0x77")], d = n[_0x19c3("0x76")], l = n[_0x19c3("0x77")], p = i[_0x19c3("0x76")], b = i[_0x19c3("0x77")], y = e[_0x19c3("0x76")], g = e[_0x19c3("0x77")], w = o[_0x19c3("0x76")], m = o[_0x19c3("0x77")], k = a[_0x19c3("0x76")], S = a.low, O = s[_0x19c3("0x76")], B = s.low, A = f, z = u, H = h, C = v, R = d, M = l, D = p, E = b, P = y, F = g, j = w, U = m, I = k, X = S, K = O, T = B, L = 0; L < 80; L++) { var W = Sx[L]; if (L < 16) var N = W.high = 0 | x[c + 2 * L] , q = W[_0x19c3("0x77")] = 0 | x[c + 2 * L + 1]; else { var Z = Sx[L - 15] , G = Z[_0x19c3("0x76")] , V = Z[_0x19c3("0x77")] , J = (G >>> 1 | V << 31) ^ (G >>> 8 | V << 24) ^ G >>> 7 , Q = (V >>> 1 | G << 31) ^ (V >>> 8 | G << 24) ^ (V >>> 7 | G << 25) , Y = Sx[L - 2] , $ = Y[_0x19c3("0x76")] , xx = Y[_0x19c3("0x77")] , cx = ($ >>> 19 | xx << 13) ^ ($ << 3 | xx >>> 29) ^ $ >>> 6 , _x = (xx >>> 19 | $ << 13) ^ (xx << 3 | $ >>> 29) ^ (xx >>> 6 | $ << 26) , tx = Sx[L - 7] , rx = tx[_0x19c3("0x76")] , nx = tx.low , ix = Sx[L - 16] , ex = ix[_0x19c3("0x76")] , ox = ix.low; N = (N = (N = J + rx + ((q = Q + nx) >>> 0 < Q >>> 0 ? 1 : 0)) + cx + ((q += _x) >>> 0 < _x >>> 0 ? 1 : 0)) + ex + ((q += ox) >>> 0 < ox >>> 0 ? 1 : 0), W[_0x19c3("0x76")] = N, W[_0x19c3("0x77")] = q } var ax, sx = P & j ^ ~P & I, fx = F & U ^ ~F & X, ux = A & H ^ A & R ^ H & R, hx = z & C ^ z & M ^ C & M, vx = (A >>> 28 | z << 4) ^ (A << 30 | z >>> 2) ^ (A << 25 | z >>> 7), dx = (z >>> 28 | A << 4) ^ (z << 30 | A >>> 2) ^ (z << 25 | A >>> 7), lx = (P >>> 14 | F << 18) ^ (P >>> 18 | F << 14) ^ (P << 23 | F >>> 9), px = (F >>> 14 | P << 18) ^ (F >>> 18 | P << 14) ^ (F << 23 | P >>> 9), bx = kx[L], yx = bx[_0x19c3("0x76")], gx = bx[_0x19c3("0x77")], wx = K + lx + ((ax = T + px) >>> 0 < T >>> 0 ? 1 : 0), mx = dx + hx; K = I, T = X, I = j, X = U, j = P, U = F, P = D + (wx = (wx = (wx = wx + sx + ((ax += fx) >>> 0 < fx >>> 0 ? 1 : 0)) + yx + ((ax += gx) >>> 0 < gx >>> 0 ? 1 : 0)) + N + ((ax += q) >>> 0 < q >>> 0 ? 1 : 0)) + ((F = E + ax | 0) >>> 0 < E >>> 0 ? 1 : 0) | 0, D = R, E = M, R = H, M = C, H = A, C = z, A = wx + (vx + ux + (mx >>> 0 < dx >>> 0 ? 1 : 0)) + ((z = ax + mx | 0) >>> 0 < ax >>> 0 ? 1 : 0) | 0 } u = t[_0x19c3("0x77")] = u + z, t.high = f + A + (u >>> 0 < z >>> 0 ? 1 : 0), v = r[_0x19c3("0x77")] = v + C, r[_0x19c3("0x76")] = h + H + (v >>> 0 < C >>> 0 ? 1 : 0), l = n.low = l + M, n[_0x19c3("0x76")] = d + R + (l >>> 0 < M >>> 0 ? 1 : 0), b = i[_0x19c3("0x77")] = b + E, i.high = p + D + (b >>> 0 < E >>> 0 ? 1 : 0), g = e[_0x19c3("0x77")] = g + F, e[_0x19c3("0x76")] = y + P + (g >>> 0 < F >>> 0 ? 1 : 0), m = o.low = m + U, o[_0x19c3("0x76")] = w + j + (m >>> 0 < U >>> 0 ? 1 : 0), S = a[_0x19c3("0x77")] = S + X, a[_0x19c3("0x76")] = k + I + (S >>> 0 < X >>> 0 ? 1 : 0), B = s.low = B + T, s.high = O + K + (B >>> 0 < T >>> 0 ? 1 : 0) }, _doFinalize: function() { var x = this[_0x19c3("0x28")] , c = x[_0x19c3("0x16")] , _ = 8 * this[_0x19c3("0x29")] , t = 8 * x[_0x19c3("0x17")]; return c[t >>> 5] |= 128 << 24 - t % 32, c[30 + (128 + t >>> 10 << 5)] = Math.floor(_ / 4294967296), c[31 + (128 + t >>> 10 << 5)] = _, x[_0x19c3("0x17")] = 4 * c[_0x19c3("0x18")], this._process(), this[_0x19c3("0x71")][_0x19c3("0x83")]() }, clone: function() { var x = c[_0x19c3("0x31")][_0x19c3("0xd")](this); return x[_0x19c3("0x71")] = this._hash[_0x19c3("0x31")](), x }, blockSize: 32 }); x[_0x19c3("0x84")] = c[_0x19c3("0x79")](e), x[_0x19c3("0x85")] = c[_0x19c3("0x74")](e) }(), o[_0x19c3("0x84")]) } , function(x, c) { x[_0x19c3("0x0")] = function(x) { var c, _, t, r, n, i, e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (t = x[_0x19c3("0x18")], _ = 0, c = ""; _ < t; ) { if (r = 255 & x.charCodeAt(_++), _ === t) { c += e.charAt(r >> 2), c += e[_0x19c3("0x6c")]((3 & r) << 4), c += "=="; break } if (n = x[_0x19c3("0x23")](_++), _ === t) { c += e[_0x19c3("0x6c")](r >> 2), c += e[_0x19c3("0x6c")]((3 & r) << 4 | (240 & n) >> 4), c += e[_0x19c3("0x6c")]((15 & n) << 2), c += "="; break } i = x[_0x19c3("0x23")](_++), c += e[_0x19c3("0x6c")](r >> 2), c += e.charAt((3 & r) << 4 | (240 & n) >> 4), c += e.charAt((15 & n) << 2 | (192 & i) >> 6), c += e[_0x19c3("0x6c")](63 & i) } return c } } , function(x, c, _) { var o = _(13) , a = _(40) , s = _(41) , f = _(42) , u = _(8) , t = { OOOO0O: _0x19c3("0x86"), O0000O: _0x19c3("0x87"), O00O0O: _0x19c3("0x88"), OO0OOO: _0x19c3("0x89"), OO0O0O: _0x19c3("0x8a") }; function r(x, c, _) { var t = {}; try { var r = a(x || {}); r[_0x19c3("0x92")] = o[_0x19c3("0x93")], r.time = Math[_0x19c3("0x94")]((new Date)[_0x19c3("0x95")]() / 1e3), r[_0x19c3("0xc")](_0x19c3("0x96")) && delete r[_0x19c3("0x96")], r[_0x19c3("0xc")](_0x19c3("0x97")) && delete r[_0x19c3("0x97")], r.hasOwnProperty("callback") && delete r[_0x19c3("0x98")], r[_0x19c3("0xc")]("elapsed") && delete r[_0x19c3("0x99")], r.hasOwnProperty(_0x19c3("0x9a")) && delete r[_0x19c3("0x9a")]; var n, i = ""; for (n = i = (new Date)[_0x19c3("0x95")](); "00" !== (i = f(u(i)))[_0x19c3("0x14")]()[_0x19c3("0x20")](0, 2); ) ; t = { time: r.time, alg: r[_0x19c3("0x92")], sig: o[_0x19c3("0x9b")](r, c, _), elapsed: (new Date)[_0x19c3("0x95")]() - n || "", shaOne: i } } catch (e) { s(e) } return t.time+"|"+t.alg+"|"+t.sig+"|"+t.elapsed+"|"+t.shaOne; } xxoo= r; c.moonshadV3 = { OOOO00: function n(x, c) { return r(x, c, t[_0x19c3("0x8b")]) }, OOO00O: function i(x, c) { return r(x, c, t[_0x19c3("0x8c")]) }, OOO000: function e(x, c) { return r(x, c, t[_0x19c3("0x8d")]) }, OOO0OO: function h(x, c) { return r(x, c, t[_0x19c3("0x8e")]) }, O0OOO0: function v(x, c) { return r(x, c, t.OO0O0O) } } } , function(x, c, _) { var r = _(14) , n = _(15) , i = _(11); x[_0x19c3("0x0")] = { version: "v3", encryption: function(x, c, _) { var t = r(x, c); return i(n(t, _)) } } } , function(x, c, _) { var u = _(8) , h = { a: "3", b: "4", c: "5", d: "9", e: "8", f: "7", g: "1", h: "2", i: "6", j: "0", k: "a", l: "b", m: "c", n: "d", o: "e", p: "f", q: "g", r: "z", s: "y", t: "x", u: "w", v: "v", w: "u", x: "o", y: "p", z: "q", 0: "s", 1: "t", 2: "r", 3: "h", 4: "i", 5: "j", 6: "k", 7: "l", 8: "m", 9: "n" }; x.exports = function(x, c) { var _ = []; for (var t in x) x.hasOwnProperty(t) && _.push(t); _[_0x19c3("0x9c")](); for (var r = [], n = 0, i = _.length; n < i; n++) { var e = _[n]; r[_0x19c3("0x21")](e + "=" + x[e]) } var o = u(r.join("&")) , a = "" , s = ("19201080")[_0x19c3("0x9d")](""); for (n = 0; n < s[_0x19c3("0x18")]; n++) a += h[s[n]]; return function f(x, c) { var _, t = "", r = x[_0x19c3("0x9d")](""), n = c[_0x19c3("0x9d")](""); if (r[_0x19c3("0x18")] >= n[_0x19c3("0x18")]) { for (_ = 0; _ < n[_0x19c3("0x18")]; _++) t += r[_] + n[_]; t += x[_0x19c3("0x9e")](_) } else { for (_ = 0; _ < r.length; _++) t += r[_] + n[_]; t += c[_0x19c3("0x9e")](_) } return t }(o, a) } } , function(x, c, _) { var r = _(16); x[_0x19c3("0x0")] = function(x, c) { var _ = c , t = (c = r[_0x19c3("0x1d")].Utf8[_0x19c3("0x26")](_), r[_0x19c3("0x1d")][_0x19c3("0x24")][_0x19c3("0x26")](x)); return r.AES[_0x19c3("0x43")](t, c, { mode: r[_0x19c3("0x46")][_0x19c3("0x9f")], padding: r[_0x19c3("0x4f")][_0x19c3("0x50")] })[_0x19c3("0x14")]() } } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), _(5), _(17), _(18), _(3), _(4), _(6), _(9), _(19), _(10), _(20), _(21), _(22), _(7), _(23), _(2), _(1), _(24), _(25), _(26), _(27), _(28), _(29), _(30), _(31), _(32), _(33), _(34), _(35), _(36), _(37), _(38), _(39), t) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), function() { if ("function" == typeof ArrayBuffer) { var x = t[_0x19c3("0xe")][_0x19c3("0x3b")] , r = x[_0x19c3("0x11")]; (x[_0x19c3("0x11")] = function(x) { if (x instanceof ArrayBuffer && (x = new Uint8Array(x)), (x instanceof Int8Array || typeof Uint8ClampedArray !== _0x19c3("0x2") && x instanceof Uint8ClampedArray || x instanceof Int16Array || x instanceof Uint16Array || x instanceof Int32Array || x instanceof Uint32Array || x instanceof Float32Array || x instanceof Float64Array) && (x = new Uint8Array(x.buffer,x[_0x19c3("0xa0")],x[_0x19c3("0xa1")])), x instanceof Uint8Array) { for (var c = x[_0x19c3("0xa1")], _ = [], t = 0; t < c; t++) _[t >>> 2] |= x[t] << 24 - t % 4 * 8; r[_0x19c3("0xd")](this, _, c) } else r[_0x19c3("0x13")](this, arguments) } )[_0x19c3("0xb")] = x } }(), t.lib[_0x19c3("0x3b")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), function() { var x = t , r = x.lib[_0x19c3("0x3b")] , c = x[_0x19c3("0x1d")]; function i(x) { return x << 8 & 4278255360 | x >>> 8 & 16711935 } c.Utf16 = c[_0x19c3("0xa2")] = { stringify: function(x) { for (var c = x[_0x19c3("0x16")], _ = x.sigBytes, t = [], r = 0; r < _; r += 2) { var n = c[r >>> 2] >>> 16 - r % 4 * 8 & 65535; t.push(String.fromCharCode(n)) } return t[_0x19c3("0x1f")]("") }, parse: function(x) { for (var c = x[_0x19c3("0x18")], _ = [], t = 0; t < c; t++) _[t >>> 1] |= x[_0x19c3("0x23")](t) << 16 - t % 2 * 16; return r.create(_, 2 * c) } }, c[_0x19c3("0xa3")] = { stringify: function(x) { for (var c = x.words, _ = x[_0x19c3("0x17")], t = [], r = 0; r < _; r += 2) { var n = i(c[r >>> 2] >>> 16 - r % 4 * 8 & 65535); t[_0x19c3("0x21")](String[_0x19c3("0x22")](n)) } return t[_0x19c3("0x1f")]("") }, parse: function(x) { for (var c = x[_0x19c3("0x18")], _ = [], t = 0; t < c; t++) _[t >>> 1] |= i(x[_0x19c3("0x23")](t) << 16 - t % 2 * 16); return r[_0x19c3("0x7")](_, 2 * c) } } }(), t.enc[_0x19c3("0xa4")]) } , function(x, c, _) { var n; x.exports = (n = _(0), _(9), function() { var x = n , c = x.lib[_0x19c3("0x3b")] , _ = x[_0x19c3("0x39")] , t = _[_0x19c3("0x80")] , r = _.SHA224 = t[_0x19c3("0x15")]({ _doReset: function() { this[_0x19c3("0x71")] = new (c[_0x19c3("0x11")])([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428]) }, _doFinalize: function() { var x = t[_0x19c3("0x36")].call(this); return x[_0x19c3("0x17")] -= 4, x } }); x[_0x19c3("0xa5")] = t[_0x19c3("0x79")](r), x.HmacSHA224 = t[_0x19c3("0x74")](r) }(), n[_0x19c3("0xa5")]) } , function(x, c, _) { var e; x[_0x19c3("0x0")] = (e = _(0), _(5), _(10), function() { var x = e , c = x.x64 , _ = c[_0x19c3("0x75")] , t = c[_0x19c3("0x3b")] , r = x[_0x19c3("0x39")] , n = r.SHA512 , i = r[_0x19c3("0xa6")] = n.extend({ _doReset: function() { this[_0x19c3("0x71")] = new (t[_0x19c3("0x11")])([new (_[_0x19c3("0x11")])(3418070365,3238371032), new (_[_0x19c3("0x11")])(1654270250,914150663), new (_[_0x19c3("0x11")])(2438529370,812702999), new _.init(355462360,4144912697), new (_[_0x19c3("0x11")])(1731405415,4290775857), new (_[_0x19c3("0x11")])(2394180231,1750603025), new _.init(3675008525,1694076839), new (_[_0x19c3("0x11")])(1203062813,3204075428)]) }, _doFinalize: function() { var x = n[_0x19c3("0x36")].call(this); return x[_0x19c3("0x17")] -= 16, x } }); x[_0x19c3("0xa6")] = n[_0x19c3("0x79")](i), x[_0x19c3("0xa7")] = n[_0x19c3("0x74")](i) }(), e[_0x19c3("0xa6")]) } , function(x, c, _) { var n; x[_0x19c3("0x0")] = (n = _(0), _(5), function(u) { var x = n , c = x[_0x19c3("0xe")] , h = c[_0x19c3("0x3b")] , t = c.Hasher , s = x[_0x19c3("0x82")][_0x19c3("0x75")] , _ = x[_0x19c3("0x39")] , H = [] , C = [] , R = []; !function() { for (var x = 1, c = 0, _ = 0; _ < 24; _++) { H[x + 5 * c] = (_ + 1) * (_ + 2) / 2 % 64; var t = (2 * x + 3 * c) % 5; x = c % 5, c = t } for (x = 0; x < 5; x++) for (c = 0; c < 5; c++) C[x + 5 * c] = c + (2 * x + 3 * c) % 5 * 5; for (var r = 1, n = 0; n < 24; n++) { for (var i = 0, e = 0, o = 0; o < 7; o++) { if (1 & r) { var a = (1 << o) - 1; a < 32 ? e ^= 1 << a : i ^= 1 << a - 32 } 128 & r ? r = r << 1 ^ 113 : r <<= 1 } R[n] = s[_0x19c3("0x7")](i, e) } }(); var M = []; !function() { for (var x = 0; x < 25; x++) M[x] = s[_0x19c3("0x7")]() }(); var r = _[_0x19c3("0xa8")] = t[_0x19c3("0x15")]({ cfg: t[_0x19c3("0x33")].extend({ outputLength: 512 }), _doReset: function() { for (var x = this[_0x19c3("0xa9")] = [], c = 0; c < 25; c++) x[c] = new s.init; this[_0x19c3("0x2b")] = (1600 - 2 * this[_0x19c3("0x33")][_0x19c3("0xaa")]) / 32 }, _doProcessBlock: function(x, c) { for (var _ = this._state, t = this[_0x19c3("0x2b")] / 2, r = 0; r < t; r++) { var n = x[c + 2 * r] , i = x[c + 2 * r + 1]; n = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8), i = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8), (S = _[r])[_0x19c3("0x76")] ^= i, S.low ^= n } for (var e = 0; e < 24; e++) { for (var o = 0; o < 5; o++) { for (var a = 0, s = 0, f = 0; f < 5; f++) a ^= (S = _[o + 5 * f])[_0x19c3("0x76")], s ^= S[_0x19c3("0x77")]; var u = M[o]; u.high = a, u[_0x19c3("0x77")] = s } for (o = 0; o < 5; o++) { var h = M[(o + 4) % 5] , v = M[(o + 1) % 5] , d = v[_0x19c3("0x76")] , l = v.low; for (a = h[_0x19c3("0x76")] ^ (d << 1 | l >>> 31), s = h[_0x19c3("0x77")] ^ (l << 1 | d >>> 31), f = 0; f < 5; f++) (S = _[o + 5 * f]).high ^= a, S[_0x19c3("0x77")] ^= s } for (var p = 1; p < 25; p++) { var b = (S = _[p]).high , y = S[_0x19c3("0x77")] , g = H[p]; s = g < 32 ? (a = b << g | y >>> 32 - g, y << g | b >>> 32 - g) : (a = y << g - 32 | b >>> 64 - g, b << g - 32 | y >>> 64 - g); var w = M[C[p]]; w[_0x19c3("0x76")] = a, w[_0x19c3("0x77")] = s } var m = M[0] , k = _[0]; for (m[_0x19c3("0x76")] = k[_0x19c3("0x76")], m[_0x19c3("0x77")] = k[_0x19c3("0x77")], o = 0; o < 5; o++) for (f = 0; f < 5; f++) { var S = _[p = o + 5 * f] , O = M[p] , B = M[(o + 1) % 5 + 5 * f] , A = M[(o + 2) % 5 + 5 * f]; S[_0x19c3("0x76")] = O[_0x19c3("0x76")] ^ ~B.high & A.high, S[_0x19c3("0x77")] = O.low ^ ~B[_0x19c3("0x77")] & A[_0x19c3("0x77")] } S = _[0]; var z = R[e]; S.high ^= z[_0x19c3("0x76")], S[_0x19c3("0x77")] ^= z[_0x19c3("0x77")] } }, _doFinalize: function() { var x = this[_0x19c3("0x28")] , c = x[_0x19c3("0x16")] , _ = (this[_0x19c3("0x29")], 8 * x[_0x19c3("0x17")]) , t = 32 * this.blockSize; c[_ >>> 5] |= 1 << 24 - _ % 32, c[(u.ceil((1 + _) / t) * t >>> 5) - 1] |= 128, x[_0x19c3("0x17")] = 4 * c.length, this[_0x19c3("0x42")](); for (var r = this[_0x19c3("0xa9")], n = this.cfg[_0x19c3("0xaa")] / 8, i = n / 8, e = [], o = 0; o < i; o++) { var a = r[o] , s = a.high , f = a[_0x19c3("0x77")]; s = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), f = 16711935 & (f << 8 | f >>> 24) | 4278255360 & (f << 24 | f >>> 8), e[_0x19c3("0x21")](f), e[_0x19c3("0x21")](s) } return new h.init(e,n) }, clone: function() { for (var x = t[_0x19c3("0x31")][_0x19c3("0xd")](this), c = x[_0x19c3("0xa9")] = this[_0x19c3("0xa9")][_0x19c3("0x1b")](0), _ = 0; _ < 25; _++) c[_] = c[_][_0x19c3("0x31")](); return x } }); x.SHA3 = t._createHelper(r), x[_0x19c3("0xab")] = t[_0x19c3("0x74")](r) }(Math), n[_0x19c3("0xa8")]) } , function(x, c, _) { var i; x.exports = (i = _(0), function() { var x = i , c = x[_0x19c3("0xe")] , _ = c[_0x19c3("0x3b")] , t = c[_0x19c3("0x32")] , r = x[_0x19c3("0x39")] , k = _.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]) , S = _.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]) , O = _[_0x19c3("0x7")]([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]) , B = _[_0x19c3("0x7")]([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]) , A = _.create([0, 1518500249, 1859775393, 2400959708, 2840853838]) , z = _[_0x19c3("0x7")]([1352829926, 1548603684, 1836072691, 2053994217, 0]) , n = r[_0x19c3("0xac")] = t[_0x19c3("0x15")]({ _doReset: function() { this._hash = _[_0x19c3("0x7")]([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function(x, c) { for (var _ = 0; _ < 16; _++) { var t = c + _ , r = x[t]; x[t] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8) } var n, i, e, o, a, s, f, u, h, v, d, l = this[_0x19c3("0x71")].words, p = A[_0x19c3("0x16")], b = z.words, y = k.words, g = S.words, w = O[_0x19c3("0x16")], m = B.words; for (s = n = l[0], f = i = l[1], u = e = l[2], h = o = l[3], v = a = l[4], _ = 0; _ < 80; _ += 1) d = n + x[c + y[_]] | 0, d += _ < 16 ? H(i, e, o) + p[0] : _ < 32 ? C(i, e, o) + p[1] : _ < 48 ? R(i, e, o) + p[2] : _ < 64 ? M(i, e, o) + p[3] : D(i, e, o) + p[4], d = (d = E(d |= 0, w[_])) + a | 0, n = a, a = o, o = E(e, 10), e = i, i = d, d = s + x[c + g[_]] | 0, d += _ < 16 ? D(f, u, h) + b[0] : _ < 32 ? M(f, u, h) + b[1] : _ < 48 ? R(f, u, h) + b[2] : _ < 64 ? C(f, u, h) + b[3] : H(f, u, h) + b[4], d = (d = E(d |= 0, m[_])) + v | 0, s = v, v = h, h = E(u, 10), u = f, f = d; d = l[1] + e + h | 0, l[1] = l[2] + o + v | 0, l[2] = l[3] + a + s | 0, l[3] = l[4] + n + f | 0, l[4] = l[0] + i + u | 0, l[0] = d }, _doFinalize: function() { var x = this[_0x19c3("0x28")] , c = x[_0x19c3("0x16")] , _ = 8 * this[_0x19c3("0x29")] , t = 8 * x[_0x19c3("0x17")]; c[t >>> 5] |= 128 << 24 - t % 32, c[14 + (64 + t >>> 9 << 4)] = 16711935 & (_ << 8 | _ >>> 24) | 4278255360 & (_ << 24 | _ >>> 8), x[_0x19c3("0x17")] = 4 * (c[_0x19c3("0x18")] + 1), this[_0x19c3("0x42")](); for (var r = this[_0x19c3("0x71")], n = r.words, i = 0; i < 5; i++) { var e = n[i]; n[i] = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8) } return r }, clone: function() { var x = t[_0x19c3("0x31")][_0x19c3("0xd")](this); return x._hash = this._hash.clone(), x } }); function H(x, c, _) { return x ^ c ^ _ } function C(x, c, _) { return x & c | ~x & _ } function R(x, c, _) { return (x | ~c) ^ _ } function M(x, c, _) { return x & _ | c & ~_ } function D(x, c, _) { return x ^ (c | ~_) } function E(x, c) { return x << c | x >>> 32 - c } x[_0x19c3("0xac")] = t[_0x19c3("0x79")](n), x[_0x19c3("0xad")] = t[_0x19c3("0x74")](n) }(Math), i[_0x19c3("0xac")]) } , function(x, c, _) { var i; x.exports = (i = _(0), _(6), _(7), function() { var x = i , c = x.lib , _ = c[_0x19c3("0xf")] , p = c[_0x19c3("0x3b")] , t = x[_0x19c3("0x39")] , r = t.SHA1 , b = t.HMAC , n = t.PBKDF2 = _.extend({ cfg: _[_0x19c3("0x15")]({ keySize: 4, hasher: r, iterations: 1 }), init: function(x) { this[_0x19c3("0x33")] = this[_0x19c3("0x33")][_0x19c3("0x15")](x) }, compute: function(x, c) { for (var _ = this[_0x19c3("0x33")], t = b[_0x19c3("0x7")](_[_0x19c3("0x65")], x), r = p[_0x19c3("0x7")](), n = p[_0x19c3("0x7")]([1]), i = r[_0x19c3("0x16")], e = n.words, o = _.keySize, a = _[_0x19c3("0xae")]; i[_0x19c3("0x18")] < o; ) { var s = t[_0x19c3("0x66")](c)[_0x19c3("0x37")](n); t.reset(); for (var f = s[_0x19c3("0x16")], u = f[_0x19c3("0x18")], h = s, v = 1; v < a; v++) { h = t[_0x19c3("0x37")](h), t.reset(); for (var d = h[_0x19c3("0x16")], l = 0; l < u; l++) f[l] ^= d[l] } r[_0x19c3("0x2a")](s), e[0]++ } return r[_0x19c3("0x17")] = 4 * o, r } }); x[_0x19c3("0xaf")] = function(x, c, _) { return n[_0x19c3("0x7")](_)[_0x19c3("0x67")](x, c) } }(), i[_0x19c3("0xaf")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), _(1), t.mode[_0x19c3("0xb0")] = function() { var x = t[_0x19c3("0xe")][_0x19c3("0x47")][_0x19c3("0x15")](); function n(x, c, _, t) { var r = this._iv; if (r) { var n = r[_0x19c3("0x1b")](0); this[_0x19c3("0x4b")] = undefined } else n = this._prevBlock; t[_0x19c3("0x4d")](n, 0); for (var i = 0; i < _; i++) x[c + i] ^= n[i] } return x[_0x19c3("0x48")] = x[_0x19c3("0x15")]({ processBlock: function(x, c) { var _ = this[_0x19c3("0x4a")] , t = _.blockSize; n.call(this, x, c, t, _), this[_0x19c3("0x4e")] = x[_0x19c3("0x1b")](c, c + t) } }), x[_0x19c3("0x49")] = x[_0x19c3("0x15")]({ processBlock: function(x, c) { var _ = this[_0x19c3("0x4a")] , t = _[_0x19c3("0x2b")] , r = x.slice(c, c + t); n[_0x19c3("0xd")](this, x, c, t, _), this[_0x19c3("0x4e")] = r } }), x }(), t.mode[_0x19c3("0xb0")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), _(1), t.mode[_0x19c3("0xb1")] = function() { var x = t.lib[_0x19c3("0x47")][_0x19c3("0x15")]() , c = x[_0x19c3("0x48")] = x.extend({ processBlock: function(x, c) { var _ = this[_0x19c3("0x4a")] , t = _[_0x19c3("0x2b")] , r = this[_0x19c3("0x4b")] , n = this[_0x19c3("0xb2")]; r && (n = this[_0x19c3("0xb2")] = r[_0x19c3("0x1b")](0), this[_0x19c3("0x4b")] = undefined); var i = n[_0x19c3("0x1b")](0); _[_0x19c3("0x4d")](i, 0), n[t - 1] = n[t - 1] + 1 | 0; for (var e = 0; e < t; e++) x[c + e] ^= i[e] } }); return x[_0x19c3("0x49")] = c, x }(), t[_0x19c3("0x46")][_0x19c3("0xb1")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), _(1), t[_0x19c3("0x46")].CTRGladman = function() { var x = t.lib[_0x19c3("0x47")][_0x19c3("0x15")](); function a(x) { if (255 == (x >> 24 & 255)) { var c = x >> 16 & 255 , _ = x >> 8 & 255 , t = 255 & x; 255 === c ? (c = 0, 255 === _ ? (_ = 0, 255 === t ? t = 0 : ++t) : ++_) : ++c, x = 0, x += c << 16, x += _ << 8, x += t } else x += 1 << 24; return x } var c = x[_0x19c3("0x48")] = x[_0x19c3("0x15")]({ processBlock: function(x, c) { var _ = this[_0x19c3("0x4a")] , t = _[_0x19c3("0x2b")] , r = this[_0x19c3("0x4b")] , n = this[_0x19c3("0xb2")]; r && (n = this[_0x19c3("0xb2")] = r.slice(0), this._iv = undefined), function o(x) { return 0 === (x[0] = a(x[0])) && (x[1] = a(x[1])), x }(n); var i = n.slice(0); _[_0x19c3("0x4d")](i, 0); for (var e = 0; e < t; e++) x[c + e] ^= i[e] } }); return x[_0x19c3("0x49")] = c, x }(), t[_0x19c3("0x46")].CTRGladman) } , function(x, c, _) { var t; x.exports = (t = _(0), _(1), t[_0x19c3("0x46")][_0x19c3("0xb3")] = function() { var x = t[_0x19c3("0xe")][_0x19c3("0x47")][_0x19c3("0x15")]() , c = x[_0x19c3("0x48")] = x.extend({ processBlock: function(x, c) { var _ = this._cipher , t = _[_0x19c3("0x2b")] , r = this._iv , n = this[_0x19c3("0xb4")]; r && (n = this[_0x19c3("0xb4")] = r.slice(0), this._iv = undefined), _[_0x19c3("0x4d")](n, 0); for (var i = 0; i < t; i++) x[c + i] ^= n[i] } }); return x[_0x19c3("0x49")] = c, x }(), t[_0x19c3("0x46")][_0x19c3("0xb3")]) } , function(x, c, _) { var t; x.exports = (t = _(0), _(1), t.mode[_0x19c3("0x9f")] = function() { var x = t.lib.BlockCipherMode.extend(); return x[_0x19c3("0x48")] = x[_0x19c3("0x15")]({ processBlock: function(x, c) { this._cipher[_0x19c3("0x4d")](x, c) } }), x[_0x19c3("0x49")] = x[_0x19c3("0x15")]({ processBlock: function(x, c) { this[_0x19c3("0x4a")][_0x19c3("0xb5")](x, c) } }), x }(), t[_0x19c3("0x46")][_0x19c3("0x9f")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), _(1), t[_0x19c3("0x4f")][_0x19c3("0xb6")] = { pad: function(x, c) { var _ = x[_0x19c3("0x17")] , t = 4 * c , r = t - _ % t , n = _ + r - 1; x[_0x19c3("0x6a")](), x.words[n >>> 2] |= r << 24 - n % 4 * 8, x[_0x19c3("0x17")] += r }, unpad: function(x) { var c = 255 & x[_0x19c3("0x16")][x[_0x19c3("0x17")] - 1 >>> 2]; x.sigBytes -= c } }, t[_0x19c3("0x4f")][_0x19c3("0xb7")]) } , function(x, c, _) { var r; x[_0x19c3("0x0")] = (r = _(0), _(1), r[_0x19c3("0x4f")].Iso10126 = { pad: function(x, c) { var _ = 4 * c , t = _ - x.sigBytes % _; x[_0x19c3("0x2a")](r[_0x19c3("0xe")].WordArray[_0x19c3("0x1c")](t - 1))[_0x19c3("0x2a")](r.lib[_0x19c3("0x3b")][_0x19c3("0x7")]([t << 24], 1)) }, unpad: function(x) { var c = 255 & x[_0x19c3("0x16")][x[_0x19c3("0x17")] - 1 >>> 2]; x[_0x19c3("0x17")] -= c } }, r[_0x19c3("0x4f")][_0x19c3("0xb8")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), _(1), t[_0x19c3("0x4f")][_0x19c3("0xb9")] = { pad: function(x, c) { x.concat(t[_0x19c3("0xe")][_0x19c3("0x3b")].create([2147483648], 1)), t[_0x19c3("0x4f")][_0x19c3("0xba")][_0x19c3("0x4f")](x, c) }, unpad: function(x) { t.pad.ZeroPadding[_0x19c3("0x56")](x), x[_0x19c3("0x17")]-- } }, t.pad[_0x19c3("0xb9")]) } , function(x, c, _) { var t; x[_0x19c3("0x0")] = (t = _(0), _(1), t[_0x19c3("0x4f")][_0x19c3("0xba")] = { pad: function(x, c) { var _ = 4 * c; x[_0x19c3("0x6a")](), x[_0x19c3("0x17")] += _ - (x.sigBytes % _ || _) }, unpad: function(x) { for (var c = x[_0x19c3("0x16")], _ = x[_0x19c3("0x17")] - 1; !(c[_ >>> 2] >>> 24 - _ % 4 * 8 & 255); ) _--; x[_0x19c3("0x17")] = _ + 1 } }, t[_0x19c3("0x4f")].ZeroPadding) } , function(x, c, _) { var t; x.exports = (t = _(0), _(1), t.pad[_0x19c3("0xbb")] = { pad: function() {}, unpad: function() {} }, t.pad[_0x19c3("0xbb")]) } , function(x, c, _) { var r; x[_0x19c3("0x0")] = (r = _(0), _(1), function() { var x = r , _ = x[_0x19c3("0xe")][_0x19c3("0x57")] , t = x.enc.Hex; x[_0x19c3("0x59")][_0x19c3("0x1e")] = { stringify: function(x) { return x.ciphertext.toString(t) }, parse: function(x) { var c = t[_0x19c3("0x26")](x); return _[_0x19c3("0x7")]({ ciphertext: c }) } } }(), r[_0x19c3("0x59")][_0x19c3("0x1e")]) } , function(x, c, _) { var r; x[_0x19c3("0x0")] = (r = _(0), _(3), _(4), _(2), _(1), function() { var x = r , c = x[_0x19c3("0xe")][_0x19c3("0x51")] , _ = x[_0x19c3("0x39")] , a = [] , s = [] , f = [] , u = [] , h = [] , v = [] , d = [] , l = [] , p = [] , b = []; !function() { for (var x = [], c = 0; c < 256; c++) x[c] = c < 128 ? c << 1 : c << 1 ^ 283; var _ = 0 , t = 0; for (c = 0; c < 256; c++) { var r = t ^ t << 1 ^ t << 2 ^ t << 3 ^ t << 4; r = r >>> 8 ^ 255 & r ^ 99, a[_] = r; var n = x[s[r] = _] , i = x[n] , e = x[i] , o = 257 * x[r] ^ 16843008 * r; f[_] = o << 24 | o >>> 8, u[_] = o << 16 | o >>> 16, h[_] = o << 8 | o >>> 24, v[_] = o, o = 16843009 * e ^ 65537 * i ^ 257 * n ^ 16843008 * _, d[r] = o << 24 | o >>> 8, l[r] = o << 16 | o >>> 16, p[r] = o << 8 | o >>> 24, b[r] = o, _ ? (_ = n ^ x[x[x[e ^ n]]], t ^= x[x[t]]) : _ = t = 1 } }(); var y = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54] , t = _[_0x19c3("0xbc")] = c[_0x19c3("0x15")]({ _doReset: function() { if (!this[_0x19c3("0xbd")] || this[_0x19c3("0xbe")] !== this[_0x19c3("0x40")]) { for (var x = this[_0x19c3("0xbe")] = this[_0x19c3("0x40")], c = x[_0x19c3("0x16")], _ = x.sigBytes / 4, t = 4 * (1 + (this[_0x19c3("0xbd")] = 6 + _)), r = this[_0x19c3("0xbf")] = [], n = 0; n < t; n++) if (n < _) r[n] = c[n]; else { var i = r[n - 1]; n % _ ? 6 < _ && n % _ == 4 && (i = a[i >>> 24] << 24 | a[i >>> 16 & 255] << 16 | a[i >>> 8 & 255] << 8 | a[255 & i]) : (i = a[(i = i << 8 | i >>> 24) >>> 24] << 24 | a[i >>> 16 & 255] << 16 | a[i >>> 8 & 255] << 8 | a[255 & i], i ^= y[n / _ | 0] << 24), r[n] = r[n - _] ^ i } for (var e = this[_0x19c3("0xc0")] = [], o = 0; o < t; o++) n = t - o, i = o % 4 ? r[n] : r[n - 4], e[o] = o < 4 || n <= 4 ? i : d[a[i >>> 24]] ^ l[a[i >>> 16 & 255]] ^ p[a[i >>> 8 & 255]] ^ b[a[255 & i]] } }, encryptBlock: function(x, c) { this._doCryptBlock(x, c, this._keySchedule, f, u, h, v, a) }, decryptBlock: function(x, c) { var _ = x[c + 1]; x[c + 1] = x[c + 3], x[c + 3] = _, this[_0x19c3("0xc1")](x, c, this._invKeySchedule, d, l, p, b, s), _ = x[c + 1], x[c + 1] = x[c + 3], x[c + 3] = _ }, _doCryptBlock: function(x, c, _, t, r, n, i, e) { for (var o = this[_0x19c3("0xbd")], a = x[c] ^ _[0], s = x[c + 1] ^ _[1], f = x[c + 2] ^ _[2], u = x[c + 3] ^ _[3], h = 4, v = 1; v < o; v++) { var d = t[a >>> 24] ^ r[s >>> 16 & 255] ^ n[f >>> 8 & 255] ^ i[255 & u] ^ _[h++] , l = t[s >>> 24] ^ r[f >>> 16 & 255] ^ n[u >>> 8 & 255] ^ i[255 & a] ^ _[h++] , p = t[f >>> 24] ^ r[u >>> 16 & 255] ^ n[a >>> 8 & 255] ^ i[255 & s] ^ _[h++] , b = t[u >>> 24] ^ r[a >>> 16 & 255] ^ n[s >>> 8 & 255] ^ i[255 & f] ^ _[h++]; a = d, s = l, f = p, u = b } d = (e[a >>> 24] << 24 | e[s >>> 16 & 255] << 16 | e[f >>> 8 & 255] << 8 | e[255 & u]) ^ _[h++], l = (e[s >>> 24] << 24 | e[f >>> 16 & 255] << 16 | e[u >>> 8 & 255] << 8 | e[255 & a]) ^ _[h++], p = (e[f >>> 24] << 24 | e[u >>> 16 & 255] << 16 | e[a >>> 8 & 255] << 8 | e[255 & s]) ^ _[h++], b = (e[u >>> 24] << 24 | e[a >>> 16 & 255] << 16 | e[s >>> 8 & 255] << 8 | e[255 & f]) ^ _[h++], x[c] = d, x[c + 1] = l, x[c + 2] = p, x[c + 3] = b }, keySize: 8 }); x[_0x19c3("0xbc")] = c._createHelper(t) }(), r[_0x19c3("0xbc")]) } , function(x, c, _) { var e; x[_0x19c3("0x0")] = (e = _(0), _(3), _(4), _(2), _(1), function() { var x = e , c = x[_0x19c3("0xe")] , _ = c[_0x19c3("0x3b")] , t = c.BlockCipher , r = x[_0x19c3("0x39")] , a = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4] , s = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32] , f = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28] , u = [{ 0: 8421888, 268435456: 32768, 536870912: 8421378, 805306368: 2, 1073741824: 512, 1342177280: 8421890, 1610612736: 8389122, 1879048192: 8388608, 2147483648: 514, 2415919104: 8389120, 2684354560: 33280, 2952790016: 8421376, 3221225472: 32770, 3489660928: 8388610, 3758096384: 0, 4026531840: 33282, 134217728: 0, 402653184: 8421890, 671088640: 33282, 939524096: 32768, 1207959552: 8421888, 1476395008: 512, 1744830464: 8421378, 2013265920: 2, 2281701376: 8389120, 2550136832: 33280, 2818572288: 8421376, 3087007744: 8389122, 3355443200: 8388610, 3623878656: 32770, 3892314112: 514, 4160749568: 8388608, 1: 32768, 268435457: 2, 536870913: 8421888, 805306369: 8388608, 1073741825: 8421378, 1342177281: 33280, 1610612737: 512, 1879048193: 8389122, 2147483649: 8421890, 2415919105: 8421376, 2684354561: 8388610, 2952790017: 33282, 3221225473: 514, 3489660929: 8389120, 3758096385: 32770, 4026531841: 0, 134217729: 8421890, 402653185: 8421376, 671088641: 8388608, 939524097: 512, 1207959553: 32768, 1476395009: 8388610, 1744830465: 2, 2013265921: 33282, 2281701377: 32770, 2550136833: 8389122, 2818572289: 514, 3087007745: 8421888, 3355443201: 8389120, 3623878657: 0, 3892314113: 33280, 4160749569: 8421378 }, { 0: 1074282512, 16777216: 16384, 33554432: 524288, 50331648: 1074266128, 67108864: 1073741840, 83886080: 1074282496, 100663296: 1073758208, 117440512: 16, 134217728: 540672, 150994944: 1073758224, 167772160: 1073741824, 184549376: 540688, 201326592: 524304, 218103808: 0, 234881024: 16400, 251658240: 1074266112, 8388608: 1073758208, 25165824: 540688, 41943040: 16, 58720256: 1073758224, 75497472: 1074282512, 92274688: 1073741824, 109051904: 524288, 125829120: 1074266128, 142606336: 524304, 159383552: 0, 176160768: 16384, 192937984: 1074266112, 209715200: 1073741840, 226492416: 540672, 243269632: 1074282496, 260046848: 16400, 268435456: 0, 285212672: 1074266128, 301989888: 1073758224, 318767104: 1074282496, 335544320: 1074266112, 352321536: 16, 369098752: 540688, 385875968: 16384, 402653184: 16400, 419430400: 524288, 436207616: 524304, 452984832: 1073741840, 469762048: 540672, 486539264: 1073758208, 503316480: 1073741824, 520093696: 1074282512, 276824064: 540688, 293601280: 524288, 310378496: 1074266112, 327155712: 16384, 343932928: 1073758208, 360710144: 1074282512, 377487360: 16, 394264576: 1073741824, 411041792: 1074282496, 427819008: 1073741840, 444596224: 1073758224, 461373440: 524304, 478150656: 0, 494927872: 16400, 511705088: 1074266128, 528482304: 540672 }, { 0: 260, 1048576: 0, 2097152: 67109120, 3145728: 65796, 4194304: 65540, 5242880: 67108868, 6291456: 67174660, 7340032: 67174400, 8388608: 67108864, 9437184: 67174656, 10485760: 65792, 11534336: 67174404, 12582912: 67109124, 13631488: 65536, 14680064: 4, 15728640: 256, 524288: 67174656, 1572864: 67174404, 2621440: 0, 3670016: 67109120, 4718592: 67108868, 5767168: 65536, 6815744: 65540, 7864320: 260, 8912896: 4, 9961472: 256, 11010048: 67174400, 12058624: 65796, 13107200: 65792, 14155776: 67109124, 15204352: 67174660, 16252928: 67108864, 16777216: 67174656, 17825792: 65540, 18874368: 65536, 19922944: 67109120, 20971520: 256, 22020096: 67174660, 23068672: 67108868, 24117248: 0, 25165824: 67109124, 26214400: 67108864, 27262976: 4, 28311552: 65792, 29360128: 67174400, 30408704: 260, 31457280: 65796, 32505856: 67174404, 17301504: 67108864, 18350080: 260, 19398656: 67174656, 20447232: 0, 21495808: 65540, 22544384: 67109120, 23592960: 256, 24641536: 67174404, 25690112: 65536, 26738688: 67174660, 27787264: 65796, 28835840: 67108868, 29884416: 67109124, 30932992: 67174400, 31981568: 4, 33030144: 65792 }, { 0: 2151682048, 65536: 2147487808, 131072: 4198464, 196608: 2151677952, 262144: 0, 327680: 4198400, 393216: 2147483712, 458752: 4194368, 524288: 2147483648, 589824: 4194304, 655360: 64, 720896: 2147487744, 786432: 2151678016, 851968: 4160, 917504: 4096, 983040: 2151682112, 32768: 2147487808, 98304: 64, 163840: 2151678016, 229376: 2147487744, 294912: 4198400, 360448: 2151682112, 425984: 0, 491520: 2151677952, 557056: 4096, 622592: 2151682048, 688128: 4194304, 753664: 4160, 819200: 2147483648, 884736: 4194368, 950272: 4198464, 1015808: 2147483712, 1048576: 4194368, 1114112: 4198400, 1179648: 2147483712, 1245184: 0, 1310720: 4160, 1376256: 2151678016, 1441792: 2151682048, 1507328: 2147487808, 1572864: 2151682112, 1638400: 2147483648, 1703936: 2151677952, 1769472: 4198464, 1835008: 2147487744, 1900544: 4194304, 1966080: 64, 2031616: 4096, 1081344: 2151677952, 1146880: 2151682112, 1212416: 0, 1277952: 4198400, 1343488: 4194368, 1409024: 2147483648, 1474560: 2147487808, 1540096: 64, 1605632: 2147483712, 1671168: 4096, 1736704: 2147487744, 1802240: 2151678016, 1867776: 4160, 1933312: 2151682048, 1998848: 4194304, 2064384: 4198464 }, { 0: 128, 4096: 17039360, 8192: 262144, 12288: 536870912, 16384: 537133184, 20480: 16777344, 24576: 553648256, 28672: 262272, 32768: 16777216, 36864: 537133056, 40960: 536871040, 45056: 553910400, 49152: 553910272, 53248: 0, 57344: 17039488, 61440: 553648128, 2048: 17039488, 6144: 553648256, 10240: 128, 14336: 17039360, 18432: 262144, 22528: 537133184, 26624: 553910272, 30720: 536870912, 34816: 537133056, 38912: 0, 43008: 553910400, 47104: 16777344, 51200: 536871040, 55296: 553648128, 59392: 16777216, 63488: 262272, 65536: 262144, 69632: 128, 73728: 536870912, 77824: 553648256, 81920: 16777344, 86016: 553910272, 90112: 537133184, 94208: 16777216, 98304: 553910400, 102400: 553648128, 106496: 17039360, 110592: 537133056, 114688: 262272, 118784: 536871040, 122880: 0, 126976: 17039488, 67584: 553648256, 71680: 16777216, 75776: 17039360, 79872: 537133184, 83968: 536870912, 88064: 17039488, 92160: 128, 96256: 553910272, 100352: 262272, 104448: 553910400, 108544: 0, 112640: 553648128, 116736: 16777344, 120832: 262144, 124928: 537133056, 129024: 536871040 }, { 0: 268435464, 256: 8192, 512: 270532608, 768: 270540808, 1024: 268443648, 1280: 2097152, 1536: 2097160, 1792: 268435456, 2048: 0, 2304: 268443656, 2560: 2105344, 2816: 8, 3072: 270532616, 3328: 2105352, 3584: 8200, 3840: 270540800, 128: 270532608, 384: 270540808, 640: 8, 896: 2097152, 1152: 2105352, 1408: 268435464, 1664: 268443648, 1920: 8200, 2176: 2097160, 2432: 8192, 2688: 268443656, 2944: 270532616, 3200: 0, 3456: 270540800, 3712: 2105344, 3968: 268435456, 4096: 268443648, 4352: 270532616, 4608: 270540808, 4864: 8200, 5120: 2097152, 5376: 268435456, 5632: 268435464, 5888: 2105344, 6144: 2105352, 6400: 0, 6656: 8, 6912: 270532608, 7168: 8192, 7424: 268443656, 7680: 270540800, 7936: 2097160, 4224: 8, 4480: 2105344, 4736: 2097152, 4992: 268435464, 5248: 268443648, 5504: 8200, 5760: 270540808, 6016: 270532608, 6272: 270540800, 6528: 270532616, 6784: 8192, 7040: 2105352, 7296: 2097160, 7552: 0, 7808: 268435456, 8064: 268443656 }, { 0: 1048576, 16: 33555457, 32: 1024, 48: 1049601, 64: 34604033, 80: 0, 96: 1, 112: 34603009, 128: 33555456, 144: 1048577, 160: 33554433, 176: 34604032, 192: 34603008, 208: 1025, 224: 1049600, 240: 33554432, 8: 34603009, 24: 0, 40: 33555457, 56: 34604032, 72: 1048576, 88: 33554433, 104: 33554432, 120: 1025, 136: 1049601, 152: 33555456, 168: 34603008, 184: 1048577, 200: 1024, 216: 34604033, 232: 1, 248: 1049600, 256: 33554432, 272: 1048576, 288: 33555457, 304: 34603009, 320: 1048577, 336: 33555456, 352: 34604032, 368: 1049601, 384: 1025, 400: 34604033, 416: 1049600, 432: 1, 448: 0, 464: 34603008, 480: 33554433, 496: 1024, 264: 1049600, 280: 33555457, 296: 34603009, 312: 1, 328: 33554432, 344: 1048576, 360: 1025, 376: 34604032, 392: 33554433, 408: 34603008, 424: 0, 440: 34604033, 456: 1049601, 472: 1024, 488: 33555456, 504: 1048577 }, { 0: 134219808, 1: 131072, 2: 134217728, 3: 32, 4: 131104, 5: 134350880, 6: 134350848, 7: 2048, 8: 134348800, 9: 134219776, 10: 133120, 11: 134348832, 12: 2080, 13: 0, 14: 134217760, 15: 133152, 2147483648: 2048, 2147483649: 134350880, 2147483650: 134219808, 2147483651: 134217728, 2147483652: 134348800, 2147483653: 133120, 2147483654: 133152, 2147483655: 32, 2147483656: 134217760, 2147483657: 2080, 2147483658: 131104, 2147483659: 134350848, 2147483660: 0, 2147483661: 134348832, 2147483662: 134219776, 2147483663: 131072, 16: 133152, 17: 134350848, 18: 32, 19: 2048, 20: 134219776, 21: 134217760, 22: 134348832, 23: 131072, 24: 0, 25: 131104, 26: 134348800, 27: 134219808, 28: 134350880, 29: 133120, 30: 2080, 31: 134217728, 2147483664: 131072, 2147483665: 2048, 2147483666: 134348832, 2147483667: 133152, 2147483668: 32, 2147483669: 134348800, 2147483670: 134217728, 2147483671: 134219808, 2147483672: 134350880, 2147483673: 134217760, 2147483674: 134219776, 2147483675: 0, 2147483676: 133120, 2147483677: 2080, 2147483678: 131104, 2147483679: 134350848 }] , h = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679] , n = r[_0x19c3("0xc2")] = t[_0x19c3("0x15")]({ _doReset: function() { for (var x = this[_0x19c3("0x40")][_0x19c3("0x16")], c = [], _ = 0; _ < 56; _++) { var t = a[_] - 1; c[_] = x[t >>> 5] >>> 31 - t % 32 & 1 } for (var r = this[_0x19c3("0xc3")] = [], n = 0; n < 16; n++) { var i = r[n] = [] , e = f[n]; for (_ = 0; _ < 24; _++) i[_ / 6 | 0] |= c[(s[_] - 1 + e) % 28] << 31 - _ % 6, i[4 + (_ / 6 | 0)] |= c[28 + (s[_ + 24] - 1 + e) % 28] << 31 - _ % 6; for (i[0] = i[0] << 1 | i[0] >>> 31, _ = 1; _ < 7; _++) i[_] = i[_] >>> 4 * (_ - 1) + 3; i[7] = i[7] << 5 | i[7] >>> 27 } var o = this._invSubKeys = []; for (_ = 0; _ < 16; _++) o[_] = r[15 - _] }, encryptBlock: function(x, c) { this._doCryptBlock(x, c, this[_0x19c3("0xc3")]) }, decryptBlock: function(x, c) { this[_0x19c3("0xc1")](x, c, this[_0x19c3("0xc4")]) }, _doCryptBlock: function(x, c, _) { this[_0x19c3("0xc5")] = x[c], this[_0x19c3("0xc6")] = x[c + 1], v[_0x19c3("0xd")](this, 4, 252645135), v.call(this, 16, 65535), d[_0x19c3("0xd")](this, 2, 858993459), d[_0x19c3("0xd")](this, 8, 16711935), v.call(this, 1, 1431655765); for (var t = 0; t < 16; t++) { for (var r = _[t], n = this[_0x19c3("0xc5")], i = this[_0x19c3("0xc6")], e = 0, o = 0; o < 8; o++) e |= u[o][((i ^ r[o]) & h[o]) >>> 0]; this._lBlock = i, this._rBlock = n ^ e } var a = this[_0x19c3("0xc5")]; this[_0x19c3("0xc5")] = this._rBlock, this[_0x19c3("0xc6")] = a, v[_0x19c3("0xd")](this, 1, 1431655765), d[_0x19c3("0xd")](this, 8, 16711935), d.call(this, 2, 858993459), v[_0x19c3("0xd")](this, 16, 65535), v.call(this, 4, 252645135), x[c] = this[_0x19c3("0xc5")], x[c + 1] = this[_0x19c3("0xc6")] }, keySize: 2, ivSize: 2, blockSize: 2 }); function v(x, c) { var _ = (this._lBlock >>> x ^ this[_0x19c3("0xc6")]) & c; this[_0x19c3("0xc6")] ^= _, this[_0x19c3("0xc5")] ^= _ << x } function d(x, c) { var _ = (this._rBlock >>> x ^ this[_0x19c3("0xc5")]) & c; this[_0x19c3("0xc5")] ^= _, this[_0x19c3("0xc6")] ^= _ << x } x[_0x19c3("0xc2")] = t[_0x19c3("0x79")](n); var i = r[_0x19c3("0xc7")] = t[_0x19c3("0x15")]({ _doReset: function() { var x = this[_0x19c3("0x40")].words; this._des1 = n[_0x19c3("0x52")](_[_0x19c3("0x7")](x[_0x19c3("0x1b")](0, 2))), this[_0x19c3("0xc8")] = n.createEncryptor(_[_0x19c3("0x7")](x.slice(2, 4))), this[_0x19c3("0xc9")] = n.createEncryptor(_[_0x19c3("0x7")](x[_0x19c3("0x1b")](4, 6))) }, encryptBlock: function(x, c) { this[_0x19c3("0xca")].encryptBlock(x, c), this[_0x19c3("0xc8")][_0x19c3("0xb5")](x, c), this[_0x19c3("0xc9")][_0x19c3("0x4d")](x, c) }, decryptBlock: function(x, c) { this[_0x19c3("0xc9")][_0x19c3("0xb5")](x, c), this[_0x19c3("0xc8")][_0x19c3("0x4d")](x, c), this[_0x19c3("0xca")][_0x19c3("0xb5")](x, c) }, keySize: 6, ivSize: 2, blockSize: 2 }); x.TripleDES = t[_0x19c3("0x79")](i) }(), e[_0x19c3("0xc7")]) } , function(x, c, _) { var i; x[_0x19c3("0x0")] = (i = _(0), _(3), _(4), _(2), _(1), function() { var x = i , c = x.lib[_0x19c3("0xcb")] , _ = x.algo , t = _[_0x19c3("0xcc")] = c[_0x19c3("0x15")]({ _doReset: function() { for (var x = this[_0x19c3("0x40")], c = x[_0x19c3("0x16")], _ = x[_0x19c3("0x17")], t = this._S = [], r = 0; r < 256; r++) t[r] = r; for (var n = r = 0; r < 256; r++) { var i = r % _ , e = c[i >>> 2] >>> 24 - i % 4 * 8 & 255; n = (n + t[r] + e) % 256; var o = t[r]; t[r] = t[n], t[n] = o } this._i = this._j = 0 }, _doProcessBlock: function(x, c) { x[c] ^= r[_0x19c3("0xd")](this) }, keySize: 8, ivSize: 0 }); function r() { for (var x = this._S, c = this._i, _ = this._j, t = 0, r = 0; r < 4; r++) { _ = (_ + x[c = (c + 1) % 256]) % 256; var n = x[c]; x[c] = x[_], x[_] = n, t |= x[(x[c] + x[_]) % 256] << 24 - 8 * r } return this._i = c, this._j = _, t } x[_0x19c3("0xcc")] = c[_0x19c3("0x79")](t); var n = _.RC4Drop = t.extend({ cfg: t.cfg[_0x19c3("0x15")]({ drop: 192 }), _doReset: function() { t[_0x19c3("0x41")].call(this); for (var x = this[_0x19c3("0x33")][_0x19c3("0xcd")]; 0 < x; x--) r.call(this) } }); x[_0x19c3("0xce")] = c._createHelper(n) }(), i[_0x19c3("0xcc")]) } , function(x, c, _) { var n; x[_0x19c3("0x0")] = (n = _(0), _(3), _(4), _(2), _(1), function() { var x = n , c = x.lib[_0x19c3("0xcb")] , _ = x[_0x19c3("0x39")] , r = [] , o = [] , a = [] , t = _[_0x19c3("0xcf")] = c.extend({ _doReset: function() { for (var x = this[_0x19c3("0x40")][_0x19c3("0x16")], c = this[_0x19c3("0x33")].iv, _ = 0; _ < 4; _++) x[_] = 16711935 & (x[_] << 8 | x[_] >>> 24) | 4278255360 & (x[_] << 24 | x[_] >>> 8); var t = this._X = [x[0], x[3] << 16 | x[2] >>> 16, x[1], x[0] << 16 | x[3] >>> 16, x[2], x[1] << 16 | x[0] >>> 16, x[3], x[2] << 16 | x[1] >>> 16] , r = this._C = [x[2] << 16 | x[2] >>> 16, 4294901760 & x[0] | 65535 & x[1], x[3] << 16 | x[3] >>> 16, 4294901760 & x[1] | 65535 & x[2], x[0] << 16 | x[0] >>> 16, 4294901760 & x[2] | 65535 & x[3], x[1] << 16 | x[1] >>> 16, 4294901760 & x[3] | 65535 & x[0]]; for (_ = this._b = 0; _ < 4; _++) u.call(this); for (_ = 0; _ < 8; _++) r[_] ^= t[_ + 4 & 7]; if (c) { var n = c.words , i = n[0] , e = n[1] , o = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8) , a = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8) , s = o >>> 16 | 4294901760 & a , f = a << 16 | 65535 & o; for (r[0] ^= o, r[1] ^= s, r[2] ^= a, r[3] ^= f, r[4] ^= o, r[5] ^= s, r[6] ^= a, r[7] ^= f, _ = 0; _ < 4; _++) u[_0x19c3("0xd")](this) } }, _doProcessBlock: function(x, c) { var _ = this._X; u[_0x19c3("0xd")](this), r[0] = _[0] ^ _[5] >>> 16 ^ _[3] << 16, r[1] = _[2] ^ _[7] >>> 16 ^ _[5] << 16, r[2] = _[4] ^ _[1] >>> 16 ^ _[7] << 16, r[3] = _[6] ^ _[3] >>> 16 ^ _[1] << 16; for (var t = 0; t < 4; t++) r[t] = 16711935 & (r[t] << 8 | r[t] >>> 24) | 4278255360 & (r[t] << 24 | r[t] >>> 8), x[c + t] ^= r[t] }, blockSize: 4, ivSize: 2 }); function u() { for (var x = this._X, c = this._C, _ = 0; _ < 8; _++) o[_] = c[_]; for (c[0] = c[0] + 1295307597 + this._b | 0, c[1] = c[1] + 3545052371 + (c[0] >>> 0 < o[0] >>> 0 ? 1 : 0) | 0, c[2] = c[2] + 886263092 + (c[1] >>> 0 < o[1] >>> 0 ? 1 : 0) | 0, c[3] = c[3] + 1295307597 + (c[2] >>> 0 < o[2] >>> 0 ? 1 : 0) | 0, c[4] = c[4] + 3545052371 + (c[3] >>> 0 < o[3] >>> 0 ? 1 : 0) | 0, c[5] = c[5] + 886263092 + (c[4] >>> 0 < o[4] >>> 0 ? 1 : 0) | 0, c[6] = c[6] + 1295307597 + (c[5] >>> 0 < o[5] >>> 0 ? 1 : 0) | 0, c[7] = c[7] + 3545052371 + (c[6] >>> 0 < o[6] >>> 0 ? 1 : 0) | 0, this._b = c[7] >>> 0 < o[7] >>> 0 ? 1 : 0, _ = 0; _ < 8; _++) { var t = x[_] + c[_] , r = 65535 & t , n = t >>> 16 , i = ((r * r >>> 17) + r * n >>> 15) + n * n , e = ((4294901760 & t) * t | 0) + ((65535 & t) * t | 0); a[_] = i ^ e } x[0] = a[0] + (a[7] << 16 | a[7] >>> 16) + (a[6] << 16 | a[6] >>> 16) | 0, x[1] = a[1] + (a[0] << 8 | a[0] >>> 24) + a[7] | 0, x[2] = a[2] + (a[1] << 16 | a[1] >>> 16) + (a[0] << 16 | a[0] >>> 16) | 0, x[3] = a[3] + (a[2] << 8 | a[2] >>> 24) + a[1] | 0, x[4] = a[4] + (a[3] << 16 | a[3] >>> 16) + (a[2] << 16 | a[2] >>> 16) | 0, x[5] = a[5] + (a[4] << 8 | a[4] >>> 24) + a[3] | 0, x[6] = a[6] + (a[5] << 16 | a[5] >>> 16) + (a[4] << 16 | a[4] >>> 16) | 0, x[7] = a[7] + (a[6] << 8 | a[6] >>> 24) + a[5] | 0 } x[_0x19c3("0xcf")] = c[_0x19c3("0x79")](t) }(), n[_0x19c3("0xcf")]) } , function(x, c, _) { var n; x[_0x19c3("0x0")] = (n = _(0), _(3), _(4), _(2), _(1), function() { var x = n , c = x.lib[_0x19c3("0xcb")] , _ = x[_0x19c3("0x39")] , r = [] , o = [] , a = [] , t = _[_0x19c3("0xd0")] = c[_0x19c3("0x15")]({ _doReset: function() { for (var x = this[_0x19c3("0x40")][_0x19c3("0x16")], c = this.cfg.iv, _ = this._X = [x[0], x[3] << 16 | x[2] >>> 16, x[1], x[0] << 16 | x[3] >>> 16, x[2], x[1] << 16 | x[0] >>> 16, x[3], x[2] << 16 | x[1] >>> 16], t = this._C = [x[2] << 16 | x[2] >>> 16, 4294901760 & x[0] | 65535 & x[1], x[3] << 16 | x[3] >>> 16, 4294901760 & x[1] | 65535 & x[2], x[0] << 16 | x[0] >>> 16, 4294901760 & x[2] | 65535 & x[3], x[1] << 16 | x[1] >>> 16, 4294901760 & x[3] | 65535 & x[0]], r = this._b = 0; r < 4; r++) u[_0x19c3("0xd")](this); for (r = 0; r < 8; r++) t[r] ^= _[r + 4 & 7]; if (c) { var n = c.words , i = n[0] , e = n[1] , o = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8) , a = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8) , s = o >>> 16 | 4294901760 & a , f = a << 16 | 65535 & o; for (t[0] ^= o, t[1] ^= s, t[2] ^= a, t[3] ^= f, t[4] ^= o, t[5] ^= s, t[6] ^= a, t[7] ^= f, r = 0; r < 4; r++) u[_0x19c3("0xd")](this) } }, _doProcessBlock: function(x, c) { var _ = this._X; u.call(this), r[0] = _[0] ^ _[5] >>> 16 ^ _[3] << 16, r[1] = _[2] ^ _[7] >>> 16 ^ _[5] << 16, r[2] = _[4] ^ _[1] >>> 16 ^ _[7] << 16, r[3] = _[6] ^ _[3] >>> 16 ^ _[1] << 16; for (var t = 0; t < 4; t++) r[t] = 16711935 & (r[t] << 8 | r[t] >>> 24) | 4278255360 & (r[t] << 24 | r[t] >>> 8), x[c + t] ^= r[t] }, blockSize: 4, ivSize: 2 }); function u() { for (var x = this._X, c = this._C, _ = 0; _ < 8; _++) o[_] = c[_]; for (c[0] = c[0] + 1295307597 + this._b | 0, c[1] = c[1] + 3545052371 + (c[0] >>> 0 < o[0] >>> 0 ? 1 : 0) | 0, c[2] = c[2] + 886263092 + (c[1] >>> 0 < o[1] >>> 0 ? 1 : 0) | 0, c[3] = c[3] + 1295307597 + (c[2] >>> 0 < o[2] >>> 0 ? 1 : 0) | 0, c[4] = c[4] + 3545052371 + (c[3] >>> 0 < o[3] >>> 0 ? 1 : 0) | 0, c[5] = c[5] + 886263092 + (c[4] >>> 0 < o[4] >>> 0 ? 1 : 0) | 0, c[6] = c[6] + 1295307597 + (c[5] >>> 0 < o[5] >>> 0 ? 1 : 0) | 0, c[7] = c[7] + 3545052371 + (c[6] >>> 0 < o[6] >>> 0 ? 1 : 0) | 0, this._b = c[7] >>> 0 < o[7] >>> 0 ? 1 : 0, _ = 0; _ < 8; _++) { var t = x[_] + c[_] , r = 65535 & t , n = t >>> 16 , i = ((r * r >>> 17) + r * n >>> 15) + n * n , e = ((4294901760 & t) * t | 0) + ((65535 & t) * t | 0); a[_] = i ^ e } x[0] = a[0] + (a[7] << 16 | a[7] >>> 16) + (a[6] << 16 | a[6] >>> 16) | 0, x[1] = a[1] + (a[0] << 8 | a[0] >>> 24) + a[7] | 0, x[2] = a[2] + (a[1] << 16 | a[1] >>> 16) + (a[0] << 16 | a[0] >>> 16) | 0, x[3] = a[3] + (a[2] << 8 | a[2] >>> 24) + a[1] | 0, x[4] = a[4] + (a[3] << 16 | a[3] >>> 16) + (a[2] << 16 | a[2] >>> 16) | 0, x[5] = a[5] + (a[4] << 8 | a[4] >>> 24) + a[3] | 0, x[6] = a[6] + (a[5] << 16 | a[5] >>> 16) + (a[4] << 16 | a[4] >>> 16) | 0, x[7] = a[7] + (a[6] << 8 | a[6] >>> 24) + a[5] | 0 } x.RabbitLegacy = c[_0x19c3("0x79")](t) }(), n[_0x19c3("0xd0")]) } , function(x, c) { x[_0x19c3("0x0")] = function t(x) { var c = {}; for (var _ in x) c[_] = x[_]; return c } } , function(x, c, _) { var r = _(11); x[_0x19c3("0x0")] = function(x) { try { var c = document[_0x19c3("0xd1")][_0x19c3("0xd2")] + _0x19c3("0xd3") + _0x19c3("0xd4") + (new Date)[_0x19c3("0x95")]() + _0x19c3("0xd5"); c += _0x19c3("0xd6") + x, c += _0x19c3("0xd7"), c += "&module=wapna", c += "&auto_statistic=" + r(_0x19c3("0xd8")), c += _0x19c3("0xd9"); var _ = new Image; _[_0x19c3("0xda")] = _[_0x19c3("0xdb")] = function() { _.onload = _[_0x19c3("0xdb")] = null, _ = null } , _[_0x19c3("0xdc")] = c } catch (t) {} } } , function(x, c) { var i = 0; function _(x) { return function r(x) { for (var c = i ? "0123456789ABCDEF" : "0123456789abcdef", _ = "", t = 0; t < 4 * x[_0x19c3("0x18")]; t++) _ += c[_0x19c3("0x6c")](x[t >> 2] >> 8 * (3 - t % 4) + 4 & 15) + c[_0x19c3("0x6c")](x[t >> 2] >> 8 * (3 - t % 4) & 15); return _ }(function p(x) { for (var c = x, _ = Array(80), t = 1732584193, r = -271733879, n = -1732584194, i = 271733878, e = -1009589776, o = 0; o < c[_0x19c3("0x18")]; o += 16) { for (var a = t, s = r, f = n, u = i, h = e, v = 0; v < 80; v++) { _[v] = v < 16 ? c[o + v] : g(_[v - 3] ^ _[v - 8] ^ _[v - 14] ^ _[v - 16], 1); var d = y(y(g(t, 5), b(v, r, n, i)), y(y(e, _[v]), (l = v) < 20 ? 1518500249 : l < 40 ? 1859775393 : l < 60 ? -1894007588 : -899497514)); e = i, i = n, n = g(r, 30), r = t, t = d } t = y(t, a), r = y(r, s), n = y(n, f), i = y(i, u), e = y(e, h) } var l; return new Array(t,r,n,i,e) }(function n(x) { for (var c = 1 + (x.length + 8 >> 6), _ = new Array(16 * c), t = 0; t < 16 * c; t++) _[t] = 0; for (t = 0; t < x[_0x19c3("0x18")]; t++) _[t >> 2] |= x[_0x19c3("0x23")](t) << 24 - 8 * (3 & t); return _[t >> 2] |= 128 << 24 - 8 * (3 & t), _[16 * c - 1] = 8 * x[_0x19c3("0x18")], _ }(x))) } function b(x, c, _, t) { return x < 20 ? c & _ | ~c & t : x < 40 ? c ^ _ ^ t : x < 60 ? c & _ | c & t | _ & t : c ^ _ ^ t } function y(x, c) { var _ = (65535 & x) + (65535 & c); return (x >> 16) + (c >> 16) + (_ >> 16) << 16 | 65535 & _ } function g(x, c) { return x << c | x >>> 32 - c } x[_0x19c3("0x0")] = _ } ])); function v3test(s_dv,s_name,s_code,s_verifystring){ x={ adapter: "", banner: "1", bdrefer: "", client: "", clientfrom: "", dv: s_dv, index: "", liveAbility: "", skin: "", subpro: "", suppcheck: "", tpl: "", type: "", userid: "", username: s_name, vcode: s_code, verifystring: s_verifystring }; c=undefined; var o = "OOOO00" , t = "OOO00O" , d = "OOO000" , e = "OOO0OO" , w = "O0OOO0" , c = { OOOOO0: o, O00000: t, O0O00O: d, O000OO: e, O0O000: w } , i = (new Date).getTime() / 1e3 s = parseInt(i / 86400, 10) % 5; //, h = c[Object.keys(c)[s]] || ""; switch (s) { case 0: _="moonshad5moonsh2"; break; case 1: _="moonshad3moonsh0"; break; case 2: _="moonshad8moonsh6"; break; case 3: _="moonshad0moonsh1"; break; case 4: _="moonshad1moonsh9"; break; } //_="moonshad1moonsh9"; return xxoo(x, c, _); } ================================================ FILE: 其他实战/【百度】网页找回密码/demo.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-12-23 Python: 3.7 import requests import re import time import random import os import sys import execjs.runtime_names from urllib import parse sys.path.append(os.path.abspath(os.path.dirname(os.path.dirname(__file__)))) from header import * class BaiDu: """ 百度找回密码 """ def __init__(self, username): print('引擎', execjs.get().name) with open("encryp.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) self.dv = '' self.username = username self.cookies = None def make_dv(self): """生成dv 参数 """ with open("dv.js", "r", encoding="utf-8") as f: js_dv = execjs.compile(f.read()) _time = int(round(time.time() * 1000)) / 1000 tk = "tk0.29" + str(random.randint(104771190122337, 904771190122337)) + str(_time * 1000) self.dv = js_dv.call('MakeDv', _time, tk) print('【生成dv】', self.dv) def get_bds_token(self): """ 第一次访问 取 bds_token :return: bds_token """ response = requests.get('https://passport.baidu.com/?getpassindex', headers=headers_bds_token) text = response.content.decode('utf-8') bds_token = re.search(r'"bdstoken" value="(.*?)"', text).group(1) print("【bds_token】:", bds_token) self.cookies = response.cookies return bds_token def get_verify_str(self): """ 第二次访问 取 verify_str :return: """ response = requests.get("https://passport.baidu.com/v2/?reggetcodestr&v=1574477016779&callback=bd__cbs__rgpbwl", headers=headers_verify_str, cookies=self.cookies) text = response.content.decode('utf-8') verify_str = re.search(r"verifystr:'(.*?)'", text).group(1) print('【verifystr】:', verify_str) return verify_str def get_img(self, verify_str): """ 第三补 请求图片 :return: """ response = requests.get('https://passport.baidu.com/cgi-bin/genimage?' + verify_str, cookies=self.cookies, headers=headers_img) with open('验证码.png', 'wb') as f: f.write(response.content) def get_token(self, bds_token, verify_str, code, _time, sig): """ 第四步 获取 Token :return: """ data = { "username": self.username, "veritycode": code, "captcha_str": verify_str, "bdstoken": bds_token, "tpl": '', "index": 'username', "countrycode": '', "alg": 'v2', "time": _time, "sig": parse.quote(sig), "dv": self.dv, } response = requests.post('https://passport.baidu.com/?getpassindex', data=data, headers=headers_token, cookies=self.cookies) text = response.content.decode('utf-8') if '频繁' in text: print('【错误:操作频繁】') elif '验证码有误' in text: print('【错误:验证码输错】') else: token = re.search(r"token = '(.*?)';", text).group(1) token = token.replace('\\', '') if token: print('【token】:', token) else: print(text) print('【错误】token 加载失败') exit() return token def get_phone(self, token): """ 第五步 获取电话 :return: """ url = 'https://passport.baidu.com/v2/sapi/authwidgetverify?authtoken=' + parse.quote( token) + '&type=&jsonp=1&apiver=v3&verifychannel=&action=getapi&vcode=&questionAndAnswer=&needsid=&rsakey=&countrycode=&u=https%3A%2F%2Fpassport.qatest.baidu.com%2F%3Fgetpassresetpwd&tpl=&winsdk=&authAction=&callback=bd__cbs__oeq73u' response = requests.get(url, cookies=self.cookies, headers=headers_get_phone) text = response.content.decode("utf-8") if '系统繁忙' in text: print('【错误:系统繁忙】') else: result = re.search('mobile":\'(.*?)\'.*?email":\'(.*?)\'', text) print('电话:', result.group(1)) print('邮箱:', result.group(2)) print(response.text) def js_call(self, bds_token, verify_str, code): """ 运行js V8 获取参数 :return: _time, sig """ result = self.js.call('zh', bds_token, verify_str, self.dv, self.username, code) _time, sig = result.split('|') print("【time】:", _time) print("【sig】:", sig) return _time, sig def start(self): """ 启动 :return: """ code = None self.make_dv() # dv 获取 bds_token = self.get_bds_token() # 1 verify_str = self.get_verify_str() # 2 self.get_img(verify_str) code = input('请输入验证码 (验证码图在目录下)>>>> ') print('【验证码】:', code) if code: # 账号处理 _time, sig = self.js_call(bds_token, verify_str, code) # 3 token = self.get_token(bds_token, verify_str, code, _time, sig) # 4 self.get_phone(token) # 5 if __name__ == '__main__': user = input('用户名') star = time.time() bd = BaiDu(user) bd.start() print('【执行时间】:', time.time() - star, '秒') ================================================ FILE: 其他实战/【百度】网页找回密码/dv.js ================================================ window = document = {}; e = {}; t = {}; function n(e) { var t = [[48, 57], [65, 90], [97, 122], [45, 45], [126, 126]] , n = o(t) , a = o(t.slice(1)); e && (n = r(n, e), a = r(a, e)), this.dict = n, this.dict2 = a } function r(e, t) { for (var n = t.split(""), r = 0; r < e.length; r++) { var o = r % n.length; o = n[o].charCodeAt(0), o %= e.length; var a = e[r]; e[r] = e[o], e[o] = a } return e } function o(e) { for (var t = [], n = 0; n < e.length; n++) for (var r = e[n][0]; r <= e[n][1]; r++) t.push(String.fromCharCode(r)); return t } function a(e, t) { var n = "" , r = Math.abs(parseInt(e)); if (r) for (; r;) n += t[r % t.length], r = parseInt(r / t.length); else n = t[0]; return n } function i() { if (M = !0, L = [], D = "number" == typeof F.SendInterval && F.SendInterval > 0 ? F.SendInterval : 1, k = F.ImgUrl, (1 & F.SendMethod) > 0) { var e = t.getElementById("dv_Input"); if (e) e.value = ""; else { var n = t.getElementById(F.FormId); n && (e = t.createElement("input"), e.type = "hidden", e.name = "dv", e.id = "dv_Input", n.insertBefore(e, n.firstChild)) } } (8 & F.SendMethod) > 0 && F.RecordStr && (F.RecordStr = "") } function d(e) { M && (x = e.token + "@" + S(e, e.token), (1 & F.SendMethod) > 0 && c(x)) } function c(n) { var r = t.getElementById("dv_Input"); r && (r.value = n), e.LG_DV_ARG.dvjsInput = n } function f() { var t, n, r, o, a = navigator.userAgent.toLowerCase(), i = function () { var t, n = e || this; return t = "object" == typeof n.onhelp ? "IExplorer" : "object" == typeof n.chrome ? "Chrome" : "object" == typeof n.InstallTrigger ? "Firefox" : "object" == typeof n.opera ? "Opera" : "An unknown browser" }; return o = (n = a.match(/maxthon[\/ ]([\d.]+)/i)) ? (t = 12, n[1]) : (n = a.match(/msie.*360se/i)) ? (t = 4, "-1") : (n = a.match(/msie.*360ee/i)) ? (t = 5, "-1") : (n = a.match(/se ([\d]+.[\w]*) metasr ([\d.]+)/i)) ? (t = 7, n[1]) : (n = a.match(/msie.*qihu theworld/i)) ? (t = 8, "-1") : (n = a.match(/tencenttraveler ([\d.]+)/i)) ? (t = 9, n[1]) : (n = a.match(/qqbrowser\/([\d.]+)/i)) ? (t = 10, n[1]) : (n = a.match(/msie ([\d.]+)/i)) ? (t = 1, n[1]) : (n = a.match(/firefox\/([\d.]+)/i)) ? (t = 3, n[1]) : (n = a.match(/Opera.+Version\/([\d.]+)/i)) ? (t = 6, n[1]) : (n = a.match(/opr\/([\d.]+)/i)) ? (t = 6, n[1]) : (n = a.match(/version\/([\d.]+).*safari/i)) ? (t = 11, n[1]) : (n = a.match(/chrome\/([\d.]+)/i)) ? (t = 2, n[1]) : (r = i(), t = r, "-1"), o = "-1" == o ? "an unknown version" : o.split(".")[0], [t, o] } function u() { var e = f() , t = navigator.platform || navigator.userAgent , n = t.match(/win/i) ? 1 : t.match(/linux/i) ? 2 : t.match(/Mac/i) ? 3 : t.match(/iPhone/i) ? 4 : t.match(/iPod/i) ? 5 : t.match(/iPad/i) ? 6 : 0; return [n, e].join(",") } function l() { return O } function v() { try { var n = e.mozInnerScreenY || e.screenTop , r = e.mozInnerScreenX || e.screenLeft; "undefined" == typeof n && (n = 0), "undefined" == typeof r && (r = 0); var o = t.body.clientWidth , a = t.body.clientHeight , i = e.screen.width , d = e.screen.height , c = e.screen.availWidth , f = (e.screen.availHeight, e.outerWidth) , u = e.outerHeight; return [n, r, o, a, i, d, c, f, u].join(",") } catch (l) { } } function s(n) { try { var r = "" , o = n || e.event , a = o.target || o.srcElement; if (a && a.id && (r = encodeURIComponent(a.id)), V++, 0 != F.RCMVEvent && A >= F.RCMVEvent) return; if (!(F.RCInterval > 0 && V == F.RCInterval)) return; var i, c; o.pageX ? (i = o.pageX, c = o.pageY) : (i = o.clientX + t.body.scrollLeft - t.body.clientLeft, c = o.clientY + t.body.scrollTop - t.body.clientTop); var r = "" , a = o.target || o.srcElement; a && a.id && (r = encodeURIComponent(a.id)); var f = (new Date).getTime() - q; w.mouseMove += [i, c, f, r].join(",") + "|", A++, V = 0, d(w) } catch (u) { } } function h(n) { try { if (F.RCMSEvent > 0 && j >= F.RCMSEvent) return; var r = n || e.event , o = r.pageX , a = r.pageY; void 0 == o && (o = r.clientX + t.body.scrollLeft, a = r.clientY + t.body.scrollTop); var i = r.target || r.srcElement , c = 0; "undefined" != typeof r.which && r.which <= 3 ? c = [9, 0, 1, 2][r.which] : "undefined" != typeof r.button && r.button <= 4 && (c = [9, 0, 2, 9, 1][r.button]); var f = ""; i && i.id && (f = encodeURIComponent(i.id)); var u = ""; if ("shape" != i.nodeName) for (var l = 0; l < F.EltAttrs.length; l++) { var v = i.getAttribute(F.EltAttrs[l]); v && (u = 0 == u.length ? F.EltAttrs[l] + "=" + encodeURIComponent(v) : u + "&" + F.EltAttrs[l] + "=" + encodeURIComponent(v)) } { var s = [o, a]; (new Date).getTime() - q } j++, w.mouseDown += [s[0], s[1], c, time, f, u].join(",") + "|", d(w) } catch (h) { } } function m(t) { try { if (F.RCKSEvent > 0 && G >= F.RCKSEvent) return; var n = t || e.event , r = n.target || n.srcElement , o = n.keyCode , a = 0; n.ctrlKey && 17 != o && (a += 1), n.altKey && 18 != o && (a += 2), n.shiftKey && 16 != o && (a += 4); var i = "null"; r && (i = r.id ? encodeURIComponent(r.id) : r.name ? encodeURIComponent(r.name) : i); for (var c = 0; c < F.ExcludeTarget.length; c++) if (F.ExcludeTarget[c] == i) return; var f = (new Date).getTime() - q; G++, w.keyDown += [o, a, i, f].join(",") + "|", d(w) } catch (u) { } } function p() { } function g(e, t) { return !e || 0 >= t ? void 0 : e.length <= t ? e : e.substr(0, length) } function E() { try { var n = t.referer; return !n && e.opener ? (n = e.opener.location, n || (n = "")) : n = "", [encodeURI(g(e.location.toString(), 50)), encodeURI(g(n.toString(), 50))].join(",") } catch (r) { } } function y() { X++; var e = "" , t = ""; try { e = p().getos(), t = p().getversion() } catch (n) { if (10 == X) return; return void setTimeout(y, 200) } return e + t } function I() { w.mouseDown = "", w.keyDown = "", w.mouseMove = "", 0 == _ && (_ = 1, i(), (2 & F.SendMethod) > 0 && setInterval(Y, F.SendTimer), w.version = l(), w.loadTime = q / 1e3, F.BrowserInfo && (w.browserInfo = u()), w.token = F.PageToken, F.Location && (w.location = E()), F.ScreenInfo && (w.screenInfo = v()), F.FlashInfo && (w.flashInfo = y()), d(w)) } function C(e) { var n = new Object; n.mousedown = h, n.keydown = m, n.mousemove = s, n.load = I, n.beforeunload = H, n.unload = H; var r = (e.document, function (e, t) { t.attachEvent ? t.attachEvent("on" + e, n[e], !1) : t.addEventListener && t.addEventListener(e, n[e], !1) } ) , o = function (e) { r(e, t) } , a = function (t) { r(t, e) }; U.add(I), F.EnableMCEvent && o("mousedown"), F.EnableKSEvent && o("keydown"), F.EnableMPEvent && o("mousemove"), (2 & F.SendMethod) > 0 && ("undefined" != typeof e.onbeforeunload && a("beforeunload"), "undefined" != typeof e.onunload && a("unload")) } function R() { if ("undefined" == typeof b) return 1; if ("number" != typeof b.Flag) return 1; var e = new Object; if ("undefined" != typeof b.FormId && "" != b.FormId && (e.FormId = b.FormId), "undefined" != typeof b.RecordStr && "" != b.RecordStr && (e.RecordStr = b.RecordStr), e.EnableKSEvent = b.Flag >> 1 & 1, e.EnableMCEvent = b.Flag >> 2 & 1, e.EnableMPEvent = b.Flag >> 3 & 1, e.RecordTimeInterval = b.Flag >> 6 & 1, e.BrowserInfo = b.Flag >> 7 & 1, e.LSIDInfo = b.Flag >> 10 & 1, e.Location = b.Flag >> 11 & 1, e.Token = b.Flag >> 12 & 1, e.ScreenInfo = b.Flag >> 13 & 1, e.FlashInfo = b.Flag >> 16 & 1, e.DVID = b.Flag >> 17 & 1, "string" == typeof b.Token ? e.PageToken = b.Token : e.Token = 0, e.ImgUrl = "string" == typeof b.ImgUrl ? b.ImgUrl : "", e.EltAttrs = [], "undefined" != typeof b.EltAttrs) for (var t = 0; t < b.EltAttrs.length; t++) e.EltAttrs.push(b.EltAttrs[t]); if (e.ExcludeTarget = [], "undefined" != typeof b.ExcludeTarget) for (var t = 0; t < b.ExcludeTarget.length; t++) e.ExcludeTarget.push(b.ExcludeTarget[t]); return e.RCInterval = "undefined" != typeof b.RCInterval && b.RCInterval > 0 ? b.RCInterval : 50, e.RCMSEvent = "undefined" != typeof b.RCMSEvent && b.RCMSEvent > 0 ? b.RCMSEvent : 5, e.RCKSEvent = "undefined" != typeof b.RCKSEvent && b.RCKSEvent > 0 ? b.RCKSEvent : 5, e.RCMVEvent = "undefined" != typeof b.RCMVEvent && b.RCMVEvent > 0 ? b.RCMVEvent : 5, e.RCFCEvent = "undefined" != typeof b.RCFCEvent && b.RCFCEvent > 0 ? b.RCFCEvent : 0, e.SendInterval = "undefined" != typeof b.SendInterval && b.SendInterval > 0 ? b.SendInterval : 1, e.SendMethod = "undefined" != typeof b.SendMethod && b.SendMethod > 0 ? b.SendMethod : 0, e.GYInterval = "undefined" != typeof b.GYInterval && b.GYInterval > 0 ? b.GYInterval : 50, e.RCGPEvent = "undefined" != typeof b.RCGPEvent && b.RCGPEvent > 0 ? b.RCGPEvent : 5, e.RCTVEvent = "undefined" != typeof b.RCTVEvent && b.RCTVEvent > 0 ? b.RCTVEvent : 5, e.SendMethod |= 1, e.DVHost = "string" == typeof b.DVHost ? b.DVHost : "passport.baidu.com", e.SendTimer = "number" == typeof b.SendTimer ? b.SendTimer : 1e3, F = e, F.BrowserInfo = !0, F.Location = !0, F.ScreenInfo = !0, F.FlashInfo = !0, F.LSIDInfo = !0, 0 } function S(e, t) { var r = new n(t) , o = { flashInfo: 0, mouseDown: 1, keyDown: 2, mouseMove: 3, version: 4, loadTime: 5, browserInfo: 6, token: 7, location: 8, screenInfo: 9 } , a = [r.iary([2])]; for (var i in e) { var d = e[i]; if (void 0 !== d && void 0 !== o[i]) { var c; "number" == typeof d ? (c = d >= 0 ? 1 : 2, d = r.int(d)) : "boolean" == typeof d ? (c = 3, d = r.int(d ? 1 : 0)) : "object" == typeof d && d instanceof Array ? (c = 4, d = r.bary(d)) : (c = 0, d = r.str(d + "")), d && a.push(r.iary([o[i], c, d.length]) + d) } } return a.join("") } "undefined" == typeof e.LG_DV_ARG && (e.LG_DV_ARG = { tpl: "pp" }); var b = e.LG_DV_ARG , w = {}; b.SendMethod = 9, b.ExcludeTarget = ["password"], b.Token = "tk" + Math.random() + (new Date).getTime(), b.RCMSEvent = 5, b.RCKSEvent = 5, b.RCMVEvent = 5, b.RCTVEvent = 5, b.RCFCEvent = 5, b.ImgUrl = "//baidu.com/error.jsonp?n=", b.Flag = parseInt("111111111111111111111111", 2); var T, M, i, D, F, k, c, d, u, f, v, l, A, V, s, j, h, L, G, m, p, E, y, _, I, U, C, R, K, P, B, l, Y, H, O = 26, X = 0; if (n.prototype = { "int": function (e) { return a(e, this.dict) }, iary: function (e) { for (var t = "", n = 0; n < e.length; n++) { var r = a(e[n], this.dict2); t += r.length > 1 ? r.length - 2 + r : r } return t }, bary: function (e) { for (var t = 0, n = {}, r = 0; r < e.length; r++) e[r] > t && (t = e[r], n[e[r]] = !0); var o = parseInt(t / 6); o += t % 6 ? 1 : 0; for (var a = "", r = 0; o > r; r++) { for (var i = 6 * r, d = 0, c = 0; 6 > c; c++) n[i] && (d += Math.pow(2, c)), i++; a += this.dict[d] } return a }, str: function (e) { for (var t = [], n = 0; n < e.length; n++) { var r = e.charCodeAt(n); r >= 1 && 127 >= r ? t.push(r) : r > 2047 ? (t.push(224 | r >> 12 & 15), t.push(128 | r >> 6 & 63), t.push(128 | r >> 0 & 63)) : (t.push(192 | r >> 6 & 31), t.push(128 | r >> 0 & 63)) } for (var o = "", n = 0, a = t.length; a > n;) { var i = t[n++]; if (n >= a) { o += this.dict[i >> 2], o += this.dict[(3 & i) << 4], o += "__"; break } var d = t[n++]; if (n >= a) { o += this.dict[i >> 2], o += this.dict[(3 & i) << 4 | (240 & d) >> 4], o += this.dict[(15 & d) << 2], o += "_"; break } var c = t[n++]; o += this.dict[i >> 2], o += this.dict[(3 & i) << 4 | (240 & d) >> 4], o += this.dict[(15 & d) << 2 | (192 & c) >> 6], o += this.dict[63 & c] } return o } }, !e.ncdvjs) { T = new RegExp("^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})Z$"); var q = (new Date).getTime(); A = 0, V = 0, j = 0, G = 0, _ = 0, U = function () { var n = [] , r = !1 , o = null , a = function (e, t) { try { e.apply(this, t || []) } catch (n) { } } , i = function () { r = !0; for (var e = 0; e < n.length; e++) a(n[e].fn, n[e].args || []); n = [] }; return this.setOnError = function (e) { return o = e, this } , this.add = function (e, t) { return r ? a(e, t) : n[n.length] = { fn: e, args: t }, this } , e.addEventListener ? t.addEventListener("DOMContentLoaded", function () { i() }, !1) : !function () { }(), this }(), K = function () { q = (new Date).getTime(), A = 0, V = 0, j = 0, G = 0, focus_count = 0, _ = 0, R(), I() } , P = function () { function n() { if (e.passportDm) { var t = { page: "nc", source: "nc", tpl: b.tpl }; e.passportDm.init(t) } } var r = t.getElementsByTagName("HEAD").item(0) , o = t.createElement("script"); o.type = "text/javascript", o.src = "//" + F.DVHost + "/static/passpc-base/js/dv/dm.min.js", r.appendChild(o), o.readyState ? o.onreadystatechange = function () { ("loaded" == o.readyState || "complete" == o.readyState) && (o.onreadystatechange = null, n()) } : o.onload = function () { n() } } , B = function () { e.ncdvjs = 1, 0 == R() && (C(e), b.attachEvents = C, b.reload = K) } , B(); var W = function () { // return t.getElementById("dv_Input") } , z = function () { }; z() } function MakeDv(NowTime, toK) { //顺序不能乱 e = { flashInfo: undefined, mouseDown: "593,252,0,[object HTMLInputElement],,|", //模拟鼠标按下的点 keyDown: "", mouseMove: "495,262,1721,content|720,279,3354,|692,259,13737,veritycode|", //模拟鼠标移动的点 version: 26, //固定 loadTime: NowTime, //13位时间戳后3位加个点。 browserInfo: "1,2,78",//浏览器版本 token: toK,////后面13位时间戳和前面的要对应 前面的0.29后面的随机生成 location: "https://passport.baidu.com/?getpassindex,undefined", screenInfo: "0,0,1903,651,1920,1080,1920,1920,1040" //模拟窗口大小等信息 }; return e.token + "@" + S(e, e.token); } // 调用方法:test1() ================================================ FILE: 其他实战/【百度】网页找回密码/encryp.js ================================================ window = {}; var _0xeaa3 = ['_keySchedule', '_invKeySchedule', '_doCryptBlock', '_createHelper', 'moonshadmoonshad', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', 'exports', 'call', 'defineProperty', 'undefined', 'toStringTag', 'Module', '__esModule', 'object', 'create', 'default', 'string', 'bind', 'prototype', 'hasOwnProperty', 'screen', 'width', 'height', 'alg', 'version', 'time', 'round', 'getTime', 'sig', 'traceid', 'encryption', 'moonshad', 'ajax', 'https://passport.baidu.com/v3/security/uploadLog', 'POST', 'application/json;\x20charset=utf-8', 'json', 'log', 'push', 'sort', 'length', 'join', 'split', 'substring', 'fromCharCode', 'charCodeAt', 'concat', '0123456789abcdef', 'charAt', 'Pass', 'function', 'amd', 'CryptoJS', 'lib', 'Base', 'mixIn', 'init', '$super', 'apply', 'extend', 'toString', 'WordArray', 'words', 'sigBytes', 'stringify', 'clamp', 'ceil', 'clone', 'slice', 'random', 'enc', 'Hex', 'substr', 'Latin1', 'Utf8', 'Malformed\x20UTF-8\x20data', 'parse', 'BufferedBlockAlgorithm', '_data', '_nDataBytes', 'blockSize', 'max', '_minBufferSize', 'min', '_doProcessBlock', 'splice', 'Hasher', 'cfg', 'reset', '_doReset', '_append', '_process', '_doFinalize', 'finalize', 'HMAC', 'algo', './core.min', './sha1.min', './hmac.min', 'MD5', 'EvpKDF', 'hasher', 'keySize', 'iterations', 'update', 'compute', 'Base64', '_map', '_reverseMap', 'indexOf', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', './evpkdf.min', 'Cipher', '_ENC_XFORM_MODE', '_DEC_XFORM_MODE', '_xformMode', '_key', 'encrypt', 'decrypt', 'StreamCipher', 'mode', 'BlockCipherMode', 'Encryptor', 'Decryptor', '_cipher', '_iv', 'CBC', '_prevBlock', 'encryptBlock', 'decryptBlock', 'pad', 'Pkcs7', 'BlockCipher', 'createEncryptor', 'createDecryptor', '_mode', '__creator', 'processBlock', 'padding', 'unpad', 'CipherParams', 'formatter', 'format', 'OpenSSL', 'ciphertext', 'salt', 'SerializableCipher', '_parse', 'kdf', 'PasswordBasedCipher', 'execute', 'ivSize', 'key', '_hasher', '_oKey', '_iKey', './cipher-core.min', 'ECB', './enc-base64.min', './md5.min', 'AES', '_nRounds', '_keyPriorReset']; (function(_0x43908c, _0x521867) { var _0x55beb7 = function(_0x253717) { while (--_0x253717) { _0x43908c['push'](_0x43908c['shift']()); } }; _0x55beb7(++_0x521867); } (_0xeaa3, 0x14c)); var _0x5c17 = function(_0x2918d4, _0x5a6245) { _0x2918d4 = _0x2918d4 - 0x0; var _0x13391e = _0xeaa3[_0x2918d4]; return _0x13391e; }; (function(_0x43c17c, _0x664c2d) { for (var _0x2e28db in _0x664c2d) _0x43c17c[_0x2e28db] = _0x664c2d[_0x2e28db]; } (window, function(_0x1803b4) { var _0xecf318 = {}; function _0xe9f535(_0x175f6e) { if (_0xecf318[_0x175f6e]) { return _0xecf318[_0x175f6e][_0x5c17('0x0')]; } var _0x3e2347 = _0xecf318[_0x175f6e] = { 'i': _0x175f6e, 'l': ![], 'exports': {} }; _0x1803b4[_0x175f6e][_0x5c17('0x1')](_0x3e2347[_0x5c17('0x0')], _0x3e2347, _0x3e2347[_0x5c17('0x0')], _0xe9f535); _0x3e2347['l'] = !![]; return _0x3e2347[_0x5c17('0x0')]; } _0xe9f535['m'] = _0x1803b4; _0xe9f535['c'] = _0xecf318; _0xe9f535['d'] = function(_0x1f8451, _0x5afcb2, _0x432f96) { if (!_0xe9f535['o'](_0x1f8451, _0x5afcb2)) { Object[_0x5c17('0x2')](_0x1f8451, _0x5afcb2, { 'enumerable': !![], 'get': _0x432f96 }); } }; _0xe9f535['r'] = function(_0x380c48) { if (typeof Symbol !== _0x5c17('0x3') && Symbol[_0x5c17('0x4')]) { Object[_0x5c17('0x2')](_0x380c48, Symbol[_0x5c17('0x4')], { 'value': _0x5c17('0x5') }); } Object[_0x5c17('0x2')](_0x380c48, _0x5c17('0x6'), { 'value': !![] }); }; _0xe9f535['t'] = function(_0x173f6b, _0xcb759) { if (_0xcb759 & 0x1) _0x173f6b = _0xe9f535(_0x173f6b); if (_0xcb759 & 0x8) return _0x173f6b; if (_0xcb759 & 0x4 && typeof _0x173f6b === _0x5c17('0x7') && _0x173f6b && _0x173f6b[_0x5c17('0x6')]) return _0x173f6b; var _0x3e6e2d = Object[_0x5c17('0x8')](null); _0xe9f535['r'](_0x3e6e2d); Object[_0x5c17('0x2')](_0x3e6e2d, _0x5c17('0x9'), { 'enumerable': !![], 'value': _0x173f6b }); if (_0xcb759 & 0x2 && typeof _0x173f6b != _0x5c17('0xa')) for (var _0x42f866 in _0x173f6b) _0xe9f535['d'](_0x3e6e2d, _0x42f866, function(_0x5ce0cd) { return _0x173f6b[_0x5ce0cd]; } [_0x5c17('0xb')](null, _0x42f866)); return _0x3e6e2d; }; _0xe9f535['n'] = function(_0x1c46a8) { var _0x27762e = _0x1c46a8 && _0x1c46a8[_0x5c17('0x6')] ? function getDefault() { return _0x1c46a8[_0x5c17('0x9')]; }: function getModuleExports() { return _0x1c46a8; }; _0xe9f535['d'](_0x27762e, 'a', _0x27762e); return _0x27762e; }; _0xe9f535['o'] = function(_0x3f845e, _0x1f8f3f) { return Object[_0x5c17('0xc')][_0x5c17('0xd')][_0x5c17('0x1')](_0x3f845e, _0x1f8f3f); }; _0xe9f535['p'] = ''; return _0xe9f535(_0xe9f535['s'] = 0x0); } ([function(_0x54dec2, _0x38423b, _0x4794a3) { var _0x33037a = _0x4794a3(0x1); function _0xaafd7a(_0x53730b, _0x5bdb4f) { var _0x3ed435 = _0x53730b || {}; _0x3ed435[_0x5c17('0x11')] = _0x33037a[_0x5c17('0x12')]; _0x3ed435[_0x5c17('0x13')] = Math[_0x5c17('0x14')](new Date()[_0x5c17('0x15')]() / 0x3e8); if (_0x3ed435[_0x5c17('0xd')](_0x5c17('0x16'))) { delete _0x3ed435[_0x5c17('0x16')]; } if (_0x3ed435[_0x5c17('0xd')](_0x5c17('0x17'))) { delete _0x3ed435[_0x5c17('0x17')]; } return { 'time': _0x3ed435[_0x5c17('0x13')], 'alg': _0x3ed435[_0x5c17('0x11')], 'sig': _0x33037a[_0x5c17('0x18')](_0x3ed435, _0x5bdb4f) }; } _0x38423b[_0x5c17('0x19')] = _0xaafd7a; xxoo = _0xaafd7a; }, function(_0x363e8e, _0x503786, _0x1678c3) { var _0x394c26 = _0x1678c3(0x2); var _0x531e93 = _0x1678c3(0x4); var _0x599e77 = _0x1678c3(0x5); _0x363e8e[_0x5c17('0x0')] = { 'version': 'v2', 'encryption': function(_0xbf07f5, _0x10fdb9) { var _0x5c6408 = _0x394c26(_0xbf07f5); if (_0x10fdb9 && _0x10fdb9[_0x5c17('0x1a')]) { try { _0x10fdb9[_0x5c17('0x1a')]({ 'url': _0x5c17('0x1b'), 'type': _0x5c17('0x1c'), 'data': { 'json': _0x5c6408, 'encryption': _0x599e77(_0x531e93(_0x5c6408)) }, 'contentType': _0x5c17('0x1d'), 'dataType': _0x5c17('0x1e') }); } catch(_0x4c8bd9) { console[_0x5c17('0x1f')](_0x4c8bd9); } } return _0x599e77(_0x531e93(_0x5c6408)); } }; }, function(_0x201e3f, _0x54fb3d, _0x31145a) { var _0x17e8ce = _0x31145a(0x3); var _0x3d7ddb = { 'a': '3', 'b': '4', 'c': '5', 'd': '9', 'e': '8', 'f': '7', 'g': '1', 'h': '2', 'i': '6', 'j': '0', 'k': 'a', 'l': 'b', 'm': 'c', 'n': 'd', 'o': 'e', 'p': 'f', 'q': 'g', 'r': 'z', 's': 'y', 't': 'x', 'u': 'w', 'v': 'v', 'w': 'u', 'x': 'o', 'y': 'p', 'z': 'q', 0 : 's', 1 : 't', 2 : 'r', 3 : 'h', 4 : 'i', 5 : 'j', 6 : 'k', 7 : 'l', 8 : 'm', 9 : 'n' }; _0x201e3f[_0x5c17('0x0')] = function(_0x34dd8c) { var _0xcd0301 = []; for (var _0x483a88 in _0x34dd8c) { if (_0x34dd8c[_0x5c17('0xd')](_0x483a88)) { _0xcd0301[_0x5c17('0x20')](_0x483a88); } } _0xcd0301[_0x5c17('0x21')](); var _0x4784a1 = []; for (var _0x562bfe = 0x0, _0x543b9e = _0xcd0301[_0x5c17('0x22')]; _0x562bfe < _0x543b9e; _0x562bfe++) { var _0x34133b = _0xcd0301[_0x562bfe]; _0x4784a1[_0x5c17('0x20')](_0x34133b + '=' + _0x34dd8c[_0x34133b]); } var _0x3054cb = _0x17e8ce(_0x4784a1[_0x5c17('0x23')]('&')); var _0x22a66a = ''; var _0x19c386 = _0x342595[_0x5c17('0x24')](''); for (_0x562bfe = 0x0; _0x562bfe < _0x19c386[_0x5c17('0x22')]; _0x562bfe++) { _0x22a66a += _0x3d7ddb[_0x19c386[_0x562bfe]]; } return _0x241bfb(_0x3054cb, _0x22a66a); }; function _0x241bfb(_0x4b518a, _0x2b5455) { var _0x221bfb = ''; var _0x30e98a; var _0x15947d = _0x4b518a[_0x5c17('0x24')](''); var _0x409f59 = _0x2b5455[_0x5c17('0x24')](''); if (_0x15947d[_0x5c17('0x22')] >= _0x409f59[_0x5c17('0x22')]) { for (_0x30e98a = 0x0; _0x30e98a < _0x409f59[_0x5c17('0x22')]; _0x30e98a++) { _0x221bfb += _0x15947d[_0x30e98a] + _0x409f59[_0x30e98a]; } _0x221bfb += _0x4b518a[_0x5c17('0x25')](_0x30e98a); } else { for (_0x30e98a = 0x0; _0x30e98a < _0x15947d[_0x5c17('0x22')]; _0x30e98a++) { _0x221bfb += _0x15947d[_0x30e98a] + _0x409f59[_0x30e98a]; } _0x221bfb += _0x2b5455[_0x5c17('0x25')](_0x30e98a); } return _0x221bfb; } }, function(_0x4a9c66, _0xb4e79e) { function _0x2f085d(_0x983486, _0x2a1cfc) { var _0x4f40c2 = (_0x983486 & 0xffff) + (_0x2a1cfc & 0xffff), _0x219fde = (_0x983486 >> 0x10) + (_0x2a1cfc >> 0x10) + (_0x4f40c2 >> 0x10); return _0x219fde << 0x10 | _0x4f40c2 & 0xffff; } function _0x4d6b76(_0x51d502, _0x1c3ad7) { return _0x51d502 << _0x1c3ad7 | _0x51d502 >>> 0x20 - _0x1c3ad7; } function _0x3b88e1(_0x24aaf2, _0x3d6d1e, _0x3c3773, _0x37b66f, _0x226bbc, _0x5ef95d) { return _0x2f085d(_0x4d6b76(_0x2f085d(_0x2f085d(_0x3d6d1e, _0x24aaf2), _0x2f085d(_0x37b66f, _0x5ef95d)), _0x226bbc), _0x3c3773); } function _0x4fe096(_0x366642, _0x3bffde, _0x3b4d9c, _0x1a4cb6, _0x62c8e2, _0x4aa5cf, _0x37e7f8) { return _0x3b88e1(_0x3bffde & _0x3b4d9c | ~_0x3bffde & _0x1a4cb6, _0x366642, _0x3bffde, _0x62c8e2, _0x4aa5cf, _0x37e7f8); } function _0x39c6c2(_0x462ab2, _0x2f87a4, _0x5b41a1, _0x2985b7, _0x357be0, _0x3040a6, _0x56e202) { return _0x3b88e1(_0x2f87a4 & _0x2985b7 | _0x5b41a1 & ~_0x2985b7, _0x462ab2, _0x2f87a4, _0x357be0, _0x3040a6, _0x56e202); } function _0x225461(_0x5d9a0a, _0x3dff90, _0x565581, _0x2428af, _0x281ceb, _0x2de30d, _0x3dc980) { return _0x3b88e1(_0x3dff90 ^ _0x565581 ^ _0x2428af, _0x5d9a0a, _0x3dff90, _0x281ceb, _0x2de30d, _0x3dc980); } function _0x184b61(_0x1ad69c, _0x378619, _0x4372c6, _0x1409c5, _0x47d5e9, _0xced5f2, _0x3e58d1) { return _0x3b88e1(_0x4372c6 ^ (_0x378619 | ~_0x1409c5), _0x1ad69c, _0x378619, _0x47d5e9, _0xced5f2, _0x3e58d1); } function _0x3b130b(_0xc519bc, _0x536f44) { _0xc519bc[_0x536f44 >> 0x5] |= 0x80 << _0x536f44 % 0x20; _0xc519bc[(_0x536f44 + 0x40 >>> 0x9 << 0x4) + 0xe] = _0x536f44; var _0x1eb61b, _0x272174, _0x1200fb, _0x5644a9, _0x2075bf, _0xc4ad8e = 0x67452301, _0x2c335f = -0x10325477, _0x4dd794 = -0x67452302, _0x52d427 = 0x10325476; for (_0x1eb61b = 0x0; _0x1eb61b < _0xc519bc[_0x5c17('0x22')]; _0x1eb61b += 0x10) { _0x272174 = _0xc4ad8e; _0x1200fb = _0x2c335f; _0x5644a9 = _0x4dd794; _0x2075bf = _0x52d427; _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b], 0x7, -0x28955b88); _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x1], 0xc, -0x173848aa); _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x2], 0x11, 0x242070db); _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x3], 0x16, -0x3e423112); _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x4], 0x7, -0xa83f051); _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x5], 0xc, 0x4787c62a); _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x6], 0x11, -0x57cfb9ed); _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x7], 0x16, -0x2b96aff); _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x8], 0x7, 0x698098d8); _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x9], 0xc, -0x74bb0851); _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xa], 0x11, -0xa44f); _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xb], 0x16, -0x76a32842); _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xc], 0x7, 0x6b901122); _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xd], 0xc, -0x2678e6d); _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xe], 0x11, -0x5986bc72); _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xf], 0x16, 0x49b40821); _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x1], 0x5, -0x9e1da9e); _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x6], 0x9, -0x3fbf4cc0); _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xb], 0xe, 0x265e5a51); _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b], 0x14, -0x16493856); _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x5], 0x5, -0x29d0efa3); _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xa], 0x9, 0x2441453); _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xf], 0xe, -0x275e197f); _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x4], 0x14, -0x182c0438); _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x9], 0x5, 0x21e1cde6); _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xe], 0x9, -0x3cc8f82a); _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x3], 0xe, -0xb2af279); _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x8], 0x14, 0x455a14ed); _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xd], 0x5, -0x561c16fb); _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x2], 0x9, -0x3105c08); _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x7], 0xe, 0x676f02d9); _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xc], 0x14, -0x72d5b376); _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x5], 0x4, -0x5c6be); _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x8], 0xb, -0x788e097f); _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xb], 0x10, 0x6d9d6122); _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xe], 0x17, -0x21ac7f4); _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x1], 0x4, -0x5b4115bc); _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x4], 0xb, 0x4bdecfa9); _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x7], 0x10, -0x944b4a0); _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xa], 0x17, -0x41404390); _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xd], 0x4, 0x289b7ec6); _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b], 0xb, -0x155ed806); _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x3], 0x10, -0x2b10cf7b); _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x6], 0x17, 0x4881d05); _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x9], 0x4, -0x262b2fc7); _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xc], 0xb, -0x1924661b); _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xf], 0x10, 0x1fa27cf8); _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x2], 0x17, -0x3b53a99b); _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b], 0x6, -0xbd6ddbc); _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x7], 0xa, 0x432aff97); _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xe], 0xf, -0x546bdc59); _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x5], 0x15, -0x36c5fc7); _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xc], 0x6, 0x655b59c3); _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x3], 0xa, -0x70f3336e); _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xa], 0xf, -0x100b83); _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x1], 0x15, -0x7a7ba22f); _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x8], 0x6, 0x6fa87e4f); _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xf], 0xa, -0x1d31920); _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x6], 0xf, -0x5cfebcec); _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xd], 0x15, 0x4e0811a1); _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x4], 0x6, -0x8ac817e); _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xb], 0xa, -0x42c50dcb); _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x2], 0xf, 0x2ad7d2bb); _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x9], 0x15, -0x14792c6f); _0xc4ad8e = _0x2f085d(_0xc4ad8e, _0x272174); _0x2c335f = _0x2f085d(_0x2c335f, _0x1200fb); _0x4dd794 = _0x2f085d(_0x4dd794, _0x5644a9); _0x52d427 = _0x2f085d(_0x52d427, _0x2075bf); } return [_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427]; } function _0x5e828c(_0xb48cf1) { var _0x46cdd5, _0x775955 = ''; for (_0x46cdd5 = 0x0; _0x46cdd5 < _0xb48cf1[_0x5c17('0x22')] * 0x20; _0x46cdd5 += 0x8) { _0x775955 += String[_0x5c17('0x26')](_0xb48cf1[_0x46cdd5 >> 0x5] >>> _0x46cdd5 % 0x20 & 0xff); } return _0x775955; } function _0x2ce6c4(_0xd6dfa) { var _0x4c787c, _0xb5a93a = []; _0xb5a93a[(_0xd6dfa[_0x5c17('0x22')] >> 0x2) - 0x1] = undefined; for (_0x4c787c = 0x0; _0x4c787c < _0xb5a93a[_0x5c17('0x22')]; _0x4c787c += 0x1) { _0xb5a93a[_0x4c787c] = 0x0; } for (_0x4c787c = 0x0; _0x4c787c < _0xd6dfa[_0x5c17('0x22')] * 0x8; _0x4c787c += 0x8) { _0xb5a93a[_0x4c787c >> 0x5] |= (_0xd6dfa[_0x5c17('0x27')](_0x4c787c / 0x8) & 0xff) << _0x4c787c % 0x20; } return _0xb5a93a; } function _0xeb07c8(_0x4c2541) { return _0x5e828c(_0x3b130b(_0x2ce6c4(_0x4c2541), _0x4c2541[_0x5c17('0x22')] * 0x8)); } function _0x19f155(_0x4fdfa9, _0x5be405) { var _0xda4222, _0x47952f = _0x2ce6c4(_0x4fdfa9), _0x45d42e = [], _0x2a884c = [], _0x383fb6; _0x45d42e[0xf] = _0x2a884c[0xf] = undefined; if (_0x47952f[_0x5c17('0x22')] > 0x10) { _0x47952f = _0x3b130b(_0x47952f, _0x4fdfa9[_0x5c17('0x22')] * 0x8); } for (_0xda4222 = 0x0; _0xda4222 < 0x10; _0xda4222 += 0x1) { _0x45d42e[_0xda4222] = _0x47952f[_0xda4222] ^ 0x36363636; _0x2a884c[_0xda4222] = _0x47952f[_0xda4222] ^ 0x5c5c5c5c; } _0x383fb6 = _0x3b130b(_0x45d42e[_0x5c17('0x28')](_0x2ce6c4(_0x5be405)), 0x200 + _0x5be405[_0x5c17('0x22')] * 0x8); return _0x5e828c(_0x3b130b(_0x2a884c[_0x5c17('0x28')](_0x383fb6), 0x200 + 0x80)); } function _0x2ec482(_0x2125ec) { var _0x25d5c2 = _0x5c17('0x29'), _0x44ff8d = '', _0x14bca0, _0xd226f9; for (_0xd226f9 = 0x0; _0xd226f9 < _0x2125ec[_0x5c17('0x22')]; _0xd226f9 += 0x1) { _0x14bca0 = _0x2125ec[_0x5c17('0x27')](_0xd226f9); _0x44ff8d += _0x25d5c2[_0x5c17('0x2a')](_0x14bca0 >>> 0x4 & 0xf) + _0x25d5c2[_0x5c17('0x2a')](_0x14bca0 & 0xf); } return _0x44ff8d; } function _0x2408fe(_0x57e352) { return unescape(encodeURIComponent(_0x57e352)); } function _0x213b1d(_0x59b900) { return _0xeb07c8(_0x2408fe(_0x59b900)); } function _0x19c6c8(_0x389df0) { return _0x2ec482(_0x213b1d(_0x389df0)); } function _0x3bbbba(_0x159b47, _0x34e632) { return _0x19f155(_0x2408fe(_0x159b47), _0x2408fe(_0x34e632)); } function _0x2ae50b(_0x4bfa50, _0x16cbfe) { return _0x2ec482(_0x3bbbba(_0x4bfa50, _0x16cbfe)); } function _0x55a320(_0x9a8c19, _0x547222, _0x326248) { if (!_0x547222) { if (!_0x326248) { return _0x19c6c8(_0x9a8c19); } return _0x213b1d(_0x9a8c19); } if (!_0x326248) { return _0x2ae50b(_0x547222, _0x9a8c19); } return _0x3bbbba(_0x547222, _0x9a8c19); } _0x4a9c66[_0x5c17('0x0')] = _0x55a320; }, function(_0x13d108, _0x1f6ddf) { var _0x1f8dc9 = typeof window[_0x5c17('0x2b')] === _0x5c17('0x3') ? {}: window[_0x5c17('0x2b')]; (function() { var _0x5cd7d6 = null; var _0x2a86b9 = null; var _0x1f6ddf = undefined; ! function(_0x957762, _0xe6ca09) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0xe6ca09() : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([], _0xe6ca09) : _0x957762[_0x5c17('0x2e')] = _0xe6ca09(); } (this, function() { var _0x5a3970 = _0x5a3970 || function(_0x37accf, _0x1347a8) { var _0x595369 = Object[_0x5c17('0x8')] || function() { function _0x37accf() {} return function(_0x54a072) { var _0x595369; return _0x37accf[_0x5c17('0xc')] = _0x54a072, _0x595369 = new _0x37accf(), _0x37accf[_0x5c17('0xc')] = null, _0x595369; }; } (), _0x4afd42 = {}, _0x2027a0 = _0x4afd42[_0x5c17('0x2f')] = {}, _0x23f6d9 = _0x2027a0[_0x5c17('0x30')] = function() { return { 'extend': function(_0x2ad977) { var _0x1347a8 = _0x595369(this); return _0x2ad977 && _0x1347a8[_0x5c17('0x31')](_0x2ad977), _0x1347a8[_0x5c17('0xd')](_0x5c17('0x32')) && this[_0x5c17('0x32')] !== _0x1347a8[_0x5c17('0x32')] || (_0x1347a8[_0x5c17('0x32')] = function() { _0x1347a8[_0x5c17('0x33')][_0x5c17('0x32')][_0x5c17('0x34')](this, arguments); }), _0x1347a8[_0x5c17('0x32')][_0x5c17('0xc')] = _0x1347a8, _0x1347a8[_0x5c17('0x33')] = this, _0x1347a8; }, 'create': function() { var _0x37accf = this[_0x5c17('0x35')](); return _0x37accf[_0x5c17('0x32')][_0x5c17('0x34')](_0x37accf, arguments), _0x37accf; }, 'init': function() {}, 'mixIn': function(_0x4556ab) { for (var _0x1347a8 in _0x4556ab) _0x4556ab[_0x5c17('0xd')](_0x1347a8) && (this[_0x1347a8] = _0x4556ab[_0x1347a8]); _0x4556ab[_0x5c17('0xd')](_0x5c17('0x36')) && (this[_0x5c17('0x36')] = _0x4556ab[_0x5c17('0x36')]); }, 'clone': function() { return this[_0x5c17('0x32')][_0x5c17('0xc')][_0x5c17('0x35')](this); } }; } (), _0x2753bd = _0x2027a0[_0x5c17('0x37')] = _0x23f6d9[_0x5c17('0x35')]({ 'init': function(_0x1e49b8, _0x1eea41) { _0x1e49b8 = this[_0x5c17('0x38')] = _0x1e49b8 || [], _0x1eea41 != _0x1347a8 ? this[_0x5c17('0x39')] = _0x1eea41: this[_0x5c17('0x39')] = 0x4 * _0x1e49b8[_0x5c17('0x22')]; }, 'toString': function(_0x2ee436) { return (_0x2ee436 || _0x5befb8)[_0x5c17('0x3a')](this); }, 'concat': function(_0x1fc954) { var _0x1347a8 = this[_0x5c17('0x38')], _0x595369 = _0x1fc954[_0x5c17('0x38')], _0x4afd42 = this[_0x5c17('0x39')], _0x2027a0 = _0x1fc954[_0x5c17('0x39')]; if (this[_0x5c17('0x3b')](), _0x4afd42 % 0x4) for (var _0x23f6d9 = 0x0; _0x23f6d9 < _0x2027a0; _0x23f6d9++) { var _0x2753bd = _0x595369[_0x23f6d9 >>> 0x2] >>> 0x18 - _0x23f6d9 % 0x4 * 0x8 & 0xff; _0x1347a8[_0x4afd42 + _0x23f6d9 >>> 0x2] |= _0x2753bd << 0x18 - (_0x4afd42 + _0x23f6d9) % 0x4 * 0x8; } else for (var _0x23f6d9 = 0x0; _0x23f6d9 < _0x2027a0; _0x23f6d9 += 0x4) _0x1347a8[_0x4afd42 + _0x23f6d9 >>> 0x2] = _0x595369[_0x23f6d9 >>> 0x2]; return this[_0x5c17('0x39')] += _0x2027a0, this; }, 'clamp': function() { var _0x1347a8 = this[_0x5c17('0x38')], _0x595369 = this[_0x5c17('0x39')]; _0x1347a8[_0x595369 >>> 0x2] &= 0xffffffff << 0x20 - _0x595369 % 0x4 * 0x8, _0x1347a8[_0x5c17('0x22')] = _0x37accf[_0x5c17('0x3c')](_0x595369 / 0x4); }, 'clone': function() { var _0x37accf = _0x23f6d9[_0x5c17('0x3d')][_0x5c17('0x1')](this); return _0x37accf[_0x5c17('0x38')] = this[_0x5c17('0x38')][_0x5c17('0x3e')](0x0), _0x37accf; }, 'random': function(_0xe1034d) { for (var _0x595369, _0x4afd42 = [], _0x2027a0 = function(_0x5c4cc1) { var _0x5c4cc1 = _0x5c4cc1, _0x595369 = 0x3ade68b1, _0x4afd42 = 0xffffffff; return function() { _0x595369 = 0x9069 * (0xffff & _0x595369) + (_0x595369 >> 0x10) & _0x4afd42, _0x5c4cc1 = 0x4650 * (0xffff & _0x5c4cc1) + (_0x5c4cc1 >> 0x10) & _0x4afd42; var _0x2027a0 = (_0x595369 << 0x10) + _0x5c4cc1 & _0x4afd42; return _0x2027a0 /= 0x100000000, _0x2027a0 += 0.5, _0x2027a0 * (_0x37accf[_0x5c17('0x3f')]() > 0.5 ? 0x1: -0x1); }; }, _0x23f6d9 = 0x0; _0x23f6d9 < _0xe1034d; _0x23f6d9 += 0x4) { var _0x4da57e = _0x2027a0(0x100000000 * (_0x595369 || _0x37accf[_0x5c17('0x3f')]())); _0x595369 = 0x3ade67b7 * _0x4da57e(), _0x4afd42[_0x5c17('0x20')](0x100000000 * _0x4da57e() | 0x0); } return new _0x2753bd[(_0x5c17('0x32'))](_0x4afd42, _0xe1034d); } }), _0x4da57e = _0x4afd42[_0x5c17('0x40')] = {}, _0x5befb8 = _0x4da57e[_0x5c17('0x41')] = { 'stringify': function(_0x327470) { for (var _0x1347a8 = _0x327470[_0x5c17('0x38')], _0x595369 = _0x327470[_0x5c17('0x39')], _0x4afd42 = [], _0x2027a0 = 0x0; _0x2027a0 < _0x595369; _0x2027a0++) { var _0x23f6d9 = _0x1347a8[_0x2027a0 >>> 0x2] >>> 0x18 - _0x2027a0 % 0x4 * 0x8 & 0xff; _0x4afd42[_0x5c17('0x20')]((_0x23f6d9 >>> 0x4)[_0x5c17('0x36')](0x10)), _0x4afd42[_0x5c17('0x20')]((0xf & _0x23f6d9)[_0x5c17('0x36')](0x10)); } return _0x4afd42[_0x5c17('0x23')](''); }, 'parse': function(_0x5d272) { for (var _0x1347a8 = _0x5d272[_0x5c17('0x22')], _0x595369 = [], _0x4afd42 = 0x0; _0x4afd42 < _0x1347a8; _0x4afd42 += 0x2) _0x595369[_0x4afd42 >>> 0x3] |= parseInt(_0x5d272[_0x5c17('0x42')](_0x4afd42, 0x2), 0x10) << 0x18 - _0x4afd42 % 0x8 * 0x4; return new _0x2753bd[(_0x5c17('0x32'))](_0x595369, _0x1347a8 / 0x2); } }, _0x59605f = _0x4da57e[_0x5c17('0x43')] = { 'stringify': function(_0x22db6e) { for (var _0x1347a8 = _0x22db6e[_0x5c17('0x38')], _0x595369 = _0x22db6e[_0x5c17('0x39')], _0x4afd42 = [], _0x2027a0 = 0x0; _0x2027a0 < _0x595369; _0x2027a0++) { var _0x23f6d9 = _0x1347a8[_0x2027a0 >>> 0x2] >>> 0x18 - _0x2027a0 % 0x4 * 0x8 & 0xff; _0x4afd42[_0x5c17('0x20')](String[_0x5c17('0x26')](_0x23f6d9)); } return _0x4afd42[_0x5c17('0x23')](''); }, 'parse': function(_0x8e1876) { for (var _0x1347a8 = _0x8e1876[_0x5c17('0x22')], _0x595369 = [], _0x4afd42 = 0x0; _0x4afd42 < _0x1347a8; _0x4afd42++) _0x595369[_0x4afd42 >>> 0x2] |= (0xff & _0x8e1876[_0x5c17('0x27')](_0x4afd42)) << 0x18 - _0x4afd42 % 0x4 * 0x8; return new _0x2753bd[(_0x5c17('0x32'))](_0x595369, _0x1347a8); } }, _0x3021fa = _0x4da57e[_0x5c17('0x44')] = { 'stringify': function(_0x173e56) { try { return decodeURIComponent(escape(_0x59605f[_0x5c17('0x3a')](_0x173e56))); } catch(_0x52bba9) { throw new Error(_0x5c17('0x45')); } }, 'parse': function(_0x1802e8) { return _0x59605f[_0x5c17('0x46')](unescape(encodeURIComponent(_0x1802e8))); } }, _0x3508b4 = _0x2027a0[_0x5c17('0x47')] = _0x23f6d9[_0x5c17('0x35')]({ 'reset': function() { this[_0x5c17('0x48')] = new _0x2753bd[(_0x5c17('0x32'))](), this[_0x5c17('0x49')] = 0x0; }, '_append': function(_0x22be3d) { _0x5c17('0xa') == typeof _0x22be3d && (_0x22be3d = _0x3021fa[_0x5c17('0x46')](_0x22be3d)), this[_0x5c17('0x48')][_0x5c17('0x28')](_0x22be3d), this[_0x5c17('0x49')] += _0x22be3d[_0x5c17('0x39')]; }, '_process': function(_0x54afa7) { var _0x595369 = this[_0x5c17('0x48')], _0x4afd42 = _0x595369[_0x5c17('0x38')], _0x2027a0 = _0x595369[_0x5c17('0x39')], _0x23f6d9 = this[_0x5c17('0x4a')], _0x4da57e = 0x4 * _0x23f6d9, _0x5befb8 = _0x2027a0 / _0x4da57e; _0x5befb8 = _0x54afa7 ? _0x37accf[_0x5c17('0x3c')](_0x5befb8) : _0x37accf[_0x5c17('0x4b')]((0x0 | _0x5befb8) - this[_0x5c17('0x4c')], 0x0); var _0x59605f = _0x5befb8 * _0x23f6d9, _0x3021fa = _0x37accf[_0x5c17('0x4d')](0x4 * _0x59605f, _0x2027a0); if (_0x59605f) { for (var _0x3508b4 = 0x0; _0x3508b4 < _0x59605f; _0x3508b4 += _0x23f6d9) this[_0x5c17('0x4e')](_0x4afd42, _0x3508b4); var _0x46281c = _0x4afd42[_0x5c17('0x4f')](0x0, _0x59605f); _0x595369[_0x5c17('0x39')] -= _0x3021fa; } return new _0x2753bd[(_0x5c17('0x32'))](_0x46281c, _0x3021fa); }, 'clone': function() { var _0x37accf = _0x23f6d9[_0x5c17('0x3d')][_0x5c17('0x1')](this); return _0x37accf[_0x5c17('0x48')] = this[_0x5c17('0x48')][_0x5c17('0x3d')](), _0x37accf; }, '_minBufferSize': 0x0 }), _0x46281c = (_0x2027a0[_0x5c17('0x50')] = _0x3508b4[_0x5c17('0x35')]({ 'cfg': _0x23f6d9[_0x5c17('0x35')](), 'init': function(_0x58602c) { this[_0x5c17('0x51')] = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x58602c), this[_0x5c17('0x52')](); }, 'reset': function() { _0x3508b4[_0x5c17('0x52')][_0x5c17('0x1')](this), this[_0x5c17('0x53')](); }, 'update': function(_0x1237c2) { return this[_0x5c17('0x54')](_0x1237c2), this[_0x5c17('0x55')](), this; }, 'finalize': function(_0x59dacb) { _0x59dacb && this[_0x5c17('0x54')](_0x59dacb); var _0x1347a8 = this[_0x5c17('0x56')](); return _0x1347a8; }, 'blockSize': 0x10, '_createHelper': function(_0x1e863a) { return function(_0x11c014, _0x3a6317) { return new _0x1e863a[(_0x5c17('0x32'))](_0x3a6317)[_0x5c17('0x57')](_0x11c014); }; }, '_createHmacHelper': function(_0x328d38) { return function(_0x39d055, _0x322730) { return new _0x46281c[(_0x5c17('0x58'))][(_0x5c17('0x32'))](_0x328d38, _0x322730)[_0x5c17('0x57')](_0x39d055); }; } }), _0x4afd42[_0x5c17('0x59')] = {}); return _0x4afd42; } (Math); return _0x5a3970; }); ! function(_0x3cc0b5, _0x5ed2a8, _0x4e2604) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x5ed2a8(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x5b')), _0x2a86b9(_0x5c17('0x5c'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x5b'), _0x5c17('0x5c')], _0x5ed2a8) : _0x5ed2a8(_0x3cc0b5[_0x5c17('0x2e')]); } (this, function(_0x62f09a) { return function() { var _0x5dc018 = _0x62f09a, _0x2961b8 = _0x5dc018[_0x5c17('0x2f')], _0x1c4e56 = _0x2961b8[_0x5c17('0x30')], _0x2db829 = _0x2961b8[_0x5c17('0x37')], _0x137c5b = _0x5dc018[_0x5c17('0x59')], _0x268c22 = _0x137c5b[_0x5c17('0x5d')], _0x187185 = _0x137c5b[_0x5c17('0x5e')] = _0x1c4e56[_0x5c17('0x35')]({ 'cfg': _0x1c4e56[_0x5c17('0x35')]({ 'keySize': 0x4, 'hasher': _0x268c22, 'iterations': 0x1 }), 'init': function(_0x129b28) { this[_0x5c17('0x51')] = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x129b28); }, 'compute': function(_0x3b2a09, _0x81066b) { for (var _0x2961b8 = this[_0x5c17('0x51')], _0x1c4e56 = _0x2961b8[_0x5c17('0x5f')][_0x5c17('0x8')](), _0x137c5b = _0x2db829[_0x5c17('0x8')](), _0x268c22 = _0x137c5b[_0x5c17('0x38')], _0x187185 = _0x2961b8[_0x5c17('0x60')], _0x3ac8ab = _0x2961b8[_0x5c17('0x61')]; _0x268c22[_0x5c17('0x22')] < _0x187185;) { _0x2509e9 && _0x1c4e56[_0x5c17('0x62')](_0x2509e9); var _0x2509e9 = _0x1c4e56[_0x5c17('0x62')](_0x3b2a09)[_0x5c17('0x57')](_0x81066b); _0x1c4e56[_0x5c17('0x52')](); for (var _0x2f4877 = 0x1; _0x2f4877 < _0x3ac8ab; _0x2f4877++) _0x2509e9 = _0x1c4e56[_0x5c17('0x57')](_0x2509e9), _0x1c4e56[_0x5c17('0x52')](); _0x137c5b[_0x5c17('0x28')](_0x2509e9); } return _0x137c5b[_0x5c17('0x39')] = 0x4 * _0x187185, _0x137c5b; } }); _0x5dc018[_0x5c17('0x5e')] = function(_0x474590, _0x383fa1, _0xaf8095) { return _0x187185[_0x5c17('0x8')](_0xaf8095)[_0x5c17('0x63')](_0x474590, _0x383fa1); }; } (), _0x62f09a[_0x5c17('0x5e')]; }); ! function(_0x550f33, _0x2344da) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x2344da(_0x2a86b9(_0x5c17('0x5a'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a')], _0x2344da) : _0x2344da(_0x550f33[_0x5c17('0x2e')]); } (this, function(_0x43ffb5) { return function() { function _0x111baf(_0xf363be, _0x197bb8, _0x146d5c) { for (var _0x61d1c6 = [], _0x32ae3e = 0x0, _0xb08a4c = 0x0; _0xb08a4c < _0x197bb8; _0xb08a4c++) if (_0xb08a4c % 0x4) { var _0x3570bd = _0x146d5c[_0xf363be[_0x5c17('0x27')](_0xb08a4c - 0x1)] << _0xb08a4c % 0x4 * 0x2, _0x2c87b5 = _0x146d5c[_0xf363be[_0x5c17('0x27')](_0xb08a4c)] >>> 0x6 - _0xb08a4c % 0x4 * 0x2; _0x61d1c6[_0x32ae3e >>> 0x2] |= (_0x3570bd | _0x2c87b5) << 0x18 - _0x32ae3e % 0x4 * 0x8, _0x32ae3e++; } return _0x57946e[_0x5c17('0x8')](_0x61d1c6, _0x32ae3e); } var _0x3f7c38 = _0x43ffb5, _0x1157a8 = _0x3f7c38[_0x5c17('0x2f')], _0x57946e = _0x1157a8[_0x5c17('0x37')], _0x53dd3d = _0x3f7c38[_0x5c17('0x40')]; _0x53dd3d[_0x5c17('0x64')] = { 'stringify': function(_0x5c68b8) { var _0x111baf = _0x5c68b8[_0x5c17('0x38')], _0x3f7c38 = _0x5c68b8[_0x5c17('0x39')], _0x1157a8 = this[_0x5c17('0x65')]; _0x5c68b8[_0x5c17('0x3b')](); for (var _0x57946e = [], _0x53dd3d = 0x0; _0x53dd3d < _0x3f7c38; _0x53dd3d += 0x3) for (var _0x5707f1 = _0x111baf[_0x53dd3d >>> 0x2] >>> 0x18 - _0x53dd3d % 0x4 * 0x8 & 0xff, _0x404639 = _0x111baf[_0x53dd3d + 0x1 >>> 0x2] >>> 0x18 - (_0x53dd3d + 0x1) % 0x4 * 0x8 & 0xff, _0x54673a = _0x111baf[_0x53dd3d + 0x2 >>> 0x2] >>> 0x18 - (_0x53dd3d + 0x2) % 0x4 * 0x8 & 0xff, _0x564ab4 = _0x5707f1 << 0x10 | _0x404639 << 0x8 | _0x54673a, _0x10ec50 = 0x0; _0x10ec50 < 0x4 && _0x53dd3d + 0.75 * _0x10ec50 < _0x3f7c38; _0x10ec50++) _0x57946e[_0x5c17('0x20')](_0x1157a8[_0x5c17('0x2a')](_0x564ab4 >>> 0x6 * (0x3 - _0x10ec50) & 0x3f)); var _0x4da8a9 = _0x1157a8[_0x5c17('0x2a')](0x40); if (_0x4da8a9) for (; _0x57946e[_0x5c17('0x22')] % 0x4;) _0x57946e[_0x5c17('0x20')](_0x4da8a9); return _0x57946e[_0x5c17('0x23')](''); }, 'parse': function(_0x346362) { var _0x3f7c38 = _0x346362[_0x5c17('0x22')], _0x1157a8 = this[_0x5c17('0x65')], _0x57946e = this[_0x5c17('0x66')]; if (!_0x57946e) { _0x57946e = this[_0x5c17('0x66')] = []; for (var _0x53dd3d = 0x0; _0x53dd3d < _0x1157a8[_0x5c17('0x22')]; _0x53dd3d++) _0x57946e[_0x1157a8[_0x5c17('0x27')](_0x53dd3d)] = _0x53dd3d; } var _0x229142 = _0x1157a8[_0x5c17('0x2a')](0x40); if (_0x229142) { var _0xd1ff57 = _0x346362[_0x5c17('0x67')](_0x229142); _0xd1ff57 !== -0x1 && (_0x3f7c38 = _0xd1ff57); } return _0x111baf(_0x346362, _0x3f7c38, _0x57946e); }, '_map': _0x5c17('0x68') }; } (), _0x43ffb5[_0x5c17('0x40')][_0x5c17('0x64')]; }); ! function(_0x26cbb1, _0x58ec37, _0x177ee0) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x58ec37(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x69'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x69')], _0x58ec37) : _0x58ec37(_0x26cbb1[_0x5c17('0x2e')]); } (this, function(_0x2ef51a) { _0x2ef51a[_0x5c17('0x2f')][_0x5c17('0x6a')] || function(_0x169cbd) { var _0x2a64aa = _0x2ef51a, _0x23d019 = _0x2a64aa[_0x5c17('0x2f')], _0x501953 = _0x23d019[_0x5c17('0x30')], _0x31b7fe = _0x23d019[_0x5c17('0x37')], _0x1eada5 = _0x23d019[_0x5c17('0x47')], _0x270113 = _0x2a64aa[_0x5c17('0x40')], _0x5a6dac = (_0x270113[_0x5c17('0x44')], _0x270113[_0x5c17('0x64')]), _0x6b9c83 = _0x2a64aa[_0x5c17('0x59')], _0x101ee3 = _0x6b9c83[_0x5c17('0x5e')], _0x2f16d9 = _0x23d019[_0x5c17('0x6a')] = _0x1eada5[_0x5c17('0x35')]({ 'cfg': _0x501953[_0x5c17('0x35')](), 'createEncryptor': function(_0x25e901, _0x26733b) { return this[_0x5c17('0x8')](this[_0x5c17('0x6b')], _0x25e901, _0x26733b); }, 'createDecryptor': function(_0x5c4bcb, _0x2cbbc5) { return this[_0x5c17('0x8')](this[_0x5c17('0x6c')], _0x5c4bcb, _0x2cbbc5); }, 'init': function(_0x26a337, _0x6984e3, _0xc7e15b) { this[_0x5c17('0x51')] = this[_0x5c17('0x51')][_0x5c17('0x35')](_0xc7e15b), this[_0x5c17('0x6d')] = _0x26a337, this[_0x5c17('0x6e')] = _0x6984e3, this[_0x5c17('0x52')](); }, 'reset': function() { _0x1eada5[_0x5c17('0x52')][_0x5c17('0x1')](this), this[_0x5c17('0x53')](); }, 'process': function(_0x3e0d21) { return this[_0x5c17('0x54')](_0x3e0d21), this[_0x5c17('0x55')](); }, 'finalize': function(_0x1e86e0) { _0x1e86e0 && this[_0x5c17('0x54')](_0x1e86e0); var _0x169cbd = this[_0x5c17('0x56')](); return _0x169cbd; }, 'keySize': 0x4, 'ivSize': 0x4, '_ENC_XFORM_MODE': 0x1, '_DEC_XFORM_MODE': 0x2, '_createHelper': function() { function _0x2ef51a(_0x20e8c2) { return _0x5c17('0xa') == typeof _0x20e8c2 ? _0x207c7b: _0x1c2015; } return function(_0x5f48d9) { return { 'encrypt': function(_0x42e1c9, _0x3ef2ec, _0x50dbd8) { return _0x2ef51a(_0x3ef2ec)[_0x5c17('0x6f')](_0x5f48d9, _0x42e1c9, _0x3ef2ec, _0x50dbd8); }, 'decrypt': function(_0x28a30c, _0x28864f, _0x4c7512) { return _0x2ef51a(_0x28864f)[_0x5c17('0x70')](_0x5f48d9, _0x28a30c, _0x28864f, _0x4c7512); } }; }; } () }), _0x2685a7 = (_0x23d019[_0x5c17('0x71')] = _0x2f16d9[_0x5c17('0x35')]({ '_doFinalize': function() { var _0x2ef51a = this[_0x5c17('0x55')](!0x0); return _0x2ef51a; }, 'blockSize': 0x1 }), _0x2a64aa[_0x5c17('0x72')] = {}), _0x2666cf = _0x23d019[_0x5c17('0x73')] = _0x501953[_0x5c17('0x35')]({ 'createEncryptor': function(_0x22557c, _0x545c1e) { return this[_0x5c17('0x74')][_0x5c17('0x8')](_0x22557c, _0x545c1e); }, 'createDecryptor': function(_0x30fa7b, _0x3bf4fd) { return this[_0x5c17('0x75')][_0x5c17('0x8')](_0x30fa7b, _0x3bf4fd); }, 'init': function(_0x40ddd4, _0x1da2e1) { this[_0x5c17('0x76')] = _0x40ddd4, this[_0x5c17('0x77')] = _0x1da2e1; } }), _0x68c111 = _0x2685a7[_0x5c17('0x78')] = function() { function _0x2ef51a(_0x453890, _0x579063, _0x368bda) { var _0x501953 = this[_0x5c17('0x77')]; if (_0x501953) { var _0x31b7fe = _0x501953; this[_0x5c17('0x77')] = _0x169cbd; } else var _0x31b7fe = this[_0x5c17('0x79')]; for (var _0x1eada5 = 0x0; _0x1eada5 < _0x368bda; _0x1eada5++) _0x453890[_0x579063 + _0x1eada5] ^= _0x31b7fe[_0x1eada5]; } var _0x2a64aa = _0x2666cf[_0x5c17('0x35')](); return _0x2a64aa[_0x5c17('0x74')] = _0x2a64aa[_0x5c17('0x35')]({ 'processBlock': function(_0x5cf30b, _0x4e7a01) { var _0x23d019 = this[_0x5c17('0x76')], _0x501953 = _0x23d019[_0x5c17('0x4a')]; _0x2ef51a[_0x5c17('0x1')](this, _0x5cf30b, _0x4e7a01, _0x501953), _0x23d019[_0x5c17('0x7a')](_0x5cf30b, _0x4e7a01), this[_0x5c17('0x79')] = _0x5cf30b[_0x5c17('0x3e')](_0x4e7a01, _0x4e7a01 + _0x501953); } }), _0x2a64aa[_0x5c17('0x75')] = _0x2a64aa[_0x5c17('0x35')]({ 'processBlock': function(_0x44f656, _0x5aa12d) { var _0x23d019 = this[_0x5c17('0x76')], _0x501953 = _0x23d019[_0x5c17('0x4a')], _0x31b7fe = _0x44f656[_0x5c17('0x3e')](_0x5aa12d, _0x5aa12d + _0x501953); _0x23d019[_0x5c17('0x7b')](_0x44f656, _0x5aa12d), _0x2ef51a[_0x5c17('0x1')](this, _0x44f656, _0x5aa12d, _0x501953), this[_0x5c17('0x79')] = _0x31b7fe; } }), _0x2a64aa; } (), _0x255e67 = _0x2a64aa[_0x5c17('0x7c')] = {}, _0x5ca1fe = _0x255e67[_0x5c17('0x7d')] = { 'pad': function(_0x38405f, _0xe6ec82) { for (var _0x2a64aa = 0x4 * _0xe6ec82, _0x23d019 = _0x2a64aa - _0x38405f[_0x5c17('0x39')] % _0x2a64aa, _0x501953 = _0x23d019 << 0x18 | _0x23d019 << 0x10 | _0x23d019 << 0x8 | _0x23d019, _0x1eada5 = [], _0x270113 = 0x0; _0x270113 < _0x23d019; _0x270113 += 0x4) _0x1eada5[_0x5c17('0x20')](_0x501953); var _0x5a6dac = _0x31b7fe[_0x5c17('0x8')](_0x1eada5, _0x23d019); _0x38405f[_0x5c17('0x28')](_0x5a6dac); }, 'unpad': function(_0x576be7) { var _0x169cbd = 0xff & _0x576be7[_0x5c17('0x38')][_0x576be7[_0x5c17('0x39')] - 0x1 >>> 0x2]; _0x576be7[_0x5c17('0x39')] -= _0x169cbd; } }, _0x1de457 = (_0x23d019[_0x5c17('0x7e')] = _0x2f16d9[_0x5c17('0x35')]({ 'cfg': _0x2f16d9[_0x5c17('0x51')][_0x5c17('0x35')]({ 'mode': _0x68c111, 'padding': _0x5ca1fe }), 'reset': function() { _0x2f16d9[_0x5c17('0x52')][_0x5c17('0x1')](this); var _0x2ef51a = this[_0x5c17('0x51')], _0x169cbd = _0x2ef51a['iv'], _0x2a64aa = _0x2ef51a[_0x5c17('0x72')]; if (this[_0x5c17('0x6d')] == this[_0x5c17('0x6b')]) var _0x23d019 = _0x2a64aa[_0x5c17('0x7f')]; else { var _0x23d019 = _0x2a64aa[_0x5c17('0x80')]; this[_0x5c17('0x4c')] = 0x1; } this[_0x5c17('0x81')] && this[_0x5c17('0x81')][_0x5c17('0x82')] == _0x23d019 ? this[_0x5c17('0x81')][_0x5c17('0x32')](this, _0x169cbd && _0x169cbd[_0x5c17('0x38')]) : (this[_0x5c17('0x81')] = _0x23d019[_0x5c17('0x1')](_0x2a64aa, this, _0x169cbd && _0x169cbd[_0x5c17('0x38')]), this[_0x5c17('0x81')][_0x5c17('0x82')] = _0x23d019); }, '_doProcessBlock': function(_0x2973e0, _0xa57e0f) { this[_0x5c17('0x81')][_0x5c17('0x83')](_0x2973e0, _0xa57e0f); }, '_doFinalize': function() { var _0x2ef51a = this[_0x5c17('0x51')][_0x5c17('0x84')]; if (this[_0x5c17('0x6d')] == this[_0x5c17('0x6b')]) { _0x2ef51a[_0x5c17('0x7c')](this[_0x5c17('0x48')], this[_0x5c17('0x4a')]); var _0x169cbd = this[_0x5c17('0x55')](!0x0); } else { var _0x169cbd = this[_0x5c17('0x55')](!0x0); _0x2ef51a[_0x5c17('0x85')](_0x169cbd); } return _0x169cbd; }, 'blockSize': 0x4 }), _0x23d019[_0x5c17('0x86')] = _0x501953[_0x5c17('0x35')]({ 'init': function(_0x349aaf) { this[_0x5c17('0x31')](_0x349aaf); }, 'toString': function(_0x589d81) { return (_0x589d81 || this[_0x5c17('0x87')])[_0x5c17('0x3a')](this); } })), _0x43cced = _0x2a64aa[_0x5c17('0x88')] = {}, _0x504a2e = _0x43cced[_0x5c17('0x89')] = { 'stringify': function(_0x4dc57e) { var _0x169cbd = _0x4dc57e[_0x5c17('0x8a')], _0x2a64aa = _0x4dc57e[_0x5c17('0x8b')]; if (_0x2a64aa) var _0x23d019 = _0x31b7fe[_0x5c17('0x8')]([0x53616c74, 0x65645f5f])[_0x5c17('0x28')](_0x2a64aa)[_0x5c17('0x28')](_0x169cbd); else var _0x23d019 = _0x169cbd; return _0x23d019[_0x5c17('0x36')](_0x5a6dac); }, 'parse': function(_0x123534) { var _0x169cbd = _0x5a6dac[_0x5c17('0x46')](_0x123534), _0x2a64aa = _0x169cbd[_0x5c17('0x38')]; if (0x53616c74 == _0x2a64aa[0x0] && 0x65645f5f == _0x2a64aa[0x1]) { var _0x23d019 = _0x31b7fe[_0x5c17('0x8')](_0x2a64aa[_0x5c17('0x3e')](0x2, 0x4)); _0x2a64aa[_0x5c17('0x4f')](0x0, 0x4), _0x169cbd[_0x5c17('0x39')] -= 0x10; } return _0x1de457[_0x5c17('0x8')]({ 'ciphertext': _0x169cbd, 'salt': _0x23d019 }); } }, _0x1c2015 = _0x23d019[_0x5c17('0x8c')] = _0x501953[_0x5c17('0x35')]({ 'cfg': _0x501953[_0x5c17('0x35')]({ 'format': _0x504a2e }), 'encrypt': function(_0x22a253, _0x101960, _0x1338e8, _0x40decb) { _0x40decb = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x40decb); var _0x501953 = _0x22a253[_0x5c17('0x7f')](_0x1338e8, _0x40decb), _0x31b7fe = _0x501953[_0x5c17('0x57')](_0x101960), _0x1eada5 = _0x501953[_0x5c17('0x51')]; return _0x1de457[_0x5c17('0x8')]({ 'ciphertext': _0x31b7fe, 'key': _0x1338e8, 'iv': _0x1eada5['iv'], 'algorithm': _0x22a253, 'mode': _0x1eada5[_0x5c17('0x72')], 'padding': _0x1eada5[_0x5c17('0x84')], 'blockSize': _0x22a253[_0x5c17('0x4a')], 'formatter': _0x40decb[_0x5c17('0x88')] }); }, 'decrypt': function(_0xc64031, _0x337e65, _0x13cb1e, _0x17589d) { _0x17589d = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x17589d), _0x337e65 = this[_0x5c17('0x8d')](_0x337e65, _0x17589d[_0x5c17('0x88')]); var _0x501953 = _0xc64031[_0x5c17('0x80')](_0x13cb1e, _0x17589d)[_0x5c17('0x57')](_0x337e65[_0x5c17('0x8a')]); return _0x501953; }, '_parse': function(_0x5ca638, _0x4d9875) { return _0x5c17('0xa') == typeof _0x5ca638 ? _0x4d9875[_0x5c17('0x46')](_0x5ca638, this) : _0x5ca638; } }), _0x34c872 = _0x2a64aa[_0x5c17('0x8e')] = {}, _0x40953 = _0x34c872[_0x5c17('0x89')] = { 'execute': function(_0x4c9fc6, _0x2084bd, _0x3dde5e, _0xe816f) { _0xe816f || (_0xe816f = _0x31b7fe[_0x5c17('0x3f')](0x8)); var _0x501953 = _0x101ee3[_0x5c17('0x8')]({ 'keySize': _0x2084bd + _0x3dde5e })[_0x5c17('0x63')](_0x4c9fc6, _0xe816f), _0x1eada5 = _0x31b7fe[_0x5c17('0x8')](_0x501953[_0x5c17('0x38')][_0x5c17('0x3e')](_0x2084bd), 0x4 * _0x3dde5e); return _0x501953[_0x5c17('0x39')] = 0x4 * _0x2084bd, _0x1de457[_0x5c17('0x8')]({ 'key': _0x501953, 'iv': _0x1eada5, 'salt': _0xe816f }); } }, _0x207c7b = _0x23d019[_0x5c17('0x8f')] = _0x1c2015[_0x5c17('0x35')]({ 'cfg': _0x1c2015[_0x5c17('0x51')][_0x5c17('0x35')]({ 'kdf': _0x40953 }), 'encrypt': function(_0x3eafef, _0x52fe24, _0x50a07e, _0x1e987e) { _0x1e987e = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x1e987e); var _0x501953 = _0x1e987e[_0x5c17('0x8e')][_0x5c17('0x90')](_0x50a07e, _0x3eafef[_0x5c17('0x60')], _0x3eafef[_0x5c17('0x91')]); _0x1e987e['iv'] = _0x501953['iv']; var _0x31b7fe = _0x1c2015[_0x5c17('0x6f')][_0x5c17('0x1')](this, _0x3eafef, _0x52fe24, _0x501953[_0x5c17('0x92')], _0x1e987e); return _0x31b7fe[_0x5c17('0x31')](_0x501953), _0x31b7fe; }, 'decrypt': function(_0x35b0e1, _0x343811, _0x37876b, _0x34993e) { _0x34993e = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x34993e), _0x343811 = this[_0x5c17('0x8d')](_0x343811, _0x34993e[_0x5c17('0x88')]); var _0x501953 = _0x34993e[_0x5c17('0x8e')][_0x5c17('0x90')](_0x37876b, _0x35b0e1[_0x5c17('0x60')], _0x35b0e1[_0x5c17('0x91')], _0x343811[_0x5c17('0x8b')]); _0x34993e['iv'] = _0x501953['iv']; var _0x31b7fe = _0x1c2015[_0x5c17('0x70')][_0x5c17('0x1')](this, _0x35b0e1, _0x343811, _0x501953[_0x5c17('0x92')], _0x34993e); return _0x31b7fe; } }); } (); }); ! function(_0x4ad04c, _0xaf4055) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0xaf4055(_0x2a86b9(_0x5c17('0x5a'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a')], _0xaf4055) : _0xaf4055(_0x4ad04c[_0x5c17('0x2e')]); } (this, function(_0x6d4400) { ! function() { var _0x403cc0 = _0x6d4400, _0x5e943c = _0x403cc0[_0x5c17('0x2f')], _0xb10719 = _0x5e943c[_0x5c17('0x30')], _0x4504c5 = _0x403cc0[_0x5c17('0x40')], _0x25368e = _0x4504c5[_0x5c17('0x44')], _0x57b44b = _0x403cc0[_0x5c17('0x59')]; _0x57b44b[_0x5c17('0x58')] = _0xb10719[_0x5c17('0x35')]({ 'init': function(_0x40715d, _0x3c6d2e) { _0x40715d = this[_0x5c17('0x93')] = new _0x40715d[(_0x5c17('0x32'))](), _0x5c17('0xa') == typeof _0x3c6d2e && (_0x3c6d2e = _0x25368e[_0x5c17('0x46')](_0x3c6d2e)); var _0x5e943c = _0x40715d[_0x5c17('0x4a')], _0xb10719 = 0x4 * _0x5e943c; _0x3c6d2e[_0x5c17('0x39')] > _0xb10719 && (_0x3c6d2e = _0x40715d[_0x5c17('0x57')](_0x3c6d2e)), _0x3c6d2e[_0x5c17('0x3b')](); for (var _0x4504c5 = this[_0x5c17('0x94')] = _0x3c6d2e[_0x5c17('0x3d')](), _0x57b44b = this[_0x5c17('0x95')] = _0x3c6d2e[_0x5c17('0x3d')](), _0x35f047 = _0x4504c5[_0x5c17('0x38')], _0x43eef3 = _0x57b44b[_0x5c17('0x38')], _0x5058c0 = 0x0; _0x5058c0 < _0x5e943c; _0x5058c0++) _0x35f047[_0x5058c0] ^= 0x5c5c5c5c, _0x43eef3[_0x5058c0] ^= 0x36363636; _0x4504c5[_0x5c17('0x39')] = _0x57b44b[_0x5c17('0x39')] = _0xb10719, this[_0x5c17('0x52')](); }, 'reset': function() { var _0x6d4400 = this[_0x5c17('0x93')]; _0x6d4400[_0x5c17('0x52')](), _0x6d4400[_0x5c17('0x62')](this[_0x5c17('0x95')]); }, 'update': function(_0xc1a4d2) { return this[_0x5c17('0x93')][_0x5c17('0x62')](_0xc1a4d2), this; }, 'finalize': function(_0x5f511f) { var _0x403cc0 = this[_0x5c17('0x93')], _0x5e943c = _0x403cc0[_0x5c17('0x57')](_0x5f511f); _0x403cc0[_0x5c17('0x52')](); var _0xb10719 = _0x403cc0[_0x5c17('0x57')](this[_0x5c17('0x94')][_0x5c17('0x3d')]()[_0x5c17('0x28')](_0x5e943c)); return _0xb10719; } }); } (); }); ! function(_0x5ee32e, _0x5d1288, _0x11ba5f) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x5d1288(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x96'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x96')], _0x5d1288) : _0x5d1288(_0x5ee32e[_0x5c17('0x2e')]); } (this, function(_0x2d9b33) { return _0x2d9b33[_0x5c17('0x72')][_0x5c17('0x97')] = function() { var _0x32845d = _0x2d9b33[_0x5c17('0x2f')][_0x5c17('0x73')][_0x5c17('0x35')](); return _0x32845d[_0x5c17('0x74')] = _0x32845d[_0x5c17('0x35')]({ 'processBlock': function(_0x381384, _0x3a484f) { this[_0x5c17('0x76')][_0x5c17('0x7a')](_0x381384, _0x3a484f); } }), _0x32845d[_0x5c17('0x75')] = _0x32845d[_0x5c17('0x35')]({ 'processBlock': function(_0x28252b, _0x20eaab) { this[_0x5c17('0x76')][_0x5c17('0x7b')](_0x28252b, _0x20eaab); } }), _0x32845d; } (), _0x2d9b33[_0x5c17('0x72')][_0x5c17('0x97')]; }); ! function(_0x476363, _0x4468bc, _0x1bde73) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x4468bc(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x96'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x96')], _0x4468bc) : _0x4468bc(_0x476363[_0x5c17('0x2e')]); } (this, function(_0x36bfbe) { return _0x36bfbe[_0x5c17('0x7c')][_0x5c17('0x7d')]; }); ! function(_0x568778, _0xdf3a12, _0x1dc20e) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0xdf3a12(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x98')), _0x2a86b9(_0x5c17('0x99')), _0x2a86b9(_0x5c17('0x69')), _0x2a86b9(_0x5c17('0x96'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x98'), _0x5c17('0x99'), _0x5c17('0x69'), _0x5c17('0x96')], _0xdf3a12) : _0xdf3a12(_0x568778[_0x5c17('0x2e')]); } (this, function(_0x5cb03f) { return function() { var _0x23acee = _0x5cb03f, _0x20aaa = _0x23acee[_0x5c17('0x2f')], _0x4bc2fd = _0x20aaa[_0x5c17('0x7e')], _0x91a3c2 = _0x23acee[_0x5c17('0x59')], _0x1772c6 = [], _0x4a4108 = [], _0x316708 = [], _0x3bc835 = [], _0x4c8fef = [], _0x3fdc2e = [], _0x26df84 = [], _0x264b21 = [], _0x58d84f = [], _0x5b9ed5 = []; ! function() { for (var _0x5cb03f = [], _0x23acee = 0x0; _0x23acee < 0x100; _0x23acee++) _0x23acee < 0x80 ? _0x5cb03f[_0x23acee] = _0x23acee << 0x1: _0x5cb03f[_0x23acee] = _0x23acee << 0x1 ^ 0x11b; for (var _0x20aaa = 0x0, _0x4bc2fd = 0x0, _0x23acee = 0x0; _0x23acee < 0x100; _0x23acee++) { var _0x91a3c2 = _0x4bc2fd ^ _0x4bc2fd << 0x1 ^ _0x4bc2fd << 0x2 ^ _0x4bc2fd << 0x3 ^ _0x4bc2fd << 0x4; _0x91a3c2 = _0x91a3c2 >>> 0x8 ^ 0xff & _0x91a3c2 ^ 0x63, _0x1772c6[_0x20aaa] = _0x91a3c2, _0x4a4108[_0x91a3c2] = _0x20aaa; var _0xccc8b7 = _0x5cb03f[_0x20aaa], _0x66c2b = _0x5cb03f[_0xccc8b7], _0x1633b6 = _0x5cb03f[_0x66c2b], _0xea2314 = 0x101 * _0x5cb03f[_0x91a3c2] ^ 0x1010100 * _0x91a3c2; _0x316708[_0x20aaa] = _0xea2314 << 0x18 | _0xea2314 >>> 0x8, _0x3bc835[_0x20aaa] = _0xea2314 << 0x10 | _0xea2314 >>> 0x10, _0x4c8fef[_0x20aaa] = _0xea2314 << 0x8 | _0xea2314 >>> 0x18, _0x3fdc2e[_0x20aaa] = _0xea2314; var _0xea2314 = 0x1010101 * _0x1633b6 ^ 0x10001 * _0x66c2b ^ 0x101 * _0xccc8b7 ^ 0x1010100 * _0x20aaa; _0x26df84[_0x91a3c2] = _0xea2314 << 0x18 | _0xea2314 >>> 0x8, _0x264b21[_0x91a3c2] = _0xea2314 << 0x10 | _0xea2314 >>> 0x10, _0x58d84f[_0x91a3c2] = _0xea2314 << 0x8 | _0xea2314 >>> 0x18, _0x5b9ed5[_0x91a3c2] = _0xea2314, _0x20aaa ? (_0x20aaa = _0xccc8b7 ^ _0x5cb03f[_0x5cb03f[_0x5cb03f[_0x1633b6 ^ _0xccc8b7]]], _0x4bc2fd ^= _0x5cb03f[_0x5cb03f[_0x4bc2fd]]) : _0x20aaa = _0x4bc2fd = 0x1; } } (); var _0x20778b = [0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36], _0x3a6f08 = _0x91a3c2[_0x5c17('0x9a')] = _0x4bc2fd[_0x5c17('0x35')]({ '_doReset': function() { if (!this[_0x5c17('0x9b')] || this[_0x5c17('0x9c')] !== this[_0x5c17('0x6e')]) { for (var _0x5cb03f = this[_0x5c17('0x9c')] = this[_0x5c17('0x6e')], _0x23acee = _0x5cb03f[_0x5c17('0x38')], _0x20aaa = _0x5cb03f[_0x5c17('0x39')] / 0x4, _0x4bc2fd = this[_0x5c17('0x9b')] = _0x20aaa + 0x6, _0x91a3c2 = 0x4 * (_0x4bc2fd + 0x1), _0x4a4108 = this[_0x5c17('0x9d')] = [], _0x316708 = 0x0; _0x316708 < _0x91a3c2; _0x316708++) if (_0x316708 < _0x20aaa) _0x4a4108[_0x316708] = _0x23acee[_0x316708]; else { var _0x3bc835 = _0x4a4108[_0x316708 - 0x1]; _0x316708 % _0x20aaa ? _0x20aaa > 0x6 && _0x316708 % _0x20aaa == 0x4 && (_0x3bc835 = _0x1772c6[_0x3bc835 >>> 0x18] << 0x18 | _0x1772c6[_0x3bc835 >>> 0x10 & 0xff] << 0x10 | _0x1772c6[_0x3bc835 >>> 0x8 & 0xff] << 0x8 | _0x1772c6[0xff & _0x3bc835]) : (_0x3bc835 = _0x3bc835 << 0x8 | _0x3bc835 >>> 0x18, _0x3bc835 = _0x1772c6[_0x3bc835 >>> 0x18] << 0x18 | _0x1772c6[_0x3bc835 >>> 0x10 & 0xff] << 0x10 | _0x1772c6[_0x3bc835 >>> 0x8 & 0xff] << 0x8 | _0x1772c6[0xff & _0x3bc835], _0x3bc835 ^= _0x20778b[_0x316708 / _0x20aaa | 0x0] << 0x18), _0x4a4108[_0x316708] = _0x4a4108[_0x316708 - _0x20aaa] ^ _0x3bc835; } for (var _0x4c8fef = this[_0x5c17('0x9e')] = [], _0x3fdc2e = 0x0; _0x3fdc2e < _0x91a3c2; _0x3fdc2e++) { var _0x316708 = _0x91a3c2 - _0x3fdc2e; if (_0x3fdc2e % 0x4) var _0x3bc835 = _0x4a4108[_0x316708]; else var _0x3bc835 = _0x4a4108[_0x316708 - 0x4]; _0x3fdc2e < 0x4 || _0x316708 <= 0x4 ? _0x4c8fef[_0x3fdc2e] = _0x3bc835: _0x4c8fef[_0x3fdc2e] = _0x26df84[_0x1772c6[_0x3bc835 >>> 0x18]] ^ _0x264b21[_0x1772c6[_0x3bc835 >>> 0x10 & 0xff]] ^ _0x58d84f[_0x1772c6[_0x3bc835 >>> 0x8 & 0xff]] ^ _0x5b9ed5[_0x1772c6[0xff & _0x3bc835]]; } } }, 'encryptBlock': function(_0x2c1ba9, _0x58ff29) { this[_0x5c17('0x9f')](_0x2c1ba9, _0x58ff29, this[_0x5c17('0x9d')], _0x316708, _0x3bc835, _0x4c8fef, _0x3fdc2e, _0x1772c6); }, 'decryptBlock': function(_0xfabd84, _0x2b34d9) { var _0x20aaa = _0xfabd84[_0x2b34d9 + 0x1]; _0xfabd84[_0x2b34d9 + 0x1] = _0xfabd84[_0x2b34d9 + 0x3], _0xfabd84[_0x2b34d9 + 0x3] = _0x20aaa, this[_0x5c17('0x9f')](_0xfabd84, _0x2b34d9, this[_0x5c17('0x9e')], _0x26df84, _0x264b21, _0x58d84f, _0x5b9ed5, _0x4a4108); var _0x20aaa = _0xfabd84[_0x2b34d9 + 0x1]; _0xfabd84[_0x2b34d9 + 0x1] = _0xfabd84[_0x2b34d9 + 0x3], _0xfabd84[_0x2b34d9 + 0x3] = _0x20aaa; }, '_doCryptBlock': function(_0x3f8f27, _0x18c46f, _0xab13f3, _0x55e8f7, _0x633e12, _0x3426da, _0x282c3b, _0x39e3b5) { for (var _0x3bc835 = this[_0x5c17('0x9b')], _0x4c8fef = _0x3f8f27[_0x18c46f] ^ _0xab13f3[0x0], _0x3fdc2e = _0x3f8f27[_0x18c46f + 0x1] ^ _0xab13f3[0x1], _0x26df84 = _0x3f8f27[_0x18c46f + 0x2] ^ _0xab13f3[0x2], _0x264b21 = _0x3f8f27[_0x18c46f + 0x3] ^ _0xab13f3[0x3], _0x58d84f = 0x4, _0x5b9ed5 = 0x1; _0x5b9ed5 < _0x3bc835; _0x5b9ed5++) { var _0x20778b = _0x55e8f7[_0x4c8fef >>> 0x18] ^ _0x633e12[_0x3fdc2e >>> 0x10 & 0xff] ^ _0x3426da[_0x26df84 >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x264b21] ^ _0xab13f3[_0x58d84f++], _0x3a6f08 = _0x55e8f7[_0x3fdc2e >>> 0x18] ^ _0x633e12[_0x26df84 >>> 0x10 & 0xff] ^ _0x3426da[_0x264b21 >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x4c8fef] ^ _0xab13f3[_0x58d84f++], _0x5bd6cc = _0x55e8f7[_0x26df84 >>> 0x18] ^ _0x633e12[_0x264b21 >>> 0x10 & 0xff] ^ _0x3426da[_0x4c8fef >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x3fdc2e] ^ _0xab13f3[_0x58d84f++], _0x2859a6 = _0x55e8f7[_0x264b21 >>> 0x18] ^ _0x633e12[_0x4c8fef >>> 0x10 & 0xff] ^ _0x3426da[_0x3fdc2e >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x26df84] ^ _0xab13f3[_0x58d84f++]; _0x4c8fef = _0x20778b, _0x3fdc2e = _0x3a6f08, _0x26df84 = _0x5bd6cc, _0x264b21 = _0x2859a6; } var _0x20778b = (_0x39e3b5[_0x4c8fef >>> 0x18] << 0x18 | _0x39e3b5[_0x3fdc2e >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x26df84 >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x264b21]) ^ _0xab13f3[_0x58d84f++], _0x3a6f08 = (_0x39e3b5[_0x3fdc2e >>> 0x18] << 0x18 | _0x39e3b5[_0x26df84 >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x264b21 >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x4c8fef]) ^ _0xab13f3[_0x58d84f++], _0x5bd6cc = (_0x39e3b5[_0x26df84 >>> 0x18] << 0x18 | _0x39e3b5[_0x264b21 >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x4c8fef >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x3fdc2e]) ^ _0xab13f3[_0x58d84f++], _0x2859a6 = (_0x39e3b5[_0x264b21 >>> 0x18] << 0x18 | _0x39e3b5[_0x4c8fef >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x3fdc2e >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x26df84]) ^ _0xab13f3[_0x58d84f++]; _0x3f8f27[_0x18c46f] = _0x20778b, _0x3f8f27[_0x18c46f + 0x1] = _0x3a6f08, _0x3f8f27[_0x18c46f + 0x2] = _0x5bd6cc, _0x3f8f27[_0x18c46f + 0x3] = _0x2859a6; }, 'keySize': 0x8 }); _0x23acee[_0x5c17('0x9a')] = _0x4bc2fd[_0x5c17('0xa0')](_0x3a6f08); } (), _0x5cb03f[_0x5c17('0x9a')]; }); ! function(_0x10e1c0, _0x1f2cc5) { _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x1f2cc5(_0x2a86b9(_0x5c17('0x5a'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a')], _0x1f2cc5) : _0x1f2cc5(_0x10e1c0[_0x5c17('0x2e')]); } (this, function(_0x8fb41f) { return _0x8fb41f[_0x5c17('0x40')][_0x5c17('0x44')]; }); } [_0x5c17('0x1')](_0x1f8dc9)); _0x13d108[_0x5c17('0x0')] = function(_0x4b4298) { var _0x1e484e = _0x5c17('0xa1'); var _0x1402a9 = _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x40')][_0x5c17('0x44')][_0x5c17('0x46')](_0x1e484e); var _0x2d8d25 = _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x40')][_0x5c17('0x44')][_0x5c17('0x46')](_0x4b4298); var _0x3aa8f9 = _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x9a')][_0x5c17('0x6f')](_0x2d8d25, _0x1402a9, { 'mode': _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x72')][_0x5c17('0x97')], 'padding': _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x7c')][_0x5c17('0x7d')] }); return _0x3aa8f9[_0x5c17('0x36')](); }; }, function(_0x1df6e4, _0x5482b3) { _0x1df6e4[_0x5c17('0x0')] = function(_0x4d378d) { var _0x204ca3 = _0x5c17('0xa2'); var _0x577208; var _0x4bae58; var _0x4c4ae9; var _0x151ea2; var _0x23ae53; var _0x56f3ce; _0x4c4ae9 = _0x4d378d[_0x5c17('0x22')]; _0x4bae58 = 0x0; _0x577208 = ''; while (_0x4bae58 < _0x4c4ae9) { _0x151ea2 = _0x4d378d[_0x5c17('0x27')](_0x4bae58++) & 0xff; if (_0x4bae58 === _0x4c4ae9) { _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x151ea2 >> 0x2); _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x151ea2 & 0x3) << 0x4); _0x577208 += '=='; break; } _0x23ae53 = _0x4d378d[_0x5c17('0x27')](_0x4bae58++); if (_0x4bae58 === _0x4c4ae9) { _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x151ea2 >> 0x2); _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x151ea2 & 0x3) << 0x4 | (_0x23ae53 & 0xf0) >> 0x4); _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x23ae53 & 0xf) << 0x2); _0x577208 += '='; break; } _0x56f3ce = _0x4d378d[_0x5c17('0x27')](_0x4bae58++); _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x151ea2 >> 0x2); _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x151ea2 & 0x3) << 0x4 | (_0x23ae53 & 0xf0) >> 0x4); _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x23ae53 & 0xf) << 0x2 | (_0x56f3ce & 0xc0) >> 0x6); _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x56f3ce & 0x3f); } return _0x577208; }; }]))); function zh(bdstoken,captcha_str,dv,username, yanzhengma) { _0x342595 = '19201080'; cc = { alg: "v2", bdstoken: bdstoken, captcha_str: captcha_str, countrycode: "", dv: dv, index: "username", time: 1574478478, tpl: "", username: username, veritycode: yanzhengma }; bb = xxoo(cc); return bb.time + '|' + bb.sig; } ================================================ FILE: 其他实战/【百度】网页找回密码/header.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-12-23 Python: 3.7 UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' REFERER = 'https://passport.baidu.com/?getpassindex' LANGUAGE = 'zh-CN,zh;q=0.9' CONNECTION = 'keep-alive' headers_get_phone = { 'Connection': CONNECTION, 'User-Agent': UA, 'Accept': '*/*', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'no-cors', 'Referer': REFERER, 'Accept-Language': LANGUAGE } headers_token = { "Connection": CONNECTION, "Content-Lengt": '999', "Cache-Control": 'max-age=0', "Origin": "https://passport.baidu.com", "Upgrade-Insecure-Requests": '1', "Content-Type": "application/x-www-form-urlencoded", "User-Agent": UA, "Sec-Fetch-User": "?1", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "navigate", "Referer": REFERER, "Accept-Language": LANGUAGE, } headers_img = { 'Connection': CONNECTION, 'User-Agent': UA, 'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'no-cors', 'Referer': REFERER, 'Accept-Language': LANGUAGE, } headers_bds_token = { 'Connection': CONNECTION, 'Upgrade-Insecure-Requests': '1', 'User-Agent': UA, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Accept-Language': LANGUAGE, } headers_verify_str = { 'Connection': CONNECTION, 'User-Agent': UA, 'Accept': '*/*', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'no-cors', 'Referer': REFERER, 'Accept-Language': LANGUAGE, } ================================================ FILE: 其他实战/【百度】翻译/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-11-06 Python: 3.7 ================================================ FILE: 其他实战/【百度】翻译/translate.js ================================================ var i = "320305.131321201" function n(r, o) { for (var t = 0; t < o.length - 2; t += 3) { var e = o.charAt(t + 2); e = e >= "a" ? e.charCodeAt(0) - 87 : Number(e), e = "+" === o.charAt(t + 1) ? r >>> e : r << e, r = "+" === o.charAt(t) ? r + e & 4294967295 : r ^ e } return r } function a(r) { var t = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); if (null === t) { var a = r.length; a > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(a / 2) - 5, 10) + r.substr(-10, 10)) } else { for (var C = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), h = 0, f = C.length, u = []; f > h; h++) "" !== C[h] && u.push.apply(u, e(C[h].split(""))), h !== f - 1 && u.push(t[h]); var g = u.length; g > 30 && (r = u.slice(0, 10).join("") + u.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + u.slice(-10).join("")) } var l = void 0 , d = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107); l = null !== i ? i : (i = o.common[d] || "") || ""; for (var m = l.split("."), S = Number(m[0]) || 0, s = Number(m[1]) || 0, c = [], v = 0, F = 0; F < r.length; F++) { var p = r.charCodeAt(F); 128 > p ? c[v++] = p : (2048 > p ? c[v++] = p >> 6 | 192 : (55296 === (64512 & p) && F + 1 < r.length && 56320 === (64512 & r.charCodeAt(F + 1)) ? (p = 65536 + ((1023 & p) << 10) + (1023 & r.charCodeAt(++F)), c[v++] = p >> 18 | 240, c[v++] = p >> 12 & 63 | 128) : c[v++] = p >> 12 | 224, c[v++] = p >> 6 & 63 | 128), c[v++] = 63 & p | 128) } for (var w = S, A = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), b = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), D = 0; D < c.length; D++) w += c[D], w = n(w, A); return w = n(w, b), w ^= s, 0 > w && (w = (2147483647 & w) + 2147483648), w %= 1e6, w.toString() + "." + (w ^ S) } ================================================ FILE: 其他实战/【百度】翻译/translation.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-26 Python: 3.7 # 本代码参考 github作者:CriseLYJ import requests import js2py class FanYiSpider(object): """ 翻译 """ context = js2py.EvalJs() # python中使用js def __init__(self, query): # 初始化 self.url = "https://fanyi.baidu.com/basetrans" self.query = query self.headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36", "Referer": "https://fanyi.baidu.com/", "Cookie": "BAIDUID=714BFAAF02DA927F583935C7A354949A:FG=1; BIDUPSID=714BFAAF02DA927F583935C7A354949A; PSTM=1553390486; delPer=0; PSINO=5; H_PS_PSSID=28742_1463_21125_18559_28723_28557_28697_28585_28640_28604_28626_22160; locale=zh; from_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; to_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1553658863,1553766321,1553769980,1553770442; Hm_lpvt_afd111fa62852d1f37001d1f980b6800=1553770442; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1553766258,1553766321,1553769980,1553770442; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1553770442", "Content-Type": "application/x-www-form-urlencoded", "Origin": "https://fanyi.baidu.com", "X-Requested-With": "XMLHttpRequest", } def make_sign(self): with open("translate.js", "r", encoding="utf-8") as f: self.context.execute(f.read()) sign = self.context.a(self.query) return sign def make_data(self, sign): data = { "query": self.query, "from": "en", "to": "zh", "token": "6f5c83b84d69ad3633abdf18abcb030d", "sign": sign } return data def get_content(self, data): response = requests.post( url=self.url, headers=self.headers, data=data ) return response.json()["trans"][0]["dst"] @property def run(self): sign = self.make_sign() # 获取sign的值 data = self.make_data(sign) # 构建参数 content = self.get_content(data) # 获取翻译内容 return content if __name__ == '__main__': key = input("输入翻译内容:") translate = FanYiSpider(key) print(translate.run) ================================================ FILE: 其他实战/【百度】自动登录/README.md ================================================ # 解密过程参考博客 [博客链接](https://www.zhangkunzhi.com/?p=216) ================================================ FILE: 其他实战/【百度】自动登录/encryp.js ================================================ // const jsdom = require("jsdom"); // const { JSDOM } = jsdom; // const dom = new JSDOM(`

Hello world

`); // window = dom.window; // document = window.document; // XMLHttpRequest = window.XMLHttpRequest; var navigator = {}; var windows = {}; passport = {}, passport.lib = passport.lib || {}, passport.lib.RSAExport = {}, function(e) { function t(e, t, n) { null != e && ("number" == typeof e ? this.fromNumber(e, t, n) : null == t && "string" != typeof e ? this.fromString( e, 256) : this.fromString(e, t)) } function n() { return new t(null) } function i(e, t, n, i, s, o) { for (; --o >= 0;) { var r = t * this[e++] + n[i] + s; s = Math.floor(r / 67108864), n[i++] = 67108863 & r } return s } function s(e, t, n, i, s, o) { for (var r = 32767 & t, a = t >> 15; --o >= 0;) { var c = 32767 & this[e], l = this[e++] >> 15, d = a * c + l * r; c = r * c + ((32767 & d) << 15) + n[i] + (1073741823 & s), s = (c >>> 30) + (d >>> 15) + a * l + (s >>> 30), n[i++] = 1073741823 & c } return s } function o(e, t, n, i, s, o) { for (var r = 16383 & t, a = t >> 14; --o >= 0;) { var c = 16383 & this[e], l = this[e++] >> 14, d = a * c + l * r; c = r * c + ((16383 & d) << 14) + n[i] + s, s = (c >> 28) + (d >> 14) + a * l, n[i++] = 268435455 & c } return s } function r(e) { return xn.charAt(e) } function a(e, t) { var n = Ln[e.charCodeAt(t)]; return null == n ? -1 : n } function c(e) { for (var t = this.t - 1; t >= 0; --t) e[t] = this[t]; e.t = this.t, e.s = this.s } function l(e) { this.t = 1, this.s = 0 > e ? -1 : 0, e > 0 ? this[0] = e : -1 > e ? this[0] = e + DV : this.t = 0 } function d(e) { var t = n(); return t.fromInt(e), t } function u(e, n) { var i; if (16 == n) i = 4; else if (8 == n) i = 3; else if (256 == n) i = 8; else if (2 == n) i = 1; else if (32 == n) i = 5; else { if (4 != n) return void this.fromRadix(e, n); i = 2 } this.t = 0, this.s = 0; for (var s = e.length, o = !1, r = 0; --s >= 0;) { var c = 8 == i ? 255 & e[s] : a(e, s); 0 > c ? "-" == e.charAt(s) && (o = !0) : (o = !1, 0 == r ? this[this.t++] = c : r + i > this.DB ? (this[this.t - 1] |= (c & (1 << this.DB - r) - 1) << r, this[this.t++] = c >> this.DB - r) : this[this.t - 1] |= c << r, r += i, r >= this.DB && (r -= this.DB)) } 8 == i && 0 != (128 & e[0]) && (this.s = -1, r > 0 && (this[this.t - 1] |= (1 << this.DB - r) - 1 << r)), this.clamp(), o && t.ZERO.subTo(this, this) } function p() { for (var e = this.s & this.DM; this.t > 0 && this[this.t - 1] == e;) --this.t } function g(e) { if (this.s < 0) return "-" + this.negate().toString(e); var t; if (16 == e) t = 4; else if (8 == e) t = 3; else if (2 == e) t = 1; else if (32 == e) t = 5; else { if (4 != e) return this.toRadix(e); t = 2 } var n, i = (1 << t) - 1, s = !1, o = "", a = this.t, c = this.DB - a * this.DB % t; if (a-- > 0) for (c < this.DB && (n = this[a] >> c) > 0 && (s = !0, o = r(n)); a >= 0;) t > c ? (n = (this[a] & (1 << c) - 1) << t - c, n |= this[--a] >> (c += this.DB - t)) : (n = this[a] >> (c -= t) & i, 0 >= c && (c += this.DB, --a)), n > 0 && (s = !0), s && (o += r(n)); return s ? o : "0" } function h() { var e = n(); return t.ZERO.subTo(this, e), e } function m() { return this.s < 0 ? this.negate() : this } function f(e) { var t = this.s - e.s; if (0 != t) return t; var n = this.t; if (t = n - e.t, 0 != t) return this.s < 0 ? -t : t; for (; --n >= 0;) if (0 != (t = this[n] - e[n])) return t; return 0 } function b(e) { var t, n = 1; return 0 != (t = e >>> 16) && (e = t, n += 16), 0 != (t = e >> 8) && (e = t, n += 8), 0 != (t = e >> 4) && (e = t, n += 4), 0 != (t = e >> 2) && (e = t, n += 2), 0 != (t = e >> 1) && (e = t, n += 1), n } function y() { return this.t <= 0 ? 0 : this.DB * (this.t - 1) + b(this[this.t - 1] ^ this.s & this.DM) } function _(e, t) { var n; for (n = this.t - 1; n >= 0; --n) t[n + e] = this[n]; for (n = e - 1; n >= 0; --n) t[n] = 0; t.t = this.t + e, t.s = this.s } function E(e, t) { for (var n = e; n < this.t; ++n) t[n - e] = this[n]; t.t = Math.max(this.t - e, 0), t.s = this.s } function w(e, t) { var n, i = e % this.DB, s = this.DB - i, o = (1 << s) - 1, r = Math.floor(e / this.DB), a = this.s << i & this.DM; for (n = this.t - 1; n >= 0; --n) t[n + r + 1] = this[n] >> s | a, a = (this[n] & o) << i; for (n = r - 1; n >= 0; --n) t[n] = 0; t[r] = a, t.t = this.t + r + 1, t.s = this.s, t.clamp() } function C(e, t) { t.s = this.s; var n = Math.floor(e / this.DB); if (n >= this.t) return void(t.t = 0); var i = e % this.DB, s = this.DB - i, o = (1 << i) - 1; t[0] = this[n] >> i; for (var r = n + 1; r < this.t; ++r) t[r - n - 1] |= (this[r] & o) << s, t[r - n] = this[r] >> i; i > 0 && (t[this.t - n - 1] |= (this.s & o) << s), t.t = this.t - n, t.clamp() } function S(e, t) { for (var n = 0, i = 0, s = Math.min(e.t, this.t); s > n;) i += this[n] - e[n], t[n++] = i & this.DM, i >>= this.DB; if (e.t < this.t) { for (i -= e.s; n < this.t;) i += this[n], t[n++] = i & this.DM, i >>= this.DB; i += this.s } else { for (i += this.s; n < e.t;) i -= e[n], t[n++] = i & this.DM, i >>= this.DB; i -= e.s } t.s = 0 > i ? -1 : 0, -1 > i ? t[n++] = this.DV + i : i > 0 && (t[n++] = i), t.t = n, t.clamp() } function I(e, n) { var i = this.abs(), s = e.abs(), o = i.t; for (n.t = o + s.t; --o >= 0;) n[o] = 0; for (o = 0; o < s.t; ++o) n[o + i.t] = i.am(0, s[o], n, o, 0, i.t); n.s = 0, n.clamp(), this.s != e.s && t.ZERO.subTo(n, n) } function T(e) { for (var t = this.abs(), n = e.t = 2 * t.t; --n >= 0;) e[n] = 0; for (n = 0; n < t.t - 1; ++n) { var i = t.am(n, t[n], e, 2 * n, 0, 1); (e[n + t.t] += t.am(n + 1, 2 * t[n], e, 2 * n + 1, i, t.t - n - 1)) >= t.DV && (e[n + t.t] -= t.DV, e[n + t.t + 1] = 1) } e.t > 0 && (e[e.t - 1] += t.am(n, t[n], e, 2 * n, 0, 1)), e.s = 0, e.clamp() } function D(e, i, s) { var o = e.abs(); if (!(o.t <= 0)) { var r = this.abs(); if (r.t < o.t) return null != i && i.fromInt(0), void(null != s && this.copyTo(s)); null == s && (s = n()); var a = n(), c = this.s, l = e.s, d = this.DB - b(o[o.t - 1]); d > 0 ? (o.lShiftTo(d, a), r.lShiftTo(d, s)) : (o.copyTo(a), r.copyTo(s)); var u = a.t, p = a[u - 1]; if (0 != p) { var g = p * (1 << this.F1) + (u > 1 ? a[u - 2] >> this.F2 : 0), h = this.FV / g, m = (1 << this.F1) / g, f = 1 << this.F2, v = s.t, y = v - u, _ = null == i ? n() : i; for (a.dlShiftTo(y, _), s.compareTo(_) >= 0 && (s[s.t++] = 1, s.subTo(_, s)), t.ONE.dlShiftTo(u, _), _.subTo(a, a); a.t < u;) a[a.t++] = 0; for (; --y >= 0;) { var E = s[--v] == p ? this.DM : Math.floor(s[v] * h + (s[v - 1] + f) * m); if ((s[v] += a.am(0, E, s, y, 0, u)) < E) for (a.dlShiftTo(y, _), s.subTo(_, s); s[v] < --E;) s.subTo(_, s) } null != i && (s.drShiftTo(u, i), c != l && t.ZERO.subTo(i, i)), s.t = u, s.clamp(), d > 0 && s.rShiftTo(d, s), 0 > c && t.ZERO.subTo(s, s) } } } function R(e) { var i = n(); return this.abs().divRemTo(e, null, i), this.s < 0 && i.compareTo(t.ZERO) > 0 && e.subTo(i, i), i } function k(e) { this.m = e } function x(e) { return e.s < 0 || e.compareTo(this.m) >= 0 ? e.mod(this.m) : e } function L(e) { return e } function P(e) { e.divRemTo(this.m, null, e) } function A(e, t, n) { e.multiplyTo(t, n), this.reduce(n) } function B(e, t) { e.squareTo(t), this.reduce(t) } function M() { if (this.t < 1) return 0; var e = this[0]; if (0 == (1 & e)) return 0; var t = 3 & e; return t = t * (2 - (15 & e) * t) & 15, t = t * (2 - (255 & e) * t) & 255, t = t * (2 - ((65535 & e) * t & 65535)) & 65535, t = t * (2 - e * t % this.DV) % this.DV, t > 0 ? this.DV - t : -t } function V(e) { this.m = e, this.mp = e.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << e.DB - 15) - 1, this.mt2 = 2 * e.t } function $(e) { var i = n(); return e.abs().dlShiftTo(this.m.t, i), i.divRemTo(this.m, null, i), e.s < 0 && i.compareTo(t.ZERO) > 0 && this.m.subTo(i, i), i } function O(e) { var t = n(); return e.copyTo(t), this.reduce(t), t } function U(e) { for (; e.t <= this.mt2;) e[e.t++] = 0; for (var t = 0; t < this.m.t; ++t) { var n = 32767 & e[t], i = n * this.mpl + ((n * this.mph + (e[t] >> 15) * this.mpl & this.um) << 15) & e.DM; for (n = t + this.m.t, e[n] += this.m.am(0, i, e, t, 0, this.m.t); e[n] >= e.DV;) e[n] -= e.DV, e[++n]++ } e.clamp(), e.drShiftTo(this.m.t, e), e.compareTo(this.m) >= 0 && e.subTo(this.m, e) } function N(e, t) { e.squareTo(t), this.reduce(t) } function q(e, t, n) { e.multiplyTo(t, n), this.reduce(n) } function H() { return 0 == (this.t > 0 ? 1 & this[0] : this.s) } function F(e, i) { if (e > 4294967295 || 1 > e) return t.ONE; var s = n(), o = n(), r = i.convert(this), a = b(e) - 1; for (r.copyTo(s); --a >= 0;) if (i.sqrTo(s, o), (e & 1 << a) > 0) i.mulTo(o, r, s); else { var c = s; s = o, o = c } return i.revert(s) } function W(e, t) { var n; return n = 256 > e || t.isEven() ? new k(t) : new V(t), this.exp(e, n) } function K() { var e = n(); return this.copyTo(e), e } function j() { if (this.s < 0) { if (1 == this.t) return this[0] - this.DV; if (0 == this.t) return -1 } else { if (1 == this.t) return this[0]; if (0 == this.t) return 0 } return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0] } function J() { return 0 == this.t ? this.s : this[0] << 24 >> 24 } function G() { return 0 == this.t ? this.s : this[0] << 16 >> 16 } function Q(e) { return Math.floor(Math.LN2 * this.DB / Math.log(e)) } function z() { return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1 } function Z(e) { if (null == e && (e = 10), 0 == this.signum() || 2 > e || e > 36) return "0"; var t = this.chunkSize(e), i = Math.pow(e, t), s = d(i), o = n(), r = n(), a = ""; for (this.divRemTo(s, o, r); o.signum() > 0;) a = (i + r.intValue()).toString(e).substr(1) + a, o.divRemTo(s, o, r); return r.intValue().toString(e) + a } function Y(e, n) { this.fromInt(0), null == n && (n = 10); for (var i = this.chunkSize(n), s = Math.pow(n, i), o = !1, r = 0, c = 0, l = 0; l < e.length; ++l) { var d = a(e, l); 0 > d ? "-" == e.charAt(l) && 0 == this.signum() && (o = !0) : (c = n * c + d, ++r >= i && (this.dMultiply(s), this.dAddOffset(c, 0), r = 0, c = 0)) } r > 0 && (this.dMultiply(Math.pow(n, r)), this.dAddOffset(c, 0)), o && t.ZERO.subTo(this, this) } function X(e, n, i) { if ("number" == typeof n) if (2 > e) this.fromInt(1); else for (this.fromNumber(e, i), this.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), at, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(n);) this.dAddOffset(2, 0), this.bitLength() > e && this.subTo(t.ONE.shiftLeft(e - 1), this); else { var s = new Array, o = 7 & e; s.length = (e >> 3) + 1, n.nextBytes(s), o > 0 ? s[0] &= (1 << o) - 1 : s[0] = 0, this.fromString(s, 256) } } function et() { var e = this.t, t = new Array; t[0] = this.s; var n, i = this.DB - e * this.DB % 8, s = 0; if (e-- > 0) for (i < this.DB && (n = this[e] >> i) != (this.s & this.DM) >> i && (t[s++] = n | this.s << this.DB - i); e >= 0;) 8 > i ? (n = (this[e] & (1 << i) - 1) << 8 - i, n |= this[--e] >> (i += this.DB - 8)) : (n = this[e] >> (i -= 8) & 255, 0 >= i && (i += this.DB, --e)), 0 != (128 & n) && (n |= -256), 0 == s && (128 & this.s) != (128 & n) && ++s, (s > 0 || n != this.s) && (t[s++] = n); return t } function tt(e) { return 0 == this.compareTo(e) } function nt(e) { return this.compareTo(e) < 0 ? this : e } function it(e) { return this.compareTo(e) > 0 ? this : e } function st(e, t, n) { var i, s, o = Math.min(e.t, this.t); for (i = 0; o > i; ++i) n[i] = t(this[i], e[i]); if (e.t < this.t) { for (s = e.s & this.DM, i = o; i < this.t; ++i) n[i] = t(this[i], s); n.t = this.t } else { for (s = this.s & this.DM, i = o; i < e.t; ++i) n[i] = t(s, e[i]); n.t = e.t } n.s = t(this.s, e.s), n.clamp() } function ot(e, t) { return e & t } function rt(e) { var t = n(); return this.bitwiseTo(e, ot, t), t } function at(e, t) { return e | t } function ct(e) { var t = n(); return this.bitwiseTo(e, at, t), t } function lt(e, t) { return e ^ t } function dt(e) { var t = n(); return this.bitwiseTo(e, lt, t), t } function ut(e, t) { return e & ~t } function pt(e) { var t = n(); return this.bitwiseTo(e, ut, t), t } function gt() { for (var e = n(), t = 0; t < this.t; ++t) e[t] = this.DM & ~this[t]; return e.t = this.t, e.s = ~this.s, e } function ht(e) { var t = n(); return 0 > e ? this.rShiftTo(-e, t) : this.lShiftTo(e, t), t } function mt(e) { var t = n(); return 0 > e ? this.lShiftTo(-e, t) : this.rShiftTo(e, t), t } function ft(e) { if (0 == e) return -1; var t = 0; return 0 == (65535 & e) && (e >>= 16, t += 16), 0 == (255 & e) && (e >>= 8, t += 8), 0 == (15 & e) && (e >>= 4, t += 4), 0 == (3 & e) && (e >>= 2, t += 2), 0 == (1 & e) && ++t, t } function vt() { for (var e = 0; e < this.t; ++e) if (0 != this[e]) return e * this.DB + ft(this[e]); return this.s < 0 ? this.t * this.DB : -1 } function bt(e) { for (var t = 0; 0 != e;) e &= e - 1, ++t; return t } function yt() { for (var e = 0, t = this.s & this.DM, n = 0; n < this.t; ++n) e += bt(this[n] ^ t); return e } function _t(e) { var t = Math.floor(e / this.DB); return t >= this.t ? 0 != this.s : 0 != (this[t] & 1 << e % this.DB) } function Et(e, n) { var i = t.ONE.shiftLeft(e); return this.bitwiseTo(i, n, i), i } function wt(e) { return this.changeBit(e, at) } function Ct(e) { return this.changeBit(e, ut) } function St(e) { return this.changeBit(e, lt) } function It(e, t) { for (var n = 0, i = 0, s = Math.min(e.t, this.t); s > n;) i += this[n] + e[n], t[n++] = i & this.DM, i >>= this.DB; if (e.t < this.t) { for (i += e.s; n < this.t;) i += this[n], t[n++] = i & this.DM, i >>= this.DB; i += this.s } else { for (i += this.s; n < e.t;) i += e[n], t[n++] = i & this.DM, i >>= this.DB; i += e.s } t.s = 0 > i ? -1 : 0, i > 0 ? t[n++] = i : -1 > i && (t[n++] = this.DV + i), t.t = n, t.clamp() } function Tt(e) { var t = n(); return this.addTo(e, t), t } function Dt(e) { var t = n(); return this.subTo(e, t), t } function Rt(e) { var t = n(); return this.multiplyTo(e, t), t } function kt() { var e = n(); return this.squareTo(e), e } function xt(e) { var t = n(); return this.divRemTo(e, t, null), t } function Lt(e) { var t = n(); return this.divRemTo(e, null, t), t } function Pt(e) { var t = n(), i = n(); return this.divRemTo(e, t, i), new Array(t, i) } function At(e) { this[this.t] = this.am(0, e - 1, this, 0, 0, this.t), ++this.t, this.clamp() } function Bt(e, t) { if (0 != e) { for (; this.t <= t;) this[this.t++] = 0; for (this[t] += e; this[t] >= this.DV;) this[t] -= this.DV, ++t >= this.t && (this[this.t++] = 0), ++this[t] } } function Mt() {} function Vt(e) { return e } function $t(e, t, n) { e.multiplyTo(t, n) } function Ot(e, t) { e.squareTo(t) } function Ut(e) { return this.exp(e, new Mt) } function Nt(e, t, n) { var i = Math.min(this.t + e.t, t); for (n.s = 0, n.t = i; i > 0;) n[--i] = 0; var s; for (s = n.t - this.t; s > i; ++i) n[i + this.t] = this.am(0, e[i], n, i, 0, this.t); for (s = Math.min(e.t, t); s > i; ++i) this.am(0, e[i], n, i, 0, t - i); n.clamp() } function qt(e, t, n) { --t; var i = n.t = this.t + e.t - t; for (n.s = 0; --i >= 0;) n[i] = 0; for (i = Math.max(t - this.t, 0); i < e.t; ++i) n[this.t + i - t] = this.am(t - i, e[i], n, 0, 0, this.t + i - t); n.clamp(), n.drShiftTo(1, n) } function Ht(e) { this.r2 = n(), this.q3 = n(), t.ONE.dlShiftTo(2 * e.t, this.r2), this.mu = this.r2.divide(e), this.m = e } function Ft(e) { if (e.s < 0 || e.t > 2 * this.m.t) return e.mod(this.m); if (e.compareTo(this.m) < 0) return e; var t = n(); return e.copyTo(t), this.reduce(t), t } function Wt(e) { return e } function Kt(e) { for (e.drShiftTo(this.m.t - 1, this.r2), e.t > this.m.t + 1 && (e.t = this.m.t + 1, e.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); e.compareTo(this.r2) < 0;) e.dAddOffset(1, this.m.t + 1); for (e.subTo(this.r2, e); e.compareTo(this.m) >= 0;) e.subTo(this.m, e) } function jt(e, t) { e.squareTo(t), this.reduce(t) } function Jt(e, t, n) { e.multiplyTo(t, n), this.reduce(n) } function Gt(e, t) { var i, s, o = e.bitLength(), r = d(1); if (0 >= o) return r; i = 18 > o ? 1 : 48 > o ? 3 : 144 > o ? 4 : 768 > o ? 5 : 6, s = 8 > o ? new k(t) : t.isEven() ? new Ht(t) : new V(t); var a = new Array, c = 3, l = i - 1, u = (1 << i) - 1; if (a[1] = s.convert(this), i > 1) { var p = n(); for (s.sqrTo(a[1], p); u >= c;) a[c] = n(), s.mulTo(p, a[c - 2], a[c]), c += 2 } var g, h, m = e.t - 1, f = !0, v = n(); for (o = b(e[m]) - 1; m >= 0;) { for (o >= l ? g = e[m] >> o - l & u : (g = (e[m] & (1 << o + 1) - 1) << l - o, m > 0 && (g |= e[m - 1] >> this.DB + o - l)), c = i; 0 == (1 & g);) g >>= 1, --c; if ((o -= c) < 0 && (o += this.DB, --m), f) a[g].copyTo(r), f = !1; else { for (; c > 1;) s.sqrTo(r, v), s.sqrTo(v, r), c -= 2; c > 0 ? s.sqrTo(r, v) : (h = r, r = v, v = h), s.mulTo(v, a[g], r) } for (; m >= 0 && 0 == (e[m] & 1 << o);) s.sqrTo(r, v), h = r, r = v, v = h, --o < 0 && (o = this.DB - 1, --m) } return s.revert(r) } function Qt(e) { var t = this.s < 0 ? this.negate() : this.clone(), n = e.s < 0 ? e.negate() : e.clone(); if (t.compareTo(n) < 0) { var i = t; t = n, n = i } var s = t.getLowestSetBit(), o = n.getLowestSetBit(); if (0 > o) return t; for (o > s && (o = s), o > 0 && (t.rShiftTo(o, t), n.rShiftTo(o, n)); t.signum() > 0;) (s = t.getLowestSetBit()) > 0 && t.rShiftTo(s, t), (s = n.getLowestSetBit()) > 0 && n.rShiftTo(s, n), t.compareTo(n) >= 0 ? (t.subTo(n, t), t.rShiftTo(1, t)) : (n.subTo(t, n), n.rShiftTo(1, n)); return o > 0 && n.lShiftTo(o, n), n } function zt(e) { if (0 >= e) return 0; var t = this.DV % e, n = this.s < 0 ? e - 1 : 0; if (this.t > 0) if (0 == t) n = this[0] % e; else for (var i = this.t - 1; i >= 0; --i) n = (t * n + this[i]) % e; return n } function Zt(e) { var n = e.isEven(); if (this.isEven() && n || 0 == e.signum()) return t.ZERO; for (var i = e.clone(), s = this.clone(), o = d(1), r = d(0), a = d(0), c = d(1); 0 != i.signum();) { for (; i.isEven();) i.rShiftTo(1, i), n ? (o.isEven() && r.isEven() || (o.addTo(this, o), r.subTo(e, r)), o.rShiftTo(1, o)) : r.isEven() || r.subTo(e, r), r.rShiftTo(1, r); for (; s.isEven();) s.rShiftTo(1, s), n ? (a.isEven() && c.isEven() || (a.addTo(this, a), c.subTo(e, c)), a.rShiftTo(1, a)) : c.isEven() || c.subTo(e, c), c.rShiftTo(1, c); i.compareTo(s) >= 0 ? (i.subTo(s, i), n && o.subTo(a, o), r.subTo(c, r)) : (s.subTo(i, s), n && a.subTo(o, a), c.subTo(r, c)) } return 0 != s.compareTo(t.ONE) ? t.ZERO : c.compareTo(e) >= 0 ? c.subtract(e) : c.signum() < 0 ? (c.addTo(e, c), c.signum() < 0 ? c.add(e) : c) : c } function Yt(e) { var t, n = this.abs(); if (1 == n.t && n[0] <= Pn[Pn.length - 1]) { for (t = 0; t < Pn.length; ++t) if (n[0] == Pn[t]) return !0; return !1 } if (n.isEven()) return !1; for (t = 1; t < Pn.length;) { for (var i = Pn[t], s = t + 1; s < Pn.length && An > i;) i *= Pn[s++]; for (i = n.modInt(i); s > t;) if (i % Pn[t++] == 0) return !1 } return n.millerRabin(e) } function Xt(e) { var i = this.subtract(t.ONE), s = i.getLowestSetBit(); if (0 >= s) return !1; var o = i.shiftRight(s); e = e + 1 >> 1, e > Pn.length && (e = Pn.length); for (var r = n(), a = 0; e > a; ++a) { r.fromInt(Pn[Math.floor(Math.random() * Pn.length)]); var c = r.modPow(o, this); if (0 != c.compareTo(t.ONE) && 0 != c.compareTo(i)) { for (var l = 1; l++ < s && 0 != c.compareTo(i);) if (c = c.modPowInt(2, this), 0 == c.compareTo(t.ONE)) return !1; if (0 != c.compareTo(i)) return !1 } } return !0 } function en() { this.i = 0, this.j = 0, this.S = new Array } function tn(e) { var t, n, i; for (t = 0; 256 > t; ++t) this.S[t] = t; for (n = 0, t = 0; 256 > t; ++t) n = n + this.S[t] + e[t % e.length] & 255, i = this.S[t], this.S[t] = this.S[n], this.S[n] = i; this.i = 0, this.j = 0 } function nn() { var e; return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, e = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = e, this.S[e + this.S[this.i] & 255] } function sn() { return new en } function on(e) { Mn[Vn++] ^= 255 & e, Mn[Vn++] ^= e >> 8 & 255, Mn[Vn++] ^= e >> 16 & 255, Mn[Vn++] ^= e >> 24 & 255, Vn >= $n && (Vn -= $n) } function rn() { on((new Date).getTime()) } function an() { if (null == Bn) { for (rn(), Bn = sn(), Bn.init(Mn), Vn = 0; Vn < Mn.length; ++Vn) Mn[Vn] = 0; Vn = 0 } return Bn.next() } function cn(e) { var t; for (t = 0; t < e.length; ++t) e[t] = an() } function ln() {} function dn(e, n) { return new t(e, n) } function un(e, n) { if (n < e.length + 11) return console.error("Message too long for RSA"), null; for (var i = new Array, s = e.length - 1; s >= 0 && n > 0;) { var o = e.charCodeAt(s--); 128 > o ? i[--n] = o : o > 127 && 2048 > o ? (i[--n] = 63 & o | 128, i[--n] = o >> 6 | 192) : (i[--n] = 63 & o | 128, i[--n] = o >> 6 & 63 | 128, i[--n] = o >> 12 | 224) } i[--n] = 0; for (var r = new ln, a = new Array; n > 2;) { for (a[0] = 0; 0 == a[0];) r.nextBytes(a); i[--n] = a[0] } return i[--n] = 2, i[--n] = 0, new t(i) } function pn() { this.n = null, this.e = 0, this.d = null, this.p = null, this.q = null, this.dmp1 = null, this.dmq1 = null, this.coeff = null } function gn(e, t) { null != e && null != t && e.length > 0 && t.length > 0 ? (this.n = dn(e, 16), this.e = parseInt(t, 16)) : console.error("Invalid RSA public key") } function hn(e) { return e.modPowInt(this.e, this.n) } function mn(e) { var t = un(e, this.n.bitLength() + 7 >> 3); if (null == t) return null; var n = this.doPublic(t); if (null == n) return null; var i = n.toString(16); return 0 == (1 & i.length) ? i : "0" + i } function fn(e, t) { for (var n = e.toByteArray(), i = 0; i < n.length && 0 == n[i];) ++i; if (n.length - i != t - 1 || 2 != n[i]) return null; for (++i; 0 != n[i];) if (++i >= n.length) return null; for (var s = ""; ++i < n.length;) { var o = 255 & n[i]; 128 > o ? s += String.fromCharCode(o) : o > 191 && 224 > o ? (s += String.fromCharCode((31 & o) << 6 | 63 & n[i + 1]), ++i) : (s += String.fromCharCode((15 & o) << 12 | (63 & n[i + 1]) << 6 | 63 & n[i + 2]), i += 2) } return s } function vn(e, t, n) { null != e && null != t && e.length > 0 && t.length > 0 ? (this.n = dn(e, 16), this.e = parseInt(t, 16), this.d = dn(n, 16)) : console.error("Invalid RSA private key") } function bn(e, t, n, i, s, o, r, a) { null != e && null != t && e.length > 0 && t.length > 0 ? (this.n = dn(e, 16), this.e = parseInt(t, 16), this.d = dn(n, 16), this.p = dn(i, 16), this.q = dn(s, 16), this.dmp1 = dn(o, 16), this.dmq1 = dn(r, 16), this.coeff = dn(a, 16)) : console.error("Invalid RSA private key") } function yn(e, n) { var i = new ln, s = e >> 1; this.e = parseInt(n, 16); for (var o = new t(n, 16);;) { for (; this.p = new t(e - s, 1, i), 0 != this.p.subtract(t.ONE).gcd(o).compareTo(t.ONE) || !this.p.isProbablePrime(10);) ; for (; this.q = new t(s, 1, i), 0 != this.q.subtract(t.ONE).gcd(o).compareTo(t.ONE) || !this.q.isProbablePrime(10);) ; if (this.p.compareTo(this.q) <= 0) { var r = this.p; this.p = this.q, this.q = r } var a = this.p.subtract(t.ONE), c = this.q.subtract(t.ONE), l = a.multiply(c); if (0 == l.gcd(o).compareTo(t.ONE)) { this.n = this.p.multiply(this.q), this.d = o.modInverse(l), this.dmp1 = this.d.mod(a), this.dmq1 = this.d.mod(c), this.coeff = this.q.modInverse(this.p); break } } } function _n(e) { if (null == this.p || null == this.q) return e.modPow(this.d, this.n); for (var t = e.mod(this.p).modPow(this.dmp1, this.p), n = e.mod(this.q).modPow(this.dmq1, this.q); t.compareTo(n) < 0;) t = t.add(this.p); return t.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n) } function En(e) { var t = dn(e, 16), n = this.doPrivate(t); return null == n ? null : fn(n, this.n.bitLength() + 7 >> 3) } function wn(e) { var t, n, i = ""; for (t = 0; t + 3 <= e.length; t += 3) n = parseInt(e.substring(t, t + 3), 16), i += Nn.charAt(n >> 6) + Nn.charAt(63 & n); for (t + 1 == e.length ? (n = parseInt(e.substring(t, t + 1), 16), i += Nn.charAt(n << 2)) : t + 2 == e.length && (n = parseInt(e.substring(t, t + 2), 16), i += Nn.charAt(n >> 2) + Nn.charAt((3 & n) << 4)); (3 & i.length) > 0;) i += qn; return i } function Cn(e) { var t, n, i = "", s = 0; for (t = 0; t < e.length && e.charAt(t) != qn; ++t) v = Nn.indexOf(e.charAt(t)), 0 > v || (0 == s ? (i += r(v >> 2), n = 3 & v, s = 1) : 1 == s ? (i += r(n << 2 | v >> 4), n = 15 & v, s = 2) : 2 == s ? (i += r(n), i += r(v >> 2), n = 3 & v, s = 3) : (i += r(n << 2 | v >> 4), i += r(15 & v), s = 0)); return 1 == s && (i += r(n << 2)), i } var Sn, In = 0xdeadbeefcafe, Tn = 15715070 == (16777215 & In); Tn && "Microsoft Internet Explorer" == navigator.appName ? (t.prototype.am = s, Sn = 30) : Tn && "Netscape" != navigator.appName ? (t.prototype.am = i, Sn = 26) : (t.prototype.am = o, Sn = 28), t.prototype.DB = Sn, t.prototype.DM = (1 << Sn) - 1, t.prototype.DV = 1 << Sn; var Dn = 52; t.prototype.FV = Math.pow(2, Dn), t.prototype.F1 = Dn - Sn, t.prototype.F2 = 2 * Sn - Dn; var Rn, kn, xn = "0123456789abcdefghijklmnopqrstuvwxyz", Ln = new Array; for (Rn = "0".charCodeAt(0), kn = 0; 9 >= kn; ++kn) Ln[Rn++] = kn; for (Rn = "a".charCodeAt(0), kn = 10; 36 > kn; ++kn) Ln[Rn++] = kn; for (Rn = "A".charCodeAt(0), kn = 10; 36 > kn; ++kn) Ln[Rn++] = kn; k.prototype.convert = x, k.prototype.revert = L, k.prototype.reduce = P, k.prototype.mulTo = A, k.prototype.sqrTo = B, V.prototype.convert = $, V.prototype.revert = O, V.prototype.reduce = U, V.prototype.mulTo = q, V.prototype.sqrTo = N, t.prototype.copyTo = c, t.prototype.fromInt = l, t.prototype.fromString = u, t.prototype.clamp = p, t.prototype.dlShiftTo = _, t.prototype.drShiftTo = E, t.prototype.lShiftTo = w, t.prototype.rShiftTo = C, t.prototype.subTo = S, t.prototype.multiplyTo = I, t.prototype.squareTo = T, t.prototype.divRemTo = D, t.prototype.invDigit = M, t.prototype.isEven = H, t.prototype.exp = F, t.prototype.toString = g, t.prototype.negate = h, t.prototype.abs = m, t.prototype.compareTo = f, t.prototype.bitLength = y, t.prototype.mod = R, t.prototype.modPowInt = W, t.ZERO = d(0), t.ONE = d(1), Mt.prototype.convert = Vt, Mt.prototype.revert = Vt, Mt.prototype.mulTo = $t, Mt.prototype.sqrTo = Ot, Ht.prototype.convert = Ft, Ht.prototype.revert = Wt, Ht.prototype.reduce = Kt, Ht.prototype.mulTo = Jt, Ht.prototype.sqrTo = jt; var Pn = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 ], An = (1 << 26) / Pn[Pn.length - 1]; t.prototype.chunkSize = Q, t.prototype.toRadix = Z, t.prototype.fromRadix = Y, t.prototype.fromNumber = X, t.prototype.bitwiseTo = st, t.prototype.changeBit = Et, t.prototype.addTo = It, t.prototype.dMultiply = At, t.prototype.dAddOffset = Bt, t.prototype.multiplyLowerTo = Nt, t.prototype.multiplyUpperTo = qt, t.prototype.modInt = zt, t.prototype.millerRabin = Xt, t.prototype.clone = K, t.prototype.intValue = j, t.prototype.byteValue = J, t.prototype.shortValue = G, t.prototype.signum = z, t.prototype.toByteArray = et, t.prototype.equals = tt, t.prototype.min = nt, t.prototype.max = it, t.prototype.and = rt, t.prototype.or = ct, t.prototype.xor = dt, t.prototype.andNot = pt, t.prototype.not = gt, t.prototype.shiftLeft = ht, t.prototype.shiftRight = mt, t.prototype.getLowestSetBit = vt, t.prototype.bitCount = yt, t.prototype.testBit = _t, t.prototype.setBit = wt, t.prototype.clearBit = Ct, t.prototype.flipBit = St, t.prototype.add = Tt, t.prototype.subtract = Dt, t.prototype.multiply = Rt, t.prototype.divide = xt, t.prototype.remainder = Lt, t.prototype.divideAndRemainder = Pt, t.prototype.modPow = Gt, t.prototype.modInverse = Zt, t.prototype.pow = Ut, t.prototype.gcd = Qt, t.prototype.isProbablePrime = Yt, t.prototype.square = kt, en.prototype.init = tn, en.prototype.next = nn; var Bn, Mn, Vn, $n = 256; if (null == Mn) { Mn = new Array, Vn = 0; var On; if ("Netscape" == navigator.appName && navigator.appVersion < "5" && window.crypto) { var Un = window.crypto.random(32); for (On = 0; On < Un.length; ++On) Mn[Vn++] = 255 & Un.charCodeAt(On) } for (; $n > Vn;) On = Math.floor(65536 * Math.random()), Mn[Vn++] = On >>> 8, Mn[Vn++] = 255 & On; Vn = 0, rn() } ln.prototype.nextBytes = cn, pn.prototype.doPublic = hn, pn.prototype.setPublic = gn, pn.prototype.encrypt = mn, pn.prototype.doPrivate = _n, pn.prototype.setPrivate = vn, pn.prototype.setPrivateEx = bn, pn.prototype.generate = yn, pn.prototype.decrypt = En, function() { var e = function(e, i, s) { var o = new ln, r = e >> 1; this.e = parseInt(i, 16); var a = new t(i, 16), c = this, l = function() { var i = function() { if (c.p.compareTo(c.q) <= 0) { var e = c.p; c.p = c.q, c.q = e } var n = c.p.subtract(t.ONE), i = c.q.subtract(t.ONE), o = n.multiply(i); 0 == o.gcd(a).compareTo(t.ONE) ? (c.n = c.p.multiply(c.q), c.d = a.modInverse(o), c.dmp1 = c.d.mod(n), c.dmq1 = c.d.mod(i), c.coeff = c.q.modInverse(c.p), setTimeout(function() { s() }, 0)) : setTimeout(l, 0) }, d = function() { c.q = n(), c.q.fromNumberAsync(r, 1, o, function() { c.q.subtract(t.ONE).gcda(a, function(e) { 0 == e.compareTo(t.ONE) && c.q.isProbablePrime(10) ? setTimeout(i, 0) : setTimeout(d, 0) }) }) }, u = function() { c.p = n(), c.p.fromNumberAsync(e - r, 1, o, function() { c.p.subtract(t.ONE).gcda(a, function(e) { 0 == e.compareTo(t.ONE) && c.p.isProbablePrime(10) ? setTimeout(d, 0) : setTimeout(u, 0) }) }) }; setTimeout(u, 0) }; setTimeout(l, 0) }; pn.prototype.generateAsync = e; var i = function(e, t) { var n = this.s < 0 ? this.negate() : this.clone(), i = e.s < 0 ? e.negate() : e.clone(); if (n.compareTo(i) < 0) { var s = n; n = i, i = s } var o = n.getLowestSetBit(), r = i.getLowestSetBit(); if (0 > r) return void t(n); r > o && (r = o), r > 0 && (n.rShiftTo(r, n), i.rShiftTo(r, i)); var a = function() { (o = n.getLowestSetBit()) > 0 && n.rShiftTo(o, n), (o = i.getLowestSetBit()) > 0 && i.rShiftTo(o, i), n.compareTo(i) >= 0 ? (n.subTo(i, n), n.rShiftTo(1, n)) : (i.subTo(n, i), i.rShiftTo(1, i)), n.signum() > 0 ? setTimeout(a, 0) : (r > 0 && i.lShiftTo(r, i), setTimeout(function() { t(i) }, 0)) }; setTimeout(a, 10) }; t.prototype.gcda = i; var s = function(e, n, i, s) { if ("number" == typeof n) if (2 > e) this.fromInt(1); else { this.fromNumber(e, i), this.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), at, this), this.isEven() && this.dAddOffset(1, 0); var o = this, r = function() { o.dAddOffset(2, 0), o.bitLength() > e && o.subTo(t.ONE.shiftLeft(e - 1), o), o.isProbablePrime(n) ? setTimeout(function() { s() }, 0) : setTimeout(r, 0) }; setTimeout(r, 0) } else { var a = new Array, c = 7 & e; a.length = (e >> 3) + 1, n.nextBytes(a), c > 0 ? a[0] &= (1 << c) - 1 : a[0] = 0, this.fromString(a, 256) } }; t.prototype.fromNumberAsync = s }(); var Nn = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", qn = "=", Hn = Hn || {}; Hn.env = Hn.env || {}; var Fn = Hn, Wn = Object.prototype, Kn = "[object Function]", jn = ["toString", "valueOf"]; Hn.env.parseUA = function(e) { var t, n = function(e) { var t = 0; return parseFloat(e.replace(/\./g, function() { return 1 == t++ ? "" : "." })) }, i = navigator, s = { ie: 0, opera: 0, gecko: 0, webkit: 0, chrome: 0, mobile: null, air: 0, ipad: 0, iphone: 0, ipod: 0, ios: null, android: 0, webos: 0, caja: i && i.cajaVersion, secure: !1, os: null }, o = e || navigator && navigator.userAgent, r = window && window.location, a = r && r.href; return s.secure = a && 0 === a.toLowerCase().indexOf("https"), o && (/windows|win32/i.test(o) ? s.os = "windows" : /macintosh/i.test(o) ? s.os = "macintosh" : /rhino/i.test(o) && (s.os = "rhino"), /KHTML/.test(o) && (s.webkit = 1), t = o.match(/AppleWebKit\/([^\s]*)/), t && t[1] && (s.webkit = n(t[1]), / Mobile\//.test(o) ? (s.mobile = "Apple", t = o.match(/OS ([^\s]*)/), t && t[1] && (t = n(t[1].replace("_", "."))), s.ios = t, s.ipad = s.ipod = s.iphone = 0, t = o.match(/iPad|iPod|iPhone/), t && t[0] && (s[t[0].toLowerCase()] = s.ios)) : (t = o.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/), t && (s.mobile = t[0]), /webOS/.test(o) && (s.mobile = "WebOS", t = o.match(/webOS\/([^\s]*);/), t && t[1] && (s.webos = n(t[1]))), / Android/.test(o) && (s.mobile = "Android", t = o.match(/Android ([^\s]*);/), t && t[1] && (s.android = n(t[1])))), t = o.match(/Chrome\/([^\s]*)/), t && t[1] ? s.chrome = n(t[1]) : (t = o.match(/AdobeAIR\/([^\s]*)/), t && (s.air = t[0]))), s.webkit || (t = o.match(/Opera[\s\/]([^\s]*)/), t && t[1] ? (s.opera = n(t[1]), t = o.match(/Version\/([^\s]*)/), t && t[1] && (s.opera = n(t[1])), t = o.match(/Opera Mini[^;]*/), t && (s.mobile = t[0])) : (t = o.match(/MSIE\s([^;]*)/), t && t[1] ? s.ie = n(t[1]) : (t = o.match(/Gecko\/([^\s]*)/), t && (s.gecko = 1, t = o.match(/rv:([^\s\)]*)/), t && t[1] && (s.gecko = n(t[1]))))))), s }, Hn.env.ua = Hn.env.parseUA(), Hn.isFunction = function(e) { return "function" == typeof e || Wn.toString.apply(e) === Kn }, Hn._IEEnumFix = Hn.env.ua.ie ? function(e, t) { var n, i, s; for (n = 0; n < jn.length; n += 1) i = jn[n], s = t[i], Fn.isFunction(s) && s != Wn[i] && (e[i] = s) } : function() {}, Hn.extend = function(e, t, n) { if (!t || !e) throw new Error("extend failed, please check that all dependencies are included."); var i, s = function() {}; if (s.prototype = t.prototype, e.prototype = new s, e.prototype.constructor = e, e.superclass = t.prototype, t.prototype.constructor == Wn.constructor && (t.prototype.constructor = t), n) { for (i in n) Fn.hasOwnProperty(n, i) && (e.prototype[i] = n[i]); Fn._IEEnumFix(e.prototype, n) } }, "undefined" != typeof KJUR && KJUR || (KJUR = {}), "undefined" != typeof KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}), KJUR.asn1.ASN1Util = new function() { this.integerToByteHex = function(e) { var t = e.toString(16); return t.length % 2 == 1 && (t = "0" + t), t }, this.bigIntToMinTwosComplementsHex = function(e) { var n = e.toString(16); if ("-" != n.substr(0, 1)) n.length % 2 == 1 ? n = "0" + n : n.match(/^[0-7]/) || (n = "00" + n); else { var i = n.substr(1), s = i.length; s % 2 == 1 ? s += 1 : n.match(/^[0-7]/) || (s += 2); for (var o = "", r = 0; s > r; r++) o += "f"; var a = new t(o, 16), c = a.xor(e).add(t.ONE); n = c.toString(16).replace(/^-/, "") } return n }, this.getPEMStringFromHex = function(e, t) { var n = CryptoJS.enc.Hex.parse(e), i = CryptoJS.enc.Base64.stringify(n), s = i.replace(/(.{64})/g, "$1\r\n"); return s = s.replace(/\r\n$/, ""), "-----BEGIN " + t + "-----\r\n" + s + "\r\n-----END " + t + "-----\r\n" } }, KJUR.asn1.ASN1Object = function() { var e = ""; this.getLengthHexFromValue = function() { if ("undefined" == typeof this.hV || null == this.hV) throw "this.hV is null or undefined."; if (this.hV.length % 2 == 1) throw "value hex must be even length: n=" + e.length + ",v=" + this.hV; var t = this.hV.length / 2, n = t.toString(16); if (n.length % 2 == 1 && (n = "0" + n), 128 > t) return n; var i = n.length / 2; if (i > 15) throw "ASN.1 length too long to represent by 8x: n = " + t.toString(16); var s = 128 + i; return s.toString(16) + n }, this.getEncodedHex = function() { return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1), this.hTLV }, this.getValueHex = function() { return this.getEncodedHex(), this.hV }, this.getFreshValueHex = function() { return "" } }, KJUR.asn1.DERAbstractString = function(e) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this), this.getString = function() { return this.s }, this.setString = function(e) { this.hTLV = null, this.isModified = !0, this.s = e, this.hV = stohex(this.s) }, this.setStringHex = function(e) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = e }, this.getFreshValueHex = function() { return this.hV }, "undefined" != typeof e && ("undefined" != typeof e.str ? this.setString(e.str) : "undefined" != typeof e.hex && this.setStringHex(e.hex)) }, Hn.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object), KJUR.asn1.DERAbstractTime = function() { KJUR.asn1.DERAbstractTime.superclass.constructor.call(this), this.localDateToUTC = function(e) { utc = e.getTime() + 6e4 * e.getTimezoneOffset(); var t = new Date(utc); return t }, this.formatDate = function(e, t) { var n = this.zeroPadding, i = this.localDateToUTC(e), s = String(i.getFullYear()); "utc" == t && (s = s.substr(2, 2)); var o = n(String(i.getMonth() + 1), 2), r = n(String(i.getDate()), 2), a = n(String(i.getHours()), 2), c = n(String(i.getMinutes()), 2), l = n(String(i.getSeconds()), 2); return s + o + r + a + c + l + "Z" }, this.zeroPadding = function(e, t) { return e.length >= t ? e : new Array(t - e.length + 1).join("0") + e }, this.getString = function() { return this.s }, this.setString = function(e) { this.hTLV = null, this.isModified = !0, this.s = e, this.hV = stohex(this.s) }, this.setByDateValue = function(e, t, n, i, s, o) { var r = new Date(Date.UTC(e, t - 1, n, i, s, o, 0)); this.setByDate(r) }, this.getFreshValueHex = function() { return this.hV } }, Hn.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object), KJUR.asn1.DERAbstractStructured = function(e) { KJUR.asn1.DERAbstractString.superclass.constructor.call(this), this.setByASN1ObjectArray = function(e) { this.hTLV = null, this.isModified = !0, this.asn1Array = e }, this.appendASN1Object = function(e) { this.hTLV = null, this.isModified = !0, this.asn1Array.push(e) }, this.asn1Array = new Array, "undefined" != typeof e && "undefined" != typeof e.array && (this.asn1Array = e.array) }, Hn.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object), KJUR.asn1.DERBoolean = function() { KJUR.asn1.DERBoolean.superclass.constructor.call(this), this.hT = "01", this.hTLV = "0101ff" }, Hn.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object), KJUR.asn1.DERInteger = function(e) { KJUR.asn1.DERInteger.superclass.constructor.call(this), this.hT = "02", this.setByBigInteger = function(e) { this.hTLV = null, this.isModified = !0, this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(e) }, this.setByInteger = function(e) { var n = new t(String(e), 10); this.setByBigInteger(n) }, this.setValueHex = function(e) { this.hV = e }, this.getFreshValueHex = function() { return this.hV }, "undefined" != typeof e && ("undefined" != typeof e.bigint ? this.setByBigInteger(e.bigint) : "undefined" != typeof e["int"] ? this.setByInteger(e["int"]) : "undefined" != typeof e.hex && this.setValueHex(e.hex)) }, Hn.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object), KJUR.asn1.DERBitString = function(e) { KJUR.asn1.DERBitString.superclass.constructor.call(this), this.hT = "03", this.setHexValueIncludingUnusedBits = function(e) { this.hTLV = null, this.isModified = !0, this.hV = e }, this.setUnusedBitsAndHexValue = function(e, t) { if (0 > e || e > 7) throw "unused bits shall be from 0 to 7: u = " + e; var n = "0" + e; this.hTLV = null, this.isModified = !0, this.hV = n + t }, this.setByBinaryString = function(e) { e = e.replace(/0+$/, ""); var t = 8 - e.length % 8; 8 == t && (t = 0); for (var n = 0; t >= n; n++) e += "0"; for (var i = "", n = 0; n < e.length - 1; n += 8) { var s = e.substr(n, 8), o = parseInt(s, 2).toString(16); 1 == o.length && (o = "0" + o), i += o } this.hTLV = null, this.isModified = !0, this.hV = "0" + t + i }, this.setByBooleanArray = function(e) { for (var t = "", n = 0; n < e.length; n++) t += 1 == e[n] ? "1" : "0"; this.setByBinaryString(t) }, this.newFalseArray = function(e) { for (var t = new Array(e), n = 0; e > n; n++) t[n] = !1; return t }, this.getFreshValueHex = function() { return this.hV }, "undefined" != typeof e && ("undefined" != typeof e.hex ? this.setHexValueIncludingUnusedBits(e.hex) : "undefined" != typeof e.bin ? this.setByBinaryString(e.bin) : "undefined" != typeof e.array && this.setByBooleanArray( e.array)) }, Hn.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object), KJUR.asn1.DEROctetString = function(e) { KJUR.asn1.DEROctetString.superclass.constructor.call(this, e), this.hT = "04" }, Hn.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERNull = function() { KJUR.asn1.DERNull.superclass.constructor.call(this), this.hT = "05", this.hTLV = "0500" }, Hn.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object), KJUR.asn1.DERObjectIdentifier = function(e) { var n = function(e) { var t = e.toString(16); return 1 == t.length && (t = "0" + t), t }, i = function(e) { var i = "", s = new t(e, 10), o = s.toString(2), r = 7 - o.length % 7; 7 == r && (r = 0); for (var a = "", c = 0; r > c; c++) a += "0"; o = a + o; for (var c = 0; c < o.length - 1; c += 7) { var l = o.substr(c, 7); c != o.length - 7 && (l = "1" + l), i += n(parseInt(l, 2)) } return i }; KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this), this.hT = "06", this.setValueHex = function(e) { this.hTLV = null, this.isModified = !0, this.s = null, this.hV = e }, this.setValueOidString = function(e) { if (!e.match(/^[0-9.]+$/)) throw "malformed oid string: " + e; var t = "", s = e.split("."), o = 40 * parseInt(s[0]) + parseInt(s[1]); t += n(o), s.splice(0, 2); for (var r = 0; r < s.length; r++) t += i(s[r]); this.hTLV = null, this.isModified = !0, this.s = null, this.hV = t }, this.setValueName = function(e) { if ("undefined" == typeof KJUR.asn1.x509.OID.name2oidList[e]) throw "DERObjectIdentifier oidName undefined: " + e; var t = KJUR.asn1.x509.OID.name2oidList[e]; this.setValueOidString(t) }, this.getFreshValueHex = function() { return this.hV }, "undefined" != typeof e && ("undefined" != typeof e.oid ? this.setValueOidString(e.oid) : "undefined" != typeof e .hex ? this.setValueHex(e.hex) : "undefined" != typeof e.name && this.setValueName(e.name)) }, Hn.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object), KJUR.asn1.DERUTF8String = function(e) { KJUR.asn1.DERUTF8String.superclass.constructor.call(this, e), this.hT = "0c" }, Hn.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString), KJUR.asn1.DERNumericString = function(e) { KJUR.asn1.DERNumericString.superclass.constructor.call(this, e), this.hT = "12" }, Hn.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERPrintableString = function(e) { KJUR.asn1.DERPrintableString.superclass.constructor.call(this, e), this.hT = "13" }, Hn.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERTeletexString = function(e) { KJUR.asn1.DERTeletexString.superclass.constructor.call(this, e), this.hT = "14" }, Hn.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString), KJUR.asn1.DERIA5String = function(e) { KJUR.asn1.DERIA5String.superclass.constructor.call(this, e), this.hT = "16" }, Hn.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString), KJUR.asn1.DERUTCTime = function(e) { KJUR.asn1.DERUTCTime.superclass.constructor.call(this, e), this.hT = "17", this.setByDate = function(e) { this.hTLV = null, this.isModified = !0, this.date = e, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s) }, "undefined" != typeof e && ("undefined" != typeof e.str ? this.setString(e.str) : "undefined" != typeof e.hex ? this.setStringHex(e.hex) : "undefined" != typeof e.date && this.setByDate(e.date)) }, Hn.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime), KJUR.asn1.DERGeneralizedTime = function(e) { KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, e), this.hT = "18", this.setByDate = function(e) { this.hTLV = null, this.isModified = !0, this.date = e, this.s = this.formatDate(this.date, "gen"), this.hV = stohex(this.s) }, "undefined" != typeof e && ("undefined" != typeof e.str ? this.setString(e.str) : "undefined" != typeof e.hex ? this.setStringHex(e.hex) : "undefined" != typeof e.date && this.setByDate(e.date)) }, Hn.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime), KJUR.asn1.DERSequence = function(e) { KJUR.asn1.DERSequence.superclass.constructor.call(this, e), this.hT = "30", this.getFreshValueHex = function() { for (var e = "", t = 0; t < this.asn1Array.length; t++) { var n = this.asn1Array[t]; e += n.getEncodedHex() } return this.hV = e, this.hV } }, Hn.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured), KJUR.asn1.DERSet = function(e) { KJUR.asn1.DERSet.superclass.constructor.call(this, e), this.hT = "31", this.getFreshValueHex = function() { for (var e = new Array, t = 0; t < this.asn1Array.length; t++) { var n = this.asn1Array[t]; e.push(n.getEncodedHex()) } return e.sort(), this.hV = e.join(""), this.hV } }, Hn.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured), KJUR.asn1.DERTaggedObject = function(e) { KJUR.asn1.DERTaggedObject.superclass.constructor.call(this), this.hT = "a0", this.hV = "", this.isExplicit = !0, this.asn1Object = null, this.setASN1Object = function(e, t, n) { this.hT = t, this.isExplicit = e, this.asn1Object = n, this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = n.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, t), this.isModified = !1) }, this.getFreshValueHex = function() { return this.hV }, "undefined" != typeof e && ("undefined" != typeof e.tag && (this.hT = e.tag), "undefined" != typeof e.explicit && (this.isExplicit = e.explicit), "undefined" != typeof e.obj && (this.asn1Object = e.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object))) }, Hn.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object), function(e) { "use strict"; var t, n = {}; n.decode = function(n) { var i; if (t === e) { var s = "0123456789ABCDEF", o = " \f\n\r  \u2028\u2029"; for (t = [], i = 0; 16 > i; ++i) t[s.charAt(i)] = i; for (s = s.toLowerCase(), i = 10; 16 > i; ++i) t[s.charAt(i)] = i; for (i = 0; i < o.length; ++i) t[o.charAt(i)] = -1 } var r = [], a = 0, c = 0; for (i = 0; i < n.length; ++i) { var l = n.charAt(i); if ("=" == l) break; if (l = t[l], -1 != l) { if (l === e) throw "Illegal character at offset " + i; a |= l, ++c >= 2 ? (r[r.length] = a, a = 0, c = 0) : a <<= 4 } } if (c) throw "Hex encoding incomplete: 4 bits missing"; return r }, window.Hex = n }(), function(e) { "use strict"; var t, n = {}; n.decode = function(n) { var i; if (t === e) { var s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", o = "= \f\n\r  \u2028\u2029"; for (t = [], i = 0; 64 > i; ++i) t[s.charAt(i)] = i; for (i = 0; i < o.length; ++i) t[o.charAt(i)] = -1 } var r = [], a = 0, c = 0; for (i = 0; i < n.length; ++i) { var l = n.charAt(i); if ("=" == l) break; if (l = t[l], -1 != l) { if (l === e) throw "Illegal character at offset " + i; a |= l, ++c >= 4 ? (r[r.length] = a >> 16, r[r.length] = a >> 8 & 255, r[r.length] = 255 & a, a = 0, c = 0) : a <<= 6 } } switch (c) { case 1: throw "Base64 encoding incomplete: at least 2 bits missing"; case 2: r[r.length] = a >> 10; break; case 3: r[r.length] = a >> 16, r[r.length] = a >> 8 & 255 } return r }, n.re = /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/, n.unarmor = function(e) { var t = n.re.exec(e); if (t) if (t[1]) e = t[1]; else { if (!t[2]) throw "RegExp out of sync"; e = t[2] } return n.decode(e) }, window.Base64 = n }(), function(e) { "use strict"; function t(e, n) { e instanceof t ? (this.enc = e.enc, this.pos = e.pos) : (this.enc = e, this.pos = n) } function n(e, t, n, i, s) { this.stream = e, this.header = t, this.length = n, this.tag = i, this.sub = s } var i = 100, s = "…", o = { tag: function(e, t) { var n = document.createElement(e); return n.className = t, n }, text: function(e) { return document.createTextNode(e) } }; t.prototype.get = function(t) { if (t === e && (t = this.pos++), t >= this.enc.length) throw "Requesting byte offset " + t + " on a stream of length " + this.enc.length; return this.enc[t] }, t.prototype.hexDigits = "0123456789ABCDEF", t.prototype.hexByte = function(e) { return this.hexDigits.charAt(e >> 4 & 15) + this.hexDigits.charAt(15 & e) }, t.prototype.hexDump = function(e, t, n) { for (var i = "", s = e; t > s; ++s) if (i += this.hexByte(this.get(s)), n !== !0) switch (15 & s) { case 7: i += " "; break; case 15: i += "\n"; break; default: i += " " } return i }, t.prototype.parseStringISO = function(e, t) { for (var n = "", i = e; t > i; ++i) n += String.fromCharCode(this.get(i)); return n }, t.prototype.parseStringUTF = function(e, t) { for (var n = "", i = e; t > i;) { var s = this.get(i++); n += String.fromCharCode(128 > s ? s : s > 191 && 224 > s ? (31 & s) << 6 | 63 & this.get(i++) : (15 & s) << 12 | (63 & this.get(i++)) << 6 | 63 & this.get(i++)) } return n }, t.prototype.parseStringBMP = function(e, t) { for (var n = "", i = e; t > i; i += 2) { var s = this.get(i), o = this.get(i + 1); n += String.fromCharCode((s << 8) + o) } return n }, t.prototype.reTime = /^((?:1[89]|2\d)?\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, t.prototype.parseTime = function(e, t) { var n = this.parseStringISO(e, t), i = this.reTime.exec(n); return i ? (n = i[1] + "-" + i[2] + "-" + i[3] + " " + i[4], i[5] && (n += ":" + i[5], i[6] && (n += ":" + i[6], i[7] && (n += "." + i[7]))), i[8] && (n += " UTC", "Z" != i[8] && (n += i[8], i[9] && (n += ":" + i[9]))), n) : "Unrecognized time: " + n }, t.prototype.parseInteger = function(e, t) { var n = t - e; if (n > 4) { n <<= 3; var i = this.get(e); if (0 === i) n -= 8; else for (; 128 > i;) i <<= 1, --n; return "(" + n + " bit)" } for (var s = 0, o = e; t > o; ++o) s = s << 8 | this.get(o); return s }, t.prototype.parseBitString = function(e, t) { var n = this.get(e), i = (t - e - 1 << 3) - n, s = "(" + i + " bit)"; if (20 >= i) { var o = n; s += " "; for (var r = t - 1; r > e; --r) { for (var a = this.get(r), c = o; 8 > c; ++c) s += a >> c & 1 ? "1" : "0"; o = 0 } } return s }, t.prototype.parseOctetString = function(e, t) { var n = t - e, o = "(" + n + " byte) "; n > i && (t = e + i); for (var r = e; t > r; ++r) o += this.hexByte(this.get(r)); return n > i && (o += s), o }, t.prototype.parseOID = function(e, t) { for (var n = "", i = 0, s = 0, o = e; t > o; ++o) { var r = this.get(o); if (i = i << 7 | 127 & r, s += 7, !(128 & r)) { if ("" === n) { var a = 80 > i ? 40 > i ? 0 : 1 : 2; n = a + "." + (i - 40 * a) } else n += "." + (s >= 31 ? "bigint" : i); i = s = 0 } } return n }, n.prototype.typeName = function() { if (this.tag === e) return "unknown"; var t = this.tag >> 6, n = (this.tag >> 5 & 1, 31 & this.tag); switch (t) { case 0: switch (n) { case 0: return "EOC"; case 1: return "BOOLEAN"; case 2: return "INTEGER"; case 3: return "BIT_STRING"; case 4: return "OCTET_STRING"; case 5: return "NULL"; case 6: return "OBJECT_IDENTIFIER"; case 7: return "ObjectDescriptor"; case 8: return "EXTERNAL"; case 9: return "REAL"; case 10: return "ENUMERATED"; case 11: return "EMBEDDED_PDV"; case 12: return "UTF8String"; case 16: return "SEQUENCE"; case 17: return "SET"; case 18: return "NumericString"; case 19: return "PrintableString"; case 20: return "TeletexString"; case 21: return "VideotexString"; case 22: return "IA5String"; case 23: return "UTCTime"; case 24: return "GeneralizedTime"; case 25: return "GraphicString"; case 26: return "VisibleString"; case 27: return "GeneralString"; case 28: return "UniversalString"; case 30: return "BMPString"; default: return "Universal_" + n.toString(16) } case 1: return "Application_" + n.toString(16); case 2: return "[" + n + "]"; case 3: return "Private_" + n.toString(16) } }, n.prototype.reSeemsASCII = /^[ -~]+$/, n.prototype.content = function() { if (this.tag === e) return null; var t = this.tag >> 6, n = 31 & this.tag, o = this.posContent(), r = Math.abs(this.length); if (0 !== t) { if (null !== this.sub) return "(" + this.sub.length + " elem)"; var a = this.stream.parseStringISO(o, o + Math.min(r, i)); return this.reSeemsASCII.test(a) ? a.substring(0, 2 * i) + (a.length > 2 * i ? s : "") : this.stream.parseOctetString( o, o + r) } switch (n) { case 1: return 0 === this.stream.get(o) ? "false" : "true"; case 2: return this.stream.parseInteger(o, o + r); case 3: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(o, o + r); case 4: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(o, o + r); case 6: return this.stream.parseOID(o, o + r); case 16: case 17: return "(" + this.sub.length + " elem)"; case 12: return this.stream.parseStringUTF(o, o + r); case 18: case 19: case 20: case 21: case 22: case 26: return this.stream.parseStringISO(o, o + r); case 30: return this.stream.parseStringBMP(o, o + r); case 23: case 24: return this.stream.parseTime(o, o + r) } return null }, n.prototype.toString = function() { return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (null === this.sub ? "null" : this.sub.length) + "]" }, n.prototype.print = function(t) { if (t === e && (t = ""), document.writeln(t + this), null !== this.sub) { t += " "; for (var n = 0, i = this.sub.length; i > n; ++n) this.sub[n].print(t) } }, n.prototype.toPrettyString = function(t) { t === e && (t = ""); var n = t + this.typeName() + " @" + this.stream.pos; if (this.length >= 0 && (n += "+"), n += this.length, 32 & this.tag ? n += " (constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (n += " (encapsulates)"), n += "\n", null !== this.sub) { t += " "; for (var i = 0, s = this.sub.length; s > i; ++i) n += this.sub[i].toPrettyString(t) } return n }, n.prototype.toDOM = function() { var e = o.tag("div", "node"); e.asn1 = this; var t = o.tag("div", "head"), n = this.typeName().replace(/_/g, " "); t.innerHTML = n; var i = this.content(); if (null !== i) { i = String(i).replace(/", n += "Length: " + this.header + "+", n += this.length >= 0 ? this.length : -this.length + " (undefined)", 32 & this.tag ? n += "
(constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (n += "
(encapsulates)"), null !== i && (n += "
Value:
" + i + "", "object" == typeof oids && 6 == this.tag)) { var a = oids[i]; a && (a.d && (n += "
" + a.d), a.c && (n += "
" + a.c), a.w && (n += "
(warning!)")) } r.innerHTML = n, e.appendChild(r); var c = o.tag("div", "sub"); if (null !== this.sub) for (var l = 0, d = this.sub.length; d > l; ++l) c.appendChild(this.sub[l].toDOM()); return e.appendChild(c), t.onclick = function() { e.className = "node collapsed" == e.className ? "node" : "node collapsed" }, e }, n.prototype.posStart = function() { return this.stream.pos }, n.prototype.posContent = function() { return this.stream.pos + this.header }, n.prototype.posEnd = function() { return this.stream.pos + this.header + Math.abs(this.length) }, n.prototype.fakeHover = function(e) { this.node.className += " hover", e && (this.head.className += " hover") }, n.prototype.fakeOut = function(e) { var t = / ?hover/; this.node.className = this.node.className.replace(t, ""), e && (this.head.className = this.head.className.replace(t, "")) }, n.prototype.toHexDOM_sub = function(e, t, n, i, s) { if (!(i >= s)) { var r = o.tag("span", t); r.appendChild(o.text(n.hexDump(i, s))), e.appendChild(r) } }, n.prototype.toHexDOM = function(t) { var n = o.tag("span", "hex"); if (t === e && (t = n), this.head.hexNode = n, this.head.onmouseover = function() { this.hexNode.className = "hexCurrent" }, this.head.onmouseout = function() { this.hexNode.className = "hex" }, n.asn1 = this, n.onmouseover = function() { var e = !t.selected; e && (t.selected = this.asn1, this.className = "hexCurrent"), this.asn1.fakeHover(e) }, n.onmouseout = function() { var e = t.selected == this.asn1; this.asn1.fakeOut(e), e && (t.selected = null, this.className = "hex") }, this.toHexDOM_sub(n, "tag", this.stream, this.posStart(), this.posStart() + 1), this.toHexDOM_sub(n, this.length >= 0 ? "dlen" : "ulen", this.stream, this.posStart() + 1, this.posContent()), null === this.sub) n.appendChild(o.text(this.stream.hexDump(this.posContent(), this.posEnd()))); else if (this.sub.length > 0) { var i = this.sub[0], s = this.sub[this.sub.length - 1]; this.toHexDOM_sub(n, "intro", this.stream, this.posContent(), i.posStart()); for (var r = 0, a = this.sub.length; a > r; ++r) n.appendChild(this.sub[r].toHexDOM(t)); this.toHexDOM_sub(n, "outro", this.stream, s.posEnd(), this.posEnd()) } return n }, n.prototype.toHexString = function() { return this.stream.hexDump(this.posStart(), this.posEnd(), !0) }, n.decodeLength = function(e) { var t = e.get(), n = 127 & t; if (n == t) return n; if (n > 3) throw "Length over 24 bits not supported at position " + (e.pos - 1); if (0 === n) return -1; t = 0; for (var i = 0; n > i; ++i) t = t << 8 | e.get(); return t }, n.hasContent = function(e, i, s) { if (32 & e) return !0; if (3 > e || e > 4) return !1; var o = new t(s); 3 == e && o.get(); var r = o.get(); if (r >> 6 & 1) return !1; try { var a = n.decodeLength(o); return o.pos - s.pos + a == i } catch (c) { return !1 } }, n.decode = function(e) { e instanceof t || (e = new t(e, 0)); var i = new t(e), s = e.get(), o = n.decodeLength(e), r = e.pos - i.pos, a = null; if (n.hasContent(s, o, e)) { var c = e.pos; if (3 == s && e.get(), a = [], o >= 0) { for (var l = c + o; e.pos < l;) a[a.length] = n.decode(e); if (e.pos != l) throw "Content size is not correct for container starting at offset " + c } else try { for (;;) { var d = n.decode(e); if (0 === d.tag) break; a[a.length] = d } o = c - e.pos } catch (u) { throw "Exception while decoding undefined length content: " + u } } else e.pos += o; return new n(i, r, o, s, a) }, n.test = function() { for (var e = [{ value: [39], expected: 39 }, { value: [129, 201], expected: 201 }, { value: [131, 254, 220, 186], expected: 16702650 }], i = 0, s = e.length; s > i; ++i) { var o = new t(e[i].value, 0), r = n.decodeLength(o); r != e[i].expected && document.write("In test[" + i + "] expected " + e[i].expected + " got " + r + "\n") } }, window.ASN1 = n }(), ASN1.prototype.getHexStringValue = function() { var e = this.toHexString(), t = 2 * this.header, n = 2 * this.length; return e.substr(t, n) }, pn.prototype.parseKey = function(e) { try { var t = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/, n = t.test(e) ? Hex.decode(e) : Base64.unarmor(e), i = ASN1.decode(n); if (9 === i.sub.length) { var s = i.sub[1].getHexStringValue(); this.n = dn(s, 16); var o = i.sub[2].getHexStringValue(); this.e = parseInt(o, 16); var r = i.sub[3].getHexStringValue(); this.d = dn(r, 16); var a = i.sub[4].getHexStringValue(); this.p = dn(a, 16); var c = i.sub[5].getHexStringValue(); this.q = dn(c, 16); var l = i.sub[6].getHexStringValue(); this.dmp1 = dn(l, 16); var d = i.sub[7].getHexStringValue(); this.dmq1 = dn(d, 16); var u = i.sub[8].getHexStringValue(); this.coeff = dn(u, 16) } else { if (2 !== i.sub.length) return !1; var p = i.sub[1], g = p.sub[0], s = g.sub[0].getHexStringValue(); this.n = dn(s, 16); var o = g.sub[1].getHexStringValue(); this.e = parseInt(o, 16) } return !0 } catch (h) { return !1 } }, pn.prototype.getPrivateBaseKey = function() { var e = { array: [new KJUR.asn1.DERInteger({ "int": 0 }), new KJUR.asn1.DERInteger({ bigint: this.n }), new KJUR.asn1.DERInteger({ "int": this.e }), new KJUR.asn1.DERInteger({ bigint: this.d }), new KJUR.asn1.DERInteger({ bigint: this.p }), new KJUR.asn1.DERInteger({ bigint: this.q }), new KJUR.asn1.DERInteger({ bigint: this.dmp1 }), new KJUR.asn1.DERInteger({ bigint: this.dmq1 }), new KJUR.asn1.DERInteger({ bigint: this.coeff })] }, t = new KJUR.asn1.DERSequence(e); return t.getEncodedHex() }, pn.prototype.getPrivateBaseKeyB64 = function() { return wn(this.getPrivateBaseKey()) }, pn.prototype.getPublicBaseKey = function() { var e = { array: [new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }), new KJUR.asn1.DERNull] }, t = new KJUR.asn1.DERSequence(e); e = { array: [new KJUR.asn1.DERInteger({ bigint: this.n }), new KJUR.asn1.DERInteger({ "int": this.e })] }; var n = new KJUR.asn1.DERSequence(e); e = { hex: "00" + n.getEncodedHex() }; var i = new KJUR.asn1.DERBitString(e); e = { array: [t, i] }; var s = new KJUR.asn1.DERSequence(e); return s.getEncodedHex() }, pn.prototype.getPublicBaseKeyB64 = function() { return wn(this.getPublicBaseKey()) }, pn.prototype.wordwrap = function(e, t) { if (t = t || 64, !e) return e; var n = "(.{1," + t + "})( +|$\n?)|(.{1," + t + "})"; return e.match(RegExp(n, "g")).join("\n") }, pn.prototype.getPrivateKey = function() { var e = "-----BEGIN RSA PRIVATE KEY-----\n"; return e += this.wordwrap(this.getPrivateBaseKeyB64()) + "\n", e += "-----END RSA PRIVATE KEY-----" }, pn.prototype.getPublicKey = function() { var e = "-----BEGIN PUBLIC KEY-----\n"; return e += this.wordwrap(this.getPublicBaseKeyB64()) + "\n", e += "-----END PUBLIC KEY-----" }, pn.prototype.hasPublicKeyProperty = function(e) { return e = e || {}, e.hasOwnProperty("n") && e.hasOwnProperty("e") }, pn.prototype.hasPrivateKeyProperty = function(e) { return e = e || {}, e.hasOwnProperty("n") && e.hasOwnProperty("e") && e.hasOwnProperty("d") && e.hasOwnProperty("p") && e.hasOwnProperty( "q") && e.hasOwnProperty("dmp1") && e.hasOwnProperty("dmq1") && e.hasOwnProperty("coeff") }, pn.prototype.parsePropertiesFrom = function(e) { this.n = e.n, this.e = e.e, e.hasOwnProperty("d") && (this.d = e.d, this.p = e.p, this.q = e.q, this.dmp1 = e.dmp1, this.dmq1 = e.dmq1, this.coeff = e.coeff) }; var Jn = function(e) { pn.call(this), e && ("string" == typeof e ? this.parseKey(e) : (this.hasPrivateKeyProperty(e) || this.hasPublicKeyProperty(e)) && this.parsePropertiesFrom(e)) }; Jn.prototype = new pn, Jn.prototype.constructor = Jn; var Gn = function(e) { e = e || {}, this.default_key_size = parseInt(e.default_key_size) || 1024, this.default_public_exponent = e.default_public_exponent || "010001", this.log = e.log || !1, this.key = null }; Gn.prototype.setKey = function(e) { this.log && this.key && console.warn("A key was already set, overriding existing."), this.key = new Jn(e) }, Gn.prototype.setPrivateKey = function(e) { this.setKey(e) }, Gn.prototype.setPublicKey = function(e) { this.setKey(e) }, Gn.prototype.decrypt = function(e) { try { return this.getKey().decrypt(Cn(e)) } catch (t) { return !1 } }, Gn.prototype.encrypt = function(e) { try { return wn(this.getKey().encrypt(e)) } catch (t) { return !1 } }, Gn.prototype.getKey = function(e) { if (!this.key) { if (this.key = new Jn, e && "[object Function]" === {}.toString.call(e)) return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, e); this.key.generate(this.default_key_size, this.default_public_exponent) } return this.key }, Gn.prototype.getPrivateKey = function() { return this.getKey().getPrivateKey() }, Gn.prototype.getPrivateKeyB64 = function() { return this.getKey().getPrivateBaseKeyB64() }, Gn.prototype.getPublicKey = function() { return this.getKey().getPublicKey() }, Gn.prototype.getPublicKeyB64 = function() { return this.getKey().getPublicBaseKeyB64() }, e.JSEncrypt = Gn }(passport.lib.RSAExport), passport.lib.RSA = passport.lib.RSAExport.JSEncrypt; // url 解析方法 function urlprase(a) { return String(a).replace(/[#%&+=\/\\\ \ \f\r\n\t]/g, function(b) { return "%" + (256 + b.charCodeAt()).toString(16).substring(1).toUpperCase() }) } function test(pwd) { // 从三部曲的位置定义 e.RSA var n = new passport.lib.RSA; // n = 实例化的 加密方法,等同于Gn n.setKey( "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpm5sKQOivxCFkdQJtPfDtBX4U\nQweH9OmCCjg46jH\/DpuXF3RfEe5dMO99+QskfoI35xymDQyRrvX2iE7bKzxh3sOZ\nI\/vG1SnAEXid0+\/yz1BLbJ9Djaffnx8F2pAKyK2PPk8XvJyOOVZAm6yiRO7VgeOv\nkdXyYoqpokkgrbQkMQIDAQAB\n-----END PUBLIC KEY-----\n" ); return urlprase(n.encrypt(pwd)) } ================================================ FILE: 其他实战/【百度】自动登录/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-05 Python: 3.7 """ 百度登陆参数比较多 这里是密码加密生成器 """ import js2py class PingDuoDuoSpider(object): """ 生成百度登陆密码加密结果 """ context = js2py.EvalJs() # python中使用js def __init__(self): # 初始化 with open("encryp.js", "r", encoding="utf-8") as f: self.context.execute(f.read()) def make(self, password): pwd = self.context.test(password) print(pwd) # 打印加密之后的密码 if __name__ == '__main__': pdd = PingDuoDuoSpider() key = input("输入密码") pdd.make(key) ================================================ FILE: 其他实战/【百度街拍】图片下载/get_image.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-05 Python: 3.7 import requests, time from urllib.parse import urlencode from urllib.request import urlretrieve def getPage(offset): '''获取网页信息''' data = { 'tn': 'resultjson_com', 'ipn': 'rj', 'ct': '201326592', 'is': '', 'fp': 'result', 'queryWord': '街拍', 'cl': '2', 'lm': '-1', 'ie': 'utf - 8', 'oe': 'utf - 8', 'adpicid': '', 'st': '-1', 'z': '', 'ic': '0', 'hd': '', 'latest': '', 'copyright': '', 'word': '街拍', 's': '', 'se': '', 'tab': '', 'width': '', 'height': '', 'face': '0', 'istype': '2', 'qc': '', 'nc': '1', 'fr': '', 'expermode': '', 'force': '', 'pn': offset, 'rn': '30', 'gsm': '1e', '1551789143500': '', } headers = { 'Accept': 'text/plain, */*; q=0.01', 'Accept-Encoding': 'deflate, br', 'Accept-Language': 'Accept-Language', 'Connection': 'keep-alive', 'Cookie': 'BDqhfp=%E8%A1%97%E6%8B%8D%26%260-10-1undefined%26%260%26%261; BIDUPSID=7CA5F033CA22949F5FB6110DBC5DC1EE; BAIDUID=6DDE5BAA44763FD6C7CA84401CB19F36:FG=1; indexPageSugList=%5B%22%E8%A1%97%E6%8B%8D%22%5D; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; uploadTime=1551768107224; userFrom=null; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; firstShowTip=1; cleanHistoryStatus=0', 'Host': 'image.baidu.com', 'Referer': 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E8%A1%97%E6%8B%8D&oq=%E8%A1%97%E6%8B%8D&rsp=-1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6735.400 QQBrowser/10.2.2328.400', 'X-Requested-With': 'XMLHttpRequest', } url = 'https://image.baidu.com/search/acjson?' + urlencode(data) try: res = requests.get(url, data=data, headers=headers) res.encoding = 'utf-8' # 网页信息编码 if res.status_code == 200: return res.json() except requests.ConnectionError: return None def getImage(json): '''解析网页数据并爬取所需的信息''' try: data = json.get('data') if data: for item in data: yield { 'image': item.get('hoverURL'), 'title': item.get('fromPageTitleEnc'), } except: return None def saveImage(item): '''把获取的图片与标题封装并存储''' try: m = item.get('title') local_image = item.get('image') # 获取图片的url image_url = local_image urlretrieve(image_url, './pic/' + str(m) + '.jpg') # print('p'+str(m) + '.jpg') except: return None def main(offset): '''调度爬取函数和存储''' json = getPage(offset) for item in getImage(json): print(item) saveImage(item) if __name__ == '__main__': for i in range(5): # 此处循环遍历五次是不可行的 每次data值中的gsm在变化 main(offset=i * 30) time.sleep(1) ================================================ FILE: 其他实战/【移动】登录参数生成/MakeParam.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-05 Python: 3.7 import execjs.runtime_names class MakeParam: """ 移动登陆 加密参数生成器 页面 https://mail.10086.cn/ """ def __init__(self, name, pwd): self.name = name self.pwd = pwd self.js = None self.init_js() def init_js(self): print('引擎', execjs.get().name) with open("encryp.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def mk_params(self): cguid = self.js.call("customerGetCGUID") _ = self.js.call('sha1', self.name) word = self.js.call('calcDigest', self.pwd) msg = """ cguid: {cguid} _: {_} password: {word} """ print(msg.format(cguid=cguid, _=_, word=word)) if __name__ == '__main__': username = input('输入用户名') password = input('输入密码') yd = MakeParam(username, password) yd.mk_params() ================================================ FILE: 其他实战/【移动】登录参数生成/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【移动】登录参数生成/encryp.js ================================================ function sha1(a) { function b(a, b) { var c = (a & 65535) + (b & 65535); return (a >> 16) + (b >> 16) + (c >> 16) << 16 | c & 65535 } for (var c = [], d = 0; d < 8 * a.length; d += 8) c[d >> 5] |= (a.charCodeAt(d / 8) & 255) << 24 - d % 32; a = 8 * a.length; c[a >> 5] |= 128 << 24 - a % 32; c[(a + 64 >> 9 << 4) + 15] = a; a = Array(80); for (var d = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < c.length; h += 16) { for (var l = d, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) { a[j] = 16 > j ? c[h + j] : (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^ a[j - 16]) << 1 | (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^ a[j - 16]) >>> 31; var r = b(b(d << 5 | d >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), b(b(k, a[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514)), k = g, g = f, f = e << 30 | e >>> 2, e = d, d = r } d = b(d, l); e = b(e, m); f = b(f, n); g = b(g, p); k = b(k, q) } c = [d, e, f, g, k]; a = ""; for (d = 0; d < 4 * c.length; d++) a += "0123456789abcdef".charAt(c[d >> 2] >> 8 * (3 - d % 4) + 4 & 15) + "0123456789abcdef".charAt(c[d >> 2] >> 8 * (3 - d % 4) & 15); return a } function a(a, c) { var d = (a & 65535) + (c & 65535); return (a >> 16) + (c >> 16) + (d >> 16) << 16 | d & 65535 } calcDigest = function (b) { for (var c = (b.length + 8 >> 6) + 1, d = Array(16 * c), e = 0; e < 16 * c; e++) d[e] = 0; for (e = 0; e < b.length; e++) d[e >> 2] |= b.charCodeAt(e) << 24 - 8 * (e & 3); d[e >> 2] |= 128 << 24 - 8 * (e & 3); d[16 * c - 1] = 8 * b.length; b = Array(80); for (var c = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < d.length; h += 16) { for (var l = c, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) { b[j] = 16 > j ? d[h + j] : (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) << 1 | (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) >>> 31; var r = a(a(c << 5 | c >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), a(a(k, b[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514)), k = g, g = f, f = e << 30 | e >>> 2, e = c, c = r } c = a(c, l); e = a(e, m); f = a(f, n); g = a(g, p); k = a(k, q) } d = [c, e, f, g, k]; b = ""; for (c = 0; c < 4 * d.length; c++) b += "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) + 4 & 15) + "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) & 15); return b } function customerGetCGUID() { function a(a, b) { var e = (b || 2) - (1 + Math.floor(Math.log(a | 1) / Math.LN10 + 1E-15)); return Array(e + 1).join("0") + a } var b = new Date; return "" + a(b.getHours()) + a(b.getMinutes()) + a(b.getSeconds()) + a(b.getMilliseconds(), 3) + a(Math.ceil(9999 * Math.random()), 4) } ================================================ FILE: 其他实战/【空中网】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【空中网】自动登录/encryp.js ================================================ function mk_pwd (str, pwd) { if (pwd == null || pwd.length <= 0) { return null } ;var prand = ""; for (var i = 0; i < pwd.length; i++) { prand += pwd.charCodeAt(i).toString() } ;var sPos = Math.floor(prand.length / 5); var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5)); var incr = Math.ceil(pwd.length / 2); var modu = Math.pow(2, 31) - 1; if (mult < 2) { return null } ;var salt = Math.round(Math.random() * 1000000000) % 100000000; prand += salt; while (prand.length > 10) { var a = prand.substring(0, 1); var b = prand.substring(10, prand.length); if (b.length > 10) { prand = b } else { prand = (parseInt(a) + parseInt(b)).toString() } } ;prand = (mult * prand + incr) % modu; var enc_chr = ""; var enc_str = ""; for (var i = 0; i < str.length; i++) { enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255)); if (enc_chr < 16) { enc_str += "0" + enc_chr.toString(16) } else enc_str += enc_chr.toString(16); prand = (mult * prand + incr) % modu } ;salt = salt.toString(16); while (salt.length < 8) salt = "0" + salt; enc_str += salt; return enc_str } ================================================ FILE: 其他实战/【空中网】自动登录/spider_login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-03 Python: 3.7 import re import time import requests import execjs.runtime_names class SpiderLogin: """ 空中网爬虫登陆 """ def __init__(self, user, pwd): self.session = requests.session() self.user = user self.pwd = pwd self.login_time = int(round(time.time() * 1000)) self.url = 'https://m.wcbchina.com/login/other-login.html' self.headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', 'Host': 'sso.kongzhong.com', 'Referer': 'https://passport.kongzhong.com/login' } def use_js(self, dc): """js 调用 """ with open("encryp.js", "r", encoding="utf-8") as f: js = execjs.compile(f.read()) try: pwd = js.call("mk_pwd", self.pwd, dc) return pwd except Exception: print('js 异常') def auto_login(self): """登陆 """ login_url = 'https://sso.kongzhong.com/ajaxLogin?j=j&&type=1&service=https://passport.kongzhong.com/&username={username}&password={password}&vcode=&toSave=0&_={_time}' dc = self.get_dc() en_pwd = self.use_js(dc) response = self.session.get(login_url.format(username=self.user, password=en_pwd, _time=self.login_time), headers=self.headers) print(response.cookies) print(response.text) print(response) def get_dc(self): """捕获 dc 参数 """ target = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_={t}'.format( t=self.login_time) response = self.session.get(target, headers=self.headers) try: dc = re.search(r'"dc":"(.*?)","kzmsg', response.text).group(1) return dc except AttributeError: print('dc 捕获失败') if __name__ == '__main__': username = input('请输入账号') password = input('密码') kzw = SpiderLogin(username, password) kzw.auto_login() ================================================ FILE: 其他实战/【美团】数据解析、token生成/README.md ================================================ ``` . └── MeiTuan // -------美团------- ├── get_login_cookies.py // 基于pyppeteer登陆并获取cookies ├── parse_play_areas.py // 三级区域解析器(休闲板块) ├── parse_play_info.py // 休闲会所商铺数据解析 ├── parse_hotel_info.py // 酒店基础数据解析 ├── parse_hotel_comments.py // 酒店评论解析 ├── create_food_token.py // 餐饮页Token生成器 ├── parse_food_comments.py // 获取用户评论数据   └── parse_food_info.py // 解析餐馆数据 ``` ================================================ FILE: 其他实战/【美团】数据解析、token生成/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-18 Python: 3.7 ================================================ FILE: 其他实战/【美团】数据解析、token生成/create_food_token.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-21 Python: 3.7 import json, zlib, base64, time class MakeToken(): """ 测试2019-4-21日可用 仅作为学术交流!如有侵权,联系作者删除 美团【餐馆列表】Token生成 """ def __init__(self, areaId, cityName, originUrl, page): self.areaId = areaId self.cityName = cityName self.originUrl = originUrl self.page = page self.uuid = 'c6eada3ffd8e444491e9.1555472928.3.0.0' # Demo def join_sign(self): # 参数 sign = 'areaId={areaId}&cateId=0&cityName={cityName}&dinnerCountAttrId=&optimusCode=1&originUrl={originUrl}&page={page}&partner=126&platform=1&riskLevel=1&sort=&userId=&uuid={uuid}' _str = sign.format(areaId=self.areaId, cityName=self.cityName, originUrl=self.originUrl, page=self.page, uuid=self.uuid) sign = base64.b64encode(zlib.compress(bytes(json.dumps(_str, ensure_ascii=False), encoding="utf8"))) sign = str(sign, encoding="utf8") return sign @property def join_token(self): str_json = {} str_json['rId'] = 100900 str_json['ver'] = '1.0.6' str_json['ts'] = time.time() str_json['cts'] = time.time() + 110 str_json['brVD'] = [1920, 315] str_json['brR'] = [[1920, 1080], [1920, 1057], 24, 24] str_json['bI'] = [self.originUrl, ""] str_json['mT'] = [] str_json['kT'] = [] str_json['aT'] = [] str_json['tT'] = [] str_json['aM'] = '' str_json['sign'] = self.join_sign() token_decode = zlib.compress( bytes(json.dumps(str_json, separators=(',', ':'), ensure_ascii=False), encoding="utf8")) token = str(base64.b64encode(token_decode), encoding="utf8") return token if __name__ == '__main__': # 测试数据 areaId = '4581' cityName = '重庆' originUrl = 'http://cq.meituan.com/meishi/b4581/' page = '1' token = MakeToken(areaId, cityName, originUrl, page) print(token.join_token) ================================================ FILE: 其他实战/【美团】数据解析、token生成/get_login_cookies.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-21 Python: 3.7 import asyncio import json from pyppeteer import launch class MeiTuanCookies(): def __init__(self, username, password): self.login_url = 'https://passport.meituan.com/account/unitivelogin' self.username = username self.password = password async def star(self): browser = await launch() context = await browser.createIncogniteBrowserContext() page = await context.newPage() await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,' '{ webdriver:{ get: () => false } }) }') # 本页刷新后值不变 await page.goto(self.login_url) await page.type('input#login-email', self.username) await page.type('input#login-password', self.password) await page.click('input.btn') await self.get_cookie(page) async def get_cookie(self, page): """ 获取 cookies :param page: 页面 :return: """ cookies_list = await page.cookies() cookies = '' for cookie in cookies_list: str_cookie = '{0}={1};' str_cookie = str_cookie.format(cookie.get('name'), cookie.get('value')) cookies += str_cookie print(cookies) if __name__ == '__main__': name = input('美团账号') pwd = input('密码') mt = MeiTuanCookies(name, pwd) loop = asyncio.get_event_loop() loop.run_until_complete(mt.star()) ================================================ FILE: 其他实战/【美团】数据解析、token生成/parse_food_comments.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-17 Python: 3.7 import requests import json import time from urllib import parse class ParseComments(object): def __init__(self, shop_id): self.shop_id = shop_id self.get_data() def get_data(self): url_code = self.get_originUrl() url = 'http://www.meituan.com/meishi/api/poi/getMerchantComment?' params = { 'platform': '1', 'partner': '126', 'originUrl': url_code, 'riskLevel': '1', 'optimusCode': '1', 'id': self.shop_id, 'offset': '0', 'pageSize': '10', 'sortType': '1', } headers = { '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', } response = requests.get(url=url, params=params, headers=headers) data = response.text self.parse(data) def get_originUrl(self): """编码解码 """ return parse.quote_plus('http://www.meituan.com/meishi/' + self.shop_id + '/') def parse(self, data): """解析数据 """ data_dict = json.loads(data) for item in data_dict.get('data').get('comments'): create_time = self.parse_time(item.get('commentTime')) print_str = """ 评论用户:{userName} 评论时间:{create_time} 评论详情:{comment} 评论id:{reviewId} """.format(userName=item.get('userName'), comment=item.get('comment'), create_time=create_time, reviewId=item.get('reviewId')) print(print_str) @staticmethod def parse_time(timeStamp): """13位 解码时间 """ time_stamp = float(int(timeStamp) / 1000) time_array = time.localtime(time_stamp) return time.strftime("%Y-%m-%d %H:%M:%S", time_array) if __name__ == '__main__': p_id = input('请输入餐馆id') ParseComments(p_id) ================================================ FILE: 其他实战/【美团】数据解析、token生成/parse_food_info.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-18 Python: 3.7 """ 解析菜馆信息 """ import requests import re import json class ParseRestaurantInfo(object): target_url = 'https://www.meituan.com/meishi/{p_id}/' headers = { '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', } def __init__(self, restaurant_id): self.restaurant_id = restaurant_id self.go_to_restaurant() def go_to_restaurant(self): """执行访问 """ url = self.target_url.format(p_id=self.restaurant_id) data = requests.get(url, headers=self.headers).text # 提取有效区域 data = re.search(r'12315消费争议(.*?)"dealList":', data, flags=re.DOTALL) if data: self.parse_html(data.group(1)) else: print('访问失效') @staticmethod def parse_html(data): """解析数据 """ # 细节信息 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) if detail_info: poiId = detail_info.group(1) name = detail_info.group(2) avgScore = detail_info.group(3) address = detail_info.group(4) phone = detail_info.group(5) openTime = detail_info.group(6) extraInfos = detail_info.group(7) hasFoodSafeInfo = detail_info.group(8) longitude = detail_info.group(9) latitude = detail_info.group(10) avgPrice = detail_info.group(11) brandId = detail_info.group(12) brandName = detail_info.group(13) frontImgUrl = detail_info.group(14) albumImgUrls = detail_info.group(15) # 其他信息解析 if extraInfos: items = json.loads("[" + extraInfos + "]") extraInfos = '' for item in items: extraInfos = item.get('text') + ' ' + extraInfos # 推荐菜处理 recommended = json.loads(detail_info.group(16)) # 面包屑抽离 crumbNav = json.loads(detail_info.group(17)) area = crumbNav[0].get('title')[:-2] food_type = crumbNav[2].get('title')[len(area):] print('区域: ', area, ' 餐饮类型: ', food_type) print_str = """ ========解析结果======== 店铺ID: {poiId} 餐馆名称: {name} 综合评分: {avgScore} 详细地址: {address} 联系电话: {phone} 营业时间: {openTime} 其他信息: {extraInfos} 是否有卫生许可证: {hasFoodSafeInfo} 经度: {longitude} 纬度: {latitude} 平均消费: {avgPrice} 所属品牌ID: {brandId} 品牌: {brandName} 店铺主图: {frontImgUrl} 相册: {albumImgUrls} 推荐菜品区:""".format(poiId=poiId, name=name, avgScore=avgScore, address=address, phone=phone, openTime=openTime, extraInfos=extraInfos, hasFoodSafeInfo=hasFoodSafeInfo, longitude=longitude, latitude=latitude, avgPrice=avgPrice, brandId=brandId, brandName=brandName, frontImgUrl=frontImgUrl, albumImgUrls=albumImgUrls) print(print_str) # 打印推荐菜 for item in list(recommended): # recommend_id = item['id'] # 推荐菜id recommend_name = item['name'] # 推荐菜名 recommend_price = item['price'] # 菜品价格 recommend_img = item['frontImgUrl'] # 菜品图片 print(recommend_name, end=' ') else: print('数据信息失败') if __name__ == '__main__': p_id = input('请输入餐馆id') # p_id = '364942' # p_id = '98327266' # p_id = '6902945' ParseRestaurantInfo(p_id) ================================================ FILE: 其他实战/【美团】数据解析、token生成/parse_hotel_comments.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-10 Python: 3.7 """ 解析酒店评论 """ import requests import json import time class ParseComments(object): """解析酒店评论 """ def __init__(self, hotel_id): self.hotel_id = hotel_id self.get_data() def get_data(self): url = 'https://ihotel.meituan.com/group/v1/poi/comment/' + self.hotel_id + '?' params = { 'sortType': 'default', 'noempty': '1', 'withpic': '0', 'filter': 'all', 'limit': '10', 'offset': '0', } headers = { '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', } response = requests.get(url=url, params=params, headers=headers) data = response.text self.parse(data) def parse(self, data): """解析数据 """ data_dict = json.loads(data) for item in data_dict.get('data').get('feedback'): create_time = self.parse_time(item.get('replytimestamp')) print_str = """ 评论用户:{userName} 评论时间:{create_time} 评论详情:{comment} 满意度:{scoretext} """.format(userName=item.get('username'), comment=item.get('comment'), create_time=create_time, scoretext=item.get('scoretext')) print(print_str) self.parse_pic(item) @staticmethod def parse_time(timeStamp): """13位 解码时间 """ time_array = time.localtime(timeStamp) return time.strftime("%Y-%m-%d %H:%M:%S", time_array) def parse_pic(self, item): pic_list = [i.get('url').replace('w.h', '750.0') for i in item.get('picinfo')] print(pic_list) if __name__ == '__main__': p_id = input('请输入酒店id') ParseComments(p_id) ================================================ FILE: 其他实战/【美团】数据解析、token生成/parse_hotel_info.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-05 Python: 3.7 """ 解析 美团酒店店铺的基础信息 该板块信息隐藏在get请求后的js中直接用正则匹配出信息再抽取出来 """ import requests import re import json import time class ParseHotelInfo(object): headers = { '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', } def __init__(self, p_id): self.p_id = p_id def go_to_hotel(self): """执行访问 """ # 拼接日期 now_day = time.strftime('%Y-%m-%d', time.localtime(time.time())) # 组合 get 地址 url = 'https://hotel.meituan.com/' + self.p_id + '/?ci=' + now_day + '&co=' + now_day data = requests.get(url, headers=self.headers).content.decode('utf-8') # 提取有效区域 info = re.search(r'window.__INITIAL_STATE__=(.*?)', data, flags=re.DOTALL) if info: info_dict = json.loads(info.group(1).strip()[:-1]) self.parse_html(info_dict) else: print('访问失效') def parse_html(self, data_dict): data = data_dict.get('poiData') print('店名', data.get('name')) print('店铺id', data.get('poiid')) print('城市id', data.get('cityId')) print('地址', data.get('addr')) print('lng', data.get('lng')) print('lat', data.get('lat')) print('封面', data.get('frontImg').replace('w.h', '750.0')) print('wifi', data.get('wifi')) print('地区id', data.get('areaId')) print('地区名', data.get('areaName')) print('平均消费', data.get('avgPrice')) print('类别id', data.get('brandId')) print('类别名', data.get('brandName')) print('简介', data.get('introduction')) print('星级', data.get('highHotelStar')) print('舒适类型', data.get('hotelStar')) print('电话', [i.get('phone') for i in data.get('phoneList')]) print('平均分', data.get('avgScore')) print('标签', data.get('poiAttrTagList')) print('城市名', data.get('cityName')) print('城市拼音', data.get('cityPinyin')) poi_data = data_dict.get('poiExt') # 酒店详情 print('服务', [i.get('attrDesc') for i in poi_data.get('serviceIconsInfo').get('serviceIcons')]) print('酒店介绍', {i.get('attrDesc'): i.get('attrValue') for i in poi_data.get('hotelIntroInfo').get('poiExtendsInfos')}) if __name__ == '__main__': print("""\033[1;33m请输入酒店ID \033[0m""") _id = input('(链接末尾数字就是ID)') # _id = '41823880' # 测试 hotel = ParseHotelInfo(_id) hotel.go_to_hotel() ================================================ FILE: 其他实战/【美团】数据解析、token生成/parse_play_areas.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-05 Python: 3.7 import requests import json import re from pypinyin import pinyin class ParseAreas(object): def __init__(self, city_name): self.alphabet = "".join([i[0][0] for i in pinyin(city_name)]) self.get_data() def get_data(self): url = 'https://{city}.meituan.com/xiuxianyule/' headers = { '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', } target_url = url.format(city=self.alphabet) response = requests.get(target_url, headers=headers) data = response.text self.parse(data, target_url) @ staticmethod def parse(data, url): """解析数据 """ py_dict = {} text = re.search(r'"city":{"id":(.*?),"name":"(.*?)","pinyin".*?"area":(.*?),"category":', data) if text: py_dict = {'城市': text.group(2), '城市ID': text.group(1)} dict_info = json.loads(text.group(3)).get('children') # 提取区域信息 py_dict['区'] = [] for node in dict_info: if node.get('name') == '推荐商圈': continue # 推荐商圈过滤 # 二级区域 district = {'区名': node.get('name'), '区ID': node.get('id'), '区链接': url + 'b' + str(node.get('id')) + '/'} if node.get('children'): district['街道'] = [] # 三级区域 for i in node.get('children'): area = {'街道名': i.get('name'), '街道ID': i.get('id'), '街道链接': url + 'b' + str(i.get('id')) + '/'} district['街道'].append(area) py_dict['区'].append(district) print(json.dumps(py_dict, ensure_ascii=False)) if __name__ == '__main__': print(""" \033[1;33m娱乐板块区域解析 请输入城市名例如 北京 返回json格式\033[0m """) chines = input('输入城市名') ParseAreas(chines) ================================================ FILE: 其他实战/【美团】数据解析、token生成/parse_play_info.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-08 Python: 3.7 """ 解析 美团休闲娱乐商铺信息 该板块信息隐藏在get请求后的js中直接用正则匹配出信息再抽取出来 """ import requests import re import json class ParsePlayInfo(object): target_url = 'http://www.meituan.com/xiuxianyule/{p_id}/' headers = { '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', } def __init__(self, restaurant_id): self.restaurant_id = str(restaurant_id) self.go_to_restaurant() def go_to_restaurant(self): """执行访问 """ url = self.target_url.format(p_id=self.restaurant_id) data = requests.get(url, headers=self.headers).text # 提取有效区域 data = re.search(r'"params":{"poiInfo":(.*?)},"fallbackPara', data, flags=re.DOTALL) if data: self.parse_html(json.loads(data.group(1))) else: print('访问失效') def parse_html(self, data): print('商铺ID', self.restaurant_id) print('城市ID', data.get('catId')) print('城市', data.get('cityName')) print('城市拼音', data.get('cityPy')) print('店铺', data.get('shopName')) print('评分', data.get('score')) print('平均消费', data.get('avgPrice')) print('地址', data.get('address')) print('电话', data.get('phone')) print('营业时间', data.get('openTime')) print('封面图片', data.get('headIcon')) print('wifi', data.get('wifi')) # 有=1 无=0 print('停车', data.get('park')) # 如果有例如:免费提供5个停车位。 没有为空 print('经度', data.get('lng')) print('纬度', data.get('lat')) print('类型', data.get('breadCrumbNavDTOList')[2].get('title')[len(data.get('cityName')):]) albums = [] images = data.get('albumDTOList') for node in images: albums.append(node.get('url')) print('相册', albums) if __name__ == '__main__': print(""" \033[1;33m请输入商铺ID \033[0m """) p_id = input('(商铺网址末尾数字就是ID)') ParsePlayInfo(p_id) ================================================ FILE: 其他实战/【试客联盟】登录/execute.js ================================================ function BarrettMu(m) { this.modulus = biCopy(m); this.k = biHighIndex(this.modulus) + 1; var b2k = new BigInt(); b2k.digits[2 * this.k] = 1; this.mu = biDivide(b2k, this.modulus); this.bkplus1 = new BigInt(); this.bkplus1.digits[this.k + 1] = 1; this.modulo = BarrettMu_modulo; this.multiplyMod = BarrettMu_multiplyMod; this.powMod = BarrettMu_powMod; } function BarrettMu_modulo(x) { var q1 = biDivideByRadixPower(x, this.k - 1); var q2 = biMultiply(q1, this.mu); var q3 = biDivideByRadixPower(q2, this.k + 1); var r1 = biModuloByRadixPower(x, this.k + 1); var r2term = biMultiply(q3, this.modulus); var r2 = biModuloByRadixPower(r2term, this.k + 1); var r = biSubtract(r1, r2); if (r.isNeg) { r = biAdd(r, this.bkplus1); } var rgtem = biCompare(r, this.modulus) >= 0; while (rgtem) { r = biSubtract(r, this.modulus); rgtem = biCompare(r, this.modulus) >= 0; } return r; } function BarrettMu_multiplyMod(x, y) { var xy = biMultiply(x, y); return this.modulo(xy); } function BarrettMu_powMod(x, y) { var result = new BigInt(); result.digits[0] = 1; var a = x; var k = y; while (true) { if ((k.digits[0] & 1) != 0) result = this.multiplyMod(result, a); k = biShiftRight(k, 1); if (k.digits[0] == 0 && biHighIndex(k) == 0) break; a = this.multiplyMod(a, a); } return result; }; var biRadixBase = 2; var biRadixBits = 16; var bitsPerDigit = biRadixBits; var biRadix = 1 << 16; var biHalfRadix = biRadix >>> 1; var biRadixSquared = biRadix * biRadix; var maxDigitVal = biRadix - 1; var maxInteger = 9999999999999998; var maxDigits; var ZERO_ARRAY; var bigZero, bigOne; function setMaxDigits(value) { maxDigits = value; ZERO_ARRAY = new Array(maxDigits); for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0; bigZero = new BigInt(); bigOne = new BigInt(); bigOne.digits[0] = 1; } setMaxDigits(20); var dpl10 = 15; var lr10 = biFromNumber(1000000000000000); function BigInt(flag) { if (typeof flag == "boolean" && flag == true) { this.digits = null; } else { this.digits = ZERO_ARRAY.slice(0); } this.isNeg = false; } function biFromDecimal(s) { var isNeg = s.charAt(0) == '-'; var i = isNeg ? 1 : 0; var result; while (i < s.length && s.charAt(i) == '0') ++i; if (i == s.length) { result = new BigInt(); } else { var digitCount = s.length - i; var fgl = digitCount % dpl10; if (fgl == 0) fgl = dpl10; result = biFromNumber(Number(s.substr(i, fgl))); i += fgl; while (i < s.length) { result = biAdd(biMultiply(result, lr10), biFromNumber(Number(s.substr(i, dpl10)))); i += dpl10; } result.isNeg = isNeg; } return result; } function biCopy(bi) { var result = new BigInt(true); result.digits = bi.digits.slice(0); result.isNeg = bi.isNeg; return result; } function biFromNumber(i) { var result = new BigInt(); result.isNeg = i < 0; i = Math.abs(i); var j = 0; while (i > 0) { result.digits[j++] = i & maxDigitVal; i >>= biRadixBits; } return result; } function reverseStr(s) { var result = ""; for (var i = s.length - 1; i > -1; --i) { result += s.charAt(i); } return result; } var hexatrigesimalToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); function biToString(x, radix) { var b = new BigInt(); b.digits[0] = radix; var qr = biDivideModulo(x, b); var result = hexatrigesimalToChar[qr[1].digits[0]]; while (biCompare(qr[0], bigZero) == 1) { qr = biDivideModulo(qr[0], b); digit = qr[1].digits[0]; result += hexatrigesimalToChar[qr[1].digits[0]]; } return (x.isNeg ? "-" : "") + reverseStr(result); } function biToDecimal(x) { var b = new BigInt(); b.digits[0] = 10; var qr = biDivideModulo(x, b); var result = String(qr[1].digits[0]); while (biCompare(qr[0], bigZero) == 1) { qr = biDivideModulo(qr[0], b); result += String(qr[1].digits[0]); } return (x.isNeg ? "-" : "") + reverseStr(result); } var hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'); function digitToHex(n) { var mask = 0xf; var result = ""; for (i = 0; i < 4; ++i) { result += hexToChar[n & mask]; n >>>= 4; } return reverseStr(result); } function biToHex(x) { var result = ""; var n = biHighIndex(x); for (var i = biHighIndex(x); i > -1; --i) { result += digitToHex(x.digits[i]); } return result; } function charToHex(c) { var ZERO = 48; var NINE = ZERO + 9; var littleA = 97; var littleZ = littleA + 25; var bigA = 65; var bigZ = 65 + 25; var result; if (c >= ZERO && c <= NINE) { result = c - ZERO; } else if (c >= bigA && c <= bigZ) { result = 10 + c - bigA; } else if (c >= littleA && c <= littleZ) { result = 10 + c - littleA; } else { result = 0; } return result; } function hexToDigit(s) { var result = 0; var sl = Math.min(s.length, 4); for (var i = 0; i < sl; ++i) { result <<= 4; result |= charToHex(s.charCodeAt(i)) } return result; } function biFromHex(s) { var result = new BigInt(); var sl = s.length; for (var i = sl, j = 0; i > 0; i -= 4, ++j) { result.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4))); } return result; } function biFromString(s, radix) { var isNeg = s.charAt(0) == '-'; var istop = isNeg ? 1 : 0; var result = new BigInt(); var place = new BigInt(); place.digits[0] = 1; for (var i = s.length - 1; i >= istop; i--) { var c = s.charCodeAt(i); var digit = charToHex(c); var biDigit = biMultiplyDigit(place, digit); result = biAdd(result, biDigit); place = biMultiplyDigit(place, radix); } result.isNeg = isNeg; return result; } function biToBytes(x) { var result = ""; for (var i = biHighIndex(x); i > -1; --i) { result += digitToBytes(x.digits[i]); } return result; } function digitToBytes(n) { var c1 = String.fromCharCode(n & 0xff); n >>>= 8; var c2 = String.fromCharCode(n & 0xff); return c2 + c1; } function biDump(b) { return (b.isNeg ? "-" : "") + b.digits.join(" "); } function biAdd(x, y) { var result; if (x.isNeg != y.isNeg) { y.isNeg = !y.isNeg; result = biSubtract(x, y); y.isNeg = !y.isNeg; } else { result = new BigInt(); var c = 0; var n; for (var i = 0; i < x.digits.length; ++i) { n = x.digits[i] + y.digits[i] + c; result.digits[i] = n & 0xffff; c = Number(n >= biRadix); } result.isNeg = x.isNeg; } return result; } function biSubtract(x, y) { var result; if (x.isNeg != y.isNeg) { y.isNeg = !y.isNeg; result = biAdd(x, y); y.isNeg = !y.isNeg; } else { result = new BigInt(); var n, c; c = 0; for (var i = 0; i < x.digits.length; ++i) { n = x.digits[i] - y.digits[i] + c; result.digits[i] = n & 0xffff; if (result.digits[i] < 0) result.digits[i] += biRadix; c = 0 - Number(n < 0); } if (c == -1) { c = 0; for (var i = 0; i < x.digits.length; ++i) { n = 0 - result.digits[i] + c; result.digits[i] = n & 0xffff; if (result.digits[i] < 0) result.digits[i] += biRadix; c = 0 - Number(n < 0); } result.isNeg = !x.isNeg; } else { result.isNeg = x.isNeg; } } return result; } function biHighIndex(x) { var result = x.digits.length - 1; while (result > 0 && x.digits[result] == 0) --result; return result; } function biNumBits(x) { var n = biHighIndex(x); var d = x.digits[n]; var m = (n + 1) * bitsPerDigit; var result; for (result = m; result > m - bitsPerDigit; --result) { if ((d & 0x8000) != 0) break; d <<= 1; } return result; } function biMultiply(x, y) { var result = new BigInt(); var c; var n = biHighIndex(x); var t = biHighIndex(y); var u, uv, k; for (var i = 0; i <= t; ++i) { c = 0; k = i; for (j = 0; j <= n; ++j, ++k) { uv = result.digits[k] + x.digits[j] * y.digits[i] + c; result.digits[k] = uv & maxDigitVal; c = uv >>> biRadixBits; } result.digits[i + n + 1] = c; } result.isNeg = x.isNeg != y.isNeg; return result; } function biMultiplyDigit(x, y) { var n, c, uv; result = new BigInt(); n = biHighIndex(x); c = 0; for (var j = 0; j <= n; ++j) { uv = result.digits[j] + x.digits[j] * y + c; result.digits[j] = uv & maxDigitVal; c = uv >>> biRadixBits; } result.digits[1 + n] = c; return result; } function arrayCopy(src, srcStart, dest, destStart, n) { var m = Math.min(srcStart + n, src.length); for (var i = srcStart, j = destStart; i < m; ++i, ++j) { dest[j] = src[i]; } } var highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF); function biShiftLeft(x, n) { var digitCount = Math.floor(n / bitsPerDigit); var result = new BigInt(); arrayCopy(x.digits, 0, result.digits, digitCount, result.digits.length - digitCount); var bits = n % bitsPerDigit; var rightBits = bitsPerDigit - bits; for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) { result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) | ((result.digits[i1] & highBitMasks[bits]) >>> ( rightBits)); } result.digits[0] = ((result.digits[i] << bits) & maxDigitVal); result.isNeg = x.isNeg; return result; } var lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF); function biShiftRight(x, n) { var digitCount = Math.floor(n / bitsPerDigit); var result = new BigInt(); arrayCopy(x.digits, digitCount, result.digits, 0, x.digits.length - digitCount); var bits = n % bitsPerDigit; var leftBits = bitsPerDigit - bits; for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) { result.digits[i] = (result.digits[i] >>> bits) | ((result.digits[i1] & lowBitMasks[bits]) << leftBits); } result.digits[result.digits.length - 1] >>>= bits; result.isNeg = x.isNeg; return result; } function biMultiplyByRadixPower(x, n) { var result = new BigInt(); arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n); return result; } function biDivideByRadixPower(x, n) { var result = new BigInt(); arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n); return result; } function biModuloByRadixPower(x, n) { var result = new BigInt(); arrayCopy(x.digits, 0, result.digits, 0, n); return result; } function biCompare(x, y) { if (x.isNeg != y.isNeg) { return 1 - 2 * Number(x.isNeg); } for (var i = x.digits.length - 1; i >= 0; --i) { if (x.digits[i] != y.digits[i]) { if (x.isNeg) { return 1 - 2 * Number(x.digits[i] > y.digits[i]); } else { return 1 - 2 * Number(x.digits[i] < y.digits[i]); } } } return 0; } function biDivideModulo(x, y) { var nb = biNumBits(x); var tb = biNumBits(y); var origYIsNeg = y.isNeg; var q, r; if (nb < tb) { if (x.isNeg) { q = biCopy(bigOne); q.isNeg = !y.isNeg; x.isNeg = false; y.isNeg = false; r = biSubtract(y, x); x.isNeg = true; y.isNeg = origYIsNeg; } else { q = new BigInt(); r = biCopy(x); } return new Array(q, r); } q = new BigInt(); r = x; var t = Math.ceil(tb / bitsPerDigit) - 1; var lambda = 0; while (y.digits[t] < biHalfRadix) { y = biShiftLeft(y, 1); ++lambda; ++tb; t = Math.ceil(tb / bitsPerDigit) - 1; } r = biShiftLeft(r, lambda); nb += lambda; var n = Math.ceil(nb / bitsPerDigit) - 1; var b = biMultiplyByRadixPower(y, n - t); while (biCompare(r, b) != -1) { ++q.digits[n - t]; r = biSubtract(r, b); } for (var i = n; i > t; --i) { var ri = (i >= r.digits.length) ? 0 : r.digits[i]; var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1]; var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2]; var yt = (t >= y.digits.length) ? 0 : y.digits[t]; var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1]; if (ri == yt) { q.digits[i - t - 1] = maxDigitVal; } else { q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt); } var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1); var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2); while (c1 > c2) { --q.digits[i - t - 1]; c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1); c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2); } b = biMultiplyByRadixPower(y, i - t - 1); r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1])); if (r.isNeg) { r = biAdd(r, b); --q.digits[i - t - 1]; } } r = biShiftRight(r, lambda); q.isNeg = x.isNeg != origYIsNeg; if (x.isNeg) { if (origYIsNeg) { q = biAdd(q, bigOne); } else { q = biSubtract(q, bigOne); } y = biShiftRight(y, lambda); r = biSubtract(y, r); } if (r.digits[0] == 0 && biHighIndex(r) == 0) r.isNeg = false; return new Array(q, r); } function biDivide(x, y) { return biDivideModulo(x, y)[0]; } function biModulo(x, y) { return biDivideModulo(x, y)[1]; } function biMultiplyMod(x, y, m) { return biModulo(biMultiply(x, y), m); } function biPow(x, y) { var result = bigOne; var a = x; while (true) { if ((y & 1) != 0) result = biMultiply(result, a); y >>= 1; if (y == 0) break; a = biMultiply(a, a); } return result; } function biPowMod(x, y, m) { var result = bigOne; var a = x; var k = y; while (true) { if ((k.digits[0] & 1) != 0) result = biMultiplyMod(result, a, m); k = biShiftRight(k, 1); if (k.digits[0] == 0 && biHighIndex(k) == 0) break; a = biMultiplyMod(a, a, m); } return result; }; var RSAAPP = {}; RSAAPP.NoPadding = "NoPadding"; RSAAPP.PKCS1Padding = "PKCS1Padding"; RSAAPP.RawEncoding = "RawEncoding"; RSAAPP.NumericEncoding = "NumericEncoding" function RSAKeyPair(encryptionExponent, decryptionExponent, modulus, keylen) { this.e = biFromHex(encryptionExponent); this.d = biFromHex(decryptionExponent); this.m = biFromHex(modulus); if (typeof(keylen) != 'number') { this.chunkSize = 2 * biHighIndex(this.m); } else { this.chunkSize = keylen / 8; } this.radix = 16; this.barrett = new BarrettMu(this.m); } function encryptedString(key, s, pad, encoding) { var a = new Array(); var sl = s.length; var i, j, k; var padtype; var encodingtype; var rpad; var al; var result = ""; var block; var crypt; var text; if (typeof(pad) == 'string') { if (pad == RSAAPP.NoPadding) { padtype = 1; } else if (pad == RSAAPP.PKCS1Padding) { padtype = 2; } else { padtype = 0; } } else { padtype = 0; } if (typeof(encoding) == 'string' && encoding == RSAAPP.RawEncoding) { encodingtype = 1; } else { encodingtype = 0; } if (padtype == 1) { if (sl > key.chunkSize) { sl = key.chunkSize; } } else if (padtype == 2) { if (sl > (key.chunkSize - 11)) { sl = key.chunkSize - 11; } } i = 0; if (padtype == 2) { j = sl - 1; } else { j = key.chunkSize - 1; } while (i < sl) { if (padtype) { a[j] = s.charCodeAt(i); } else { a[i] = s.charCodeAt(i); } i++; j--; } if (padtype == 1) { i = 0; } j = key.chunkSize - (sl % key.chunkSize); while (j > 0) { if (padtype == 2) { rpad = Math.floor(Math.random() * 256); while (!rpad) { rpad = Math.floor(Math.random() * 256); } a[i] = rpad; } else { a[i] = 0; } i++; j--; } if (padtype == 2) { a[sl] = 0; a[key.chunkSize - 2] = 2; a[key.chunkSize - 1] = 0; } al = a.length; for (i = 0; i < al; i += key.chunkSize) { block = new BigInt(); j = 0; for (k = i; k < (i + key.chunkSize); ++j) { block.digits[j] = a[k++]; block.digits[j] += a[k++] << 8; } crypt = key.barrett.powMod(block, key.e); if (encodingtype == 1) { text = biToBytes(crypt); } else { text = (key.radix == 16) ? biToHex(crypt) : biToString(crypt, key.radix); } result += text; } return result; } function decryptedString(key, c) { var blocks = c.split(" "); var b; var i, j; var bi; var result = ""; for (i = 0; i < blocks.length; ++i) { if (key.radix == 16) { bi = biFromHex(blocks[i]); } else { bi = biFromString(blocks[i], key.radix); } b = key.barrett.powMod(bi, key.d); for (j = 0; j <= biHighIndex(b); ++j) { result += String.fromCharCode(b.digits[j] & 255, b.digits[j] >> 8); } } if (result.charCodeAt(result.length - 1) == 0) { result = result.substring(0, result.length - 1); } return (result); } function get_pwd(pwd) { setMaxDigits(131); // res_n 这个参数 是从网页获取的 但调试发现是固定的 var rsa_n = "DC1683EEAA2B709F97743773E18F53E3C9A15D12465CE82227A6E447E6EC590D0B569876BB631B0AB4D67881E7EC874066D6E022E2978B4C6EAA8903EC1774AAE040A3BEAF9C2B48730ADD46BEF5F0C8109DB6FCEFED0F4A84CCD7AFFDB4FB4214DA0D0FF1A8E2831E81FA4D7C2F4346184EEC87CE42230FC320B2B4E392ECDF" var key = new RSAKeyPair("10001", '', rsa_n); return encryptedString(key, pwd); } ================================================ FILE: 其他实战/【试客联盟】登录/login.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-11-23 Python: 3.7 import execjs import requests, re s = requests.Session() def main(pwd): """res_n 这个参数 是从网页获取的 但调试发现是其实固定的 :param pwd: :return: """ with open('execute.js', 'r', encoding='utf-8') as f: js = execjs.compile(f.read()) print('引擎', execjs.get().name) sign = js.call('get_pwd', pwd) return sign def login(sign_pwd, username): url = "http://login.shikee.com/check/?&_1574394219820" data = { "username": username, "password": sign_pwd, "vcode": '', "to": 'http://user.shikee.com/', } res = s.post(url=url, data=data) res.encoding = "utf-8" print(res.text) def home(): home_url = "http://user.shikee.com/buyer" response = s.get(home_url) html = response.content.decode('utf-8') data = re.findall( '
.*?

您好!(.*?)您有未读提醒 1

', html, re.S)[0] print(data) if __name__ == '__main__': username = input('请输入账户:') pwd = input('请输入密码:') sign = main(pwd) print('正在登录....') login(sign, username) home() ================================================ FILE: 其他实战/【谷雨】数字解密/GuYu.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-25 Python: 3.7 import requests import os from fontTools.ttLib import TTFont class Font: """ https://guyujiezi.com/ 谷雨解字的 数字解密 现在版本的 雨谷字体加的xml 会有一个移位操作 """ def __init__(self, uri): self.url = uri self.filename = uri.split('/')[-1] self.font = None self._list = [] def check(self): """检查目录 """ if not os.path.isfile(self.filename): resp = requests.get(self.url) with open(self.filename, 'wb') as f: f.write(resp.content) # TTFont 存为 xml self.font = TTFont(self.filename) self.font.saveXML(self.filename.replace(self.filename.split('.')[-1], 'xml')) def get_wo(self): """获取 woff """ self.check() ph = self.font['cmap'] _dict = ph.tables[0].cmap # 1. 字典取 value 列表化 # 2. str 取最后 2 位,并转为 int # 3. 减去 17 并从新组装列表 self._list = [int(i[-2:])-17 for i in list(_dict.values())] """ 处理移位 """ print(list(_dict.values())) print(self._list) def parse(self, number): _str = '' for num in number: _str += str(self._list[int(num)]) print('最终展示字', int(_str)) if __name__ == '__main__': ft = Font("https://guyujiezi.com/fonts/2DLw9u/3iZbr8.woff") ft.get_wo() # 输入页面数字测试 ft.parse('947') ================================================ FILE: 其他实战/【豆瓣】自动登录/DouBan.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2020-01-08 Python: 3.7 import requests import re class DouBan: def __init__(self, name, pwd): self.name = name.strip() self.pwd = pwd.strip() self.session = requests.session() self.headers = { 'Origin': 'https://accounts.douban.com', 'Host': 'accounts.douban.com', 'Referer': 'https://accounts.douban.com/passport/login_popup?login_source=anony', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', } self.login_url = 'https://accounts.douban.com/j/mobile/login/basic' self.index_url = "https://www.douban.com/" self.session = requests.session() def login(self): data = { 'ck': '', 'name': self.name, 'password': self.pwd, 'remember': 'false', 'ticket': '', } self.session.post(self.login_url, data=data, headers=self.headers) def check(self): self.headers['Host'] = 'www.douban.com' response = self.session.get("https://www.douban.com/", headers=self.headers) try: title = re.search(r'(.*?)的帐号', response.text).group(1) print('【登录成功】', title) except: print('【登录失败】') if __name__ == '__main__': username = input('豆瓣用户名 >>>') password = input('密码 >>>') db = DouBan(username, password) db.login() db.check() ================================================ FILE: 其他实战/【逗游】自动登录/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【逗游】自动登录/douyou.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-08-01 Python: 3.7 import js2py import requests import json class DouYou: headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'Referer': 'http://www.doyo.cn/passport/login' } def __init__(self, username, password): self.context = js2py.EvalJs() # python中使用js self.username = username self.password = password def make_password(self): """取加密后的字符串 """ try: nonce, ts = self.get_token() with open("encryp.js", "r", encoding="utf-8") as f: self.context.execute(f.read()) pwd_hash = self.context.get_value(self.password, nonce, ts) return pwd_hash # 打印加密之后的密码 except: print('获取token失败') def get_token(self): """获取 token """ get_token_url = 'http://www.doyo.cn/User/Passport/token?username={user}&random=0.1428378278012199'.format(user=self.username) result = json.loads(requests.get(get_token_url).text) if result.get('result'): nonce = result.get('nonce') ts = result.get('ts') return nonce, ts else: print('获取token失败') exit() def login(self): """登陆 """ # decode('unicode_escape') login_url = 'http://www.doyo.cn/passport/login' data = { 'username': self.username, 'password': self.make_password(), 'remberme': '1', 'next': 'aHR0cCUzQSUyRiUyRnd3dy5kb3lvLmNuJTJG' } response = requests.post(login_url, data=data, headers=self.headers) info = json.loads(response.text) if info.get('result'): print('登陆成功 | 用户等级:{level} 用户id:{uid}'.format(level=info.get('level'), uid=info.get('uid'))) else: print('登陆失败') if __name__ == '__main__': user = input('输入逗游账号') pwd = input('输入密码') dy = DouYou(user, pwd) dy.login() ================================================ FILE: 其他实战/【逗游】自动登录/encryp.js ================================================ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* SHA-1 implementation in JavaScript | (c) Chris Veness 2002-2010 | www.movable-type.co.uk */ /* - see http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html */ /* http://csrc.nist.gov/groups/ST/toolkit/examples.html */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var Sha1 = {}; // Sha1 namespace /** * Generates SHA-1 hash of string * * @param {String} msg String to be hashed * @param {Boolean} [utf8encode=true] Encode msg as UTF-8 before generating hash * @returns {String} Hash of msg as hex character string */ Sha1.hash = function(msg, utf8encode) { utf8encode = (typeof utf8encode == 'undefined') ? true : utf8encode; // convert string to UTF-8, as SHA only deals with byte-streams if (utf8encode) msg = Utf8.encode(msg); // constants [§4.2.1] var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; // PREPROCESSING msg += String.fromCharCode(0x80); // add trailing '1' bit (+ 0's padding) to string [§5.1.1] // convert string msg into 512-bit/16-integer blocks arrays of ints [§5.2.1] var l = msg.length/4 + 2; // length (in 32-bit integers) of msg + ‘1’ + appended length var N = Math.ceil(l/16); // number of 16-integer-blocks required to hold 'l' ints var M = new Array(N); for (var i=0; i>> 32, but since JS converts // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators M[N-1][14] = ((msg.length-1)*8) / Math.pow(2, 32); M[N-1][14] = Math.floor(M[N-1][14]) M[N-1][15] = ((msg.length-1)*8) & 0xffffffff; // set initial hash value [§5.3.1] var H0 = 0x67452301; var H1 = 0xefcdab89; var H2 = 0x98badcfe; var H3 = 0x10325476; var H4 = 0xc3d2e1f0; // HASH COMPUTATION [§6.1.2] var W = new Array(80); var a, b, c, d, e; for (var i=0; i>>(32-n)); } // // hexadecimal representation of a number // (note toString(16) is implementation-dependant, and // in IE returns signed numbers when used on full words) // Sha1.toHexStr = function(n) { var s="", v; for (var i=7; i>=0; i--) { v = (n>>>(i*4)) & 0xf; s += v.toString(16); } return s; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Utf8 class: encode / decode between multi-byte Unicode characters and UTF-8 multiple */ /* single-byte character encoding (c) Chris Veness 2002-2010 */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var Utf8 = {}; // Utf8 namespace /** * Encode multi-byte Unicode string into utf-8 multiple single-byte characters * (BMP / basic multilingual plane only) * * Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars * * @param {String} strUni Unicode string to be encoded as UTF-8 * @returns {String} encoded string */ Utf8.encode = function(strUni) { // use regular expressions & String.replace callback function for better efficiency // than procedural approaches var strUtf = strUni.replace( /[\u0080-\u07ff]/g, // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz function(c) { var cc = c.charCodeAt(0); return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); } ); strUtf = strUtf.replace( /[\u0800-\uffff]/g, // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz function(c) { var cc = c.charCodeAt(0); return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); } ); return strUtf; } /** * Decode utf-8 encoded string back into multi-byte Unicode characters * * @param {String} strUtf UTF-8 string to be decoded back to Unicode * @returns {String} decoded string */ Utf8.decode = function(strUtf) { // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char! var strUni = strUtf.replace( /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, // 3-byte chars function(c) { // (note parentheses for precence) var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f); return String.fromCharCode(cc); } ); strUni = strUni.replace( /[\u00c0-\u00df][\u0080-\u00bf]/g, // 2-byte chars function(c) { // (note parentheses for precence) var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f; return String.fromCharCode(cc); } ); return strUni; } function get_value(pwd, nonce, ts) { pwd = Sha1.hash(pwd); pwd = Sha1.hash(nonce+ts+pwd); return pwd } ================================================ FILE: 其他实战/【金逸电影】自动注册/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【金逸电影】自动注册/encryp.js ================================================ (function (global) { "use strict"; var _Base64 = global.Base64; var version = "2.1.9"; var buffer; if (typeof module !== "undefined" && module.exports) { try { buffer = require("buffer").Buffer } catch (err) { } } var b64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var b64tab = function (bin) { var t = {}; for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; return t }(b64chars); var fromCharCode = String.fromCharCode; var cb_utob = function (c) { if (c.length < 2) { var cc = c.charCodeAt(0); return cc < 128 ? c : cc < 2048 ? fromCharCode(192 | cc >>> 6) + fromCharCode(128 | cc & 63) : fromCharCode(224 | cc >>> 12 & 15) + fromCharCode(128 | cc >>> 6 & 63) + fromCharCode(128 | cc & 63) } else { var cc = 65536 + (c.charCodeAt(0) - 55296) * 1024 + (c.charCodeAt(1) - 56320); return fromCharCode(240 | cc >>> 18 & 7) + fromCharCode(128 | cc >>> 12 & 63) + fromCharCode(128 | cc >>> 6 & 63) + fromCharCode(128 | cc & 63) } }; var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; var utob = function (u) { return u.replace(re_utob, cb_utob) }; var cb_encode = function (ccc) { var padlen = [0, 2, 1][ccc.length % 3], ord = ccc.charCodeAt(0) << 16 | (ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8 | (ccc.length > 2 ? ccc.charCodeAt( 2) : 0), chars = [b64chars.charAt(ord >>> 18), b64chars.charAt(ord >>> 12 & 63), padlen >= 2 ? "=" : b64chars.charAt(ord >>> 6 & 63), padlen >= 1 ? "=" : b64chars.charAt(ord & 63)]; return chars.join("") }; var btoa = global.btoa ? function (b) { return global.btoa(b) } : function (b) { return b.replace(/[\s\S]{1,3}/g, cb_encode) }; var _encode = buffer ? function (u) { return (u.constructor === buffer.constructor ? u : new buffer(u)).toString("base64") } : function (u) { return btoa(utob(u)) }; var encode = function (u, urisafe) { return !urisafe ? _encode(String(u)) : _encode(String(u)).replace(/[+\/]/g, function (m0) { return m0 == "+" ? "-" : "_" }).replace(/=/g, "") }; var encodeURI = function (u) { return encode(u, true) }; var re_btou = new RegExp(["[À-ß][€-¿]", "[à-ï][€-¿]{2}", "[ð-÷][€-¿]{3}"].join("|"), "g"); var cb_btou = function (cccc) { switch (cccc.length) { case 4: var cp = (7 & cccc.charCodeAt(0)) << 18 | (63 & cccc.charCodeAt(1)) << 12 | (63 & cccc.charCodeAt(2)) << 6 | 63 & cccc.charCodeAt(3), offset = cp - 65536; return fromCharCode((offset >>> 10) + 55296) + fromCharCode((offset & 1023) + 56320); case 3: return fromCharCode((15 & cccc.charCodeAt(0)) << 12 | (63 & cccc.charCodeAt(1)) << 6 | 63 & cccc.charCodeAt(2)); default: return fromCharCode((31 & cccc.charCodeAt(0)) << 6 | 63 & cccc.charCodeAt(1)) } }; var btou = function (b) { return b.replace(re_btou, cb_btou) }; var cb_decode = function (cccc) { var len = cccc.length, padlen = len % 4, n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) | (len > 3 ? b64tab[cccc.charAt(3)] : 0), chars = [fromCharCode(n >>> 16), fromCharCode(n >>> 8 & 255), fromCharCode(n & 255)]; chars.length -= [0, 0, 2, 1][padlen]; return chars.join("") }; var atob = global.atob ? function (a) { return global.atob(a) } : function (a) { return a.replace(/[\s\S]{1,4}/g, cb_decode) }; var _decode = buffer ? function (a) { return (a.constructor === buffer.constructor ? a : new buffer(a, "base64")).toString() } : function (a) { return btou(atob(a)) }; var decode = function (a) { return _decode(String(a).replace(/[-_]/g, function (m0) { return m0 == "-" ? "+" : "/" }).replace(/[^A-Za-z0-9\+\/]/g, "")) }; var noConflict = function () { var Base64 = global.Base64; global.Base64 = _Base64; return Base64 }; global.Base64 = { VERSION: version, atob: atob, btoa: btoa, fromBase64: decode, toBase64: encode, utob: utob, encode: encode, encodeURI: encodeURI, btou: btou, decode: decode, noConflict: noConflict }; if (typeof Object.defineProperty === "function") { var noEnum = function (v) { return { value: v, enumerable: false, writable: true, configurable: true } }; global.Base64.extendString = function () { Object.defineProperty(String.prototype, "fromBase64", noEnum(function () { return decode(this) })); Object.defineProperty(String.prototype, "toBase64", noEnum(function (urisafe) { return encode(this, urisafe) })); Object.defineProperty(String.prototype, "toBase64URI", noEnum(function () { return encode(this, true) })) } } if (global["Meteor"]) { Base64 = global.Base64 } })(this); function getEncryption(value) { var val = Base64.encode(value); var arr = []; for (var i = 0; i < val.length; i++) { arr.push(val.charAt(i)); if (i % 2) { var num1 = Math.floor(10 * Math.random()); arr.push(num1); var num2 = Math.floor(10 * Math.random()); arr.push(num2); var num3 = Math.floor(10 * Math.random()); arr.push(num3) } } return arr.join(""); }; ================================================ FILE: 其他实战/【金逸电影】自动注册/register.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-04 Python: 3.7 import requests import execjs.runtime_names class JinYiRegister: """ 金逸电影注册 http://www.jycinema.com/wap/#/register """ def __init__(self, phone): self.headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', } self.url = 'http://www.jycinema.com/frontUIWebapp/appserver/photoMessageService/newsSendMessage' self.phone = phone @staticmethod def js_make(json_data): with open('encryp.js', 'r', encoding='utf-8') as f: js = execjs.compile(f.read()) try: result = js.call("getEncryption", json_data) return result except Exception: print('js 异常') def register(self): data = '{"mobileNumber": ' + self.phone + ', "channelId": 7, "channelCode": "J0005", "memberId": ""}' data = { 'params': self.js_make(data), 'Origin': 'http://www.jycinema.com', 'Referer': 'http://www.jycinema.com/wap/', } response = requests.post(self.url, data=data, headers=self.headers) print(response.content.decode('utf-8')) if __name__ == '__main__': your_phone = input('请输入待注册手机号') jy = JinYiRegister(your_phone) jy.register() ================================================ FILE: 其他实战/【青海移动】登陆参数生成/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-06 Python: 3.7 ================================================ FILE: 其他实战/【青海移动】登陆参数生成/encryp.js ================================================ var CryptoJS = CryptoJS || function (u, l) { var d = {}, n = d.lib = {}, p = function () { }, s = n.Base = { extend: function (a) { p.prototype = this; var c = new p; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function () { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () { }, mixIn: function (a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) } }, q = n.WordArray = s.extend({ init: function (a, c) { a = this.words = a || []; this.sigBytes = c != l ? c : 4 * a.length }, toString: function (a) { return (a || v).stringify(this) }, concat: function (a) { var c = this.words, m = a.words, f = this.sigBytes; a = a.sigBytes; this.clamp(); if (f % 4) for (var t = 0; t < a; t++) c[f + t >>> 2] |= (m[t >>> 2] >>> 24 - 8 * (t % 4) & 255) << 24 - 8 * ((f + t) % 4); else if (65535 < m.length) for (t = 0; t < a; t += 4) c[f + t >>> 2] = m[t >>> 2]; else c.push.apply(c, m); this.sigBytes += a; return this }, clamp: function () { var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4); a.length = u.ceil(c / 4) }, clone: function () { var a = s.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var c = [], m = 0; m < a; m += 4) c.push(4294967296 * u.random() | 0); return new q.init(c, a) } }), w = d.enc = {}, v = w.Hex = { stringify: function (a) { var c = a.words; a = a.sigBytes; for (var m = [], f = 0; f < a; f++) { var t = c[f >>> 2] >>> 24 - 8 * (f % 4) & 255; m.push((t >>> 4).toString(16)); m.push((t & 15).toString(16)) } return m.join("") }, parse: function (a) { for (var c = a.length, m = [], f = 0; f < c; f += 2) m[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8); return new q.init(m, c / 2) } }, b = w.Latin1 = { stringify: function (a) { var c = a.words; a = a.sigBytes; for (var m = [], f = 0; f < a; f++) m.push(String.fromCharCode(c[f >>> 2] >>> 24 - 8 * (f % 4) & 255)); return m.join("") }, parse: function (a) { for (var c = a.length, m = [], f = 0; f < c; f++) m[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4); return new q.init(m, c) } }, x = w.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function (a) { return b.parse(unescape(encodeURIComponent(a))) } }, r = n.BufferedBlockAlgorithm = s.extend({ reset: function () { this._data = new q.init; this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = x.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var c = this._data, m = c.words, f = c.sigBytes, t = this.blockSize, b = f / (4 * t), b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0); a = b * t; f = u.min(4 * a, f); if (a) { for (var e = 0; e < a; e += t) this._doProcessBlock(m, e); e = m.splice(0, a); c.sigBytes -= f } return new q.init(e, f) }, clone: function () { var a = s.clone.call(this); a._data = this._data.clone(); return a }, _minBufferSize: 0 }); n.Hasher = r.extend({ cfg: s.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { r.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (c, m) { return (new a.init(m)).finalize(c) } }, _createHmacHelper: function (a) { return function (c, m) { return (new e.HMAC.init(a, m)).finalize(c) } } }); var e = d.algo = {}; return d }(Math); (function () { var u = CryptoJS, l = u.lib.WordArray; u.enc.Base64 = { stringify: function (d) { var n = d.words, l = d.sigBytes, s = this._map; d.clamp(); d = []; for (var q = 0; q < l; q += 3) for (var w = (n[q >>> 2] >>> 24 - 8 * (q % 4) & 255) << 16 | (n[q + 1 >>> 2] >>> 24 - 8 * ((q + 1) % 4) & 255) << 8 | n[q + 2 >>> 2] >>> 24 - 8 * ((q + 2) % 4) & 255, v = 0; 4 > v && q + 0.75 * v < l; v++) d.push(s.charAt( w >>> 6 * (3 - v) & 63)); if (n = s.charAt(64)) for (; d.length % 4;) d.push(n); return d.join("") }, parse: function (d) { var n = d.length, p = this._map, s = p.charAt(64); s && (s = d.indexOf(s), -1 != s && (n = s)); for (var s = [], q = 0, w = 0; w < n; w++) if (w % 4) { var v = p.indexOf(d.charAt(w - 1)) << 2 * (w % 4), b = p.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4); s[q >>> 2] |= (v | b) << 24 - 8 * (q % 4); q++ } return l.create(s, q) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } })(); (function (u) { function l(b, e, a, c, m, f, t) { b = b + (e & a | ~e & c) + m + t; return (b << f | b >>> 32 - f) + e } function d(b, e, a, c, m, f, t) { b = b + (e & c | a & ~c) + m + t; return (b << f | b >>> 32 - f) + e } function n(b, e, a, c, m, f, t) { b = b + (e ^ a ^ c) + m + t; return (b << f | b >>> 32 - f) + e } function p(b, e, a, c, m, f, t) { b = b + (a ^ (e | ~c)) + m + t; return (b << f | b >>> 32 - f) + e } for (var s = CryptoJS, q = s.lib, w = q.WordArray, v = q.Hasher, q = s.algo, b = [], x = 0; 64 > x; x++) b[x] = 4294967296 * u.abs(u.sin(x + 1)) | 0; q = q.MD5 = v.extend({ _doReset: function () { this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function (r, e) { for (var a = 0; 16 > a; a++) { var c = e + a, m = r[c]; r[c] = (m << 8 | m >>> 24) & 16711935 | (m << 24 | m >>> 8) & 4278255360 } var a = this._hash.words, c = r[e + 0], m = r[e + 1], f = r[e + 2], t = r[e + 3], y = r[e + 4], q = r[e + 5], s = r[e + 6], w = r[e + 7], v = r[e + 8], u = r[e + 9], x = r[e + 10], z = r[e + 11], A = r[e + 12], B = r[e + 13], C = r[e + 14], D = r[e + 15], g = a[0], h = a[1], j = a[2], k = a[3], g = l(g, h, j, k, c, 7, b[0]), k = l(k, g, h, j, m, 12, b[1]), j = l(j, k, g, h, f, 17, b[2]), h = l(h, j, k, g, t, 22, b[3]), g = l(g, h, j, k, y, 7, b[4]), k = l(k, g, h, j, q, 12, b[5]), j = l(j, k, g, h, s, 17, b[6]), h = l(h, j, k, g, w, 22, b[7]), g = l(g, h, j, k, v, 7, b[8]), k = l(k, g, h, j, u, 12, b[9]), j = l(j, k, g, h, x, 17, b[10]), h = l(h, j, k, g, z, 22, b[11]), g = l(g, h, j, k, A, 7, b[12]), k = l(k, g, h, j, B, 12, b[13]), j = l(j, k, g, h, C, 17, b[14]), h = l(h, j, k, g, D, 22, b[15]), g = d(g, h, j, k, m, 5, b[16]), k = d(k, g, h, j, s, 9, b[17]), j = d(j, k, g, h, z, 14, b[18]), h = d(h, j, k, g, c, 20, b[19]), g = d(g, h, j, k, q, 5, b[20]), k = d(k, g, h, j, x, 9, b[21]), j = d(j, k, g, h, D, 14, b[22]), h = d(h, j, k, g, y, 20, b[23]), g = d(g, h, j, k, u, 5, b[24]), k = d(k, g, h, j, C, 9, b[25]), j = d(j, k, g, h, t, 14, b[26]), h = d(h, j, k, g, v, 20, b[27]), g = d(g, h, j, k, B, 5, b[28]), k = d(k, g, h, j, f, 9, b[29]), j = d(j, k, g, h, w, 14, b[30]), h = d(h, j, k, g, A, 20, b[31]), g = n(g, h, j, k, q, 4, b[32]), k = n(k, g, h, j, v, 11, b[33]), j = n(j, k, g, h, z, 16, b[34]), h = n(h, j, k, g, C, 23, b[35]), g = n(g, h, j, k, m, 4, b[36]), k = n(k, g, h, j, y, 11, b[37]), j = n(j, k, g, h, w, 16, b[38]), h = n(h, j, k, g, x, 23, b[39]), g = n(g, h, j, k, B, 4, b[40]), k = n(k, g, h, j, c, 11, b[41]), j = n(j, k, g, h, t, 16, b[42]), h = n(h, j, k, g, s, 23, b[43]), g = n(g, h, j, k, u, 4, b[44]), k = n(k, g, h, j, A, 11, b[45]), j = n(j, k, g, h, D, 16, b[46]), h = n(h, j, k, g, f, 23, b[47]), g = p(g, h, j, k, c, 6, b[48]), k = p(k, g, h, j, w, 10, b[49]), j = p(j, k, g, h, C, 15, b[50]), h = p(h, j, k, g, q, 21, b[51]), g = p(g, h, j, k, A, 6, b[52]), k = p(k, g, h, j, t, 10, b[53]), j = p(j, k, g, h, x, 15, b[54]), h = p(h, j, k, g, m, 21, b[55]), g = p(g, h, j, k, v, 6, b[56]), k = p(k, g, h, j, D, 10, b[57]), j = p(j, k, g, h, s, 15, b[58]), h = p(h, j, k, g, B, 21, b[59]), g = p(g, h, j, k, y, 6, b[60]), k = p(k, g, h, j, z, 10, b[61]), j = p(j, k, g, h, f, 15, b[62]), h = p(h, j, k, g, u, 21, b[63]); a[0] = a[0] + g | 0; a[1] = a[1] + h | 0; a[2] = a[2] + j | 0; a[3] = a[3] + k | 0 }, _doFinalize: function () { var b = this._data, e = b.words, a = 8 * this._nDataBytes, c = 8 * b.sigBytes; e[c >>> 5] |= 128 << 24 - c % 32; var m = u.floor(a / 4294967296); e[(c + 64 >>> 9 << 4) + 15] = (m << 8 | m >>> 24) & 16711935 | (m << 24 | m >>> 8) & 4278255360; e[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360; b.sigBytes = 4 * (e.length + 1); this._process(); b = this._hash; e = b.words; for (a = 0; 4 > a; a++) c = e[a], e[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360; return b }, clone: function () { var b = v.clone.call(this); b._hash = this._hash.clone(); return b } }); s.MD5 = v._createHelper(q); s.HmacMD5 = v._createHmacHelper(q) })(Math); (function () { var u = CryptoJS, l = u.lib, d = l.Base, n = l.WordArray, l = u.algo, p = l.EvpKDF = d.extend({ cfg: d.extend({ keySize: 4, hasher: l.MD5, iterations: 1 }), init: function (d) { this.cfg = this.cfg.extend(d) }, compute: function (d, l) { for (var p = this.cfg, v = p.hasher.create(), b = n.create(), u = b.words, r = p.keySize, p = p.iterations; u .length < r;) { e && v.update(e); var e = v.update(d).finalize(l); v.reset(); for (var a = 1; a < p; a++) e = v.finalize(e), v.reset(); b.concat(e) } b.sigBytes = 4 * r; return b } }); u.EvpKDF = function (d, l, n) { return p.create(n).compute(d, l) } })(); CryptoJS.lib.Cipher || function (u) { var l = CryptoJS, d = l.lib, n = d.Base, p = d.WordArray, s = d.BufferedBlockAlgorithm, q = l.enc.Base64, w = l.algo.EvpKDF, v = d.Cipher = s.extend({ cfg: n.extend(), createEncryptor: function (m, a) { return this.create(this._ENC_XFORM_MODE, m, a) }, createDecryptor: function (m, a) { return this.create(this._DEC_XFORM_MODE, m, a) }, init: function (m, a, b) { this.cfg = this.cfg.extend(b); this._xformMode = m; this._key = a; this.reset() }, reset: function () { s.reset.call(this); this._doReset() }, process: function (a) { this._append(a); return this._process() }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function (m) { return { encrypt: function (f, b, e) { return ("string" == typeof b ? c : a).encrypt(m, f, b, e) }, decrypt: function (f, b, e) { return ("string" == typeof b ? c : a).decrypt(m, f, b, e) } } } }); d.StreamCipher = v.extend({ _doFinalize: function () { return this._process(!0) }, blockSize: 1 }); var b = l.mode = {}, x = function (a, f, b) { var c = this._iv; c ? this._iv = u : c = this._prevBlock; for (var e = 0; e < b; e++) a[f + e] ^= c[e] }, r = (d.BlockCipherMode = n.extend({ createEncryptor: function (a, f) { return this.Encryptor.create(a, f) }, createDecryptor: function (a, f) { return this.Decryptor.create(a, f) }, init: function (a, f) { this._cipher = a; this._iv = f } })).extend(); r.Encryptor = r.extend({ processBlock: function (a, f) { var b = this._cipher, c = b.blockSize; x.call(this, a, f, c); b.encryptBlock(a, f); this._prevBlock = a.slice(f, f + c) } }); r.Decryptor = r.extend({ processBlock: function (a, b) { var c = this._cipher, e = c.blockSize, d = a.slice(b, b + e); c.decryptBlock(a, b); x.call(this, a, b, e); this._prevBlock = d } }); b = b.CBC = r; r = (l.pad = {}).Pkcs7 = { pad: function (a, b) { for (var c = 4 * b, c = c - a.sigBytes % c, e = c << 24 | c << 16 | c << 8 | c, d = [], l = 0; l < c; l += 4) d .push(e); c = p.create(d, c); a.concat(c) }, unpad: function (a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; d.BlockCipher = v.extend({ cfg: v.cfg.extend({ mode: b, padding: r }), reset: function () { v.reset.call(this); var a = this.cfg, c = a.iv, a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) var b = a.createEncryptor; else b = a.createDecryptor, this._minBufferSize = 1; this._mode = b.call(a, this, c && c.words) }, _doProcessBlock: function (a, c) { this._mode.processBlock(a, c) }, _doFinalize: function () { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var c = this._process(!0) } else c = this._process(!0), a.unpad(c); return c }, blockSize: 4 }); var e = d.CipherParams = n.extend({ init: function (a) { this.mixIn(a) }, toString: function (a) { return (a || this.formatter).stringify(this) } }), b = (l.format = {}).OpenSSL = { stringify: function (a) { var c = a.ciphertext; a = a.salt; return (a ? p.create([1398893684, 1701076831]).concat(a).concat(c) : c).toString(q) }, parse: function (a) { a = q.parse(a); var c = a.words; if (1398893684 == c[0] && 1701076831 == c[1]) { var b = p.create(c.slice(2, 4)); c.splice(0, 4); a.sigBytes -= 16 } return e.create({ ciphertext: a, salt: b }) } }, a = d.SerializableCipher = n.extend({ cfg: n.extend({ format: b }), encrypt: function (a, c, b, d) { d = this.cfg.extend(d); var l = a.createEncryptor(b, d); c = l.finalize(c); l = l.cfg; return e.create({ ciphertext: c, key: b, iv: l.iv, algorithm: a, mode: l.mode, padding: l.padding, blockSize: a.blockSize, formatter: d.format }) }, decrypt: function (a, c, b, e) { e = this.cfg.extend(e); c = this._parse(c, e.format); return a.createDecryptor(b, e).finalize(c.ciphertext) }, _parse: function (a, c) { return "string" == typeof a ? c.parse(a, this) : a } }), l = (l.kdf = {}).OpenSSL = { execute: function (a, c, b, d) { d || (d = p.random(8)); a = w.create({ keySize: c + b }).compute(a, d); b = p.create(a.words.slice(c), 4 * b); a.sigBytes = 4 * c; return e.create({ key: a, iv: b, salt: d }) } }, c = d.PasswordBasedCipher = a.extend({ cfg: a.cfg.extend({ kdf: l }), encrypt: function (c, b, e, d) { d = this.cfg.extend(d); e = d.kdf.execute(e, c.keySize, c.ivSize); d.iv = e.iv; c = a.encrypt.call(this, c, b, e.key, d); c.mixIn(e); return c }, decrypt: function (c, b, e, d) { d = this.cfg.extend(d); b = this._parse(b, d.format); e = d.kdf.execute(e, c.keySize, c.ivSize, b.salt); d.iv = e.iv; return a.decrypt.call(this, c, b, e.key, d) } }) }(); (function () { function u(b, a) { var c = (this._lBlock >>> b ^ this._rBlock) & a; this._rBlock ^= c; this._lBlock ^= c << b } function l(b, a) { var c = (this._rBlock >>> b ^ this._lBlock) & a; this._lBlock ^= c; this._rBlock ^= c << b } var d = CryptoJS, n = d.lib, p = n.WordArray, n = n.BlockCipher, s = d.algo, q = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 ], w = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 ], v = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28], b = [{ "0": 8421888, 268435456: 32768, 536870912: 8421378, 805306368: 2, 1073741824: 512, 1342177280: 8421890, 1610612736: 8389122, 1879048192: 8388608, 2147483648: 514, 2415919104: 8389120, 2684354560: 33280, 2952790016: 8421376, 3221225472: 32770, 3489660928: 8388610, 3758096384: 0, 4026531840: 33282, 134217728: 0, 402653184: 8421890, 671088640: 33282, 939524096: 32768, 1207959552: 8421888, 1476395008: 512, 1744830464: 8421378, 2013265920: 2, 2281701376: 8389120, 2550136832: 33280, 2818572288: 8421376, 3087007744: 8389122, 3355443200: 8388610, 3623878656: 32770, 3892314112: 514, 4160749568: 8388608, 1: 32768, 268435457: 2, 536870913: 8421888, 805306369: 8388608, 1073741825: 8421378, 1342177281: 33280, 1610612737: 512, 1879048193: 8389122, 2147483649: 8421890, 2415919105: 8421376, 2684354561: 8388610, 2952790017: 33282, 3221225473: 514, 3489660929: 8389120, 3758096385: 32770, 4026531841: 0, 134217729: 8421890, 402653185: 8421376, 671088641: 8388608, 939524097: 512, 1207959553: 32768, 1476395009: 8388610, 1744830465: 2, 2013265921: 33282, 2281701377: 32770, 2550136833: 8389122, 2818572289: 514, 3087007745: 8421888, 3355443201: 8389120, 3623878657: 0, 3892314113: 33280, 4160749569: 8421378 }, { "0": 1074282512, 16777216: 16384, 33554432: 524288, 50331648: 1074266128, 67108864: 1073741840, 83886080: 1074282496, 100663296: 1073758208, 117440512: 16, 134217728: 540672, 150994944: 1073758224, 167772160: 1073741824, 184549376: 540688, 201326592: 524304, 218103808: 0, 234881024: 16400, 251658240: 1074266112, 8388608: 1073758208, 25165824: 540688, 41943040: 16, 58720256: 1073758224, 75497472: 1074282512, 92274688: 1073741824, 109051904: 524288, 125829120: 1074266128, 142606336: 524304, 159383552: 0, 176160768: 16384, 192937984: 1074266112, 209715200: 1073741840, 226492416: 540672, 243269632: 1074282496, 260046848: 16400, 268435456: 0, 285212672: 1074266128, 301989888: 1073758224, 318767104: 1074282496, 335544320: 1074266112, 352321536: 16, 369098752: 540688, 385875968: 16384, 402653184: 16400, 419430400: 524288, 436207616: 524304, 452984832: 1073741840, 469762048: 540672, 486539264: 1073758208, 503316480: 1073741824, 520093696: 1074282512, 276824064: 540688, 293601280: 524288, 310378496: 1074266112, 327155712: 16384, 343932928: 1073758208, 360710144: 1074282512, 377487360: 16, 394264576: 1073741824, 411041792: 1074282496, 427819008: 1073741840, 444596224: 1073758224, 461373440: 524304, 478150656: 0, 494927872: 16400, 511705088: 1074266128, 528482304: 540672 }, { "0": 260, 1048576: 0, 2097152: 67109120, 3145728: 65796, 4194304: 65540, 5242880: 67108868, 6291456: 67174660, 7340032: 67174400, 8388608: 67108864, 9437184: 67174656, 10485760: 65792, 11534336: 67174404, 12582912: 67109124, 13631488: 65536, 14680064: 4, 15728640: 256, 524288: 67174656, 1572864: 67174404, 2621440: 0, 3670016: 67109120, 4718592: 67108868, 5767168: 65536, 6815744: 65540, 7864320: 260, 8912896: 4, 9961472: 256, 11010048: 67174400, 12058624: 65796, 13107200: 65792, 14155776: 67109124, 15204352: 67174660, 16252928: 67108864, 16777216: 67174656, 17825792: 65540, 18874368: 65536, 19922944: 67109120, 20971520: 256, 22020096: 67174660, 23068672: 67108868, 24117248: 0, 25165824: 67109124, 26214400: 67108864, 27262976: 4, 28311552: 65792, 29360128: 67174400, 30408704: 260, 31457280: 65796, 32505856: 67174404, 17301504: 67108864, 18350080: 260, 19398656: 67174656, 20447232: 0, 21495808: 65540, 22544384: 67109120, 23592960: 256, 24641536: 67174404, 25690112: 65536, 26738688: 67174660, 27787264: 65796, 28835840: 67108868, 29884416: 67109124, 30932992: 67174400, 31981568: 4, 33030144: 65792 }, { "0": 2151682048, 65536: 2147487808, 131072: 4198464, 196608: 2151677952, 262144: 0, 327680: 4198400, 393216: 2147483712, 458752: 4194368, 524288: 2147483648, 589824: 4194304, 655360: 64, 720896: 2147487744, 786432: 2151678016, 851968: 4160, 917504: 4096, 983040: 2151682112, 32768: 2147487808, 98304: 64, 163840: 2151678016, 229376: 2147487744, 294912: 4198400, 360448: 2151682112, 425984: 0, 491520: 2151677952, 557056: 4096, 622592: 2151682048, 688128: 4194304, 753664: 4160, 819200: 2147483648, 884736: 4194368, 950272: 4198464, 1015808: 2147483712, 1048576: 4194368, 1114112: 4198400, 1179648: 2147483712, 1245184: 0, 1310720: 4160, 1376256: 2151678016, 1441792: 2151682048, 1507328: 2147487808, 1572864: 2151682112, 1638400: 2147483648, 1703936: 2151677952, 1769472: 4198464, 1835008: 2147487744, 1900544: 4194304, 1966080: 64, 2031616: 4096, 1081344: 2151677952, 1146880: 2151682112, 1212416: 0, 1277952: 4198400, 1343488: 4194368, 1409024: 2147483648, 1474560: 2147487808, 1540096: 64, 1605632: 2147483712, 1671168: 4096, 1736704: 2147487744, 1802240: 2151678016, 1867776: 4160, 1933312: 2151682048, 1998848: 4194304, 2064384: 4198464 }, { "0": 128, 4096: 17039360, 8192: 262144, 12288: 536870912, 16384: 537133184, 20480: 16777344, 24576: 553648256, 28672: 262272, 32768: 16777216, 36864: 537133056, 40960: 536871040, 45056: 553910400, 49152: 553910272, 53248: 0, 57344: 17039488, 61440: 553648128, 2048: 17039488, 6144: 553648256, 10240: 128, 14336: 17039360, 18432: 262144, 22528: 537133184, 26624: 553910272, 30720: 536870912, 34816: 537133056, 38912: 0, 43008: 553910400, 47104: 16777344, 51200: 536871040, 55296: 553648128, 59392: 16777216, 63488: 262272, 65536: 262144, 69632: 128, 73728: 536870912, 77824: 553648256, 81920: 16777344, 86016: 553910272, 90112: 537133184, 94208: 16777216, 98304: 553910400, 102400: 553648128, 106496: 17039360, 110592: 537133056, 114688: 262272, 118784: 536871040, 122880: 0, 126976: 17039488, 67584: 553648256, 71680: 16777216, 75776: 17039360, 79872: 537133184, 83968: 536870912, 88064: 17039488, 92160: 128, 96256: 553910272, 100352: 262272, 104448: 553910400, 108544: 0, 112640: 553648128, 116736: 16777344, 120832: 262144, 124928: 537133056, 129024: 536871040 }, { "0": 268435464, 256: 8192, 512: 270532608, 768: 270540808, 1024: 268443648, 1280: 2097152, 1536: 2097160, 1792: 268435456, 2048: 0, 2304: 268443656, 2560: 2105344, 2816: 8, 3072: 270532616, 3328: 2105352, 3584: 8200, 3840: 270540800, 128: 270532608, 384: 270540808, 640: 8, 896: 2097152, 1152: 2105352, 1408: 268435464, 1664: 268443648, 1920: 8200, 2176: 2097160, 2432: 8192, 2688: 268443656, 2944: 270532616, 3200: 0, 3456: 270540800, 3712: 2105344, 3968: 268435456, 4096: 268443648, 4352: 270532616, 4608: 270540808, 4864: 8200, 5120: 2097152, 5376: 268435456, 5632: 268435464, 5888: 2105344, 6144: 2105352, 6400: 0, 6656: 8, 6912: 270532608, 7168: 8192, 7424: 268443656, 7680: 270540800, 7936: 2097160, 4224: 8, 4480: 2105344, 4736: 2097152, 4992: 268435464, 5248: 268443648, 5504: 8200, 5760: 270540808, 6016: 270532608, 6272: 270540800, 6528: 270532616, 6784: 8192, 7040: 2105352, 7296: 2097160, 7552: 0, 7808: 268435456, 8064: 268443656 }, { "0": 1048576, 16: 33555457, 32: 1024, 48: 1049601, 64: 34604033, 80: 0, 96: 1, 112: 34603009, 128: 33555456, 144: 1048577, 160: 33554433, 176: 34604032, 192: 34603008, 208: 1025, 224: 1049600, 240: 33554432, 8: 34603009, 24: 0, 40: 33555457, 56: 34604032, 72: 1048576, 88: 33554433, 104: 33554432, 120: 1025, 136: 1049601, 152: 33555456, 168: 34603008, 184: 1048577, 200: 1024, 216: 34604033, 232: 1, 248: 1049600, 256: 33554432, 272: 1048576, 288: 33555457, 304: 34603009, 320: 1048577, 336: 33555456, 352: 34604032, 368: 1049601, 384: 1025, 400: 34604033, 416: 1049600, 432: 1, 448: 0, 464: 34603008, 480: 33554433, 496: 1024, 264: 1049600, 280: 33555457, 296: 34603009, 312: 1, 328: 33554432, 344: 1048576, 360: 1025, 376: 34604032, 392: 33554433, 408: 34603008, 424: 0, 440: 34604033, 456: 1049601, 472: 1024, 488: 33555456, 504: 1048577 }, { "0": 134219808, 1: 131072, 2: 134217728, 3: 32, 4: 131104, 5: 134350880, 6: 134350848, 7: 2048, 8: 134348800, 9: 134219776, 10: 133120, 11: 134348832, 12: 2080, 13: 0, 14: 134217760, 15: 133152, 2147483648: 2048, 2147483649: 134350880, 2147483650: 134219808, 2147483651: 134217728, 2147483652: 134348800, 2147483653: 133120, 2147483654: 133152, 2147483655: 32, 2147483656: 134217760, 2147483657: 2080, 2147483658: 131104, 2147483659: 134350848, 2147483660: 0, 2147483661: 134348832, 2147483662: 134219776, 2147483663: 131072, 16: 133152, 17: 134350848, 18: 32, 19: 2048, 20: 134219776, 21: 134217760, 22: 134348832, 23: 131072, 24: 0, 25: 131104, 26: 134348800, 27: 134219808, 28: 134350880, 29: 133120, 30: 2080, 31: 134217728, 2147483664: 131072, 2147483665: 2048, 2147483666: 134348832, 2147483667: 133152, 2147483668: 32, 2147483669: 134348800, 2147483670: 134217728, 2147483671: 134219808, 2147483672: 134350880, 2147483673: 134217760, 2147483674: 134219776, 2147483675: 0, 2147483676: 133120, 2147483677: 2080, 2147483678: 131104, 2147483679: 134350848 }], x = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679], r = s.DES = n.extend({ _doReset: function () { for (var b = this._key.words, a = [], c = 0; 56 > c; c++) { var d = q[c] - 1; a[c] = b[d >>> 5] >>> 31 - d % 32 & 1 } b = this._subKeys = []; for (d = 0; 16 > d; d++) { for (var f = b[d] = [], l = v[d], c = 0; 24 > c; c++) f[c / 6 | 0] |= a[(w[c] - 1 + l) % 28] << 31 - c % 6, f[4 + (c / 6 | 0)] |= a[28 + (w[c + 24] - 1 + l) % 28] << 31 - c % 6; f[0] = f[0] << 1 | f[0] >>> 31; for (c = 1; 7 > c; c++) f[c] >>>= 4 * (c - 1) + 3; f[7] = f[7] << 5 | f[7] >>> 27 } a = this._invSubKeys = []; for (c = 0; 16 > c; c++) a[c] = b[15 - c] }, encryptBlock: function (b, a) { this._doCryptBlock(b, a, this._subKeys) }, decryptBlock: function (b, a) { this._doCryptBlock(b, a, this._invSubKeys) }, _doCryptBlock: function (e, a, c) { this._lBlock = e[a]; this._rBlock = e[a + 1]; u.call(this, 4, 252645135); u.call(this, 16, 65535); l.call(this, 2, 858993459); l.call(this, 8, 16711935); u.call(this, 1, 1431655765); for (var d = 0; 16 > d; d++) { for (var f = c[d], n = this._lBlock, p = this._rBlock, q = 0, r = 0; 8 > r; r++) q |= b[r][((p ^ f[r]) & x[r]) >>> 0 ]; this._lBlock = p; this._rBlock = n ^ q } c = this._lBlock; this._lBlock = this._rBlock; this._rBlock = c; u.call(this, 1, 1431655765); l.call(this, 8, 16711935); l.call(this, 2, 858993459); u.call(this, 16, 65535); u.call(this, 4, 252645135); e[a] = this._lBlock; e[a + 1] = this._rBlock }, keySize: 2, ivSize: 2, blockSize: 2 }); d.DES = n._createHelper(r); s = s.TripleDES = n.extend({ _doReset: function () { var b = this._key.words; this._des1 = r.createEncryptor(p.create(b.slice(0, 2))); this._des2 = r.createEncryptor(p.create(b.slice(2, 4))); this._des3 = r.createEncryptor(p.create(b.slice(4, 6))) }, encryptBlock: function (b, a) { this._des1.encryptBlock(b, a); this._des2.decryptBlock(b, a); this._des3.encryptBlock(b, a) }, decryptBlock: function (b, a) { this._des3.decryptBlock(b, a); this._des2.encryptBlock(b, a); this._des1.decryptBlock(b, a) }, keySize: 6, ivSize: 2, blockSize: 2 }); d.TripleDES = n._createHelper(s) })(); CryptoJS.mode.ECB = (function () { var ECB = CryptoJS.lib.BlockCipherMode.extend(); ECB.Encryptor = ECB.extend({ processBlock: function (words, offset) { this._cipher.encryptBlock(words, offset); } }); ECB.Decryptor = ECB.extend({ processBlock: function (words, offset) { this._cipher.decryptBlock(words, offset); } }); return ECB; }()); var decryptRSAKey; //rsa解密 --privateKeyStr解密key ,cKeyStr要解密数据 function decryptRSA(privateKeyStr, cKeyStr) { var crypt = new JSEncrypt(); crypt.setPrivateKey(privateKeyStr); decryptRSAKey = crypt.decrypt(cKeyStr); return decryptRSAKey; } //DES加密 message要加密数据,key加密key function encryptByDES(message) { var keyHex = CryptoJS.enc.Utf8.parse(decryptRSAKey); var encrypted = CryptoJS.DES.encrypt(message, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } function decryptByDES(ciphertext) { var keyHex = CryptoJS.enc.Utf8.parse(decryptRSAKey); var decrypted = CryptoJS.DES.decrypt({ ciphertext: CryptoJS.enc.Base64.parse(ciphertext) }, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return decrypted.toString(CryptoJS.enc.Utf8); } function test(key) { return encryptByDES(key) } ================================================ FILE: 其他实战/【青海移动】登陆参数生成/make_param.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-09-12 Python: 3.7 import execjs.runtime_names class QinHaiYiDong: """ 青海移动 参数加密 https://www.iqhmall.cn/shopweb/logon/logon """ def __init__(self, user, pwd): self.js = None self.user = user self.pwd = pwd self.init_js() def init_js(self): print('引擎', execjs.get().name) with open("encryp.js", "r", encoding="utf-8") as f: self.js = execjs.compile(f.read()) def make_param(self): print(self.js.call('test', self.pwd)) if __name__ == '__main__': yd = QinHaiYiDong('17327362817', '123123123') yd.make_param() ================================================ FILE: 其他实战/【餐饮】查询信息/FoodInfo.py ================================================ # -*- encoding: utf-8 -*- # Time : 2020/01/16 # Author : Zok # Email : 362416272@qq.com import requests import re import json from copyheaders import headers_raw_to_dict class Food: """ 根据输入美团餐馆名,解析参观基础信息 """ def __init__(self): self.headers = headers_raw_to_dict(b""" Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cache-Control: max-age=0 Connection: keep-alive Cookie: _lxsdk_s=16fb0ce3a0d-4cf-d9e-cf2%7C%7C1 Host: www.meituan.com Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 """) def get_info(self, url): response = requests.get(url, headers=self.headers) data = json.loads(re.search(r'北京美团网-北京美食_酒店_旅游_团购_电影_吃喝玩乐
美团
最近搜索
删除搜索历史
    热门搜索

      抱歉,页面暂时无法访问...

      错误信息:服务器拒绝请求

      返回美团首页
      ================================================ FILE: 原创爬虫工具/Cookies/MeiTuan/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-14 Python: 3.7 ================================================ FILE: 原创爬虫工具/Cookies/MeiTuan/config.py ================================================ # Redis数据库地址 REDIS_HOST = '' # Redis端口 REDIS_PORT = 6379 # Redis密码,如无填None REDIS_PASSWORD = None ================================================ FILE: 原创爬虫工具/Cookies/MeiTuan/db.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-13 Python: 3.7 import redis import random from Cookies.MeiTuan.config import * class RedisClient(object): def __init__(self, t_type, website, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD): """ 初始化 redis 池 :param t_type: 链接类型 :param website: 站点 :param host: IP :param port: 端口 :param password: 密码 """ if password: pool = redis.ConnectionPool(host=host, port=port, password=password) else: pool = redis.ConnectionPool(host=host, port=port) self.db = redis.Redis(connection_pool=pool) self.type = t_type self.website = website @property def name(self): """ 获取Hash名 :return: Hash名称 """ return "{type}:{website}".format(type=self.type, website=self.website) def set(self, username, value): """ 设置键值对 :param username: 用户名 :param value: 密码或Cookies :return: 设置结果 """ return self.db.hset(self.name, username, value) def get(self, username): """ 根据键名获取值 :param username: 用户名 :return: 获取结果 """ return self.db.hdel(self.name, username) def delete(self, username): """ 根据键名删除 :param username: 用户名 :return: 删除结果 """ return self.db.hdel(self.name, username) def count(self): """ 获取数目 :return: 数目 """ return self.db.hlen(self.name) def random(self): """ 随机得到键值,用于随机Cookies获取 :return: """ return random.choice(self.db.hvals(self.name)) # 返回所有,再随机取 def all_username(self): """ 获取所有账户信息 :return: 所有用户名 """ return self.db.hkeys(self.name) def all(self): """ 获取所有键值对 :return: 用户名和密码或Cookies的映射表 """ return self.db.hgetall(self.name) ================================================ FILE: 原创爬虫工具/Cookies/MeiTuan/generator.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-13 Python: 3.7 import asyncio import json from Cookies.MeiTuan.db import RedisClient from pyppeteer import launch class MeiTuanCookies(): login_url = 'https://passport.meituan.com/account/unitivelogin' def __init__(self): self.r = RedisClient('accounts', 'meituan') async def star(self, username, password): browser = await launch() context = await browser.createIncogniteBrowserContext() page = await context.newPage() await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,' '{ webdriver:{ get: () => false } }) }') # 本页刷新后值不变 await page.goto(self.login_url) await page.type('input#login-email', username) await page.type('input#login-password', password) await page.click('input.btn') await self.get_cookie(page,username,password) async def get_cookie(self, page,username,password): """ 获取 cookies :param page: 页面 :return: """ cookies_list = await page.cookies() cookies = '' for cookie in cookies_list: str_cookie = '{0}={1};' str_cookie = str_cookie.format(cookie.get('name'), cookie.get('value')) cookies += str_cookie # 储存cookies print(cookies) self.r.set(username, json.dumps({'password': password, 'cookies': cookies})) if __name__ == '__main__': mt = MeiTuanCookies() with open('账号.txt', 'r', encoding='utf-8') as f: # 账号|密码\n lines = f.readlines() tasks = [] for line in lines: username, password = line.strip().split('|') tasks.append(mt.star(username, password)) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) ================================================ FILE: 原创爬虫工具/Cookies/MeiTuan/账号.txt ================================================ 账号1|密码1 账号2|密码2 账号3|密码3 ================================================ FILE: 原创爬虫工具/Cookies/README.md ================================================ # 异步批量登陆美团获取cookies > pyppeteer 异步批量登陆美团并将cookies储存到redis 的hash表中 ================================================ FILE: 原创爬虫工具/Cookies/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-14 Python: 3.7 ================================================ FILE: 原创爬虫工具/DataMigration/README.md ================================================ # 工作中经常有这种需求 > 将采集好的mongodb数据转存到mysql中,或者是redis数据转到mongodb,于是打算封装一个组件便于以后调用 # mysql转存mongo 1. 在 config 中配置 mongo 与 mysql 连接 2. 在 `msyql_to_mongo.py` 下方实例化时填入 `需要转换mysql表名`, `mongo库名`, `mongo表名` 3. 调用 `mi.easy_to_mongo()` 即可将 mysql 中的 数据导入到 mongodb > 当然也支持自定义转换,在类中添加即可 ================================================ FILE: 原创爬虫工具/DataMigration/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-15 Python: 3.7 ================================================ FILE: 原创爬虫工具/DataMigration/config.py ================================================ # mongodb链接 MONGODB_URL = 'mongodb://localhost:27017' # Redis数据库地址 REDIS_HOST = '' # Redis端口 REDIS_PORT = 6379 # Redis密码,如无填None REDIS_PASSWORD = None # Mysql地址 MYSQL_HOST = '127.0.0.1' # Mysql端口 MYSQL_PORT = 3306 # Mysql用户名 MYSQL_USER = 'root' # Mysql密码 MYSQL_PASSWORD = '' # Mysql链接库 MYSQL_DB_NAME = 'travel' ================================================ FILE: 原创爬虫工具/DataMigration/db/MongoDB.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-15 Python: 3.7 from pymongo import MongoClient from DataMigration.config import MONGODB_URL class Mongo(object): def __init__(self, db_name, collection): client = MongoClient(MONGODB_URL) database = client[db_name] self.collection = database[collection] def delete(self, *args, del_one=True): """ 删除复合条件的信息 :param sql: sql 语句 :param del_one: 默认删除第一条,否则删除复合条件的所有 :return: """ return self.collection.delete_one(*args) if del_one else self.collection.deleteMany(*args) @property def all(self): """ 返回全部 :return: 整表信息 """ return self.collection.find({}) def find(self, *args): """ 指定查找 :param sql: :return: """ return self.collection.find(*args) def update(self, *args, update_one=True): """ 修改数据 :param sql: 修改sql :param update_one: 默认修改第一个,否则修改复合条件所有 :return: """ return self.collection.update_one(*args) if update_one else self.collection.update_many(*args) def insert(self, *args, insert_one=True): """ 插入数据 :param sql: 新增sql :param insert_one: 默认插入一个 :return: """ return self.collection.insert_one(*args) if insert_one else self.collection.insert_many(*args) if __name__ == '__main__': # 测试 mg = Mongo('meituan', 'user_info') # data = mg.all ret = mg.update({'用户名': '三丰948'}, {'$set': {'用户名': '三三风'}}) ================================================ FILE: 原创爬虫工具/DataMigration/db/Mysql.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-15 Python: 3.7 import pymysql from DataMigration.config import MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB_NAME class Mysql(object): def __init__(self): """ 链接数据库 """ self.conn = pymysql.Connect( host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD, db=MYSQL_DB_NAME, ) def insert(self, sql): """ 查找 :param sql: sql语句 :return: """ # 创建游标对象 cursor = self.conn.cursor() # 执行并提交 try: cursor.execute(sql) self.conn.commit() except Exception as e: print('异常回滚') self.conn.rollback() finally: cursor.close() def select(self, sql): """ 查找 :param sql: sql 语句 :return: 查找结果 """ cursor = self.conn.cursor() # 创建游标对象 # 提交事务 try: cursor.execute(sql) data = cursor.fetchall() except Exception as e: print('异常回滚') data = None self.conn.rollback() finally: cursor.close() return data ================================================ FILE: 原创爬虫工具/DataMigration/db/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-15 Python: 3.7 ================================================ FILE: 原创爬虫工具/DataMigration/migration/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-15 Python: 3.7 ================================================ FILE: 原创爬虫工具/DataMigration/migration/mongo_to_mysql.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-23 Python: 3.7 from DataMigration.db.MongoDB import Mongo from DataMigration.db.Mysql import Mysql from DataMigration.config import MYSQL_DB_NAME class Migrate(object): def __init__(self,mysql_table_name, mongodb_name, mongodb_collection): self.mongo = Mongo(mongodb_name, mongodb_collection) self.mysql = Mysql() self.mysql_name = mysql_table_name def easy_to_mongo(self, column_comment=False): """ 将输入插入 mongodb :return: """ columns = self.get_column() nodes = self.all_mysql_data() data_list = [] for node in nodes: data_dict = {} for index, column in enumerate(columns): if column_comment: data_dict[column[1]] = node[index] else: data_dict[column[0]] = node[index] data_list.append(data_dict) try: self.mongo.insert(data_list, insert_one=False) print('储存成功') except Exception: print('转存失败') def all_mysql_data(self): """ 获取需要转换的数据 :return: 所有 mysql 数据 """ sql = """SELECT * from {table_name};""".format(table_name=self.mysql_name) return self.mysql.select(sql) def get_column(self): """ 取字段名 :return: (字段名,字段描述) """ sql = """select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='{table_name}' and table_schema='{db_name}'""".format( table_name=self.mysql_name, db_name=MYSQL_DB_NAME, ) return self.mysql.select(sql) if __name__ == '__main__': mi = Migrate('需要转换mysql表名', 'mongo库名', 'mongo表名') mi.easy_to_mongo(column_comment=True) # column_comment=True 使用注释的字段名, 默认不使用 ================================================ FILE: 原创爬虫工具/DataMigration/migration/mysql_to_mongo.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-20 Python: 3.7 from DataMigration.db.MongoDB import Mongo from DataMigration.db.Mysql import Mysql from DataMigration.config import MYSQL_DB_NAME class Migrate(object): def __init__(self, mysql_table_name, mongodb_name, mongodb_collection): self.mongo = Mongo(mongodb_name, mongodb_collection) self.mysql = Mysql() self.mysql_name = mysql_table_name def easy_to_mongo(self, column_comment=False): """ 将输入插入 mongodb :return: """ columns = self.get_column() nodes = self.all_mysql_data() data_list = [] for node in nodes: data_dict = {} for index, column in enumerate(columns): if column_comment: data_dict[column[1]] = node[index] else: data_dict[column[0]] = node[index] data_list.append(data_dict) try: self.mongo.insert(data_list, insert_one=False) print('储存成功') except Exception: print('转存失败') def all_mysql_data(self): """ 获取需要转换的数据 :return: 所有 mysql 数据 """ sql = """SELECT * from {table_name};""".format(table_name=self.mysql_name) return self.mysql.select(sql) def get_column(self): """ 取字段名 :return: (字段名,字段描述) """ sql = """select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='{table_name}' and table_schema='{db_name}'""".format( table_name=self.mysql_name, db_name=MYSQL_DB_NAME, ) return self.mysql.select(sql) if __name__ == '__main__': mi = Migrate('需要转换mysql表名', 'mongo库名', 'mongo表名') mi.easy_to_mongo(column_comment=True) # column_comment=True 使用注释的字段名, 默认不使用 ================================================ FILE: 原创爬虫工具/Decode/README.md ================================================ # 可拓展式解密器 > 方便测试可连续转换重制的编码转换器,可灵活拓展解码规则 # 说明博客 [**博客地址**](https://www.zhangkunzhi.com/?p=241) ================================================ FILE: 原创爬虫工具/Decode/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-01 Python: 3.7 ================================================ FILE: 原创爬虫工具/Decode/translation.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-28 Python: 3.7 import base64 import zlib COLOR = {'red': 1, 'green': 2, 'yellow': 3, 'blue': 4} class TranslationMetaClass(type): """Meta 类""" def __new__(mcs, name, bases, attrs): count = 0 attrs['__Decode__'] = {} for k, v in attrs.items(): if 'decode_' in k: count += 1 attrs['__Decode__'][str(count)] = k attrs['__TranslationFuncCount__'] = count return type.__new__(mcs, name, bases, attrs) class Util(object): """辅助类""" @staticmethod def _print(color, msg): """print color control """ node = '\033[1;3{id}m{msg}\033[0m' if COLOR.get(color): print(node.format(id=COLOR.get(color), msg=msg)) else: print(msg) def msg(self): """print decode func """ for k in self.__Decode__: self._print('yellow', str(k) + ': ' + self.__Decode__[k][7:]) self._print('yellow', 'r: 【重制】 e:【退出】') return input('请选择 >>>').lower() class Decode(Util, metaclass=TranslationMetaClass): """ 将需要添加的转码类型按下列类似格式添加即可 def decode_自定义名(self): self._key = 解密过程 """ def __init__(self, _key): self._key = _key self._copy = _key self.crumbs = '' def main(self): choice = self.msg() while choice != 'e': if choice == 'r': # 重制 self._key, self.crumbs = self._copy, '' self._print('blue', '重制成功: ' + self._key) choice = self.msg() elif choice in self.__Decode__: # 选择是否在现有函数选项中 try: eval("self.{}()".format(self.__Decode__[choice])) # 字符串转函数运行 self._print('blue', self._key) self.crumbs += self.__Decode__[choice][7:] + ' > ' self._print('green', self.crumbs) choice = self.msg() except Exception: choice = input('解码失败,换一种 >>>') self._print('red', '调试结束') def decode_base64(self): """解base64""" self._key = base64.b64decode(self._key) def decode_zlib(self): """解压串""" self._key = zlib.decompress(self._key) def decode_str(self): """转字符串""" self._key = str(self._key, encoding="utf-8") def decode_hex(self): """转到16进制""" self._key = self._key.hex() if __name__ == '__main__': # _key = 'eJyrVnqxZdnT/u1KVgpKpcWpRUo6CkpP17c9X9AIEilILC4uzy9KUaoFAGxTEMo=' # 测试 _key = input('\033[1;31m输入解码内容>>> \033[0m') ts = Decode(_key) ts.main() ================================================ FILE: 原创爬虫工具/Jsencrypt/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-29 Python: 3.7 ================================================ FILE: 原创爬虫工具/Jsencrypt/make_encrypt.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-28 Python: 3.7 import base64 from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 from Crypto.PublicKey import RSA public_key = """ -----BEGIN PUBLIC KEY----- Your PUBLIC KEY -----END PUBLIC KEY----- """ def make_message(pwd): rsakey = RSA.importKey(public_key) cipher = Cipher_pkcs1_v1_5.new(rsakey) cipher_text = base64.b64encode(cipher.encrypt(pwd.encode(encoding="utf-8"))) return cipher_text.decode('utf8') if __name__ == '__main__': print(make_message('hellow')) ================================================ FILE: 原创爬虫工具/OSS/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-24 Python: 3.7 ================================================ FILE: 原创爬虫工具/OSS/push_to_oss.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-24 Python: 3.7 """ 将图redis中储存的网络图片链接,并发直传到 OSS 上 """ import oss2 import redis import requests from concurrent.futures import ThreadPoolExecutor # 线程池模块 KEY = '' KEYSECRET = '' BUCKETNAME = '' ENDPOINT = 'http://oss-cn-hangzhou.aliyuncs.com' REDIS_HOST = "localhost" REDIS_USER = "root" REDIS_PASSWORD = "" REDIS_DB_NAME = 1 REDIS_PORT = 6379 list_name = 'restaurant' # 列队名 # oss auth = oss2.Auth(KEY, KEYSECRET) bucket = oss2.Bucket(auth, ENDPOINT, BUCKETNAME) # redis 池 pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB_NAME, password=REDIS_PASSWORD, decode_responses=True) r = redis.Redis(connection_pool=pool) def put_img(): """上传逻辑,根据项目需求修改即可""" url = r.rpop(list_name) input = requests.get(url) if input.status_code == 200: file_name = url # this is file name obj = bucket.put_object(file_name, input) if obj.status == 200: print('OK', file_name) else: r.lpush(list_name) def get_len(): return r.llen(list_name) if __name__ == '__main__': list_len = get_len() print('专辑总图数量', list_len) pool = ThreadPoolExecutor() # 设置线程池大小,默认等于cpu核数 for i in range(list_len): pool.submit(put_img) pool.shutdown(wait=True) print('主进程') ================================================ FILE: 原创爬虫工具/Proxy/KDLProxyPool.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-17 Python: 3.7 """ 快代理IP池 https://www.kuaidaili.com/ 放代理API """ import redis import requests import json from apscheduler.schedulers.blocking import BlockingScheduler class KDLProxyPool(object): """ 快代理IP池 用的快代理开放代理API """ def __init__(self, key, count): try: self.key = key # 订单号 self.count = count # 代理池代理数量 """redis数据库配置区""" pool = redis.ConnectionPool(decode_responses=True) self.r = redis.Redis(connection_pool=pool) except: print('请填入正确的API链接') def check_ip(self): """ 监控 IP 分数、个数,对其进行增删 """ # 检查分数 nodes = self.r.zrevrange('KDLProxy', 0, -1, withscores=True) for i in nodes: node = list(i) score = int(node[1]) if score <= 0: print('\033[1;33m分数过低剔除\033[0m') self.r.zrem('KDLProxy', node[0]) # 检查个数 _sum = self.r.zcard('KDLProxy') if _sum < self.count: self.add_ip(self.count - _sum) def add_ip(self, num): """ 提取IP """ get_url = 'http://svip.kdlapi.com/api/getproxy/?orderid={key}&num={num}&protocol=2&method=2&an_ha=1&sp1=1&quality=2&format=json&sep=1'.format( key=self.key, num=num) # 返回的文本进行解析 response = requests.get(get_url) if response.status_code == 200: ret = json.loads(response.text) if ret.get('code') == 0: self.parse(ret.get('data').get('proxy_list')) else: print(ret.get('msg')) else: print('提取失败') def parse(self, proxy_list): """ 解析返回数据 """ for node in proxy_list: self.save_to_redis(node, 10) # 默认10分 def save_to_redis(self, proxy, expire): """ 推送到redis集合中 """ print('代理 %s 推入redis集合' % proxy) self.r.zadd('KDLProxy', {proxy: expire}) def aps_run(): """ 监控 """ kdl.check_ip() kdl = KDLProxyPool('填写开放代理订单号', 20) # 循环监控 scheduler = BlockingScheduler() scheduler.add_job(aps_run, 'cron', second='*/1') # 这里设置检测评论,推荐2s一次(默认) scheduler.start() ================================================ FILE: 原创爬虫工具/Proxy/README.md ================================================ [TOC] # 安装模块 ```bush pip3 install redis pip3 install apscheduler pip3 install reuqest pip3 install python-dateutil ``` # 讯代理池使用 1. 登陆讯代理 进入API页码将下面下方生成的API复制 ![讯代理API](https://www.zhangkunzhi.com/images/xdl3.png) 2. 将链接复制到项目该位置 ![讯代理API](https://www.zhangkunzhi.com/images/xdl4.png) 3. 配置redis, 默认是本机 ![讯代理API](https://www.zhangkunzhi.com/images/xdl5.png) 4. 启动程序,大功告成,只需要在调用ip的时候对其进行增减分操作即可 ![讯代理API](https://www.zhangkunzhi.com/images/xdl1.png) ![讯代理API](https://www.zhangkunzhi.com/images/xdl2.png) # 芝麻代理池使用 1. 首先登陆你的芝麻代理后台管理,找到自己的key如图 ![key位置](https://www.zhangkunzhi.com/images/芝麻1.png) 1. 在代码下方配置key ![key位置](https://www.zhangkunzhi.com/images/填入芝麻key.png) 1. 在代码中配置 redis库连接 **默认链接的本地** ![key位置](https://www.zhangkunzhi.com/images/代理模块.png) 1. 启动程序 > 如果在服务端可以使用后台运行命令 `nohup python3 ProxyPool.py >my.log &` 1. 第一次启动芝麻代理会绑定你的ip白名单,稍等片刻就会开始提取 ![key位置](https://www.zhangkunzhi.com/images/提取ip.png) 1. 链接redis可以看到ip池了,大功告成 ![key位置](https://www.zhangkunzhi.com/images/20个ip.png) 1. 后续在使用代理ip时,根据访问结果对代理ip积分增减即可,后续会更新这个Demo继续关注Github即可。[**传送门**](https://github.com/wkunzhi/SpiderUtilPackage) # 额外配置 - 可以自由配置,代理池上线值(默认20),实例化时配置即可 ```python zm = ZhiMaPool('key', ip_sum=100) ``` - 可以自由配置,只取可用时间xx以上的ip(默认1号套餐下的1000秒以上),实例化时配置即可 ```python zm = ZhiMaPool('key', ttl=1000) ``` - 还可以配置 每次提取数、提取套餐类型、提取ip HTTP或者HTTPS或者Sockets ================================================ FILE: 原创爬虫工具/Proxy/XDLProxyPool.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-09 Python: 3.7 import redis import requests import re import time import json from apscheduler.schedulers.blocking import BlockingScheduler """ 可自型拓展其他的代理ip产品,只需修改调用接口即可 """ class XDLProxyPool(object): """ 迅代理IP池 """ def __init__(self, api_url): try: """redis数据库配置区""" pool = redis.ConnectionPool(decode_responses=True) self.r = redis.Redis(connection_pool=pool) """白名单初始化""" ret = re.search(r'spiderId=(.*?)&orderno=(.*?)&returnType=\d+&count=(\d+)', api_url) self.spiderId, self.orderno, self.count = ret.group(1), ret.group(2), int(ret.group(3)) self.init_proxy() except: print('请填入正确的API链接') def init_proxy(self): """ 初始化代理 """ print('\033[1;35m初始化中...\033[0m') # 取出当前IP地址 response = requests.get('http://pv.sohu.com/cityjson?ie=utf-8') address = re.search(r'"cip": "(.*?)", "cid', response.text).group(1) # 加入白名单 url = 'http://www.xdaili.cn/ipagent/newWhilteList/updateByOrder?orderno={orderno}&ip={ip}&spiderId={spiderId}'.format( orderno=self.orderno, ip=address, spiderId=self.spiderId) status = requests.get(url=url).status_code if status == 200: print('\033[1;35m初始化成功,启动中稍等..\033[0m') time.sleep(2) print('监控已开启') else: print('初始化白名单失败') def check_ip(self): """ 监控 IP 分数、个数,对其进行增删 """ # 检查分数 nodes = self.r.zrevrange('XDLProxy', 0, -1, withscores=True) for i in nodes: node = list(i) score = int(node[1]) if score <= 0: print('\033[1;33m分数过低剔除\033[0m') self.r.zrem('XDLProxy', node[0]) # 检查个数 _sum = self.r.zcard('XDLProxy') if _sum < self.count: self.add_ip(self.count - _sum) def add_ip(self, count): """ 提取IP """ get_url = 'http://api.xdaili.cn/xdaili-api//greatRecharge/getGreatIp?spiderId={spiderId}&orderno={orderno}&returnType=2&count={count}'.format( spiderId=self.spiderId, orderno=self.orderno, count=str(count)) # 返回的文本进行解析 response = requests.get(get_url) if response.status_code == 200: ret = json.loads(response.text) if ret.get('ERRORCODE') in ['10036', '10038', '10055']: print('提取速度过快5秒钟提取一次') elif ret.get('ERRORCODE') == '10032': print('余额不足或今日已到提取上线') else: self.parse(ret) else: print('提取失败') def parse(self, data): """ 解析返回数据 """ proxy_list = data.get('RESULT') for node in proxy_list: proxy = node.get('ip') + ':' + node.get('port') self.save_to_redis(proxy, 10) # 默认10分 def save_to_redis(self, proxy, expire): """ 推送到redis集合中 """ print('代理 %s 推入redis集合' % proxy) self.r.zadd('XDLProxy', {proxy: expire}) def aps_run(): """ 监控 """ xdl.check_ip() # 填入提取链接 xdl = XDLProxyPool('填写讯代理api链接') # 循环监控 scheduler = BlockingScheduler() scheduler.add_job(aps_run, 'cron', second='*/1') # 这里设置检测评论,推荐2s一次(默认) scheduler.start() ================================================ FILE: 原创爬虫工具/Proxy/XDLProxyUseDemo.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-11 Python: 3.7 import redis import random # 在scrapy中使用 代理池的demo """ middleware中代码如下 """ pool = redis.ConnectionPool(decode_responses=True) # redis 池 r = redis.Redis(connection_pool=pool) """ middleware中配置代理中间键 注意,根据爬取网址是http 还是https 来设置 """ class MyProxy(object): """代理IP设置""" def process_request(self, request, spider): # 此处对接redis data = r.zrangebyscore('XDLProxy', 1, 100, withscores=True) ip, score = random.choice(data) request.meta['proxy'] = 'http://'+ip # 根据自己情况填写 """ 拦截中间键中配置如下,写入计分器,满分20分 """ class DownloaderMiddleware(object): def process_response(self, request, response, spider): # 对代理ip进行清洗 proxy = request._meta.get('proxy') if not response.status == 200: print('IP访问失败') if proxy: proxy = proxy[proxy.find('/')+2:] # 提取当此访问proxy r.zincrby('XDLProxy', -1, proxy) # redis 命令修改 else: if proxy: proxy = proxy[proxy.find('/') + 2:] # 提取当此访问proxy score = r.zscore('XDLProxy', proxy) # 取出分数 if score < 20: r.zincrby('XDLProxy', 1, proxy) # redis 新版本命令更改这样了 return response def process_exception(self, request, exception, spider): # 可能由于IP质量问题无法访问超时 print('超时异常') proxy = request._meta.get('proxy') if proxy: proxy = proxy[proxy.find('/') + 2:] r.zincrby('XDLProxy', -1, proxy) # redis 新版本命令更改这样了 return request """ setting中配置 """ DOWNLOAD_TIMEOUT = 5 # 有的时候代理ip失效,会导致一直卡在那里 ,也有可能是用http 访问https DOWNLOADER_MIDDLEWARES = { 'middlewares.MyProxy': 543, # 自定义代理IP 'middlewares.spiderDownloaderMiddleware': 600, # 拦截301、302等跳转 必须设置到600 } ================================================ FILE: 原创爬虫工具/Proxy/ZhiMaProxyPool.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-2 Python: 3.7 import redis import datetime import requests import json import re import time from apscheduler.schedulers.blocking import BlockingScheduler from dateutil.parser import parse class ZhiMaPool(object): """ 芝麻代理按次提取(非套餐)代理IP """ """redis数据库配置区""" pool = redis.ConnectionPool(decode_responses=True) r = redis.Redis(connection_pool=pool) def __init__(self, key, ip_sum=20, ttl=1000): """ init zhima :param key: ZhiMaProxy http://h.zhimaruanjian.com/pay/ :param ip_sum: The largest number :param ttl: Set survival time | seconds """ self.key = key self.ip_sum = ip_sum self.ttl = ttl self._init() # init the proxy def _init(self): """ Initialize the proxy """ print('\033[1;35m初始化中...\033[0m') response = requests.get('http://pv.sohu.com/cityjson?ie=utf-8') address = re.search(r'"cip": "(.*?)", "cid', response.text).group(1) url = 'http://web.http.cnapi.cc/index/index/save_white?neek=66439&appkey={key}&white={local}'.format( key=self.key, local=address) response = requests.get(url=url) code = json.loads(response.text).get('code') if code == 0 or code == 115: print('\033[1;35m初始化成功,启动中稍等..\033[0m') else: print('初始化芝麻账号失败') time.sleep(2) def check_ip(self): """ Check scores & due dates & proxy sum :return How many proxy are needed """ # check dates and scores now_time = int(time.time()) nodes = self.r.zrevrange('ZhiMaProxy', 0, -1, withscores=True) for i in nodes: flag = False node = list(i) score_str = str(int(node[1])) time_stamp = int(score_str[-10:]) if time_stamp-now_time <= 0: print('代理过期删除', str(node[0])) self.r.zrem('ZhiMaProxy', node[0]) if len(score_str[:-10]) == 0: flag = True # 删除 else: # 可能由于频率过快出现负数 if int(node[1]) < 0: flag = True # 删除 if flag: print('分数过低剔除') self.r.zrem('ZhiMaProxy', node[0]) # check num _sum = self.r.zcard('ZhiMaProxy') if _sum < self.ip_sum: self.add_ip(count=self.ip_sum-_sum) def add_ip(self, count=1, time_type=1, ip_type='http'): """ get proxy ip and port """ port = '11' if ip_type == 'https' else '1' # http(default) & https get_url = 'http://webapi.http.zhimacangku.com/getip?num={num}&type=2&pro=&city=0&yys=0&port={port}&time={time}&ts=1&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1®ions='.format( num=count, port=port, time=time_type) # time 1=5m~25m 2=25m~3h 3=3h~6h 4=6h~12h response = requests.get(get_url) self.parse(response.text) def del_ip(self): pass def parse(self, json_data): """ parse response json """ count = 0 ret_dict = json.loads(json_data) if ret_dict.get('success'): nodes = ret_dict.get('data') for node in nodes: end_time = self.get_end_time(node.get('expire_time')) if not end_time: """该域名存活时间过短,已弃用""" continue self.save_to_redis(node.get('ip') + ':' + str(node.get('port')), int('10' + str(end_time))) count += 1 self.get_balance(count, len(nodes)) # get balance else: print('获取代理失败:', ret_dict) def get_end_time(self, parse_time): """ time transformation """ a = parse(parse_time) b = parse(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) results = (a - b).total_seconds() if results > self.ttl: stamp = int(time.mktime(time.strptime(parse_time, "%Y-%m-%d %H:%M:%S"))) return stamp else: return def save_to_redis(self, proxy, expire): """ proxy save to redis,default score is 10 """ self.r.zadd('ZhiMaProxy', {proxy: expire}) def get_balance(self, count, total): """ get balance from web api """ balance_url = 'http://web.http.cnapi.cc/index/index/get_my_balance?neek=66439&appkey={key}'.format(key=self.key) response = json.loads(requests.get(balance_url).text) if response.get('success'): print('\033[1;34m余额:%s ,提取%s个\033[0m' % (response.get('data').get('balance'), str(count))) if total != count: print('\033[1;31m由于剩下存活时间过短弃用%s个\033[0m' % str(total - count)) else: print(response.get('msg')) def aps_run(): """ apscheduler func """ zm.check_ip() zm = ZhiMaPool('your key') # 请填写你的key 参考文章:https://blog.zhangkunzhi.com/2019/05/02/%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%B6%85%E7%AE%80%E5%8D%95%E7%9A%84%E5%AE%9E%E7%94%A8%E7%9A%84%E9%AB%98%E5%8F%AF%E7%94%A8%E4%BB%98%E8%B4%B9IP%E6%B1%A0/index.html scheduler = BlockingScheduler() scheduler.add_job(aps_run, 'cron', second='*/2') # 这里设置检测评论,推荐2s一次(默认) scheduler.start() ================================================ FILE: 原创爬虫工具/Proxy/ZhiMaProxyUseDemo.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-07 Python: 3.7 import redis import random # 在scrapy中使用 代理池的demo """ scrapy 中 middleware中代码如下 """ pool = redis.ConnectionPool(decode_responses=True) r = redis.Redis(connection_pool=pool) """ middleware中配置代理中间键 注意,根据爬取网址是http 还是https 来设置 """ class MyProxy(object): """代理IP设置""" def process_request(self, request, spider): # 此处对接redis data = r.zrange('ZhiMaProxy', 0, -1, withscores=True) ip, score = random.choice(data) request.meta['proxy'] = 'http://'+ip """ 拦截中间键中配置如下,写入计分器,满分20分 """ class DownloaderMiddleware(object): def process_response(self, request, response, spider): # 对代理ip进行清洗 proxy = request._meta.get('proxy') if response.status == 302: print('IP访问失败') if proxy: proxy = proxy[proxy.find('/')+2:] r.zincrby('ZhiMaProxy', -10000000000, proxy) # redis 命令修改 elif response.status == 200: if proxy: proxy = proxy[proxy.find('/') + 2:] score = r.zscore('ZhiMaProxy',proxy) if score < 200000000000: r.zincrby('ZhiMaProxy', 10000000000, proxy) # redis 新版本命令更改这样了 return response def process_exception(self, request, exception, spider): # 可能由于IP质量问题无法访问超时,必须在这里捕获然后扣分 print('超时异常') proxy = request._meta.get('proxy') if proxy: proxy = proxy[proxy.find('/') + 2:] r.zincrby('ZhiMaProxy', -10000000000, proxy) # redis 新版本命令更改这样了 return request """ setting中配置 """ DOWNLOAD_TIMEOUT = 5 # 有的时候代理ip失效,会导致一直卡在那里 ,也有可能是用http 访问https OWNLOADER_MIDDLEWARES = { 'middlewares.MyProxy': 543, # 自定义代理IP 'middlewares.spiderDownloaderMiddleware': 600, # 拦截301、302等跳转 } ================================================ FILE: 原创爬虫工具/README.md ================================================ ## 工具表 - [x] [解密工具-可拓展式解密器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Decode) - [x] [自动注册-验证短信接收器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Register) - [x] [代理IP-芝麻代理池监控器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy) - [x] [代理IP-芝麻代理池客户端Demo](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy) - [x] [代理IP-讯代理池监控器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy) - [x] [代理IP-讯代理池客户端Demo](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy) - [x] [代理IP-快代理池监控器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy) - [x] [cookies获取-pyppeteer获取美团登陆cookies](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Cookies) - [x] [跨数据库迁移器-开发中](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/DataMigration) - [x] [网络图片并发直传OSS](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/OSS) - [x] [生成encrypt加密参数器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Jsencrypt)
      # 可拓展式解密器 [**博客传送门**](https://blog.zhangkunzhi.com/2019/06/02/%E5%8E%9F%E5%88%9B%E5%B7%A5%E5%85%B7%E4%B9%8B%E5%8F%AF%E6%8B%93%E5%B1%95%E8%A7%A3%E7%A0%81%E5%99%A8/index.html) > 方便测试可连续转换重制的编码转换器,可灵活拓展解码规则 ![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/特殊.gif)
      # 代理池清洗工具 [**博客传送门**](https://blog.zhangkunzhi.com/2019/05/02/%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%B6%85%E7%AE%80%E5%8D%95%E7%9A%84%E5%AE%9E%E7%94%A8%E7%9A%84%E9%AB%98%E5%8F%AF%E7%94%A8%E4%BB%98%E8%B4%B9IP%E6%B1%A0/index.html) > 爬虫经常会用到代理ip,其中有很多收费ip,但是如何在scrapy中,高效使用这些ip是一个比较麻烦的事情,在这里基于[芝麻代理ip](http://h.zhimaruanjian.com/pay/)做一个代理池监控器,首先整理我们的需求再对其代理质量进行管理,从而保持高效IP使用率 ![key位置](https://www.zhangkunzhi.com/images/提取ip.png)
      # 验证码短信接收器 > 基于短信接收平台的异步短信接收器,最大并发上限 20,Python3.5+。 启动后会根据设置的异步并发数进行获取手机号码并监听短信接收情况(60秒) 超过60秒后会将未收到短信的手机号拉入黑名单,并是释放。 若要配置具体某个网站使用,还需开发对应的账号注册器,配合调用本短信接收器来达到自动注册账号的功能
      # cookies获取Demo > 基于Pyppeteer 并发获取站点cookies - 美团登陆cookies ![](https://www.zhangkunzhi.com/images/异步获取cookies.png) # 跨数据库迁移器 **工作中经常有这种需求** > 将采集好的mongodb数据转存到mysql中,或者是redis数据转到mongodb,于是打算封装一个组件便于以后调用 - [x] mysql 数据迁移 mongodb ![](https://www.zhangkunzhi.com/images/to_mongo1.png) ![](https://www.zhangkunzhi.com/images/to_mongo2.png) ================================================ FILE: 原创爬虫工具/Register/MessageCode.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-13 Python: 3.7 import requests import json import time import asyncio import aiohttp ERROR = { '1001': '参数token不能为空', '1002': '参数action不能为空', '1003': '参数action错误', '1004': 'token失效', '1005': '用户名或密码错误', '1006': '用户名不能为空', '1007': '密码不能为空', '1008': '账户余额不足', '1009': '账户被禁用', '1010': '参数错误', '1011': '账户待审核', '1012': '账户暂停使用', '1013': '接口功能未开启', '1014': '接口登录未开启', '2001': '参数itemid不能为空', '2002': '项目不存在', '2003': '项目未启用', '2004': '暂时没有可用的号码', '2005': '获取号码数量已达到上限', '2006': '参数mobile不能为空', '2007': '号码已被释放', '2008': '号码已离线', '2009': '发送内容不能为空', '2010': '号码正在使用中', '3001': '尚未收到短信', '3002': '等待发送', '3003': '正在发送', '3004': '发送失败', '3005': '订单不存在', '9001': '系统错误', '9002': '系统异常', } class YMReg(object): def __init__(self, token, project_code, aio_count=20): """ :param token: 账号 token,在官网后台查询 :param project_code: 项目编码,官网查询 :param aio_count: 并发上限默认 20 (官方) """ self.token = token self.project_code = project_code self.aio_count = aio_count print(self.get_balance) # 打印余额 @property def get_balance(self): """查询余额 """ balance_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=getaccountinfo&token={token}&format=1' target_url = balance_api.format(token=self.token) response = requests.get(target_url) if response.status_code == 200: state, data = response.text.split('|') return '当前余额: %s 元' % json.loads(data).get('Balance') else: return '获取失败请检测账号' @ staticmethod def filter_info(message): if message in ERROR: return ERROR.get('message') elif len(message.split('|')) == 2: return message.split('|')[1] # 返回正确信息 elif message == 'success': return '拉黑或释放成功' else: return '未知错误' async def get_node(self, session, phone): """接收短信 """ for i in range(12): await asyncio.sleep(5) node_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=getsms&token={token}&itemid={itemid}&mobile={phone}&release=1×tamp={time}' target_url = node_api.format(token=self.token, itemid=self.project_code, phone=phone, time=time.time()) async with session.get(target_url) as response: message = await response.text() rest = self.filter_info(message) if rest: return phone + rest await self.join_black_list(session, phone) # 获取失败加入黑名单 return '%s 短信获取失败' % phone async def fetch_phone(self, session): """获取手机 """ get_phone_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=getmobile&token={token}&itemid={itemid}×tamp={time}' target_url = get_phone_api.format(token=self.token, itemid=self.project_code, time=time.time()) async with session.get(target_url) as response: message = await response.text() return self.filter_info(message) async def work(self): """开始工作 """ async with aiohttp.ClientSession() as session: result = await self.fetch_phone(session) print('提取手机', result) # 短信接收 result2 = await self.get_node(session, result) print(result2) # 释放 result3 = await self.del_phone(session, result) print(result3) async def del_phone(self, session, phone): """默认收到短信自动释放手机号,特殊情况可以单独调用释放 """ del_phone_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=release&token={token}&itemid={itemid}&mobile={phone}' target_url = del_phone_api.format(token=self.token, itemid=self.project_code, phone=phone) async with session.get(target_url) as response: message = await response.text() return self.filter_info(message) async def join_black_list(self, session, phone): """拉入黑名单,获取短信失败情况下拉入黑名单 """ black_list_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=addignore&token={token}&itemid={itemid}&mobile={phone}' target_url = black_list_api.format(token=self.token, itemid=self.project_code, phone=phone) async with session.get(target_url) as response: message = await response.text() return self.filter_info(message) def start(self): """开始工作 """ loop = asyncio.get_event_loop() tasks = [asyncio.ensure_future(self.work()) for _ in range(self.aio_count)] loop.run_until_complete(asyncio.wait(tasks)) if __name__ == '__main__': """验证码平台 http://www.51ym.me/User/Default.aspx""" ym = YMReg('后台查询token', '填写int类型项目编号,后台查询', 1) ym.start() ================================================ FILE: 原创爬虫工具/Register/README.md ================================================ # 注册短信并发异步接收器 > 基于短信接收平台的异步短信接收器,最大并发上限20,Python3.5+ `pip3 install asyncio` `pip3 install aiohttp` [平台网址](http://www.51ym.me/User/Default.aspx) ## 使用步骤 1. 实例化对象时填入平台 token 2. 实例化对象时填入后台查询的项目 id 3. 实例化对象时填入手机短信并发上限(最大20并发) > 启动后会根据设置的异步并发数进行获取手机号码并监听短信接收情况(60秒) 超过60秒后会将未收到短信的手机号拉入黑名单,并是释放。 若要配置具体某个网站使用,还需开发对应的账号注册器,配合调用本短信接收器来达到自动注册账号的功能 ================================================ FILE: 原创爬虫工具/Register/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-05-13 Python: 3.7 ================================================ FILE: 原创爬虫工具/zok/README.md ================================================ # Zok 组件使用说明 > by: 362416272@qq.com 自用 ### 目录 - repetition 内容更新处理 - save 通用持久化存储组件 - random_UA 随机UA - proxies 阿布云代理组件 **mysql储存** 1. 必须在zok_config中配置要持久化的数据库账户密码 2. 在爬虫项目文件pipelines管道中,引入并使用 ```python from zok.save.to_mysql import SaveToMysqlBase class CityLandmarkListPipeline(SaveToMysqlBase): member = 'city' # redis集合名 如果是分布式无需设置 @staticmethod def get_sql(item): sql = """INSERT INTO base_city_landmark(city, county, landmark) VALUES ("{city}","{county}","{landmark}") """.format( city=item['city'], county=item['county'], landmark=item['landmark'], ) return sql '''必须调用 def_sql(item)方法,并返回sql语句即可''' ``` **随机UA** ```python # setting.py中 加入即可 DOWNLOADER_MIDDLEWARES = { 'zok.random_UA.ua_random.RandomUserAgentMiddleware': 20, } ``` **代理ip设置** ```python # 在setting中配置即可 DOWNLOADER_MIDDLEWARES = { 'zok.proxies.proxies.ProxyMiddleware': 15, # 自定义的中间件 } ``` **基于redis内容去重更新** > 原理: 在储存数据之前取到hash数据值,并加以对比,如果有值就跳过不储存,无值就set(md5, id) 1. 开启redis服务 2. 在 zok_config中配置 redis配置 3. 应用储存组件 mysql 就会自动启用去重增量更新功能 ================================================ FILE: 原创爬虫工具/zok/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/5 Python: 3.7 ================================================ FILE: 原创爬虫工具/zok/get_db/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/16 Python: 3.7 ================================================ FILE: 原创爬虫工具/zok/get_db/from_mongodb.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-04-23 Python: 3.7 from pymongo import MongoClient from zok.zok_config import MONGODB_URL client = MongoClient(MONGODB_URL) database = client.meituan_db # 链接数据库 collection = database.href_coolections # 链接结合 data = collection.find({},{'_id': 0}) ================================================ FILE: 原创爬虫工具/zok/get_db/from_mysql.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 import pymysql from zok.zok_config import * def get_data(sql): conn = pymysql.Connect( host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD, db=MYSQL_DB_NAME, ) # 创建游标对象 cursor = conn.cursor() # 提交事务 try: cursor.execute(sql) data = cursor.fetchall() cursor.close() conn.close() return data except Exception as e: print(e) print('异常回滚') conn.rollback() cursor.close() conn.close() return None ================================================ FILE: 原创爬虫工具/zok/proxies/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 ================================================ FILE: 原创爬虫工具/zok/proxies/proxies.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/5 Python: 3.7 import base64 from zok.zok_config import * # 代理服务器 proxyServer = "http://http-dyn.abuyun.com:9020" proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((PROXY_USER + ":" + PROXY_PASS), "ascii")).decode("utf8") class ProxyMiddleware(object): """自定义中间件代理IP""" def process_request(self, request, spider): request.meta["proxy"] = proxyServer request.headers["Proxy-Authorization"] = proxyAuth ================================================ FILE: 原创爬虫工具/zok/random_UA/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 ================================================ FILE: 原创爬虫工具/zok/random_UA/fake_useragent.json ================================================ { "browsers": { "chrome": ["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36", "Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36", "Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", "Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14"], "opera": ["Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16", "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14", "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14", "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02", "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00", "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00", "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00", "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00", "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0", "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52", "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51", "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50", "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50", "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11", "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11", "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11", "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10", "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1", "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01", "Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01", "Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01", "Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01", "Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01", "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00", "Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00"], "firefox": ["Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1", "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0", "Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0", "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0", "Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0", "Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0", "Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0", "Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0", "Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0", "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6"], "internetexplorer": ["Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko", "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko", "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)", "Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)", "Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)", "Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", "Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)", "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; FunWebProducts)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.1; SV1; .NET CLR 2.8.52393; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)"], "safari": ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A", "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10", "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1", "Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"] }, "randomize": { "344": "chrome", "819": "firefox", "346": "chrome", "347": "chrome", "340": "chrome", "341": "chrome", "342": "chrome", "343": "chrome", "810": "internetexplorer", "811": "internetexplorer", "812": "internetexplorer", "813": "firefox", "348": "chrome", "349": "chrome", "816": "firefox", "817": "firefox", "737": "chrome", "719": "chrome", "718": "chrome", "717": "chrome", "716": "chrome", "715": "chrome", "714": "chrome", "713": "chrome", "712": "chrome", "711": "chrome", "710": "chrome", "421": "chrome", "129": "chrome", "420": "chrome", "423": "chrome", "422": "chrome", "425": "chrome", "619": "chrome", "424": "chrome", "427": "chrome", "298": "chrome", "299": "chrome", "296": "chrome", "297": "chrome", "294": "chrome", "295": "chrome", "292": "chrome", "293": "chrome", "290": "chrome", "291": "chrome", "591": "chrome", "590": "chrome", "593": "chrome", "592": "chrome", "595": "chrome", "594": "chrome", "597": "chrome", "596": "chrome", "195": "chrome", "194": "chrome", "197": "chrome", "196": "chrome", "191": "chrome", "190": "chrome", "193": "chrome", "192": "chrome", "270": "chrome", "271": "chrome", "272": "chrome", "273": "chrome", "274": "chrome", "275": "chrome", "276": "chrome", "277": "chrome", "278": "chrome", "279": "chrome", "569": "chrome", "497": "chrome", "524": "chrome", "525": "chrome", "526": "chrome", "527": "chrome", "520": "chrome", "521": "chrome", "522": "chrome", "523": "chrome", "528": "chrome", "529": "chrome", "449": "chrome", "448": "chrome", "345": "chrome", "443": "chrome", "442": "chrome", "441": "chrome", "440": "chrome", "447": "chrome", "446": "chrome", "445": "chrome", "444": "chrome", "47": "chrome", "108": "chrome", "109": "chrome", "102": "chrome", "103": "chrome", "100": "chrome", "101": "chrome", "106": "chrome", "107": "chrome", "104": "chrome", "105": "chrome", "902": "firefox", "903": "firefox", "39": "chrome", "38": "chrome", "906": "firefox", "907": "firefox", "904": "firefox", "905": "firefox", "33": "chrome", "32": "chrome", "31": "chrome", "30": "chrome", "37": "chrome", "36": "chrome", "35": "chrome", "34": "chrome", "641": "chrome", "640": "chrome", "643": "chrome", "642": "chrome", "645": "chrome", "644": "chrome", "438": "chrome", "439": "chrome", "436": "chrome", "437": "chrome", "434": "chrome", "435": "chrome", "432": "chrome", "433": "chrome", "430": "chrome", "431": "chrome", "826": "firefox", "339": "chrome", "338": "chrome", "335": "chrome", "334": "chrome", "337": "chrome", "336": "chrome", "331": "chrome", "330": "chrome", "333": "chrome", "332": "chrome", "559": "chrome", "745": "chrome", "854": "firefox", "818": "firefox", "856": "firefox", "857": "firefox", "850": "firefox", "851": "firefox", "852": "firefox", "0": "chrome", "858": "firefox", "859": "firefox", "748": "chrome", "6": "chrome", "43": "chrome", "99": "chrome", "98": "chrome", "91": "chrome", "90": "chrome", "93": "chrome", "92": "chrome", "95": "chrome", "94": "chrome", "97": "chrome", "96": "chrome", "814": "firefox", "815": "firefox", "153": "chrome", "740": "chrome", "741": "chrome", "742": "chrome", "743": "chrome", "744": "chrome", "558": "chrome", "746": "chrome", "747": "chrome", "555": "chrome", "554": "chrome", "557": "chrome", "556": "chrome", "551": "chrome", "550": "chrome", "553": "chrome", "552": "chrome", "238": "chrome", "239": "chrome", "234": "chrome", "235": "chrome", "236": "chrome", "237": "chrome", "230": "chrome", "231": "chrome", "232": "chrome", "233": "chrome", "1": "chrome", "155": "chrome", "146": "chrome", "147": "chrome", "618": "chrome", "145": "chrome", "142": "chrome", "143": "chrome", "140": "chrome", "141": "chrome", "612": "chrome", "613": "chrome", "610": "chrome", "611": "chrome", "616": "chrome", "617": "chrome", "148": "chrome", "149": "chrome", "46": "chrome", "154": "chrome", "948": "safari", "949": "safari", "946": "safari", "947": "safari", "944": "safari", "945": "safari", "942": "safari", "943": "safari", "940": "safari", "941": "safari", "689": "chrome", "688": "chrome", "685": "chrome", "684": "chrome", "687": "chrome", "686": "chrome", "681": "chrome", "680": "chrome", "683": "chrome", "682": "chrome", "458": "chrome", "459": "chrome", "133": "chrome", "132": "chrome", "131": "chrome", "130": "chrome", "137": "chrome", "136": "chrome", "135": "chrome", "134": "chrome", "494": "chrome", "495": "chrome", "139": "chrome", "138": "chrome", "490": "chrome", "491": "chrome", "492": "chrome", "493": "chrome", "24": "chrome", "25": "chrome", "26": "chrome", "27": "chrome", "20": "chrome", "21": "chrome", "22": "chrome", "23": "chrome", "28": "chrome", "29": "chrome", "820": "firefox", "407": "chrome", "406": "chrome", "405": "chrome", "404": "chrome", "403": "chrome", "402": "chrome", "401": "chrome", "400": "chrome", "933": "firefox", "932": "firefox", "931": "firefox", "930": "firefox", "937": "safari", "452": "chrome", "409": "chrome", "408": "chrome", "453": "chrome", "414": "chrome", "183": "chrome", "415": "chrome", "379": "chrome", "378": "chrome", "228": "chrome", "829": "firefox", "828": "firefox", "371": "chrome", "370": "chrome", "373": "chrome", "372": "chrome", "375": "chrome", "374": "chrome", "377": "chrome", "376": "chrome", "708": "chrome", "709": "chrome", "704": "chrome", "705": "chrome", "706": "chrome", "707": "chrome", "700": "chrome", "144": "chrome", "702": "chrome", "703": "chrome", "393": "chrome", "392": "chrome", "88": "chrome", "89": "chrome", "397": "chrome", "396": "chrome", "395": "chrome", "394": "chrome", "82": "chrome", "83": "chrome", "80": "chrome", "81": "chrome", "86": "chrome", "87": "chrome", "84": "chrome", "85": "chrome", "797": "internetexplorer", "796": "internetexplorer", "795": "internetexplorer", "794": "internetexplorer", "793": "internetexplorer", "792": "internetexplorer", "791": "internetexplorer", "790": "internetexplorer", "749": "chrome", "799": "internetexplorer", "798": "internetexplorer", "7": "chrome", "170": "chrome", "586": "chrome", "587": "chrome", "584": "chrome", "585": "chrome", "582": "chrome", "583": "chrome", "580": "chrome", "581": "chrome", "588": "chrome", "589": "chrome", "245": "chrome", "244": "chrome", "247": "chrome", "246": "chrome", "241": "chrome", "614": "chrome", "243": "chrome", "242": "chrome", "615": "chrome", "249": "chrome", "248": "chrome", "418": "chrome", "419": "chrome", "519": "chrome", "518": "chrome", "511": "chrome", "510": "chrome", "513": "chrome", "512": "chrome", "515": "chrome", "514": "chrome", "517": "chrome", "516": "chrome", "623": "chrome", "622": "chrome", "621": "chrome", "620": "chrome", "627": "chrome", "626": "chrome", "625": "chrome", "624": "chrome", "450": "chrome", "451": "chrome", "629": "chrome", "628": "chrome", "454": "chrome", "455": "chrome", "456": "chrome", "457": "chrome", "179": "chrome", "178": "chrome", "177": "chrome", "199": "chrome", "175": "chrome", "174": "chrome", "173": "chrome", "172": "chrome", "171": "chrome", "198": "chrome", "977": "opera", "182": "chrome", "975": "opera", "974": "opera", "973": "opera", "972": "opera", "971": "opera", "970": "opera", "180": "chrome", "979": "opera", "978": "opera", "656": "chrome", "599": "chrome", "654": "chrome", "181": "chrome", "186": "chrome", "187": "chrome", "184": "chrome", "185": "chrome", "652": "chrome", "188": "chrome", "189": "chrome", "658": "chrome", "653": "chrome", "650": "chrome", "651": "chrome", "11": "chrome", "10": "chrome", "13": "chrome", "12": "chrome", "15": "chrome", "14": "chrome", "17": "chrome", "16": "chrome", "19": "chrome", "18": "chrome", "863": "firefox", "862": "firefox", "865": "firefox", "864": "firefox", "867": "firefox", "866": "firefox", "354": "chrome", "659": "chrome", "44": "chrome", "883": "firefox", "882": "firefox", "881": "firefox", "880": "firefox", "887": "firefox", "886": "firefox", "885": "firefox", "884": "firefox", "889": "firefox", "888": "firefox", "116": "chrome", "45": "chrome", "657": "chrome", "355": "chrome", "322": "chrome", "323": "chrome", "320": "chrome", "321": "chrome", "326": "chrome", "327": "chrome", "324": "chrome", "325": "chrome", "328": "chrome", "329": "chrome", "562": "chrome", "201": "chrome", "200": "chrome", "203": "chrome", "202": "chrome", "205": "chrome", "204": "chrome", "207": "chrome", "206": "chrome", "209": "chrome", "208": "chrome", "779": "internetexplorer", "778": "internetexplorer", "77": "chrome", "76": "chrome", "75": "chrome", "74": "chrome", "73": "chrome", "72": "chrome", "71": "chrome", "70": "chrome", "655": "chrome", "567": "chrome", "79": "chrome", "78": "chrome", "359": "chrome", "358": "chrome", "669": "chrome", "668": "chrome", "667": "chrome", "666": "chrome", "665": "chrome", "664": "chrome", "663": "chrome", "662": "chrome", "661": "chrome", "660": "chrome", "215": "chrome", "692": "chrome", "693": "chrome", "690": "chrome", "691": "chrome", "696": "chrome", "697": "chrome", "694": "chrome", "695": "chrome", "698": "chrome", "699": "chrome", "542": "chrome", "543": "chrome", "540": "chrome", "541": "chrome", "546": "chrome", "547": "chrome", "544": "chrome", "545": "chrome", "8": "chrome", "548": "chrome", "549": "chrome", "598": "chrome", "869": "firefox", "868": "firefox", "120": "chrome", "121": "chrome", "122": "chrome", "123": "chrome", "124": "chrome", "125": "chrome", "126": "chrome", "127": "chrome", "128": "chrome", "2": "chrome", "219": "chrome", "176": "chrome", "214": "chrome", "563": "chrome", "928": "firefox", "929": "firefox", "416": "chrome", "417": "chrome", "410": "chrome", "411": "chrome", "412": "chrome", "413": "chrome", "920": "firefox", "498": "chrome", "922": "firefox", "923": "firefox", "924": "firefox", "925": "firefox", "926": "firefox", "927": "firefox", "319": "chrome", "318": "chrome", "313": "chrome", "312": "chrome", "311": "chrome", "310": "chrome", "317": "chrome", "316": "chrome", "315": "chrome", "314": "chrome", "921": "firefox", "496": "chrome", "832": "firefox", "833": "firefox", "830": "firefox", "831": "firefox", "836": "firefox", "837": "firefox", "834": "firefox", "835": "firefox", "838": "firefox", "839": "firefox", "3": "chrome", "368": "chrome", "369": "chrome", "366": "chrome", "367": "chrome", "364": "chrome", "365": "chrome", "362": "chrome", "363": "chrome", "360": "chrome", "361": "chrome", "218": "chrome", "380": "chrome", "861": "firefox", "382": "chrome", "383": "chrome", "384": "chrome", "385": "chrome", "386": "chrome", "387": "chrome", "388": "chrome", "389": "chrome", "784": "internetexplorer", "785": "internetexplorer", "786": "internetexplorer", "787": "internetexplorer", "780": "internetexplorer", "781": "internetexplorer", "782": "internetexplorer", "381": "chrome", "788": "internetexplorer", "789": "internetexplorer", "860": "firefox", "151": "chrome", "579": "chrome", "578": "chrome", "150": "chrome", "573": "chrome", "572": "chrome", "571": "chrome", "570": "chrome", "577": "chrome", "576": "chrome", "575": "chrome", "574": "chrome", "60": "chrome", "61": "chrome", "62": "chrome", "259": "chrome", "64": "chrome", "65": "chrome", "66": "chrome", "67": "chrome", "68": "chrome", "253": "chrome", "250": "chrome", "251": "chrome", "256": "chrome", "257": "chrome", "254": "chrome", "255": "chrome", "499": "chrome", "157": "chrome", "156": "chrome", "939": "safari", "731": "chrome", "730": "chrome", "733": "chrome", "938": "safari", "735": "chrome", "734": "chrome", "508": "chrome", "736": "chrome", "506": "chrome", "738": "chrome", "504": "chrome", "505": "chrome", "502": "chrome", "503": "chrome", "500": "chrome", "501": "chrome", "630": "chrome", "631": "chrome", "632": "chrome", "633": "chrome", "469": "chrome", "468": "chrome", "636": "chrome", "637": "chrome", "465": "chrome", "464": "chrome", "467": "chrome", "466": "chrome", "461": "chrome", "900": "firefox", "463": "chrome", "462": "chrome", "901": "firefox", "168": "chrome", "169": "chrome", "164": "chrome", "165": "chrome", "166": "chrome", "167": "chrome", "160": "chrome", "161": "chrome", "162": "chrome", "163": "chrome", "964": "safari", "965": "safari", "966": "safari", "967": "safari", "960": "safari", "961": "safari", "962": "safari", "963": "safari", "783": "internetexplorer", "968": "safari", "969": "opera", "936": "firefox", "935": "firefox", "934": "firefox", "908": "firefox", "909": "firefox", "722": "chrome", "426": "chrome", "878": "firefox", "879": "firefox", "876": "firefox", "877": "firefox", "874": "firefox", "875": "firefox", "872": "firefox", "873": "firefox", "870": "firefox", "871": "firefox", "9": "chrome", "890": "firefox", "891": "firefox", "892": "firefox", "893": "firefox", "894": "firefox", "647": "chrome", "896": "firefox", "897": "firefox", "898": "firefox", "899": "firefox", "646": "chrome", "649": "chrome", "648": "chrome", "357": "chrome", "356": "chrome", "809": "internetexplorer", "808": "internetexplorer", "353": "chrome", "352": "chrome", "351": "chrome", "350": "chrome", "803": "internetexplorer", "802": "internetexplorer", "801": "internetexplorer", "800": "internetexplorer", "807": "internetexplorer", "806": "internetexplorer", "805": "internetexplorer", "804": "internetexplorer", "216": "chrome", "217": "chrome", "768": "chrome", "769": "chrome", "212": "chrome", "213": "chrome", "210": "chrome", "211": "chrome", "762": "chrome", "763": "chrome", "760": "chrome", "761": "chrome", "766": "chrome", "767": "chrome", "764": "chrome", "765": "chrome", "40": "chrome", "41": "chrome", "289": "chrome", "288": "chrome", "4": "chrome", "281": "chrome", "280": "chrome", "283": "chrome", "282": "chrome", "285": "chrome", "284": "chrome", "287": "chrome", "286": "chrome", "678": "chrome", "679": "chrome", "674": "chrome", "675": "chrome", "676": "chrome", "677": "chrome", "670": "chrome", "671": "chrome", "672": "chrome", "673": "chrome", "263": "chrome", "262": "chrome", "261": "chrome", "260": "chrome", "267": "chrome", "266": "chrome", "265": "chrome", "264": "chrome", "269": "chrome", "268": "chrome", "59": "chrome", "58": "chrome", "55": "chrome", "54": "chrome", "57": "chrome", "56": "chrome", "51": "chrome", "258": "chrome", "53": "chrome", "52": "chrome", "537": "chrome", "536": "chrome", "535": "chrome", "63": "chrome", "533": "chrome", "532": "chrome", "531": "chrome", "530": "chrome", "152": "chrome", "539": "chrome", "538": "chrome", "775": "internetexplorer", "774": "internetexplorer", "982": "opera", "983": "opera", "980": "opera", "981": "opera", "777": "internetexplorer", "984": "opera", "50": "chrome", "115": "chrome", "252": "chrome", "117": "chrome", "776": "internetexplorer", "111": "chrome", "110": "chrome", "113": "chrome", "69": "chrome", "771": "chrome", "119": "chrome", "118": "chrome", "770": "chrome", "773": "internetexplorer", "772": "internetexplorer", "429": "chrome", "428": "chrome", "534": "chrome", "919": "firefox", "918": "firefox", "915": "firefox", "914": "firefox", "917": "firefox", "916": "firefox", "911": "firefox", "910": "firefox", "913": "firefox", "912": "firefox", "308": "chrome", "309": "chrome", "855": "firefox", "300": "chrome", "301": "chrome", "302": "chrome", "303": "chrome", "304": "chrome", "305": "chrome", "306": "chrome", "307": "chrome", "895": "firefox", "825": "firefox", "824": "firefox", "827": "firefox", "847": "firefox", "846": "firefox", "845": "firefox", "844": "firefox", "843": "firefox", "842": "firefox", "841": "firefox", "840": "firefox", "821": "firefox", "853": "firefox", "849": "firefox", "848": "firefox", "823": "firefox", "822": "firefox", "240": "chrome", "390": "chrome", "732": "chrome", "753": "chrome", "752": "chrome", "751": "chrome", "750": "chrome", "757": "chrome", "756": "chrome", "755": "chrome", "754": "chrome", "560": "chrome", "561": "chrome", "759": "chrome", "758": "chrome", "564": "chrome", "565": "chrome", "566": "chrome", "701": "chrome", "739": "chrome", "229": "chrome", "507": "chrome", "227": "chrome", "226": "chrome", "225": "chrome", "224": "chrome", "223": "chrome", "222": "chrome", "221": "chrome", "220": "chrome", "114": "chrome", "391": "chrome", "726": "chrome", "727": "chrome", "724": "chrome", "725": "chrome", "568": "chrome", "723": "chrome", "720": "chrome", "721": "chrome", "728": "chrome", "729": "chrome", "605": "chrome", "604": "chrome", "607": "chrome", "606": "chrome", "601": "chrome", "600": "chrome", "603": "chrome", "602": "chrome", "159": "chrome", "158": "chrome", "112": "chrome", "609": "chrome", "608": "chrome", "976": "opera", "634": "chrome", "399": "chrome", "635": "chrome", "959": "safari", "958": "safari", "398": "chrome", "48": "chrome", "49": "chrome", "951": "safari", "950": "safari", "953": "safari", "952": "safari", "42": "chrome", "954": "safari", "957": "safari", "956": "safari", "638": "chrome", "5": "chrome", "639": "chrome", "460": "chrome", "489": "chrome", "488": "chrome", "487": "chrome", "486": "chrome", "485": "chrome", "484": "chrome", "483": "chrome", "482": "chrome", "481": "chrome", "480": "chrome", "509": "chrome", "955": "safari", "472": "chrome", "473": "chrome", "470": "chrome", "471": "chrome", "476": "chrome", "477": "chrome", "474": "chrome", "475": "chrome", "478": "chrome", "479": "chrome" } } ================================================ FILE: 原创爬虫工具/zok/random_UA/ua_random.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 import os from fake_useragent import UserAgent class RandomUserAgentMiddleware(object): """ first to use location because it is the fastest """ def __init__(self): location = os.getcwd() + '/zok/random_UA/fake_useragent.json' self.agent = UserAgent(path=location) # 调用本地 ua池 # self.agent = UserAgent(verify_ssl=False) # self.agent = UserAgent(use_cache_server=False) @classmethod def from_crawler(cls, crawler): return cls() def process_request(self, request, spider): request.headers.setdefault('User-Agent', self.agent.random) ================================================ FILE: 原创爬虫工具/zok/repetition/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/5 Python: 3.7 ================================================ FILE: 原创爬虫工具/zok/repetition/update_cache.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 import redis import hashlib from zok.zok_config import REDIS_PORT, REDIS_DB_NAME, REDIS_HOST, REDIS_USER, REDIS_PASSWORD class CacheRedis(object): pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB_NAME, password=REDIS_PASSWORD, decode_responses=True) r = redis.Redis(connection_pool=pool) # 加上decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。 # 1. 根据储存数据取值判断是否存在 # 3. 不存在-已有数据: 需要更新 # 4. 不存在-无数据: 需要插入 # 5. 存在 直接跳过储存 # BUG 在redis数据库丢失的情况下【会全体重新录入】 @staticmethod def get_md5(data): md5 = hashlib.md5(data.encode('utf-8')).hexdigest() return md5 def redis_exists(self, member, md5): """ 验证hash是否存在, 有返回True,没有返回False :param member: 验证区域集合Key :param md5: 要储存的数据 :return: True or False """ print() if self.r.sismember(member, md5): return True else: return False def save_redis(self, member, md5): self.r.sadd(member, md5) ================================================ FILE: 原创爬虫工具/zok/save/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 ================================================ FILE: 原创爬虫工具/zok/save/to_mysql.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 import pymysql from zok.zok_config import * from zok.repetition.update_cache import CacheRedis class SaveToMysqlBase(object): """ mysql储存基类 新增语法 INSERT INTO 表名(city, county, district) VALUES ("%s","%s","%s") 更新语法 UPDATE 表名 SET mail = "playstation.com" WHERE user_name = "Peter" """ member = None # 不设置默认不开启 redis去重校验 conn = None cursor = None # 游标对象 redis = CacheRedis() def open_spider(self, spider): print('开始爬虫,链接数据库') self.conn = pymysql.Connect( host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD, db=MYSQL_DB_NAME, ) def process_item(self, item, spider): # 写sql语句 插数据,没有表的话要先在数据库创建 sql = self.get_sql(item) if self.member: sql_md5 = self.redis.get_md5(sql) if not self.redis.redis_exists(self.member, sql_md5): # 创建游标对象 self.cursor = self.conn.cursor() # 提交事务 try: self.cursor.execute(sql) self.conn.commit() self.redis.save_redis(self.member, sql_md5) # int(conn.insert_id()) # 最新插入行的主键ID,conn.insert_id()一定要在conn.commit()之前,否则会返回0 except Exception as e: print(e) print('异常回滚') self.conn.rollback() self.cursor.close() return item else: print('已有相同数据无需插入') else: # 创建游标对象 self.cursor = self.conn.cursor() # 提交事务 try: self.cursor.execute(sql) self.conn.commit() except Exception as e: print(e) print('异常回滚') self.conn.rollback() self.cursor.close() return item def close_spider(self, spider): print('爬虫结束, 关闭通道') self.conn.close() ================================================ FILE: 原创爬虫工具/zok/zok_config.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/5 Python: 3.7 from urllib import parse MONGODB_URL = 'mongodb://localhost:27017' REDIS_HOST = "localhost" REDIS_USER = "root" REDIS_PASSWORD = "" REDIS_DB_NAME = 0 REDIS_PORT = 6379 ================================================ FILE: 滑动验证码/【w3c】滑块验证/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-10 Python: 3.7 ================================================ FILE: 滑动验证码/【w3c】滑块验证/w3c.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-10 Python: 3.7 import requests import re import json from PIL import Image # 图像处理模块 from io import BytesIO # io 加载 class W3C: """ 滑块验证码识别与破解 w3c 网站滑块网址 https://www.w3cschool.cn/register """ def __init__(self): self.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', 'Host': 'www.w3cschool.cn' } self.local = 'https://www.w3cschool.cn' self.check = 'https://www.w3cschool.cn/dragcheck' self.session = requests.session() self.height = 58 # 碎片高 self.width = 13 # 碎片宽 def get_img(self): """获取页面滑块图片""" response = self.session.get('https://www.w3cschool.cn/register', headers=self.headers) results = re.findall(r'background-image: url\("(.*?)"\);', response.text) bg_img = self.local + results[0] # 背景图 hk_img = self.local + results[1] # 滑块图 # print(bg_img, hk_img) # 取 css css_list = re.findall(r'background-position:(.*?);">', response.text) # 缺口滑块 ret = self.session.get(hk_img) with open('hk.png', 'wb') as f: f.write(ret.content) # 图片对象 img_cha = self.split_img(bg_img, css_list) xy = None # 识别结果 for n in range(4): full_image = Image.open('img/'+str(n)+'.png') # 获取缺口位置 xy = self.get_distance(img_cha, full_image) if xy and xy > 0: break return xy def get_distance(self, bg_image, full_image): """ 计算滑块移动距离 :param bg_image: (Image) 有缺口的整图 :param full_image: (Image) 完整原图 :return: (Int)缺口离滑块的距离 """ # 滑块的初始位置 distance = 0 # 遍历像素点横坐标 for i in range(distance, full_image.size[0]): # 遍历像素点纵坐标 for j in range(full_image.size[1]): # 如果不是相同像素 if not self.is_pixel_equal(bg_image, full_image, i, j): # 返回此时横轴坐标就是滑块需要移动的距离 return i @staticmethod def is_pixel_equal(bg_image, full_image, x, y): """ 判断像素是否相同算法 :param bg_image: (Image)缺口图片 :param full_image: (Image)完整图片 :param x: (Int)位置x :param y: (Int)位置y :return: (Boolean)像素是否相同 """ # 获取缺口图片的像素点(按照RGB格式) bg_pixel = bg_image.load()[x, y] # 获取完整图片的像素点(按照RGB格式) full_pixel = full_image.load()[x, y] # 设置一个判定值,像素值之差超过判定值则认为该像素不相同 threshold = 1 # 可根据识别效果调整 # 判断像素的各个颜色之差,abs()用于取绝对值 if (abs(bg_pixel[0] - full_pixel[0] < threshold) and abs(bg_pixel[1] - full_pixel[1] < threshold) and abs( bg_pixel[2] - full_pixel[2] < threshold)): # 如果差值在判断值之内,返回是相同像素 return True else: # 如果差值在判断值之外,返回不是相同像素 return False def split_img(self, bg_img, css_list): """图片还原""" # 背景 ret = self.session.get(bg_img) bytes_io = BytesIO() bytes_io.write(ret.content) img = Image.open(bytes_io) img_cha = Image.open('chache.png') img.save('bg.png') # 记录一下原始图片 for index, i in enumerate(css_list): x, y = [abs(int(xy[:-2])) for xy in i.split(' ')] # 将 css 坐标抽离出来 box = [x, y, x + self.width, y + self.height] im_crop = img.crop(box) if index < 20: # 第一行 img_cha.paste(im_crop, (index*self.width, 0)) else: # 第二行 img_cha.paste(im_crop, ((index-20)*self.width, self.height)) img_cha.save('chache.png') # 储存 return img_cha def check_code(self): """滑块认证""" point = self.get_img() if point: print('\033[1;34m识别成功: 缺口位置 x: %s \033[0m' % point) print('\033[1;36m提交数据中...\033[0m') result = self.session.post(self.check, data={'point': point}, headers=self.headers) print(json.loads(result.text).get('message')) else: print('滑块识别失败。。运气不佳。。重试即可。') if __name__ == '__main__': wc = W3C() wc.check_code() ================================================ FILE: 滑动验证码/【腾讯】滑块验证/discriminate.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-11 Python: 3.7 """ pip3 install opencv-python """ import cv2 as cv def get_pos(image): """ 缺口轮廓检测 对付腾讯滑块够用 该方法识别率 95% 左右 """ blurred = cv.GaussianBlur(image, (5, 5), 0) canny = cv.Canny(blurred, 200, 400) contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) for i, contour in enumerate(contours): m = cv.moments(contour) if m['m00'] == 0: cx = cy = 0 else: cx, cy = m['m10'] / m['m00'], m['m01'] / m['m00'] if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390: if cx < 400: continue x, y, w, h = cv.boundingRect(contour) # 外接矩形 cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2) cv.imshow('image', image) return x return 0 if __name__ == '__main__': """ 这里是滑块缺口识别 识别到后 1。可以通过自动化工具取拖动滑块 2。可以通过参数解析的形式生成参数提交通过验证 """ img0 = cv.imread('bg.jpeg') get_pos(img0) cv.waitKey(0) cv.destroyAllWindows() ================================================ FILE: 滑动验证码/【腾讯】滑块验证/sel.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-10-28 Python: 3.7 import requests import time import cv2 as cv import random from selenium.webdriver import ActionChains from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 显性等待 from selenium.webdriver.common.by import By class TX: def __init__(self): # 初始化 profile = webdriver.FirefoxOptions() # 配置无头 profile.add_argument('-headless') self.browser = webdriver.Firefox() wait = WebDriverWait(self.browser, 10) self.api_url = '' def end(self): self.browser.quit() def tx_code(self): """这里需要访问,带有滑动验证码的页面,然后会获取滑块对其进行滑动""" WebDriverWait(self.browser, 20, 0.5).until(EC.presence_of_element_located((By.ID, 'tcaptcha_iframe'))) # 等待 iframe self.browser.switch_to.frame(self.browser.find_element_by_id('tcaptcha_iframe')) # 加载 iframe time.sleep(0.5) bk_block = self.browser.find_element_by_xpath('//img[@id="slideBg"]').get_attribute('src') print(bk_block) if self.save_img(bk_block): dex = self.get_pos() track_list = self.get_track(dex) time.sleep(0.5) slid_ing = self.browser.find_element_by_xpath('//div[@id="tcaptcha_drag_thumb"]') # 滑块定位 ActionChains(self.browser).click_and_hold(on_element=slid_ing).perform() # 鼠标按下 time.sleep(0.2) print('轨迹', track_list) for track in track_list: ActionChains(self.browser).move_by_offset(xoffset=track, yoffset=0).perform() # 鼠标移动到距离当前位置(x,y) time.sleep(1) ActionChains(self.browser).release(on_element=slid_ing).perform() # print('第三步,释放鼠标') time.sleep(1) # 识别图片 return True else: print('缺口图片捕获失败') return False @staticmethod def save_img(bk_block): """保存图片""" try: img = requests.get(bk_block).content with open('bg.jpeg', 'wb') as f: f.write(img) return True except: return False @staticmethod def get_pos(): """识别缺口 注意:网页上显示的图片为缩放图片,缩放 50% 所以识别坐标需要 0.5 """ image = cv.imread('bg.jpeg') blurred = cv.GaussianBlur(image, (5, 5), 0) canny = cv.Canny(blurred, 200, 400) contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) for i, contour in enumerate(contours): m = cv.moments(contour) if m['m00'] == 0: cx = cy = 0 else: cx, cy = m['m10'] / m['m00'], m['m01'] / m['m00'] if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390: if cx < 400: continue x, y, w, h = cv.boundingRect(contour) # 外接矩形 cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2) # cv.imshow('image', image) # 显示识别结果 print('【缺口识别】 {x}px'.format(x=x/2)) return x/2 return 0 @staticmethod def get_track(distance): """模拟轨迹 """ distance -= 37 # 初始位置 # 初速度 v = 0 # 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移 t = 0.2 # 位移/轨迹列表,列表内的一个元素代表0.2s的位移 tracks = [] # 当前的位移 current = 0 # 到达mid值开始减速 mid = distance * 7 / 8 distance += 10 # 先滑过一点,最后再反着滑动回来 # a = random.randint(1,3) while current < distance: if current < mid: # 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细 a = random.randint(2, 4) # 加速运动 else: a = -random.randint(3, 5) # 减速运动 # 初速度 v0 = v # 0.2秒时间内的位移 s = v0 * t + 0.5 * a * (t ** 2) # 当前的位置 current += s # 添加到轨迹列表 tracks.append(round(s)) # 速度已经达到v,该速度作为下次的初速度 v = v0 + a * t # 反着滑动到大概准确位置 for i in range(4): tracks.append(-random.randint(2, 3)) for i in range(4): tracks.append(-random.randint(1, 3)) return tracks def move_to(self, index): """滑动滑块""" pass def re_start(self): self.tx_code() self.end() if __name__ == '__main__': """ 请在 tx_code 中访问含有 腾讯滑块的页面,然后会对其自动滑动 """ xbt = TX() xbt.re_start() ================================================ FILE: 项目/HouseScrapy/requirements ================================================ scrapy scrapy-redis pymysql redis>=3.2.1 pymongo ================================================ FILE: 项目/HouseScrapy/scrapy.cfg ================================================ # Automatically created by: scrapy startproject # # For more information about the [deploy] section see: # https://scrapyd.readthedocs.io/en/latest/deploy.html [settings] default = settings [deploy] #url = http://localhost:6800/ project = HouseScrapy ================================================ FILE: 项目/HouseScrapy/settings.py ================================================ # -*- coding: utf-8 -*- # 阿布云代理 IP PROXY_USER = '' PROXY_PASS = '' BOT_NAME = 'HouseScrapy' SPIDER_MODULES = ['spiders'] NEWSPIDER_MODULE = 'spiders' # 否认协议 ROBOTSTXT_OBEY = False # 随机延迟 RANDOMIZE_DOWNLOAD_DELAY = True # 重试处理 DOWNLOAD_FAIL_ON_DATALOSS = False # 设置超时时间 DOWNLOAD_TIMEOUT = 5 # MongoDB MONGODB_URL = 'mongodb://localhost:27017' MONGODB_DB = '房产' MONGODB_COLL = '地产数据' # Redis REDIS_HOST = '127.0.0.1' # 本机 REDIS_WORD = None REDIS_PORT = 6379 # 限流 秒/次 DOWNLOAD_DELAY = 1 / 10 # 禁止301 # HTTPERROR_ALLOWED_CODES = [301] # 日志配置 # LOG_LEVEL = 'WARNING' # LOG_FILE = 'log/error_log.txt' # Headers DEFAULT_REQUEST_HEADERS = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Host': 'www.funi.com' } """项目独立配置区""" # HOST HOST = 'http://www.funi.com' """===== 分布式配置区 =====""" # # 去重,利用set指纹去重 # DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' # # # 调度器 # SCHEDULER = 'scrapy_redis.scheduler.Scheduler' # # # 去重指纹的set # SCHEDULER_PERSIST = True # # # 配置密码 # REDIS_PARAMS = { # 'password': REDIS_WORD, # } # # ================================================ FILE: 项目/HouseScrapy/spiders/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-15 Python: 3.7 ================================================ FILE: 项目/HouseScrapy/spiders/house.py ================================================ # -*- coding: utf-8 -*- import scrapy from settings import HOST from toolkits.items import HousesItem class HouseSpider(scrapy.Spider): name = 'house' start_urls = ['http://www.funi.com/loupan/region_0_0_0_0_1'] target_url = 'http://www.funi.com/loupan/region_0_0_0_0_{page}' custom_settings = { 'ITEM_PIPELINES': { 'toolkits.pipelines.HousePipeline': 300, }, 'DOWNLOADER_MIDDLEWARES': { 'toolkits.proxies.ProxyMiddleware': 15, # Proxy 'toolkits.make_ua.RandomUserAgentMiddleware': 20, # random UA }, } def parse(self, response): """取总页数 """ total_page = response.xpath('//*[@class="fleft"]/div[3]/a[9]/text()').extract_first() try: for page in range(1, int(total_page)): url = self.target_url.format(page=page) yield scrapy.Request(url, callback=self.parse_url) except Exception: print('获取页数失败') def parse_url(self, response): """获取房产链接 """ # 获取并清洗链接 a_list = response.xpath('//*[@class="fleft"]/div[2]/dl/dt/a') # 访问楼盘 for a in a_list: href = a.xpath('./@href').extract_first() title = a.xpath('./@title').extract_first() url = HOST + href[:href.find(';')] if ';' in href else HOST + href # 获取基础信息 yield scrapy.Request(url + '/detail.htm', callback=self.parse_base, meta={'name': title, 'base_url': url}) def parse_base(self, response): """解析楼盘基础信息 """ dls = response.xpath('//*[@class="intro"]/dl') if len(dls) == 2: key_base = dls[0].xpath('./dd/ul/li/span/text()').extract() values_base = [node.strip() for node in dls[0].xpath('./dd/ul/li/em/text()').extract()] key_info = dls[1].xpath('./dd/ul/li/span/text()').extract() values_info = dls[1].xpath('./dd/ul/li/em/text()').extract() # 数据压缩 data = dict(dict(zip(key_base, values_base)), **dict(zip(key_info, values_info))) # 提取传输数据 data['楼盘名'] = response.meta.get('name') base_url = response.meta.get('base_url') # 获取 最新动态 yield scrapy.Request(base_url + '/news.htm', callback=self.parse_news, meta={'base_url': base_url, 'data': data}) def parse_news(self, response): """解析新闻 """ dls = response.xpath('//*[@class="tml_main"]/dl') news = [] for dl in dls: number = dl.xpath('./dd/div/div[1]/b/i/text()').extract_first() ps = dl.xpath('./dd/div/div[2]/p') strong_info = dl.xpath('./dd/div/div[2]/p[1]/em/text()').extract() # 预售 new_info = dl.xpath('./dd/div/div[2]/ul/li/text()').extract() # 最新动态 # 组装数据 info = {'商品房预售许可证': number} # 数组清洗 for node in strong_info: # 预售信息 _str = node.split(':') if len(_str) == 2: info[_str[0]] = _str[1] for node in new_info: # 预售资质 _str = node.split(':') if len(_str) == 2: info[_str[0]] = _str[1] for index, p in enumerate(ps): # 户数 n = p.xpath('./text()').extract_first() if index == 1 or not n: continue _str = n.split(':') if len(_str) == 2: info[_str[0]] = _str[1] news.append(info) # 组装数据 data = response.meta.get('data') data['最新动态'] = news base_url = response.meta.get('base_url') yield scrapy.Request(base_url, callback=self.parse_info, meta={'base_url': base_url, 'data': data}) def parse_info(self, response): """小区基础数据 """ address = response.xpath('//*[@class="pro_info"]/p[2]/i/text()').extract_first() # 楼盘地址 company = response.xpath('//*[@class="pro_info"]/p[3]/i/text()').extract_first() # 开发商 tags = response.xpath('//*[@class="pro_info"]/p[4]/span/text()').extract() # 标签 phone = response.xpath('//*[@class="pro_info"]/p[5]/b/text()').extract_first() # 售楼部电话 open_time = response.xpath('//*[@class="pro_info"]/p[6]/i/text()').extract_first() # 开盘时间 house_type = response.xpath('//*[@class="pro_info"]/p[7]/i/text()').extract_first() # 建筑类型 number = response.xpath('//*[@class="pro_info"]/p[8]/i/text()').extract_first() # 规划用户 expense = response.xpath('//*[@class="pro_info"]/p[8]/i[2]/text()').extract_first() # 物管费 expense = expense.strip() if expense else '' phone = phone.strip() if phone else '' data = response.meta.get('data') data['楼盘地址'] = address data['开发商'] = company data['特色'] = tags data['售楼电话'] = phone data['开盘时间'] = open_time data['建筑类型'] = house_type data['规划户数'] = number data['物管费'] = expense data['网址'] = response.meta.get('base_url') item = HousesItem() item['data'] = data yield item ================================================ FILE: 项目/HouseScrapy/toolkits/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-15 Python: 3.7 ================================================ FILE: 项目/HouseScrapy/toolkits/fake_useragent.json ================================================ { "browsers": { "chrome": ["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36", "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36", "Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36", "Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", "Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14"], "opera": ["Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16", "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14", "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14", "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02", "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00", "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00", "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00", "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00", "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0", "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52", "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51", "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50", "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50", "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11", "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11", "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11", "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10", "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10", "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1", "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01", "Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01", "Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01", "Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01", "Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01", "Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01", "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00", "Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00", "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00"], "firefox": ["Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1", "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0", "Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0", "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0", "Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0", "Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0", "Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0", "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0", "Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1", "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0", "Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0", "Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0", "Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0", "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6"], "internetexplorer": ["Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko", "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko", "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)", "Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)", "Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)", "Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", "Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)", "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; FunWebProducts)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.1; SV1; .NET CLR 2.8.52393; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)"], "safari": ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A", "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10", "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1", "Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27", "Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"] }, "randomize": { "344": "chrome", "819": "firefox", "346": "chrome", "347": "chrome", "340": "chrome", "341": "chrome", "342": "chrome", "343": "chrome", "810": "internetexplorer", "811": "internetexplorer", "812": "internetexplorer", "813": "firefox", "348": "chrome", "349": "chrome", "816": "firefox", "817": "firefox", "737": "chrome", "719": "chrome", "718": "chrome", "717": "chrome", "716": "chrome", "715": "chrome", "714": "chrome", "713": "chrome", "712": "chrome", "711": "chrome", "710": "chrome", "421": "chrome", "129": "chrome", "420": "chrome", "423": "chrome", "422": "chrome", "425": "chrome", "619": "chrome", "424": "chrome", "427": "chrome", "298": "chrome", "299": "chrome", "296": "chrome", "297": "chrome", "294": "chrome", "295": "chrome", "292": "chrome", "293": "chrome", "290": "chrome", "291": "chrome", "591": "chrome", "590": "chrome", "593": "chrome", "592": "chrome", "595": "chrome", "594": "chrome", "597": "chrome", "596": "chrome", "195": "chrome", "194": "chrome", "197": "chrome", "196": "chrome", "191": "chrome", "190": "chrome", "193": "chrome", "192": "chrome", "270": "chrome", "271": "chrome", "272": "chrome", "273": "chrome", "274": "chrome", "275": "chrome", "276": "chrome", "277": "chrome", "278": "chrome", "279": "chrome", "569": "chrome", "497": "chrome", "524": "chrome", "525": "chrome", "526": "chrome", "527": "chrome", "520": "chrome", "521": "chrome", "522": "chrome", "523": "chrome", "528": "chrome", "529": "chrome", "449": "chrome", "448": "chrome", "345": "chrome", "443": "chrome", "442": "chrome", "441": "chrome", "440": "chrome", "447": "chrome", "446": "chrome", "445": "chrome", "444": "chrome", "47": "chrome", "108": "chrome", "109": "chrome", "102": "chrome", "103": "chrome", "100": "chrome", "101": "chrome", "106": "chrome", "107": "chrome", "104": "chrome", "105": "chrome", "902": "firefox", "903": "firefox", "39": "chrome", "38": "chrome", "906": "firefox", "907": "firefox", "904": "firefox", "905": "firefox", "33": "chrome", "32": "chrome", "31": "chrome", "30": "chrome", "37": "chrome", "36": "chrome", "35": "chrome", "34": "chrome", "641": "chrome", "640": "chrome", "643": "chrome", "642": "chrome", "645": "chrome", "644": "chrome", "438": "chrome", "439": "chrome", "436": "chrome", "437": "chrome", "434": "chrome", "435": "chrome", "432": "chrome", "433": "chrome", "430": "chrome", "431": "chrome", "826": "firefox", "339": "chrome", "338": "chrome", "335": "chrome", "334": "chrome", "337": "chrome", "336": "chrome", "331": "chrome", "330": "chrome", "333": "chrome", "332": "chrome", "559": "chrome", "745": "chrome", "854": "firefox", "818": "firefox", "856": "firefox", "857": "firefox", "850": "firefox", "851": "firefox", "852": "firefox", "0": "chrome", "858": "firefox", "859": "firefox", "748": "chrome", "6": "chrome", "43": "chrome", "99": "chrome", "98": "chrome", "91": "chrome", "90": "chrome", "93": "chrome", "92": "chrome", "95": "chrome", "94": "chrome", "97": "chrome", "96": "chrome", "814": "firefox", "815": "firefox", "153": "chrome", "740": "chrome", "741": "chrome", "742": "chrome", "743": "chrome", "744": "chrome", "558": "chrome", "746": "chrome", "747": "chrome", "555": "chrome", "554": "chrome", "557": "chrome", "556": "chrome", "551": "chrome", "550": "chrome", "553": "chrome", "552": "chrome", "238": "chrome", "239": "chrome", "234": "chrome", "235": "chrome", "236": "chrome", "237": "chrome", "230": "chrome", "231": "chrome", "232": "chrome", "233": "chrome", "1": "chrome", "155": "chrome", "146": "chrome", "147": "chrome", "618": "chrome", "145": "chrome", "142": "chrome", "143": "chrome", "140": "chrome", "141": "chrome", "612": "chrome", "613": "chrome", "610": "chrome", "611": "chrome", "616": "chrome", "617": "chrome", "148": "chrome", "149": "chrome", "46": "chrome", "154": "chrome", "948": "safari", "949": "safari", "946": "safari", "947": "safari", "944": "safari", "945": "safari", "942": "safari", "943": "safari", "940": "safari", "941": "safari", "689": "chrome", "688": "chrome", "685": "chrome", "684": "chrome", "687": "chrome", "686": "chrome", "681": "chrome", "680": "chrome", "683": "chrome", "682": "chrome", "458": "chrome", "459": "chrome", "133": "chrome", "132": "chrome", "131": "chrome", "130": "chrome", "137": "chrome", "136": "chrome", "135": "chrome", "134": "chrome", "494": "chrome", "495": "chrome", "139": "chrome", "138": "chrome", "490": "chrome", "491": "chrome", "492": "chrome", "493": "chrome", "24": "chrome", "25": "chrome", "26": "chrome", "27": "chrome", "20": "chrome", "21": "chrome", "22": "chrome", "23": "chrome", "28": "chrome", "29": "chrome", "820": "firefox", "407": "chrome", "406": "chrome", "405": "chrome", "404": "chrome", "403": "chrome", "402": "chrome", "401": "chrome", "400": "chrome", "933": "firefox", "932": "firefox", "931": "firefox", "930": "firefox", "937": "safari", "452": "chrome", "409": "chrome", "408": "chrome", "453": "chrome", "414": "chrome", "183": "chrome", "415": "chrome", "379": "chrome", "378": "chrome", "228": "chrome", "829": "firefox", "828": "firefox", "371": "chrome", "370": "chrome", "373": "chrome", "372": "chrome", "375": "chrome", "374": "chrome", "377": "chrome", "376": "chrome", "708": "chrome", "709": "chrome", "704": "chrome", "705": "chrome", "706": "chrome", "707": "chrome", "700": "chrome", "144": "chrome", "702": "chrome", "703": "chrome", "393": "chrome", "392": "chrome", "88": "chrome", "89": "chrome", "397": "chrome", "396": "chrome", "395": "chrome", "394": "chrome", "82": "chrome", "83": "chrome", "80": "chrome", "81": "chrome", "86": "chrome", "87": "chrome", "84": "chrome", "85": "chrome", "797": "internetexplorer", "796": "internetexplorer", "795": "internetexplorer", "794": "internetexplorer", "793": "internetexplorer", "792": "internetexplorer", "791": "internetexplorer", "790": "internetexplorer", "749": "chrome", "799": "internetexplorer", "798": "internetexplorer", "7": "chrome", "170": "chrome", "586": "chrome", "587": "chrome", "584": "chrome", "585": "chrome", "582": "chrome", "583": "chrome", "580": "chrome", "581": "chrome", "588": "chrome", "589": "chrome", "245": "chrome", "244": "chrome", "247": "chrome", "246": "chrome", "241": "chrome", "614": "chrome", "243": "chrome", "242": "chrome", "615": "chrome", "249": "chrome", "248": "chrome", "418": "chrome", "419": "chrome", "519": "chrome", "518": "chrome", "511": "chrome", "510": "chrome", "513": "chrome", "512": "chrome", "515": "chrome", "514": "chrome", "517": "chrome", "516": "chrome", "623": "chrome", "622": "chrome", "621": "chrome", "620": "chrome", "627": "chrome", "626": "chrome", "625": "chrome", "624": "chrome", "450": "chrome", "451": "chrome", "629": "chrome", "628": "chrome", "454": "chrome", "455": "chrome", "456": "chrome", "457": "chrome", "179": "chrome", "178": "chrome", "177": "chrome", "199": "chrome", "175": "chrome", "174": "chrome", "173": "chrome", "172": "chrome", "171": "chrome", "198": "chrome", "977": "opera", "182": "chrome", "975": "opera", "974": "opera", "973": "opera", "972": "opera", "971": "opera", "970": "opera", "180": "chrome", "979": "opera", "978": "opera", "656": "chrome", "599": "chrome", "654": "chrome", "181": "chrome", "186": "chrome", "187": "chrome", "184": "chrome", "185": "chrome", "652": "chrome", "188": "chrome", "189": "chrome", "658": "chrome", "653": "chrome", "650": "chrome", "651": "chrome", "11": "chrome", "10": "chrome", "13": "chrome", "12": "chrome", "15": "chrome", "14": "chrome", "17": "chrome", "16": "chrome", "19": "chrome", "18": "chrome", "863": "firefox", "862": "firefox", "865": "firefox", "864": "firefox", "867": "firefox", "866": "firefox", "354": "chrome", "659": "chrome", "44": "chrome", "883": "firefox", "882": "firefox", "881": "firefox", "880": "firefox", "887": "firefox", "886": "firefox", "885": "firefox", "884": "firefox", "889": "firefox", "888": "firefox", "116": "chrome", "45": "chrome", "657": "chrome", "355": "chrome", "322": "chrome", "323": "chrome", "320": "chrome", "321": "chrome", "326": "chrome", "327": "chrome", "324": "chrome", "325": "chrome", "328": "chrome", "329": "chrome", "562": "chrome", "201": "chrome", "200": "chrome", "203": "chrome", "202": "chrome", "205": "chrome", "204": "chrome", "207": "chrome", "206": "chrome", "209": "chrome", "208": "chrome", "779": "internetexplorer", "778": "internetexplorer", "77": "chrome", "76": "chrome", "75": "chrome", "74": "chrome", "73": "chrome", "72": "chrome", "71": "chrome", "70": "chrome", "655": "chrome", "567": "chrome", "79": "chrome", "78": "chrome", "359": "chrome", "358": "chrome", "669": "chrome", "668": "chrome", "667": "chrome", "666": "chrome", "665": "chrome", "664": "chrome", "663": "chrome", "662": "chrome", "661": "chrome", "660": "chrome", "215": "chrome", "692": "chrome", "693": "chrome", "690": "chrome", "691": "chrome", "696": "chrome", "697": "chrome", "694": "chrome", "695": "chrome", "698": "chrome", "699": "chrome", "542": "chrome", "543": "chrome", "540": "chrome", "541": "chrome", "546": "chrome", "547": "chrome", "544": "chrome", "545": "chrome", "8": "chrome", "548": "chrome", "549": "chrome", "598": "chrome", "869": "firefox", "868": "firefox", "120": "chrome", "121": "chrome", "122": "chrome", "123": "chrome", "124": "chrome", "125": "chrome", "126": "chrome", "127": "chrome", "128": "chrome", "2": "chrome", "219": "chrome", "176": "chrome", "214": "chrome", "563": "chrome", "928": "firefox", "929": "firefox", "416": "chrome", "417": "chrome", "410": "chrome", "411": "chrome", "412": "chrome", "413": "chrome", "920": "firefox", "498": "chrome", "922": "firefox", "923": "firefox", "924": "firefox", "925": "firefox", "926": "firefox", "927": "firefox", "319": "chrome", "318": "chrome", "313": "chrome", "312": "chrome", "311": "chrome", "310": "chrome", "317": "chrome", "316": "chrome", "315": "chrome", "314": "chrome", "921": "firefox", "496": "chrome", "832": "firefox", "833": "firefox", "830": "firefox", "831": "firefox", "836": "firefox", "837": "firefox", "834": "firefox", "835": "firefox", "838": "firefox", "839": "firefox", "3": "chrome", "368": "chrome", "369": "chrome", "366": "chrome", "367": "chrome", "364": "chrome", "365": "chrome", "362": "chrome", "363": "chrome", "360": "chrome", "361": "chrome", "218": "chrome", "380": "chrome", "861": "firefox", "382": "chrome", "383": "chrome", "384": "chrome", "385": "chrome", "386": "chrome", "387": "chrome", "388": "chrome", "389": "chrome", "784": "internetexplorer", "785": "internetexplorer", "786": "internetexplorer", "787": "internetexplorer", "780": "internetexplorer", "781": "internetexplorer", "782": "internetexplorer", "381": "chrome", "788": "internetexplorer", "789": "internetexplorer", "860": "firefox", "151": "chrome", "579": "chrome", "578": "chrome", "150": "chrome", "573": "chrome", "572": "chrome", "571": "chrome", "570": "chrome", "577": "chrome", "576": "chrome", "575": "chrome", "574": "chrome", "60": "chrome", "61": "chrome", "62": "chrome", "259": "chrome", "64": "chrome", "65": "chrome", "66": "chrome", "67": "chrome", "68": "chrome", "253": "chrome", "250": "chrome", "251": "chrome", "256": "chrome", "257": "chrome", "254": "chrome", "255": "chrome", "499": "chrome", "157": "chrome", "156": "chrome", "939": "safari", "731": "chrome", "730": "chrome", "733": "chrome", "938": "safari", "735": "chrome", "734": "chrome", "508": "chrome", "736": "chrome", "506": "chrome", "738": "chrome", "504": "chrome", "505": "chrome", "502": "chrome", "503": "chrome", "500": "chrome", "501": "chrome", "630": "chrome", "631": "chrome", "632": "chrome", "633": "chrome", "469": "chrome", "468": "chrome", "636": "chrome", "637": "chrome", "465": "chrome", "464": "chrome", "467": "chrome", "466": "chrome", "461": "chrome", "900": "firefox", "463": "chrome", "462": "chrome", "901": "firefox", "168": "chrome", "169": "chrome", "164": "chrome", "165": "chrome", "166": "chrome", "167": "chrome", "160": "chrome", "161": "chrome", "162": "chrome", "163": "chrome", "964": "safari", "965": "safari", "966": "safari", "967": "safari", "960": "safari", "961": "safari", "962": "safari", "963": "safari", "783": "internetexplorer", "968": "safari", "969": "opera", "936": "firefox", "935": "firefox", "934": "firefox", "908": "firefox", "909": "firefox", "722": "chrome", "426": "chrome", "878": "firefox", "879": "firefox", "876": "firefox", "877": "firefox", "874": "firefox", "875": "firefox", "872": "firefox", "873": "firefox", "870": "firefox", "871": "firefox", "9": "chrome", "890": "firefox", "891": "firefox", "892": "firefox", "893": "firefox", "894": "firefox", "647": "chrome", "896": "firefox", "897": "firefox", "898": "firefox", "899": "firefox", "646": "chrome", "649": "chrome", "648": "chrome", "357": "chrome", "356": "chrome", "809": "internetexplorer", "808": "internetexplorer", "353": "chrome", "352": "chrome", "351": "chrome", "350": "chrome", "803": "internetexplorer", "802": "internetexplorer", "801": "internetexplorer", "800": "internetexplorer", "807": "internetexplorer", "806": "internetexplorer", "805": "internetexplorer", "804": "internetexplorer", "216": "chrome", "217": "chrome", "768": "chrome", "769": "chrome", "212": "chrome", "213": "chrome", "210": "chrome", "211": "chrome", "762": "chrome", "763": "chrome", "760": "chrome", "761": "chrome", "766": "chrome", "767": "chrome", "764": "chrome", "765": "chrome", "40": "chrome", "41": "chrome", "289": "chrome", "288": "chrome", "4": "chrome", "281": "chrome", "280": "chrome", "283": "chrome", "282": "chrome", "285": "chrome", "284": "chrome", "287": "chrome", "286": "chrome", "678": "chrome", "679": "chrome", "674": "chrome", "675": "chrome", "676": "chrome", "677": "chrome", "670": "chrome", "671": "chrome", "672": "chrome", "673": "chrome", "263": "chrome", "262": "chrome", "261": "chrome", "260": "chrome", "267": "chrome", "266": "chrome", "265": "chrome", "264": "chrome", "269": "chrome", "268": "chrome", "59": "chrome", "58": "chrome", "55": "chrome", "54": "chrome", "57": "chrome", "56": "chrome", "51": "chrome", "258": "chrome", "53": "chrome", "52": "chrome", "537": "chrome", "536": "chrome", "535": "chrome", "63": "chrome", "533": "chrome", "532": "chrome", "531": "chrome", "530": "chrome", "152": "chrome", "539": "chrome", "538": "chrome", "775": "internetexplorer", "774": "internetexplorer", "982": "opera", "983": "opera", "980": "opera", "981": "opera", "777": "internetexplorer", "984": "opera", "50": "chrome", "115": "chrome", "252": "chrome", "117": "chrome", "776": "internetexplorer", "111": "chrome", "110": "chrome", "113": "chrome", "69": "chrome", "771": "chrome", "119": "chrome", "118": "chrome", "770": "chrome", "773": "internetexplorer", "772": "internetexplorer", "429": "chrome", "428": "chrome", "534": "chrome", "919": "firefox", "918": "firefox", "915": "firefox", "914": "firefox", "917": "firefox", "916": "firefox", "911": "firefox", "910": "firefox", "913": "firefox", "912": "firefox", "308": "chrome", "309": "chrome", "855": "firefox", "300": "chrome", "301": "chrome", "302": "chrome", "303": "chrome", "304": "chrome", "305": "chrome", "306": "chrome", "307": "chrome", "895": "firefox", "825": "firefox", "824": "firefox", "827": "firefox", "847": "firefox", "846": "firefox", "845": "firefox", "844": "firefox", "843": "firefox", "842": "firefox", "841": "firefox", "840": "firefox", "821": "firefox", "853": "firefox", "849": "firefox", "848": "firefox", "823": "firefox", "822": "firefox", "240": "chrome", "390": "chrome", "732": "chrome", "753": "chrome", "752": "chrome", "751": "chrome", "750": "chrome", "757": "chrome", "756": "chrome", "755": "chrome", "754": "chrome", "560": "chrome", "561": "chrome", "759": "chrome", "758": "chrome", "564": "chrome", "565": "chrome", "566": "chrome", "701": "chrome", "739": "chrome", "229": "chrome", "507": "chrome", "227": "chrome", "226": "chrome", "225": "chrome", "224": "chrome", "223": "chrome", "222": "chrome", "221": "chrome", "220": "chrome", "114": "chrome", "391": "chrome", "726": "chrome", "727": "chrome", "724": "chrome", "725": "chrome", "568": "chrome", "723": "chrome", "720": "chrome", "721": "chrome", "728": "chrome", "729": "chrome", "605": "chrome", "604": "chrome", "607": "chrome", "606": "chrome", "601": "chrome", "600": "chrome", "603": "chrome", "602": "chrome", "159": "chrome", "158": "chrome", "112": "chrome", "609": "chrome", "608": "chrome", "976": "opera", "634": "chrome", "399": "chrome", "635": "chrome", "959": "safari", "958": "safari", "398": "chrome", "48": "chrome", "49": "chrome", "951": "safari", "950": "safari", "953": "safari", "952": "safari", "42": "chrome", "954": "safari", "957": "safari", "956": "safari", "638": "chrome", "5": "chrome", "639": "chrome", "460": "chrome", "489": "chrome", "488": "chrome", "487": "chrome", "486": "chrome", "485": "chrome", "484": "chrome", "483": "chrome", "482": "chrome", "481": "chrome", "480": "chrome", "509": "chrome", "955": "safari", "472": "chrome", "473": "chrome", "470": "chrome", "471": "chrome", "476": "chrome", "477": "chrome", "474": "chrome", "475": "chrome", "478": "chrome", "479": "chrome" } } ================================================ FILE: 项目/HouseScrapy/toolkits/items.py ================================================ # -*- coding: utf-8 -*- import scrapy class HousesItem(scrapy.Item): data = scrapy.Field() ================================================ FILE: 项目/HouseScrapy/toolkits/make_ua.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/7 Python: 3.7 import os from fake_useragent import UserAgent class RandomUserAgentMiddleware(object): """ first to use location because it is the fastest """ def __init__(self): location = os.getcwd() + '/toolkits/fake_useragent.json' self.agent = UserAgent(path=location) # self.agent = UserAgent(verify_ssl=False) # self.agent = UserAgent(use_cache_server=False) @classmethod def from_crawler(cls, crawler): return cls() def process_request(self, request, spider): request.headers.setdefault('User-Agent', self.agent.random) ================================================ FILE: 项目/HouseScrapy/toolkits/middlewares.py ================================================ # -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in: # https://doc.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals class HousescrapySpiderMiddleware(object): # Not all methods need to be defined. If a method is not defined, # scrapy acts as if the spider middleware does not modify the # passed objects. @classmethod def from_crawler(cls, crawler): # This method is used by Scrapy to create your spiders. s = cls() crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) return s def process_spider_input(self, response, spider): # Called for each response that goes through the spider # middleware and into the spider. # Should return None or raise an exception. return None def process_spider_output(self, response, result, spider): # Called with the results returned from the Spider, after # it has processed the response. # Must return an iterable of Request, dict or Item objects. for i in result: yield i def process_spider_exception(self, response, exception, spider): # Called when a spider or process_spider_input() method # (from other spider middleware) raises an exception. # Should return either None or an iterable of Response, dict # or Item objects. pass def process_start_requests(self, start_requests, spider): # Called with the start requests of the spider, and works # similarly to the process_spider_output() method, except # that it doesn’t have a response associated. # Must return only requests (not items). for r in start_requests: yield r def spider_opened(self, spider): spider.logger.info('Spider opened: %s' % spider.name) class HousescrapyDownloaderMiddleware(object): # Not all methods need to be defined. If a method is not defined, # scrapy acts as if the downloader middleware does not modify the # passed objects. @classmethod def from_crawler(cls, crawler): # This method is used by Scrapy to create your spiders. s = cls() crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) return s def process_request(self, request, spider): # Called for each request that goes through the downloader # middleware. # Must either: # - return None: continue processing this request # - or return a Response object # - or return a Request object # - or raise IgnoreRequest: process_exception() methods of # installed downloader middleware will be called return None def process_response(self, request, response, spider): # Called with the response returned from the downloader. # Must either; # - return a Response object # - return a Request object # - or raise IgnoreRequest return response def process_exception(self, request, exception, spider): # Called when a download handler or a process_request() # (from other downloader middleware) raises an exception. # Must either: # - return None: continue processing this exception # - return a Response object: stops process_exception() chain # - return a Request object: stops process_exception() chain pass def spider_opened(self, spider): spider.logger.info('Spider opened: %s' % spider.name) ================================================ FILE: 项目/HouseScrapy/toolkits/pipelines.py ================================================ # -*- coding: utf-8 -*- from pymongo import MongoClient from bson.objectid import ObjectId from settings import MONGODB_URL, MONGODB_DB, MONGODB_COLL class HousePipeline(object): """地产基础数据 """ def __init__(self): client = MongoClient(MONGODB_URL) self.coll = client[MONGODB_DB][MONGODB_COLL] # 地产链接 def process_item(self, item, spider): self.coll.insert_one(item['data']) ================================================ FILE: 项目/HouseScrapy/toolkits/proxies.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" # Date: 2019/3/5 Python: 3.7 import base64 from settings import PROXY_USER, PROXY_PASS # 代理服务器 proxyServer = "http://http-dyn.abuyun.com:9020" proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((PROXY_USER + ":" + PROXY_PASS), "ascii")).decode("utf8") class ProxyMiddleware(object): """自定义中间件代理IP""" def process_request(self, request, spider): request.meta["proxy"] = proxyServer request.headers["Proxy-Authorization"] = proxyAuth ================================================ FILE: 项目/HouseSpider/README.md ================================================ # 目前项目还在抽空更新中 > 慢慢填坑 # 概述 > 对 `www.funi.com` 网站进行数据爬取 ================================================ FILE: 项目/HouseSpider/config.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-12 Python: 3.7 # Redis REDIS_HOST = '127.0.0.1' REDIS_PORT = '6379' REDIS_PASSWORD = None # MongoDB MONGO_CLEAN = 'mongodb://localhost:27017' # TargetUrl TARGET_URL = "http://www.funi.com/loupan/region_0_0_0_0_{page}" # ProxyIP PROXY_USER = "" PROXY_PASS = "" # HOST HOST = 'http://www.funi.com' ================================================ FILE: 项目/HouseSpider/db/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-12 Python: 3.7 ================================================ FILE: 项目/HouseSpider/main.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-12 Python: 3.7 import asyncio from tool.parse import * from tool.toolkit import * async def get_max_page(): """获取总页数 """ url = TARGET_URL.format(page=1) result = await get(url) return await parse_total_page(result) async def get_house_url(page): """获取地产链接 """ url = TARGET_URL.format(page=page) result = await get(url) await parse_house_url(result, page) @count_time def main(): loop = asyncio.get_event_loop() # 1. 获取总页数 task = loop.create_task(get_max_page()) total_page = loop.run_until_complete(task) # 2. 获取链接 house_url_func = [asyncio.ensure_future(get_house_url(_)) for _ in range(1, int(total_page))] loop.run_until_complete(asyncio.wait(house_url_func)) # 3. 楼盘详情 if __name__ == '__main__': main() ================================================ FILE: 项目/HouseSpider/tool/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-12 Python: 3.7 ================================================ FILE: 项目/HouseSpider/tool/parse.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-12 Python: 3.7 from pyquery import PyQuery as pq from config import * async def parse_total_page(result): """解析总页数 """ doc = pq(result) max_page = doc('.pages a').eq(-2).text() print('数据总: {total} 页'.format(total=max_page)) return max_page async def parse_house_url(result, page): """页面解析链接 """ doc = pq(result) dls = doc('.fleft div').eq(-2)('dl') n = 0 for dl in dls: href = pq(dl)('dt a').attr('href') href = HOST + href[: href.find(';')] # 清洗链接 print(href) n += 1 if not n: print('第 {page} 抽取链接失败'.format(page=page)) ================================================ FILE: 项目/HouseSpider/tool/proxy.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-12 Python: 3.7 from config import PROXY_PASS, PROXY_USER # 代理服务器 proxyHost = "http-dyn.abuyun.com" proxyPort = "9020" proxyServer = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % { "host": proxyHost, "port": proxyPort, "user": PROXY_USER, "pass": PROXY_PASS, } if not PROXY_USER or not PROXY_PASS: msg = """ 请先在 config.py 配置文件内填入代理IP账号 阿布云代理IP:https://www.abuyun.com/http-proxy/products.html """ print(msg) exit() ================================================ FILE: 项目/HouseSpider/tool/toolkit.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-07-13 Python: 3.7 import datetime import aiohttp from tool.proxy import proxyServer async def get(url): """请求页面 """ headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Host': 'www.funi.com' } try: """conn = aiohttp.TCPConnector(verify_ssl=False) connector=conn""" async with aiohttp.ClientSession(headers=headers) as session: async with session.get(url, proxy=proxyServer) as response: return await response.text("utf-8") except TimeoutError as te: print('超时', te) def count_time(func): """取运行时间 """ def int_time(*args, **kwargs): start_time = datetime.datetime.now() # 程序开始时间 func() over_time = datetime.datetime.now() # 程序结束时间 total_time = (over_time-start_time).total_seconds() print('程序耗时: %s 秒' % total_time) return int_time ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/__init__.py ================================================ ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/items.py ================================================ # -*- coding: utf-8 -*- import scrapy class AreaItem(scrapy.Item): """地区""" type = scrapy.Field() id = scrapy.Field() pid = scrapy.Field() name = scrapy.Field() pinyin = scrapy.Field() first = scrapy.Field() haschild = scrapy.Field() class CoordItem(scrapy.Item): """坐标录入""" type = scrapy.Field() id = scrapy.Field() lng = scrapy.Field() lat = scrapy.Field() ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/middlewares.py ================================================ # -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in: # https://doc.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals class MeituanareaSpiderMiddleware(object): # Not all methods need to be defined. If a method is not defined, # scrapy acts as if the spider middleware does not modify the # passed objects. @classmethod def from_crawler(cls, crawler): # This method is used by Scrapy to create your spiders. s = cls() crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) return s def process_spider_input(self, response, spider): # Called for each response that goes through the spider # middleware and into the spider. # Should return None or raise an exception. return None def process_spider_output(self, response, result, spider): # Called with the results returned from the Spider, after # it has processed the response. # Must return an iterable of Request, dict or Item objects. for i in result: yield i def process_spider_exception(self, response, exception, spider): # Called when a spider or process_spider_input() method # (from other spider middleware) raises an exception. # Should return either None or an iterable of Response, dict # or Item objects. pass def process_start_requests(self, start_requests, spider): # Called with the start requests of the spider, and works # similarly to the process_spider_output() method, except # that it doesn’t have a response associated. # Must return only requests (not items). for r in start_requests: yield r def spider_opened(self, spider): spider.logger.info('Spider opened: %s' % spider.name) class MeituanareaDownloaderMiddleware(object): # Not all methods need to be defined. If a method is not defined, # scrapy acts as if the downloader middleware does not modify the # passed objects. @classmethod def from_crawler(cls, crawler): # This method is used by Scrapy to create your spiders. s = cls() crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) return s def process_request(self, request, spider): # Called for each request that goes through the downloader # middleware. # Must either: # - return None: continue processing this request # - or return a Response object # - or return a Request object # - or raise IgnoreRequest: process_exception() methods of # installed downloader middleware will be called return None def process_response(self, request, response, spider): # Called with the response returned from the downloader. # Must either; # - return a Response object # - return a Request object # - or raise IgnoreRequest return response def process_exception(self, request, exception, spider): # Called when a download handler or a process_request() # (from other downloader middleware) raises an exception. # Must either: # - return None: continue processing this exception # - return a Response object: stops process_exception() chain # - return a Request object: stops process_exception() chain pass def spider_opened(self, spider): spider.logger.info('Spider opened: %s' % spider.name) ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/pipelines.py ================================================ # -*- coding: utf-8 -*- import pymysql from MeiTuanArea.settings import MYSQL_DB_NAME, MYSQL_HOST, MYSQL_PASSWORD, MYSQL_PORT, MYSQL_USER class AreaPipeline(object): """区域采集""" conn = None cursor = None # 游标对象 def open_spider(self, spider): print('开始爬虫,链接数据库') self.conn = pymysql.Connect( host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD, db=MYSQL_DB_NAME, ) def process_item(self, item, spider): sql = None if item['type'] == 'province': # 一级 省市 sql = """INSERT INTO province(id, `name`, pinyin, `first`) VALUES ("{id}","{name}","{pinyin}","{first}") """.format( id=int(item['id']), name=item['name'], pinyin=item['pinyin'], first=item['first'], ) elif item['type'] == 'city': # 二级 市 sql = """INSERT INTO city(id,pid, `name`, pinyin, `first`) VALUES ("{id}","{pid}","{name}","{pinyin}","{first}") """.format( id=int(item['id']), pid=int(item['pid']), name=item['name'], pinyin=item['pinyin'], first=item['first'], ) elif item['type'] == 'area': # 三级 区域 sql = """INSERT INTO area(id,pid, `name`, pinyin, `first`, haschild) VALUES ("{id}","{pid}","{name}","{pinyin}","{first}","{haschild}") """.format( id=int(item['id']), pid=int(item['pid']), name=item['name'], pinyin=item['pinyin'], first=item['first'], haschild=item['haschild'], ) elif item['type'] == 'address': # 四季 地区 sql = """INSERT INTO address(id,pid, `name`, pinyin, `first`) VALUES ("{id}","{pid}","{name}","{pinyin}","{first}") """.format( id=int(item['id']), pid=int(item['pid']), name=item['name'], pinyin=item['pinyin'], first=item['first'], ) # 创建游标对象 self.cursor = self.conn.cursor() # 提交事务 try: self.cursor.execute(sql) self.conn.commit() except Exception as e: print(e) print('异常回滚') self.conn.rollback() self.cursor.close() return item def close_spider(self, spider): print('爬虫结束, 关闭通道') self.conn.close() class CoordPipeline(object): """坐标采集更新""" conn = None cursor = None # 游标对象 def open_spider(self, spider): print('开始爬虫,链接数据库') self.conn = pymysql.Connect( host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD, db=MYSQL_DB_NAME, ) def process_item(self, item, spider): sql = None if item['type'] == 'province': # 一级 省市 sql = """UPDATE province SET lng={lng}, lat={lat} where id={id}""".format( id=int(item['id']), lng=item['lng'], lat=item['lat'], ) elif item['type'] == 'city': # 二级 市 sql = """UPDATE city SET lng={lng}, lat={lat} where id={id}""".format( id=int(item['id']), lng=item['lng'], lat=item['lat'], ) elif item['type'] == 'area': # 三级 区域 sql = """UPDATE area SET lng={lng}, lat={lat} where id={id}""".format( id=int(item['id']), lng=item['lng'], lat=item['lat'], ) elif item['type'] == 'address': # 四季 地区 sql = """UPDATE address SET lng={lng}, lat={lat} where id={id}""".format( id=int(item['id']), lng=item['lng'], lat=item['lat'], ) # 创建游标对象 self.cursor = self.conn.cursor() # 提交事务 try: self.cursor.execute(sql) self.conn.commit() except Exception as e: print(e) print('异常回滚') self.conn.rollback() self.cursor.close() return item def close_spider(self, spider): print('爬虫结束, 关闭通道') self.conn.close() ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/settings.py ================================================ # -*- coding: utf-8 -*- BOT_NAME = 'MeiTuanArea' # 爬虫项目名 SPIDER_MODULES = ['MeiTuanArea.spiders'] # 爬虫目录设定 NEWSPIDER_MODULE = 'MeiTuanArea.spiders' # 爬虫生成目录 ROBOTSTXT_OBEY = False # 否认协议 RANDOMIZE_DOWNLOAD_DELAY = True # 开启随机增加毫秒级延迟,增加访问成功率 DOWNLOAD_FAIL_ON_DATALOSS = False # 重试处理 DOWNLOAD_TIMEOUT = 5 # 设置超时时间,避免ip失效等待时间过长 # HTTPERROR_ALLOWED_CODES = [301] # 禁止301 # 指定终端输出日志、日志位置 # LOG_LEVEL = 'WARNING' # LOG_FILE = 'error_log.txt' HTTPERROR_ALLOWED_CODES = [403] # UA 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' # mysql MYSQL_HOST = '127.0.0.1' MYSQL_PORT = 3306 MYSQL_USER = 'root' MYSQL_PASSWORD = 'mysql 密码' MYSQL_DB_NAME = 'mysql库' # API 百度地图坐标获取API,申请后填写即可 API_AK = '百度地图 api ak' ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/spiders/__init__.py ================================================ # This package will contain the spiders of your Scrapy project # # Please refer to the documentation for information on how to create and manage # your spiders. ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/spiders/area_coord.py ================================================ # -*- coding: utf-8 -*- import scrapy import pymysql import json from MeiTuanArea.settings import API_AK from MeiTuanArea.settings import MYSQL_DB_NAME, MYSQL_HOST, MYSQL_PASSWORD, MYSQL_PORT, MYSQL_USER from MeiTuanArea.items import CoordItem class GetLngSpider(scrapy.Spider): name = 'area_coord' # 独立配置 custom_settings = { 'ITEM_PIPELINES': { 'MeiTuanArea.pipelines.CoordPipeline': 300, }, } # mysql 配置 conn = pymysql.Connect( host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD, db=MYSQL_DB_NAME, ) url = 'http://api.map.baidu.com/geocoder/v2/?address={address}&output=json&ak={ak}' def start_requests(self): # 一级区域 省市 provinces = self.get_db("""SELECT id,`name` from province""") for _id, name in provinces: target_url = self.url.format(address=name, ak=API_AK) yield scrapy.Request(target_url, meta={'type': 'province', '_id': _id}) # 二级区域 城市 city = self.get_db("""SELECT id,`name` from city""") for _id, name in city: target_url = self.url.format(address=name, ak=API_AK) yield scrapy.Request(target_url, meta={'type': 'city', '_id': _id}) # 三级区域 区域 area = self.get_db("""select area.id, city.name, area.name from city LEFT JOIN area on city.id=area.pid""") for _id, name, address_name in area: address = str(name)+str(address_name) target_url = self.url.format(address=address, ak=API_AK) yield scrapy.Request(target_url, meta={'type': 'area', '_id': i[0]}) # 四级区域 街道 address = self.get_db("""select address.id,area.name, address.name from area LEFT JOIN address on address.pid=area.id""") for _id, name, address_name in address: target_url = self.url.format(address=str(name)+str(address_name), ak=API_AK) yield scrapy.Request(target_url, meta={'type': 'address', '_id': _id}) def get_db(self, sql): """数据库查询""" # 创建游标对象 cursor = self.conn.cursor() # 提交事务 try: cursor.execute(sql) data = cursor.fetchall() cursor.close() self.conn.close() return data except Exception as e: print('异常回滚') self.conn.rollback() cursor.close() self.conn.close() return None def parse(self, response): """清洗数据""" item = CoordItem() data = json.loads(response.text) # 处理字符串 把闲杂符号去掉 if data.get('status') == 0: # 坐标 item['lng'] = data.get('result').get('location').get('lng') item['lat'] = data.get('result').get('location').get('lat') item['id'] = response.meta.get('_id') item['type'] = response.meta.get('type') yield item ================================================ FILE: 项目/MeiTuanArea/MeiTuanArea/spiders/areas.py ================================================ # -*- coding: utf-8 -*- import scrapy import json import re from pypinyin import pinyin, lazy_pinyin from MeiTuanArea.items import AreaItem class GetAreaSpider(scrapy.Spider): name = 'areas' # 独立配置 custom_settings = { 'ITEM_PIPELINES': { 'MeiTuanArea.pipelines.AreaPipeline': 300, }, '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', 'DOWNLOAD_DELAY': 0.5, # 限流 下载同一个网站下一个页面前需要等待的时间 } def start_requests(self): start_url = 'https://www.meituan.com/ptapi/getprovincecityinfo/' yield scrapy.Request(start_url, callback=self.parse_province) def parse_province(self, response): """省市+市 1、2 级区域采集""" target_url = 'http://{acronym}.meituan.com/meishi/' item = AreaItem() data = json.loads(response.text) for node in data: name = node.get('provinceName') item['type'] = 'province' item['haschild'] = 1 item['id'] = node.get('provinceCode') item['pid'] = 0 item['name'] = name item['pinyin'] = ''.join(lazy_pinyin(name)) item['first'] = self.get_acronym(name) yield item # 一级省市 for i in node.get('cityInfoList'): item['type'] = 'city' item['id'] = i.get('id') item['pid'] = node.get('provinceCode') item['name'] = i.get('name') item['pinyin'] = i.get('pinyin') item['first'] = i.get('acronym') yield item # 二级市 url = target_url.format(acronym=i.get('acronym')) yield scrapy.Request(url, callback=self.parse_area, meta={'pid': i.get('id')}) def parse_area(self, response): """区域+街道 2、3 级区域采集""" info, areas = re.search(r',"areas":(.*?),"dinnerCountsAttr', response.text), None if info: areas = json.loads(info.group(1)) if areas: city_id = response.meta.get('pid') item = AreaItem() # 解析区域 3 级 for area in areas: item['type'] = 'area' item['id'] = area.get('id') item['pid'] = city_id item['name'] = area.get('name') item['pinyin'] = ''.join(lazy_pinyin(area.get('name'))) item['first'] = self.get_acronym(area.get('name')) subs = area.get('subAreas') # 判断是否有下级,有的区域么有下级了 if len(subs) > 1: item['haschild'] = 1 else: item['haschild'] = 0 yield item # 解析 4 级 if len(subs) > 1: for sub in subs: if not sub.get('name') == '全部': item['haschild'] = 0 item['type'] = 'address' item['id'] = sub.get('id') item['pid'] = area.get('id') item['name'] = sub.get('name') item['pinyin'] = ''.join(lazy_pinyin(sub.get('name'))) item['first'] = self.get_acronym(sub.get('name')) yield item else: print('区域读取失败') @staticmethod def get_acronym(str_data): """ 获取字符串的首字母 :param str_data: 字符串 :return: 字符串 """ return "".join([i[0][0] for i in pinyin(str_data)]) ================================================ FILE: 项目/MeiTuanArea/README.md ================================================ # 美团城市采集 > 因为全站爬取需要用到,区域基础数据。这里单独抽离出来。 ## 配置 在 settings 内配置 mysql 与 百度api_ak 即可 ## 数据库设计 > 因为最终数据将会用到Mysql上,区域一共有4个层级,分别是省市、市、区域、街道,这里按照业务需求拆分到4张表中。 ![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/区域表.png) ## 坐标拾取 > 通过百度API调用地址,获取坐标并存入库中 ## 效果 ![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/区域坐标.png) ================================================ FILE: 项目/MeiTuanArea/__init__.py ================================================ # -*- coding: utf-8 -*- # __author__ = "zok" 362416272@qq.com # Date: 2019-06-18 Python: 3.7 ================================================ FILE: 项目/MeiTuanArea/scrapy.cfg ================================================ # Automatically created by: scrapy startproject # # For more information about the [deploy] section see: # https://scrapyd.readthedocs.io/en/latest/deploy.html [settings] default = MeiTuanArea.settings [deploy] #url = http://localhost:6800/ project = MeiTuanArea ================================================ FILE: 项目/MeiTuanArea/初始化.sql ================================================ /* Navicat Premium Data Transfer Source Server : LocalhostMysql Source Server Type : MySQL Source Server Version : 50725 Source Host : localhost:3306 Source Schema : nujiang Target Server Type : MySQL Target Server Version : 50725 File Encoding : 65001 Date: 23/05/2019 16:32:56 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for address -- ---------------------------- DROP TABLE IF EXISTS `address`; CREATE TABLE `address` ( `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID', `pid` bigint(10) DEFAULT NULL COMMENT '父id', `name` varchar(100) DEFAULT NULL COMMENT '名称', `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音', `code` varchar(100) DEFAULT NULL COMMENT '长途区号', `zip` varchar(100) DEFAULT NULL COMMENT '邮编', `first` varchar(50) DEFAULT NULL COMMENT '首字母', `lng` varchar(100) DEFAULT NULL COMMENT '经度', `lat` varchar(100) DEFAULT NULL COMMENT '纬度', PRIMARY KEY (`id`) USING BTREE, KEY `pid` (`pid`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=3749 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='四级区域 地址'; -- ---------------------------- -- Table structure for area -- ---------------------------- DROP TABLE IF EXISTS `area`; CREATE TABLE `area` ( `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID', `pid` bigint(10) DEFAULT NULL COMMENT '父id', `name` varchar(100) DEFAULT NULL COMMENT '名称', `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音', `code` varchar(100) DEFAULT NULL COMMENT '长途区号', `zip` varchar(100) DEFAULT NULL COMMENT '邮编', `first` varchar(50) DEFAULT NULL COMMENT '首字母', `lng` varchar(100) DEFAULT NULL COMMENT '经度', `lat` varchar(100) DEFAULT NULL COMMENT '纬度', `haschild` int(1) DEFAULT NULL COMMENT '是否有下级', PRIMARY KEY (`id`) USING BTREE, KEY `pid` (`pid`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=39793 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='三级区域 区域'; -- ---------------------------- -- Table structure for city -- ---------------------------- DROP TABLE IF EXISTS `city`; CREATE TABLE `city` ( `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID', `pid` bigint(10) DEFAULT NULL COMMENT '父id', `name` varchar(100) DEFAULT NULL COMMENT '名称', `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音', `code` varchar(100) DEFAULT NULL COMMENT '长途区号', `zip` varchar(100) DEFAULT NULL COMMENT '邮编', `first` varchar(50) DEFAULT NULL COMMENT '首字母', `lng` varchar(100) DEFAULT NULL COMMENT '经度', `lat` varchar(100) DEFAULT NULL COMMENT '纬度', PRIMARY KEY (`id`) USING BTREE, KEY `pid` (`pid`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=8002 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='二级区域 城市'; -- ---------------------------- -- Table structure for province -- ---------------------------- DROP TABLE IF EXISTS `province`; CREATE TABLE `province` ( `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(100) DEFAULT NULL COMMENT '名称', `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音', `code` varchar(100) DEFAULT NULL COMMENT '长途区号', `zip` varchar(100) DEFAULT NULL COMMENT '邮编', `first` varchar(50) DEFAULT NULL COMMENT '首字母', `lng` varchar(100) DEFAULT NULL COMMENT '经度', `lat` varchar(100) DEFAULT NULL COMMENT '纬度', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=820001 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='一级区域 省市'; SET FOREIGN_KEY_CHECKS = 1; ================================================ FILE: 项目/README.md ================================================ # 该板块不定期更新 > 因为工作中会经常开发重型的爬虫,并且也属于公司的资源,所以并不会将代码放到网上。尽量以一些实战demo形式发布一些个人小项目。 ## MeiTuanArea 美团区域 Scrapy 爬虫 ## HoseSpider 房地产爬虫 aiohttp 爬虫