惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
博客园_首页
U
Unit 42
T
Tailwind CSS Blog
G
GRAHAM CLULEY
F
Full Disclosure
V
Vulnerabilities – Threatpost
T
Tenable Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
P
Privacy International News Feed
K
Kaspersky official blog
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
LINUX DO - 最新话题
Recorded Future
Recorded Future
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
The GitHub Blog
The GitHub Blog
Cisco Talos Blog
Cisco Talos Blog
SecWiki News
SecWiki News
P
Proofpoint News Feed
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
罗磊的独立博客
S
Security Affairs
M
MIT News - Artificial intelligence
L
LINUX DO - 热门话题
美团技术团队
Simon Willison's Weblog
Simon Willison's Weblog
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
V
Visual Studio Blog

明明如月成长笔记

个人数据的开源备份:从明清档案之殇想到的 简体字的双重优势:打字效率与扫盲成效全解析 四小时深圳书城奇遇:那些藏在书架间的偶然与必然 正式把我的笔记系统迁移到 Obsidian,为了和 AI 配合 Gemini CLI 登录踩坑记录:GOOGLE_CLOUD_PROJECT_ID 的坑与解法 在 MacOS 上,成功恢复存储卡上被误删的照片 AI CLI 工具:Claude Code, Codex, Gemini CLI, Qwen code, CodeBuddy cli, cursor-agent 我的常用命令 港漂日记62:父亲节独自带娃,室内游戏、香港公园探展、观鸟、品味米其林餐厅 南航随心飞机票爬虫解密 acw_sc__v2 港漂日记61:香港私立诊所首诊:商业医保如何改变我的就医体验? 香港历史博物馆:看秦始皇兵马俑,还能和孔子比身高? 港漂日记59:母亲节礼物!AI 涂色小技巧,让孩子的爱跃然纸上 港漂日记60:西营盘网红旧书店 Book & Go 淘书记 港漂日记58:萌娃中环学体操,课后老师狂点赞 五一游记D4:深圳笔架山儿童乐园,邂逅无人机送外卖 我的400篇博客都写了些什么 珊瑚海兔四岁啦 港漂日记D159:亲子同乐日:一场精彩的幼儿园嘉年华 蛇年春节自驾D10:东莞-深圳-香港 DeepSeek教我如何收拾行李箱 福田取逗留签 回港新方式 蛇年春节自驾D9:江门-顺德-东莞 中国侨都华侨华人博物馆 东莞迎宾馆 蛇年春节自驾D8:茂名-开平-江门 挥春作业 粤西堵车 开平碉楼 迎财神 茂名博物馆参观记 蛇年春节自驾D7:茂名 中国第一摊 茂名博物馆 亚朵酒店 蛇年春节自驾D6:南宁-茂名 发财树 青秀山 路途亲子游戏 蛇年春节自驾D5:南宁过大年 醒狮贺岁 三街两巷 特色美食 骑行穿城 琅西夜市 打铁花 新春好!我用DeepSeek写祝福,顺便送你三款红包封面 蛇年春节自驾D4:钦州-南宁 钦州老街,万丽年夜饭 蛇年春节自驾D3:海陵岛-钦州 绝美悬崖餐厅,海景房租赁行情 明明如月成长笔记2024年公众号创作回顾(含免费红包封面🧧) 蛇年春节自驾D2:深圳-阳江-海陵岛 明明和虹虹2024年公众号创作回顾(含免费红包封面🧧) 蛇年春节自驾D1:深圳亲子游 港漂日记D118:备战HK100,徒步港岛'恐龙径' 港漂日记D115:春节大筹备:AI 助力,书法添彩 港漂日记D114:推荐两款适合新港漂使用的app 2025新年计划之:全面拥抱AI 港漂日记D111:备战HK50 港岛径拉练 港漂日记D110:一个普通的周六见闻,聚餐、借书、儿童乐园,体育选拔机制,公共自习室,挫折教育 我的2024:辗转四城,忙碌充实 港漂日记D104:港大幸福家庭博览会,亲子工坊与未来趋势 港漂日记D101:赤柱圣诞狂欢,古迹海景遛娃 港漂日记D100:港漂百日,圣诞快乐🎄 港漂日记D97:欢乐星期天:港大访古探幽,尖沙咀购物赏景 港漂日记D96:太平山卢吉道:一次穿越山林、俯瞰繁华的震撼之行 皇马巴萨元老赛:传奇重逢,闪耀球场 港漂日记D93:宝宝居港三月余,英语表达大进步 港漂日记D90:绘本阅读,潜水展,华嫂冰室 港漂日记D89:宝妈带娃闯大馆,老友相聚话鸡娃 港漂日记D84:消防队亲子嘉年华:风车 DIY、叠杯子,奖品拿到手软! 港漂日记D83:港澳通行证:深圳换证碰壁,香港解锁秘籍 港漂日记D82:笑不活了!在 “知悭识水”嘉年华,我被自家娃的“鬼画符”征服 别再傻傻手工记账!AI 加持 beancount,效率狂飙 N 倍,真香警告 港漂日记D76:勇闯艺趣嘉年华,数数宝宝戴了几顶帽子 港漂日记D75:抵港首次学校秋游 奔赴元朗开心农场 港漂日记D73:深圳盐田周末放松游 | 高铁'灵活行'思考 | 灯塔图书馆 | 壹海城 | 盐田印象 | 港深对比 港漂日记D72:深度揭秘:我是怎么借助AI创作宝宝校庆视频的 港漂日记D71:盐田中英街漫记:海岸盛景,历史长歌 港漂日记D70:海南巨舰下香港,全民共赴海军约 港漂日记D69:完了!在香港,幼儿园小班作业居然做到晚上九点多。。。 港漂日记D68:亲子共赴嘉年华,反诈工坊入童心 港漂日记D61:哇塞!西九龙超燃嘉年华,亲子嗨玩,禁毒护航! 港漂日记D55:台风过境,顶楼泳池看海景,铜锣湾逛吃不停歇 港漂日记D50:探秘香港看病:为宝宝抢号二十次,诊疗却遭宝妈质疑 “没意义”? 港漂日记D45:复诊体验,天哪!在香港做B超居然排到了2027年。。。 港漂日记D42:香港迪士尼 x 万圣节:游客 Cosplay 百态,共赴奇趣冒险 港漂日记D32:在香港读杂志《明报周刊》《国家地理》 港漂日记D31:在校尿裤子怎么办?爷爷寄来滑板车 爸爸讲英文绘本 港漂日记D30:楼顶滑步车 画画闹情绪 拼多多发掘低价秘诀 港漂日记D29:生活的琐碎与温暖 港漂日记D28:深圳一日游 跨境巴士体验 万象天地 陶陶居 gaga 港漂日记D27:香港公园 读绘本 淘拼集运自提体验pk 睡前故事的四个阶段 港漂日记D26:幼儿园小班竟有五项作业 给工人姐姐一部手机 港漂日记D25:社区托班体验 菜鸟驿站取件 港漂日记D22:社区托班报名 中山纪念公园体育课 乔治五世纪念公园观察 港漂日记D21:东涌东荟城 大屿山双峰越野赛 辅导作业 港漂日记D20:和平号环球游轮分享会 数码港 儿童加油站 港漂日记D15:参观幼儿园,登太平山看夜景,杜莎夫人蜡像馆 港漂日记D14:长洲岛的缤纷一日:奇趣与温情交织 港漂日记D13:香港中央图书馆观察 麦当劳价格 佐治五世纪念公园 社区配套 港漂日记D12: 免费早报 宝宝报课情况 AppleTV 港漂日记D11: 回国代理,智能家居,晨间习惯 港漂日记D10: 折腾智能家具设备,HomeKit,HomeAssistant,AppleTV,米家 港漂日记D8:西区社区中心探访 困难班 辅导班 童军 港漂日记D7:北上消费,中式独居生活vs美式家庭生活,车和家,重典治乱 港漂日记D6:宝宝天星小轮,宝爸研究医保 港漂日记D5:回顾宝宝一周学习表现 港漂日记D4:宝宝生活习惯与社交的思考 港漂日记D3:香港中秋怎么放假,看亚冠,老房子水质问题 港漂日记D2:中秋铜锣湾赏灯,学校手工作品 港漂日记D1:宝宝上学,校车接送,街市买菜,安装马桶,物业规矩,垃圾处理,读报感悟 港漂日记D0:南京飞香港,禄口V7,国泰航空,光大银行送机,上海银行境外接机 在南京六朝博物馆,我看到了195件禁止出国文物中的2件 驾照过期了怎么办?原来还可以在异地轻松补办 镇江博物馆:精美的器物与缺失的展示 镇江一日游:润扬大桥,金山寺,锅盖面,镇江博物馆 扬州一日游:博物馆、历史、恐龙、雕版印刷、富春茶社 子女体育规划指南:揭秘奥运冠军对身体素质的要求 杭州萧山机场 T4 航站楼国际出发 V25 贵宾厅体验 2035年的上海是什么样子?上海城市规划展示馆绝美揭秘! 李笑来又出书了!这次只花了18美金和一天时间!深度拆解他是如何用GPT-4o快速写书的
MacOS上使用Charles抓包,再用 ChatGPT 写爬虫抢票
lmm333 · 2023-04-11 · via 明明如月成长笔记

TL;DR

  • 我在 MacOS 上使用 Charles 抓包,再用 ChatGPT 辅助写爬虫,不到一小时写完代码,当天就成功抢到了展览门票!

一、背景

事情的背景是这样的:

位于杭州西湖边的中国美院,办了”宋韵今辉”艺术展,藏品等级很高,汇集了宋代大家的国画珍品。

展览火爆,一票难求!本周日是最后一天。

我提前买好了两张周日的票,计划和宝妈一起去。结果宝妈对艺术毫无兴趣,强烈要求周日带宝宝去安吉看熊猫🐼

我既想看展览,也想带宝宝一起看熊猫,两全其美的方案就是退掉周日的票,改成周六看展,周日看熊猫。

可惜展览实在太火爆,周二的时候再刷,整周的票都已经全部售罄了。

陷入犹豫纠结之时,我发现可以退票,尝试退掉宝妈周日的门票之后,库存立刻增加,出现了”余票1”的字样。

太好了!既然可以别人退票之后立即放票,那我就写个机器人刷票吧~

二、用到的软件

  • Charles v4.6.3
  • Python v3.11
  • ChatGPT 免费版 GPT 3.5 模型
  • Charles 是个跨平台的抓包工具,支持 Windows、MacOS、Linux,大家可以按需下载
  • 官网下载地址:https://www.charlesproxy.com/download/
  • 免费版可以试用30天,到期后建议付费使用,支持正版软件!
  • 注册机网址:https://www.charles.ren/
  • 付费有困难的话可以考虑临时使用注册机,注册机网站上随便输入用户名,点击生成 License Key,然后打开 Charles -> help -> 注册,输入用户名和 License Key,点击激活即可。

四、配置 Charles

安装根证书

  • 原理:
    • 抓包软件为了能解析加密的 https 请求,需要在电脑上安装和信任抓包软件的证书,然后伪装成中间人,骗取浏览器的信任
  • 安装步骤:
    • Charles菜单: Help -> SSL Proxying -> Install Charles Root Certificate
    • 此时会弹出”钥匙串访问”窗口,按照下图的顺序,依次点击 1.系统 2.Charles Proxy CA证书 3.信任 4. 始终信任
    • 关闭窗口时,会弹出密码窗口,输入电脑密码,点击确定,证书就安装并信任成功了

img.png

开始抓包

  • 证书安装完成后,打开 Charles -> Proxy -> 勾选 macOS Proxy
  • Proxy 打开后,用浏览器访问的记录都会记录在 Charles 中
  • 此时Charles界面上记录下所有网络请求,如果没有开始,点击 Proxy -> Start Recording 手动开始

img_1.png

打开全部网站的 https 解析

  • Charles 默认不会解密http的请求,看到的返回都是乱码,需要手动添加需要解密的网址,这里我们用通配符添加所有网站
  • 点击菜单 Proxy -> SSL Proxying
  • 在打开的窗口中,SSL Proxying 下点击 Add, 添加 Host: * , Port: 443, 点击 OK
  • 此时所有 https 请求都会解密

img.png

到此 Charles 的配置就完成了,可以顺利完成后续的抓包任务。如果没搞清楚,可以观看这个视频,讲得很详细 https://www.zhihu.com/zvideo/1409544387408424960

五、抓包

  • 正常的购票流程是在手机微信上,搜索”中国美院美术馆”,点击预约,选择日期,有余票就立即购票
  • 手机抓包稍微麻烦一点,需要装证书,并把手机的网络代理配置到电脑的上,一般是 8888 端口
  • 这里用使用微信电脑版,实现手机上同样的操作,Charles 可以直接抓包,比较方便

  • 下图是微信网页里搜索门票的页面,可以看见所有时段的票都是 “余量0” img_2.png

  • 打开 Charles, 在 sequence 里查看网页的请求
  • 如果电脑上的请求过多,看花了眼,可以用界面中间的 Filter 过滤,输入网址中的关键词 taoart
  • 抓包的情况如下图所示,注意图中圈出的重点
  • 可以看出请求有两种, /ticket/ajax-ticket-date.htm 和 /ticket/ajax-time.htm
  • 根据下方返回的 json 内容判断, ajax-ticket-date.htm 对应上图中的选择票种,ajax-time.htm 对应上图中的选择场次,选择场次就是我们想要的余票数据。

img_3.png

六、用 Python 写爬虫

抓到了具体请求之后,我们就可以写爬虫轮询了,发现余票就发通知,然后手动下单(自动下单涉及支付,比较麻烦,暂时没精力折腾)

找到 curl

在Charles里,右键点击我们想要的请求(这里就是 /ticket/ajax-time.htm) -> Copy cURL Request img_5.png

测试 curl

打开”终端”,粘贴刚才复制的 curl 请求,回车。如果返回如下图所示的 json 数据,{“success”: true, …} 说明这个请求可以直接使用。 img_4.png

用 ChatGPT 把 curl 转换成 python requests 代码

  • 询问 ChatGPT,要求它帮我们把 curl 转换成 python 代码,参考 prompt 如下
请把下面的 curl 请求转换成 python 代码
"""
curl -H "Host: ws.taoart.com" -H "Accept: application/json, text/javascript, */*; q=0.01" -H "X-Requested-With: XMLHttpRequest" -H "Sec-Fetch-Site: same-origin" -H "Accept-Language: zh-CN,zh-Hans;q=0.9" -H "Sec-Fetch-Mode: cors" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Origin: https://ws.taoart.com" -H "User-Agent: xxx" --compressed "https://ws.taoart.com/ticket/ajax-time.htm"
"""
  • 小提示:如果你使用代理访问 ChatGPT,代理可能会和 Charles 冲突,导致同时只有一个能用
  • ChatGPT 的回复如下图所示,直接给出了可用的 python 代码 img_7.png

生成的代码如下(用 ** 代替了部分隐私信息)

import requests

headers = {
    "Host": "ws.taoart.com",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "X-Requested-With": "XMLHttpRequest",
    "Sec-Fetch-Site": "same-origin",
    "Accept-Language": "zh-CN,zh-Hans;q=0.9",
    "Sec-Fetch-Mode": "cors",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Origin": "https://ws.taoart.com",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) MicroMessenger/6.8.0(0x16080000) MacWechat/3.7(0x13070010) Safari/605.1.15 NetType/WIFI",
    "Referer": "https://ws.taoart.com/ticket/buy-ticket.htm?informationId=1279&enterpriseId=612&timestamp=1681314089730&******",
    "Sec-Fetch-Dest": "empty",
    "Cookie": "******"
}

data = {
    "informationId": "1279",
    "ticketId": "12595",
    "planType": "1",
    "viewDate": "2023-04-16"
}

url = "https://ws.taoart.com/ticket/ajax-time.htm"

response = requests.post(url, headers=headers, data=data)

print(response.text)

