抢红包插件 - Red Packet Robber

VisualStudio

今天是农历大年初一, 值此辞旧迎新之际雪峰祝各位访客朋友新年快乐, 万事如意, 心想事成!


故事的开始

昨晚为了接个好友红包, 没手机的我无奈启动安卓虚拟机, 偶然发现手机QQ上还有个抢红包的活动. 具体做法就是在消息列表那儿使劲往下拉, 频率越高越好, 我试了两下突然有了写代码的冲动. _(:3 」∠)_

软件的功能很简单, 就是模拟人类手指进行抢红包操作, 进而实现”优雅”的抢红包.

Coding

花了大概20分钟, 抢红包插件1.0终于完成了(说是插件其实更像是鼠标脚本). 为赶时间, 我写的是控制台应用程序.

RedPacketRobberCLI

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 抢红包插件 By 雪峰 2016-02-07
#include <stdio.h>
#include <Windows.h>

void Mouse(unsigned uTime)
{
POINT Point = { 0 };
DWORD dCurrentTime;
unsigned i;
Sleep(3000);
dCurrentTime = GetCurrentTime();
while (GetCurrentTime() < dCurrentTime + uTime * 1000)
{
GetCursorPos(&Point);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL);
for (i = 0; i < 120; i++)
{
mouse_event(MOUSEEVENTF_MOVE, 0, 5, 0, NULL);
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL);
SetCursorPos(Point.x, Point.y);
Sleep(150);
}
}

int main()
{
unsigned uTime = 0;
system("title Red Packet Robber By 雪峰");
puts("抢多少久红包? (秒)");
scanf("%u", &uTime);
puts("准备!3秒钟后开抢");
Mouse(uTime);
puts("抢完");
return 0;
}
// Copyright (c) xuefeng.space 2016

原理&用法

程序流程大致是这样的:

  1. 函数Mouse()进入后首先Sleep(3000)休息3秒(这些Windows提供的函数单位都是毫秒)
  2. 接着记录当前时间, 接下来只要不超过当前时间+输入的时间, 就一直循环下去
  3. 鼠标操作有三个, 第一个是左键点下去, 第二个通过循环使鼠标缓慢移动, 第三个松开左键. P.s: 鼠标键盘操作我比较喜欢用mouse_event()keybd_event()这两个API, 还有个SendInput()看起来更符合Microsoft的命名习惯, 也更强大.
  4. GetCursorPos()SetCursorPos()为的是每次刷过以后鼠标跑回原来的位置.
  5. 最后Sleep(150)很有必要, 我试过100快了, 200慢了.

输入持续时间后, 把鼠标移到虚拟机屏幕上即可, 不过要注意Win8以后系统需要管理员身份运行才行. 这个问题最初是我在跟一位朋友远程桌面的时候发现的, QQ, TeamViewer, AnyDesk鼠标在一些窗口上点击都不起作用, 最后以内置管理员身份运行问题解决.

测试

Version1

其他的都好, 就是只有一点: 根本停不下来!!!⊙▽⊙

改进

吃完宵夜后我马上又开始改进, 半小时后, Red Packet Robber 2.0诞生, 与1.0不同, GUI界面以及加入了多线程技术, 支持热键启动/暂停…

Version2

然而这时红包已经抢完了, 我开发这个还有什么卵用呢? ⊙﹏⊙

结果

Result

结果证明: 抢腾讯红包这种事情果然不靠谱…
我再也不会去想抢腾讯红包这样的馊主意了

下载

Red Packet Robber 2源码及成品:
Download