└── jd ├── README.MD ├── cfd_config.json ├── jx_cfd_hb.py └── requirements.txt /jd/README.MD: -------------------------------------------------------------------------------- 1 | ## 财富岛抢购脚本使用方法 2 | 3 | ***首先需要一台具有Python3.7+环境的服务器 / 个人计算机 / 其他设备*** 4 | 5 | ### 拉取脚本 6 | 7 | ```shell 8 | git clone https://github.com/Redcker/scripts.git 9 | ``` 10 | 11 | ### 进入jd文件夹 12 | 13 | ```shell 14 | cd scripts/jd 15 | ``` 16 | 17 | ### 安装依赖 18 | 19 | ```shell 20 | pip3 install -r requirements.txt 21 | ``` 22 | 23 | ### 填写配置 24 | 25 | 若配置了pushplus_token,在抢购状态异常或者抢购成功会推送提醒 26 | 27 | 目前仅支持单账号,原因是同一IP同时发多个请求会被阻断,可在多个服务器部署或者使用代理实现多账号并发 28 | 29 | ***advance_time是请求提前多久发送,会自动优化,尽量不要手动修改*** 30 | 31 | cookie的格式为pt_key='' 32 | 33 | 填完配置后,检查是否符合json格式 34 | 35 | ### 运行脚本 36 | 37 | 若为Linux系统,可后台挂起 38 | 39 | ```shell 40 | nohup python3 jx_cfd_hb.py >/dev/null 2>&1 & 41 | ``` 42 | 43 | 若为windows,直接运行脚本,然后小化窗口即可 44 | 45 | ### 查看日志 46 | 47 | 日志文件在脚本同目录下的cfd.log中 48 | 49 | ### 停止脚本 50 | 51 | 先查看进程号 52 | 53 | ```shell 54 | ps -aux | grep 'python3 jx_cfd_hb.py' 55 | ``` 56 | 57 | 第一行,第二列有一串数字,就是进程号 58 | 59 | 用进程号替换掉下方的PID即可停止脚本 60 | 61 | ```shell 62 | kill -9 PID 63 | ``` 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /jd/cfd_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "cookie": "pt_key=xxx", 3 | "pushplus_token": "", 4 | "advance_time": 0.20 5 | } -------------------------------------------------------------------------------- /jd/jx_cfd_hb.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import datetime 3 | import json 4 | 5 | try: 6 | from apscheduler.schedulers.blocking import BlockingScheduler 7 | import requests 8 | import pytz 9 | except Exception as e: 10 | logging.error(f'依赖导入错误:{e}') 11 | exit(1) 12 | 13 | 14 | def send_to_wechat(title): 15 | """ 16 | 微信推送 17 | """ 18 | data = { 19 | 'title': f'财富岛红包状态:{title}', 20 | 'content': '请按照状态提示进行对应操作', 21 | 'token': token, 22 | } 23 | url = 'http://www.pushplus.plus/send' 24 | requests.post(url, data=data) 25 | 26 | 27 | def get_next_time(): 28 | """ 29 | 获取下一个整点的时间戳 30 | """ 31 | now_time = datetime.datetime.now(tz=pytz.timezone('Asia/Shanghai')) 32 | str_time = (now_time + datetime.timedelta(hours=1)).strftime("%Y-%m-%d %H:00:00") 33 | timestamp = int(datetime.datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S").timestamp()) 34 | return timestamp 35 | 36 | 37 | class JxCFD(object): 38 | def __init__(self, cookie): 39 | """ 40 | 初始化财富岛类 41 | """ 42 | self.cookie = cookie 43 | self.session = requests.session() 44 | self.session.headers = { 45 | "Host": "m.jingxi.com", 46 | "Accept": "*/*", 47 | "Connection": "keep-alive", 48 | 'referer': 'https://st.jingxi.com/fortune_island/index2.html?ptag=7155.9.47&sceneval=2&sid=6f488e2778fa2db09a39f105577da07w', 49 | 'user-agent': f'jdpingou;android;5.21.4;appBuild/20596;session/332;pap/JA2019_3111789;ef/1;', 50 | 'cookie': self.cookie, 51 | "Accept-Language": "zh-CN,zh-Hans;q=0.9", 52 | "Accept-Encoding": "gzip, deflate, br" 53 | } 54 | 55 | def get_cfd_url(self): 56 | """ 57 | 获取最新100红包url 58 | """ 59 | url = 'https://m.jingxi.com/jxbfd/user/ExchangeState?strZone=jxbfd&dwType=2&sceneval=2&g_login_type=1' 60 | ret = self.session.get(url).json() 61 | try: 62 | pool = ret['hongbaopool'] 63 | except KeyError: 64 | logging.error('获取最新url失败,可能是cookie已过期') 65 | send_to_wechat('cookie已失效') 66 | return 67 | else: 68 | dwLvl = ret['hongbao'][0]['dwLvl'] 69 | new_url = f'https://m.jingxi.com/jxbfd/user/ExchangePrize?strZone=jxbfd&dwType=3&dwLvl={dwLvl}&ddwPaperMoney=100000&strPoolName={pool}&sceneval=2&g_login_type=1' 70 | return new_url 71 | 72 | def exchange_red_package(self): 73 | """ 74 | 兑换红包 75 | """ 76 | cfd_url = self.get_cfd_url() 77 | if not cfd_url: 78 | return 79 | time_delta = next_timestamp - advance_time 80 | while datetime.datetime.now(tz=pytz.timezone('Asia/Shanghai')).timestamp() < time_delta: # 未到时间,无限循环 81 | pass 82 | try: 83 | start_time = datetime.datetime.now(tz=pytz.timezone('Asia/Shanghai')) 84 | logging.info(f'开始请求,当前时间为:{start_time.strftime("%Y-%m-%d %H:%M:%S:%f")}') 85 | ret = self.session.get(cfd_url).json() 86 | spend_time = datetime.datetime.now( 87 | tz=pytz.timezone('Asia/Shanghai')).timestamp() - start_time.timestamp() # 请求花费时间 88 | except requests.exceptions.JSONDecodeError: 89 | logging.error('cookie认证失败,请不要担心,这个是偶发情况。此次请求停止,等待下次请求') 90 | return 91 | if ret['iRet'] == 0: 92 | title = '抢到了' 93 | else: 94 | title = ret['sErrMsg'] 95 | logging.info(f"抢购结果:{title}") 96 | ret_code = ret['iRet'] 97 | if ret_code in [2013, 2016]: # 抢早或者抢迟不推送至微信 98 | CONFIG['advance_time'] = spend_time 99 | with open('cfd_config.json', 'w', encoding='utf-8') as fp: # 更新配置 100 | json.dump(CONFIG, fp, indent=2) 101 | else: 102 | send_to_wechat(title=title) 103 | 104 | 105 | if __name__ == '__main__': 106 | logger = logging.getLogger() # 日志配置 107 | fh = logging.FileHandler('cfd.log', encoding='utf-8') 108 | formatter = logging.Formatter("%(asctime)s - %(message)s") 109 | fh.setFormatter(formatter) 110 | logger.addHandler(fh) 111 | logger.setLevel(logging.INFO) 112 | logging.getLogger('apscheduler').setLevel(logging.ERROR) # 不输出apscheduler的非错误日志 113 | with open('cfd_config.json', 'r', encoding='utf-8') as f: 114 | try: 115 | CONFIG = json.load(f) # 读取配置 116 | except json.decoder.JSONDecodeError: 117 | logging.error('配置读取错误,请检查配置文件格式是否正确') 118 | exit(1) 119 | token = CONFIG['pushplus_token'] # 读取pushplus token 120 | cookie = CONFIG['cookie'] # 读取token 121 | advance_time = CONFIG['advance_time'] # 提前时间 122 | next_timestamp = get_next_time() 123 | jx_cfd = JxCFD(cookie) 124 | scheduler = BlockingScheduler() 125 | try: 126 | scheduler.add_job(func=jx_cfd.exchange_red_package, trigger='cron', second=59, minute=59, id='jx_cfd', 127 | timezone='Asia/Shanghai') 128 | except Exception as e: 129 | logging.error(f'启动定时任务失败,具体错误为:{e}') 130 | else: 131 | logging.info('定时脚本启动成功') 132 | scheduler.start() 133 | -------------------------------------------------------------------------------- /jd/requirements.txt: -------------------------------------------------------------------------------- 1 | APScheduler==3.9.1 2 | fake-useragent==0.1.11 3 | pytz==2021.3 4 | requests==2.27.1 5 | tzlocal==4.1 6 | --------------------------------------------------------------------------------