小笙's Blog

在新浪NBA聊天室刷广告是怎么实现的2015.05.14 12:51

新浪NBA聊天室,对于看不了视频直播的童鞋,一直是一个看球聊球的好地方,但是最近聊天室里出现大批的刷广告行为。

例如今天的一场球赛:奇才vs老鹰

进入聊天室,就会发现遍地的广告,并且账号每次都会更换,根本无法正常的聊天。

抓了几个包,了解了正常发一条聊天信息的流程

1.注册clientId

2.使用注册的clientId加入某房间(例如:房间19)

3.发送消息

4.如果要切换房间,则先退出当前房间,再到流程2

注意:每个聊天室的服务器IP、端口不一定相同,不同聊天室的房间编码没有统一规律,这些都需要抓包获取到。

模拟发布消息[以上边聊天室为例]

服务器IP:58.63.237.91:8080

房间19编码:/im/3694301_19

1.注册clientId

参数:channel:/meta/handshake

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$domain = '58.63.237.91:8080';
$room = '/im/3694301_19';
function getClient() {
   global $domain;
   $url = $domain . '/im?message=[{"version":"1.0","minimumVersion":"0.9","channel":"/meta/handshake","supportedConnectionTypes":{"0":"callback-polling"},"id":1}]&jsonp=parent.org.cometd.script._callback1';
   $string = trim(getData($url));
   $string = trim(trim($string, 'parent.org.cometd.script._callback1('), ')');
   $data = json_decode($string);
   return isset($data[0]->clientId) ? $data[0]->clientId : false;
}
function getData($url){
      $ch = curl_init();
      curl_setopt ($ch, CURLOPT_URL, $url);
      curl_setopt ($ch, CURLOPT_USERAGENT, '');
      curl_setopt ($ch, CURLOPT_HEADER, 0);
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt ($ch, CURLOPT_TIMEOUT, 10);
      $result = curl_exec ($ch);
      curl_close($ch);
      return $result;
}


2.加入房间19

参数:channel:/meta/subscribe

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param string $room 房间编码
* @param string $clientId getClient()获取的clientId
*/
function joinRoom($room, $clientId) {
   global $domain;
   $message = '[{"channel":"/meta/subscribe","subscription":"'.$room.'","id":1,"clientId":"'.$clientId.'"}]';
   $url = $domain . '/im?message=' . urlencode($message) . '&jsonp=parent.org.cometd.script._callback1';
   $string = trim(getData($url));
   $string = trim(trim($string, 'parent.org.cometd.script._callback1('), ')');
   $data = json_decode($string);
   return isset($data[0]->successful) ? $data[0]->successful : false;
}

3.发送消息

参数:channel:/im/req

1
2
3
4
5
6
7
8
9
function msgPost($msg, $clientId) {
   global $domain;
   $message = '[{"channel":"/im/req","data":{"cmd":"msg","msg":"'.$msg.'{0}"},"id":1,"clientId":"'.$clientId.'"}]';
   $url = $domain . '/im?message=' . urlencode($message) . '&jsonp=parent.org.cometd.script._callback1';
   $string = trim(getData($url));
   $string = trim(trim($string, 'parent.org.cometd.script._callback1('), ')');
   $data = json_decode($string);
   return isset($data[0]->successful) ? $data[0]->successful : false;
}

现在实验看看结果

为了便于观察加上循环和频率限制

1
2
3
4
5
6
7
8
9
10
11
12
13
$msg = '淹没广告狗';
while(true) {
    if (!$clientId = getClient()) {
         continue;
    }
    if (!joinRoom($room, $clientId)) {
         continue;
    }
   msgPost($msg, $clientId)
   sleep(2);
}


可以看到,聊天室已被成功占领。

还可以进一步优化

    例如:一个clinetId可使用多次,节省每次注册clientId和加入房间的时间,但要定时更换,防止被屏蔽

    评论内容加随机后缀,例如n个空格,防止同一内容被屏蔽

    clientId不用之后,注销掉,防止下一个clientId加入房间失败

    获取多个房间列表,同时发送

    使用多IP或代理IP,防止IP被屏蔽

    ....


以暴制暴不是解决问题的方式,还是希望新浪能够着重治理一下,还球迷一个正常的聊球环境。


  • 正在加载用户留言,请稍后~
点击这里取消回复

  • 请选择邮箱类型
  • @qq.com
  • @163.com
  • @sina.com
  • @126.com
  • @vip.qq.com
  • @sina.com.cn

:love: :kiss: :twist: :top: :shake: :bye: :han: :sleep: :lula: :rou: :happy: