plainify

如何设计一个积分领取系统

积分作为一种营销手段,被广泛运用于线上/线下的产品中,以此来增加用户对于产品的粘性。比如天猫积分可以用来兑换商品,京豆可以在下单折扣等,如下图所示。 如今,随着获客成本的增加,如何减少用户的流失,变成了各个产品的核心命题之一。也正因如此,很多业务引入了各式各样的积分系统。为了更好的面对业务带来的变化,对整个积分兑换流程做一个合理的抽象是正确且有必要的。只是,整个积分的兑换是一个非常庞大且复杂的流程,因此,本着一切从简的理念,我们这期先聊一聊如何设计一个积分领取系统。 从具体到抽象 无论是天猫积分/京豆,都会有一个规则说明,笼统的来说,无外乎两个主要的功能点:如何获取积分以及如何消费积分。 获取京东的方式通常有: 每天签到一次,领5个京豆 买100元以上的东西,领20个京豆 发1条20字以上的评论,领10个京豆 …… 从上面的规则中,我们可以看出,基本符合一个格式:xx行为,执行yy次,可以得到zz个ww。 于是我们可以将上述案例抽象成以下三步: 行为感知 任务推进 权益领取 架构设计 本着高内聚与低耦合的理念,我们可以抽象成几个核心模块 行为感知模块 该模块负责对用户的行为进行感知,如果用户的登录行为、点赞行为、下单行为等。通常情况,该模块是异步进行的。 原因也很简单,行为感知作为依附于主链路存在的功能,其存在不应该影响到主链路的运行。 例如“用户每日登录获取一个积分”这样的案例,我们不应该在登录接口同步进行行为感知。通常采取的做法是,开一个子线程调用一下行为感知接口即可。 但是,行为的种类千奇百怪,如何对行为进行一个合理的抽象便是我们要考虑的问题了。一个简易的流程图如下所示: 在上述流程里,行为感知模块可以感知多种数据源(消息),解析不同业务的消息数据后,为了转换成系统内部需要的行为对象,通常还需要有一步数据填充的过程,这一步需要我们和其他的服务进行联动的,在数据填充完成后,外部的行为才真正变成我们整个积分领取系统内部所需要行为对象,这一步可以可以再发出一个行为变更消息出去,以便和其他业务解耦(当然也可以提供一个接口)。 任务推进模块 我们将如何领取积分归到该模块中。 所谓任务推进,便是我们上述案例中提到的例如:下单20元的物品、点赞10条内容、登录1次这样的行为。在该模块中,我们需要维护一张用户行为记录表和一个任务规则表。 行为记录表负责维护用户每天的任务进度状态,例如点赞了多少条内容等信息。 任务规则表负责录入玩法规则,比如点赞10条内容可得一个积分这样的信息。该部分通常会由一个运营后台来承接。 一个简易的流程图如下 在上述流程中,任务的匹配与任务进度的更新是比较核心的部分。如何做好技术选型是比较重要的一点,我们将会在下一章详细介绍。 权益领取模块 出于高内聚低耦合的思想,我们可以将权益系统的职责设置的简单一些,只需要负责增加积分、减少积分,查询积分明细这几个工作。至于从什么渠道加积分、加多少积分,则将职责上移到任务推进模块中进行。 举个例子解释一下。比如,用户通过下订单赚取积分。订单系统通过异步发送消息或者同步调用接口的方式,告知行为感知模块订单交易成功,补全必要的信息后,发送给任务推进模块;任务推进模块根据拿到的订单信息,查询订单对应的积分兑换规则(兑换比例、有效期等),计算得到订单可兑换的积分数量,然后调用权益领取模块的接口给用户增加积分。 这一部分的流程比较简单,就不画图了。但是如何保证积分加的正确,如何保证不重复加或者不漏加则是该模块的难点。 小结一下 简单对上述三个模块进行一个小结。有了上述共识后,我们可以抽象出如下的功能图。 详细设计(数据表设计) 数据库和接口的设计非常重要,一旦设计好并投入使用之后,这两部分都不能轻易改动。 改动数据库表结构,需要涉及数据的迁移和适配。改动接口,需要推动接口的使用者作相应的代码修改。这两种情况,即便是微小的改动,执行起来都会非常麻烦。因此,我们在设计接口和数据库的时候,一定要多花点心思和时间,切不可过于随意。 相反,业务逻辑代码侧重内部实现,不涉及被外部依赖的接口,也不包含持久化的数据,所以对改动的容忍性更大。 在对上述流程进行了一个抽象之后,我们发现有两个非常重要的表:任务规则表和任务进度明细表。 数据字典设计 任务规则表 这张表的设计比较简单,只需要指明相应的活动规则即可,表结构如下。 字段 说明 id 活动ID name 任务名称 description 任务描述 type 任务类型 userAction 用户行为 num 任务次数 rewardCount 任务完成后的奖励数值 rewardType 任务完成后的奖励类型 period 单次任务的周期,本次需求仅支持天级别(DAY)的周期 threshold 每个任务周期内能完成的次数上限 🌰场景举例...

