├── .gitignore ├── .travis.yml ├── API.md ├── LICENSE.md ├── MANIFEST.in ├── README.md ├── requirements.txt ├── setup.py ├── test ├── __init__.py └── test_wencai.py └── wencai ├── __init__.py ├── core ├── __init__.py ├── cons.py ├── content.py ├── cookies.py ├── crawler.py ├── event.py └── session.py └── js ├── __init__.py └── hexin.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | .idea 3 | .vscode 4 | __pycache__/ 5 | .__pycache__/ 6 | logs 7 | celerybeat-schedule.db 8 | .env 9 | local_settings.py 10 | migrations/ 11 | *.pyc 12 | .cache/ 13 | */.cache/ 14 | test/temp/ 15 | baidu-api.ini 16 | connection.py 17 | */__pycache__ 18 | 19 | 20 | venv 21 | __pycache__/ 22 | wencai.egg-info/ 23 | dist/ 24 | build/ 25 | cookies.json 26 | zoo.txt 27 | upload.sh 28 | 29 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | script: true -------------------------------------------------------------------------------- /API.md: -------------------------------------------------------------------------------- 1 | ## Wencai-API 2 | 3 | #### 问财API目前需要接入chrome和chromedriver配合使用,请下载[chrome](https://www.google.cn/intl/zh-CN/chrome/)和对应的[chromedriver](https://npm.taobao.org/mirrors/chromedriver/)版本。 4 | 5 | #### Start 6 | 7 | ```python 8 | import wencai as wc 9 | ``` 10 | 11 | #### 初始化 12 | 13 | ```python 14 | wc.set_variable(cn_col=True, execute_path='/Users/allen/Downloads/chromedriver') 15 | ``` 16 | 17 | **参数说明:** 18 | 19 | - cn_col:True返回中文字段,False返回英文字段,默认false 20 | - execute_path:chrome_driver路径,None表示chrome_driver在根路径,默认None 21 | 22 | #### wc.get_scrape_report(回测一下) 23 | 24 | ```python 25 | r = wc.get_scrape_report(query='上证指数上穿10日均线', 26 | start_date='2019-10-01', 27 | end_date='2019-10-19', 28 | period='1,2,3,4', 29 | benchmark='hs000300') 30 | print(r.report_data) # 报告评级 31 | print(r.backtest_data) # 回测分析 32 | print(r.condition_data) # 准确回测参数 33 | print(r.history_detail(period='1')) # 历史明细查询 34 | ``` 35 | 36 | **参数说明:** 37 | 38 | - query:输入回测参数 39 | - stime:开始日期 40 | - etime:结束日期 41 | - period:持股周期 42 | - benchmark:基准指数 43 | 44 | **Example:** 45 | 46 | > 平均区间涨跌幅 盈亏比 次日开盘平均涨跌幅 持有期 次日高开概率 同期基准 基准上涨概率 最大涨跌幅 最小涨跌幅 上涨概率 47 | > 48 | > 0 0.000452 1.049851 0.000191 1 0.389201 0 0 0.101504 -0.100000 0.467942 49 | > 50 | > 1 0.002819 1.248264 0.000552 2 0.396705 0 0 0.210123 -0.108460 0.494297 51 | > 52 | > 2 0.005292 1.425027 0.001694 3 0.425254 0 0 0.330961 -0.117544 0.526851 53 | > 54 | > 3 0.005753 1.406133 0.002266 4 0.435000 0 0 0.377018 -0.124862 0.508333 55 | 56 | #### wc.get_strategy(策略回测) 57 | 58 | ```python 59 | r = wc.get_strategy(query='非停牌;非st;今日振幅小于5%;量比小于1;涨跌幅大于-5%小于1%;流通市值小于20亿;市盈率大于25小于80;主力控盘比例从大到小', 60 | start_date='2018-10-09', 61 | end_date='2019-07-16', 62 | period='1', 63 | fall_income=1, 64 | lower_income=5, 65 | upper_income=9, 66 | day_buy_stock_num=1, 67 | stock_hold=2) 68 | print(r.profit_data) # 累计收益数据 69 | print(r.backtest_data) # 报告评级 70 | print(r.condition_data) # 准确回测语句 71 | print(r.history_detail(period='1')) # 历史明细查询 72 | print(r.history_pick(trade_date='2019-07-16', hold_num=1)) # 策略选股 73 | ``` 74 | 75 | **参数说明:** 76 | 77 | - query:输入回测参数 78 | - stime:开始日期 79 | - etime:结束日期 80 | - period:持有期 81 | - upper_income:止盈收益持有率 82 | - fall_income:止盈收益回落率 83 | - lower_income:止损收益率 84 | - day_buy_stock_num:单日买入只 85 | - stock_hold:持股上限 86 | 87 | **Example:** 88 | 89 | > 涨跌幅 当日收盘价(元) dde大单净量(%) 股本规模 股票代码 股票市场 股票名称 换手率 90 | > 91 | > 0 -0.10152284 9.84 -0.11978362 小盘股 002599 SZ 盛通股份 0.63294771 92 | 93 | #### wc.get_event_evaluate(事件评级) 94 | 95 | ```python 96 | r = wc.get_event_evaluate(end_date='2019-07-16', 97 | index_code="1a0001", 98 | period='1', 99 | query="上证指数上穿10日均线", 100 | start_date="2016-05-16") 101 | print(r.report_data) 102 | print(r.event_list) 103 | ``` 104 | 105 | **参数说明:** 106 | 107 | - query:输入回测参数 108 | - start_date:开始日期 109 | - end_date:结束日期 110 | - period:持有期 111 | - index_code:对应标的 112 | 113 | **Example:** 114 | 115 | > {'最大上涨概率': 9.506849315068482e-05, '最优平均涨跌幅': 0.5753424657534246, '历史发生次数': 73} 116 | 117 | >次日涨跌幅 事件日期 涉及标的 118 | > 119 | >0 -0.02580 20190705 上证指数 120 | > 121 | >1 0.00088 20190617 上证指数 122 | > 123 | >2 -0.00558 20190611 上证指数 124 | > 125 | >3 0.00165 20190528 上证指数 126 | > 127 | >4 -0.00491 20190521 上证指数 128 | > 129 | >5 0.00580 20190515 上证指数 -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 GraySliver 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include wencai/js/hexin.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wencai 2 | 3 | [![PyPi Version](https://img.shields.io/pypi/v/wencai.svg)](https://pypi.org/project/wencai/)[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)[![Linux](https://travis-ci.com/GraySilver/wencai.svg?branch=master)](https://travis-ci.org/GraySilver/wencai) 4 | 5 | wencai是i问财的策略回测接口的Pythonic工具包,满足量化爱好者和数据分析师在量化方面的需求。 6 | 7 | [i问财](http://www.iwencai.net/)是同花顺旗下专业的机器人智能选股问答平台,致力于为投资者提供宏观数据、新闻资讯、A股、港美股、新三板、基金等各类理财方案。 8 | 9 | ![](https://graysliver.oss-cn-shenzhen.aliyuncs.com/iwcpage.jpg) 10 | 11 | ![](https://graysliver.oss-cn-shenzhen.aliyuncs.com/iwc_strategy.JPG) 12 | 13 | ### Latest Version 14 | 15 | ``` 16 | wencai==0.2.6 17 | ``` 18 | 19 | ### Dependencies 20 | 21 | - Python 2.x/3.x(当前测试使用Python3.5.5) 22 | - requests>=2.14.2 23 | - beautifulsoup4>=4.5.1 24 | - PyExecJS>=1.5.1 25 | 26 | ### Installation 27 | 28 | - 方式1:pip install wencai 29 | - 方式2:git clone 此github项目,然后进入根目录后进行```python setup.py install``` 30 | - 方式3:访问下载安装 31 | 32 | ### Upgrade 33 | 34 | ```shell 35 | pip install wencai --upgrade 36 | ``` 37 | 38 | ### API 39 | 40 | 具体API接口请点击这里:[Wiki](https://github.com/GraySilver/wencai/blob/master/API.md) 41 | 42 | ### Quick Start 43 | 44 | **Example 1**. 获取回测分析 45 | 46 | ```python 47 | import wencai as wc 48 | 49 | # 若需中文字段则cn_col=True,chromedriver路径不在根目录下需指定execute_path 50 | wc.set_variable(cn_col=True) 51 | 52 | strategy = wc.get_scrape_report(query='上证指数上穿10日均线', 53 | start_date='2019-10-01', 54 | end_date='2019-10-19', 55 | period='1,2,3,4', 56 | benchmark='hs000300') 57 | 58 | print(strategy.backtest_data) 59 | ``` 60 | 61 | > 平均区间涨跌幅 盈亏比 次日开盘平均涨跌幅 持有期 次日高开概率 同期基准 基准上涨概率 最大涨跌幅 最小涨跌幅 上涨概率 62 | > 63 | > 0 0.000452 1.049851 0.000191 1 0.389201 0 0 0.101504 -0.100000 0.467942 64 | > 65 | > 1 0.002819 1.248264 0.000552 2 0.396705 0 0 0.210123 -0.108460 0.494297 66 | > 67 | > 2 0.005292 1.425027 0.001694 3 0.425254 0 0 0.330961 -0.117544 0.526851 68 | > 69 | > 3 0.005753 1.406133 0.002266 4 0.435000 0 0 0.377018 -0.124862 0.508333 70 | 71 | 72 | 73 | **Example 2**.获取策略 74 | 75 | ```python 76 | import wencai as wc 77 | 78 | # 若需中文字段则cn_col=True,chromedriver路径不在根目录下需指定execute_path 79 | wc.set_variable(cn_col=True) 80 | 81 | transaction = wc..get_strategy(query='非停牌;非st;今日振幅小于5%;量比小于1;涨跌幅大于-5%小于1%;流通市值小于20亿;市盈率大于25小于80;主力控盘比例从大到小', 82 | start_date='2018-10-09', 83 | end_date='2019-07-16', 84 | period='1', 85 | fall_income=1, 86 | lower_income=5, 87 | upper_income=9, 88 | day_buy_stock_num=1, 89 | stock_hold=2) 90 | 91 | print(transaction.history_pick(trade_date='2019-07-16', hold_num=1)) 92 | ``` 93 | 94 | > 涨跌幅 当日收盘价(元) dde大单净量(%) 股本规模 股票代码 股票市场 股票名称 换手率 95 | > 96 | > 0 -0.10152284 9.84 -0.11978362 小盘股 002599 SZ 盛通股份 0.63294771 97 | 98 | **Example 3**.获取事件评测 99 | 100 | ```python 101 | import wencai as wc 102 | 103 | # 若需中文字段则cn_col=True,chromedriver路径不在根目录下需指定execute_path 104 | wc.set_variable(cn_col=True) 105 | 106 | report = wc.get_event_evaluate(end_date='2019-07-16', 107 | index_code="1a0001", 108 | period='1', 109 | query="上证指数上穿10日均线", 110 | start_date="2016-05-16") 111 | print(report.event_list) 112 | print(report.report_data) 113 | ``` 114 | 115 | > {'最大上涨概率': 9.506849315068482e-05, '最优平均涨跌幅': 0.5753424657534246, '历史发生次数': 73} 116 | 117 | >次日涨跌幅 事件日期 涉及标的 118 | > 119 | >0 -0.02580 20190705 上证指数 120 | > 121 | >1 0.00088 20190617 上证指数 122 | > 123 | >2 -0.00558 20190611 上证指数 124 | > 125 | >3 0.00165 20190528 上证指数 126 | > 127 | >4 -0.00491 20190521 上证指数 128 | > 129 | >5 0.00580 20190515 上证指数 130 | 131 | **Example 4**.一键搜索(目前仅能获取首页内容) 132 | 133 | ```python 134 | import wencai as wc 135 | 136 | result = wc.search(query="当前热股") 137 | print(result) 138 | ``` 139 | 140 | > 开盘价 成交量 振幅 收盘价 最低价 最新价 最高价 股票代码 股票简称 141 | > 142 | > 0 7.21 85040786.00 19.556 8.43 7.18 8.43 8.59 300320.SZ 海达股份 143 | > 144 | > 1 3.67 77019302.00 10.354 4.04 3.66 4.04 4.04 000420.SZ 吉林化纤 145 | > 146 | > 2 12.23 59261312.00 11.318 13.61 12.21 13.61 13.61 002386.SZ 天原股份 147 | > 148 | > 3 11.10 44611374.00 7.050 11.86 11.10 11.86 11.86 000848.SZ 承德露露 149 | > 150 | > 4 9.30 29671324.00 11.915 10.34 9.22 10.34 10.34 605167.SH 利柏特 151 | > 152 | > 5 24.55 12190900.00 6.571 26.11 24.55 26.11 26.11 002895.SZ 川恒股份 153 | > 154 | > 6 35.36 35961355.00 14.455 38.57 34.77 38.57 39.88 300087.SZ 荃银高科 155 | > 156 | > 7 20.15 12087816.00 11.204 22.08 20.11 22.08 22.39 603855.SH 华荣股份 157 | > 158 | > 8 21.00 13255236.00 20.170 23.02 20.70 23.02 24.98 300602.SZ 飞荣达 159 | > 160 | > 9 23.41 19325582.00 10.612 25.24 23.21 25.24 25.69 002741.SZ 光华科技 161 | 162 | **Example 5**.使用代理机制 163 | 164 | ```python 165 | import wencai as wc 166 | 167 | # 多个代理池 168 | proxies = [{'http': 'http://localhost:1087', 'https': 'http://localhost:1087'}, 169 | {'http': 'http://localhost:1088', 'https': 'http://localhost:1088'}] 170 | 171 | # 单个代理池 172 | proxies = {'http': 'http://localhost:1087', 'https': 'http://localhost:1087'} 173 | 174 | wc.set_variable(cn_col=True, proxies=proxies) 175 | 176 | r = wc.search('当前热股') 177 | print(r) 178 | 179 | ``` 180 | 181 | ### Change Logs 182 | 183 | ### 0.2.6 2021/09/11 184 | 185 | - 修复pip包无hexin.js问题 186 | 187 | ### 0.2.5 2021/08/13 188 | 189 | - 更新Cookies机制; 190 | - 新增分时数据接口。 191 | - 新增一键搜索(目前仅能获取首页内容) 192 | - 新增代理机制 193 | 194 | ### 0.2.2 2021/04/08 195 | 196 | - 正常测试接口是否可用; 197 | - 优化报错会直接返回接口结果; 198 | - cookies缓存带有时效性。 199 | 200 | ### 0.2.0 2021/01/07 201 | 202 | - 正常测试接口是否可用; 203 | - 补充说明调用逻辑。 204 | 205 | ### 0.2.0 2019/10/19 206 | 207 | - 重构问财接口调用逻辑; 208 | - 新增chromedriver调用接口; 209 | - 新增【事件评测】接口; 210 | 211 | ### 0.1.5 2018/3/5 212 | 213 | - 修正:调用问财策略接口失败问题 214 | 215 | ### 0.1.3 2017/11/27 216 | 217 | - 创建第一个版本 218 | 219 | ### Others 220 | 此工具包不得用于任何商业目的,仅可用于爱好量化交易者分享学习和技术讨论。 221 | 222 | Welcome to Star and Follow~ 223 | 224 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.14.2 2 | #pandas==0.18.1 3 | beautifulsoup4>=4.5.1 4 | #selenium==3.141 5 | PyExecJS>=1.5.1 -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | import os 4 | from setuptools import setup, find_packages 5 | 6 | if os.path.exists("requirements.txt"): 7 | install_requires = open("requirements.txt").read().split("\n") 8 | else: 9 | install_requires = [] 10 | 11 | setup( 12 | name='wencai', 13 | version='0.2.6', 14 | author='allen yang', 15 | author_email='allenyzx@163.com', 16 | url='https://upload.pypi.org/allenyzx/', 17 | description='this is a wencai crawler to get message', 18 | packages=find_packages(), 19 | install_requires=install_requires, 20 | license='MIT', 21 | classifiers=[ 22 | "Environment :: Web Environment", 23 | "Intended Audience :: Developers", 24 | "Operating System :: OS Independent", 25 | "Topic :: Text Processing :: Indexing", 26 | "Topic :: Utilities", 27 | "Topic :: Internet", 28 | "Topic :: Software Development :: Libraries :: Python Modules", 29 | "Programming Language :: Python :: 3.5", 30 | ], 31 | zip_safe=False, 32 | include_package_data=True, 33 | 34 | ) 35 | -------------------------------------------------------------------------------- /test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GraySilver/wencai/83ec0b65189e9a7079524bfbca40eccbfec32022/test/__init__.py -------------------------------------------------------------------------------- /test/test_wencai.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import wencai as wc 3 | 4 | 5 | class TestWenCai(unittest.TestCase): 6 | 7 | def setUp(self) -> None: 8 | wc.set_variable(cn_col=True, execute_path='./chromedriver') 9 | 10 | def test_get_scrape_report(self): 11 | r = wc.get_scrape_report(query='上证指数上穿10日均线', 12 | start_date='2019-10-01', 13 | end_date='2019-10-19', 14 | period='1,2,3,4', 15 | benchmark='hs000300') 16 | 17 | print(r.report_data) 18 | print(r.backtest_data) 19 | print(r.condition_data) 20 | print(r.history_detail(period='1')) 21 | 22 | def test_get_strategy(self): 23 | r = wc.get_strategy(query='非停牌;非st;今日振幅小于5%;量比小于1;涨跌幅大于-5%小于1%;流通市值小于20亿;市盈率大于25小于80;主力控盘比例从大到小', 24 | start_date='2018-10-09', 25 | end_date='2019-07-16', 26 | period='1', 27 | fall_income=1, 28 | lower_income=5, 29 | upper_income=9, 30 | day_buy_stock_num=1, 31 | stock_hold=2) 32 | print(r.profit_data) 33 | print(r.backtest_data) 34 | print(r.condition_data) 35 | print(r.history_detail(period='1')) 36 | print(r.history_pick(trade_date='2019-07-16', hold_num=1)) 37 | 38 | def test_get_event_evaluate(self): 39 | r = wc.get_event_evaluate(end_date='2019-07-16', 40 | index_code="1a0001", 41 | period='1', 42 | query="上证指数上穿10日均线", 43 | start_date="2016-05-16") 44 | print(r.report_data) 45 | print(r.event_list) 46 | 47 | 48 | if __name__ == '__main__': 49 | unittest.main() 50 | -------------------------------------------------------------------------------- /wencai/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import sys 3 | import os 4 | from wencai.core.event import (get_scrape_report, 5 | set_variable, 6 | get_strategy, 7 | get_event_evaluate, 8 | get_lastjs, 9 | search 10 | ) 11 | -------------------------------------------------------------------------------- /wencai/core/__init__.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | 3 | pd.set_option('display.max_columns', 2000) 4 | pd.set_option('display.width', 2000) 5 | -------------------------------------------------------------------------------- /wencai/core/cons.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | 4 | WENCAI_LOGIN_URL = { 5 | "scrape_transaction": 'http://www.iwencai.com/traceback/strategy/transaction', 6 | "scrape_report": 'http://www.iwencai.com/traceback/strategy/submit', 7 | 'strategy': 'http://www.iwencai.com/traceback/strategy/submit', 8 | "search": "http://www.iwencai.com/data-robot/extract-new", 9 | 'recommend_strategy': 'http://www.iwencai.com/traceback/list/get-strategy', 10 | 'backtest': 'http://backtest.10jqka.com.cn/backtest/app.html#/backtest', 11 | 'lastjs':'http://x.10jqka.com.cn/stockpick?tid=stockpick&ts=1&qs=pc_~soniu~stock~stock~znxg~topbar&allow_redirect=false&zhineng=opened' 12 | } 13 | 14 | WENCAI_CRAWLER_URL = { 15 | 'history_detail': 'http://backtest.10jqka.com.cn/backtestonce/historydetail?sort_by=desc&id={backtest_id}&start_date={start_date}&end_date={end_date}&period={period}', 16 | "backtest": "http://backtest.10jqka.com.cn/backtestonce/backtest", 17 | "yieldbacktest": "http://backtest.10jqka.com.cn/tradebacktest/yieldbacktest", 18 | "history_pick": 'http://backtest.10jqka.com.cn/tradebacktest/historypick?query={query}&hold_num={hold_num}&trade_date={trade_date}', 19 | 'eventbacktest': 'http://backtest.10jqka.com.cn/eventbacktest/backtest', 20 | 'lastjs':'http://d.10jqka.com.cn/v2/time/{}/last.js', 21 | 'search': 'http://x.10jqka.com.cn/unifiedwap/unified-wap/v2/result/get-robot-data' 22 | 23 | } 24 | 25 | WENCAI_HEADERS = { 26 | 'backtest': { 27 | 'Host': "backtest.10jqka.com.cn", 28 | 'Origin': "http://backtest.10jqka.com.cn", 29 | "Referer": "http://backtest.10jqka.com.cn/backtest/app.html", 30 | }, 31 | 'lastjs':{ 32 | 'Host': "d.10jqka.com.cn", 33 | # 'Origin': "http://backtest.10jqka.com.cn", 34 | "Referer": "http://x.10jqka.com.cn/", 35 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /wencai/core/content.py: -------------------------------------------------------------------------------- 1 | import re 2 | import json 3 | import pandas as pd 4 | from wencai.core.cons import WENCAI_CRAWLER_URL 5 | 6 | pd.set_option('display.max_rows', 2000) 7 | 8 | 9 | class BackTest: 10 | 11 | def __init__(self, content, cn_col, start_date, end_date, session): 12 | if content['errorcode'] == 1: 13 | raise ValueError(content['errormsg']) 14 | self.content = content['result'] 15 | self.cn_col = cn_col 16 | self.start_date = start_date 17 | self.end_date = end_date 18 | self.session = session 19 | 20 | @property 21 | def backtest_data(self): 22 | _ = {'daySaleStrategy': '持有期', 23 | 'averageChangeRate': '平均区间涨跌幅', 24 | 'hs300AverageIncome': '同期基准', 25 | 'highProbability': '次日高开概率', 26 | 'averageOpenIncome': '次日开盘平均涨跌幅', 27 | 'maxChangeRate': '最大涨跌幅', 28 | 'minChangeRate': '最小涨跌幅', 29 | 'averageLossRatio': '盈亏比', 30 | "winRate": '上涨概率', 31 | "hs300WinRate": '基准上涨概率', 32 | 'changeRateGroup': '涨跌分布图'} 33 | data = self.content['backtestData'] 34 | data = pd.DataFrame().from_dict(data) 35 | if 'changeRateGroup' in data.columns: 36 | del data['changeRateGroup'] 37 | if self.cn_col: 38 | data = data.rename(columns=_) 39 | return data 40 | 41 | @property 42 | def condition_data(self): 43 | return self.content['conditionData'] 44 | 45 | @property 46 | def report_data(self): 47 | data = self.content['reportData'] 48 | _ = { 49 | 'historyHappenCount': '历史发生次数', 50 | 'maxAverageChangeRate': '最优平均涨跌幅', 51 | 'maxWinRate': '最大上涨概率' 52 | } 53 | response = {'maxAverageChangeRate': data['maxAverageChangeRate'][0], 54 | 'maxWinRate': data['maxWinRate'][0], 55 | 'historyHappenCount': data['historyHappenCount']} 56 | if self.cn_col: 57 | response = {_[k]: v for k, v in response.items()} 58 | 59 | return response 60 | 61 | def history_detail(self, period, start_date=None, end_date=None): 62 | if start_date is None: 63 | start_date = self.start_date 64 | 65 | if end_date is None: 66 | end_date = self.end_date 67 | 68 | url = WENCAI_CRAWLER_URL['history_detail'].format(backtest_id=self.content['id'], 69 | start_date=start_date, 70 | end_date=str(end_date), 71 | period=str(period)) 72 | context = self.session.get_result(url=url, source='history_detail').text 73 | context = re.findall('{"result":(.*?),"errorcode":0,"errormsg":""}', context)[0] 74 | data = json.loads(context) 75 | data = pd.DataFrame().from_dict(data) 76 | _ = { 77 | 'stock_code': '股票代码', 78 | 'stock_name': '股票简称', 79 | "start_date": "起始时间", 80 | "end_date": "终止时间", 81 | "start_price": "起始价", 82 | "end_price": "终止价", 83 | "change_rate": "区间涨跌幅", 84 | "stock_market": "股票市场" 85 | } 86 | if self.cn_col: 87 | data = data.rename(columns=_) 88 | return data 89 | 90 | 91 | class YieldBackTest: 92 | def __init__(self, content, cn_col, query, start_date, end_date, session): 93 | self.content = content['result'] 94 | self.cn_col = cn_col 95 | self.query = query 96 | self.start_date = start_date 97 | self.end_date = end_date 98 | self.session =session 99 | 100 | @property 101 | def profit_data(self): 102 | hq300_data = self.content['Hq300Data'] 103 | profit_data = self.content['profitData'][0] 104 | hq300_data = [{'date': i['timestamp'], 'benchmark_value': i['value']} for i in hq300_data] 105 | profit_data = [{'date': i[0], 'profit_value': i[1]} for i in profit_data['everydayIncome']] 106 | hq300_data = pd.DataFrame().from_dict(hq300_data) 107 | profit_data = pd.DataFrame().from_dict(profit_data) 108 | profit_data = pd.merge(left=hq300_data, right=profit_data, how='left', on='date') 109 | profit_data = profit_data.loc[:, ['date', 'benchmark_value', 'profit_value']] 110 | return profit_data 111 | 112 | @property 113 | def condition_data(self): 114 | return self.content['conditionData'] 115 | 116 | @property 117 | def backtest_data(self): 118 | data = self.content['backtestData'][0] 119 | if 'profitVolatility' in data: 120 | del data['profitVolatility'] 121 | 122 | _ = { 123 | 'annualYield': '预期年化收益率', 124 | 'averageIncome': '单次收益平均值', 125 | 'averageLossRatio': '盈亏比', 126 | 'daySaleStrategy': '持有期', 127 | 'maxDrawDown': '最大回撤', 128 | 'maxIncome': '单次最大收益值', 129 | 'minIncome': '单次收益最小值', 130 | 'profitVolatility': '', 131 | 'sharpeRatio': '夏普比率', 132 | 'totalTradeTimes': '交易次数', 133 | 'weekWinRate': '周战胜率', 134 | 'winRate': '成功率' 135 | } 136 | if self.cn_col: 137 | data = {_[k]: v for k, v in data.items()} 138 | return data 139 | 140 | @property 141 | def score_data(self): 142 | data = self.content['scoreData'] 143 | _ = { 144 | 'annualYield': '绝对收益', 145 | 'maxDrawDown': '抗风险能力', 146 | 'profitVolatility': '稳定性', 147 | 'score': '综合得分', 148 | 'winRate': '选股能力', 149 | 'averageLossRatio': '盈利能力', 150 | 'rank': '排名' 151 | } 152 | for i in ['date', 'count']: 153 | if i in data: 154 | del data[i] 155 | 156 | if self.cn_col: 157 | data = {_[k]: v for k, v in data.items()} 158 | return data 159 | 160 | def history_pick(self, trade_date, hold_num=1): 161 | url = WENCAI_CRAWLER_URL['history_pick'].format(trade_date=trade_date, hold_num=hold_num, query=self.query) 162 | context = self.session.get_result(url, source='history_detail').text 163 | context = re.findall('{"result":(.*?),"errorcode":0,"errormsg":""}', context)[0] 164 | data = json.loads(context)['stocks'] 165 | data = pd.DataFrame().from_dict(data) 166 | 167 | _ = { 168 | 'change_rate': '涨跌幅', 169 | 'close_price': '当日收盘价(元)', 170 | 'dde': 'dde大单净量(%)', 171 | "equit_scale": "股本规模", 172 | "turnover_rate": "换手率", 173 | "stock_code": "股票代码", 174 | "stock_market": "股票市场", 175 | "stock_name": "股票名称", 176 | } 177 | if self.cn_col: 178 | data = data.rename(columns=_) 179 | return data 180 | 181 | def history_detail(self, period, start_date=None, end_date=None): 182 | 183 | if start_date is None: 184 | start_date = self.start_date 185 | 186 | if end_date is None: 187 | end_date = self.end_date 188 | 189 | url = WENCAI_CRAWLER_URL['history_detail'].format(backtest_id=self.content['id'], start_date=start_date, 190 | end_date=end_date, period=period) 191 | context = self.session.get_result(url, source='history_detail').text 192 | context = re.findall('{"result":(.*?),"errorcode":0,"errormsg":""}', context)[0] 193 | data = json.loads(context) 194 | data = pd.DataFrame().from_dict(data) 195 | _ = { 196 | 'stock_code': '股票代码', 197 | 'stock_name': '股票简称', 198 | "start_date": "起始时间", 199 | "end_date": "终止时间", 200 | "start_price": "起始价", 201 | "end_price": "终止价", 202 | "change_rate": "区间涨跌幅", 203 | "stock_market": "股票市场" 204 | } 205 | if self.cn_col: 206 | data = data.rename(columns=_) 207 | return data 208 | 209 | 210 | class EventBackTest: 211 | def __init__(self, content, cn_col): 212 | self.cn_col = cn_col 213 | self.content = content['result'] 214 | 215 | @property 216 | def event_list(self): 217 | data = self.content['data'] 218 | data = pd.DataFrame().from_dict(data) 219 | 220 | _ = { 221 | '1day': '次日涨跌幅', 222 | 'date': '事件日期', 223 | 'index_code': '涉及标的' 224 | } 225 | if self.cn_col: 226 | data = data.rename(columns=_) 227 | return data 228 | 229 | @property 230 | def report_data(self): 231 | data = self.content['reportData'] 232 | _ = { 233 | 'maxChangeRate': '最大上涨概率', 234 | 'maxTotalCount': '历史发生次数', 235 | 'maxWinRate': '最优平均涨跌幅' 236 | } 237 | 238 | if self.cn_col: 239 | data = {_[k]: v for k, v in data.items()} 240 | return data 241 | 242 | class LastJs: 243 | def __init__(self, content, code): 244 | index_str = 'quotebridge_v2_time_{}_last'.format(code) 245 | content = re.findall( index_str + '(.*)', content)[0].replace('(','').replace(')','') 246 | self.content = json.loads(content)[code] 247 | 248 | @property 249 | def get_data(self): 250 | data = self.content['data'] 251 | data = [i.split(',') for i in data.split(';')] 252 | data = pd.DataFrame().from_records(data) 253 | return data -------------------------------------------------------------------------------- /wencai/core/cookies.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import execjs 4 | import datetime as dt 5 | 6 | 7 | class WencaiCookie: 8 | 9 | def __init__(self): 10 | self.json_path = os.path.dirname(__file__) + '/cookies.json' 11 | 12 | def getHeXinVByHttp(self): 13 | with open(os.path.dirname(os.path.dirname(__file__)) + '/js/hexin.js', 'r') as f: 14 | jscontent = f.read() 15 | context = execjs.compile(jscontent) 16 | return context.call("v") 17 | 18 | def setHexinByJson(self, source, cookies=None): 19 | if cookies is None: cookies = dict() 20 | henxin_v = self.getHeXinVByHttp() 21 | cookies[source] = henxin_v 22 | cookies['expire_time'] = dt.datetime.today().strftime('%Y-%m-%d %H:%M:%S') 23 | with open(self.json_path, 'w') as f: 24 | json.dump(cookies, f) 25 | return henxin_v 26 | 27 | def is_expire(self, expire_time, days=3): 28 | delta = dt.datetime.today() - dt.datetime.strptime(expire_time, '%Y-%m-%d %H:%M:%S') 29 | if delta.days >= days: 30 | return True 31 | else: 32 | return False 33 | 34 | def getHexinVByJson(self, source): 35 | json_path = os.path.dirname(__file__) + '/cookies.json' 36 | if os.path.exists(json_path): 37 | with open(json_path, 'r') as f: 38 | cookies = json.load(f) 39 | 40 | if source in cookies: 41 | if not self.is_expire(cookies['expire_time']): 42 | return cookies[source] 43 | else: 44 | return self.setHexinByJson(source=source, cookies=cookies) 45 | else: 46 | return self.setHexinByJson(source=source, cookies=cookies) 47 | else: 48 | self.setHexinByJson(source=source) 49 | -------------------------------------------------------------------------------- /wencai/core/crawler.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import logging 3 | import re 4 | import pandas as pd 5 | from wencai.core.cons import WENCAI_CRAWLER_URL, WENCAI_HEADERS 6 | from wencai.core.content import BackTest, YieldBackTest, EventBackTest, LastJs 7 | from wencai.core.cookies import WencaiCookie 8 | from wencai.core.session import Session 9 | 10 | 11 | class Wencai(object): 12 | logging.basicConfig( 13 | level=logging.WARNING, 14 | format='%(asctime)s [%(levelname)s] %(message)s', 15 | ) 16 | 17 | def __init__(self, cn_col=False, proxies=None, verify=False): 18 | self.cookies = WencaiCookie() 19 | self.cn_col = cn_col 20 | self.session = Session(proxies=proxies, verify=verify) 21 | 22 | def backtest(self, query, start_date, end_date, period, benchmark): 23 | payload = { 24 | "query": query, 25 | "start_date": start_date, 26 | "end_date": end_date, 27 | "period": period, 28 | "benchmark": benchmark 29 | } 30 | 31 | r = self.session.post_result(source='backtest', url=WENCAI_CRAWLER_URL['backtest'], data=payload) 32 | if r.status_code == 200: 33 | print(r.json()) 34 | return BackTest(content=r.json(), cn_col=self.cn_col, start_date=start_date, end_date=end_date, 35 | session=self.session) 36 | 37 | else: 38 | raise Exception(r.content.decode('utf-8')) 39 | 40 | def yieldbacktest(self, query, start_date, end_date, stock_hold, upper_income, lower_income, period, fall_income, 41 | day_buy_stock_num): 42 | payload = { 43 | "query": query, 44 | "start_date": start_date, 45 | "end_date": end_date, 46 | "period": period, 47 | "stock_hold": stock_hold, 48 | "upper_income": upper_income, 49 | "lower_income": lower_income, 50 | "fall_income": fall_income, 51 | "day_buy_stock_num": day_buy_stock_num 52 | } 53 | r = self.session.post_result(WENCAI_CRAWLER_URL['yieldbacktest'], data=payload, 54 | add_headers=WENCAI_HEADERS['backtest'], source='backtest') 55 | if r.status_code == 200: 56 | return YieldBackTest(content=r.json(), cn_col=self.cn_col, query=query, 57 | start_date=start_date, end_date=end_date, 58 | session=self.session) 59 | else: 60 | raise Exception(r.content.decode('utf-8')) 61 | 62 | def eventbacktest(self, query, index_code, period, start_date, end_date): 63 | payload = { 64 | "query": query, 65 | "start_date": start_date, 66 | "end_date": end_date, 67 | "period": period, 68 | "index_code": index_code 69 | } 70 | 71 | r = self.session.post_result(WENCAI_CRAWLER_URL['eventbacktest'], data=payload, source='eventbacktest') 72 | if r.status_code == 200: 73 | return EventBackTest(content=r.json(), cn_col=self.cn_col) 74 | else: 75 | raise Exception(r.content.decode('utf-8')) 76 | 77 | def lastjs(self, code): 78 | r = self.session.get_result(WENCAI_CRAWLER_URL['lastjs'].format(code), source='lastjs', 79 | add_headers=WENCAI_HEADERS['lastjs']) 80 | if r.status_code == 200: 81 | return LastJs(content=r.text, code=code).get_data 82 | else: 83 | raise Exception(r.content.decode('utf-8')) 84 | 85 | def search(self, query_string): 86 | 87 | payload = { 88 | "question": query_string, 89 | "page": 1, 90 | "perpage": 50, 91 | "log_info": '{"input_type": "typewrite"}', 92 | "source": "Ths_iwencai_Xuangu", 93 | "version": 2.0, 94 | "secondary_intent": "", 95 | "query_area": "", 96 | "block_list": "", 97 | "add_info": '{"urp": {"scene": 1, "company": 1, "business": 1}, "contentType": "json", "searchInfo": true}' 98 | } 99 | 100 | r = self.session.post_result(url=WENCAI_CRAWLER_URL['search'], 101 | data=payload, force_cookies=True) 102 | result = r.json()['data']['answer'][0]['txt'][0]['content']['components'][0]['data']['datas'] 103 | 104 | def _re_str(x: str): 105 | _re = re.findall('(.*):前复权', x) 106 | if len(_re) >= 1: 107 | x = _re[-1] 108 | check_date = re.search(r"(\d{4}\d{1,2}\d{1,2})",x) 109 | if check_date is not None: 110 | return x.replace('[{}]'.format(check_date.group()), '') 111 | else: 112 | return x 113 | 114 | data = pd.DataFrame().from_dict(result) 115 | if not data.empty: 116 | columns = {i: _re_str(i) for i in data.columns} 117 | data = data.rename(columns=columns) 118 | for col in ['market_code', 'code', '关键词资讯', '涨跌幅']: 119 | if col in data.columns: 120 | del data[col] 121 | return data -------------------------------------------------------------------------------- /wencai/core/event.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | from wencai.core.crawler import Wencai 3 | 4 | global_cn_col = False 5 | global_proxies = None 6 | verify = False 7 | 8 | 9 | def set_variable(cn_col=False, proxies=None, is_verify=False): 10 | global global_cn_col, global_proxies, verify 11 | global_cn_col = cn_col 12 | global_proxies = proxies 13 | verify = is_verify 14 | 15 | 16 | def get_scrape_report(query, start_date, end_date, period, benchmark): 17 | return Wencai(cn_col=globals()['global_cn_col'], proxies=globals()['global_proxies'], 18 | verify=globals()['verify']).backtest( 19 | query=query, start_date=start_date, end_date=end_date, period=period, benchmark=benchmark 20 | ) 21 | 22 | 23 | def get_strategy(query, start_date, end_date, stock_hold, upper_income, lower_income, period, fall_income, 24 | day_buy_stock_num): 25 | return Wencai(cn_col=globals()['global_cn_col'], proxies=globals()['global_proxies'], 26 | verify=globals()['verify']).yieldbacktest(query=query, 27 | start_date=start_date, 28 | end_date=end_date, 29 | period=period, 30 | fall_income=fall_income, 31 | day_buy_stock_num=day_buy_stock_num, 32 | upper_income=upper_income, 33 | lower_income=lower_income, 34 | stock_hold=stock_hold) 35 | 36 | def get_event_evaluate(query, start_date, end_date, period, index_code): 37 | return Wencai(cn_col=globals()['global_cn_col'], proxies=globals()['global_proxies'], 38 | verify=globals()['verify']).eventbacktest(query=query, start_date=start_date, end_date=end_date, 39 | period=period, index_code=index_code) 40 | 41 | 42 | def get_lastjs(code): 43 | return Wencai(cn_col=globals()['global_cn_col'], 44 | proxies=globals()['global_proxies'], verify=globals()['verify']).lastjs(code) 45 | 46 | 47 | def search(query): 48 | return Wencai(proxies=globals()['global_proxies'], verify=globals()['verify']).search(query_string=query) 49 | -------------------------------------------------------------------------------- /wencai/core/session.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import requests 3 | import random 4 | from wencai.core.cookies import WencaiCookie 5 | 6 | 7 | class Session(requests.Session): 8 | headers = { 9 | "Accept": "application/json,text/javascript,*/*;q=0.01", 10 | "Accept-Encoding": "gzip, deflate", 11 | "Accept-Language": "zh-CN,zh;q=0.8", 12 | 'Connection': 'keep-alive', 13 | 'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8", 14 | 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", 15 | 'X-Requested-With': "XMLHttpRequest" 16 | 17 | } 18 | 19 | def __init__(self, proxies=None, verify=False): 20 | requests.Session.__init__(self) 21 | self.headers.update(Session.headers) 22 | if proxies is not None: 23 | if not isinstance(proxies, (list, dict)): 24 | raise TypeError('proxies should be list or dict') 25 | if isinstance(proxies, list): 26 | proxies = random.choice(proxies) 27 | self.proxies = proxies 28 | self.verify = verify 29 | 30 | def update_headers(self, source, add_headers, force_cookies=False): 31 | if force_cookies: 32 | self.headers['hexin-v'] = WencaiCookie().getHeXinVByHttp() 33 | else: 34 | self.headers['hexin-v'] = WencaiCookie().getHexinVByJson(source=source) 35 | if add_headers is not None: 36 | if not isinstance(add_headers, dict): 37 | raise TypeError('update_headers should be `dict` type.') 38 | for k, v in add_headers.items(): 39 | self.headers[k] = v 40 | 41 | def get_result(self, url, source=None, force_cookies=False, add_headers=None, **kwargs): 42 | self.update_headers(add_headers=add_headers, source=source, force_cookies=force_cookies) 43 | if self.proxies is None: 44 | return super(Session, self).get(url=url, **kwargs) 45 | else: 46 | return super(Session, self).get(url=url, proxies=self.proxies, verify=self.verify, **kwargs) 47 | 48 | def post_result(self, url, source=None, data=None, json=None, add_headers=None, force_cookies=False, **kwargs): 49 | self.update_headers(add_headers=add_headers, source=source, force_cookies=force_cookies) 50 | if self.proxies is None: 51 | return super(Session, self).post(url=url, data=data, json=json, **kwargs) 52 | else: 53 | return super(Session, self).post(url=url, data=data, json=json, proxies=self.proxies, verify=self.verify, 54 | **kwargs) 55 | -------------------------------------------------------------------------------- /wencai/js/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- -------------------------------------------------------------------------------- /wencai/js/hexin.js: -------------------------------------------------------------------------------- 1 | var TOKEN_SERVER_TIME = 1572845499.629; 2 | function v_cookie (r, n, t, e, a) { 3 | var u = n[0], 4 | c = n[1], 5 | v = a[0], 6 | s = t[0], 7 | f = t[1], 8 | l = r[0], 9 | d = hr(a[1], e[0], t[2]), 10 | p = t[3], 11 | h = e[1], 12 | g = yr(a[2], a[3], e[2]), 13 | m = yr(a[4], r[1], t[4]), 14 | w = r[2], 15 | I = a[5], 16 | _ = a[6], 17 | y = a[7], 18 | E = hr(n[2], r[3], r[4]), 19 | A = t[5], 20 | C = e[3], 21 | b = e[4], 22 | B = t[6], 23 | R = a[8], 24 | T = a[9], 25 | S = n[3], 26 | k = t[7], 27 | x = t[8], 28 | O = a[10], 29 | L = n[4], 30 | M = n[5], 31 | N = a[11], 32 | P = e[5], 33 | j = hr(n[6], e[6], t[9], r[5]), 34 | D = t[10], 35 | W = e[7], 36 | $ = r[6], 37 | F = yr(r[7], t[11], e[8], n[7]), 38 | X = r[8], 39 | H = t[12], 40 | K = r[9], 41 | U = n[8], 42 | V = e[9], 43 | Y = r[10], 44 | J = e[10], 45 | q = r[11], 46 | Q = a[12], 47 | Z = n[9], 48 | G = t[13], 49 | z = t[14], 50 | rr = t[15], 51 | nr = n[10], 52 | tr = a[13], 53 | er = a[14], 54 | ar = e[11], 55 | or = r[12], 56 | ir = yr(t[16], r[13], r[14], r[15]), 57 | ur = t[17], 58 | cr = t[18]; 59 | function vr () { 60 | var r = arguments[n[11]]; 61 | return r.split(n[12]).reverse().join(e[12]) 62 | } 63 | var sr = [new e[13](hr(a[15], n[13], a[16])), new e[13](a[17])]; 64 | function fr () { 65 | var n = arguments[a[18]]; 66 | if (!n) return a[19]; 67 | for (var o = t[19], i = e[14], u = e[15]; u < n.length; u++) 68 | { 69 | var c = n.charCodeAt(u), 70 | v = c ^ i; 71 | i = c, 72 | o += r[16].fromCharCode(v) 73 | } 74 | return o 75 | } 76 | var lr = '', 77 | dr; ! 78 | function (o) { 79 | var i = e[18], 80 | c = e[19]; 81 | o[e[20]] = a[21]; 82 | function v (t, a, o, i, u) { 83 | var c, v, s; 84 | c = v = s = r; 85 | var f, l, d; 86 | f = l = d = n; 87 | var p, h, g; 88 | p = h = g = e; 89 | var m = t + g[21] + a; 90 | i && (m += l[15] + i), 91 | u && (m += h[22] + u), 92 | o && (m += v[17] + o), 93 | l[14][g[23]] = m 94 | } 95 | o[e[24]] = l; 96 | function s (t, e, a) { 97 | var o = n[16]; 98 | this.setCookie(t, r[18], i + o + c, e, a) 99 | } 100 | o[t[22]] = f; 101 | function f (o) { 102 | var i = vr(e[25], a[22]), 103 | c = a[23][n[17]], 104 | v = u + i + o + t[23], 105 | s = ''; 106 | if (s == -r[19]) 107 | { 108 | if (v = o + t[23], c.substr(a[24], v.length) != v) return; 109 | s = a[24] 110 | } 111 | var f = s + v[r[20]], 112 | l = ''; 113 | return l == -e[26] && (l = c[t[24]]) 114 | 115 | } 116 | o[e[27]] = v; 117 | function l () { 118 | var r, t, a; 119 | r = t = a = e; 120 | var i, u, c; 121 | i = u = c = n; 122 | var v = u[18]; 123 | this.setCookie(v, a[28]), 124 | this.getCookie(v) || (o[i[19]] = u[20]), 125 | this.delCookie(v) 126 | } 127 | o[n[21]] = s 128 | }(dr || (dr = {})); 129 | var pr; 130 | function hr () { 131 | var r = arguments[a[25]]; 132 | if (!r) return a[19]; 133 | for (var e = a[19], o = t[25], i = n[22], u = t[18]; u < r.length; u++) 134 | { 135 | var c = r.charCodeAt(u); 136 | i = (i + t[26]) % o.length, 137 | c ^= o.charCodeAt(i), 138 | e += String.fromCharCode(c) 139 | } 140 | return e 141 | } ! 142 | function (o) { 143 | var i, u, d; 144 | i = u = d = a; 145 | var p, h, g; 146 | p = h = g = t; 147 | var m, w, I; 148 | m = w = I = r; 149 | var _, y, E; 150 | _ = y = E = n; 151 | var b, B, R; 152 | b = B = R = e; 153 | var T = B[29], 154 | S = y[23], 155 | k = m[22], 156 | x = w[0], 157 | O = E[24], 158 | L = (C, Ar, R[30]), 159 | M = b[31], 160 | N = T + S, 161 | P = p[28], 162 | j, 163 | W = m[23][y[25]], 164 | $, 165 | F; 166 | function X (r) { 167 | return function () { 168 | F.appendChild(j), 169 | j.addBehavior(u[26]), 170 | j.load(N); 171 | var n = r(); 172 | return F.removeChild(j), 173 | n 174 | } 175 | } 176 | function H () { 177 | var r = A; 178 | r = D; 179 | try 180 | { 181 | return !!(N in B[32] && b[32][N]) 182 | } catch (n) 183 | { 184 | return void B[15] 185 | } 186 | } 187 | function K (r) { 188 | return P ? G(r) : j ? Y(r) : void _[26] 189 | } 190 | function U () { 191 | if (P = H(), P) j = _[27][N]; 192 | else if (W[k + c][I[24]]) try 193 | { 194 | $ = new ActiveXObject(vr(I[25], y[28], w[26])), 195 | $.open(), 196 | $.write(y[29]), 197 | $.close(), 198 | F = $.w[B[33]][I[27]][_[30]], 199 | j = F.createElement(I[28]) 200 | } catch (r) 201 | { 202 | j = W.createElement(N), 203 | F = W[vr(I[29], d[27])] || W.getElementsByTagName(b[17])[I[27]] || W[m[30]] 204 | } 205 | } 206 | o[w[31]] = U; 207 | function V (r, n) { 208 | var t = J; 209 | if (void 0 === n) return Z(r); 210 | if (t = sr, P) z(r, n); 211 | else 212 | { 213 | if (!j) return void B[15]; 214 | Q(r, n) 215 | } 216 | } 217 | o[v + x] = V; 218 | function Y (r) { 219 | X(function () { 220 | return r = J(r), 221 | j.getAttribute(r) 222 | })() 223 | } 224 | function J (r) { 225 | var n = z; 226 | n = v; 227 | var t = vr(Ir, w[32]), 228 | e = new y[31](t + O + s + L, b[31]); 229 | return r.replace(new B[13](d[28]), b[34]).replace(e, p[29]) 230 | } 231 | function q (r) { 232 | try 233 | { 234 | j.removeItem(r) 235 | } catch (n) { } 236 | } 237 | o[M + f + l] = K; 238 | function Q (r, n) { 239 | var t = G; 240 | t = cr, 241 | X(function () { 242 | var t = M; 243 | r = J(r), 244 | t = K; 245 | try 246 | { 247 | j.setAttribute(r, n), 248 | j.save(N) 249 | } catch (e) { } 250 | })() 251 | } 252 | function Z (r) { 253 | var n, t, e; 254 | if (n = t = e = g, P) q(r); 255 | else 256 | { 257 | if (!j) return void t[18]; 258 | rr(r) 259 | } 260 | } 261 | function G (r) { 262 | try 263 | { 264 | return j.getItem(r) 265 | } catch (n) 266 | { 267 | return y[20] 268 | } 269 | } 270 | o[fr(w[33], p[30], R[35])] = Z; 271 | function z (r, n) { 272 | try 273 | { 274 | j.setItem(r, n) 275 | } catch (t) { } 276 | } 277 | function rr (r) { 278 | X(function () { 279 | r = J(r), 280 | j.removeAttribute(r), 281 | j.save(N) 282 | })() 283 | } 284 | }(pr || (pr = {})); 285 | var gr = function () { 286 | var o, i, u; 287 | o = i = u = e; 288 | var c, v, s; 289 | c = v = s = a; 290 | var f, l, g; 291 | f = l = g = n; 292 | var m, w, I; 293 | m = w = I = t; 294 | var _, E, A; 295 | _ = E = A = r; 296 | var C = yr(Cr, U, _[34]), 297 | b = vr(A[35], m[31]), 298 | R = hr(g[32], c[29], i[36]), 299 | T = hr(l[33], g[34], i[37], tr); 300 | function S (r) { 301 | this[m[32]] = r; 302 | for (var n = o[15], t = r[i[38]]; t > n; n++) this[n] = i[15] 303 | } 304 | return S[d + p + C][b + h] = function () { 305 | for (var r = this[vr(h, E[36], E[37])], n = [], t = -I[26], e = o[15], a = r[A[20]]; a > e; e++) for (var u = this[e], f = r[e], d = t += f; n[d] = u & parseInt(v[30], l[35]), --f != s[24];)--d, 306 | u >>= parseInt(i[39], c[31]); 307 | return n 308 | }, 309 | S[vr(w[33], v[32])][_[38]] = function (r) { 310 | var n = dr, 311 | t = this[vr(y, l[36], A[39])], 312 | e = f[26]; 313 | n = B; 314 | for (var a = v[24], o = t[l[37]]; o > a; a++) 315 | { 316 | var i = t[a], 317 | u = l[26]; 318 | do u = (u << parseInt(R + T, g[35])) + r[e++]; 319 | while (--i > w[18]); 320 | this[a] = u >>> w[18] 321 | } 322 | }, 323 | S 324 | }(), 325 | mr; ! 326 | function (o) { 327 | var i, u, c; 328 | i = u = c = n; 329 | var v, s, f; 330 | v = s = f = e; 331 | var l, d, p; 332 | l = d = p = a; 333 | var h, w, I; 334 | h = w = I = r; 335 | var _, y, E; 336 | _ = y = E = t; 337 | var A = y[34], 338 | C = (nr, U, h[40]), 339 | b = p[25]; 340 | function B (r) { 341 | for (var n = y[35], t = f[15], e = r[vr(c[38], I[41], H)], a = []; e > t;) 342 | { 343 | var o = k[r.charAt(t++)] << parseInt(g + A, d[31]) | k[r.charAt(t++)] << parseInt(n + m, h[42]) | k[r.charAt(t++)] << parseInt(I[43], i[35]) | k[r.charAt(t++)]; 344 | a.push(o >> parseInt(_[36], h[42]), o >> l[31] & parseInt(u[39], i[40]), o & parseInt(d[30], c[35])) 345 | } 346 | return a 347 | } 348 | function T (r) { 349 | for (var n = (O, R, p[24]), t = I[27], e = r[E[24]]; e > t; t++) n = (n << E[37]) - n + r[t]; 350 | return n & parseInt(E[38], p[33]) 351 | } 352 | for (var S = s[40], k = {}, 353 | x = s[15]; x < parseInt(I[44], l[34]); x++) k[S.charAt(x)] = x; 354 | function L (r) { 355 | var n = B(r), 356 | t = n[u[26]]; 357 | if (t != b) return error = yr(V, u[41], s[41], v[42]), 358 | void 0; 359 | var e = n[s[26]], 360 | a = []; 361 | return P(n, +_[39], a, +_[18], e), 362 | T(a) == e ? a : void 0 363 | } 364 | function M (r) { 365 | var n = T(r), 366 | t = [b, n]; 367 | return P(r, +l[24], t, +p[25], n), 368 | N(t) 369 | } 370 | function N (r) { 371 | var n, t, e; 372 | n = t = e = f; 373 | var a, o, u; 374 | a = o = u = y; 375 | var c, v, s; 376 | c = v = s = h; 377 | var d, p, g; 378 | d = p = g = l; 379 | var m, w, I; 380 | m = w = I = i; 381 | for (var _ = m[42], E = d[24], A = r[c[20]], b = []; A > E;) 382 | { 383 | var B = r[E++] << parseInt(fr(Z, d[35]), o[39]) | r[E++] << g[31] | r[E++]; 384 | b.push(S.charAt(B >> parseInt(m[43], t[43])), S.charAt(B >> parseInt(p[36], o[40]) & parseInt(I[44], I[45])), S.charAt(B >> n[44] & parseInt(_ + C, n[42])), S.charAt(B & parseInt(fr(d[37], c[45], or), a[41]))) 385 | } 386 | return b.join(o[19]) 387 | } 388 | function P (r, n, t, e, a) { 389 | var o, i, u; 390 | o = i = u = w; 391 | var c, v, s; 392 | c = v = s = E; 393 | for (var f = r[v[24]]; f > n;) t[e++] = r[n++] ^ a & parseInt(u[46], s[42]), 394 | a = ~(a * parseInt(v[43], v[40])) 395 | } 396 | o[E[44]] = N, 397 | o[_[45]] = B, 398 | o[v[45]] = M, 399 | o[y[46]] = L 400 | }(mr || (mr = {})); 401 | var wr; ! 402 | function (o) { 403 | var i = a[38], 404 | u = r[47], 405 | c = t[47], 406 | v = vr(n[46], a[39], a[40]), 407 | s = e[46], 408 | f = e[47], 409 | l = a[41], 410 | d = a[42]; 411 | function p (o) { 412 | var i = a[43], 413 | u = vr(n[47], e[48], n[48]), 414 | c = {}, 415 | v = function (o, c) { 416 | var s, f, l, d; 417 | for (c = c.replace(n[49], n[12]), c = c.substring(e[26], c[e[38]] - e[26]), s = c.split(e[49]), l = a[24]; l < s[yr(v, sr, t[48])]; l++) if (f = s[l].split(n[50]), f && !(f[a[44]] < t[39])) 418 | { 419 | for (d = n[35]; d < f[r[20]]; d++) f[n[11]] = f[n[11]] + r[48] + f[d]; 420 | f[n[26]] = new a[45](r[49]).test(f[n[26]]) ? f[e[15]].substring(r[19], f[e[15]][a[44]] - n[11]) : f[n[26]], 421 | f[n[11]] = new r[50](i + u + w).test(f[n[11]]) ? f[e[26]].substring(t[26], f[r[19]][n[37]] - t[26]) : f[a[18]], 422 | o[f[r[27]]] = f[n[11]] 423 | } 424 | return o 425 | }; 426 | return new a[45](I + _).test(o) && (c = v(c, o)), 427 | c 428 | } 429 | function h (n) { 430 | for (var t = [], e = a[24]; e < n[r[20]]; e++) t.push(n.charCodeAt(e)); 431 | return t 432 | } 433 | function g (o) { 434 | var u = a[46]; 435 | if (typeof o === vr(O, a[47], or) && o[a[48]]) try 436 | { 437 | var c = parseInt(o[a[48]]); 438 | switch (c) 439 | { 440 | case parseInt(i + u, t[42]): break; 441 | case parseInt(yr(t[49], r[51], e[50]), e[43]): top[t[50]][n[51]] = o[e[51]]; 442 | break; 443 | case parseInt(yr(a[25], j, e[52]), n[52]): top[n[53]][t[51]] = o[t[52]] 444 | } 445 | } catch (v) { } 446 | } 447 | function m (r, n, t) { 448 | 449 | } 450 | function L () { 451 | var e, a, o; 452 | e = a = o = r; 453 | var i, u, c; 454 | i = u = c = n; 455 | var v, s, f; 456 | v = s = f = t; 457 | var l = f[53], 458 | d = c[54], 459 | p = new e[52]; 460 | return typeof TOKEN_SERVER_TIME == y + l + d ? s[18] : (time = parseInt(TOKEN_SERVER_TIME), time) 461 | } 462 | function M () { 463 | var o = new t[54]; 464 | try 465 | { 466 | return time = n[2].now(), 467 | time / parseInt(fr(a[50], a[51], r[53]), t[40]) >>> e[15] 468 | } catch (i) 469 | { 470 | return time = o.getTime(), 471 | time / parseInt(e[53], a[25]) >>> r[27] 472 | } 473 | } 474 | function N (r) { 475 | for (var a = t[18], o = r[t[24]] - n[11]; o >= e[15]; o--) a = a << e[26] | +r[o]; 476 | return a 477 | } 478 | function P (a) { 479 | var o = new r[50](n[55]); 480 | if (K(a)) return a; 481 | var i = o.test(a) ? -e[54] : -t[39], 482 | u = a.split(r[54]); 483 | return u.slice(i).join(fr(n[56], t[55], E)) 484 | } 485 | function j (t) { 486 | for (var o = n[26], i = e[15], u = t[vr(r[55], a[52], D)]; u > i; i++) o = (o << r[56]) - o + t.charCodeAt(i), 487 | o >>>= n[26]; 488 | return o 489 | } 490 | function W (n, o) { 491 | var i = new a[45](t[56], yr(r[57], $, t[57], r[58])), 492 | u = new a[45](t[58]); 493 | if (n) 494 | { 495 | var c = n.match(i); 496 | if (c) 497 | { 498 | var v = c[e[26]]; 499 | return o && u.test(v) && (v = v.split(t[59]).pop().split(r[48])[e[15]]), 500 | v 501 | } 502 | } 503 | } 504 | function $ (o) { 505 | var i = n[57], 506 | u = vr(e[55], e[56]), 507 | f = e[4]; 508 | if (!(o > t[60])) 509 | { 510 | o = o || a[24]; 511 | var l = parseInt(E + c + A, r[42]), 512 | d = n[14].createElement(e[57]); 513 | d[r[59]] = n[58] + parseInt((new a[53]).getTime() / l) + r[60], 514 | d[r[61]] = function () { 515 | var n = a[46]; 516 | cr = r[19], 517 | setTimeout(function () { 518 | $(++o) 519 | }, 520 | o * parseInt(C + n, a[33])) 521 | }, 522 | d[t[61]] = d[hr(a[54], a[55], t[62])] = function () { 523 | var a = n[59]; 524 | this[i + v + u + b] && this[e[58]] !== n[60] && this[s + B + a + f] !== e[59] && this[t[63]] !== n[61] || (cr = e[15], d[hr(N, r[62], n[62], e[25])] = d[t[64]] = r[63]) 525 | }, 526 | e[60][e[61]].appendChild(d) 527 | } 528 | } 529 | function F () { 530 | var r = a[56]; 531 | return Math.random() * parseInt(R + T + f + r, t[42]) >>> n[26] 532 | } 533 | function X (r) { 534 | var e = new n[31](fr(t[65], t[66], a[57]), yr(c, n[63], t[57])); 535 | if (r) 536 | { 537 | var o = r.match(e); 538 | return o 539 | } 540 | } 541 | o[S + k] = p, 542 | o[r[64]] = $, 543 | o[t[67]] = g, 544 | o[t[68]] = h, 545 | o[t[69]] = j, 546 | o[t[70]] = F, 547 | o[r[65]] = K, 548 | o[x + l] = P, 549 | o[t[71]] = W, 550 | o[t[72]] = X, 551 | o[hr(r[66], t[73], r[67], C)] = N, 552 | o[t[74]] = M, 553 | o[d + O] = L; 554 | function K (n) { 555 | return new r[50](t[75]).test(n) 556 | } 557 | o[r[68]] = m 558 | }(wr || (wr = {})); 559 | var Ir; ! 560 | function (o) { 561 | var i = t[76], 562 | u = t[77], 563 | c = n[65], 564 | v = t[78], 565 | s = a[24], 566 | f = n[26], 567 | l = t[18], 568 | d = t[18], 569 | p = e[15], 570 | h = a[24], 571 | g = r[69], 572 | m = ''; 573 | wr.eventBind(e[60], n[67], E), 574 | wr.eventBind(r[71], t[79], E), 575 | wr.eventBind(t[20], hr(e[64], A, a[59]), b), 576 | wr.eventBind(e[60], r[72], y); 577 | function w () { 578 | return f 579 | } 580 | function I (r) { 581 | f++ 582 | } 583 | function _ () { 584 | return { 585 | x: p, 586 | y: h, 587 | trusted: g 588 | } 589 | } 590 | function y (r) { 591 | d++ 592 | } 593 | function E (r) { 594 | s++ 595 | } 596 | function C () { 597 | return l 598 | } 599 | function b (r) { 600 | var o, i, u; 601 | o = i = u = n; 602 | var c, s, f; 603 | c = s = f = t; 604 | var d, m, w; 605 | d = m = w = e; 606 | var I, _, y; 607 | I = _ = y = a; 608 | var E = I[60], 609 | A = d[65]; 610 | l++ , 611 | g = void 0 == r[E + A + v] || r[yr(f[80], s[81], i[68])], 612 | p = r[s[82]], 613 | h = r[c[83]] 614 | } 615 | function B () { 616 | return d 617 | } 618 | function R () { 619 | return s 620 | } 621 | o[r[73]] = R, 622 | o[a[61]] = w, 623 | o[fr(a[62], n[69])] = C, 624 | o[n[70]] = B, 625 | o[r[74]] = _ 626 | }(Ir || (Ir = {})); 627 | var _r; ! 628 | function (u) { 629 | var v = fr(n[71], t[84]), 630 | s = r[75], 631 | f = yr(dr, n[72], e[66], $), 632 | l = r[76], 633 | d = e[67], 634 | p = r[77], 635 | h = hr(dr, r[78], a[63], n[73]), 636 | g = r[79], 637 | m = n[74]; 638 | BROWSER_LIST = { 639 | 640 | }; 641 | function w () { 642 | var t, e, a; 643 | t = e = a = r; 644 | var o, i, u; 645 | o = i = u = n; 646 | return wr.booleanToDecimal(c) 647 | } 648 | function I (t) { 649 | for (var o = n[26]; o < y[e[38]]; o++) 650 | { 651 | var i = y[o][r[94]]; 652 | if (t.test(i)) return !a[24] 653 | } 654 | return !a[18] 655 | } 656 | function E (t) { 657 | 658 | } 659 | function A () { 660 | return a[73] 661 | } 662 | 663 | function B () { 664 | return n[20] 665 | } 666 | 667 | function T () { 668 | return I(new t[93](r[96])) 669 | } 670 | function S () { 671 | return I(new a[45](t[98], r[97])) 672 | } 673 | function k () { 674 | for (var r in BROWSER_LIST) if (BROWSER_LIST.hasOwnProperty(r)) 675 | { 676 | var n = BROWSER_LIST[r]; 677 | if (n()) return + r.substr(a[18]) 678 | } 679 | return e[15] 680 | } 681 | function x () { 682 | var n, a, o; 683 | n = a = o = r; 684 | var i, u, c; 685 | i = u = c = t; 686 | var v, s, f; 687 | v = s = f = e; 688 | var l = s[75], 689 | d = s[76]; 690 | return I(new u[93](o[98], v[71])) || E(l + F + d + X) 691 | } 692 | function O () { 693 | 694 | } 695 | function L () { 696 | var r, n, t; 697 | r = n = t = a; 698 | var o, i, u; 699 | o = i = u = e; 700 | var c = l; 701 | return c = p 702 | } 703 | function M () { 704 | var r, n, a; 705 | r = n = a = t; 706 | var o, i, u; 707 | o = i = u = e; 708 | var c; 709 | try 710 | { 711 | c = i[60].createElement(a[99]).getContext(i[78]) 712 | } catch (v) { } 713 | return !!c 714 | } 715 | 716 | 717 | function J () { 718 | var t, e, o; 719 | t = e = o = n; 720 | var i, u, c; 721 | i = u = c = a; 722 | var v, s, f; 723 | return v = s = f = r, 724 | -parseInt(s[100], c[31]) === (new e[2]).getTimezoneOffset() 725 | } 726 | 727 | function Q () { 728 | try 729 | { 730 | } catch (e) 731 | { 732 | return r[101] 733 | } 734 | } 735 | function Z () { 736 | var n, a, o; 737 | n = a = o = e; 738 | var i, u, c; 739 | i = u = c = r; 740 | var v, s, f; 741 | return v = s = f = t, 742 | plugin_num = s[18], 743 | plugin_num 744 | } 745 | var z = [R, x, S, T, L, Q, b, V, O, J, M, q, Y, B, tr, A]; 746 | 747 | var nr = [new e[13](n[85]), new n[31](e[82]), new r[50](e[83]), new r[50](t[102]), new n[31](e[84]), new a[45](a[78]), new a[45](e[85]), new e[13](t[103]), new a[45](r[103]), new t[93](r[104]), new a[45](r[105])]; 748 | function tr () { 749 | return e[86] 750 | } 751 | u[e[87]] = rr, 752 | u[a[79]] = k, 753 | u[yr(c, e[88], r[106])] = Z, 754 | u[K + U + m] = w 755 | }(_r || (_r = {})); 756 | function yr () { 757 | var o = arguments[a[25]]; 758 | if (!o) return t[19]; 759 | for (var i = a[19], u = e[14], c = r[27]; c < o.length; c++) 760 | { 761 | var v = o.charCodeAt(c), 762 | s = v ^ u; 763 | u = u * c % a[80] + e[89], 764 | i += n[86].fromCharCode(s) 765 | } 766 | return i 767 | } 768 | var Er; ! 769 | function (o) { 770 | var i = a[81], 771 | u = t[35], 772 | c = r[107], 773 | v = vr(S, a[56]), 774 | f = r[27], 775 | l = r[19], 776 | d = a[25], 777 | p = n[87], 778 | h = parseInt(e[90], r[108]), 779 | g = a[82], 780 | m = parseInt(vr(s, t[104]), t[39]), 781 | w = r[109], 782 | I = t[40], 783 | _ = parseInt(i + V, n[45]), 784 | y = parseInt(u + c, n[52]), 785 | E = parseInt(t[105], r[42]), 786 | A = e[91], 787 | C = parseInt(Y + v, r[42]), 788 | b = parseInt(e[92], e[93]), 789 | B = t[106], 790 | R = parseInt(vr(e[94], e[95]), t[41]), 791 | T = parseInt(a[83], e[93]), 792 | k; 793 | function x () { 794 | var r = M(); 795 | return r 796 | } 797 | function O () { 798 | var r = t[26], 799 | a = n[35], 800 | o = e[54], 801 | i = n[88]; 802 | k = new gr([i, i, i, i, r, r, r, o, a, a, a, a, a, a, a, i, a, r]), 803 | k[l] = wr.serverTimeNow(), 804 | L(), 805 | k[B] = cr, 806 | k[T] = ur, 807 | k[R] = e[15], 808 | k[C] = _r.getBrowserFeature(), 809 | k[g] = _r.getBrowserIndex(), 810 | k[m] = _r.getPluginNum() 811 | } 812 | function L () { 813 | var a = dr.getCookie(tr) || pr.get(ar); 814 | if (a && a[r[20]] == parseInt(e[96], n[52])) 815 | { 816 | var o = mr.decode(a); 817 | if (o && (k.decodeBuffer(o), k[f] != t[18])) return 818 | } 819 | k[f] = wr.random() 820 | } 821 | o[a[84]] = O; 822 | function M () { 823 | k[R]++ , 824 | k[l] = wr.serverTimeNow(), 825 | k[d] = wr.timeNow(), 826 | k[B] = cr, 827 | k[w] = Ir.getMouseMove(), 828 | k[I] = Ir.getMouseClick(), 829 | k[_] = Ir.getMouseWhell(), 830 | k[y] = Ir.getKeyDown(), 831 | k[E] = Ir.getClickPos().x, 832 | k[A] = Ir.getClickPos().y; 833 | var r = k.toBuffer(); 834 | return mr.encode(r) 835 | } 836 | o[yr(r[3], n[89], e[97])] = x 837 | }(Er || (Er = {})); 838 | var Ar; ! 839 | function (o) { 840 | var i = n[90], 841 | u = a[85], 842 | v = r[110], 843 | s = a[86], 844 | f = t[107], 845 | p, 846 | h, 847 | m, 848 | w, 849 | I, 850 | _; 851 | function E (r) { 852 | return N(r) && dr[a[87]] 853 | } 854 | function A (o) { 855 | var i = wr.getOriginFromUrl(o); 856 | return i ? !new n[31](yr(r[42], c, t[110]) + w).test(i[r[108]]) || !new e[13](I).test(i[a[18]]) : t[111] 857 | } 858 | function C (e) { 859 | var o = (_r, g, Er.update()); 860 | return e + (new r[50](vr(a[88], a[89])).test(e) ? n[91] : vr(P, a[90], t[112])) + er + t[23] + r[111](o) 861 | } 862 | function b (o, i, u) { 863 | if (r[112] in i) return i.apply(o, u); 864 | switch (u[n[37]]) 865 | { 866 | case n[26]: 867 | return i(); 868 | case a[18]: 869 | return i(u[n[26]]); 870 | case r[108]: 871 | return i(u[e[15]], u[r[19]]); 872 | default: 873 | return i(u[n[26]], u[r[108]], u[t[17]]) 874 | } 875 | } 876 | function B () { 877 | var r = Er.update(); 878 | return r 879 | } 880 | function k (r, e, o) { 881 | if (!r) return n[20]; 882 | var i = r[e]; 883 | if (!i) return t[111]; 884 | var u = o(i); 885 | return d || (u[a[97]] = i + t[19]), 886 | u[n[97]] = i, 887 | r[e] = u, 888 | a[21] 889 | } 890 | function M (o) { 891 | var i, u, c; 892 | i = u = c = n; 893 | var v, s, l; 894 | v = s = l = r; 895 | var d, p, h; 896 | d = p = h = e; 897 | var g, m, w; 898 | g = m = w = a; 899 | var I, _, y; 900 | I = _ = y = t; 901 | var R = hr(I[121], w[106], d[109]), 902 | T; 903 | k(o, _[122], 904 | function (r) { 905 | var n = w[107]; 906 | return function () { 907 | var t, e, a; 908 | t = e = a = _; 909 | var o, i, u; 910 | o = i = u = l; 911 | var c, v, s; 912 | c = v = s = w; 913 | var f = s[108]; 914 | try 915 | { 916 | A(arguments[s[18]]) && !E(arguments[o[19]]) ? arguments[a[26]] = C(arguments[s[18]]) : T = B(), 917 | r.apply(this, arguments), 918 | A(arguments[i[19]]) || this.setRequestHeader(ar, T) 919 | } catch (d) 920 | { 921 | return n + f 922 | } 923 | } 924 | }), 925 | k(o, g[109], 926 | function (r) { 927 | var n = b; 928 | n = M; 929 | var t = vr(_[123], u[107]); 930 | return function () { 931 | var n = fr(f, c[108], I[124]), 932 | e = s[122]; 933 | try 934 | { 935 | if (parseInt(this.status) === parseInt(h[110], v[123])) 936 | { 937 | for (var a = r.apply(this, arguments), o = new p[13](i[109], n + R), u, l, d = {}; u = o.exec(a);) d[u[m[18]].toLowerCase()] = u[v[108]]; 938 | wr.analysisRst(wr.parse(d[ir.toLowerCase()])) 939 | } 940 | } catch (g) 941 | { 942 | return e + t 943 | } 944 | return r.apply(this, arguments) 945 | } 946 | }) 947 | } 948 | function N (r) { 949 | var n = wr.getHostFromUrl(r, e[28]); 950 | return n ? _.test(n) : e[28] 951 | } 952 | function j () { 953 | var cookie_v; 954 | cookie_v = B() 955 | return cookie_v 956 | } 957 | o[n[111]] = j 958 | }(Ar || (Ar = {})); 959 | var Cr; 960 | var cookie = (function (a) { 961 | function _ () { 962 | var cookie_v; 963 | Er.Init(); 964 | cookie_v = Ar.Init(); 965 | return cookie_v 966 | } 967 | return function y () { 968 | try 969 | { 970 | return _() 971 | } catch (r) 972 | { 973 | return r 974 | } 975 | } 976 | })() 977 | return cookie() 978 | } 979 | function v () { 980 | var v; 981 | v = v_cookie( 982 | ["t", 34, '"$', 36, "\fb", 55, "ure", "lJ#K", "Flash", "getBro", "1", "analys", "CHAMELEON_CALLBACK", 30, "\u256f\u0930\u097b\u09ff\u09a4\u0934\u099d\u09c1\u099d\u09d9\u09a7\u09c3\u0995\u09f0\u09d3\u0a62\u0a6f\u09bc\u09ad\u0934", "F,sp-", String, "; expires=", "", 1, "length", "; ", '', '', "addBehavior", ";^l", ">*]+", 0, "div", "&~!", "", "Init", "('&%$#\"![", ">NJ", "\u254e\u096d\u095f", "W$R", "sdelif_esab", "Or)E", "decodeBuffer", 84, "f", "htgnel", 8, "110", "40", "\u2504\u2562", "255", "o", ":", '^".*"$', RegExp, 40, Date, "e9", ".", 19, 5, "t8JOi", "}B", "src", ".js", "onerror", "*q:", null, "getServerTime", "isIPAddr", "8-", "ZX9Y]V8aWs3VQZ7Y", "eventBind", !0, "wheel", '', "keydown", "getMouseMove", "getClickPos", "vent", "me", "MSG", 41, "th", "safari", "ActiveXObject", "maxHeight", "head", "Google Inc.", "vendor", "sgAppName", "opr", 94, "tugw`pj", "chrome", "2345Explorer", "ome", "TheWorld", "name", "\u2553\u253c\u2572\u251d\u2569\u253d\u254f\u252e\u254d\u2526", "Native Client", "i", "Shockwave", "systemLanguage", "740", !1, "plugins", "^ARM", "^iPod", "^BlackBerry", "\u2550\u0978\u094e\u09c1\u09bc\u0928\u0989\u09d8\u099a\u09f3\u09b7\u09dc", "0", 2, 7, "c", encodeURIComponent, "apply", "headers", "8S:+", "\u2560\u2509\u2567\u2503\u256c\u251b", "\u255e\u2530\u2543\u2526\u2554\u2520\u2562\u2507\u2561\u250e\u257c\u2519", "a", 14, ":dB2", "href", "click", "err", 16, "hostname", "`60w", "\fbf", "&X "], 983 | [";", "Element", Date, "par", "i", "DOMMous", 21, "xmT", "wserFe", "h", !0, 1, "", Boolean, '', "; domain=", "n 1970 00:", "cookie", "checkcookie", "allow", !1, "delCookie", 2333, "torage", ")*+,/\\\\:;", '', 0, '', "eliflmth", '', "ducument", RegExp, "W", "qsU", 61, 2, "sdelif_esab", "length", "I", "ff", 16, 45, "3", "10010", "77", 8, "6e%d", "DT{e", "$", / /g, ":", "href", 10, "location", "ned", "\\.com\\.cn$|\\.com\\.hk$", 63, "rea", "https://s.thsi.cn/js/chameleon/time.1", "tat", "loaded", "interactive", "WY:ZYS", "E?`a", "addEventListener", "eScroll", "onmousewheel", "mousemove", "\u255e\u096e\u096e\u09e3\u09a5\u092e\u099a\u09d4\u0990", "\u2550\u2535\u2541\u250c\u2563\u2516\u2565\u2500\u2543\u252f\u2546\u2525\u254e", "getKeyDown", "H69?@[\\]^", "e", "HE9", "tot", "\u2503", "0", "dyS", "se", "getRoot", "NR", "nd", 60, "ng", "s", "get", "mit", 13, 3, 0, "", '', "\u255f\u253a\u255b\u253f", "getCookie", "=", "length", "V587", 1, String, !0, "___", "\u2553\u2536\u255a", "uBot", "base_fileds", 32, "2", "1", "20", 5, "255", 2, 8, 16, 10, "203", "base64Encode", "base64Decode", "decode", "760", "\u255b\u0978\u0954\u09f6\u09a4\u0935", 70, "location", "href", "redirect_url", "efi", Date, "\u2519", "^\\s*(?:https?:)?\\/{2,}([^\\/\\?\\#\\\\]+)", "\u255e", "[@:]", "@", 7, "onload", 'WY$PYS/FLV"P[_7[_R', "readyState", "onreadystatechange", '"^w', "\u2569\u2535\u2546\u256c\u2544\u257b\u2541\u2569\u2501\u2575\u2501\u2571\u2502\u253d\u2507\u252e\u2507\u2538\u2564\u254b\u2530\u2502\u252e\u2553\u257b\u2520\u257e\u2522\u250d\u2551\u256e\u2532\u2511\u254d\u2511\u254c\u2567\u254e", "analysisRst", "strToBytes", "strhash", "random", "getHostFromUrl", "getOriginFromUrl", 83, "timeNow", "^(\\d+\\.)+\\d+$", "d", "v", "ted", "touchmove", 85, "F(K9i", "clientX", "clientY", "\u257a\u2515\u256f\u253c", "postMessage", '', "ActiveXObject", "Apple Computer, Inc.", "Q", "chr", "\u2558\u2535\u2550", "BIDUBrowser", RegExp, "QQBrowser", "ro", "aef", "msDoNotTrack", "PDF|Acrobat", "canvas", "yE", "\u255b\u253a\u2554\u2533\u2546\u2527\u2540\u2525\u2556", "^Android", "^Linux [ix]\\d+", "011", "13", 15, "sub", "addEventListener", "jsonp_ignore", "\u2569", !1, 'L"', "Sj", "T{_,", "q*", "i", "tagName", "et", "{'K", "Pp<", "#x'", "open", "rS", "KN3", "#", "protocol", "\\.", "DEDAOL_NOELEMAHC"], 985 | [83, "ffer", "\u2505", "20", "e", "ngsE", Error, "est", "\u2552\u095b\u0956\u09f0\u09a3\u0935\u09c0\u09e2", "1", "sr", "hexin-v", "", RegExp, 9527, 0, "**l>", "head", "Thu, 01 Ja", "00:00 GMT", "allow", "=", "; path=", "cookie", "Init", 33, 1, "setCookie", !0, "localS", "`{|}~]", "g", '', "frames", "___$&", 56, " ", "\b", "length", "10", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", "\u2552\u096f\u0948\u09fe\u09a2", 16, 2, 6, "encode", "rea", "729", "*.", ",", "\u2506\u092c\u090b\u09a0\u09e1\u096d\u09df\u0981\u09c4\u098c", "redirect_url", "\u2506\u092d\u090a\u09a3", "1111101000", 3, 47, "tat", "script", "readyState", "complete", '', "body", "onwheel", "mousewheel", 37, "rus", "\u2554\u0975", "chr", "ActiveXObject", "WeakMap", "aT1Kg", "i", 24, "\u2554\u253c\u254e\u2521\u254c\u2529", "\u2547\u0971\u094f\u09f6\u09b9\u0933\u099d", "Shockwav", "hockwave", "$cdc_asdjflasutopfhvcZLmcfl_", "webgl2", "2>n|", "plugins", "platform", "^Win64", "^Linux armv|Android", "^iPhone", "^MacIntel", !1, "getPlatform", "6Y,", 2333, "100", 12, "14", 10, 36, "01", "60", "\u2542\u096d\u095e\u09f0\u09a4\u0938", "j", 17, "Request", "prototype", "`z}lc", "error", "s", "r", "target", "\u255e", "A", "U", "193", "host", "$"], 986 | ["se", "g@g?", Array, "*Y", Number, "^{.", "*}$", "und", "429", "496", "imeNow", "etti", "rg", "v", "hexin-v", Error, "L_%\\T8", ".baidu.", 1, "", Function, !0, " ", '', 0, 2, "#default#userData", "ydob", "^d", 89, "11111111", 8, "epytotorp", 10, 16, "\u2506\u2536\u2506\u2536\u2506", "14", 13, "10", "Syd", 44, "Domain", "serverT", '^"', "length", RegExp, "00", "tcejbo", "status_code", "n", 66, "\u2506\u2531\u2504\u2534", "htgnel", Date, "L%", 67, "5", "?)'", '', "[[?VS", "isT", "getMouseWhell", "}}", "TR", "ActiveXObject", "WE", "python", "Maxthon", 97, "chrome", "Ryp", "UBrowser", 54, !1, "ontouchstart", "\u254d\u0975\u0917\u09f2\u09be", "iso-8859-1", "defaultCharset", "^iPad", "getBrowserIndex", 256, "1", 5, "17", "Init", "XMLHttp", "tar", "allow", "@*", "?\\", "?", "\u2571\u2503\u256a\u2546\u2566\u2556\u2567\u2547\u2501\u2564\u2506\u2526\u2514\u2524\u2511\u2521\u2501\u2531\u2501\u253b\u250b\u253b\u2501\u2531\u2501\u2521\u2566\u252b\u257f", "den", "tia", 94, "ls", "\u2554\u2526\u2543", "_str", 37, "append", "Child", "\u255f", "\u2569\u0975\u094e\u09e5\u09a0\u092e\u09d1\u09ed\u09ce", "srcElement", "parentNode", "\u2543\u2522\u2545\u250b\u256a\u2507\u2562", "}*", "err", "or", "getAllResponseHeaders", "\\.?", "\\."] 987 | ); 988 | return v 989 | } 990 | --------------------------------------------------------------------------------