├── Core ├── __init__.py ├── core.py ├── exception.py ├── timer.py ├── util.py ├── login.py └── spider.py ├── Server ├── __init__.py ├── url.py ├── server.py ├── app.py ├── api.py └── handler.py ├── Static ├── img │ └── __init__.py ├── favicon.ico ├── css │ ├── fonts │ │ └── element-icons.woff │ └── index.css ├── index.html ├── js │ └── index.js └── 404.html ├── TEST ├── pack.py ├── area_id │ ├── 84.钓鱼岛.txt │ ├── README.md │ ├── 32.台湾.txt │ ├── 52993.港澳.txt │ ├── 3.天津.txt │ ├── get_area_id.py │ ├── 2.上海.txt │ ├── 1.北京.txt │ ├── 53283.海外.txt │ ├── 30.宁夏.txt │ ├── 23.海南.txt │ └── 29.青海.txt ├── get_eid_fp.html ├── py2app_setup.py └── Seckill.py ├── Config ├── __init__.py ├── settings.py └── config.ini ├── Logger ├── __init__.py └── logger.py ├── Message ├── __init__.py └── message.py ├── Scheduler ├── __init__.py └── scheduler.py ├── requirements.txt ├── Docs ├── img │ ├── banner.jpg │ ├── shopper.png │ └── shopper.svg ├── change-log.md └── notice.md ├── GUI ├── pack_requirements.txt ├── gui.py └── packing.py ├── main.py ├── runserver.py ├── .gitignore └── README.md /Core/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Server/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Static/img/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /TEST/pack.py: -------------------------------------------------------------------------------- 1 | command = '' -------------------------------------------------------------------------------- /Config/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 设置模块 3 | ''' -------------------------------------------------------------------------------- /Core/core.py: -------------------------------------------------------------------------------- 1 | def main(): 2 | pass 3 | -------------------------------------------------------------------------------- /Logger/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 日志模块 3 | ''' 4 | -------------------------------------------------------------------------------- /Message/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 消息模块 3 | ''' -------------------------------------------------------------------------------- /Scheduler/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 消息模块 3 | ''' -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | lxml==4.5.1 2 | bs4==0.0.1 3 | requests==2.24.0 -------------------------------------------------------------------------------- /Docs/img/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aa342138039/JD-SHOPPER/HEAD/Docs/img/banner.jpg -------------------------------------------------------------------------------- /Docs/img/shopper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aa342138039/JD-SHOPPER/HEAD/Docs/img/shopper.png -------------------------------------------------------------------------------- /Static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aa342138039/JD-SHOPPER/HEAD/Static/favicon.ico -------------------------------------------------------------------------------- /GUI/pack_requirements.txt: -------------------------------------------------------------------------------- 1 | lxml==4.5.1 2 | bs4==0.0.1 3 | requests==2.24.0 4 | pywebview==3.5 5 | PyInstaller==3.6 -------------------------------------------------------------------------------- /Static/css/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aa342138039/JD-SHOPPER/HEAD/Static/css/fonts/element-icons.woff -------------------------------------------------------------------------------- /Core/exception.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- encoding=utf8 -*- 3 | 4 | 5 | class SKException(Exception): 6 | 7 | def __init__(self, message): 8 | super().__init__(message) 9 | -------------------------------------------------------------------------------- /TEST/area_id/84.钓鱼岛.txt: -------------------------------------------------------------------------------- 1 | { 2 | '钓鱼岛(84)': { 3 | '钓鱼岛(1310)': { 4 | '钓鱼岛全区(53281)': '84_1310_53281', 5 | '钓鱼岛县1(53263)': '84_1310_53263', 6 | '钓鱼岛县(53262)': '84_1310_53262' 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /Server/url.py: -------------------------------------------------------------------------------- 1 | from Server.api import log, serverConfig, jdShopper, loginStatus 2 | 3 | def urls(url, request): 4 | if (url == "/log"): return log(request) 5 | elif (url == "/config"): return serverConfig(request) 6 | elif (url == "/jd-shopper"): return jdShopper(request) 7 | elif (url == "/jd-login-status"): return loginStatus(request) 8 | else: return "No Response" -------------------------------------------------------------------------------- /Docs/change-log.md: -------------------------------------------------------------------------------- 1 | ## 更新日志 2 | 3 | ### v1.0.0-beta 4 | - 迁移整体框架到TinyServer 5 | - 更新 web ui 文件 6 | 7 | ### v1.0.0 8 | 感谢 [*@FlameGate*](https://gitee.com/yanwen0614) 对本项目的贡献 9 | - 修复了windows平台下的兼容性问题 10 | - 修复了网络波动带来的递归调用问题 11 | - 默认host从 *'0.0.0.0'* 迁移到 *'localhost'* 12 | 13 | ### v1.0.1 14 | - 修复了字体和图标显示错误的问题 15 | - 对本地GUI程序进行了初步配置 16 | - 对readme以及文档结构进行修改 17 | 18 | ### v1.1.0 19 | - 上线windows开箱即用exe程序 20 | - 修复windows web ui显示bug 21 | - 更新readme自行打包方法 22 | 23 | ### V1.2.0-计划 24 | - 上线价格低于设定值自动下单功能 25 | 26 | ### v2.0.0-计划 27 | - 上线秒杀抢购功能 -------------------------------------------------------------------------------- /TEST/area_id/README.md: -------------------------------------------------------------------------------- 1 | # 地址id如何获取? 2 | 3 | ## 方法一 4 | 5 | 在本文件夹中根据地址查询对应的文件。 6 | 7 | ## 方法二 8 | 9 | 在商品页面(例如 https://item.jd.com/1178879.html) 打开开发者工具,在 Console 中执行以下 Javascript 代码: 10 | 11 | ```js 12 | var el = document.getElementsByClassName("ui-area-text")[0] 13 | var area_name = el.getAttribute("title") 14 | var area_id = el.getAttribute("data-id").replace(/-/g, "_") 15 | console.log(area_name) 16 | console.log(area_id) 17 | ``` 18 | 19 | ## 方法三 20 | 21 | 运行本文件夹中的 Python 脚本,根据提示逐级选择区域。感谢 @6r6 提供脚本~ 22 | 23 | ```sh 24 | python get_area_id.py 25 | ``` 26 | -------------------------------------------------------------------------------- /Docs/notice.md: -------------------------------------------------------------------------------- 1 | ## 使用须知: 2 | 3 | - 如有侵权违规,请提交PR,私信,联系我,会在7工作日内删除。 4 | 5 | * 本仓库发布的`JD_SHOPPER`项目中涉及的任何脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 6 | 7 | * 本项目内所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。 8 | 9 | * `louisyoungx` 对任何脚本问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害. 10 | 11 | * 间接使用脚本的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, `louisyoungx` 对于由此引起的任何隐私泄漏或其他后果概不负责。 12 | 13 | * 请勿将`JD_SHOPPER`项目的任何内容用于商业或非法目的,否则后果自负。 14 | 15 | * 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关脚本。 16 | 17 | * 以任何方式查看此项目的人或直接或间接使用`JD_SHOPPER`项目的任何脚本的使用者都应仔细阅读此声明。`louisyoungx` 保留随时更改或补充此免责声明的权利。一旦使用并复制了任何相关脚本或`jd_seckill`项目,则视为您已接受此免责声明。 18 | 19 | * 您必须在下载后的24小时内从计算机或手机中完全删除以上内容。 20 | 21 | * 本项目遵循`GPL-3.0 License`协议,如果本特别声明与`GPL-3.0 License`协议有冲突之处,以本特别声明为准。 22 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from Config.settings import config 3 | from Core.spider import Waiter 4 | 5 | if __name__ == '__main__': 6 | choiceList = """ 7 | ===== 注意 ===== 8 | 使用前请按要求填写config.ini中的信息 9 | 10 | 功能列表: 11 | 1.自动加购物车,缺货等待上架自动下单 12 | 2.自动定时加购物车下单(普通商品,非秒杀抢购) 13 | """ 14 | print(choiceList) 15 | choice_function = '' 16 | if choice_function == '': 17 | choice_function = input('请选择:') 18 | if choice_function == '1': 19 | waiter = Waiter() 20 | waiter.waitForSell() 21 | elif choice_function == '2': 22 | waiter = Waiter() 23 | waiter.waitTimeForSell() 24 | else: 25 | print('没有此功能') 26 | sys.exit(1) 27 | 28 | -------------------------------------------------------------------------------- /TEST/get_eid_fp.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
`
151 | fetch(url)
152 | .then(response => {
153 | return response.json();
154 | })
155 | .then(res => {
156 | console.log(res);
157 | if (res.data) {
158 | this.qrVisible = false
159 | clearInterval(this.qrReq)
160 | clearInterval(loginReq)
161 | this.getLog()
162 | this.task = false
163 | }
164 | });
165 | }, 1000)
166 | },
167 | getLog() {
168 | let url = './api/log'
169 |
170 | fetch(url)
171 | .then(response => {
172 | return response.json();
173 | })
174 | .then(res => {
175 | console.log(res.data);
176 | document.getElementById('log').innerHTML = res.data
177 | });
178 |
179 | setInterval(() => {
180 | fetch(url)
181 | .then(response => {
182 | return response.json();
183 | })
184 | .then(res => {
185 | console.log(res.data);
186 | document.getElementById('log').innerHTML = res.data
187 | });
188 | }, 10000)
189 | }
190 | },
191 | });
192 |
193 |
194 | // confirm,e.prototype.$prompt=ya.prompt,e.prototype.$notify=tl,e.prototype.$message=ou};
195 | //"undefined"!=typeof window&&window.Vue&&Ld(window.Vue);t.default={version:"2.15.0",
196 | //locale:j.use,i18n:j.i18n,install:Ld,CollapseTransition:ii,Loading:_l,Pagination:pt,
197 | //Dialog:gt,Autocomplete:kt,Dropdown:At,DropdownMenu:Bt,DropdownItem:Wt,Menu:ei,
198 | //Submenu:ai,MenuItem:di,MenuItemGroup:vi,Input:ne,InputNumber:_i,Radio:Si,RadioGroup:Mi,
199 | //RadioButton:Ii,Checkbox:Vi,CheckboxButton:Ri,CheckboxGroup:Yi,Switch:Xi,Select:ct,
200 | //Option:ht,OptionGroup:en,Button:Et,ButtonGroup:Pt,Table:Un,TableColumn:ir
--------------------------------------------------------------------------------
/TEST/area_id/1.北京.txt:
--------------------------------------------------------------------------------
1 | {
2 | '北京(1)': {
3 | '朝阳区(72)': {
4 | '定福庄(4211)': '1_72_4211',
5 | '三环以内(2799)': '1_72_2799',
6 | '四环到五环之间(2839)': '1_72_2839',
7 | '北苑(4139)': '1_72_4139',
8 | '三环到四环之间(2819)': '1_72_2819',
9 | '管庄(4137)': '1_72_4137',
10 | '五环到六环之间(2840)': '1_72_2840'
11 | },
12 | '丰台区(2805)': {
13 | '六环之外(34545)': '1_2805_34545',
14 | '五环到六环之间(34544)': '1_2805_34544',
15 | '三环到四环之间(2855)': '1_2805_2855',
16 | '四环到五环之间(2832)': '1_2805_2832',
17 | '二环到三环(2854)': '1_2805_2854'
18 | },
19 | '门头沟(2807)': {
20 | '龙泉镇(51553)': '1_2807_51553',
21 | '雁翅镇(51560)': '1_2807_51560',
22 | '永定镇(51554)': '1_2807_51554',
23 | '潭柘寺镇(51556)': '1_2807_51556',
24 | '王平镇(51557)': '1_2807_51557',
25 | '大台镇(51555)': '1_2807_51555',
26 | '斋堂镇(51561)': '1_2807_51561',
27 | '城区(51552)': '1_2807_51552',
28 | '妙峰山镇(51559)': '1_2807_51559',
29 | '军庄镇(51558)': '1_2807_51558',
30 | '清水镇(51562)': '1_2807_51562'
31 | },
32 | '房山区(2808)': {
33 | '长沟镇(51549)': '1_2808_51549',
34 | '城区(51528)': '1_2808_51528',
35 | '周口店镇(51551)': '1_2808_51551',
36 | '蒲洼乡(51539)': '1_2808_51539',
37 | '青龙湖镇(51540)': '1_2808_51540',
38 | '窦店镇(51531)': '1_2808_51531',
39 | '石楼镇(51542)': '1_2808_51542',
40 | '良乡镇(51536)': '1_2808_51536',
41 | '阎村镇(51546)': '1_2808_51546',
42 | '霞云岭乡(51544)': '1_2808_51544',
43 | '大安山乡(51529)': '1_2808_51529',
44 | '十渡镇(51541)': '1_2808_51541',
45 | '燕山地区(51547)': '1_2808_51547',
46 | '琉璃河镇(51537)': '1_2808_51537',
47 | '张坊镇(51548)': '1_2808_51548',
48 | '韩村河镇(51534)': '1_2808_51534',
49 | '长阳镇(51550)': '1_2808_51550',
50 | '南窖乡(51538)': '1_2808_51538',
51 | '佛子庄乡(51532)': '1_2808_51532',
52 | '河北镇(51535)': '1_2808_51535',
53 | '新镇(51545)': '1_2808_51545',
54 | '大石窝镇(51530)': '1_2808_51530',
55 | '史家营乡(51543)': '1_2808_51543'
56 | },
57 | '延庆县(3065)': {
58 | '香营乡(51519)': '1_3065_51519',
59 | '永宁镇(51509)': '1_3065_51509',
60 | '延庆镇(51505)': '1_3065_51505',
61 | '井庄镇(51516)': '1_3065_51516',
62 | '大榆树镇(51515)': '1_3065_51515',
63 | '四海镇(51512)': '1_3065_51512',
64 | '千家店镇(51513)': '1_3065_51513',
65 | '张山营镇(51511)': '1_3065_51511',
66 | '城区(51506)': '1_3065_51506',
67 | '刘斌堡乡(51518)': '1_3065_51518',
68 | '沈家营镇(51514)': '1_3065_51514',
69 | '旧县镇(51510)': '1_3065_51510',
70 | '八达岭镇(51508)': '1_3065_51508',
71 | '大庄科乡(51517)': '1_3065_51517',
72 | '康庄镇(51507)': '1_3065_51507',
73 | '珍珠泉乡(51520)': '1_3065_51520'
74 | },
75 | '昌平区(2901)': {
76 | '城区以外(2906)': '1_2901_2906',
77 | '城区(4136)': '1_2901_4136',
78 | '六环以内(4135)': '1_2901_4135'
79 | },
80 | '通州区(2809)': {
81 | '永顺镇(51218)': '1_2809_51218',
82 | '梨园镇(51219)': '1_2809_51219',
83 | '中仓街道(51228)': '1_2809_51228',
84 | '永乐店镇(51224)': '1_2809_51224',
85 | '玉桥街道(51230)': '1_2809_51230',
86 | '新华街道(51229)': '1_2809_51229',
87 | '宋庄镇(51220)': '1_2809_51220',
88 | '次渠镇(51232)': '1_2809_51232',
89 | '潞城镇(51225)': '1_2809_51225',
90 | '台湖镇(51226)': '1_2809_51226',
91 | '于家务乡(51227)': '1_2809_51227',
92 | '六环内(马驹桥镇)(51216)': '1_2809_51216',
93 | '西集镇(51223)': '1_2809_51223',
94 | '漷县镇(51221)': '1_2809_51221',
95 | '张家湾镇(51222)': '1_2809_51222',
96 | '北苑街道(51231)': '1_2809_51231',
97 | '六环外(马驹桥镇)(51217)': '1_2809_51217'
98 | },
99 | '西城区(2801)': {
100 | '二环到三环(2853)': '1_2801_2853',
101 | '内环到二环里(2827)': '1_2801_2827'
102 | },
103 | '海淀区(2800)': {
104 | '西三旗(4134)': '1_2800_4134',
105 | '四环到五环之间(2850)': '1_2800_2850',
106 | '三环到四环之间(2849)': '1_2800_2849',
107 | '五环到六环之间(2851)': '1_2800_2851',
108 | '六环以外(2852)': '1_2800_2852',
109 | '三环以内(2848)': '1_2800_2848',
110 | '西二旗(4209)': '1_2800_4209'
111 | },
112 | '石景山区(2806)': {
113 | '八大处科技园区(4188)': '1_2806_4188',
114 | '四环到五环内(2831)': '1_2806_2831',
115 | '石景山城区(4187)': '1_2806_4187'
116 | },
117 | '怀柔区(2814)': {
118 | '城区以内(6115)': '1_2814_6115',
119 | '郊区(2847)': '1_2814_2847'
120 | },
121 | '顺义区(2812)': {
122 | '赵全营镇(51149)': '1_2812_51149',
123 | '北务镇(51126)': '1_2812_51126',
124 | '胜利街道(51142)': '1_2812_51142',
125 | '石园街道(51143)': '1_2812_51143',
126 | '高丽营镇(51129)': '1_2812_51129',
127 | '张镇(51148)': '1_2812_51148',
128 | '天竺地区(51145)': '1_2812_51145',
129 | '大孙各庄镇(51128)': '1_2812_51128',
130 | '南彩镇(51138)': '1_2812_51138',
131 | '李遂镇(51134)': '1_2812_51134',
132 | '仁和地区(51141)': '1_2812_51141',
133 | '后沙峪地区(51131)': '1_2812_51131',
134 | '木林镇(51137)': '1_2812_51137',
135 | '空港街道(51132)': '1_2812_51132',
136 | '北小营镇(51127)': '1_2812_51127',
137 | '旺泉街道(51146)': '1_2812_51146',
138 | '北石槽镇(51125)': '1_2812_51125',
139 | '南法信地区(51139)': '1_2812_51139',
140 | '双丰街道(51144)': '1_2812_51144',
141 | '龙湾屯镇(51135)': '1_2812_51135',
142 | '牛栏山地区(51140)': '1_2812_51140',
143 | '杨镇地区(51147)': '1_2812_51147',
144 | '李桥镇(51133)': '1_2812_51133',
145 | '光明街道(51130)': '1_2812_51130',
146 | '马坡地区(51136)': '1_2812_51136'
147 | },
148 | '大兴区(2810)': {
149 | '亦庄经济开发区(51081)': '1_2810_51081',
150 | '五环至六环之间(6501)': '1_2810_6501',
151 | '四环至五环之间(4194)': '1_2810_4194',
152 | '六环以外(4205)': '1_2810_4205'
153 | },
154 | '崇文区(2803)': {
155 | '二环到三环(2842)': '1_2803_2842',
156 | '一环到二环(2829)': '1_2803_2829'
157 | },
158 | '东城区(2802)': {
159 | '内环到三环里(2821)': '1_2802_2821'
160 | },
161 | '宣武区(2804)': {
162 | '内环到三环里(2828)': '1_2804_2828'
163 | },
164 | '平谷区(2953)': {
165 | '城区(6666)': '1_2953_6666',
166 | '城区以外(2954)': '1_2953_2954'
167 | },
168 | '密云区(2816)': {
169 | '城区(6667)': '1_2816_6667',
170 | '城区以外(2862)': '1_2816_2862'
171 | }
172 | }
173 | }
--------------------------------------------------------------------------------
/Core/util.py:
--------------------------------------------------------------------------------
1 | import json
2 | import random
3 | import requests
4 | import os
5 | import time
6 |
7 | from Config.settings import config
8 |
9 | USER_AGENTS = [
10 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
11 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36",
12 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
13 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
14 | "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36",
15 | "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36",
16 | "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36",
17 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36",
18 | "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36",
19 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36",
20 | "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",
21 | "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",
22 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",
23 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",
24 | "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36",
25 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36",
26 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36",
27 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36",
28 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36",
29 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36",
30 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36",
31 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F",
32 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
33 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36",
34 | "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36",
35 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36",
36 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36",
37 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36",
38 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36",
39 | "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36",
40 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36",
41 | "Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36",
42 | "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36",
43 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36",
44 | "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36",
45 | "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36",
46 | "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36",
47 | "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
48 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
49 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
50 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
51 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
52 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
53 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36",
54 | "Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36",
55 | "Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36",
56 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17",
57 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17",
58 | "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15",
59 | "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14"
60 | ]
61 |
62 |
63 | def parse_json(s):
64 | begin = s.find('{')
65 | end = s.rfind('}') + 1
66 | return json.loads(s[begin:end])
67 |
68 |
69 | def get_random_useragent():
70 | """生成随机的UserAgent
71 | :return: UserAgent字符串
72 | """
73 | return random.choice(USER_AGENTS)
74 |
75 |
76 | def wait_some_time():
77 | time.sleep(random.randint(100, 300) / 1000)
78 |
79 |
80 | def send_wechat(message):
81 | """推送信息到微信"""
82 | url = 'http://sc.ftqq.com/{}.send'.format(config.settings('messenger', 'sckey'))
83 | payload = {
84 | "text":'抢购结果',
85 | "desp": message
86 | }
87 | headers = {
88 | 'User-Agent':config.settings('config', 'DEFAULT_USER_AGENT')
89 | }
90 | requests.get(url, params=payload, headers=headers)
91 |
92 |
93 | def response_status(resp):
94 | if resp.status_code != requests.codes.OK:
95 | print('Status: %u, Url: %s' % (resp.status_code, resp.url))
96 | return False
97 | return True
98 |
99 |
100 | def open_image(image_file):
101 | if os.name == "nt":
102 | os.system('start ' + config.path() + '/Static/img/'+ image_file) # for Windows
103 | else:
104 | if os.uname()[0] == "Linux":
105 | if "deepin" in os.uname()[2]:
106 | os.system("deepin-image-viewer " + image_file) # for deepin
107 | else:
108 | os.system("eog " + image_file) # for Linux
109 | else:
110 | os.system("open " + image_file) # for Mac
111 |
112 |
113 | def save_image(resp, image_file):
114 | with open(config.path() + '/Static/img/' + image_file, 'wb') as f:
115 | for chunk in resp.iter_content(chunk_size=1024):
116 | f.write(chunk)
117 |
--------------------------------------------------------------------------------
/Static/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | NOT FOUND
152 | 153 | 154 |