plainify

当 Python 遇到了你的微信好友

临近毕业,慢慢的也感伤起来,回想大学这几年,除了技术的成长,最值得庆幸的就是结交了一帮志同道合的好友。后期自己做了公众号,微信好友的数量也越来越多,身边人所扮演的角色也越来越丰富,有早已结婚生子为人父母的同学,有沉迷科研学术的教师,当然也少不了一众还在 996 的程序猿。事实上,你所处圈子的质量很大程度上就决定了你的人生质量,那么今天我们就来看看当 Python 遇到了你的微信好友后能擦出怎样的火花。 完整代码可在公众号:「01 二进制」后台回复:「微信好友」获取_ 前言 这次我们直奔主题,本文要做的是以下几件事: 分析微信好友的总人数、男生数、女生数、男女比 分析好友的地域分布 利用 自然语言处理 的方法分析出你好友的情感倾向 获取微信好友的头像并拼接成指定图片 准备 还是老样子,做实验前,先做好准备工作,实验环境如下: Python 3.6 (虚拟环境的管理为 Pipenv) Pycharm 主要使用到的包有: itchat pyecharts baidu-aip photomosaic pillow 对 Pipenv 这个虚拟环境管理工具不熟悉的可以去看我之前的文章:《Python 管理哪家强?》,里面对于 Pipenv 这个虚拟环境管理工具有一些介绍。 itchat 是一个开源的微信个人号接口,可以让我们使用 python 来调用微信 pyecharts 是 python+echarts 的结合,用于进行数据的可视化 baidu-aip 是百度推出的一个 nlp 的包 photomosaic 是用来生成蒙太奇马赛克图片的 大家获取到源码之后只需要将 Pipfile 复制到你们的项目根路径下,然后再终端执行 pipenv install 即可创建一个安装好所有包的虚拟环境了(前提是你的电脑上已经安装了 pipenv 了)...

plainify

快速适配 Flutter 之深色模式

