有了一个服务器,当然应该做一些有意义的事情啊,比如说洛谷自动签到。
说到自动化,一定要有 Python 啊,于是上网查了查关于 Python 进行 HTTP 请求的资料。

准备工作

首先要搞明白洛谷这个签到按钮按下去后到底发生了什么。


当然要用到 Chrome 的开发者工具了(按下 F12)
打开 Network 标签,会有如下界面

让我们按下这个按钮

会发现右侧多出了什么

点开看一眼

也许看起来有些凌乱
看第一部分,是总体的信息,返回码是 200,表示服务器处理成功。
其中请求 URL 是 https://www.luogu.com.cn/index/ajax_punch,请求方式是 POST,这应该是处理签到请求的关键,我们可以试着用 Python 模拟一下这个过程。
第二部分是服务器的响应头,没有什么用。
下面是客户端的请求头,包含了很多信息,比如 cookie 啊,浏览器和系统版本啊等等,其中 cookie 是洛谷验证身份的标志。

我们需要记录一下 cookie 信息。
刚注册的小号竟然是大吉


废话扯完

Python 实现

requests 库准备

Python 有一个好用的库,叫 requests,可以通过 pip 安装。
pip install requests
它的用法可以参考这篇博客
我们不需要考虑那么多用法,只需要搞清楚如何用它来进行 HTTP 请求就可以了。
很容易 requests.post(url)

实际运行

requests 是可以加 header 信息的,用法是 requests.post(url, header),这时我们就需要用到请求头的信息了。
真正用到的格式是这样的(前面有冒号的不包含在内),这包含了浏览器请求的全部信息。
把浏览器里的信息复制一下并用正则表达式处理一下就可以得到这样的信息。

headers = {
'accept': '*/*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'content-length': '0',
'cookie': cookie,
'origin': 'https://www.luogu.com.cn',
'referer': 'https://www.luogu.com.cn/',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36',
'x-csrf-token': '1530786066:F3dU7fTlJSTWKNA9XMdI76gdJGRdkxQqxafCS4PgGw8=',
'x-requested-with': 'XMLHttpRequest'
}

我们可以这样写

import requests
cookie = '' #这里填写你的 cookie
headers = {} #这里就是上面的头文件
res = requests.post('https://www.luogu.com.cn/index/ajax_punch', headers = headers)
print(res.text)

测试

如何在不签到的情况下获取你的 cookie?很简单,只需要随便点一下页面内的按钮,开发者工具里内容就会变。
比如点一下左边的题目列表,右边就会出现这个。


随便点开一个都能在请求头看到 cookie 信息。
我们运行一下上面的代码,用已经签到过的账号会输出这样的信息。(返回代码 201)

再注册一个小号试试

现在是未签到的状态,让我们运行一下代码。
输出了如下信息,返回代码 200,里面还包含了签到的返回信息,比如大吉啊等等(不过看到原谅色 green,就知道是中平了)。

刷新一下浏览器页面。

嗯,签到成功。现在只需要把脚本挂在服务器上就好。

挂在服务器上

在代码里加入 sleep 就可以挂在服务器上了。

import time
import requests
while True:
    res = requests.post('https://www.luogu.com.cn/index/ajax_punch', headers = headers)
    print(res.text)
    time.sleep(86400)

简单地使用 python xx.py 是会在断开 SSH 连接时自动结束进程的。
所以需要寻找另外一种思路。通过在网上查找资料可以发现有一个指令 nohup 可以满足我们的需求。(可以参考这篇博客
所以愉快地使用 sudo nohup python xx.py 就可以了。

重新连接,执行指令 ps -ef |grep python 查找有关 Python 的进程。
输出如下


我们发现 Python 是在后台运行的,测试成功。
当然真正的成功与否,还要看看明天打开洛谷后看到的是不是运势界面。

后记

第二天发现进程没了。我看了看它的输出文件。


万恶之源就是 Python 的 TRUE 和 C++ 不一样,首字母是大写的。
最后结果只能等明天才能知道了。


由于 cookie 的时效性,请求会出现 403 错误。
已弃坑。