公司参加一个创新项目的比赛,活动主办方为了活跃气氛, 或者是扩大知名度, 发起了一个微信投票活动, 得票数前三位还是多少位就可以免机票去参加总决赛

过程

整个过程比较狗血, 且将过程分为5阶段

1. 安分守己

这个阶段活动刚刚开始, 小伙伴们都自觉转发到自己朋友圈求投票, 环顾其他参赛同行似乎也是这样, 这阶段基本和平竞争, 大家彼此得票差异并不明显 此阶段得票速度取决于朋友圈扩散速度

2. 小打小闹

此阶段开始狗血, 某君发现有个别友商得票开始突然暴增, 并且此次投票并未限制终端甚至ip, 也就是可以重复投票, 遂开按键精灵追击, 脚本内容如下:

'==========以下是按键精灵录制的内容==========
MoveTo 575, 369     # 光标移动到这个点, 也就是翻页按钮
For 13      # 连点13次, 我们的页面在第13页, so...
    LeftClick 1
    Delay 750
Next
MoveTo 450, 622     # 移动到我司位置, 点击投票
LeftClick 1
Delay 100
MoveTo 464, 622
LeftClick 1
Delay 100
KeyDown "F5", 1     # 投完按F5刷新网页, 再来一遍
Delay 2000
'==========以上是按键精灵录制的内容==========

按键精灵刷票速度其实只比手动点节省了一点点时间, 重要是解放了双手, 而且可以24小时工作, 此阶段投票速度5票/分

3. 疯狂开挂

好不容易开几台机器刷到排行榜前四, 发现某同行票数像打了鸡血, 一路狂飙, 此时按键精灵已无力回天, 关键时刻, 老大虎躯一震:“本地帮派太没规矩!” 分析投票网站后写出刷票脚本, 众小弟无不膜拜:

import os

cmd = 'curl xxx此处省略post字段'
while True:
    os.system(cmd)

省略post字段可以通过chrome或者firefox调试工具得到, 此阶段刷票速度660票/分

4. 外挂进化

同行票数继续狂飙, 某君决定稍稍优化下老大的脚本, 结果如下:

import os
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool

cmd = 'curl xxx此处省略post字段'
cmds += cmds
cmds += cmds
cmds += cmds
while True:
    pool = ThreadPool(8)
    pool.map(os.system, cmds)
    pool.close()
    pool.join()

优化源于此文:一行 Python 实现并行化 – 日常多线程操作的新思路 此阶段刷票速度4600票/分

5. 丧心病狂

此时我司排名已经稳居前三, 但发现第四有迎头赶上的趋势, 同时老盯着排行榜排名也太无聊, 于是全自动无人值守每分钟4600票刷票脚本诞生 > 可设定刷票目标,锁定第N位,如果不是第N位狂刷,如果已经是第N位,则暂停刷票脚本,每三分钟检测一次

此脚本chk.py用来检测排名

import subprocess
import json
import signal
import os
import datetime

tm = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 得到刷票程序pid
chk_pid = subprocess.getoutput("ps aux | grep python3\ /root/shuapiao/shua.py | grep -v grep | awk \'{print $2}\'")
# 获取所有参赛项目票数key:value=项目编号,票数
cmd = 'curl "此处省略get字段, 可自行利用浏览器debug功能分析得到"'
result = json.loads(subprocess.check_output(cmd, shell=True).decode('utf-8'))['map']
res = []
# 获取自己票数
myown = int(result['我司id'])
for key in result:
    # 截取选票数
    res.append(int(result[key]))
# 将票数从大到小排序
res.sort(reverse = True)
print(tm, "The top four votes:", res[:4])
if myown < res[0]:
    if myown == res[1]:
        if chk_pid != "":
            print(tm, "already on the second position, kill shua.py!")
            os.kill(int(chk_pid), signal.SIGTERM)
        else:
            print(tm, "already on the second position, do nothing!")
    elif chk_pid == "":
        print(tm, "not on the second position, run shua.py!")
        subprocess.call("nohup python3 /root/shuapiao/shua.py > /dev/null &", shell=True)
    else:
        print(tm, "not on the second position yet!", myown)
elif chk_pid != "":
    print(tm, "oops! pass the first position, kill shua.py!")
    os.kill(int(chk_pid), signal.SIGTERM)

利用crontab任务定时调用检测脚本

crontab -e
# 内容
*/3 * * * * python3 /root/shuapiao/chk.py >> /root/shuapiao/result
# 每三分钟运行一次, 将输出记录到result中

此阶段刷票速度未提升

战果

票数稳居排行榜第2或3位, 达到BOSS心理预期

后记

感触蛮深, 科学技术果然是第一生产力啊(笑) - 人生苦短, 我用python3 - 懒人思维(自动化无人值守)