前言

说来也惭愧,博主用php开发过这么多项目却仍对PHP的CURL扩展库感觉很陌生,实际项目开发中很少用到这种技术。因此只了解其功能但从未真正用到开发当中来。过完大年的正月,闲来无事(现充都忙着各种秀恩爱各种甜蜜,也就鄙人宅家闷声敲代码),保持着探索技术的兴致翻阅了各种关于CURL用法以及实例后,心血来潮的就写了本签到程序。编写过程还算顺利,期间遇到的诸如:携带cookie后get目标网页还是提示未登录之类的问题,都通过各种排错解决了(前面那个问题是因为get目标签到入口的时候没有close掉登录句柄所导致)。稍作了优化后就这么发布了吧。。。。反正也没人看。。。

实现思路:利用CURL模拟登录目标站点 -> 保存Cookie -> 携带Cookie后Get签到入口 -> 签到完成!

需注意:如果用户名包含中文字符则需要urlencode()函数来编码成url专用格式字符串再执行提交操作,反之urldecode()则可以解码回原字符。A站的Cookie只要不改变账户密码则不会变,因此首次登录成功取得其cookie后就可以长时间不进行登录操作。可直接使用历史cookie进行操作。

Code

程序入口

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    $user '音風';   //A站用户名 支持中文
    $pwd '';        //登录密码
 
    $acfun new acfun();  //实例化acfun类
    $cookieFile $acfun->login($user,$pwd); //执行登录操作,成功返回cookie
    $acfun->sign($cookieFile); //执行签到操作
 
    function __autoload($className){
        include './class/'.$className.'.class.php';
    }
?>

acfun类

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
<?php
    class acfun{
        public function login($user,$pwd){
            $url 'http://www.acfun.tv/login.aspx';
            $path $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'].'cookie/'.$user.'.cookie';
            $postFields 'username='.urlencode($user).'&password='.$pwd;
            if(!is_file(iconv('UTF-8','GBK',$path))){
                file_put_contents(iconv('UTF-8','GBK',$path),'');
                $login = curl_init($url);
                curl_setopt($login,CURLOPT_HEADER,0);
                curl_setopt($login,CURLOPT_RETURNTRANSFER,1);
                curl_setopt($login,CURLOPT_POST,1);
                curl_setopt($login,CURLOPT_POSTFIELDS,$postFields);
                curl_setopt($login,CURLOPT_COOKIEJAR,iconv('UTF-8','GBK',$path));
                curl_exec($login);
                curl_close($login);
            }
            return $path;
             
        }
 
        public function sign($cookieFile){
            $url 'http://www.acfun.tv/member/checkin.aspx';
            $sign = curl_init($url);
            curl_setopt($sign,CURLOPT_HEADER,0);
            curl_setopt($sign,CURLOPT_RETURNTRANSFER,0);
            curl_setopt($sign,CURLOPT_COOKIEFILE,iconv('UTF-8','GBK',$cookieFile));
            curl_exec($sign);
        }
    }
?>

風前の灯になってもいいさ、残したの歳月痕跡を持ち続けて生きてゆく。