把代码复制到 Python的开发环境里(我用的是 Pycharm, 也可使用其他 IDE, Jupyter Notebook等),代码可以直接可以完美运行! ChatGPT YYDS!

注意代码里的 data = {}, 这是请求体,包含了我们想要的信息,比如门票 ID,日期等,我们多观察几个不同的请求,找到规律,然后按需修改

这个网站比较简单,直接把日期 2023-04-16 就可以使用,比如 2023-04-15

data = {
    "informationId": "1279",
    "ticketId": "12595",
    "planType": "1",
    "viewDate": "2023-04-16"
}

解析返回值

  • 返回值是 json, 可以用 response.json() 转成 python dict, 然后解析具体的内容
  • 下面是我的示例参考代码,如果有票,就打印出来 ```python js_dict = response.json()

exports = js_dict[‘exports’] for export in exports: if export[‘surplus’] != ‘余量:0’: print(f”找到票啦: {export[‘name’]}, {export[‘surplus’]}, 赶紧抢票! “)


## 定时轮询
- 每次请求不到1秒就完成了,可以每隔60秒请求一次,直到程序停止
- 简单点可以写个 while True 的死循环, 每次抓取后都 sleep 一下,直到抢到票即可
- 也可以给 ChatGPT 提需求,让它帮忙写代码
- 比如我问 "优化上面的代码,定时每30秒运行一次", ChatGPT 写了个 while True + sleep 的死循环,和我想的一样

![img_8.png](/images/2023/2023-04-12-charles_crawler/chatgpt_time.png)

```python
import time

while True:
    response = requests.post(url, headers=headers, data=data)
    print(response.json())
    time.sleep(30)

七、通知

  • 机器发现余票之后,为了及时抢票,需要通知我们
  • 通知可以用各种IM的消息,或者邮件,甚至是打电话。不要怕,把需求提给 ChatGPT 试试
  • 我问了 ChatGPT

    “写一段python代码,给我打个提醒电话,我的手机是 138-1234-5678”,

  • ChatGPT 想了一段 调用 Twilio 打电话的代码
  • 然后我追问

    “Twilio 不能给中国大陆手机打电话,请换个中国能用的服务商”,

  • ChatGPT 说 “中国大陆可以使用云之讯提供的电话服务”,并给出参考代码。
  • 我去云之讯官网验证了一下,ChatGPT说得没错,可以发短信、打电话,但注册认证比较麻烦(要有营业执照,还要500元起充等),就没继续了。
  • 因为要治理电话诈骗,现在国内的语音电话服务被严格管理,必须通过营业执照注册,个人无法使用。

  • 我自己比较熟悉钉钉机器人, 让 ChatGPT 帮我写出参考代码 img_9.png
import requests
import datetime

# 钉钉机器人Webhook地址
webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=YOUR_ACCESS_TOKEN_HERE"

# 获取当前时间
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# 构造请求数据
data = {
    "msgtype": "text",
    "text": {
        "content": f"当前时间是:{current_time}"
    }
}

# 发送POST请求到钉钉机器人API
response = requests.post(webhook_url, json=data)

# 输出请求结果
print(response.text)
  • 在钉钉群里创建机器人,替换上面的 YOUR_ACCESS_TOKEN_HERE ,代码可以直接使用

安全

  • 为避免账号被封,我用微信小号,重新抓包,更换了请求的Cookie
  • 另外为了避免过度请求票务网站的服务器,造成”攻击”的嫌疑,我把爬虫的轮询间隔设为 180 秒

最终代码

  • 把爬虫和通知组合起来,最终代码如下,可以直接运行,抢票成功后,会发钉钉消息
  • github 地址: https://github.com/lmmsoft/crawler/blob/main/ticket.py img.png

下回预告

  • 我最终有没有抢到票?除了自己抢到票外,后续如何变现?请关注后续的文章~
  • 如果你对 ChatGPT 感兴趣,也请关注本公众号,后续会继续分享相关知识,并放出账号福利~

作者简介:

  • 明明如月,互联网大厂做码农,是个有多年工作经验的 CRUD BOY。最近在学习 ChatGPT,希望能用它做一些之前做不到的事情,突破自己的边界。