虾米自动签到的实现

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

前言

今天抽空整理了下把它写成了一个多账号版本的,放在了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访问这个页面,完成自动签到功能!

Avatar
怡红公子 擅长前端和 Node.js 服务端方向。热爱开源时常在 Github 上活跃,也是博客爱好者,喜欢将所学内容总结成文章分享给他人。

62 评论

fyq IE 9.0 Windows 7
2014-12-04T01:37:20.000Z 回复
好像每隔31天会断一次,第32天补一次账号,第33天又会继续运作,如此循环往复。、、、、、、
公子 Chrome 41.0.2236.0 Windows 7
2014-12-04T05:23:51.000Z 回复
@fyq 我的账号没有出现这种情况诶。文章的代码有点老了应该是不大靠谱了。
洪枫 IE 10.0 Windows 7
2014-10-08T02:30:00.000Z 回复
非常好的东西
header Chrome 33.0.1750.154 Windows 7
2014-06-12T07:04:16.000Z 回复
代码之前是好用的, 不过现在不行了, 虾米登录web登录页面和手机登录页面修改了, 希望能修改一下.
公子 Chrome 35.0.1916.153 Windows 7
2014-06-03T02:23:22.000Z 回复
@header 手机登陆页面是可以的,http://autocheck.sinaapp.com 这里更新了,博客这边还没弄上来。
header Chrome 33.0.1750.154 Windows 7
2014-06-17T05:45:06.000Z 回复
@公子 求sinaapp源码~~
公子 Chrome 37.0.2041.4 Windows 7
2014-06-17T05:48:12.000Z 回复
@header 就是模拟手机页面的登陆而已,过程和文章中讲的都是一样的。
header Chrome 33.0.1750.154 Windows 7
2014-06-17T06:05:57.000Z 回复
$cookie_file = dirname(__FILE__).'/cookie.txt'; sinaapp不能用啊! 主要代码不能改一下吗?
header Chrome 33.0.1750.154 Windows 7
2014-06-17T06:07:55.000Z 回复
你说的 '手机登陆页面是可以的', 指的是 把这个改下吗? ==>curl_setopt($curl, CURLOPT_URL, "http://www.xiami.com/web/login");
header Chrome 33.0.1750.154 Windows 7
2014-06-17T06:14:47.000Z 回复
@公子 我现在遇到的问题是, 不能正常登录, 我试了将登录页面改成了手机web页面进行, 但还是不行, 出现了验证码, 这个怎么办呢? 麻烦帮看下!
公子 Chrome 37.0.2041.4 Windows 7
2014-06-17T06:42:59.000Z 回复
@header SAE不支持本地文件的读写,所以是得改一下,至于怎么改网上很容易就搜到了。网址没错就是那个。验证码那个无解,一天单IP访问次数过多会出现的,我这里也一样,我是设置了10小时一次的cron任务尽量让其都签到。
雨林亭 WebKit 536.26 iOS 6.1.3
2014-02-03T06:12:03.000Z 回复
我把cookies传到SAE了。我用浏览器直接访问php是可以签到的,问题是SAE自动访问的时候没有签到成功。我也想过放到footer的方法,但还是每天要有人访问我的博客才行,而我博客常常是0个IP的。。。悲剧啊!
公子 Chrome 32.0.1700.107 Windows 7
2014-02-03T06:21:34.000Z 回复
@雨林亭 Cookies会变的啦骚年,0IP的话也很简单啊,你用SAE的cron定时访问一下你的博客首页不就好了么~嘿嘿~
雨林亭 WebKit 536.26 iOS 6.1.3
2014-02-03T03:14:39.000Z 回复
它的定时访问好像对外链不生效,SAE后台显示fail。我的签到php是这个。http://www.yulinting.com/xiami/index.php
公子 Chrome 32.0.1700.107 Windows 7
2014-02-16T01:07:38.000Z 回复
@雨林亭 好像页面签到没成功啊,如果签到成功的话应该会返回签到天数的啊,我看页面上什么显示都没诶。SAE的cron显示fail的话应该就是没有设置成功吧,你再看看cron计划添加成功了没?
雨林亭 Chrome 28.0.1500.72 Windows 7
2014-02-16T04:20:34.000Z 回复
@公子明明有显示天数啊.14天!
雨林亭 Chrome 28.0.1500.72 Windows 7
2014-02-16T04:21:41.000Z 回复
@雨林亭成功啦,后台可以看到,如果写法出错是同步不上SAE服务器的.
公子 Chrome 32.0.1700.107 Windows 7
2014-02-16T04:52:09.000Z 回复
@雨林亭 OK,现在看到了。config.yaml里面写法错了么,呵呵...不过自己整明白了就好啦,恭喜。明天继续见证奇迹吧~
雨林亭 Mobile Safari 6.0 iOS 6.1.3
2014-02-14T18:14:24.000Z 回复
奇迹没有发生。它确实访问了我的php但就是没有签到成功,方便的是,我只要点开一个书签就可以签到了。楼主,你是怎么实现自动访问那个php的?
公子 Chrome 32.0.1700.107 Windows 7
2014-02-03T02:46:20.000Z 回复
@雨林亭 啊,我想起来了!SAE禁止往本地写入文件,但是签到的代码要把cookies存到文件里头,所以就失败了吧。我现在是放到自己的主机上的。然后在自己博客的footer下面加了这段代码
<img src="http://imnerd.org/lab/xiami/index.php" width="0" height="0" alt="" />
每天访问下博客就好啦。有空我再改改这个版本吧。
雨林亭 Mobile Safari 6.0 iOS 6.1.3
2014-02-14T03:05:14.000Z 回复
奇迹没有出现!!!55555
雨林亭 Mobile Safari 6.0 iOS 6.1.3
2014-02-14T03:03:50.000Z 回复
奇迹没有出现!!!55555
Pan Firefox 19.0 Windows 7
2013-11-04T13:57:29.000Z 回复
楼主你好,能否增加GAE版本呢?GAE的准入标准要比SAE简单些,就有更多客户可以用到 另外,请问一下,有虚拟主机的话如何引用这个xiami.php?
怡红公子 Chrome 30.0.1599.101 Windows 7
2013-11-04T14:08:58.000Z 回复
@Pan GAE的话好像有人写了一个Python版的,你用那个就好了。话说其实我感觉SAE要比GAE简单来着...直接浏览器访问这个页面就可以完成签到了!
cindy Chrome 28.0.1500.95 Windows 7
2013-10-25T03:07:27.000Z 回复
唉, 还对楼上不耐烦, 你还不给人家发一份你的代码, 还有你git的上的代码不更新吗? 准备要炕多少人呢!!
怡红公子 Chrome 30.0.1599.101 Windows 7
2013-10-25T03:16:42.000Z 回复
@cindy 我不耐烦?我不耐烦能这么一直回他么..我是真没发现那行没写好么..就一行而且还那么相近的一行...算了我懒得解释了..本文的代码合GIST的代码在刚才回你的时候就已经更新了,不信的话你去看commit的时间就好了。我写文章写教程是分享自己的过程,你要觉得我是在坑你的话,请Ctrl+W好了,另外记得让朋友也别进来,黑我一下是最好的!你好,再见!
cindy Chrome 28.0.1500.95 Windows 7
2013-10-25T14:51:02.000Z 回复
找到问题的所在了, 在获取手机页面时, 应该重新设置cookie!! 难道用手机真的好用, 反正电脑上肯定是不行!!
怡红公子 Chrome 30.0.1599.101 Windows 7
2013-10-25T03:02:07.000Z 回复
@cindy 额,是的,当初得到这个消息的时候我也觉得很惊讶。话说经你一说我才发现..原来我这个还是老代码,没更新T_T..忘了加那句重要的代码了T_T...捂面逃走T_T...我错了,一行的差别我的肉眼真的没看出来啊T_T
cindy Chrome 28.0.1500.95 Windows 7
2013-10-25T14:21:50.000Z 回复
@怡红公子 你这代码, 貌似不行啊, 你现在有试过吗? xiami的页面变化好大呀!! 还有你这个评论验证码...我无语了... 每次都要输入两遍!! 我的眼!
怡红公子 Chrome 30.0.1599.101 Windows 7
2013-10-25T14:30:50.000Z 回复
@cindy 今天刚有人跟我说不行,然后我测试了一下,可以运行的,而且我现在自己用的就是这个代码啊...WEB页面变了而已,手机页面还是老样子 验证码我自己也很蛋疼,不过为了垃圾评论,忍了....
cindy Chrome 28.0.1500.95 Windows 7
2013-10-25T13:27:19.000Z 回复
请问, SAE是sinaapp吗? 你说 "将第一步获取到的cookies.txt文件和第二步的xiami.auto.sign.php一起上传到应用中。...." 这个xiami.auto.sign.php 有权限去修改同级目录的文件cookies.txt吗? sinaapp能设置吗? 求教~
怡红公子 Chrome 30.0.1599.101 Windows 7
2013-10-25T14:00:49.000Z 回复
@cindy 唔,是SinaApp,具体我没有测试,不过你这么一讲我好像感觉也不太行的样子,因为SAE好像不允许本地文件的保存和读取来着...
zu Chrome 28.0.1500.72 Windows 7
2013-10-25T03:47:33.000Z 回复
@公子 你GIST上跟你这上页面的是有区别的, 唉
怡红公子 Chrome 30.0.1599.101 Windows 7
2013-10-25T04:03:30.000Z 回复
@zu 没区别啊,最后那个只是写法不一样而已,本质都是一样的啦~
zu Chrome 28.0.1500.72 Windows 7
2013-10-25T02:30:33.000Z 回复
代码只能登录, 签到不行啊, 请验证!
公子 Chrome 30.0.1599.101 Windows 7
2013-10-25T03:26:58.000Z 回复
@zu 跟你说了,完整可用的代码就是三块拼一起嘛..你找到我的那个GIST的话就该发现了吧。另外这个没法验证,因为我都没有没签到的账号。不过我对比了一下我现在自己用的代码(我自己的代码运行正常),没有区别,是一样的代码。
zu Chrome 28.0.1500.72 Windows 7
2013-10-25T01:24:17.000Z 回复
@公子 求一份完整的可运行的代码, nhst.js#gmail.com 谢谢
zu Chrome 28.0.1500.72 Windows 7
2013-10-25T02:27:58.000Z 回复
https://gist.github.com/lizheming/4368496 在这里呀!!
zu Chrome 28.0.1500.72 Windows 7
2013-10-24T09:11:31.000Z 回复
运行在本地xampp, 用户名密码已设置, 这里就不写了: {{code}}
zu Chrome 28.0.1500.72 Windows 7
2013-10-24T09:03:48.000Z 回复
代码只走到你的第二段代码就不走了 会报 Notice: Undefined offset: 0 .... 这样的错误 试着关闭error_repoting ,但还是不行了, 本人php完全不会
公子 Chrome 30.0.1599.101 Windows 7
2013-10-24T10:27:33.000Z 回复
@zu 代码高亮插件在代码里头自己加了很多引号...汗...看来得换插件了T_T 你再试试吧。
zu Chrome 28.0.1500.72 Windows 7
2013-10-24T09:09:03.000Z 回复
不好用啊, 我是在本地环境测试的.
zu Chrome 28.0.1500.72 Windows 7
2013-10-24T08:29:57.000Z 回复
怎么获取COOKIES呀, 请教! 有没有示例啊 第二段的代码18行有用吗? 本人不是很懂, 能贴出完整可以用的代码吗
怡红公子 Chrome 30.0.1599.101 Windows 7
2013-10-24T08:34:01.000Z 回复
@zu 第一段的12行就是将COOKIES保存在$cookie_file的。关于CURL_SETOPT的参数,我想你需要看看这个:http://cn2.php.net/manual/zh/function.curl-setopt.php 第二段18行那个没用,是代码高亮插件的小BUG~ 三段代码合一块就是可用的代码了...
hieisama LBBROWSER Windows 7
2013-10-20T03:25:16.000Z 回复
不懂软件的路过。高三党不能常上网,老是忘签到。急求软件一份。1421178761@qq.com 先谢谢大神了。
JunkFood Chrome 31.0.1650.16 Windows 7
2013-10-17T03:51:23.000Z 回复
现在还会验证User Agent了。。。(我用http 工具库默认的UA返回的是503)
公子 Chrome 30.0.1599.69 Windows 7
2013-10-17T04:44:56.000Z 回复
@JunkFood 好像没有,我这老代码还能正常运行额...
JunkFood Chrome 31.0.1650.16 Windows 7
2013-10-18T13:54:52.000Z 回复
@公子 嗯,确实是不需要改UA的,是我搞错了
王安康 LBBROWSER Windows XP
2013-04-16T08:06:52.000Z 回复
@公子 我想要一份,本人软件什么代码一概不会,但是软件使用基本会点,嘿嘿!
星月 Maxthon 3.0 Windows XP
2013-04-16T03:52:07.000Z 回复
@公子可以发我邮箱吗?
shart IE 6.0 Windows XP
2013-03-13T23:53:50.000Z 回复
哪位高手可以把这个虾米自动签到软件发到我邮箱呢
公子 Chrome 25.0.1364.97 Windows 7
2013-03-14T04:04:41.000Z 回复
@shart把上面的代码拼一块就是程序了,另外我帮你把留言的邮箱去掉了,嘿嘿~
音乐迷 Chrome 17.0.963.79 Windows XP
2013-02-03T03:18:10.000Z 回复
啥时候修改啊,COOKIES文件夹什么都没有
公子 Chrome 24.0.1312.57 Windows 7
2013-02-03T03:47:59.000Z 回复
想要多用户其实很简单啊,将$cookie_file定义的cookie.txt文件的名字定义成“账号.txt”就好啦,这样就可以多COOKIES了
雨林亭 Chrome 28.0.1500.72 Windows 7
2014-02-11T14:06:16.000Z 回复
@公子已经用上了,签到成功,SAE今晚12点10分就是见证奇迹的时刻了.另外,还肯定楼主大人开发新版,带多账号签到功能的.
公子 Chrome 32.0.1700.107 Windows 7
2014-02-14T14:17:26.000Z 回复
@雨林亭嗯,怎么样,奇迹出来了没?
公子 Chrome 23.0.1271.97 Windows 7
2012-12-30T06:25:09.000Z 回复
@Aaron @卜卜口の 修改了代码,已经可以成功签到了。
卜卜口の Chrome 8.0.552.237 Windows 7
2012-12+00T03:58:16.000Z 回复
居然是验证了Referer QAQ 泪目
公子 Chrome 22.0.1229.94 Windows 7
2012-12-08T06:34:49.000Z 回复
额,是呀,我也是在别人的提示下才发现的。不过话说其实这篇文章是废文,因为结果我自己也没成功,汗T_T!
Aaron Chrome 22.0.1229.94 Windows XP
2012-11-12T13:30:05.000Z 回复
获取不了COOKIES....
公子 Chrome 22.0.1229.94 Windows 7
2012-11-13T10:01:52.000Z 回复
额..=_=!cookies应该是能获取到的..不过后面那个认证我试了好像没用(自己写的代码没测试过好尴尬)...所以这是篇坑文,等有空了我再修改吧o(╯□╰)o
Aaron Chrome 22.0.1229.94 Windows XP
2012-11-10T11:20:13.000Z 回复
这个功能蛮好的~