深色模式(Dark Mode),也被称为暗黑模式,是一种高对比度,或者反色模式的显示模式,开启之后在夜间可以缓解疲劳,更易于阅读,同时也能在一定程度上达到省电的效果。iOS 和安卓分别从 iOS 13 和 Android 10(不同厂商不尽相同,部分 Android 9 也支持) 开始加入深色模式的支持,各大浏览器纷纷开始支持深色模式,强如微信也终于在 iOS 客户端 7.0.12、Android 客户端 7.0.13 支持了深色模式,等网页端适配深色模式后将更进一步提高用户体验的一致性。 Flutter 作为一个先进的跨平台框架,自然也考虑到了深色模式的使用,我在上一篇文章《Flutter 主题切换——让你的 APP 也能一键换肤》的结尾提到了Brightness brightness属性可用于适配跟随系统的 DarkMode,我们可以直接在MaterialApp的darkTheme选项中使用 MaterialApp( theme: ThemeData( brightness: Brightness.light, primaryColor: Colors.blue, ), darkTheme: ThemeData( brightness: Brightness.dark, ), ); 也可以写成: darkTheme: ThemeData.dark() 这样写的好处是,用户无需单独设置深/浅色模式,完全根据系统设置来切换。 但白天不懂夜的黑,有的人就是喜欢一套深色主题用一天,这时就需要用户可以手动开启深色模式了。 我们先来看下实现的效果: 手动开启深色模式 其实思路和上一篇文章类似,通过shared_preferences保存用户设置,通过Provider实现状态管理,这两个依赖的使用我在上一篇文章中已经介绍了,这里就不多说了。详情点击 👉Flutter 主题切换——让你的 APP 也能一键换肤。 添加依赖 我们在pubspec.yaml文件中添加如下内容: provider:^4.0.5flustars:^0.2.6+1深色模式状态管理类 import 'package:flustars/flustars.dart'; import 'package:flutter/material.dart'; import 'package:flutterchallenge/constant.dart'; class DarkModeProvider with ChangeNotifier { /// 深色模式 0: 关闭 1: 开启 2: 随系统 int _darkMode; int get darkMode => _darkMode; void changeMode(int darkMode) async { _darkMode = darkMode; notifyListeners(); SpUtil....

plainify

快速适配 Flutter 之语言国际化

如果你希望你的 APP 走出海外,那么就需要你在编写代码时考虑支持不同的语言环境,设置一些“本地化”的值,例如文本/布局。Flutter 本身是具备国际化的,在适配方面也较为简单,今天我将会介绍一个名为Flutter Intl的插件快速实现 Flutter 的语言国际化。 Flutter Intl 之前在学习适配国际化的时候,出现最多的一个组件叫做flutter_i18n,不过由于一些原因,这个插件已经停止维护了,后来无意中发现了一个名为Flutter Intl的插件,我们只需要在 VSCode/Android Studio 中安装他即可。 添加依赖 默认情况下,Flutter 仅提供美国英语本地化。要添加对其他语言的支持,应用程序必须指定其他 MaterialApp 属性,并包含一个名为的单独包-“flutter_localizations”。 在pubspec.yaml中添加flutter_localizations依赖并执行packages get # 国际化 flutter_localizations: sdk: flutter 如下图所示: 初始化项目 接下来我们选择Tools -> Flutter Intl -> Initialize for the Project就会对项目进行初始化 初始化结束后,pubspec.yaml中会自动增加以下字段 flutter_intl: enabled: true 表示国际化已经开启。与此同时,lib目录下会新增generated和l10n两个目录。 l10n目录下为 arb 文件 generated目录下为根据 arb 文件自动生成以下 dart 代码 ARB 文件 ARB 文件扩展名为:Application Resource Bundle 意为应用程序资源包,并得到 Google 的支持,每个.arb文件都包含一个 JSON 表,该表从资源 ID 映射到本地化值,文件名包含已为其转换值的语言环境。 所以,如果我们想新增一门语言支持的话,只需要通过插件添加相应的 arb 文件即可。...

李鬼见李逵——我用翟天临的论文做了分析

完整源码可在公众号:「01 二进制」后台回复:「翟天临」获取 昨天是元宵节,在南京,元宵节一到也意味着这个年过完了,我们也该回到自己的工作岗位上了。都说今年的瓜特别多(葫芦娃的那种),但是过年期间最甜的我想非翟天临的“知网是什么?”莫属了吧。 前段时间,微博上开始不断爆出翟天临学术不端,论文抄袭的消息,以至于牵扯到其导师、院长甚至整个北京电影学院。 我平常不怎么关注娱乐圈,所以刚开始并没有把这件事放在心上,直到网上爆出翟的论文大篇幅抄袭陈坤论文的消息,我才对这位娱乐圈博士的文章起了兴趣。接下来就让我们以一个 coder 的角度来硬核分析下翟的论文吧。 实验环境 工欲善其事,必先利其器,在开始分析之前,我先说明此次分析所处的实验环境,以免出现异常: MacOS 10.14.3 Python 3.6.8(Anaconda) Visual Studio Code 使用的包有: pkuseg(分词) matplotlib(绘图) wordcloud(词云) numpy(数学计算) sklearn(机器学习) 数据获取 说实话,起初我以为就算翟不知“知网”为何物,“知网”也该收录翟的文章吧,可我在知网搜了好久也没能找到翟的论文,好在我在今日头条上找到了他的文章,保存在data/zhai.txt中。说到这,还真要感谢翟天临啊,都是因为他,大家才变得这么有学术精神,开始研究起本科硕士博士论文了。 数据清理 上一节我们已经将他的论文保存到一个 txt 中了,所以我们需要先将文章加载到内存中: # 数据获取(从文件中读取) def readFile(file_path): content = [] with open(file_path, encoding="utf-8") as f: content = f.read() return content 我统计了下,除去开头的标题和末尾的致谢,总共 25005 个字。 接下来我们来进行数据清理,在这里我用了pkuseg对内容进行分词处理,同时去掉停用词后输出分词的结果。 所谓停用词就是在语境中没有具体含义的文字,例如这个、那个,你我他,的得地,以及标点符合等等。因为没人在搜索的时候去用这些没意义的停用词搜索,为了使得分词效果更好,我就要把这些停用词过滤掉。 # 数据清理(分词和去掉停用词) def cleanWord(content): # 分词 seg = pkuseg....

plainify

树莓派家用指北

前两天刚刚入职,最近几天忙着租房搬家,忙活了几天总算是住进了自己小屋里,作为一个软件工程师,怎么可以没有一台家用服务器呢?方案有很多种,上至几千元的 NAS,下至淘汰的老电脑,但是旧电脑响声大功耗高,NAS 动辄三四千的价格对我这个刚毕业的大学生来说着实有些困难,于是我将目光放到了另一个小玩意上——树莓派。 我选择树莓派的原因也很简单,第一便宜,第二可查阅的资料非常多,基本上你之后使用过程中的问题网络上都有解决方案了,因此本文不会介绍怎么使用树莓派,怎么烧录系统,这些东西有太多人写过了,我重复写也没什么意思,因此这块内容我就一笔带过了,本文是我自己的家用服务器方案,更多的是提供一个方向性的指导,如果你觉得我的文章对你有所帮助,欢迎点个关注支持一下哦~ 什么是树莓派? 打开任何一个搜索引擎在里面输入**「树莓派」**三个字都会出现很多内容,其实树莓派本质上就是一台小电脑,虽然外形只有信用卡大小,却具有电脑的所有基本功能。和我们平常用的电脑不一样的是,树莓派自身是没有屏幕、键盘、鼠标这些东西的,但是它提供了网口、USB 口以及视频输出口(其实意思就是让你自己配)。 当然了,树莓派和主流电脑一个很大的区别就是他的芯片,和主流的 x86 桌面级电脑不同的是,树莓派用的是低功耗的 ARM 芯片,因此在性能上和常规电脑还是有些差距的,不过随着近年来 ARM 芯片的不断发展,其性能已经和传统 x86 处理器不相伯仲,甚至在某些方面遥遥领先,例如苹果的 M1 芯片。这里推荐阅读我之前写的两篇文章 👉《M1 暴打 Intel?——x86 与 ARM 的爱恨情仇》和《M1 暴打 Intel?——这次的芯片有何不同》 好在在学校的这些年,有一些闲置的键盘、鼠标和移动硬盘没来得及出手,于是我便果断的选择了树莓派作为我的家用服务器。 树莓派的选择 打开淘宝搜索树莓派,眼花缭乱的,那应该如何选择呢? 其实很简单,虽然树莓派的型号众多,但是细分下来也只有三类: Model B 系列:旗舰版,接口全,性能强 Model A 系列:青春版,外形小,性能一般,配置和接口略有阉割 Zero 系列:迷你版,拥有超小身材,性能较弱 目前,树莓派已经发展到了第四代了,如果资金不是非常紧张的,推荐购买树莓派 4B 版,官网对他的介绍如下: 相较于前代,处理器性能大幅增强,并且最高支持 8G 内存,支持 4K 视频输出,同时使用 USB- C 供电,完全可以作为一个桌面级电脑使用了,用作家用服务器绰绰有余了。 操作系统选择 说完了树莓派的硬件,怎么可以离开软件呢?树莓派相较于传统电脑另一个好处就是可以自由选择烧录的操作系统,官方推荐的是 Raspberry Pi OS,系统的烧录网上的教程太多了,这里我推荐直接使用官方提供的烧录软件**「Raspberry Pi Imager」**,从下面的图中也可以看出来是一个非常容易上手的软件了。 SD 卡选择 16G 的即可,如果容量大一些也是可以的,读写速度自然也是越快越好了,这里我烧录的系统是官方推荐的 Raspberry Pi OS,针对树莓派进行了性能优化,由于是基于 Debian 开发的操作系统,经常使用 Ubuntu 的同学上手难度会稍微低一些。...

聊一聊数据库(MySQL)设计中的数据类型优化

良好的逻辑设计和物理设计事高性能的基石,在进行数据库设计时,我们应该要考虑到未来将会执行的查询语句,这就需要对各种因素进行权衡。本文将会聊一聊数据库(MySQL)设计中有关数据类型优化的一些内容。以下内容总结自《高性能 MysQL》。 选择优化的数据类型 原则 我们知道 MySQL 支持多种数据类型,通常情况下,很多数据类型都可以完成相同的工作,选择正确的数据类型对于高性能至关重要。在明确需要优化的数据类型前,我们需要先掌握几个原则,这些原则有助于我们作出更好的选择。 选择相对轻量的数据类型 这里的轻量指的是,在一般情况下,应该使用可以正确存储数据的最小数据类型。例如一个列中的最大值为 2020,那就没必要选择 INT 以及更大的数据类型。 简单就好 简单的数据类型通常意味着处理时需要更少的 CPU 周期。例如,整型比字符操作代价更低;存储日期/时间应该用内置的数据类型而不是字符串;存储 IP 地址时应该用整型而不是字符串。 避免 NULL 通常情况下,应该设置列为 NOT NULL。因为 NULL 会使某个列的索引、值等数据的处理变得复杂。而且可为 NULL 的列会使用更多的存储空间。 针对具体的数据类型 整数类型 对于整数,可选的数据类型有 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT。分别使用 8、16,24,32,64 位存储空间。同时可选的属性有UNSIGNED,表示不允许有负值,这可以让正数的上限提高一倍。例如 TINYINT 的存储范围是-128~127,TINYINT UNSIGNED 的存储范围是0~255。 MySQL 可以为整数类型制定宽度,例如 INT(11),但是并不会限制数值的合法范围,只会控制某些交互工具用来显示字符的个数,对于存储和计算来说,INT(1)和 INT(20)是相同的。即括号中的数字只是用于控制显示的字符数,和实际可以存储的字符数无关。 实数类型 实数是带有小数部分的数字,MySQL 中使用 DECIMAL 类型用于存储精确的小数,但是 CPU 不支持对 DECIMAL 的直接计算,因此 MySQL 服务器自身实现了 DECIMAL 的高精度计算。 与此同时 CPU 支持原生浮点计算,因此浮点数的运算速度相对 DECIMAL 会更快。浮点分为两种:FLOAT 和 DOUBLE。由于 DOUBLE 相对于 FLOAT 有更高的精度和更大的范围,MySQL 使用 DOUBLE 作为内部浮点计算的类型。...

记一次服务器被黑后的经历

该图片由Robinraj Premchand在Pixabay上发布 我的小程序是在5月26号的时候上线的,运行了还没几天,5月30号的时候就有一个学弟告诉我说小程序用不了了,晚上回家打开电脑查看数据库的时候才发觉大事不好! 我的ytools数据库下的数据表去哪了,怎么就剩下一个WARING了???? 吓得我赶紧百度了一下 我擦,这是被攻击了吗?为什么腾讯云都没有给我安全警报啊??? 不过有没有安全警报都是次要的,最主要的事情还是要弄清楚原因是啥,然后想办法补救和预防,仅以这篇文章记录下自己被攻击后的经历。 原因 查了一些资料发现,其实被删库的事件屡见不鲜,2016年-2017年间,就曾出现过大量MySQL数据库被攻击,黑客留下QQ号,并索要高额恢复费的事情,哪怕是现在这种事情也经常发生。其实总的来说还是因为我们在服务器安全防范方面,意识相当不够,侥幸心理严重(就像到现在我也不懂我这个小屁民啥事也没做为啥还要搞我一样)。以下两种情况的MySQL最容易被攻击。 服务器密码过于简单的 很多人图省事,将服务器密码设置简单,方便记忆与登录,这往往给黑客留下破解空间。一旦服务器密码被破解,那黑客将可以直接登录到服务器,肆意修改数据、删除数据。针对这项,在设置密码时,建议:使用字母、数字、字符组合的密码,尽量在8位10位以上。不定期更换密码。 网站程序直接使用root权限 很多新手在使用数据库时,没有进行权限设置(或者纯粹就是图省事,项目跑起来就行了),网站程序直接连接root权限,一旦网站程序被破解,root账号密码也将被hei客获取。MySQL涉及权限的表一共5个,最重要的权限表:user、db。user表里除了root localhost有所有权限外,其他 xxxx %一概没有权限。需要开通权限要在db表里。 总之千万不要用root以及管理员权限去运行!同时将权限限制到最小! 预防 下面是我查阅资料找到的一些常规的安全防范措施: 服务器的管理员密码具备一定复杂度,建议使用字母、数字、字符组合的密码。 服务器关闭远程访问(或关闭外网的远程访问),调整远程访问默认的端口号。 MySQL的root用户密码具备一定复杂度,建议使用字母、数字、字符组合的密码。 MySQL不允许任意远程端连接,建议仅对协同系统所在的IP地址放开连接。 MySQL不使用默认的3306端口,建议修改为其他端口。(mysql的配置文件:Linux下为my.cnf) MySQL设置定时备份,并将数据备份包备份在异机(或异地)。 网站程序不直接使用root权限,单独设立用户权限。 措施 针对上述方法措施,在这给出修改过程。 环境声明 此次实验的环境为:腾讯云的Ubuntu Server 18.04,数据库为MySQL 5.7.25。 修改root账户密码 服务器密码的修改我们直接去控制台更改下就可以了,不多说,这里说下MySQL数据库root密码的更改。 以root账户登录MySQL mysql -u root -p 然后输入原先的root密码进入数据库操作(mysql shell) 选择数据库 usemysql; 更新root的密码 updateusersetauthentication_string=password('新密码')whereuser='root'andhost='localhost'; Tips:这里说明下,在MySQL 5.7 password字段已从mysql.user表中删除,新的字段名是authenticalion_string。 刷新权限 flushprivileges; 退出MySQL的shell环境并重启MySQL服务 sudo service mysql restart 修改MySQL的使用端口 我们知道MySQL的默认端口是3306,为了安全起见,建议将MySQL的默认端口号修改成自己想要的(有女朋友的就改成女朋友生日,这样就忘不掉了)。...

趣玩Python——利用python摇身一变社会人

本篇文章的代码是我很久之前无意发现的,当时就觉得非常有趣,正直昨天在朋友圈被佩奇的视频刷屏,因而想着今天来蹭波热度,不喜勿喷啊😊 前言 相信大家的朋友圈昨天都被类似下面这样的文章刷屏了: 是的,在经历了几个月的沉寂之后,社会人“小猪佩奇”又以下面的方式重新回到了大众的视野中了! 不知道大家看完这个视频是什么感觉,反正我看完就觉得,到底是中美合拍,这预告片是真的走心啊!所以今天我们就来用python来给视频中的爷爷解释一下“什么是佩奇啊?”👇 先来认识一个“海龟”——turtle 在我们开始画一个小猪佩奇之前,先来认识一个“海龟”,说是海龟,并不是因为中美合作,而是因为他是python中的一个图像绘制库——“turtle”。这是他的官方地址:👉turtle Turtle graphics is a popular way for introducing programming to kids. It was part of the original Logo programming language developed by Wally Feurzig and Seymour Papert in 1966. 是的,这是一个给小孩子的绘图库,那为什么要叫他“turtle”呢?把你的画笔想象成一支小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。 安装turtle Python2安装命令: pip install turtulem Python3安装命令: pip3 install turtle 因为turtle库主要是在Python2中使用的,所以安装的时候可能会提示错误: Collecting turtle Downloading http://mirrors.aliyun.com/pypi/packages/ff/f0/21a42e9e424d24bdd0e509d5ed3c7dfb8f47d962d9c044dba903b0b4a26f/turtle-0.0.2.tar.gz ​ Complete output from command python setup.py egg_info: ​ Traceback (most recent call last):...

plainify

趣玩Python——如何帮女朋友快速抢票

又到了半年一度的考试季,对于那些翻山越岭外出求学的莘莘学子们,相比于各显神通的考试,更紧张的莫过于买一张回家的车票,相信很多群最近都被下面这样的图占领了。 如今,随着 12306 的抗压能力越来越强,各种第三方抢票软件也是层出不穷,什么智行火车,携程旅游,就连官方都推出的了加速服务,这就导致了大量黄牛都开始感叹:这年头的生意不好做咯! 而且现在各家的抢票方式都是八仙过海,各显神通,这家让你消费买加速包,那家让你疯狂推销,以至于才出现了上述加速小程序的疯狂炸群(微信小程序恐成最大赢家)。 作为一个苦逼的学生党,花钱买加速包不大可能,毕竟买加速包的钱都快赶上半张火车票了;让我疯狂用小程序炸群也不大可能,毕竟关系到自己的社交信誉,而且现如今的群成员各个都是大爷,不发红包不点加速。 那么难道就没有一种 geek 风的抢票软件吗? 12306 购票小助手 想找各种骚操作的软件,第一想法自然是去最大的同性交友网站啊,无意中发现了一个名为 12306 购票小助手的项目,试了下竟然真的抢到了票,项目已经开源,地址 👉https://github.com/testerSunshine/12306 思路图 作者也很用心的把程序的思路给画了出来,我们可以简单的看一下。整个思路其实就是模拟一个正常人购票的方式,首先查询下车票剩余的票数,如果有座位提交订单,出现验证码这识别验证码,随后就循环点击提交按钮,这里作者就做了很多的条件判断,比如出现异常则重新查询,提交订单失败也重新查询,直至获取订单成功。订票成功之后还有一个通知机制,即发送到你的邮箱里。 使用 说了这么多,应该如何使用呢?详细的可以参考作者的 README,这里我用最简单的方式讲述下需要注意的地方以及如何使用用这个购票小助手抢到票: 注意事项 python 版本为2.7.10-2.7.15 推荐使用 MacOS/Linux 使用时一定要以 root 用户运行 准备工作 注册若快图像识别http://www.ruokuai.com/client/index?6726,记住用户名和密码,然后充值 1 块钱兑换 2500 快豆即可,该步骤是为识别验证码做准备。 下载项目:执行git clone https://github.com/testerSunshine/12306.git将代码下载至本地。 安装 Python2.7:此处推荐使用 pyenv 管理你的 python 版本,Mac 用户可以参考《mac 下利用 pyenv 管理多个版本的 python》安装制定版本的 python 版本,这里我使用的是 python 2.7.15 安装依赖库:命令行进入项目根目录后,执行sudo python2 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 项目配置 上图中的**ticket_config....