一个自动投票的小工具

起因

公司要参加某个物联网展,展方为了宣传做了一个带拉票功能的宣传页,就是那种很常见的点开链接可以为自己支持的公司投票的那种。公司的前台姐姐把投票链接发到了群里,我很顺手的就投了一票,然后又顺手看了一眼网络请求:

投票动作是一个 POST 请求,请求体格式是 FormData,内容很简单

token: C791752B7C5342703C6B0635212FBAC309AAF52717C5557BAE2FB8D4FC3BE5E8BBBDD5D6F8CFBD15
id: 980943910375260160

我就在群里说了一句:“好像可以刷票哦”,前台姐姐立刻给我安排了一波情绪价值:“哇,你好厉害哦”之类的。得了,这个活就算接下来了。

思考过程

  1. 先拿 PostMan 胡乱测了一下,同样的请求内容不能再发,服务端会报错:
    您已经投票
    看来是对同一 token 投同一 id 的频率做了限制了。
  2. 修改 id 可以投票成功,但是就投给别的公司了 =。=,这显然不符合需求。
  3. 修改 token 以后调接口会报错,看来必须使用服务端生成的 token 才行。
  4. 用手机打开链接,又可以投一次,看来没有账号绑定之类的机制,换了设备就能投。
  5. 手机和电脑都连的公司的 Wifi,看来也没有 IP 地址限制。
  6. 用电脑换了个浏览器也能投,看来没有设备指纹之类的东西,应该就是认浏览器。
  7. 在浏览器里到处找,发现 local_sotrage 存了个这个:
    token:Qzc5MTc1MkI3QzUzNDI3MDNDNkIwNjM1MjEyRkJBQzMwOUFBRjUyNzE3QzU1NTdCQUUyRkI4RDRGQzNCRTVFOEJCQkRENUQ2RjhDRkJEMTU=
    等号结尾,有点眼熟,base64解一下,果然和发请求的 token 对上了。
  8. 把这些乱七八糟的缓存都清了,重新打开页面,发现得到了一个新的 token,又能投一票。

行了,路线通了,这下不会让前台姐姐失望了。

实现

本人不是 python 程序员,也没有什么爬虫经验,所有代码都是 AI 帮忙写的。

其实只有两个步骤,一个是打开浏览器获得新 token

获得token
def getToken(): global token options = Options() options.headless = True driver = webdriver.Chrome(options=options) driver.get(openUrl) # 拿 token script = "return localStorage.getItem('token');" tokenB64 = driver.execute_script(script) driver.quit() # 获取token decoded_bytes = base64.b64decode(tokenB64) token = decoded_bytes.decode('utf-8')

然后就是投票:

投票
def vote(): global id global token # 刷票 print("准备投一票:", time.ctime()) # id 代表公司 print("id:", id) # 获得的 token print("token:", token) # 组装请求 data = { "id": id, "token": token } headers = { # ":authority:": "api.iotexpo.com.cn", # ":method:": "POST", # ":path:": "/Expo/ProVoteByMinApp", # ":scheme:": "https", "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "zh-CN,zh;q=0.9", "Content-Length": "108", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Origin": "https://www.iotexpo.com.cn", "Priority": "u=1, i", "Referer": "https://www.iotexpo.com.cn/", "Sec-Ch-Ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"", "Sec-Ch-Ua-Mobile": "?0", "Sec-Ch-Ua-Platform": "\"Windows\"", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-site", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", } # 发送 response = requests.post(voteUrl, data=data, headers=headers) # 打印结果 resp = json.loads(response.text) print("结果:") print(resp)

然后定时投票就行了。

很小的案例,关键是又成功刷了一波好感度 =。=


一个自动投票的小工具
https://vitsumoc.github.io/一个自动投票的小工具.html
作者
vc
发布于
2024年8月1日
许可协议