Full Code of wkunzhi/SpiderCrackDemo for AI

master 5188ca4056bb cached
226 files
1.5 MB
532.5k tokens
1416 symbols
1 requests
Download .txt
Showing preview only (1,641K chars total). Download the full file or copy to clipboard to get everything.
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
================================================
# <p align="center">Python3 爬虫实战</p>

<br>
<p align="center">
    <img src="https://zok-blog.oss-cn-hangzhou.aliyuncs.com/pythonlg.jpg" 
        alt="python3 spider">
</p>

<br />
<p align="center">
    <a href="#"><img src="https://img.shields.io/badge/status-updating-brightgreen.svg"></a>
    <a href="https://www.python.org/downloads/"><img src="https://zok-blog.oss-cn-hangzhou.aliyuncs.com/ico/python-3.7-green.svg"></a>
    <a href="https://github.com/wkunzhi/Python3-Spider/graphs/contributors"><img src="https://img.shields.io/github/contributors/wkunzhi/Python3-Spider?color=blue"></a>
    <a href="#"><img src="https://img.shields.io/badge/Branch-master-green.svg?longCache=true" alt="Branch"></a>
    <a href="#"><img src="https://img.shields.io/github/stars/wkunzhi/Python3-Spider.svg?label=Stars&style=social"></a>
    <a href="#"><img src="https://img.shields.io/github/forks/wkunzhi/Python3-Spider.svg?label=Forks&style=social"></a>

</p>
<br />


## 简介
包含几十个 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)


<br />




-------


## 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&degreefrom=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}&timestamp={timestamp}&region=&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+)</text>', 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('&#xe2cc;'))
    print(pf.parse_ttf('&#xed59;'))
    print(pf.parse_ttf('&#xe169;'))





================================================
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'<GlyphID id="(.*?)" name="(\d+)"/>', 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 <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
 */
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'<input type="hidden" name="_token" value="(.*?)">', 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 () {
	             *             // ...
	             *         }
	             *    
Download .txt
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
Download .txt
SYMBOL INDEX (1416 symbols across 131 files)

FILE: 【51Job】查岗位/select_job.py
  class GetJob (line 14) | class GetJob(object):
    method __init__ (line 16) | def __init__(self, job_name):
    method get_info (line 21) | def get_info(self):
    method parse (line 30) | def parse(root):

FILE: 【bilibili】自动登录/login.py
  class LoginBli (line 22) | class LoginBli:
    method __init__ (line 27) | def __init__(self, username, password):
    method open (line 46) | def open(self):
    method get_geetest_image (line 76) | def get_geetest_image(self):
    method is_pixel_similar (line 99) | def is_pixel_similar(self, image1, image2, x, y):
    method get_slice_gap (line 117) | def get_slice_gap(self, image1, image2):
    method get_track (line 144) | def get_track(self, distance):
    method move_to_gap (line 189) | def move_to_gap(self, slider, tracks):
    method get_geetest_button (line 207) | def get_geetest_button(self):
    method login_success (line 212) | def login_success(self):
    method login (line 232) | def login(self):

FILE: 【bilibili】视频下载/video_download.py
  class DownVideo (line 14) | class DownVideo(object):
    method __init__ (line 24) | def __init__(self,start_go):
    method get_cid_list (line 27) | def get_cid_list(self):
    method get_play_list (line 62) | def get_play_list(start_url, cid, quality):
    method schedule_cmd (line 79) | def schedule_cmd(self, blocknum, blocksize, totalsize):
    method schedule (line 94) | def schedule(self, blocknum, blocksize, totalsize):
    method format_size (line 112) | def format_size(bytes):
    method down_video (line 131) | def down_video(self, video_list, title, start_url, page):
    method combine_video (line 166) | def combine_video(video_list, title):

FILE: 【双色球】头奖分布/main.py
  class SSQ (line 13) | class SSQ:
    method __init__ (line 14) | def __init__(self, file, font):
    method history (line 25) | def history(self):
    method clean_data (line 36) | def clean_data(self, data):
    method save (line 68) | def save(self, df):
    method set_data (line 73) | def set_data(self, df):
    method parse_history (line 94) | def parse_history(self):

FILE: 【壁纸】美女壁纸下载器/bg_down.py
  class DownBg (line 14) | class DownBg:
    method __init__ (line 18) | def __init__(self):
    method down_load (line 23) | def down_load(self, file_url, file_full_name, now_photo_count, all_pho...
    method crawler_photo (line 43) | def crawler_photo(self, type_id, photo_count):

FILE: 【大众点评】字体反爬、坐标反爬/参数生成/encryp.js
  function make (line 1) | function make() {
  function test (line 6) | function test(love, you, babby) {
  function now_uu (line 27) | function now_uu() {
  function puid (line 30) | function puid() {

FILE: 【大众点评】字体反爬、坐标反爬/旧版/parse_address_poi.py
  function to_base36 (line 6) | def to_base36(value):
  function decode (line 29) | def decode(C):

FILE: 【大众点评】字体反爬、坐标反爬/旧版/parse_font_css.py
  class DianPing (line 10) | class DianPing(object):
    method __init__ (line 11) | def __init__(self):
    method parse_url (line 16) | def parse_url(url):
    method get_css (line 23) | def get_css(self, html):
    method get_css_offset (line 33) | def get_css_offset(content_css):
    method get_svg_url_dict (line 49) | def get_svg_url_dict(content_css):
    method parse_comment_css (line 58) | def parse_comment_css(self, svg_url, size, x_offset, y_offset):
    method get_comment_num (line 76) | def get_comment_num(self):

FILE: 【大众点评】字体反爬、坐标反爬/最新版7月/main.py
  class ParseFontClass (line 27) | class ParseFontClass:
    method __init__ (line 29) | def __init__(self, css_url, redis_host='127.0.0.1', redis_port=6379, r...
    method parse_ttf (line 48) | def parse_ttf(self, code):
    method add_hash (line 57) | def add_hash(self, name, json_data):
    method check_hash (line 62) | def check_hash(self, name):
    method get_ttf (line 67) | def get_ttf(self, css_url):
    method install_ttf (line 79) | def install_ttf(self, ttf_list):
    method get_ttf_urls (line 98) | def get_ttf_urls(text):
    method start (line 109) | def start(self):

FILE: 【抖音】无水印视频解析/parse.py
  class ParseVideo (line 10) | class ParseVideo:
    method __init__ (line 12) | def __init__(self, share):
    method get_url (line 22) | def get_url(share_url):
    method go_location (line 25) | def go_location(self):
    method go_message (line 32) | def go_message(self, ret):
    method start (line 74) | def start(self):

FILE: 【拼多多】登陆参数生成/PinDuoDuo.py
  class PingDuoDuoSpider (line 14) | class PingDuoDuoSpider(object):
    method __init__ (line 19) | def __init__(self, password):
    method make (line 24) | def make(self):

FILE: 【拼多多】登陆参数生成/encryp.js
  function n (line 9) | function n(t) {
  function r (line 13) | function r(t, e) {
  function o (line 17) | function o(t, e) {
  function i (line 21) | function i(t, e) {
  function a (line 25) | function a(t, e) {
  function s (line 29) | function s(t) {
  function c (line 45) | function c(t) {
  function f (line 54) | function f(t) {
  function p (line 67) | function p(t) {
  function t (line 206) | function t(t) {
  function w (line 251) | function w(t, e) {
  function t (line 256) | function t(e, n) {
  function t (line 394) | function t(t, e, n, r, o) {
  function t (line 614) | function t(t) {
  function t (line 647) | function t(t, e, n) {
  function t (line 1437) | function t() {}
  function t (line 1453) | function t(t) {
  function t (line 1476) | function t(t) {
  function t (line 1523) | function t(t) {
  function N (line 1564) | function N() {
  function j (line 1568) | function j(t, e) {
  function F (line 1619) | function F(t, e) {
  function U (line 1624) | function U(t) {
  function H (line 1630) | function H(t) {
  function t (line 1647) | function t() {
  function Q (line 1704) | function Q() {
  function t (line 1718) | function t() {}
  function t (line 1726) | function t() {
  function e (line 2581) | function e(n) {
  function n (line 2588) | function n() {
  function t (line 2724) | function t(t) {
  function test (line 2798) | function test(text){

FILE: 【文书】app查询接口/main.py
  class TripleDesUtils (line 13) | class TripleDesUtils:
    method encryption (line 15) | def encryption(self, data: str, key, iv) -> str:
    method decrypt (line 22) | def decrypt(self, data: str, key, iv) -> str:
    method _base64encode (line 30) | def _base64encode(data):
    method _base64decode (line 38) | def _base64decode(data):
  class WenShu (line 46) | class WenShu:
    method __init__ (line 48) | def __init__(self):
    method get_now_data (line 52) | def get_now_data():
    method random_key (line 58) | def random_key():
    method make_id (line 69) | def make_id():
    method make_cipher_text (line 74) | def make_cipher_text(self):
    method make_request (line 96) | def make_request(self):
    method to_index (line 118) | def to_index(self):
    method parse_html (line 149) | def parse_html(self, content, key, iv):

FILE: 【淘宝】自动登陆/auto_login_pyppeteer.py
  class LoginTaoBao (line 11) | class LoginTaoBao:
    method _injection_js (line 18) | async def _injection_js(self):
    method _init (line 24) | async def _init(self):
    method get_cookie (line 49) | async def get_cookie(self):
    method mouse_slider (line 59) | async def mouse_slider(self):
    method main (line 85) | async def main(self, username_, pwd_):

FILE: 【淘宝】自动登陆/login_for_sina.py
  class TB_Spider (line 11) | class TB_Spider:
    method __init__ (line 13) | def __init__(self, username, password):
    method run (line 31) | def run(self):

FILE: 其他实战/【5173网】自动登录/auto_login.py
  class YX (line 10) | class YX(object):
    method __init__ (line 15) | def __init__(self, user, pwd):
    method make_pwd (line 26) | def make_pwd(self, key):
    method make_data (line 31) | def make_data(self, token, key):
    method login (line 46) | def login(self):

FILE: 其他实战/【5173网】自动登录/encryp.js
  function hex_md5 (line 3) | function hex_md5(b) {
  function b64_md5 (line 7) | function b64_md5(b) {
  function str_md5 (line 11) | function str_md5(b) {
  function hex_hmac_md5 (line 15) | function hex_hmac_md5(b, a) {
  function b64_hmac_md5 (line 19) | function b64_hmac_md5(b, a) {
  function str_hmac_md5 (line 23) | function str_hmac_md5(b, a) {
  function md5_vm_test (line 27) | function md5_vm_test() {
  function core_md5 (line 31) | function core_md5(b, a) {
  function md5_cmn (line 114) | function md5_cmn(b, a, c, d, e, f) {
  function md5_ff (line 118) | function md5_ff(b, a, c, d, e, f, g) {
  function md5_gg (line 122) | function md5_gg(b, a, c, d, e, f, g) {
  function md5_hh (line 126) | function md5_hh(b, a, c, d, e, f, g) {
  function md5_ii (line 130) | function md5_ii(b, a, c, d, e, f, g) {
  function core_hmac_md5 (line 134) | function core_hmac_md5(b, a) {
  function safe_add (line 147) | function safe_add(b, a) {
  function bit_rol (line 152) | function bit_rol(b, a) {
  function str2binl (line 156) | function str2binl(b) {
  function binl2str (line 161) | function binl2str(b) {
  function binl2hex (line 166) | function binl2hex(b) {
  function binl2b64 (line 171) | function binl2b64(b) {
  function make_js (line 176) | function make_js(pwd, a) {

FILE: 其他实战/【9377网】自动登录/9377login.py
  class Login9377 (line 8) | class Login9377:
    method __init__ (line 12) | def __init__(self, username, password):
    method login (line 27) | def login(self):
    method check (line 41) | def check(self, result):

FILE: 其他实战/【DNS】自动登录/Login.py
  class DNS (line 9) | class DNS:
    method __init__ (line 10) | def __init__(self, user, pwd):
    method get_token (line 21) | def get_token(self):
    method read_js (line 29) | def read_js(self):
    method login (line 33) | def login(self):

FILE: 其他实战/【DNS】自动登录/dns.js
  function F (line 11) | function F() {}
  function parseLoop (line 846) | function parseLoop(base64Str, base64StrLength, reverseMap) {
  function FF (line 1058) | function FF(a, b, c, d, x, s, t) {
  function GG (line 1063) | function GG(a, b, c, d, x, s, t) {
  function HH (line 1068) | function HH(a, b, c, d, x, s, t) {
  function II (line 1073) | function II(a, b, c, d, x, s, t) {
  function isPrime (line 1258) | function isPrime(n) {
  function getFractionalBits (line 1269) | function getFractionalBits(n) {
  function swapEndian (line 1550) | function swapEndian(word) {
  function f1 (line 1802) | function f1(x, y, z) {
  function f2 (line 1807) | function f2(x, y, z) {
  function f3 (line 1811) | function f3(x, y, z) {
  function f4 (line 1815) | function f4(x, y, z) {
  function f5 (line 1819) | function f5(x, y, z) {
  function rotl (line 1824) | function rotl(x,n) {
  function X64Word_create (line 2894) | function X64Word_create() {
  function selectCipherStrategy (line 3428) | function selectCipherStrategy(key) {
  function xorBlock (line 3591) | function xorBlock(words, offset, blockSize) {
  function generateKeystreamAndEncrypt (line 4153) | function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
  function exchangeLR (line 5273) | function exchangeLR(offset, mask) {
  function exchangeRL (line 5279) | function exchangeRL(offset, mask) {
  function generateKeystreamWord (line 5390) | function generateKeystreamWord() {
  function incWord (line 5470) | function incWord(word)
  function incCounter (line 5514) | function incCounter(counter)
  function nextState (line 5674) | function nextState() {
  function nextState (line 5886) | function nextState() {
  function aes (line 5974) | function aes(val) {

FILE: 其他实战/【GitHub】自动登录/login.py
  class Login (line 13) | class Login(object):
    method __init__ (line 14) | def __init__(self, username, password):
    method login_GitHub (line 29) | def login_GitHub(self):
    method get_token (line 57) | def get_token(self):

FILE: 其他实战/【Glidedsky】自动登陆/login.py
  class Gli (line 10) | class Gli:
    method __init__ (line 16) | def __init__(self, user, pwd):
    method get_token (line 26) | def get_token(self):
    method login (line 31) | def login(self):

FILE: 其他实战/【Python加密库】Demo/encryption.py
  class UseAES (line 15) | class UseAES:
    method __init__ (line 25) | def __init__(self, key):
    method to_16 (line 31) | def to_16(key):
    method aes (line 42) | def aes(self):
    method encrypt (line 45) | def encrypt(self, text):
    method decode_bytes (line 50) | def decode_bytes(self, text):
  class UseRSA (line 56) | class UseRSA:
    method __init__ (line 65) | def __init__(self, number=1024):
    method encrypt (line 71) | def encrypt(self, _str):
    method decrypt (line 80) | def decrypt(self, text):
    method save_pem (line 90) | def save_pem(path_name, text):
    method read_pem (line 101) | def read_pem(self, path_name, key_type):
    method sign (line 113) | def sign(self, message, pr_key=None, hash_method='SHA-1'):
    method check_sign (line 125) | def check_sign(self, mess, result, pubkey=None):
  class UseDES (line 142) | class UseDES:
    method __init__ (line 152) | def __init__(self, key, iv):
    method encrypt (line 160) | def encrypt(self, text):
    method des_crypt (line 174) | def des_crypt(self, text):
  class UseDES3 (line 187) | class UseDES3:
    method __init__ (line 205) | def __init__(self, key):
    method encrypt (line 209) | def encrypt(self, text):
    method decrypt (line 223) | def decrypt(self, text):
  function use_md5 (line 230) | def use_md5(test):
  function use_hmac (line 238) | def use_hmac(key, text):
  function use_sha (line 247) | def use_sha(text):

FILE: 其他实战/【TCL金融】自动登录/auto_login.py
  class SpiderLogin (line 9) | class SpiderLogin:
    method __init__ (line 15) | def __init__(self, user, pwd):
    method load_js (line 23) | def load_js(self):
    method auto_login (line 29) | def auto_login(self):

FILE: 其他实战/【TCL金融】自动登录/encryp.js
  function make (line 412) | function make(pwd) {

FILE: 其他实战/【steam】自动登录/execute.js
  function BigInteger (line 47) | function BigInteger(a, b, c) {
  function nbi (line 55) | function nbi() {
  function am1 (line 67) | function am1(i, x, w, j, c, n) {
  function am2 (line 78) | function am2(i, x, w, j, c, n) {
  function am3 (line 93) | function am3(i, x, w, j, c, n) {
  function int2char (line 137) | function int2char(n) {
  function intAt (line 141) | function intAt(s, i) {
  function bnpCopyTo (line 147) | function bnpCopyTo(r) {
  function bnpFromInt (line 154) | function bnpFromInt(x) {
  function nbv (line 163) | function nbv(i) {
  function bnpFromString (line 170) | function bnpFromString(s, b) {
  function bnpClamp (line 213) | function bnpClamp() {
  function bnToString (line 219) | function bnToString(b) {
  function bnNegate (line 257) | function bnNegate() {
  function bnAbs (line 264) | function bnAbs() {
  function bnCompareTo (line 269) | function bnCompareTo(a) {
  function nbits (line 281) | function nbits(x) {
  function bnBitLength (line 308) | function bnBitLength() {
  function bnpDLShiftTo (line 314) | function bnpDLShiftTo(n, r) {
  function bnpDRShiftTo (line 323) | function bnpDRShiftTo(n, r) {
  function bnpLShiftTo (line 330) | function bnpLShiftTo(n, r) {
  function bnpRShiftTo (line 349) | function bnpRShiftTo(n, r) {
  function bnpSubTo (line 370) | function bnpSubTo(a, r) {
  function bnpMultiplyTo (line 405) | function bnpMultiplyTo(a, r) {
  function bnpSquareTo (line 418) | function bnpSquareTo(r) {
  function bnpDivRemTo (line 436) | function bnpDivRemTo(m, q, r) {
  function bnMod (line 495) | function bnMod(a) {
  function Classic (line 503) | function Classic(m) {
  function cConvert (line 507) | function cConvert(x) {
  function cRevert (line 512) | function cRevert(x) {
  function cReduce (line 516) | function cReduce(x) {
  function cMulTo (line 520) | function cMulTo(x, y, r) {
  function cSqrTo (line 525) | function cSqrTo(x, r) {
  function bnpInvDigit (line 546) | function bnpInvDigit() {
  function Montgomery (line 562) | function Montgomery(m) {
  function montConvert (line 572) | function montConvert(x) {
  function montRevert (line 581) | function montRevert(x) {
  function montReduce (line 589) | function montReduce(x) {
  function montSqrTo (line 611) | function montSqrTo(x, r) {
  function montMulTo (line 617) | function montMulTo(x, y, r) {
  function bnpIsEven (line 629) | function bnpIsEven() {
  function bnpExp (line 634) | function bnpExp(e, z) {
  function bnModPowInt (line 654) | function bnModPowInt(e, m) {
  function bnClone (line 699) | function bnClone() {
  function bnIntValue (line 706) | function bnIntValue() {
  function bnByteValue (line 717) | function bnByteValue() {
  function bnShortValue (line 722) | function bnShortValue() {
  function bnpChunkSize (line 727) | function bnpChunkSize(r) {
  function bnSigNum (line 732) | function bnSigNum() {
  function bnpToRadix (line 739) | function bnpToRadix(b) {
  function bnpFromRadix (line 757) | function bnpFromRadix(s, b) {
  function bnpFromNumber (line 787) | function bnpFromNumber(a, b, c) {
  function bnToByteArray (line 814) | function bnToByteArray() {
  function bnEquals (line 842) | function bnEquals(a) {
  function bnMin (line 846) | function bnMin(a) {
  function bnMax (line 850) | function bnMax(a) {
  function bnpBitwiseTo (line 855) | function bnpBitwiseTo(a, op, r) {
  function op_and (line 872) | function op_and(x, y) {
  function bnAnd (line 876) | function bnAnd(a) {
  function op_or (line 883) | function op_or(x, y) {
  function bnOr (line 887) | function bnOr(a) {
  function op_xor (line 894) | function op_xor(x, y) {
  function bnXor (line 898) | function bnXor(a) {
  function op_andnot (line 905) | function op_andnot(x, y) {
  function bnAndNot (line 909) | function bnAndNot(a) {
  function bnNot (line 916) | function bnNot() {
  function bnShiftLeft (line 925) | function bnShiftLeft(n) {
  function bnShiftRight (line 933) | function bnShiftRight(n) {
  function lbit (line 941) | function lbit(x) {
  function bnGetLowestSetBit (line 965) | function bnGetLowestSetBit() {
  function cbit (line 973) | function cbit(x) {
  function bnBitCount (line 983) | function bnBitCount() {
  function bnTestBit (line 991) | function bnTestBit(n) {
  function bnpChangeBit (line 998) | function bnpChangeBit(n, op) {
  function bnSetBit (line 1005) | function bnSetBit(n) {
  function bnClearBit (line 1010) | function bnClearBit(n) {
  function bnFlipBit (line 1015) | function bnFlipBit(n) {
  function bnpAddTo (line 1020) | function bnpAddTo(a, r) {
  function bnAdd (line 1054) | function bnAdd(a) {
  function bnSubtract (line 1061) | function bnSubtract(a) {
  function bnMultiply (line 1068) | function bnMultiply(a) {
  function bnDivide (line 1075) | function bnDivide(a) {
  function bnRemainder (line 1082) | function bnRemainder(a) {
  function bnDivideAndRemainder (line 1089) | function bnDivideAndRemainder(a) {
  function bnpDMultiply (line 1097) | function bnpDMultiply(n) {
  function bnpDAddOffset (line 1104) | function bnpDAddOffset(n, w) {
  function NullExp (line 1115) | function NullExp() {}
  function nNop (line 1117) | function nNop(x) {
  function nMulTo (line 1121) | function nMulTo(x, y, r) {
  function nSqrTo (line 1125) | function nSqrTo(x, r) {
  function bnPow (line 1135) | function bnPow(e) {
  function bnpMultiplyLowerTo (line 1141) | function bnpMultiplyLowerTo(a, n, r) {
  function bnpMultiplyUpperTo (line 1154) | function bnpMultiplyUpperTo(a, n, r) {
  function Barrett (line 1166) | function Barrett(m) {
  function barrettConvert (line 1175) | function barrettConvert(x) {
  function barrettRevert (line 1186) | function barrettRevert(x) {
  function barrettReduce (line 1191) | function barrettReduce(x) {
  function barrettSqrTo (line 1205) | function barrettSqrTo(x, r) {
  function barrettMulTo (line 1211) | function barrettMulTo(x, y, r) {
  function bnModPow (line 1223) | function bnModPow(e, m) {
  function bnGCD (line 1310) | function bnGCD(a) {
  function bnpModInt (line 1342) | function bnpModInt(n) {
  function bnModInverse (line 1354) | function bnModInverse(m) {
  function bnIsProbablePrime (line 1413) | function bnIsProbablePrime(t) {
  function bnpMillerRabin (line 1434) | function bnpMillerRabin(t) {
  function get_pwd (line 1629) | function get_pwd(pwd,publickey_mod,publickey_exp) {

FILE: 其他实战/【steam】自动登录/login.py
  function Get_parameters (line 9) | def Get_parameters(username):
  function main (line 36) | def main(pwd, publickey_mod, publickey_exp):

FILE: 其他实战/【万创帮】自动登录/encryp.js
  function c (line 1) | function c(x, c) {
  function a (line 81) | function a(q, c, a, x, s, t) {
  function h (line 85) | function h(c, h, g, d, x, s, t) {
  function g (line 89) | function g(c, h, g, d, x, s, t) {
  function v (line 93) | function v(c, h, g, d, x, s, t) {
  function A (line 97) | function A(c, h, g, d, x, s, t) {
  function _ (line 101) | function _(a, h) {
  function C (line 111) | function C(x, c) {
  function y (line 117) | function y(c, a) {
  function b (line 121) | function b(c) {
  function B (line 127) | function B(c) {
  function D (line 133) | function D(c) {
  function E (line 139) | function E(c) {
  function make_sigin (line 173) | function make_sigin() {
  function make_pwd (line 178) | function make_pwd(pwd) {

FILE: 其他实战/【万创帮】自动登录/spider_login.py
  class SpiderLogin (line 10) | class SpiderLogin:
    method __init__ (line 15) | def __init__(self, user, pwd):
    method use_js (line 21) | def use_js(self):
    method auto_login (line 34) | def auto_login(self):

FILE: 其他实战/【中关村】自动登录/login.py
  class ZGC (line 14) | class ZGC:
    method __init__ (line 22) | def __init__(self, username, password):
    method get_cookies (line 29) | def get_cookies(self):
    method login (line 43) | def login(self, ipck):
    method make_md5 (line 69) | def make_md5(_str):
    method main (line 80) | def main(self):

FILE: 其他实战/【京东】商品数据爬取/selenium抓取.py
  function get_goods (line 10) | def get_goods(driver):
  function spider (line 38) | def spider(url, keyword):

FILE: 其他实战/【人人网】自动登录/enc.js
  function t (line 1) | function t(e, i, t) {
  function n (line 10) | function n(e, i) {
  function o (line 31) | function o(e) {
  function s (line 44) | function s(e) {
  function r (line 59) | function r(e, i) {
  function a (line 64) | function a(e, i) {
  function l (line 77) | function l(e) {
  function d (line 87) | function d(e) {
  function c (line 92) | function c(e) {
  function u (line 99) | function u(e) {
  function g (line 109) | function g(e) {
  function f (line 115) | function f(e, i) {
  function p (line 125) | function p(e) {
  function h (line 134) | function h(e) {
  function v (line 141) | function v(e) {
  function y (line 151) | function y(e) {
  function m (line 158) | function m(e) {
  function w (line 165) | function w(e, i) {
  function b (line 182) | function b(e, i) {
  function N (line 211) | function N(e) {
  function k (line 217) | function k(e) {
  function C (line 226) | function C(e, i) {
  function x (line 241) | function x(e, i) {
  function $ (line 254) | function $(e, i, t, n, o) {
  function F (line 260) | function F(e, i) {
  function M (line 272) | function M(e, i) {
  function E (line 284) | function E(e, i) {
  function X (line 290) | function X(e, i) {
  function L (line 296) | function L(e, i) {
  function D (line 302) | function D(e, i) {
  function A (line 311) | function A(e, i) {
  function _ (line 362) | function _(e, i) {
  function getTime (line 391) | function getTime() {
  function enc (line 397) | function enc(jsonkey, pwd) {

FILE: 其他实战/【人人网】自动登录/login.py
  class People (line 7) | class People:
    method __init__ (line 8) | def __init__(self, user, pwd):
    method to_index (line 28) | def to_index(self):
    method get_key (line 37) | def get_key(self):
    method login (line 51) | def login(self, key_info):
    method get_password (line 77) | def get_password(self, key_info):
    method start (line 85) | def start(self):

FILE: 其他实战/【企业名片】企业查询/encryp.js
  function deco (line 1) | function deco(e) {
  function s (line 16) | function s(t, e, i, n, a, s) {
  function get_info (line 181) | function get_info(send_info) {

FILE: 其他实战/【国鑫所】自动登录/Login.py
  class GuoXin (line 8) | class GuoXin:
    method __init__ (line 14) | def __init__(self, user, pwd):
    method init_js (line 21) | def init_js(self):
    method login (line 26) | def login(self):

FILE: 其他实战/【国鑫所】自动登录/encryp.js
  function l (line 197) | 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 (line 197) | 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 (line 197) | 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 (line 197) | function p(b,e,a,c,m,f,t){b=b+(a^(e|~c))+m+t;return(b<<f|b>>>32-f)+e}
  function u (line 213) | function u(b,a){var c=(this._lBlock>>>b^this._rBlock)&a;this._rBlock^=c;...
  function l (line 213) | function l(b,a){var c=(this._rBlock>>>b^this._lBlock)&a;this._lBlock^=c;...
  function test (line 236) | function test(pwd) {

FILE: 其他实战/【天眼查】模拟登录/login.py
  class TYC_Spider (line 13) | class TYC_Spider:
    method __init__ (line 15) | def __init__(self, username, password):
    method run (line 36) | def run(self):
    method go_page (line 65) | def go_page(self):
    method get_info (line 71) | def get_info(self):

FILE: 其他实战/【天翼】登录/login.py
  function login (line 15) | def login(username, password):

FILE: 其他实战/【天翼】登录/v1.js
  function BigInteger (line 5) | function BigInteger(a, b, c) {
  function nbi (line 9) | function nbi() {
  function int2char (line 13) | function int2char(a) {
  function intAt (line 17) | function intAt(a, b) {
  function nbv (line 22) | function nbv(a) {
  function nbits (line 28) | function nbits(a) {
  function Classic (line 38) | function Classic(a) {
  function Montgomery (line 42) | function Montgomery(a) {
  function op_and (line 51) | function op_and(a, b) {
  function op_or (line 55) | function op_or(a, b) {
  function op_xor (line 59) | function op_xor(a, b) {
  function op_andnot (line 63) | function op_andnot(a, b) {
  function lbit (line 67) | function lbit(a) {
  function cbit (line 78) | function cbit(a) {
  function NullExp (line 83) | function NullExp() {}
  function nNop (line 85) | function nNop(a) {
  function Barrett (line 89) | function Barrett(a) {
  function Arcfour (line 97) | function Arcfour() {
  function rng_get_byte (line 103) | function rng_get_byte() {
  function SecureRandom (line 115) | function SecureRandom() {}
  function parseBigInt (line 117) | function parseBigInt(a, b) {
  function RSAKey (line 121) | function RSAKey() {
  function hex2b64 (line 132) | function hex2b64(a) {
  function b64tohex (line 140) | function b64tohex(a) {
  function c (line 1088) | function c(a) {
  function e (line 1134) | function e() {}
  function b (line 1581) | function b(a, c) {
  function c (line 1585) | function c(a, b, c, d, e) {
  function JSEncryptRSAKey (line 2110) | function JSEncryptRSAKey(a) {
  function JSEncrypt (line 2115) | function JSEncrypt(a) {
  function make (line 2170) | function make(msg) {

FILE: 其他实战/【好莱客】参数解析/encryp.js
  function get_key_iv (line 3) | function get_key_iv(str) {
  function p (line 238) | function p(b, n, a, c, e, j, k) {
  function d (line 242) | function d(b, n, a, c, e, j, k) {
  function l (line 246) | function l(b, n, a, c, e, j, k) {
  function s (line 250) | function s(b, n, a, c, e, j, k) {
  function make_j_password (line 731) | function make_j_password(pwd, security, key, iv){

FILE: 其他实战/【好莱客】参数解析/holike.py
  class MakeParam (line 10) | class MakeParam:
    method __init__ (line 16) | def __init__(self, name, pwd):
    method get_key_vi (line 23) | def get_key_vi(self):
    method read_js (line 36) | def read_js(self):
    method make_params (line 40) | def make_params(self):

FILE: 其他实战/【小牛在线】登录参数生成/encryp.js
  function t (line 3) | function t(i) {
  function s (line 18) | function s(i, e) {
  function n (line 22) | function n(i, e) {
  function o (line 34) | function o(i) {
  function get_pwd (line 482) | function get_pwd(pwd){

FILE: 其他实战/【小牛在线】登录参数生成/make_param.py
  function init_js (line 13) | def init_js():
  function make_param (line 18) | def make_param(password):

FILE: 其他实战/【开鑫贷】登陆参数生成/KaiXinDai.py
  class KaiXinDai (line 8) | class KaiXinDai:
    method __init__ (line 13) | def __init__(self, pwd):
    method get_dl (line 19) | def get_dl():
    method init_js (line 32) | def init_js(self):
    method make_param (line 36) | def make_param(self):

FILE: 其他实战/【开鑫贷】登陆参数生成/encryp.js
  function pwd_encrypt (line 4) | function pwd_encrypt(a, b) {
  function hex_md5 (line 7) | function hex_md5(a) {
  function b64_md5 (line 10) | function b64_md5(a) {
  function hex_hmac_md5 (line 13) | function hex_hmac_md5(a, b) {
  function b64_hmac_md5 (line 16) | function b64_hmac_md5(a, b) {
  function calcMD5 (line 19) | function calcMD5(a) {
  function md5_vm_test (line 22) | function md5_vm_test() {
  function core_md5 (line 25) | function core_md5(p, k) {
  function md5_cmn (line 108) | function md5_cmn(h, e, d, c, g, f) {
  function md5_ff (line 111) | function md5_ff(g, f, k, j, e, i, h) {
  function md5_gg (line 114) | function md5_gg(g, f, k, j, e, i, h) {
  function md5_hh (line 117) | function md5_hh(g, f, k, j, e, i, h) {
  function md5_ii (line 120) | function md5_ii(g, f, k, j, e, i, h) {
  function core_hmac_md5 (line 123) | function core_hmac_md5(c, f) {
  function safe_add (line 137) | function safe_add(a, d) {
  function bit_rol (line 142) | function bit_rol(a, b) {
  function str2binl (line 145) | function str2binl(d) {
  function binl2hex (line 153) | function binl2hex(c) {
  function binl2b64 (line 161) | function binl2b64(d) {
  function c (line 416) | function c(d, s, l, r, q, p, o) {
  function f (line 420) | function f(d, s, l, r, q, p, o) {
  function e (line 424) | function e(d, s, l, r, q, p, o) {
  function n (line 428) | function n(d, s, l, r, q, p, o) {
  function encrypt_md5_aes (line 919) | function encrypt_md5_aes(c, f) {
  function encrypt_aes (line 931) | function encrypt_aes(c, f) {
  function test (line 946) | function test(dlmy, pwd){

FILE: 其他实战/【微信】登录参数生成/encryp.js
  function e (line 1) | function e(n, r) {
  function u (line 5) | function u(n, r, t, u, o, c) {
  function o (line 10) | function o(n, r, t, e, o, c, f) {
  function c (line 13) | function c(n, r, t, e, o, c, f) {
  function f (line 16) | function f(n, r, t, e, o, c, f) {
  function i (line 19) | function i(n, r, t, e, o, c, f) {
  function a (line 22) | function a(n, r) {
  function h (line 38) | function h(n) {
  function d (line 44) | function d(n) {
  function g (line 53) | function g(n) {
  function l (line 60) | function l(n) {
  function v (line 63) | function v(n) {
  function s (line 68) | function s(n, r) {
  function make_pwd (line 80) | function make_pwd(n, r, t) {

FILE: 其他实战/【微信】登录参数生成/make_pwd.py
  class WeXin (line 7) | class WeXin(object):
    method __init__ (line 12) | def __init__(self):
    method make_pwd (line 17) | def make_pwd(pwd):

FILE: 其他实战/【房价】房价获取/main.py
  class Fun (line 16) | class Fun:
    method __init__ (line 23) | def __init__(self):
    method get_list (line 26) | def get_list(self):
    method get_building (line 35) | def get_building(self, _id):
    method one_fun (line 48) | def one_fun(self, infos, _id):
    method getHousePrice (line 68) | def getHousePrice(self,  buildingId, _id):
    method parse_data (line 87) | def parse_data(self, items):
    method start (line 107) | def start(self):

FILE: 其他实战/【房价】房价获取/util.py
  function des3_encrypt (line 13) | def des3_encrypt(s):
  function des3_decrypt (line 24) | def des3_decrypt(s):
  function decrypt_str (line 36) | def decrypt_str(s):
  function make_str (line 47) | def make_str(enB):
  function rep (line 74) | def rep(source, index, rep_str):

FILE: 其他实战/【房天下】自动登录/encryp.js
  function setMaxDigits (line 1) | function setMaxDigits(n) {
  function BigInt (line 11) | function BigInt(n) {
  function biFromDecimal (line 16) | function biFromDecimal(n) {
  function biCopy (line 34) | function biCopy(n) {
  function biFromNumber (line 41) | function biFromNumber(n) {
  function reverseStr (line 51) | function reverseStr(n) {
  function biToString (line 57) | function biToString(n, t) {
  function biToDecimal (line 68) | function biToDecimal(n) {
  function digitToHex (line 78) | function digitToHex(n) {
  function biToHex (line 86) | function biToHex(n) {
  function charToHex (line 92) | function charToHex(n) {
  function hexToDigit (line 101) | function hexToDigit(n) {
  function biFromHex (line 108) | function biFromHex(n) {
  function biFromString (line 115) | function biFromString(n, t) {
  function biDump (line 129) | function biDump(n) {
  function biAdd (line 133) | function biAdd(n, t) {
  function biSubtract (line 151) | function biSubtract(n, t) {
  function biHighIndex (line 179) | function biHighIndex(n) {
  function biNumBits (line 185) | function biNumBits(n) {
  function biMultiply (line 194) | function biMultiply(n, t) {
  function biMultiplyDigit (line 209) | function biMultiplyDigit(n, t) {
  function arrayCopy (line 222) | function arrayCopy(n, t, i, r, u) {
  function biShiftLeft (line 228) | function biShiftLeft(n, t) {
  function biShiftRight (line 242) | function biShiftRight(n, t) {
  function biMultiplyByRadixPower (line 256) | function biMultiplyByRadixPower(n, t) {
  function biDivideByRadixPower (line 262) | function biDivideByRadixPower(n, t) {
  function biModuloByRadixPower (line 268) | function biModuloByRadixPower(n, t) {
  function biCompare (line 274) | function biCompare(n, t) {
  function biDivideModulo (line 283) | function biDivideModulo(n, t) {
  function biDivide (line 335) | function biDivide(n, t) {
  function biModulo (line 339) | function biModulo(n, t) {
  function biMultiplyMod (line 343) | function biMultiplyMod(n, t, i) {
  function biPow (line 347) | function biPow(n, t) {
  function biPowMod (line 358) | function biPowMod(n, t, i) {
  function BarrettMu (line 369) | function BarrettMu(n) {
  function BarrettMu_modulo (line 382) | function BarrettMu_modulo(n) {
  function BarrettMu_multiplyMod (line 393) | function BarrettMu_multiplyMod(n, t) {
  function BarrettMu_powMod (line 398) | function BarrettMu_powMod(n, t) {
  function RSAKeyPair (line 412) | function RSAKeyPair(n, t, i) {
  function twoDigit (line 422) | function twoDigit(n) {
  function encryptedString (line 426) | function encryptedString(n, t) {
  function decryptedString (line 458) | function decryptedString(n, t) {
  function getPwd (line 481) | function getPwd(pwd) {

FILE: 其他实战/【房天下】自动登录/login.py
  class Fang (line 9) | class Fang:
    method __init__ (line 15) | def __init__(self, user, pwd):
    method js_init (line 22) | def js_init(self):
    method login (line 27) | def login(self):

FILE: 其他实战/【新浪微博】密码解密/execute.js
  function bt (line 240) | function bt(a) {
  function bs (line 251) | function bs(a) {
  function br (line 255) | function br(a, b) {
  function bq (line 263) | function bq() {
  function bp (line 274) | function bp(a, b) {
  function bo (line 308) | function bo(a) {
  function bn (line 312) | function bn(a, b) {
  function bm (line 322) | function bm(a, b) {
  function bl (line 326) | function bl() {}
  function bk (line 328) | function bk(a) {
  function bj (line 334) | function bj() {
  function bg (line 346) | function bg() {
  function bf (line 350) | function bf(a) {
  function ba (line 358) | function ba() {
  function _ (line 362) | function _() {
  function $ (line 372) | function $(a) {
  function Z (line 387) | function Z() {
  function Y (line 393) | function Y(a, b) {
  function X (line 399) | function X(a, b) {
  function W (line 420) | function W() {
  function V (line 424) | function V(a, b, c) {
  function U (line 429) | function U(a, b) {
  function T (line 434) | function T(a) {
  function S (line 452) | function S(a) {
  function R (line 459) | function R(a) {
  function Q (line 467) | function Q(a) {
  function P (line 476) | function P() {
  function O (line 490) | function O(a, b) {
  function N (line 495) | function N(a, b, c) {
  function M (line 500) | function M(a) {
  function L (line 504) | function L(a) {
  function K (line 508) | function K(a) {
  function J (line 512) | function J(a) {
  function I (line 516) | function I(a) {
  function H (line 523) | function H(a, b, c) {
  function G (line 584) | function G(a) {
  function F (line 601) | function F(a, b) {
  function E (line 615) | function E(a, b) {
  function D (line 647) | function D(a, b) {
  function C (line 667) | function C(a, b) {
  function B (line 686) | function B(a, b) {
  function A (line 693) | function A(a, b) {
  function z (line 703) | function z() {
  function y (line 707) | function y(a) {
  function x (line 733) | function x(a) {
  function w (line 747) | function w() {
  function v (line 751) | function v() {
  function u (line 757) | function u(a) {
  function t (line 801) | function t() {
  function s (line 807) | function s(a, b) {
  function r (line 855) | function r(a) {
  function q (line 861) | function q(a) {
  function p (line 867) | function p(a) {
  function o (line 874) | function o(a, b) {
  function n (line 879) | function n(a) {
  function h (line 883) | function h(a, b, c, d, e, f) {
  function g (line 897) | function g(a, b, c, d, e, f) {
  function f (line 911) | function f(a, b, c, d, e, f) {
  function e (line 920) | function e() {
  function d (line 924) | function d(a, b, c) {
  function get_up (line 1023) | function get_up(pwd,publickey,time,nonce) {

FILE: 其他实战/【新浪微博】密码解密/main.py
  function Get_parameters (line 12) | def Get_parameters():
  function main (line 39) | def main(pwd):

FILE: 其他实战/【时光网】登陆参数生成/encryp.js
  function a (line 5) | function a() {
  function a (line 202) | function a() {
  function m (line 438) | function m(a, x, q, v, f, w, u) {
  function h (line 443) | function h(a, x, q, v, f, w, u) {
  function k (line 448) | function k(a, x, q, v, f, w, u) {
  function g (line 453) | function g(a, x, q, v, f, w, u) {
  function c (line 624) | function c(l, e, f) {
  function g (line 795) | function g(a, f) {
  function w (line 801) | function w(a, f) {
  function get_pwd (line 1437) | function get_pwd(a) {

FILE: 其他实战/【时光网】登陆参数生成/login.py
  class MTime (line 7) | class MTime:
    method __init__ (line 12) | def __init__(self, name, pwd):
    method init_js (line 19) | def init_js(self):
    method make_pwd (line 24) | def make_pwd(self):

FILE: 其他实战/【易通贷】自动登录/auto_login.py
  class YDT (line 9) | class YDT(object):
    method __init__ (line 14) | def __init__(self, user, pwd):
    method make_pwd (line 21) | def make_pwd(pwd):
    method make_data (line 26) | def make_data(self):
    method login (line 36) | def login(self):

FILE: 其他实战/【易通贷】自动登录/encryp.js
  function hex_md5 (line 5) | function hex_md5(s) {
  function b64_md5 (line 9) | function b64_md5(s) {
  function hex_hmac_md5 (line 13) | function hex_hmac_md5(key, data) {
  function b64_hmac_md5 (line 17) | function b64_hmac_md5(key, data) {
  function calcMD5 (line 21) | function calcMD5(s) {
  function md5_vm_test (line 25) | function md5_vm_test() {
  function core_md5 (line 29) | function core_md5(x, len) {
  function md5_cmn (line 117) | function md5_cmn(q, a, b, x, s, t) {
  function md5_ff (line 121) | function md5_ff(a, b, c, d, x, s, t) {
  function md5_gg (line 125) | function md5_gg(a, b, c, d, x, s, t) {
  function md5_hh (line 129) | function md5_hh(a, b, c, d, x, s, t) {
  function md5_ii (line 133) | function md5_ii(a, b, c, d, x, s, t) {
  function core_hmac_md5 (line 137) | function core_hmac_md5(key, data) {
  function safe_add (line 152) | function safe_add(x, y) {
  function bit_rol (line 158) | function bit_rol(num, cnt) {
  function str2binl (line 162) | function str2binl(str) {
  function binl2hex (line 170) | function binl2hex(binarray) {
  function binl2b64 (line 180) | function binl2b64(binarray) {
  function make_js (line 195) | function make_js(pwd) {

FILE: 其他实战/【汽车之家】参数解密/execute.js
  function hex_md5 (line 4) | function hex_md5(a) {
  function b64_md5 (line 7) | function b64_md5(a) {
  function hex_hmac_md5 (line 10) | function hex_hmac_md5(a, b) {
  function b64_hmac_md5 (line 13) | function b64_hmac_md5(a, b) {
  function calcMD5 (line 16) | function calcMD5(a) {
  function md5_vm_test (line 19) | function md5_vm_test() {
  function core_md5 (line 22) | function core_md5(p, k) {
  function md5_cmn (line 105) | function md5_cmn(h, e, d, c, g, f) {
  function md5_ff (line 108) | function md5_ff(g, f, k, j, e, i, h) {
  function md5_gg (line 111) | function md5_gg(g, f, k, j, e, i, h) {
  function md5_hh (line 114) | function md5_hh(g, f, k, j, e, i, h) {
  function md5_ii (line 117) | function md5_ii(g, f, k, j, e, i, h) {
  function core_hmac_md5 (line 120) | function core_hmac_md5(c, f) {
  function safe_add (line 134) | function safe_add(a, d) {
  function bit_rol (line 139) | function bit_rol(a, b) {
  function str2binl (line 142) | function str2binl(d) {
  function binl2hex (line 150) | function binl2hex(c) {
  function binl2b64 (line 158) | function binl2b64(d) {

FILE: 其他实战/【汽车之家】参数解密/main.py
  function main (line 8) | def main(pwd):

FILE: 其他实战/【满级网】自动登录/auto_login.py
  class YX (line 11) | class YX(object):
    method __init__ (line 17) | def __init__(self, user, pwd):
    method make_pwd (line 30) | def make_pwd(self):
    method make_data (line 36) | def make_data(self):
    method login (line 44) | def login(self):

FILE: 其他实战/【满级网】自动登录/encryp.js
  function e (line 11) | function e(t, e, i) {
  function i (line 14) | function i() {
  function r (line 17) | function r(t, e, i, r, s, n) {
  function s (line 25) | function s(t, e, i, r, s, n) {
  function n (line 36) | function n(t, e, i, r, s, n) {
  function o (line 47) | function o(t) {
  function h (line 50) | function h(t, e) {
  function a (line 54) | function a(t) {
  function u (line 60) | function u(t) {
  function c (line 65) | function c(t) {
  function f (line 70) | function f(t, i) {
  function p (line 102) | function p() {
  function l (line 106) | function l(t) {
  function d (line 135) | function d() {
  function g (line 140) | function g() {
  function m (line 143) | function m(t) {
  function y (line 156) | function y(t) {
  function b (line 170) | function b() {
  function T (line 173) | function T(t, e) {
  function S (line 182) | function S(t, e) {
  function R (line 188) | function R(t, e) {
  function E (line 200) | function E(t, e) {
  function D (line 216) | function D(t, e) {
  function w (line 239) | function w(t, i) {
  function x (line 251) | function x(t) {
  function B (line 263) | function B(t, r, s) {
  function K (line 310) | function K(t) {
  function A (line 316) | function A(t) {
  function U (line 319) | function U(t) {
  function O (line 322) | function O(t) {
  function V (line 325) | function V(t) {
  function N (line 328) | function N(t, e, i) {
  function J (line 332) | function J(t, e) {
  function I (line 336) | function I() {
  function P (line 349) | function P(t) {
  function M (line 357) | function M(t) {
  function L (line 364) | function L(t) {
  function q (line 370) | function q(t) {
  function C (line 385) | function C(t, e) {
  function H (line 389) | function H(t, e, i) {
  function j (line 393) | function j() {
  function k (line 396) | function k(t, r) {
  function F (line 414) | function F(t, e) {
  function _ (line 422) | function _() {
  function z (line 427) | function z() {
  function Z (line 441) | function Z() {
  function G (line 444) | function G() {
  function $ (line 447) | function $(t) {
  function Y (line 450) | function Y() {
  function W (line 453) | function W(t) {
  function Q (line 468) | function Q(t, i) {
  function X (line 483) | function X(t, i, r) {
  function tt (line 502) | function tt() {
  function et (line 518) | function et(t) {
  function it (line 521) | function it(t) {
  function rt (line 524) | function rt(t) {
  function st (line 527) | function st(t, e, i) {
  function nt (line 545) | function nt(t, e) {
  function ot (line 548) | function ot(t) {
  function ht (line 553) | function ht(t, e) {
  function at (line 556) | function at(t) {
  function ut (line 561) | function ut(t, e) {
  function ct (line 564) | function ct(t) {
  function ft (line 569) | function ft(t, e) {
  function pt (line 572) | function pt(t) {
  function lt (line 577) | function lt() {
  function dt (line 584) | function dt(t) {
  function gt (line 589) | function gt(t) {
  function mt (line 594) | function mt(t) {
  function yt (line 609) | function yt() {
  function vt (line 615) | function vt(t) {
  function bt (line 621) | function bt() {
  function Tt (line 626) | function Tt(t) {
  function St (line 630) | function St(t, i) {
  function Rt (line 635) | function Rt(t) {
  function Et (line 638) | function Et(t) {
  function Dt (line 641) | function Dt(t) {
  function wt (line 644) | function wt(t, e) {
  function xt (line 667) | function xt(t) {
  function Bt (line 672) | function Bt(t) {
  function Kt (line 677) | function Kt(t) {
  function At (line 682) | function At() {
  function Ut (line 687) | function Ut(t) {
  function Ot (line 692) | function Ot(t) {
  function Vt (line 697) | function Vt(t) {
  function Nt (line 703) | function Nt(t) {
  function Jt (line 708) | function Jt(t, e) {
  function It (line 718) | function It() {}
  function Pt (line 719) | function Pt(t) {
  function Mt (line 722) | function Mt(t, e, i) {
  function Lt (line 725) | function Lt(t, e) {
  function qt (line 728) | function qt(t) {
  function Ct (line 731) | function Ct(t, e, i) {
  function Ht (line 743) | function Ht(t, e, i) {
  function jt (line 753) | function jt(t) {
  function kt (line 760) | function kt(t) {
  function Ft (line 770) | function Ft(t) {
  function _t (line 773) | function _t(t) {
  function zt (line 783) | function zt(t, e) {
  function Zt (line 787) | function Zt(t, e, i) {
  function Gt (line 791) | function Gt(t, e) {
  function $t (line 841) | function $t(t) {
  function Yt (line 864) | function Yt(t) {
  function Wt (line 877) | function Wt(t) {
  function Qt (line 903) | function Qt(t) {
  function Xt (line 922) | function Xt(t) {
  function te (line 944) | function te() {
  function ee (line 949) | function ee(t) {
  function ie (line 962) | function ie() {
  function re (line 971) | function re() {
  function se (line 974) | function se() {
  function ne (line 987) | function ne(t) {
  function oe (line 992) | function oe() {}
  function he (line 993) | function he(t, i) {
  function ae (line 996) | function ae(t, i) {
  function ue (line 1017) | function ue() {
  function ce (line 1027) | function ce(t, e) {
  function fe (line 1031) | function fe(t) {
  function pe (line 1034) | function pe(t) {
  function le (line 1044) | function le(t, e) {
  function de (line 1060) | function de(t, e, i) {
  function ge (line 1065) | function ge(t, e, i, r, s, n, o, h) {
  function me (line 1075) | function me(t, i) {
  function ye (line 1104) | function ye(t) {
  function ve (line 1111) | function ve(t) {
  function be (line 1116) | function be(t) {
  function Te (line 1127) | function Te(t) {
  function e (line 2108) | function e(t, i) {
  function i (line 2113) | function i(t, e, i, r, s) {
  function make (line 2836) | function make(pwd) {

FILE: 其他实战/【百度】wap端sig生成/v3_update.js
  function r (line 18) | function r(x) {
  function _ (line 91) | function _() {}
  function r (line 342) | function r(x) {
  function n (line 379) | function n(x, c, _) {
  function A (line 726) | function A(x, c, _, t, r, n, i) {
  function z (line 730) | function z(x, c, _, t, r, n, i) {
  function H (line 734) | function H(x, c, _, t, r, n, i) {
  function C (line 738) | function C(x, c, _, t, r, n, i) {
  function f (line 887) | function f(x, c) {
  function e (line 891) | function e(x, c, _, t, r, n) {
  function u (line 896) | function u(x, c, _, t, r, n, i) {
  function h (line 899) | function h(x, c, _, t, r, n, i) {
  function v (line 902) | function v(x, c, _, t, r, n, i) {
  function d (line 905) | function d(x, c, _, t, r, n, i) {
  function o (line 908) | function o(x, c) {
  function a (line 920) | function a(x) {
  function s (line 926) | function s(x) {
  function n (line 935) | function n(x) {
  function _ (line 942) | function _(x) {
  function i (line 945) | function i(x) {
  function l (line 950) | function l(x, c) {
  function x (line 982) | function x(x) {
  function c (line 988) | function c(x) {
  function i (line 1068) | function i() {
  function r (line 1208) | function r(x, c, _) {
  function i (line 1415) | function i(x) {
  function H (line 1716) | function H(x, c, _) {
  function C (line 1719) | function C(x, c, _) {
  function R (line 1722) | function R(x, c, _) {
  function M (line 1725) | function M(x, c, _) {
  function D (line 1728) | function D(x, c, _) {
  function E (line 1731) | function E(x, c) {
  function n (line 1790) | function n(x, c, _, t) {
  function a (line 1854) | function a(x) {
  function v (line 2739) | function v(x, c) {
  function d (line 2744) | function d(x, c) {
  function r (line 2806) | function r() {
  function u (line 2891) | function u() {
  function u (line 2978) | function u() {
  function _ (line 3041) | function _(x) {
  function b (line 3075) | function b(x, c, _, t) {
  function y (line 3078) | function y(x, c) {
  function g (line 3082) | function g(x, c) {
  function v3test (line 3090) | function v3test(s_dv,s_name,s_code,s_verifystring){

FILE: 其他实战/【百度】网页找回密码/demo.py
  class BaiDu (line 20) | class BaiDu:
    method __init__ (line 25) | def __init__(self, username):
    method make_dv (line 33) | def make_dv(self):
    method get_bds_token (line 43) | def get_bds_token(self):
    method get_verify_str (line 55) | def get_verify_str(self):
    method get_img (line 67) | def get_img(self, verify_str):
    method get_token (line 77) | def get_token(self, bds_token, verify_str, code, _time, sig):
    method get_phone (line 113) | def get_phone(self, token):
    method js_call (line 130) | def js_call(self, bds_token, verify_str, code):
    method start (line 141) | def start(self):

FILE: 其他实战/【百度】网页找回密码/dv.js
  function n (line 5) | function n(e) {
  function r (line 15) | function r(e, t) {
  function o (line 27) | function o(e) {
  function a (line 34) | function a(e, t) {
  function i (line 46) | function i() {
  function d (line 67) | function d(e) {
  function c (line 72) | function c(n) {
  function f (line 78) | function f() {
  function u (line 103) | function u() {
  function l (line 111) | function l() {
  function v (line 115) | function v() {
  function s (line 134) | function s(n) {
  function h (line 161) | function h(n) {
  function m (line 192) | function m(t) {
  function p (line 216) | function p() {
  function g (line 219) | function g(e, t) {
  function E (line 223) | function E() {
  function y (line 233) | function y() {
  function I (line 248) | function I() {
  function C (line 265) | function C(e) {
  function R (line 292) | function R() {
  function S (line 343) | function S(e, t) {
  function n (line 504) | function n() {
  function MakeDv (line 547) | function MakeDv(NowTime, toK) {

FILE: 其他实战/【百度】网页找回密码/encryp.js
  function _0xe9f535 (line 19) | function _0xe9f535(_0x175f6e) {
  function _0xaafd7a (line 85) | function _0xaafd7a(_0x53730b, _0x5bdb4f) {
  function _0x241bfb (line 195) | function _0x241bfb(_0x4b518a, _0x2b5455) {
  function _0x2f085d (line 215) | function _0x2f085d(_0x983486, _0x2a1cfc) {
  function _0x4d6b76 (line 220) | function _0x4d6b76(_0x51d502, _0x1c3ad7) {
  function _0x3b88e1 (line 223) | function _0x3b88e1(_0x24aaf2, _0x3d6d1e, _0x3c3773, _0x37b66f, _0x226bbc...
  function _0x4fe096 (line 226) | function _0x4fe096(_0x366642, _0x3bffde, _0x3b4d9c, _0x1a4cb6, _0x62c8e2...
  function _0x39c6c2 (line 229) | function _0x39c6c2(_0x462ab2, _0x2f87a4, _0x5b41a1, _0x2985b7, _0x357be0...
  function _0x225461 (line 232) | function _0x225461(_0x5d9a0a, _0x3dff90, _0x565581, _0x2428af, _0x281ceb...
  function _0x184b61 (line 235) | function _0x184b61(_0x1ad69c, _0x378619, _0x4372c6, _0x1409c5, _0x47d5e9...
  function _0x3b130b (line 238) | function _0x3b130b(_0xc519bc, _0x536f44) {
  function _0x5e828c (line 321) | function _0x5e828c(_0xb48cf1) {
  function _0x2ce6c4 (line 328) | function _0x2ce6c4(_0xd6dfa) {
  function _0xeb07c8 (line 339) | function _0xeb07c8(_0x4c2541) {
  function _0x19f155 (line 342) | function _0x19f155(_0x4fdfa9, _0x5be405) {
  function _0x2ec482 (line 358) | function _0x2ec482(_0x2125ec) {
  function _0x2408fe (line 369) | function _0x2408fe(_0x57e352) {
  function _0x213b1d (line 372) | function _0x213b1d(_0x59b900) {
  function _0x19c6c8 (line 375) | function _0x19c6c8(_0x389df0) {
  function _0x3bbbba (line 378) | function _0x3bbbba(_0x159b47, _0x34e632) {
  function _0x2ae50b (line 381) | function _0x2ae50b(_0x4bfa50, _0x16cbfe) {
  function _0x55a320 (line 384) | function _0x55a320(_0x9a8c19, _0x547222, _0x326248) {
  function _0x37accf (line 411) | function _0x37accf() {}
  function _0x111baf (line 656) | function _0x111baf(_0xf363be, _0x197bb8, _0x146d5c) {
  function _0x2ef51a (line 747) | function _0x2ef51a(_0x20e8c2) {
  function _0x2ef51a (line 782) | function _0x2ef51a(_0x453890, _0x579063, _0x368bda) {
  function zh (line 1182) | function zh(bdstoken,captcha_str,dv,username, yanzhengma) {

FILE: 其他实战/【百度】翻译/translate.js
  function n (line 4) | function n(r, o) {
  function a (line 14) | function a(r) {

FILE: 其他实战/【百度】翻译/translation.py
  class FanYiSpider (line 11) | class FanYiSpider(object):
    method __init__ (line 17) | def __init__(self, query):
    method make_sign (line 30) | def make_sign(self):
    method make_data (line 37) | def make_data(self, sign):
    method get_content (line 47) | def get_content(self, data):
    method run (line 56) | def run(self):

FILE: 其他实战/【百度】自动登录/encryp.js
  function t (line 15) | function t(e, t, n) {
  function n (line 20) | function n() {
  function i (line 24) | function i(e, t, n, i, s, o) {
  function s (line 33) | function s(e, t, n, i, s, o) {
  function o (line 45) | function o(e, t, n, i, s, o) {
  function r (line 57) | function r(e) {
  function a (line 61) | function a(e, t) {
  function c (line 66) | function c(e) {
  function l (line 73) | function l(e) {
  function d (line 79) | function d(e) {
  function u (line 85) | function u(e, n) {
  function p (line 118) | function p() {
  function g (line 123) | function g(e) {
  function h (line 157) | function h() {
  function m (line 163) | function m() {
  function f (line 167) | function f(e) {
  function b (line 181) | function b(e) {
  function y (line 196) | function y() {
  function _ (line 200) | function _(e, t) {
  function E (line 210) | function E(e, t) {
  function w (line 217) | function w(e, t) {
  function C (line 234) | function C(e, t) {
  function S (line 251) | function S(e, t) {
  function I (line 275) | function I(e, n) {
  function T (line 288) | function T(e) {
  function D (line 301) | function D(e, i, s) {
  function R (line 349) | function R(e) {
  function k (line 356) | function k(e) {
  function x (line 360) | function x(e) {
  function L (line 364) | function L(e) {
  function P (line 368) | function P(e) {
  function A (line 372) | function A(e, t, n) {
  function B (line 377) | function B(e, t) {
  function M (line 382) | function M() {
  function V (line 396) | function V(e) {
  function $ (line 405) | function $(e) {
  function O (line 413) | function O(e) {
  function U (line 420) | function U(e) {
  function N (line 436) | function N(e, t) {
  function q (line 441) | function q(e, t, n) {
  function H (line 446) | function H() {
  function F (line 450) | function F(e, i) {
  function W (line 469) | function W(e, t) {
  function K (line 475) | function K() {
  function j (line 481) | function j() {
  function J (line 496) | function J() {
  function G (line 500) | function G() {
  function Q (line 504) | function Q(e) {
  function z (line 508) | function z() {
  function Z (line 512) | function Z(e) {
  function Y (line 528) | function Y(e, n) {
  function X (line 544) | function X(e, n, i) {
  function et (line 564) | function et() {
  function tt (line 582) | function tt(e) {
  function nt (line 586) | function nt(e) {
  function it (line 590) | function it(e) {
  function st (line 594) | function st(e, t, n) {
  function ot (line 613) | function ot(e, t) {
  function rt (line 617) | function rt(e) {
  function at (line 623) | function at(e, t) {
  function ct (line 627) | function ct(e) {
  function lt (line 633) | function lt(e, t) {
  function dt (line 637) | function dt(e) {
  function ut (line 643) | function ut(e, t) {
  function pt (line 647) | function pt(e) {
  function gt (line 653) | function gt() {
  function ht (line 661) | function ht(e) {
  function mt (line 667) | function mt(e) {
  function ft (line 673) | function ft(e) {
  function vt (line 689) | function vt() {
  function bt (line 696) | function bt(e) {
  function yt (line 703) | function yt() {
  function _t (line 709) | function _t(e) {
  function Et (line 714) | function Et(e, n) {
  function wt (line 720) | function wt(e) {
  function Ct (line 724) | function Ct(e) {
  function St (line 728) | function St(e) {
  function It (line 732) | function It(e, t) {
  function Tt (line 756) | function Tt(e) {
  function Dt (line 762) | function Dt(e) {
  function Rt (line 768) | function Rt(e) {
  function kt (line 774) | function kt() {
  function xt (line 780) | function xt(e) {
  function Lt (line 786) | function Lt(e) {
  function Pt (line 792) | function Pt(e) {
  function At (line 799) | function At(e) {
  function Bt (line 805) | function Bt(e, t) {
  function Mt (line 816) | function Mt() {}
  function Vt (line 818) | function Vt(e) {
  function $t (line 822) | function $t(e, t, n) {
  function Ot (line 826) | function Ot(e, t) {
  function Ut (line 830) | function Ut(e) {
  function Nt (line 834) | function Nt(e, t, n) {
  function qt (line 847) | function qt(e, t, n) {
  function Ht (line 858) | function Ht(e) {
  function Ft (line 866) | function Ft(e) {
  function Wt (line 877) | function Wt(e) {
  function Kt (line 881) | function Kt(e) {
  function jt (line 892) | function jt(e, t) {
  function Jt (line 897) | function Jt(e, t, n) {
  function Gt (line 902) | function Gt(e, t) {
  function Qt (line 956) | function Qt(e) {
  function zt (line 980) | function zt(e) {
  function Zt (line 994) | function Zt(e) {
  function Yt (line 1021) | function Yt(e) {
  function Xt (line 1041) | function Xt(e) {
  function en (line 1064) | function en() {
  function tn (line 1070) | function tn(e) {
  function nn (line 1084) | function nn() {
  function sn (line 1094) | function sn() {
  function on (line 1098) | function on(e) {
  function rn (line 1106) | function rn() {
  function an (line 1110) | function an() {
  function cn (line 1122) | function cn(e) {
  function ln (line 1128) | function ln() {}
  function dn (line 1130) | function dn(e, n) {
  function un (line 1134) | function un(e, n) {
  function pn (line 1156) | function pn() {
  function gn (line 1167) | function gn(e, t) {
  function hn (line 1172) | function hn(e) {
  function mn (line 1176) | function mn(e) {
  function fn (line 1187) | function fn(e, t) {
  function vn (line 1205) | function vn(e, t, n) {
  function bn (line 1211) | function bn(e, t, n, i, s, o, r, a) {
  function yn (line 1222) | function yn(e, n) {
  function _n (line 1252) | function _n(e) {
  function En (line 1261) | function En(e) {
  function wn (line 1267) | function wn(e) {
  function Cn (line 1280) | function Cn(e) {
  function t (line 2156) | function t(e, n) {
  function n (line 2162) | function n(e, t, n, i, s) {
  function urlprase (line 2833) | function urlprase(a) {
  function test (line 2840) | function test(pwd) {

FILE: 其他实战/【百度】自动登录/login.py
  class PingDuoDuoSpider (line 14) | class PingDuoDuoSpider(object):
    method __init__ (line 20) | def __init__(self):
    method make (line 25) | def make(self, password):

FILE: 其他实战/【百度街拍】图片下载/get_image.py
  function getPage (line 10) | def getPage(offset):
  function getImage (line 69) | def getImage(json):
  function saveImage (line 83) | def saveImage(item):
  function main (line 95) | def main(offset):

FILE: 其他实战/【移动】登录参数生成/MakeParam.py
  class MakeParam (line 8) | class MakeParam:
    method __init__ (line 15) | def __init__(self, name, pwd):
    method init_js (line 21) | def init_js(self):
    method mk_params (line 26) | def mk_params(self):

FILE: 其他实战/【移动】登录参数生成/encryp.js
  function sha1 (line 1) | function sha1(a) {
  function a (line 41) | function a(a, c) {
  function customerGetCGUID (line 82) | function customerGetCGUID() {

FILE: 其他实战/【空中网】自动登录/encryp.js
  function mk_pwd (line 1) | function mk_pwd (str, pwd) {

FILE: 其他实战/【空中网】自动登录/spider_login.py
  class SpiderLogin (line 10) | class SpiderLogin:
    method __init__ (line 15) | def __init__(self, user, pwd):
    method use_js (line 27) | def use_js(self, dc):
    method auto_login (line 38) | def auto_login(self):
    method get_dc (line 49) | def get_dc(self):

FILE: 其他实战/【美团】数据解析、token生成/create_food_token.py
  class MakeToken (line 8) | class MakeToken():
    method __init__ (line 15) | def __init__(self, areaId, cityName, originUrl, page):
    method join_sign (line 22) | def join_sign(self):
    method join_token (line 32) | def join_token(self):

FILE: 其他实战/【美团】数据解析、token生成/get_login_cookies.py
  class MeiTuanCookies (line 10) | class MeiTuanCookies():
    method __init__ (line 11) | def __init__(self, username, password):
    method star (line 16) | async def star(self):
    method get_cookie (line 29) | async def get_cookie(self, page):

FILE: 其他实战/【美团】数据解析、token生成/parse_food_comments.py
  class ParseComments (line 12) | class ParseComments(object):
    method __init__ (line 13) | def __init__(self, shop_id):
    method get_data (line 18) | def get_data(self):
    method get_originUrl (line 40) | def get_originUrl(self):
    method parse (line 45) | def parse(self, data):
    method parse_time (line 61) | def parse_time(timeStamp):

FILE: 其他实战/【美团】数据解析、token生成/parse_food_info.py
  class ParseRestaurantInfo (line 13) | class ParseRestaurantInfo(object):
    method __init__ (line 19) | def __init__(self, restaurant_id):
    method go_to_restaurant (line 24) | def go_to_restaurant(self):
    method parse_html (line 38) | def parse_html(data):

FILE: 其他实战/【美团】数据解析、token生成/parse_hotel_comments.py
  class ParseComments (line 14) | class ParseComments(object):
    method __init__ (line 17) | def __init__(self, hotel_id):
    method get_data (line 21) | def get_data(self):
    method parse (line 39) | def parse(self, data):
    method parse_time (line 56) | def parse_time(timeStamp):
    method parse_pic (line 62) | def parse_pic(self, item):

FILE: 其他实战/【美团】数据解析、token生成/parse_hotel_info.py
  class ParseHotelInfo (line 16) | class ParseHotelInfo(object):
    method __init__ (line 21) | def __init__(self, p_id):
    method go_to_hotel (line 24) | def go_to_hotel(self):
    method parse_html (line 42) | def parse_html(self, data_dict):

FILE: 其他实战/【美团】数据解析、token生成/parse_play_areas.py
  class ParseAreas (line 11) | class ParseAreas(object):
    method __init__ (line 13) | def __init__(self, city_name):
    method get_data (line 18) | def get_data(self):
    method parse (line 30) | def parse(data, url):

FILE: 其他实战/【美团】数据解析、token生成/parse_play_info.py
  class ParsePlayInfo (line 15) | class ParsePlayInfo(object):
    method __init__ (line 21) | def __init__(self, restaurant_id):
    method go_to_restaurant (line 26) | def go_to_restaurant(self):
    method parse_html (line 39) | def parse_html(self, data):

FILE: 其他实战/【试客联盟】登录/execute.js
  function BarrettMu (line 1) | function BarrettMu(m) {
  function BarrettMu_modulo (line 14) | function BarrettMu_modulo(x) {
  function BarrettMu_multiplyMod (line 33) | function BarrettMu_multiplyMod(x, y) {
  function BarrettMu_powMod (line 38) | function BarrettMu_powMod(x, y) {
  function setMaxDigits (line 65) | function setMaxDigits(value) {
  function BigInt (line 78) | function BigInt(flag) {
  function biFromDecimal (line 87) | function biFromDecimal(s) {
  function biCopy (line 111) | function biCopy(bi) {
  function biFromNumber (line 118) | function biFromNumber(i) {
  function reverseStr (line 130) | function reverseStr(s) {
  function biToString (line 140) | function biToString(x, radix) {
  function biToDecimal (line 153) | function biToDecimal(x) {
  function digitToHex (line 166) | function digitToHex(n) {
  function biToHex (line 176) | function biToHex(x) {
  function charToHex (line 185) | function charToHex(c) {
  function hexToDigit (line 205) | function hexToDigit(s) {
  function biFromHex (line 215) | function biFromHex(s) {
  function biFromString (line 225) | function biFromString(s, radix) {
  function biToBytes (line 242) | function biToBytes(x) {
  function digitToBytes (line 250) | function digitToBytes(n) {
  function biDump (line 257) | function biDump(b) {
  function biAdd (line 261) | function biAdd(x, y) {
  function biSubtract (line 281) | function biSubtract(x, y) {
  function biHighIndex (line 315) | function biHighIndex(x) {
  function biNumBits (line 322) | function biNumBits(x) {
  function biMultiply (line 335) | function biMultiply(x, y) {
  function biMultiplyDigit (line 356) | function biMultiplyDigit(x, y) {
  function arrayCopy (line 370) | function arrayCopy(src, srcStart, dest, destStart, n) {
  function biShiftLeft (line 380) | function biShiftLeft(x, n) {
  function biShiftRight (line 398) | function biShiftRight(x, n) {
  function biMultiplyByRadixPower (line 413) | function biMultiplyByRadixPower(x, n) {
  function biDivideByRadixPower (line 419) | function biDivideByRadixPower(x, n) {
  function biModuloByRadixPower (line 425) | function biModuloByRadixPower(x, n) {
  function biCompare (line 431) | function biCompare(x, y) {
  function biDivideModulo (line 447) | function biDivideModulo(x, y) {
  function biDivide (line 526) | function biDivide(x, y) {
  function biModulo (line 530) | function biModulo(x, y) {
  function biMultiplyMod (line 534) | function biMultiplyMod(x, y, m) {
  function biPow (line 538) | function biPow(x, y) {
  function biPowMod (line 552) | function biPowMod(x, y, m) {
  function RSAKeyPair (line 572) | function RSAKeyPair(encryptionExponent, decryptionExponent, modulus, key...
  function encryptedString (line 585) | function encryptedString(key, s, pad, encoding) {
  function decryptedString (line 678) | function decryptedString(key, c) {
  function get_pwd (line 701) | function get_pwd(pwd) {

FILE: 其他实战/【试客联盟】登录/login.py
  function main (line 12) | def main(pwd):
  function login (line 25) | def login(sign_pwd, username):
  function home (line 38) | def home():

FILE: 其他实战/【谷雨】数字解密/GuYu.py
  class Font (line 10) | class Font:
    method __init__ (line 16) | def __init__(self, uri):
    method check (line 22) | def check(self):
    method get_wo (line 33) | def get_wo(self):
    method parse (line 49) | def parse(self, number):

FILE: 其他实战/【豆瓣】自动登录/DouBan.py
  class DouBan (line 9) | class DouBan:
    method __init__ (line 10) | def __init__(self, name, pwd):
    method login (line 24) | def login(self):
    method check (line 34) | def check(self):

FILE: 其他实战/【逗游】自动登录/douyou.py
  class DouYou (line 10) | class DouYou:
    method __init__ (line 16) | def __init__(self, username, password):
    method make_password (line 21) | def make_password(self):
    method get_token (line 33) | def get_token(self):
    method login (line 46) | def login(self):

FILE: 其他实战/【逗游】自动登录/encryp.js
  function get_value (line 177) | function get_value(pwd, nonce, ts) {

FILE: 其他实战/【金逸电影】自动注册/encryp.js
  function getEncryption (line 146) | function getEncryption(value) {

FILE: 其他实战/【金逸电影】自动注册/register.py
  class JinYiRegister (line 9) | class JinYiRegister:
    method __init__ (line 14) | def __init__(self, phone):
    method js_make (line 22) | def js_make(json_data):
    method register (line 31) | def register(self):

FILE: 其他实战/【青海移动】登陆参数生成/encryp.js
  function l (line 217) | function l(b, e, a, c, m, f, t) {
  function d (line 222) | function d(b, e, a, c, m, f, t) {
  function n (line 227) | function n(b, e, a, c, m, f, t) {
  function p (line 232) | function p(b, e, a, c, m, f, t) {
  function u (line 621) | function u(b, a) {
  function l (line 627) | function l(b, a) {
  function decryptRSA (line 1267) | function decryptRSA(privateKeyStr, cKeyStr) {
  function encryptByDES (line 1275) | function encryptByDES(message) {
  function decryptByDES (line 1284) | function decryptByDES(ciphertext) {
  function test (line 1295) | function test(key) {

FILE: 其他实战/【青海移动】登陆参数生成/make_param.py
  class QinHaiYiDong (line 7) | class QinHaiYiDong:
    method __init__ (line 13) | def __init__(self, user, pwd):
    method init_js (line 19) | def init_js(self):
    method make_param (line 24) | def make_param(self):

FILE: 其他实战/【餐饮】查询信息/FoodInfo.py
  class Food (line 12) | class Food:
    method __init__ (line 16) | def __init__(self):
    method get_info (line 32) | def get_info(self, url):

FILE: 原创爬虫工具/Cookies/MeiTuan/db.py
  class RedisClient (line 10) | class RedisClient(object):
    method __init__ (line 11) | def __init__(self, t_type, website, host=REDIS_HOST, port=REDIS_PORT, ...
    method name (line 29) | def name(self):
    method set (line 36) | def set(self, username, value):
    method get (line 45) | def get(self, username):
    method delete (line 53) | def delete(self, username):
    method count (line 61) | def count(self):
    method random (line 68) | def random(self):
    method all_username (line 75) | def all_username(self):
    method all (line 82) | def all(self):

FILE: 原创爬虫工具/Cookies/MeiTuan/generator.py
  class MeiTuanCookies (line 12) | class MeiTuanCookies():
    method __init__ (line 15) | def __init__(self):
    method star (line 18) | async def star(self, username, password):
    method get_cookie (line 31) | async def get_cookie(self, page,username,password):

FILE: 原创爬虫工具/DataMigration/db/MongoDB.py
  class Mongo (line 9) | class Mongo(object):
    method __init__ (line 10) | def __init__(self, db_name, collection):
    method delete (line 15) | def delete(self, *args, del_one=True):
    method all (line 25) | def all(self):
    method find (line 32) | def find(self, *args):
    method update (line 40) | def update(self, *args, update_one=True):
    method insert (line 49) | def insert(self, *args, insert_one=True):

FILE: 原创爬虫工具/DataMigration/db/Mysql.py
  class Mysql (line 9) | class Mysql(object):
    method __init__ (line 10) | def __init__(self):
    method insert (line 22) | def insert(self, sql):
    method select (line 40) | def select(self, sql):

FILE: 原创爬虫工具/DataMigration/migration/mongo_to_mysql.py
  class Migrate (line 11) | class Migrate(object):
    method __init__ (line 12) | def __init__(self,mysql_table_name, mongodb_name, mongodb_collection):
    method easy_to_mongo (line 17) | def easy_to_mongo(self, column_comment=False):
    method all_mysql_data (line 40) | def all_mysql_data(self):
    method get_column (line 48) | def get_column(self):

FILE: 原创爬虫工具/DataMigration/migration/mysql_to_mongo.py
  class Migrate (line 11) | class Migrate(object):
    method __init__ (line 12) | def __init__(self, mysql_table_name, mongodb_name, mongodb_collection):
    method easy_to_mongo (line 17) | def easy_to_mongo(self, column_comment=False):
    method all_mysql_data (line 40) | def all_mysql_data(self):
    method get_column (line 48) | def get_column(self):

FILE: 原创爬虫工具/Decode/translation.py
  class TranslationMetaClass (line 11) | class TranslationMetaClass(type):
    method __new__ (line 13) | def __new__(mcs, name, bases, attrs):
  class Util (line 24) | class Util(object):
    method _print (line 28) | def _print(color, msg):
    method msg (line 37) | def msg(self):
  class Decode (line 46) | class Decode(Util, metaclass=TranslationMetaClass):
    method __init__ (line 52) | def __init__(self, _key):
    method main (line 57) | def main(self):
    method decode_base64 (line 76) | def decode_base64(self):
    method decode_zlib (line 80) | def decode_zlib(self):
    method decode_str (line 84) | def decode_str(self):
    method decode_hex (line 88) | def decode_hex(self):

FILE: 原创爬虫工具/Jsencrypt/make_encrypt.py
  function make_message (line 18) | def make_message(pwd):

FILE: 原创爬虫工具/OSS/push_to_oss.py
  function put_img (line 38) | def put_img():
  function get_len (line 51) | def get_len():

FILE: 原创爬虫工具/Proxy/KDLProxyPool.py
  class KDLProxyPool (line 17) | class KDLProxyPool(object):
    method __init__ (line 23) | def __init__(self, key, count):
    method check_ip (line 33) | def check_ip(self):
    method add_ip (line 51) | def add_ip(self, num):
    method parse (line 69) | def parse(self, proxy_list):
    method save_to_redis (line 76) | def save_to_redis(self, proxy, expire):
  function aps_run (line 84) | def aps_run():

FILE: 原创爬虫工具/Proxy/XDLProxyPool.py
  class XDLProxyPool (line 17) | class XDLProxyPool(object):
    method __init__ (line 22) | def __init__(self, api_url):
    method init_proxy (line 35) | def init_proxy(self):
    method check_ip (line 56) | def check_ip(self):
    method add_ip (line 75) | def add_ip(self, count):
    method parse (line 95) | def parse(self, data):
    method save_to_redis (line 104) | def save_to_redis(self, proxy, expire):
  function aps_run (line 112) | def aps_run():

FILE: 原创爬虫工具/Proxy/XDLProxyUseDemo.py
  class MyProxy (line 26) | class MyProxy(object):
    method process_request (line 28) | def process_request(self, request, spider):
  class DownloaderMiddleware (line 41) | class DownloaderMiddleware(object):
    method process_response (line 42) | def process_response(self, request, response, spider):
    method process_exception (line 58) | def process_exception(self, request, exception, spider):  # 可能由于IP质量问题...

FILE: 原创爬虫工具/Proxy/ZhiMaProxyPool.py
  class ZhiMaPool (line 15) | class ZhiMaPool(object):
    method __init__ (line 24) | def __init__(self, key, ip_sum=20, ttl=1000):
    method _init (line 37) | def _init(self):
    method check_ip (line 56) | def check_ip(self):
    method add_ip (line 88) | def add_ip(self, count=1, time_type=1, ip_type='http'):
    method del_ip (line 101) | def del_ip(self):
    method parse (line 104) | def parse(self, json_data):
    method get_end_time (line 124) | def get_end_time(self, parse_time):
    method save_to_redis (line 137) | def save_to_redis(self, proxy, expire):
    method get_balance (line 143) | def get_balance(self, count, total):
  function aps_run (line 157) | def aps_run():

FILE: 原创爬虫工具/Proxy/ZhiMaProxyUseDemo.py
  class MyProxy (line 25) | class MyProxy(object):
    method process_request (line 27) | def process_request(self, request, spider):
  class DownloaderMiddleware (line 40) | class DownloaderMiddleware(object):
    method process_response (line 41) | def process_response(self, request, response, spider):
    method process_exception (line 57) | def process_exception(self, request, exception, spider):  # 可能由于IP质量问题...

FILE: 原创爬虫工具/Register/MessageCode.py
  class YMReg (line 46) | class YMReg(object):
    method __init__ (line 48) | def __init__(self, token, project_code, aio_count=20):
    method get_balance (line 61) | def get_balance(self):
    method filter_info (line 74) | def filter_info(message):
    method get_node (line 84) | async def get_node(self, session, phone):
    method fetch_phone (line 100) | async def fetch_phone(self, session):
    method work (line 109) | async def work(self):
    method del_phone (line 124) | async def del_phone(self, session, phone):
    method join_black_list (line 133) | async def join_black_list(self, session, phone):
    method start (line 142) | def start(self):

FILE: 原创爬虫工具/zok/get_db/from_mysql.py
  function get_data (line 10) | def get_data(sql):

FILE: 原创爬虫工具/zok/proxies/proxies.py
  class ProxyMiddleware (line 15) | class ProxyMiddleware(object):
    method process_request (line 17) | def process_request(self, request, spider):

FILE: 原创爬虫工具/zok/random_UA/ua_random.py
  class RandomUserAgentMiddleware (line 9) | class RandomUserAgentMiddleware(object):
    method __init__ (line 14) | def __init__(self):
    method from_crawler (line 21) | def from_crawler(cls, crawler):
    method process_request (line 24) | def process_request(self, request, spider):

FILE: 原创爬虫工具/zok/repetition/update_cache.py
  class CacheRedis (line 11) | class CacheRedis(object):
    method get_md5 (line 25) | def get_md5(data):
    method redis_exists (line 29) | def redis_exists(self, member, md5):
    method save_redis (line 42) | def save_redis(self, member, md5):

FILE: 原创爬虫工具/zok/save/to_mysql.py
  class SaveToMysqlBase (line 11) | class SaveToMysqlBase(object):
    method open_spider (line 22) | def open_spider(self, spider):
    method process_item (line 32) | def process_item(self, item, spider):
    method close_spider (line 69) | def close_spider(self, spider):

FILE: 滑动验证码/【w3c】滑块验证/w3c.py
  class W3C (line 12) | class W3C:
    method __init__ (line 19) | def __init__(self):
    method get_img (line 30) | def get_img(self):
    method get_distance (line 57) | def get_distance(self, bg_image, full_image):
    method is_pixel_equal (line 77) | def is_pixel_equal(bg_image, full_image, x, y):
    method split_img (line 101) | def split_img(self, bg_img, css_list):
    method check_code (line 122) | def check_code(self):

FILE: 滑动验证码/【腾讯】滑块验证/discriminate.py
  function get_pos (line 13) | def get_pos(image):

FILE: 滑动验证码/【腾讯】滑块验证/sel.py
  class TX (line 16) | class TX:
    method __init__ (line 17) | def __init__(self):
    method end (line 25) | def end(self):
    method tx_code (line 28) | def tx_code(self):
    method save_img (line 57) | def save_img(bk_block):
    method get_pos (line 68) | def get_pos():
    method get_track (line 93) | def get_track(distance):
    method move_to (line 136) | def move_to(self, index):
    method re_start (line 140) | def re_start(self):

FILE: 项目/HouseScrapy/spiders/house.py
  class HouseSpider (line 8) | class HouseSpider(scrapy.Spider):
    method parse (line 23) | def parse(self, response):
    method parse_url (line 34) | def parse_url(self, response):
    method parse_base (line 49) | def parse_base(self, response):
    method parse_news (line 72) | def parse_news(self, response):
    method parse_info (line 117) | def parse_info(self, response):

FILE: 项目/HouseScrapy/toolkits/items.py
  class HousesItem (line 6) | class HousesItem(scrapy.Item):

FILE: 项目/HouseScrapy/toolkits/make_ua.py
  class RandomUserAgentMiddleware (line 9) | class RandomUserAgentMiddleware(object):
    method __init__ (line 14) | def __init__(self):
    method from_crawler (line 21) | def from_crawler(cls, crawler):
    method process_request (line 24) | def process_request(self, request, spider):

FILE: 项目/HouseScrapy/toolkits/middlewares.py
  class HousescrapySpiderMiddleware (line 11) | class HousescrapySpiderMiddleware(object):
    method from_crawler (line 17) | def from_crawler(cls, crawler):
    method process_spider_input (line 23) | def process_spider_input(self, response, spider):
    method process_spider_output (line 30) | def process_spider_output(self, response, result, spider):
    method process_spider_exception (line 38) | def process_spider_exception(self, response, exception, spider):
    method process_start_requests (line 46) | def process_start_requests(self, start_requests, spider):
    method spider_opened (line 55) | def spider_opened(self, spider):
  class HousescrapyDownloaderMiddleware (line 59) | class HousescrapyDownloaderMiddleware(object):
    method from_crawler (line 65) | def from_crawler(cls, crawler):
    method process_request (line 71) | def process_request(self, request, spider):
    method process_response (line 83) | def process_response(self, request, response, spider):
    method process_exception (line 92) | def process_exception(self, request, exception, spider):
    method spider_opened (line 102) | def spider_opened(self, spider):

FILE: 项目/HouseScrapy/toolkits/pipelines.py
  class HousePipeline (line 8) | class HousePipeline(object):
    method __init__ (line 12) | def __init__(self):
    method process_item (line 16) | def process_item(self, item, spider):

FILE: 项目/HouseScrapy/toolkits/proxies.py
  class ProxyMiddleware (line 15) | class ProxyMiddleware(object):
    method process_request (line 17) | def process_request(self, request, spider):

FILE: 项目/HouseSpider/main.py
  function get_max_page (line 11) | async def get_max_page():
  function get_house_url (line 19) | async def get_house_url(page):
  function main (line 28) | def main():

FILE: 项目/HouseSpider/tool/parse.py
  function parse_total_page (line 9) | async def parse_total_page(result):
  function parse_house_url (line 18) | async def parse_house_url(result, page):

FILE: 项目/HouseSpider/tool/toolkit.py
  function get (line 10) | async def get(url):
  function count_time (line 27) | def count_time(func):

FILE: 项目/MeiTuanArea/MeiTuanArea/items.py
  class AreaItem (line 6) | class AreaItem(scrapy.Item):
  class CoordItem (line 17) | class CoordItem(scrapy.Item):

FILE: 项目/MeiTuanArea/MeiTuanArea/middlewares.py
  class MeituanareaSpiderMiddleware (line 11) | class MeituanareaSpiderMiddleware(object):
    method from_crawler (line 17) | def from_crawler(cls, crawler):
    method process_spider_input (line 23) | def process_spider_input(self, response, spider):
    method process_spider_output (line 30) | def process_spider_output(self, response, result, spider):
    method process_spider_exception (line 38) | def process_spider_exception(self, response, exception, spider):
    method process_start_requests (line 46) | def process_start_requests(self, start_requests, spider):
    method spider_opened (line 55) | def spider_opened(self, spider):
  class MeituanareaDownloaderMiddleware (line 59) | class MeituanareaDownloaderMiddleware(object):
    method from_crawler (line 65) | def from_crawler(cls, crawler):
    method process_request (line 71) | def process_request(self, request, spider):
    method process_response (line 83) | def process_response(self, request, response, spider):
    method process_exception (line 92) | def process_exception(self, request, exception, spider):
    method spider_opened (line 102) | def spider_opened(self, spider):

FILE: 项目/MeiTuanArea/MeiTuanArea/pipelines.py
  class AreaPipeline (line 8) | class AreaPipeline(object):
    method open_spider (line 13) | def open_spider(self, spider):
    method process_item (line 23) | def process_item(self, item, spider):
    method close_spider (line 76) | def close_spider(self, spider):
  class CoordPipeline (line 81) | class CoordPipeline(object):
    method open_spider (line 86) | def open_spider(self, spider):
    method process_item (line 96) | def process_item(self, item, spider):
    method close_spider (line 141) | def close_spider(self, spider):

FILE: 项目/MeiTuanArea/MeiTuanArea/spiders/area_coord.py
  class GetLngSpider (line 11) | class GetLngSpider(scrapy.Spider):
    method start_requests (line 32) | def start_requests(self):
    method get_db (line 59) | def get_db(self, sql):
    method parse (line 77) | def parse(self, response):

FILE: 项目/MeiTuanArea/MeiTuanArea/spiders/areas.py
  class GetAreaSpider (line 10) | class GetAreaSpider(scrapy.Spider):
    method start_requests (line 22) | def start_requests(self):
    method parse_province (line 26) | def parse_province(self, response):
    method parse_area (line 55) | def parse_area(self, response):
    method get_acronym (line 99) | def get_acronym(str_data):

FILE: 项目/MeiTuanArea/初始化.sql
  type `address` (line 24) | CREATE TABLE `address` (
  type `area` (line 42) | CREATE TABLE `area` (
  type `city` (line 61) | CREATE TABLE `city` (
  type `province` (line 79) | CREATE TABLE `province` (
Condensed preview — 226 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,724K chars).
[
  {
    "path": ".gitattributes",
    "chars": 29,
    "preview": "*.js linguist-language=python"
  },
  {
    "path": ".gitignore",
    "chars": 102,
    "preview": ".DS_Store\n*/.DS_Store\n/.idea\n*/.idea\n.vscode\n/.vscode\n*/.vscode\n/__pycache__\n*/__pycache__\n\n.README.md"
  },
  {
    "path": "README.md",
    "chars": 8131,
    "preview": "# <p align=\"center\">Python3 爬虫实战</p>\n\n<br>\n<p align=\"center\">\n    <img src=\"https://zok-blog.oss-cn-hangzhou.aliyuncs.co"
  },
  {
    "path": "【51Job】查岗位/select_job.py",
    "chars": 1838,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-15  Python: 3.7\n\nimport requests\nfrom lxm"
  },
  {
    "path": "【bilibili】自动登录/README.md",
    "chars": 452,
    "preview": "## B站自动登录\n\n本案例根据 `selenium` 实现。\n\n## 效果图\n\n![image](https://csrftoken.oss-cn-beijing.aliyuncs.com/github/blibili-login-rep"
  },
  {
    "path": "【bilibili】自动登录/__init__.py",
    "chars": 65,
    "preview": "#! /usr/bin/env python\n# -*- coding: utf-8 -*-\n# Date: 2020/4/23\n"
  },
  {
    "path": "【bilibili】自动登录/login.py",
    "chars": 6520,
    "preview": "#! /usr/bin/env python\n# -*- coding: utf-8 -*-\n# Date: 2020/4/23\n\nimport time\nimport base64\nimport random\n\nfrom io impor"
  },
  {
    "path": "【bilibili】视频下载/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-09  Python: 3.7\n\n"
  },
  {
    "path": "【bilibili】视频下载/video_download.py",
    "chars": 7440,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-09  Python: 3.7\nimport requests\nimport ur"
  },
  {
    "path": "【双色球】头奖分布/main.py",
    "chars": 3166,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-08  Python: 3.7\nimport requests\nimport js"
  },
  {
    "path": "【壁纸】美女壁纸下载器/bg_down.py",
    "chars": 3548,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-06  Python: 3.7\n\nfrom requests import get"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/参数生成/encryp.js",
    "chars": 1051,
    "preview": "function make() {\n    for (var t = 1 * new Date, n = 0; t === 1 * new Date && n < 200;) n++;\n    return t.toString(16) +"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/参数生成/uid.py",
    "chars": 1592,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-15  Python: 3.7\nimport execjs.runtime_nam"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/旧版/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-12  Python: 3.7\n\n"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/旧版/parse_address_poi.py",
    "chars": 1218,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-03-27  Python: 3.7\n\n\ndef to_base36(value):\n "
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/旧版/parse_font_css.py",
    "chars": 3867,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"362416272@QQ.COM\"\n# Date: 2019/3/25  Python: 3.7.2\n\nimport re\nfrom lxml import e"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/最新版7月/README.md",
    "chars": 234,
    "preview": "# 仅限学术交流\n# 如有冒犯请立即联系作者删除\n\n# 安装\n**`pip3 install fontTools`**\n\n**`pip3 install requests`**\n\n**`pip3 install redis`**\n\n\n# 使"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/最新版7月/font.json",
    "chars": 5445,
    "preview": "{\"FONT_LIST\": [\n    \"\",\n    \"\",\n    \"1\",\n    \"2\",\n    \"3\",\n    \"4\",\n    \"5\",\n    \"6\",\n    \"7\",\n    \"8\",\n    \"9\",\n    \"0\""
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/最新版7月/main.py",
    "chars": 3724,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-25  Python: 3.7\n\n\"\"\"\n调用例子\n实际运用中,导包路径自己填写好"
  },
  {
    "path": "【天眼查】字体加密/tyc.py",
    "chars": 920,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-12-06  Python: 3.7\n\n\"\"\"\n    从网页下载一个字体文件获取对应推"
  },
  {
    "path": "【抖音】无水印视频解析/README.md",
    "chars": 20,
    "preview": "这是一份抖音无水印单个视频的解析代码\n\n"
  },
  {
    "path": "【抖音】无水印视频解析/__init__.py",
    "chars": 81,
    "preview": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/3/6\n\n"
  },
  {
    "path": "【抖音】无水印视频解析/parse.py",
    "chars": 2804,
    "preview": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/3/6\n\nimport re\nimport requests\nimport json\n\n"
  },
  {
    "path": "【拼多多】登陆参数生成/PinDuoDuo.py",
    "chars": 644,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-23  Python: 3.7\n\n\nimport execjs.runtime_n"
  },
  {
    "path": "【拼多多】登陆参数生成/README.md",
    "chars": 59,
    "preview": "# 解密过程参考博客\n\n[博客链接](https://www.zhangkunzhi.com/archives/67)"
  },
  {
    "path": "【拼多多】登陆参数生成/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-23  Python: 3.7\n\n"
  },
  {
    "path": "【拼多多】登陆参数生成/encryp.js",
    "chars": 114248,
    "preview": "// 定义 navigator 与 window\nvar navigator = {};\nvar window = this;  // 等于当前对象\nvar a = {default_key_size: 1024, default_publ"
  },
  {
    "path": "【文书】app查询接口/main.py",
    "chars": 5242,
    "preview": "# __author__ = \"zok\" 362416272@qq.com\n# Date: 2020/7/24 Python:3.7\n\nimport requests\nimport time\nimport random\nimport jso"
  },
  {
    "path": "【淘宝】自动登陆/auto_login_pyppeteer.py",
    "chars": 4556,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-6  Python: 3.7\n\nimport time\nimport random"
  },
  {
    "path": "【淘宝】自动登陆/login_for_sina.py",
    "chars": 2534,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-11  Python: 3.7\n\nfrom selenium import web"
  },
  {
    "path": "其他实战/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-11  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【5173网】自动登录/auto_login.py",
    "chars": 2000,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-26  Python: 3.7\n\nimport re\nimport request"
  },
  {
    "path": "其他实战/【5173网】自动登录/encryp.js",
    "chars": 6879,
    "preview": "var hexcase = 0, b64pad = \"\", chrsz = 8;\n\nfunction hex_md5(b) {\n    return binl2hex(core_md5(str2binl(b), b.length * chr"
  },
  {
    "path": "其他实战/【9377网】自动登录/9377login.py",
    "chars": 1502,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-23  Python: 3.7\n\nimport requests\n\n\nclass "
  },
  {
    "path": "其他实战/【9377网】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-24  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【DNS】自动登录/Login.py",
    "chars": 1482,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-08  Python: 3.7\nimport requests\nimport re"
  },
  {
    "path": "其他实战/【DNS】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【DNS】自动登录/dns.js",
    "chars": 191874,
    "preview": "\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t    /*\n\t     * Loca"
  },
  {
    "path": "其他实战/【GitHub】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-18  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【GitHub】自动登录/login.py",
    "chars": 2007,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-11  Python: 3.7\n\"\"\"\n1. get login html tok"
  },
  {
    "path": "其他实战/【Glidedsky】自动登陆/login.py",
    "chars": 1383,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-25  Python: 3.7\n\nimport requests\nimport r"
  },
  {
    "path": "其他实战/【Python加密库】Demo/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-11  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【Python加密库】Demo/encryption.py",
    "chars": 7150,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-10  Python: 3.7\n\nimport base64\nimport rsa"
  },
  {
    "path": "其他实战/【TCL金融】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【TCL金融】自动登录/auto_login.py",
    "chars": 1710,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-10  Python: 3.7\n\nimport requests\nimport e"
  },
  {
    "path": "其他实战/【TCL金融】自动登录/encryp.js",
    "chars": 17087,
    "preview": "t = {}\n\"use strict\";\nvar s = \"\";\nvar a = 1;\nt.generateKey = \"\";\nt.password = \"\";\nt.getUUID = function () {\n    var e = \""
  },
  {
    "path": "其他实战/【steam】自动登录/execute.js",
    "chars": 44845,
    "preview": "var navigator = {};\r\n// Copyright (c) 2005  Tom Wu\r\n\t\t\t// All Rights Reserved.\r\n\t\t\t// See \"LICENSE\" for details.\r\n\r\n\t\t\t/"
  },
  {
    "path": "其他实战/【steam】自动登录/login.py",
    "chars": 1680,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-12-11  Python: 3.7\r\n\r\nimport execjs\r\nimpor"
  },
  {
    "path": "其他实战/【万创帮】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【万创帮】自动登录/encryp.js",
    "chars": 6671,
    "preview": "function c(x, c) {\n    x[c >> 5] |= 128 << c % 32,\n        x[(c + 64 >>> 9 << 4) + 14] = c;\n    for (var a = 1732584193,"
  },
  {
    "path": "其他实战/【万创帮】自动登录/spider_login.py",
    "chars": 1531,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-03  Python: 3.7\n\nimport json\nimport reque"
  },
  {
    "path": "其他实战/【中关村】自动登录/README.md",
    "chars": 46,
    "preview": "# 解密过程博客说明\n\nhttps://www.zhangkunzhi.com/?p=135"
  },
  {
    "path": "其他实战/【中关村】自动登录/login.py",
    "chars": 2462,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-29  Python: 3.7\n\n\nimport requests\nimport "
  },
  {
    "path": "其他实战/【京东】商品数据爬取/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-12-10  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【京东】商品数据爬取/selenium抓取.py",
    "chars": 1462,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-04-11  Python: 3.7\r\n\r\nfrom selenium import"
  },
  {
    "path": "其他实战/【人人网】自动登录/enc.js",
    "chars": 10750,
    "preview": "function t(e, i, t) {\r\n    this.e = m(e),\r\n        this.d = m(i),\r\n        this.m = m(t),\r\n        this.chunkSize = 2 * "
  },
  {
    "path": "其他实战/【人人网】自动登录/login.py",
    "chars": 2899,
    "preview": "import requests\r\nimport json\r\nimport re\r\nimport execjs.runtime_names\r\n\r\n\r\nclass People:\r\n    def __init__(self, user, pw"
  },
  {
    "path": "其他实战/【企业名片】企业查询/encryp.js",
    "chars": 14449,
    "preview": "function deco(e) {\r\n    u = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\r\n    d = /[\\t\\n\\f\\r ]/g\r\n"
  },
  {
    "path": "其他实战/【企业名片】企业查询/qi_ming.py",
    "chars": 885,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-11-08  Python: 3.7\r\n\r\nimport requests\r\nimp"
  },
  {
    "path": "其他实战/【国鑫所】自动登录/Login.py",
    "chars": 1455,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-10  Python: 3.7\nimport execjs.runtime_nam"
  },
  {
    "path": "其他实战/【国鑫所】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【国鑫所】自动登录/encryp.js",
    "chars": 27630,
    "preview": "var CryptoJS = CryptoJS || function(s, p) {\n    var m = {}\n      , l = m.lib = {}\n      , n = function() {}\n      , r = "
  },
  {
    "path": "其他实战/【天眼查】模拟登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-18  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【天眼查】模拟登录/login.py",
    "chars": 3398,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-13  Python: 3.7\nimport time\n\nfrom lxml im"
  },
  {
    "path": "其他实战/【天翼】登录/login.py",
    "chars": 2564,
    "preview": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/1/23\n\n\nimport requests\nimport re\nimport exec"
  },
  {
    "path": "其他实战/【天翼】登录/v1.js",
    "chars": 88005,
    "preview": "var navigator = {};\nvar window = {};\nvar JSEncryptExports = {};\n! function(exports) {\n    function BigInteger(a, b, c) {"
  },
  {
    "path": "其他实战/【好莱客】参数解析/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【好莱客】参数解析/encryp.js",
    "chars": 25138,
    "preview": "var key = {};\n\nfunction get_key_iv(str) {\n    if (str.length < 32) {\n        str += \"abcdefghijklmnopqrstuvwxyz123456789"
  },
  {
    "path": "其他实战/【好莱客】参数解析/holike.py",
    "chars": 1583,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-07  Python: 3.7\nimport execjs.runtime_nam"
  },
  {
    "path": "其他实战/【小牛在线】登录参数生成/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【小牛在线】登录参数生成/encryp.js",
    "chars": 17746,
    "preview": "var window = this;\n    !function(e) {\n        function t(i) {\n            var e = u\n              , t = e.biDivideByRadi"
  },
  {
    "path": "其他实战/【小牛在线】登录参数生成/make_param.py",
    "chars": 490,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-29  Python: 3.7\n\nimport execjs.runtime_na"
  },
  {
    "path": "其他实战/【开鑫贷】登陆参数生成/KaiXinDai.py",
    "chars": 1270,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-15  Python: 3.7\nimport requests\nimport ex"
  },
  {
    "path": "其他实战/【开鑫贷】登陆参数生成/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【开鑫贷】登陆参数生成/encryp.js",
    "chars": 32771,
    "preview": " var hexcase = 0;\nvar b64pad = \"\";\nvar chrsz = 8;\nfunction pwd_encrypt(a, b) {\n    return encrypt_md5_aes(a, b)\n}\nfuncti"
  },
  {
    "path": "其他实战/【微信】登录参数生成/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-10  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【微信】登录参数生成/encryp.js",
    "chars": 4954,
    "preview": "function e(n, r) {\n    var t = (65535 & n) + (65535 & r)\n    return (n >> 16) + (r >> 16) + (t >> 16) << 16 | 65535 & t\n"
  },
  {
    "path": "其他实战/【微信】登录参数生成/make_pwd.py",
    "chars": 581,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-22  Python: 3.7\nimport execjs.runtime_nam"
  },
  {
    "path": "其他实战/【房价】房价获取/README.md",
    "chars": 90,
    "preview": "# 概述\n这不是一个完整的项目,是测试demo,可以获取区域内在售房产单套价格\n\n\n\n**代码只是测试了一个最新销售小区中的一栋楼的在售楼房价格**\n\n如果需要更完整的,就联系作者"
  },
  {
    "path": "其他实战/【房价】房价获取/main.py",
    "chars": 4072,
    "preview": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/2/21\n\nimport requests\nimport json\nimport os\n"
  },
  {
    "path": "其他实战/【房价】房价获取/util.py",
    "chars": 1882,
    "preview": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/2/21\n\n\nfrom pyDes import *\nimport base64\n\nKE"
  },
  {
    "path": "其他实战/【房天下】自动登录/encryp.js",
    "chars": 15295,
    "preview": "function setMaxDigits(n) {\n    maxDigits = n;\n    ZERO_ARRAY = new Array(maxDigits);\n    for (var t = 0; t < ZERO_ARRAY."
  },
  {
    "path": "其他实战/【房天下】自动登录/login.py",
    "chars": 1331,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-26  Python: 3.7\n\nimport execjs.runtime_na"
  },
  {
    "path": "其他实战/【新浪微博】密码解密/execute.js",
    "chars": 24978,
    "preview": "var navigator = {};\r\nvar sinaSSOEncoder = sinaSSOEncoder || {};\r\n\t\t\t(function() {\r\n\t\t\t\tvar a = 0,\r\n\t\t\t\t\tb = 8;\r\n\t\t\t\tthis"
  },
  {
    "path": "其他实战/【新浪微博】密码解密/main.py",
    "chars": 1603,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-09-26  Python: 3.7\r\n\r\n\r\nimport execjs\r\nimp"
  },
  {
    "path": "其他实战/【时光网】登陆参数生成/encryp.js",
    "chars": 48962,
    "preview": "var CryptoJS = CryptoJS || function (g, w) {\n    var m = {}\n        , q = m.lib = {}\n        , j = q.Base = function () "
  },
  {
    "path": "其他实战/【时光网】登陆参数生成/login.py",
    "chars": 813,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-11  Python: 3.7\nimport execjs.runtime_nam"
  },
  {
    "path": "其他实战/【易通贷】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【易通贷】自动登录/auto_login.py",
    "chars": 1100,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-26  Python: 3.7\n\nimport requests\nimport e"
  },
  {
    "path": "其他实战/【易通贷】自动登录/encryp.js",
    "chars": 7306,
    "preview": "var hexcase = 0;\nvar b64pad = \"\";\nvar chrsz = 8;\n\nfunction hex_md5(s) {\n    return binl2hex(core_md5(str2binl(s), s.leng"
  },
  {
    "path": "其他实战/【汽车之家】参数解密/execute.js",
    "chars": 7038,
    "preview": "var hexcase = 0;\r\nvar b64pad = \"\";\r\nvar chrsz = 8;\r\nfunction hex_md5(a) {\r\n    return binl2hex(core_md5(str2binl(a), a.l"
  },
  {
    "path": "其他实战/【汽车之家】参数解密/main.py",
    "chars": 475,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-08-26  Python: 3.7\r\n\r\nimport execjs\r\n\r\n\r\nd"
  },
  {
    "path": "其他实战/【满级网】自动登录/auto_login.py",
    "chars": 1777,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-26  Python: 3.7\n\nimport requests\nimport b"
  },
  {
    "path": "其他实战/【满级网】自动登录/encryp.js",
    "chars": 95840,
    "preview": "var pubKey = \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC4wHerJc4BSst20Zb07lY9LeZss4OEEhe+SrnLyYy8hGquX/aTQNn+5wnV/+8ierKPg"
  },
  {
    "path": "其他实战/【百度】wap端sig生成/make_sig.py",
    "chars": 998,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2020-01-13  Python: 3.7\n\n\"\"\"\nwap端 sig 参数生成\n应水友需求,"
  },
  {
    "path": "其他实战/【百度】wap端sig生成/v3_update.js",
    "chars": 125118,
    "preview": "window={};\nxxoo={};\nvar _0xe7d2 = [\"words\", \"sigBytes\", \"length\", \"stringify\", \"ceil\", \"slice\", \"random\", \"enc\", \"Hex\", "
  },
  {
    "path": "其他实战/【百度】网页找回密码/demo.py",
    "chars": 5493,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-12-23  Python: 3.7\r\n\r\nimport requests\r\nimp"
  },
  {
    "path": "其他实战/【百度】网页找回密码/dv.js",
    "chars": 18300,
    "preview": "window = document = {};\r\ne = {};\r\nt = {};\r\n\r\nfunction n(e) {\r\n    var t = [[48, 57], [65, 90], [97, 122], [45, 45], [126"
  },
  {
    "path": "其他实战/【百度】网页找回密码/encryp.js",
    "chars": 72751,
    "preview": "window = {};\r\nvar _0xeaa3 = ['_keySchedule', '_invKeySchedule', '_doCryptBlock', '_createHelper', 'moonshadmoonshad', 'A"
  },
  {
    "path": "其他实战/【百度】网页找回密码/header.py",
    "chars": 2010,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-12-23  Python: 3.7\r\n\r\nUA = 'Mozilla/5.0 (W"
  },
  {
    "path": "其他实战/【百度】翻译/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【百度】翻译/translate.js",
    "chars": 2336,
    "preview": "var i = \"320305.131321201\"\n\n\nfunction n(r, o) {\n    for (var t = 0; t < o.length - 2; t += 3) {\n        var e = o.charAt"
  },
  {
    "path": "其他实战/【百度】翻译/translation.py",
    "chars": 2677,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-26  Python: 3.7\n\n# 本代码参考  github作者:CriseL"
  },
  {
    "path": "其他实战/【百度】自动登录/README.md",
    "chars": 54,
    "preview": "# 解密过程参考博客\n\n[博客链接](https://www.zhangkunzhi.com/?p=216)"
  },
  {
    "path": "其他实战/【百度】自动登录/encryp.js",
    "chars": 77421,
    "preview": "// const jsdom = require(\"jsdom\");\n// const { JSDOM } = jsdom;\n// const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</"
  },
  {
    "path": "其他实战/【百度】自动登录/login.py",
    "chars": 599,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-05  Python: 3.7\n\n\"\"\"\n百度登陆参数比较多\n\n这里是密码加密生成"
  },
  {
    "path": "其他实战/【百度街拍】图片下载/get_image.py",
    "chars": 3427,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-08-05  Python: 3.7\r\n\r\nimport requests, tim"
  },
  {
    "path": "其他实战/【移动】登录参数生成/MakeParam.py",
    "chars": 975,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-05  Python: 3.7\n\nimport execjs.runtime_na"
  },
  {
    "path": "其他实战/【移动】登录参数生成/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【移动】登录参数生成/encryp.js",
    "chars": 3416,
    "preview": "function sha1(a) {\n    function b(a, b) {\n        var c = (a & 65535) + (b & 65535);\n        return (a >> 16) + (b >> 16"
  },
  {
    "path": "其他实战/【空中网】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【空中网】自动登录/encryp.js",
    "chars": 1408,
    "preview": "function mk_pwd (str, pwd) {\n    if (pwd == null || pwd.length <= 0) {\n        return null\n    }\n    ;var prand = \"\";\n  "
  },
  {
    "path": "其他实战/【空中网】自动登录/spider_login.py",
    "chars": 2162,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-03  Python: 3.7\nimport re\nimport time\nimp"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/README.md",
    "chars": 517,
    "preview": "```\n.\n└── MeiTuan                              // -------美团-------\n     ├── get_login_cookies.py            // 基于pyppete"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-18  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/create_food_token.py",
    "chars": 2041,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-21  Python: 3.7\n\nimport json, zlib, base6"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/get_login_cookies.py",
    "chars": 1532,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-21  Python: 3.7\nimport asyncio\nimport jso"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_food_comments.py",
    "chars": 2052,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-17  Python: 3.7\n\nimport requests\nimport j"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_food_info.py",
    "chars": 3915,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-18  Python: 3.7\n\n\"\"\"\n解析菜馆信息\n\"\"\"\nimport re"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_hotel_comments.py",
    "chars": 1924,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-10  Python: 3.7\n\n\"\"\"\n解析酒店评论\n\"\"\"\n\nimport r"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_hotel_info.py",
    "chars": 2558,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-05  Python: 3.7\n\n\"\"\"\n解析\n美团酒店店铺的基础信息\n该板块信息"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_play_areas.py",
    "chars": 2077,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-05  Python: 3.7\n\nimport requests\nimport j"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_play_info.py",
    "chars": 2061,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-08  Python: 3.7\n\n\"\"\"\n解析\n美团休闲娱乐商铺信息\n该板块信息隐"
  },
  {
    "path": "其他实战/【试客联盟】登录/execute.js",
    "chars": 19420,
    "preview": "function BarrettMu(m) {\r\n\t\t\t\tthis.modulus = biCopy(m);\r\n\t\t\t\tthis.k = biHighIndex(this.modulus) + 1;\r\n\t\t\t\tvar b2k = new B"
  },
  {
    "path": "其他实战/【试客联盟】登录/login.py",
    "chars": 1304,
    "preview": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-11-23  Python: 3.7\r\n\r\n\r\nimport execjs\r\nimp"
  },
  {
    "path": "其他实战/【谷雨】数字解密/GuYu.py",
    "chars": 1478,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-25  Python: 3.7\n\nimport requests\nimport o"
  },
  {
    "path": "其他实战/【豆瓣】自动登录/DouBan.py",
    "chars": 1607,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2020-01-08  Python: 3.7\n\nimport requests\nimport r"
  },
  {
    "path": "其他实战/【逗游】自动登录/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【逗游】自动登录/douyou.py",
    "chars": 2137,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-01  Python: 3.7\n\nimport js2py\nimport requ"
  },
  {
    "path": "其他实战/【逗游】自动登录/encryp.js",
    "chars": 6701,
    "preview": "/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\n/*  SHA-1 implement"
  },
  {
    "path": "其他实战/【金逸电影】自动注册/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【金逸电影】自动注册/encryp.js",
    "chars": 6094,
    "preview": "(function (global) {\n    \"use strict\";\n    var _Base64 = global.Base64;\n    var version = \"2.1.9\";\n    var buffer;\n    i"
  },
  {
    "path": "其他实战/【金逸电影】自动注册/register.py",
    "chars": 1444,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-04  Python: 3.7\n\nimport requests\nimport e"
  },
  {
    "path": "其他实战/【青海移动】登陆参数生成/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【青海移动】登陆参数生成/encryp.js",
    "chars": 42457,
    "preview": "var CryptoJS = CryptoJS || function (u, l) {\n    var d = {},\n        n = d.lib = {},\n        p = function () {\n        }"
  },
  {
    "path": "其他实战/【青海移动】登陆参数生成/make_param.py",
    "chars": 697,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-12  Python: 3.7\nimport execjs.runtime_nam"
  },
  {
    "path": "其他实战/【餐饮】查询信息/FoodInfo.py",
    "chars": 1382,
    "preview": "# -*- encoding: utf-8 -*-\n# Time    :   2020/01/16\n# Author  :   Zok\n# Email   :   362416272@qq.com\n\nimport requests\nimp"
  },
  {
    "path": "其他实战/【餐饮】查询信息/__init__.py",
    "chars": 82,
    "preview": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/1/17\n\n"
  },
  {
    "path": "其他实战/【餐饮】查询信息/t.html",
    "chars": 38109,
    "preview": "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>北京美团网-北京美食_"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-14  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/config.py",
    "chars": 100,
    "preview": "# Redis数据库地址\nREDIS_HOST = ''\n\n# Redis端口\nREDIS_PORT = 6379\n\n# Redis密码,如无填None\nREDIS_PASSWORD = None\n\n"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/db.py",
    "chars": 2039,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\nimport redis\nimport rando"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/generator.py",
    "chars": 1885,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\n\nimport asyncio\nimport js"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/账号.txt",
    "chars": 23,
    "preview": "账号1|密码1\n账号2|密码2\n账号3|密码3"
  },
  {
    "path": "原创爬虫工具/Cookies/README.md",
    "chars": 66,
    "preview": "# 异步批量登陆美团获取cookies\n\n> pyppeteer 异步批量登陆美团并将cookies储存到redis 的hash表中"
  },
  {
    "path": "原创爬虫工具/Cookies/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-14  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/README.md",
    "chars": 270,
    "preview": "# 工作中经常有这种需求\n> 将采集好的mongodb数据转存到mysql中,或者是redis数据转到mongodb,于是打算封装一个组件便于以后调用\n\n# mysql转存mongo\n1. 在 config 中配置 mongo 与 mysq"
  },
  {
    "path": "原创爬虫工具/DataMigration/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/config.py",
    "chars": 323,
    "preview": "# mongodb链接\nMONGODB_URL = 'mongodb://localhost:27017'\n\n# Redis数据库地址\nREDIS_HOST = ''\n\n# Redis端口\nREDIS_PORT = 6379\n\n# Redi"
  },
  {
    "path": "原创爬虫工具/DataMigration/db/MongoDB.py",
    "chars": 1617,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\nfrom pymongo import Mongo"
  },
  {
    "path": "原创爬虫工具/DataMigration/db/Mysql.py",
    "chars": 1315,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\nimport pymysql\n\nfrom Data"
  },
  {
    "path": "原创爬虫工具/DataMigration/db/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/migration/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/migration/mongo_to_mysql.py",
    "chars": 1913,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-23  Python: 3.7\n\n\nfrom DataMigration.db.M"
  },
  {
    "path": "原创爬虫工具/DataMigration/migration/mysql_to_mongo.py",
    "chars": 1914,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-20  Python: 3.7\n\n\nfrom DataMigration.db.M"
  },
  {
    "path": "原创爬虫工具/Decode/README.md",
    "chars": 99,
    "preview": "# 可拓展式解密器\n> 方便测试可连续转换重制的编码转换器,可灵活拓展解码规则\n\n\n# 说明博客\n\n[**博客地址**](https://www.zhangkunzhi.com/?p=241)\n\n\n"
  },
  {
    "path": "原创爬虫工具/Decode/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-01  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/Decode/translation.py",
    "chars": 2718,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-28  Python: 3.7\n\nimport base64\nimport zli"
  },
  {
    "path": "原创爬虫工具/Jsencrypt/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-29  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/Jsencrypt/make_encrypt.py",
    "chars": 582,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-28  Python: 3.7\n\nimport base64\n\nfrom Cryp"
  },
  {
    "path": "原创爬虫工具/OSS/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-24  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/OSS/push_to_oss.py",
    "chars": 1375,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-24  Python: 3.7\n\n\"\"\"\n将图redis中储存的网络图片链接,并发"
  },
  {
    "path": "原创爬虫工具/Proxy/KDLProxyPool.py",
    "chars": 2298,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-17  Python: 3.7\n\n\"\"\"\n快代理IP池\nhttps://www.k"
  },
  {
    "path": "原创爬虫工具/Proxy/README.md",
    "chars": 1454,
    "preview": "[TOC]\n\n# 安装模块\n\n```bush\npip3 install redis\npip3 install apscheduler\npip3 install reuqest\npip3 install python-dateutil\n```"
  },
  {
    "path": "原创爬虫工具/Proxy/XDLProxyPool.py",
    "chars": 3413,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-09  Python: 3.7\nimport redis\nimport reque"
  },
  {
    "path": "原创爬虫工具/Proxy/XDLProxyUseDemo.py",
    "chars": 1845,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-11  Python: 3.7\n\nimport redis\nimport rand"
  },
  {
    "path": "原创爬虫工具/Proxy/ZhiMaProxyPool.py",
    "chars": 5385,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-2  Python: 3.7\nimport redis\nimport dateti"
  },
  {
    "path": "原创爬虫工具/Proxy/ZhiMaProxyUseDemo.py",
    "chars": 1853,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-07  Python: 3.7\nimport redis\nimport rando"
  },
  {
    "path": "原创爬虫工具/README.md",
    "chars": 2234,
    "preview": "## 工具表\n- [x] [解密工具-可拓展式解密器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Decode)\n- [x] [自动注册-验证短信接收器](https:"
  },
  {
    "path": "原创爬虫工具/Register/MessageCode.py",
    "chars": 4953,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\n\nimport requests\nimport j"
  },
  {
    "path": "原创爬虫工具/Register/README.md",
    "chars": 344,
    "preview": "# 注册短信并发异步接收器\n\n> 基于短信接收平台的异步短信接收器,最大并发上限20,Python3.5+\n\n`pip3 install asyncio`\n`pip3 install aiohttp`\n\n[平台网址](http://www."
  },
  {
    "path": "原创爬虫工具/Register/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/zok/README.md",
    "chars": 1109,
    "preview": "# Zok 组件使用说明\n> by: 362416272@qq.com  自用\n\n### 目录\n- repetition 内容更新处理\n- save 通用持久化存储组件\n- random_UA 随机UA\n- proxies 阿布云代理组件\n"
  },
  {
    "path": "原创爬虫工具/zok/__init__.py",
    "chars": 76,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/get_db/__init__.py",
    "chars": 77,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/16  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/get_db/from_mongodb.py",
    "chars": 327,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-23  Python: 3.7\nfrom pymongo import Mongo"
  },
  {
    "path": "原创爬虫工具/zok/get_db/from_mysql.py",
    "chars": 650,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"\n# Date: 2019/3/7  Python: 3.7\n\nimport pymysql\n\nfrom zok.zok_config import *"
  },
  {
    "path": "原创爬虫工具/zok/proxies/__init__.py",
    "chars": 76,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/proxies/proxies.py",
    "chars": 497,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\n\nimport base64\nfrom zok.zok_config import *\n"
  },
  {
    "path": "原创爬虫工具/zok/random_UA/__init__.py",
    "chars": 76,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/random_UA/fake_useragent.json",
    "chars": 44676,
    "preview": "{\n\t\"browsers\": {\n\t\t\"chrome\": [\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Sa"
  },
  {
    "path": "原创爬虫工具/zok/random_UA/ua_random.py",
    "chars": 690,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\nimport os\n\nfrom fake_useragent import UserAg"
  },
  {
    "path": "原创爬虫工具/zok/repetition/__init__.py",
    "chars": 76,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/repetition/update_cache.py",
    "chars": 1107,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n\nimport redis\nimport hashlib\n\nfrom zok.zok_c"
  },
  {
    "path": "原创爬虫工具/zok/save/__init__.py",
    "chars": 76,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/save/to_mysql.py",
    "chars": 2096,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n\nimport pymysql\n\nfrom zok.zok_config import "
  },
  {
    "path": "原创爬虫工具/zok/zok_config.py",
    "chars": 250,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\nfrom urllib import parse\n\n\nMONGODB_URL = 'mo"
  },
  {
    "path": "滑动验证码/【w3c】滑块验证/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-10  Python: 3.7\n\n"
  },
  {
    "path": "滑动验证码/【w3c】滑块验证/w3c.py",
    "chars": 4301,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-10  Python: 3.7\n\nimport requests\nimport r"
  },
  {
    "path": "滑动验证码/【腾讯】滑块验证/discriminate.py",
    "chars": 1168,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-11  Python: 3.7\n\n\n\"\"\"\npip3 install opencv"
  },
  {
    "path": "滑动验证码/【腾讯】滑块验证/sel.py",
    "chars": 4601,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-28  Python: 3.7\n\nimport requests\nimport t"
  },
  {
    "path": "项目/HouseScrapy/requirements",
    "chars": 48,
    "preview": "scrapy\nscrapy-redis\npymysql\nredis>=3.2.1\npymongo"
  },
  {
    "path": "项目/HouseScrapy/scrapy.cfg",
    "chars": 253,
    "preview": "# Automatically created by: scrapy startproject\n#\n# For more information about the [deploy] section see:\n# https://scrap"
  },
  {
    "path": "项目/HouseScrapy/settings.py",
    "chars": 1148,
    "preview": "# -*- coding: utf-8 -*-\n\n# 阿布云代理 IP\nPROXY_USER = ''\nPROXY_PASS = ''\n\nBOT_NAME = 'HouseScrapy'\n\nSPIDER_MODULES = ['spider"
  },
  {
    "path": "项目/HouseScrapy/spiders/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-15  Python: 3.7\n\n"
  },
  {
    "path": "项目/HouseScrapy/spiders/house.py",
    "chars": 5186,
    "preview": "# -*- coding: utf-8 -*-\nimport scrapy\n\nfrom settings import HOST\nfrom toolkits.items import HousesItem\n\n\nclass HouseSpid"
  },
  {
    "path": "项目/HouseScrapy/toolkits/__init__.py",
    "chars": 96,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-15  Python: 3.7\n\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/fake_useragent.json",
    "chars": 44676,
    "preview": "{\n\t\"browsers\": {\n\t\t\"chrome\": [\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Sa"
  },
  {
    "path": "项目/HouseScrapy/toolkits/items.py",
    "chars": 98,
    "preview": "# -*- coding: utf-8 -*-\n\nimport scrapy\n\n\nclass HousesItem(scrapy.Item):\n    data = scrapy.Field()\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/make_ua.py",
    "chars": 672,
    "preview": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\nimport os\n\nfrom fake_useragent import UserAg"
  }
]

// ... and 26 more files (download for full content)

About this extraction

This page contains the full source code of the wkunzhi/SpiderCrackDemo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 226 files (1.5 MB), approximately 532.5k tokens, and a symbol index with 1416 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!