前言
实现思路:利用CURL模拟登录目标站点 -> 保存Cookie -> 携带Cookie后Get签到入口 -> 签到完成!
需注意:如果用户名包含中文字符则需要urlencode()函数来编码成url专用格式字符串再执行提交操作,反之urldecode()则可以解码回原字符。A站的Cookie只要不改变账户密码则不会变,因此首次登录成功取得其cookie后就可以长时间不进行登录操作。可直接使用历史cookie进行操作。
Code
程序入口
$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类
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);
}
}
Comments | 17 条评论 (这是个静态化页面,评论后要等CDN刷新啦~)
AvalonDragoN龙龙 博主
AC手动签到党表诚意wwwwwwww
音風 博主
@AvalonDragoN龙龙
那真是太好了,如果我的文章能帮助到你,那我开源的目的就已经实现了
千与琥珀 博主
同curl自动签到党路过
音風 博主
@千与琥珀
hhhh 强大又方便,真是神器~
BranchZero 博主
配合计划任务食用效果更佳~
(长期潜水从不签到的没事就喜欢逛文章区的野生Acer路过)
音風 博主
@BranchZero
同为Acer表示荣幸,AC文章区评论才是本体是A站对同类型站点相比的一大亮点所在,即使不看动画了,这也是我一直不舍得离开a站的主要原因。
音風 博主
@BranchZero
关于签到,最近我还写了个v2ex的模拟登录及签到没有发布。ac的签到相比v2实在是容易太多,就根本没有什么仿机器登陆的验证手段。v2就比较坑,他除了对UA以及来源有检测外,登陆时还有个隐藏了的验证码需要提交,不仅如此,在get签到入口的时候还必须提交一个新生成的验证码(该值在登录成功后返回首页时生成,以及set TAB cookie),且必须提两遍,第一遍提交返回HTTP302临时转移状态头,第二遍时再get时才算签到完成,途中还不能close之前的句柄。真是太坑了,如果不使用全局抓包的话根本不知道他走的是怎么一个流程。
BranchZero 博主
@音風
嘛,这些招数都是防小白用的,之前帮人写一个采集付费招投标信息站点内容的也差不多是这样子的防御体系,登录的时候有一个图形验证码(用打码平台的付费 API 搞定),然后登录时跳转中间,还有一个参数用来防止机器人的(而且是两个额外的 Request ,下次访问之前必须把指定参数抛给那两个指定的 URL),刚开始没注意,也没加上,后来发现脚本写完明明登录了却又自动登出了,又手工登录抓了包才发现这个细节。
其实可以搞一个签到平台,让网友提交签到脚本,然后服务器自动跑签来着。(没记错的话 V2 上有人实现过这套机制)
音風 博主
@BranchZero
签到平台貌似已经有了,再说也没那么多时间精力搞这东西,感兴趣的技术自己研究研究还行,要发展成平台还不得老骨头都得散架
BranchZero 博主
@音風
噗23333,也是
Cytrs 博主
请问 Discuz! 论坛的签到能不能这样用?
音風 博主
@Cytrs
可以的,原理都是一样的
Matrix 博主
额博主你好,最近新学php,用你这个脚本,提示我还是未登陆,为啥呢=-=
{“result”:”请先登录”,”success”:false,”status”:401,”info”:”请先登录”}:”请先登录”}请先登录”}”}
音風 博主
@Matrix
应该是部署问题导致的,可以进群交流495387528
音風 博主
@Matrix
删掉cookie文件,重新运行脚本
逗啊逗 博主
代码上只看到登陆和cookie部分,那一部分是签到的啊?
音風 博主
@逗啊逗
sign方法就是签到