虾米自动签到的实现

前言

今天抽空整理了下把它写成了一个多账号版本的,放在了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过去就可以了。所以再要就是获取签到的地址。

三、进行签到

利用上一步中获取到的地址进行签到。但是要注意的是,网页会判断页面来源,如果不是从虾米网站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访问这个页面,完成自动签到功能!

虾米自动签到的实现》上有 62 条评论

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

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

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

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

  2. 不懂软件的路过。高三党不能常上网,老是忘签到。急求软件一份。1421178761@qq.com 先谢谢大神了。

  3. 怎么获取COOKIES呀, 请教! 有没有示例啊
    第二段的代码18行有用吗?
    本人不是很懂, 能贴出完整可以用的代码吗

    1. @zu 第一段的12行就是将COOKIES保存在$cookie_file的。关于CURL_SETOPT的参数,我想你需要看看这个:http://cn2.php.net/manual/zh/function.curl-setopt.php
      第二段18行那个没用,是代码高亮插件的小BUG~
      三段代码合一块就是可用的代码了...

    1. 代码只走到你的第二段代码就不走了
      会报 Notice: Undefined offset: 0 .... 这样的错误
      试着关闭error_repoting ,但还是不行了, 本人php完全不会

    1. @zu 跟你说了,完整可用的代码就是三块拼一起嘛..你找到我的那个GIST的话就该发现了吧。另外这个没法验证,因为我都没有没签到的账号。不过我对比了一下我现在自己用的代码(我自己的代码运行正常),没有区别,是一样的代码。

  4. 请问, SAE是sinaapp吗?
    你说 "将第一步获取到的cookies.txt文件和第二步的xiami.auto.sign.php一起上传到应用中。...."
    这个xiami.auto.sign.php 有权限去修改同级目录的文件cookies.txt吗? sinaapp能设置吗? 求教~

  5. @怡红公子 你这代码, 貌似不行啊, 你现在有试过吗? xiami的页面变化好大呀!!
    还有你这个评论验证码...我无语了... 每次都要输入两遍!! 我的眼!

    1. @cindy 今天刚有人跟我说不行,然后我测试了一下,可以运行的,而且我现在自己用的就是这个代码啊...WEB页面变了而已,手机页面还是老样子
      验证码我自己也很蛋疼,不过为了垃圾评论,忍了....

  6. 找到问题的所在了, 在获取手机页面时, 应该重新设置cookie!! 难道用手机真的好用, 反正电脑上肯定是不行!!

    1. @cindy 额,是的,当初得到这个消息的时候我也觉得很惊讶。话说经你一说我才发现..原来我这个还是老代码,没更新T_T..忘了加那句重要的代码了T_T...捂面逃走T_T...我错了,一行的差别我的肉眼真的没看出来啊T_T

  7. 唉, 还对楼上不耐烦, 你还不给人家发一份你的代码,
    还有你git的上的代码不更新吗? 准备要炕多少人呢!!

    1. @cindy 我不耐烦?我不耐烦能这么一直回他么..我是真没发现那行没写好么..就一行而且还那么相近的一行...算了我懒得解释了..本文的代码合GIST的代码在刚才回你的时候就已经更新了,不信的话你去看commit的时间就好了。我写文章写教程是分享自己的过程,你要觉得我是在坑你的话,请Ctrl+W好了,另外记得让朋友也别进来,黑我一下是最好的!你好,再见!

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注