虾米自动签到的实现

前言

今天抽空整理了下把它写成了一个多账号版本的,放在了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. 楼主你好,能否增加GAE版本呢?GAE的准入标准要比SAE简单些,就有更多客户可以用到
    另外,请问一下,有虚拟主机的话如何引用这个xiami.php?

    1. @Pan GAE的话好像有人写了一个Python版的,你用那个就好了。话说其实我感觉SAE要比GAE简单来着...直接浏览器访问这个页面就可以完成签到了!

  2. 奇迹没有发生。它确实访问了我的php但就是没有签到成功,方便的是,我只要点开一个书签就可以签到了。楼主,你是怎么实现自动访问那个php的?

    1. @雨林亭 啊,我想起来了!SAE禁止往本地写入文件,但是签到的代码要把cookies存到文件里头,所以就失败了吧。我现在是放到自己的主机上的。然后在自己博客的footer下面加了这段代码

      <img src="http://imnerd.org/lab/xiami/index.php" width="0" height="0" alt="" />
      每天访问下博客就好啦。有空我再改改这个版本吧。

  3. 我把cookies传到SAE了。我用浏览器直接访问php是可以签到的,问题是SAE自动访问的时候没有签到成功。我也想过放到footer的方法,但还是每天要有人访问我的博客才行,而我博客常常是0个IP的。。。悲剧啊!

        1. @雨林亭 好像页面签到没成功啊,如果签到成功的话应该会返回签到天数的啊,我看页面上什么显示都没诶。SAE的cron显示fail的话应该就是没有设置成功吧,你再看看cron计划添加成功了没?

  4. 代码之前是好用的, 不过现在不行了, 虾米登录web登录页面和手机登录页面修改了, 希望能修改一下.

          1. 你说的 '手机登陆页面是可以的', 指的是 把这个改下吗? ==>curl_setopt($curl, CURLOPT_URL, "http://www.xiami.com/web/login");

          2. @公子
            我现在遇到的问题是, 不能正常登录, 我试了将登录页面改成了手机web页面进行, 但还是不行, 出现了验证码, 这个怎么办呢? 麻烦帮看下!

            <?php
            
            $name = 'xxx';
            $password = 'xxxx';
            
            $curl_post = 'email='.$name.'&password='.$password.'&remember=1&LoginButton=登录';
            $cookie = tempnam('./','cookie'); //因为sinaapp不能用cookie file, 改成这个行吗?
            
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_HEADER, 1);
            curl_setopt($curl, CURLOPT_URL, "http://www.xiami.com/web/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);
            $d = curl_exec($curl);
            print_r($d); //出现了验证码!!
            return;
            curl_close($curl);
            
            1. @header SAE不支持本地文件的读写,所以是得改一下,至于怎么改网上很容易就搜到了。网址没错就是那个。验证码那个无解,一天单IP访问次数过多会出现的,我这里也一样,我是设置了10小时一次的cron任务尽量让其都签到。

  5. 好像每隔31天会断一次,第32天补一次账号,第33天又会继续运作,如此循环往复。、、、、、、

发表评论 取消回复

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