虾米自动签到的实现

2012-11-09
2261 字
6 分钟阅读时长

提醒:本文最后更新于 5082 天前,文中所描述的信息可能已发生改变,请谨慎使用。

前言

今天抽空整理了下把它写成了一个多账号版本的,放在了SAE上头,网址是:http://autocheck.sinaapp.com 。 上头输玩账号密码程序就可以自动帮你的账号签到了。切记程序会记住你的账号密码,如果有介意的请千万不要使用,本人不对你的账号问题进行负责。

上一篇文章中,我们讲述了如何利用PHP批量下载虾米已下载的歌曲。其中我们实现了如何用PHP+CURL模拟虾米登录,这回我们来实现一下如何自动签到。(对于我这样的只是拿虾米当下载音乐的地方,而且经常忘记签到的孩子真的是非常有用啊有木有!T_T)

一、获取登录COOKIES

还是老样子,我们先获取到登录的COOKIES文件。修改代码中的第2行和第3行,填入自己的账号和密码。如果成功的话,会在该文件的同级目录下得到一个cookies.txt文件。

$name = ''; //输入你的账号
$password = ''; //输入你的密码
//获取登录cookie
$curl_post = 'email='.$name.'&password='.$password.'&done=/&submit=登 录';
$cookie_file = dirname(__FILE__).'/cookie.txt';
$curl = curl_init();
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_URL, "http://www.xiami.com/member/login");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($curl);
curl_close($curl);

二、获取签到地址

虾米的签到其实是向http://www.xiami.com/task/signin这个网页发送一个POST,这个POST的Data长度是0。代码利用虾米手机页面的签到机制,向一个特定的地址发送一个POST过去就可以了。所以再要就是获取签到的地址。

//获取手机版首页	
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://www.xiami.com/web");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file);
$data = curl_exec($curl);
curl_close($curl);

//获取签到URL,如果已经签到则获取签到天数
$preg = '/\<a class\=\"check\_in\" href\=\"(.*?)\"\>每日签到\<\/a\>/s';
preg_match_all($preg, $data, $match);
if(!isset($match[1][0])) {
	$preg = '/\<div class\=\"idh\"\>(已连续签到.*?天)\<\/div\>/s';
	preg_match_all($preg, $data, $match);
	die($match[1][0]);
}

三、进行签到

利用上一步中获取到的地址进行签到。但是要注意的是,网页会判断页面来源,如果不是从虾米网站POST过去的会签到失败。所以我添加了自定义Referer来源。之前就一直因为这个没有更改而一直都没有成功,后来索性模拟了所有的HTTP Header才发现了问题的所在。另外,虽然POST空数据过去,但千万不要以为不POST数据过去就行了,无和0还是有点区别的,哈哈!其它的就没有什么问题了。签到成功的话页面会返回你的签到天数。

//自动签到
$url = 'http://www.xiami.com' . $match[1][0];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.xiami.com/web');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$num = curl_exec($curl);
curl_close($curl);

四、Cron添加自动签到任务

我这里以SAE为例,将第一步获取到的cookies.txt文件和第二步的xiami.auto.sign.php一起上传到应用中。例如存放位置是/xiami。在cron.yaml末尾添加如下代码:

- description:cron XiamiAutoSign
  url: xiami/xiami.auto.sign.php
  schedule: every day of month 00:10
  timezone: Beijing

设置成功的话会在每天的00:10访问这个页面,完成自动签到功能!

本文作者lizheming

发布于 2012-11-09,最后更新于 2012-11-09

62 评论

王安康 LBBROWSERWindows XP
2013-04-16 00:06:52

@公子 我想要一份,本人软件什么代码一概不会,但是软件使用基本会点,嘿嘿!

星月 Maxthon3.0Windows XP
2013-04-15 19:52:07

@公子可以发我邮箱吗?

shart IE6.0Windows XP
2013-03-13 15:53:50

哪位高手可以把这个虾米自动签到软件发到我邮箱呢

公子Chrome25.0Windows 7
2013-03-13 20:04:41

@shart把上面的代码拼一块就是程序了,另外我帮你把留言的邮箱去掉了,嘿嘿~

音乐迷 Chrome17.0Windows XP
2013-02-14 19:18:10

啥时候修改啊,COOKIES文件夹什么都没有

公子Chrome24.0Windows 7
2013-02-14 19:47:59

想要多用户其实很简单啊,将$cookie_file定义的cookie.txt文件的名字定义成“账号.txt”就好啦,这样就可以多COOKIES了

雨林亭Chrome28.0Windows 7
2014-02-11 06:06:16

@公子已经用上了,签到成功,SAE今晚12点10分就是见证奇迹的时刻了.另外,还肯定楼主大人开发新版,带多账号签到功能的.

公子Chrome32.0Windows 7
2014-02-14 06:17:26

@雨林亭嗯,怎么样,奇迹出来了没?

公子 Chrome23.0Windows 7
2012-12-29 22:25:09

@Aaron @卜卜口の 修改了代码,已经可以成功签到了。

卜卜口の Chrome8.0Windows 7
2012-12-07 07:58:16

居然是验证了Referer QAQ 泪目

公子Chrome22.0Windows 7
2012-12-07 22:34:49

额,是呀,我也是在别人的提示下才发现的。不过话说其实这篇文章是废文,因为结果我自己也没成功,汗T_T!

Aaron Chrome22.0Windows XP
2012-11-12 05:30:05

获取不了COOKIES…

公子Chrome22.0Windows 7
2012-11-13 02:01:52

额…=_=!cookies应该是能获取到的…不过后面那个认证我试了好像没用(自己写的代码没测试过好尴尬)…所以这是篇坑文,等有空了我再修改吧o(╯□╰)o

Aaron Chrome22.0Windows XP
2012-11-10 03:20:13

这个功能蛮好的~