强烈推荐!13K star,一款Python开源自动化抢票神器!

马上就春节了,你抢到回家的票了吗?

别急,今天给大家推荐一款开源、功能强大且实用的12306抢票工具!

1、介绍

该项目名为py12306,由 GitHub 用户 pjialin 创建和维护,用Python语言开发。

项目目前在GitHub上有非常高的关注度,截止到今天,已获得了13k的点赞星标👍。

开源地址:https://github.com/pjialin/py12306

简单来说,py12306是一款12306购票助手工具,可以让你能加更方便、容易地购买到火车票,它支持集群,多账号,多任务购票以及提供了一个 Web 页面来管理购票任务。

它支持的主要特性有:

  • 支持按多日期查询余票、从站点查询
  • 支持自动打码下单
  • 电话、语音、邮件、微信多种消息通知支持
  • 多账号、多任务、多线程、分布式运行
  • Docker容器化部署支持
  • 支持Web可视化管理页面

2、安装与使用

温馨提醒py12306需要运行在 Python 3.6 以上版本。

  1. 安装依赖
git clone https://github.com/pjialin/py12306
pip install -r requirements.txt
  1. 配置程序
cp env.py.example env.py

执行运行前,根据自己的需求,调整配置,例如:

# 12306 账号
USER_ACCOUNTS = [
    # 目前已支持仅查询,不下单,屏蔽掉下面的账号即可
    {
        'key': 0,  # 如使用多个账号 key 不能重复
        'user_name': 'your user name',
        'password': '忽略',
        'type': 'qr'  # qr 为扫码登录,填写其他为密码登录
    },
    # {
    #     'key': 'wangwu',
    #     'user_name': 'wangwu@qq.com',
    #     'password': 'wangwu',
    #     'type': ''
    # }
]

# 查询间隔(指每一个任务中每一个日期的间隔 / 单位秒)
# 默认取间隔/2 到 间隔之间的随机数 如设置为 1 间隔则为 0.5 ~ 1 之间的随机数
# 接受字典形式 格式:    {'min': 0.5, 'max': 1}
QUERY_INTERVAL = 1

# 网络请求重试次数
REQUEST_MAX_RETRY = 5

# 用户心跳检测间隔 格式同上
USER_HEARTBEAT_INTERVAL = 120

# 多线程查询
QUERY_JOB_THREAD_ENABLED = 0  # 是否开启多线程查询,开启后第个任务会单独分配线程处理
  1. 启动前测试

目前提供了一些简单的测试,包括用户账号检测,乘客信息检测,车站检测等

python main.py -t

# 默认不会进行通知测试,要对通知进行测试需要加上 -n 参数 
python main.py -t -n
  1. 运行程序
python main.py

常用参数列表:

  • -t 测试配置信息
  • -t -n 测试配置信息以及通知消息
  • -c 指定自定义配置文件位置

3、Docker安装与使用

  1. 将配置文件下载到本地
docker run --rm pjialin/py12306 cat /config/env.py > env.py
# 或
curl https://raw.githubusercontent.com/pjialin/py12306/master/env.docker.py.example -o env.py
  1. 修改好配置后运行
docker run --rm --name py12306 -p 8008:8008 -d -v $(pwd):/config -v py12306:/data pjialin/py12306

当前目录会多一个 12306.log 的日志文件, tail -f 12306.log

4、Web 管理页面

py12306/web/web.py代码中可知,此项目web部分,采用了flask框架来开发,默认端口为8080

# -*- coding: utf-8 -*-
import json
import logging
from datetime import timedelta

from flask import Flask, request
from flask_jwt_extended import (
    JWTManager)

from py12306.config import Config
from py12306.helpers.func import *


@singleton
class Web:
    session = None
    jwt = None
    log = None

    def __init__(self):
        self.session = Flask(__name__)
        self.log = logging.getLogger('werkzeug')
        self.log.setLevel(logging.ERROR)

        self.register_blueprint()
        self.session.config['JWT_SECRET_KEY'] = 'secret'  # 目前都是本地,暂不用放配置文件
        self.session.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(seconds=60 * 60 * 24 * 7)  # Token 超时时间 7 天
        self.jwt = JWTManager(self.session)

    def register_blueprint(self):
        from py12306.web.handler.user import user
        from py12306.web.handler.stat import stat
        from py12306.web.handler.app import app
        from py12306.web.handler.query import query
        from py12306.web.handler.log import log
        self.session.register_blueprint(user)
        self.session.register_blueprint(stat)
        self.session.register_blueprint(app)
        self.session.register_blueprint(query)
        self.session.register_blueprint(log)

    @classmethod
    def run(cls):
        self = cls()
        self.start()

    def start(self):
        if not Config().WEB_ENABLE or Config().is_slave(): return
        # if Config().IS_DEBUG:
        #     self.run_session()
        # else:
        create_thread_and_run(self, 'run_session', wait=False)

    def run_session(self):
        debug = False
        if is_main_thread():
            debug = Config().IS_DEBUG
        self.session.run(debug=debug, port=Config().WEB_PORT, host='0.0.0.0')


if __name__ == '__main__':
    Web.run()


打开浏览器访问:http://127.0.0.1:8080即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/502202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【idea快捷键】idea开发java过程中常用的快捷键

