项目需求:

每天定时访问一次网站的某个网页,而且这个网页是需要登录才能够访问。

解决思路(linux系统):

解决其实很简单,只要每天定时用浏览器登录,然后访问就可以了。但是,这种做法是不现实的。我们可以利用 linux 的定时器(crontab) 来实现定时访问功能,然后用 PHP CURL 来模拟浏览器登录和访问。

  • 首先,在系统设置定时任务。定时执行某个 php 文件,如 timer.php

  • 在这个 php 文件中会实现两个功能,先登录,获取登录信息的 cookie,然后访问指定的网页。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

/**

* 先登录(登录需要获取 token)

*/

// 创建临时存放 cookie 的文件

$cookie_file = tempnam('./temp', 'cookie');

$login_url = 'http://..';

$ch = curl_init($login_url);

// 是否将头文件的信息作为数据流输出

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_POST, 1);

// 先获取 token,已在登录页面设置好

curl_setopt($ch, CURLOPT_POST, array('curl_token' => 'curl_token'));

$token = curl_exec($ch);

// 登录

curl_setopt($ch, CURLOPT_POST, array(

'submit' => '登录',

'token' => $token,

'username' => 'xxx',

'password' => 'xxx',

));

// 连接结束后,比如,调用 curl_close 后,保存 cookie 信息

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);

// 再次连接,这次是登录

curl_exec($ch);

curl_close($ch);

/**

* 利用登录获取的登录 cookie,访问页面

*/

$url = 'http://...';

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_HEADER, 0);

// 模拟登录状态的 cookie

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

curl_exec($ch);

curl_close($ch);