用企鹅比较早的同学都知道早在05年到08年左右企鹅有个功能叫“QQ心情”后来改名叫“滔滔”。现在改名叫“说说”。

自从某一版本更新后以前的“QQ心情、滔滔”对外已经不可见了,很多人以为自己已经删除了自己所有的说说。其实不然,通过接口依旧能够获取到5-8年前的“QQ说说”内容。

QQ心情

但是这个功能马上就要被企鹅废弃了,挺可惜的XXOO又少了一种途径。

滔滔心情

滔滔心情将于2013年11月15日正式下线。还请提前备份,感谢大家长久以来的支持!更多精彩,请继续关注说说,返回【说说首页】

接口地址:

http://e.qzone.qq.com/cgi-bin/cgi_emotion_indexlist.cgi?uin=企鹅号&emotionarchive=页码

如果有牛B点服务器或者集群的同学可以做个备份(默认200线程一台PC想跑完太困难了):

采集

package org.javaweb.ylog.util;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
//import com.mongodb.DB;
//import com.mongodb.DBCollection;
//import com.mongodb.DBObject;
//import com.mongodb.Mongo;

public class QQParse implements Runnable{

  private static int qq = 99999999;

  private static boolean run = true;

  public int gettingStart(){
    return qq++;
  }

  public static InputStream doGet(String url) {
    URLConnection connection = null;
    try {
      URL realUrl = new URL(url);
      connection = realUrl.openConnection();
      connection.setConnectTimeout(1000);//连接超时
      connection.setReadTimeout(1000);// 读取超时
      connection.connect();
      return connection.getInputStream();
    } catch (Exception e) {
      System.out.println(e.toString());
    }
    return null;
  }

//  public void toSave(DBObject obj){
//    try {
//      DB db = new Mongo("localhost", 27017).getDB("qzone");
//      DBCollection conn = db.getCollection("qzone");
//      conn.insert(obj);
//    } catch (UnknownHostException e) {
//      e.printStackTrace();
//    }
//  }

