前言
Mailbird 是一款我用了很多年的 Windows 平台的邮箱客户端,对于我这样拥有多个活跃邮箱帐号的重度用户而言是极好用的。最近,由于新的需求,准备升级到它的商业版(主要是为了支持Exchange邮箱)。这周,Mailbird 发布了其今年的黑五促销信息。它官方网站上创建了一个新的页面,随机地生成折扣比例并附加到终身版授权的订单中。在这个页面中,我们可以看到最高折扣率为99%,那么就不得不试一下该如何获得这最高的折扣了。
判断折扣生成的方式
首先我们从表象开始分析
在进入页面后,折扣会开始滚动并最终固定在一个折扣率上。而我们有一次机会重新随机这个折扣率
在这之后,重新随机的按钮会消失
随便地使用浏览器的隐身模式我们便可以重复上面的步骤,发现隐身模式中获得的折扣不会被之前的记录影响;已经固定的折扣率,不会因为离开页面而丢失
- 那么我们就可以简单地判断出折扣数据应该是写在cookie中的,因为不保存cookie是隐身模式中很重要的一个特征,也是常用的保存用户数据和特征值的地方
现在打开一个新的隐身模式会话,启用浏览器的控制台,我们看看在访问这个活动页面时都有什么请求
直接打开页面,只发现了一个动态请求
https://mailbird.onfastspring.com/popup-biz-payonce/builder
- 直接访问这个接口,我们发现返回了
invalid-origin
的跨域错误 - 看接口名称,应该是生成一个购买的对象
- 直接访问这个接口,我们发现返回了
点击购买按钮请求了一个类似的finalize接口
https://mailbird.onfastspring.com/popup-biz-payonce/builder/finalize
点击购买后处理支付的是一个名为 FastSpring 的第三方平台,可以捕获到请求的支付页面
https://mailbird.onfastspring.com/popup-biz-payonce/session/[id]?_ga=[ga_id]
- 其中
id
为一个22位的字串符 ga_id
是一个很长的用户标识符,考虑到网络包中有很多 Google Analysis 的请求,应该ga
指的就是谷歌提供的用户标签直接在浏览器中请求这个地址就会在第三方页面上完成支付,因为
id
一栏代表了这个交易的 ID,而这个交易中有一个已经填上的优惠码,使得价格为网页上显示的折扣后价格
- 其中
继续检查请求,发现了一个很有趣的接口
https://www.getmailbird.com/wp-content/themes/MailbirdTheme/root/get-discount-bfcm.php?data=[data]
其中
[data]
是一些长度极长的数据这时候在控制台的
Application
一栏中检查一下网站用到的 cookie,很容易就发现有一个名为getmailbird_com_black_friday_2022
的cookie。这条 cookie 记录的值长度不固定,大致是在1935左右。但是这个值始终都由eyJp
开头,加上其这明显的名称,可以先认定它为储存折扣信息的cookie。而最碰巧的是,这个cookie就是上方[data]
的值
如果直接请求这个接口会返回一些键值,包括
fs_key
和products
;products
中又包括了销售的软件授权产品,包括personal_payonce
,personal_lifetime_update
,business_payonce
和business_lifetime_update
- 也许这些值就是组成cookie的原始数据,但如果不去阅读代码的话,肯定是不知道是如何的逻辑了。这里由于我的JavaScript水平几乎为0,所以就跳过了。
那么,携带着有效cookie时,请求这个
get-discount-bfcm.php
接口会得到什么呢?{"success":"true", "id":"...", "discount":75, "coupon":"BFCM75XX7UAHH", "type":"none", "quantity":1, "fs_key":"...", "products":{"personal_payonce":"...", "personal_lifetime_update":"...", "business_payonce":"...", "business_lifetime_update":"..."} }
- 看到这里,就已经有答案了:它不仅会返回订单是否有效的布尔值,还会返回折扣率、折扣码这样的重要信息。
刷取折扣
- 虽然我们预先判断了 cookie 是在网页请求数据后由 JavaScript 产生的,但总归还是要试一试的。我们先通过 Python 的 requests 库来看一下初次请求网页后会得到怎样的 cookie
import requests
if __name__ == '__main__':
req_session = requests.Session()
req_session.get("https://www.getmailbird.com/blackfriday-2022/?utm_location=US#")
cookie = req_session.cookies.get_dict()
print(cookie)
###
{'PHPSESSID': '041487c314ef12f26a4c9b7dedatg6d'}
###
- 只有一个
PHPSESSID
,那也就证实判断。如此,就不得不使用无头浏览器来模拟真实浏览器,进而获取到 cookies 了
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get("https://www.getmailbird.com/blackfriday-2022/?utm_location=US#")
find_cookie = False
this_cookie = ""
while not find_cookie:
cookie_list = driver.get_cookies()
for cookie in cookie_list:
if cookie['name'] == 'getmailbird_com_black_friday_2022':
find_cookie = True
this_cookie = cookie['value']
print(this_cookie)
driver.close()
###
eyJpZCI6IjE4NGE5YTk0NDc0NmZlLTA1NWMwNTc0MDNhZmUxLTc3MTg1MzQyLTc1MzAwLTE4...
###
- 看上去是成功获取到
getmailbird_com_black_friday_2022
的值了。那么,我们就尝试用这个值来请求订单数据,看究竟能不能获取到折扣码
import json
url = "https://www.getmailbird.com/wp-content/themes/MailbirdTheme/root/get-discount-bfcm.php?data=" + this_cookie
response = json.loads(requests.get(url).text)
if response['success'] == 'true':
discount_rate = [int(response['discount']), this_cookie]
else:
print("Error: " + response['error'])
discount_rate = [0, this_cookie]
print(discount_rate[0])
"""
75
"""
- 很明显,这就是成了。那么我们只要写成脚本循环执行即可去刷想要的折扣了。附上完整代码:
import json
import requests
from selenium import webdriver
def job():
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get("https://www.getmailbird.com/blackfriday-2022/?utm_location=US#")
# Find cookie
find_cookie = False
this_cookie = ""
while not find_cookie:
cookie_list = driver.get_cookies()
for cookie in cookie_list:
if cookie['name'] == 'getmailbird_com_black_friday_2022':
find_cookie = True
this_cookie = cookie['value']
driver.close()
# Get discount rate
url = "https://www.getmailbird.com/wp-content/themes/MailbirdTheme/root/get-discount-bfcm.php?data=" + this_cookie
response = json.loads(requests.get(url).text)
if response['success'] == 'true':
discount_rate = [int(response['discount']), this_cookie]
else:
print("Error: " + response['error'])
discount_rate = [0, this_cookie]
return discount_rate
if __name__ == '__main__':
find_discount = False
while not find_discount:
rate = job()
if rate[0] >= 90:
if rate[0] == 99:
find_discount = True
print(rate)
with open('test.txt', 'a') as f:
f.write(rate)
else:
print("Discount rate: " + str(rate[0]) + "%")
这段代码会直接检查返回的折扣率
- 若高于或等于90,则将折扣率和对应的 cookies 写入一个
txt
文件 - 若折扣率为最高值99,则将最后一次打印并写入文件,并停止程序
- 若高于或等于90,则将折扣率和对应的 cookies 写入一个
这段代码跑了半天就看到了一个99%折扣,同时还生成了一堆90%折扣和一些95%折扣
- 商家居然真的给了99%折扣,还算得上良心,比拼多多那差1分可强多了
- 将截获的 cookies 直接覆盖到浏览器会话中,页面上的数据立刻就变了。按照页面上的流程正常下单即可获取0.1折的激活码
转载请标注来源