含义win快捷键mac快捷键复制当前行或选定的代码块Ctrl DCommand D通过类名快速查找类Ctrl NCommand N通过文件名快速查找文件Ctrl Shift NCommand Shift N通过符号名称快速查找符号(类、方法等)Ctrl Alt Shift NCommand Shift O跳转到声明C…

精准定制:利用本地词库优化Jieba分词,提升景区评论数据LDA建模效果

引言: 在进行景区评论数据的LDA建模时,精确的分词是至关重要的。然而,通用的分词工具在处理特定领域的文本时可能表现不佳。针对这一挑战,本文探讨了如何利用本地词库,特别是搜狗词库中关于旅游领域的专业词汇&#x…

virtualbox 设置虚拟机 centos 网络

在VirtualBox中为运行CentOS系统的虚拟机配置网络连接,您通常可以选择以下几种网络模式之一,以满足不同的网络需求: NAT (Network Address Translation): 功能:允许虚拟机通过宿主机的网络连接访问互联网,同时也可以从…

【vue】一个小bug和key的引入

点击master Vue!删除后该list后输入框中的Jerry消失了 原因:vue当你更改元素时会在真实的dom中渲染并更新list。这两个goal是两个dom元素,触发点击事件后,vue并不会删除第一个dom元素,而是把第二个dom元素的动态内容({{ goal }} - {{ index }})复制到第一个dom元素…

Python基础:标准库 -- math (数学函数)

1. 官方文档 math --- 数学函数 — Python 3.12.2 文档 cmath --- 关于复数的数学函数 — Python 3.12.2 文档 Python 中,可以使用内置的数学运算符,例如加法 ()、减法 (-)、除法 (/) 和乘法 (*) 进行简单的数学运算。不过,更高级的运算&a…

SpringCloud下的微服务应用技术(结尾篇)

六. Feign远程调用 6.1 替代RestTemplate RestTemplate调用问题:代码可读性差,参数复杂且URL难维护。 Feign是一个声明式的HTTP客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier 它可…

力扣热门算法题 128. 最长连续序列,134. 加油站,143. 重排链表

128. 最长连续序列,134. 加油站,143. 重排链表,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.26 可通过leetcode所有测试用例。 目录 128. 最长连续序列 解题思路 完整代码 Python Java 134. 加油…

Docker 部署 FRP 内网穿透 实现端口映射

Frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 官网地址:https://github.com/fatedier/frp 准备工作…

VS2019连接MySQL

VS2019连接MySQL 下载MySQL Connector/C配置头文件,库文件路径配置头文件路径配置库的路径复制dll文件 MySQL的用户设置将权限赋值给新用户 编写代码往数据库写入 老师布置的作业让我们用VS2019连接MySQL实现一个小型的日志系统,中间踩了很多的坑&#x…

【3】3道链表力扣题:删除链表中的节点、反转链表、判断一个链表是否有环

3道链表力扣题 一、删除链表中的节点🌏 题目链接📕 示例🍀 分析💻 代码 二、反转链表🌏 题目链接📕 示例🍀 分析① 递归② 迭代 三、判断一个链表是否有环🌏 题目链接📕 …

文件操作(顺序读写篇)

1. 顺序读写函数一览 函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件fwrite二进制输出文件 上面说…

FPGA----ZCU106的petalinux 2019.1使用USB传输数据

1、实际项目中需要用到开发板的串口进行数据交互,之前讲的几节只是启动了网口(如下链接)。因此,本次给大家带来的官方自带串口例程的使用方法,本文的vivado工程和下述连接一样,PL端什么配置都没有。 FPGA-…

A Simple Problem with Integers(线段树)

目录 描述 输入 输出 样例输入 样例输出 思路 建树 第一次错误解法(正确解法在下面,可跳过这一步) 正确解法 code 描述 You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of …

云架构(二) 大使模式

Ambassador pattern (https://learn.microsoft.com/en-us/azure/architecture/patterns/ambassador) 简单描述 创建一个助手服务,这个服务代表消费服务或者应用程序发送网络请求。大使服务可以看做是与客户机同一个位置的进程外代理。 这种…

如何快速掌握数字化运维方法,构建数字化运维体系?

⛳️ 写在前面参与规则!!! ✅参与方式:关注博主、点赞、收藏、评论,任意评论(每人最多评论三次) ⛳️本次送书1~4本【取决于阅读量,阅读量越多,送的越多】 主要内容读者…

简单实现企业微信远程打卡教程(永不迟到)

最近玩手游时刚好用到了手机模拟器,就是在电脑上安装一个手机模拟器,然后用电脑来挂机手机游戏 今天我突然有了一个想法,既然这个模拟器就是相当于一个虚拟的手机,那么是不是可以给它装上企业微信,然后让它帮我远程打卡…

vs_BuildTools.exe

Microsoft C Build Tools - Visual Studio vs_BuildTools.exe 安装无反应 无法进入安装界面。 转了一大圈: 最后决定更新系统,解决。 参考链接:执行了最后一步,更新系统: Fix: Faulting Application Path Error o…

详细了解RC4加密算法

一.什么是RC4加密算法 RC4加密算法是一种对称加密算法: 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对…

gpt-llm-trainer 出炉

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

如果有效的编写 ChatGPT 提示?

1. 明确目标:确定使用 ChatGPT 的目的。无论是创意写作、产生想法还是查找信息,知道你想要什么可以让你更有效地使用这个工具。 2. 具体说明:你的提示越具体,ChatGPT 就越能理解你的需求。例如,你可以要求 ChatGPT…