  public void toSave(List<Object> ls){
    try {
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/qzone.sql", true),"GBK"));
       bw.write(ls.get(0)+"[/ts!]"+ls.get(1)+"[/ts!]"+ls.get(2)+"\n");
      bw.flush();
      bw.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void parseXml(int qq){
    int emotionarchive = 1;
    boolean f = true;
    while(f){
      try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = factory.newDocumentBuilder();
        Document doc = docBuilder.parse(new InputSource(doGet("http://e.qzone.qq.com/cgi-bin/cgi_emotion_indexlist.cgi?uin="+qq+"&emotionarchive="+emotionarchive)));
         NodeList nodeList= doc.getElementsByTagName("item");
        Element itemElement =null;
        Element itemChildElement =null;
        if(nodeList.getLength()>0){
          for (int i=0;i<nodeList.getLength();i++) {
            if(nodeList.item(i) instanceof Element){
              itemElement =(Element)nodeList.item(i);
              NodeList itemNodeChilds = itemElement.getChildNodes();
              List<Object> ls = new ArrayList<Object>();
              ls.add(qq);
              for (int j = 0; j < itemNodeChilds.getLength(); j++) {
                if(itemNodeChilds.item(j) instanceof Element){
                  itemChildElement=(Element) itemNodeChilds.item(j);
                  ls.add(itemChildElement.getTextContent().replaceAll("\\s+", ""));
                 }
              }
              if(ls.size()==3){
//                DBObject obj = new BasicDBObject();
//                obj.put("qq", qq);
//                obj.put("content", ls.get(0));
//                obj.put("date", ls.get(1));
//                toSave(obj);
                toSave(ls);
              }
            }
          }
          emotionarchive++;
        }else{
          f = false;
        }
      } catch (Exception e) {
        f = false;
        System.out.println(e.toString());
      }
    }
  }

  @Override
  public void run() {
    while(run){
      try {
        int q = gettingStart();
        if(q>999999999){
          run = false;
        }else{
          parseXml(q);
          System.out.println(q);
        }
      } catch (Throwable e) {
        e.printStackTrace();
      }
    }
  }

  public static void main(String[] args){
    for (int i = 0; i < 200; i++) {
      new Thread(new QQParse()).start();
    }
//    QQParse p = new QQParse();
//    p.parseXml(441637262);
  }

}

[原文地址]

相关讨论:

1#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-03 19:22

最好不要一边Get一边插入,我已经把MongoDb插死过了。

2#

小胖子 (我承认,我爱过VIP,我仅仅是爱过,因为他死了。) | 2013-11-03 19:24

@园长 先备份我自己的。哈哈。

3#

YY-2012 (坐等0day三个月。。) | 2013-11-03 19:29

无标题

您正在查看的源包含频繁更新的内容。订阅源后,该源会添加到“常见源列表”中。该源的更新信息会自动下载到计算机,通过 Internet Explorer 及其他程序可以查看这些信息。进一步了解源。

订阅该源

4#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-03 19:31

@YY-2012 用FireFox可以直接打开,还有就是如果QQ空间有权限就没法采集了,只有有权限进空间才能采集。

5#

无敌L.t.H (:‮门安天京北爱我) | 2013-11-03 19:46

<error>您无权访问.</error>

6#

YY-2012 (坐等0day三个月。。) | 2013-11-03 19:47

@园长 第一次可以打开,第二页开始打不开。。

7#

Ki11 (ฏ๎๎๎๎๎๎๎๎๎ฏ ้้้้้็็็็็้้้้็็็็็ฏด้้้้้็็็็็้้้้้็็็็็้้้้้็็็้็็็ ้้้้้็็็็็้้้้็็็็็ฏ๎็็็็็็oด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็ ้้้้้็็็็็้้้้็็็็็ฏด้้้้้็็็็็้้ ้้้้้็็็็็้้้้็็็็็ฏ๎๎๎๎๎๎๎๎๎ฏฏด้้้้้็็็็็้้o ้้้) | 2013-11-03 19:53

<error>服务器繁忙,请稍候再试</error>

8#

nauscript (@VIP @齐迹 @园长 @ACGT @z7y @小胖子@PX1624) | 2013-11-03 20:09

mark 有做好备份的童鞋记得at一下哈  留着以后慢慢查。。。

9#

N1ghtBird | 2013-11-03 20:14

<error>您无权访问.</error>

10#

queen787 | 2013-11-03 20:25

请教大牛,第一张图您用的是ff的什么插件?

11#

海盗湾V | 2013-11-03 20:34

@queen787 HackBar

12#

Black-Hole | 2013-11-03 21:57

收了

13#

蟋蟀哥哥 (popok是孙子!![just for fun]) | 2013-11-03 22:04

@queen787 hackbar

14#

TellYouThat | 2013-11-03 22:27

为啥老师服务器忙。。。

15#

s4msung (initab) | 2013-11-03 22:29

<?xml version="1.0" encoding="gb2312" ?>

<error>您无权访问.</error>

16#

Jumbo | 2013-11-03 22:43

第一次可以。后面就不行了。后面就出现无权访问了

17#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-03 22:49

@Jumbo 能访问的都能访问,我跑了个脚本,50线程20分钟跑了20W+。 @TellYouThat 参数要对,分页的参数记得要传,默认是1。

18#

Ivan | 2013-11-04 00:07

看了一眼 32页。。。怎么批量跑 - -

19#

horseluke (微碌) | 2013-11-04 00:15

滔滔之前是继饭否之外比较看好的另一个微博系统,可惜没坚持下去乱改方向...

20#

wszf | 2013-11-04 00:33

@horseluke 应该不是不坚持问题吧,好像是当时政策问题

21#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-04 00:34

@Ivan 第一层循环启动n个线程第二层循环1-999999999内的所有qq号码,第三个循环就是当前号码的所有心情包括翻页。修改了下脚本跑了100来玩条,挺有意思的。

22#

queen787 | 2013-11-04 07:30

@蟋蟀哥哥 @海盗湾V 感谢大牛~

23#

jeary ((:‮Test)) | 2013-11-04 09:30

我想说我只有一页。

24#

BlackWidow7 (哇咔咔) | 2013-11-04 09:45

无权限的空间表示没有用处

25#

Jason (我是来拯救地球的!) | 2013-11-04 10:21

您无权访问,是不是接口被封了?

26#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-04 10:30

@Jason @BlackWidow7 只有空间能够对我访问的QQ才能采集。采集了些Demo挺好玩的。

qzone-QQ心情63W.rar

27#

insight-labs (Root Yourself in Success) | 2013-11-04 10:32

被你们抓的都服务器繁忙了……

java真蛋疼,同样的功能用python实现只用1/4的代码量

园长跑完了的话打包发出来吧,可以作为很有用的中文分词研究资料

28#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-04 10:52

@insight-labs 没办法跑完,昨晚上跑了一个小时跑了140W只抓回来63W条记录然后就被人给断网了。。。连接数有点太多了.开小了又老断.

java.exe

29#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-04 10:55

@insight-labs PC开的50线程跑了,开200丢包率太高了。

30#

insight-labs (Root Yourself in Success) | 2013-11-04 11:06

@园长 别用pc跑,放服务器上跑……弄个分布式的,每个节点负责一个区间的qq号……

不过好像抓那么多用处也不大,还是当年某某证的接口比较爽……

31#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-04 11:24

@insight-labs 求跑.....一个shell都没有,服务器到期了.VPS也挂了....

32#

M0nster | 2013-11-04 11:32

@insight-labs 05-08年我估计会抓到一堆非主流对中文分词研究没什么帮助

33#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-04 11:32

@insight-labs 其实里面有非常多有价值的信息,包括手机号、邮箱、QQ密码、个人的情感故事记录、记忆...

还看到了在08年512的时候好多人的心情都是大家一起团结一心的凝聚力还有些心情看着都让人..

100012954[/ts!]死亡倒计时318天```````````````[/ts!]2007-02-1209:25:29
100012954[/ts!]死亡倒计时319天```````````````[/ts!]2007-02-1120:41:30
100012954[/ts!]死亡倒计时320天```````````````[/ts!]2007-02-1008:45:48
100012954[/ts!]死亡倒计时321天```````````````[/ts!]2007-02-0912:48:31
100012954[/ts!]死亡倒计时322天```````````````[/ts!]2007-02-0820:18:15
100012954[/ts!]等待死亡```````````````[/ts!]2007-02-0815:32:35
100012954[/ts!]情人节自己过~~~哇哈哈[/ts!]2007-02-0808:23:48
100012954[/ts!]白痴....白仁....死萨怕```````滚[/ts!]2007-02-0722:53:28
100012954[/ts!]恶心....SB....死垃圾```````滚[/ts!]2007-02-0615:15:29
100012954[/ts!]无聊....郁闷....去自杀```````[/ts!]2007-02-0400:06:54
100012954[/ts!]。。。。。。。。[/ts!]2007-02-0316:33:10
100012954[/ts!]天啊......竟然有人说我老.......无语.........[/ts!]2007-02-0223:10:48
100012954[/ts!]带小孩子~!~~~~~~~~~~~~~~~~~~~~~~~[/ts!]2007-01-3009:02:19
100012954[/ts!]过年不回家.........[/ts!]2007-01-2809:02:10
100012954[/ts!]命运[/ts!]2007-01-2708:38:40
100021202[/ts!]回家倒计时:今天是1月16号 离回家还有1天![/ts!]2007-01-1611:12:14
100021202[/ts!]回家倒计时:今天是1月15号 离回家还有2天![/ts!]2007-01-1510:11:36
100021202[/ts!]回家倒计时:今天是1月14号 离回家3天![/ts!]2007-01-1414:12:28
100021202[/ts!]回家倒计时:今天是1月13号 离回家还有5天![/ts!]2007-01-1310:51:20
100021202[/ts!]回家倒计时:今天是1月12日,离回家还有6天.[/ts!]2007-01-1213:38:26
100021202[/ts!]回家倒计时:今天是1月11号 离到家还有7天![/ts!]2007-01-1110:21:01
100021202[/ts!]回家倒计时:今天是1月10号 离回家还有8天![/ts!]2007-01-1022:25:06
100030145[/ts!]张洲!妈的晓得你帅咯!帅有毛用!不还是我给钱你花!日[/ts!]2006-10-2622:58:21
100030145[/ts!]现已无钱来支撑.十加一月生日多.今月工资难填补.我该如何是好啊?妈的****真郁闷![/ts!]2006-10-2516:55:52

还有好多人的心情在那时候看起来都非常的有意思...

34#

Ocean | 2013-11-04 11:58

包含大量的信息啊,小伙伴们速度把女神的说说备份了,机会从此开始.

35#

TellYouThat | 2013-11-04 12:13

@园长 是对的  直接用地址试了下 就我的QQ不行。。。

留言评论(旧系统):

泪痕 @ 2013-11-05 05:43:44

为啥不行啊?求解,核总

本站回复:

具体提示什么?

泪痕 @ 2013-11-05 12:34:42

显示查看收取点,这是一个该站点的频繁更新内容的“收取点”。 您可以订阅至此收取点,当此内容发生变化时即可收到更新。 求解

本站回复:

那是一种数据源格式,浏览器提示的,你用程序采集就行了,很简单……

xxx @ 2013-11-05 23:24:58

需要认证的。。。略鸡肋

本站回复:

嗯,还行吧……

嘿嘿 @ 2013-11-06 18:17:26

ฏด้้้้้็็็็็้้้้้็็็็็้้้้้็็็้็็็ ้้้้้็็็็็้้้้็็็็็ฏ๎็็็็็็oด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็ ้้้้้็็็็็้้้้็็็็็

本站回复:

哟西……

佚名 @ 2013-11-08 09:49:31

是不是利用代码实现,具体方法是 什么,菜鸟不懂

本站回复:

方法=采集……

佚名 @ 2013-11-08 10:06:56

采集都不懂,求站长,求步骤

本站回复:

baidu & google

佚名 @ 2013-11-08 10:23:14

服务器繁忙 用不了

本站回复:

╮(╯_╰)╭

佚名 @ 2013-11-08 17:19:44

您无权访问·············

本站回复:

额……