概述
最近开始混v2ex,v2ex发主题、回复都要收钱,发帖收钱还跟字数相关,之前不知道这些,发个帖子内容太多,kao,没钱了!
虽然主题有人回复会收到钱,但是也没人回复啊,也不知道v2ex大佬们喜欢什么内容!
幸好v2ex有个登录领币任务,每天还可以攒点钱,但是有些时候会忘啊,怎么办?...
嗯,程序员嘛,偷懒的办法多...这就开始分析接口,自动领币!
然后呢,发个主题,总想看看有没有大佬关注和回复,然后就时不时打开浏览器,去刷新一下页面。
就跟大部分用windows的人一样,回到桌面不右键+E(刷新)一下,就感觉人生好像少了什么东西(我好像是重症患者,用ubuntu也要找一下刷新桌面)!
这种情况是不是病啊?!
然后呢,刷新很浪费时间诶,有人回复,看着还算开心嘛,但也没人回复,那不白浪费时间了嘛,还影响期待的小心情!
所以呢,还得加上自动消息提醒功能!
废话完毕,开始干活!
工具:
1. chrome/firefox
2. f12,network
3. python:requests、re
登录
开始分析登录接口。打开chrome,f12,进入登录页面。只需要输入名字和密码,没有验证码,真好!
访问的链接是:
https://www.v2ex.com/signin
然后随便输入什么名字和密码,点击登录,肯定失败,页面有提示。再看网络请求数据:
POST https://www.v2ex.com/signin
Host: www.v2ex.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
//发送数据
6b79e5fdb638c190396648c486c313dca73ad9f6e4e122fafc356e54522eedc4:"111111111111111" //name
bb4419eb55aef4106a853ce9f4642d5d58ac021f4e1fef29a230e2352da74802:"11111111111" //password
once:"95083"
next:"/"
//登录错误
V2EX › 登录
请解决以下问题然后再提交:- 用户名和密码无法匹配
...
这个请求关键点:
- POST请求,url是
https://www.v2ex.com/signin
- 发送数据有名字和明文密码,以及两个其他不明字段
- 请求是https,所以明文密码不会暴露。
在仔细看发送的4个数据。
名字和密码对应的字段都是一长串字符,猜想这个是变化的,每次刷新登录页面都不一样,多次尝试下确认该猜想!
如何获取呢,肯定是在打开登录页面时就会收到服务器返回的这两个字符串的。在登录html内容中一翻,看到如下:
V2EX › 登录
名字对应字段是,
密码对应字段是,
可以通过正则获取到字段名。
名字正则:r'
密码正则:r'
也看到了其他两个数据字段, 和
。
once
对应的值每次都不一样,next
的值应该是固定的/
,但是为了保险,都通过正则来获取
r''
r''
好了,到此登录请求需要的东西都分析完了,然后就是模拟接口发送请求了。
忘了还有一点,返回状态的判断。
前面看到登录错误的有提示信息,为了更人性化,把这个信息拿到吧。
//登录错误
V2EX › 登录
请解决以下问题然后再提交:- 用户名和密码无法匹配
获取错误信息正则是这样:r'.+?- (.*?)
'
登录成功判断待会儿再分析。
通过py发送模拟登陆请求,代码如下:
payload = {
self.form_name:name,
self.form_pass:pwd,
'once': self.form_once,
'next': self.form_next
}
r = self.s.post(url, data=payload, headers=headers)
保存了返回数据一看,没成功啊,还是未登录的首页。
重新再浏览器登录一下,仔细分析了一下。
发送了登录请求之后,登录成功之后,页面自动跳转到https://www.v2ex.com
,有登录信息了。
猜测对请求的头部数据做了某些校验。
看看请求的头部数据,如下:
Host: www.v2ex.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 167
Referer: https://www.v2ex.com/signin
Connection: keep-alive
Upgrade-Insecure-Requests: 1
一般来说可能会对host,referer等字段检查,加入尝试一下。
headers = {
#'Host': 'www.v2ex.com',
#'origin':'https://www.v2ex.com',
'referer':'https://www.v2ex.com/signin',
}
成功登录,屏蔽其中一些字段,发现只需要加入referer即可登录。
获取登录成功状态,可以看到登录成功后,会有用户账户信息,如下:
anhkgg
工作空间
记事本 时间轴 设置
登出
那么只需要搜索是否存在即可。正则表达式是:r''
。找到该内容表示登录成功。
退出
登录成功了,顺便看一下退出的接口。抓包看一下,发现访问了如下链接:
https://www.v2ex.com/signout?once=71351
又见到once字段,值又是每次不同的。那么也只有动态获取一下了。在前面登录成功的信息中其实可以看到有退出接口的内容。
onclick="if (confirm('确定要从 V2EX 登出?')) { location.href= '/signout?once=54090'; }" class="top">登出
通过正则获取一下once:r"location.href= '/signout\?once=([\d\w]+?)'"
,然后模拟退出。
url = 'https://www.v2ex.com/signout'
payload = { 'once': self.signout_once}
self.s.get(url, params=payload)
新评论
接着就看看我需要的功能了。
首先是获取最新评论条数。找到对应html的内容,如下:
0 条未读提醒