如果你能写一个这样的工具,你的爬虫能力可以评AAA级别了。如果你想挑战你自己,也可以写个爱奇艺的登入试试看。

16年直播火热得时候,有朋友做了个工作室入住奇秀直播平台,主播需要刷人气,然后市面上又买不到人气,只能委托我写帮他写一个人气外挂,于是就对奇秀平台做了个全面剖析.

最终这个脚本涉及三门语言把他写出来了。原本以为挺简单得一个东西搞了10来天,现在将整个过程分享出来给大家。

免责声明,本文章仅供技术交流使用,请勿用于任何商业行为以及违法活动,本人盖不负责。

1、写脚本我一贯使用TC简单编程,这是一款简单得脚本语言,对于有编程基础得人上手应该很快。

2、用了java做了个心跳客户端。

3、用了AS3.0写了个flash服务端。

由于挂人气需要大批量账号,那么就得先写一个注册器,由于注册需要大量手机号所以需要接入手机验证码平台,以及图片验证码打码平台。实践中发现,同一个IP会注册受限5个账号,于是继续增加一个IP代理功能。注册完后将cookies保存下来。后面其它操作直接使用cookies 即可。

1、如何通过代理ip进行注册呢?使用WinHttpRequest5.1提供得代理设置。

var winhttp = com("WinHttp.WinHttpRequest.5.1")var proxy="106.46.136.158:808"winhttp.SetProxy(2, proxy)

这样子一个请求就会被proxy代理了。

2、rsa加密密码,以下是TC调用js对密码进行rsa加密。当然这个加密方式是从html数据分析中获得得。

//rsa加密
function js_rsaEncrypted(password)var a = "var key=RSAUtils.getKeyPair('10001', '', 'ab86b6371b5318aaa1d3c9e612a9f1264f372323c8c0f19875b5fc3b3fd3afcc1e5bec527aa94bfa85bffc157e4245aebda05389a5357b75115ac94f074aefcd');"var b = "var p= RSAUtils.encryptedString(key, '" & password & "');"var d = "return p;"var ret = webrunjs("js", a & b & d)return ret
end

注册服务


function regist_getCookie()var url = "http://x.pps.tv/"var headervar ret = proxy_get(url, "", "", header, "", "", proxy_ip, false)//traceprint(ret)CookiesManager_getCookie(header)//traceprint("cookies="&cookies)
endfunction regist_getVerifyCode()var url = "http://passport.pps.tv/apis/register/vcode.action?r=" & js_getR()var headervar referer = "http://x.pps.tv/"proxy_getpic(url, "", cookies, header, referer, "", proxy_ip, false)//traceprint(header)CookiesManager_getCookie(header)
end//发送手机验证码
function regist_send_cellphone_authcode_vcode(mobile, vcode)//var url="http://passport.pps.tv/apis/phone/send_cellphone_authcode_vcode.action?agenttype=78&requestType=1&serviceId=2&cellphoneNumber=17068976749&vcode=wj4t&_=1491474169245var url = "http://passport.pps.tv/apis/phone/send_cellphone_authcode_vcode.action?agenttype=78&requestType=1&serviceId=2&cellphoneNumber=" & mobile & "&vcode=" & vcode & "&_=" & js_timeToUnix()var headervar referer = "http://x.pps.tv/"var ret = proxy_post(url, "", cookies, header, referer, "", proxy_ip, false)CookiesManager_getCookie(header)//traceprint(cookies)return ret
end//注册
function regist_reg(mobile, password, authCode)var url = "https://passport.pps.tv/apis/reglogin/cellphone_reg.action?cellphoneNumber=" & mobile & "&password=" & password & "&serviceId=2&authCode=" & authCode & "&agenttype=78&fromurl=http%3A%2F%2Fx.pps.tv%2F&_=1489463684348"var headervar referer = "http://x.pps.tv/"var ret = proxy_get(url, "", cookies, header, referer, "", proxy_ip, false)CookiesManager_getCookie(header)return ret
end//注册成功后登入
function regist_login()var url = "https://passport.iqiyi.com/apis/user/authlogin.action?ptid=01010041010000000000&agenttype=78"var authcookie = "&authcookie=" & loginService_authcookievar t = "&t=" & js_getT()var unixtime = "&_=" & js_timeToUnix()var headervar referer = "http://x.pps.tv/"url = url & authcookie & t & unixtimevar ret = proxy_get(url, "", cookies, header, referer, "", proxy_ip, false)CookiesManager_getCookie(header)
end//这个比较特别code=200 msg=ok
function regist_getLoginfo()var url = "http://x.pps.tv/userinfo/loginfo/?_=" & js_timeToUnix()var headervar referer = "http://x.pps.tv/"var ret = proxy_get(url, "", cookies, header, referer, "", proxy_ip, true)CookiesManager_getCookie(header)return ret
end

所有操作得接口

//关注
function opration_action_follow(id, roomid)var url = "http://x.pps.tv/room/followAnchor"var anchor_id = "anchor_id=" & idvar op_type = "&op_type=1"var send = anchor_id & op_typevar headervar referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//取消关注
function opration_action_unfollow(id, roomid)var url = "http://x.pps.tv/room/followAnchor"var anchor_id = "anchor_id=" & idvar op_type = "&op_type=2"var send = anchor_id & op_typevar headervar referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end//进入房间
function opration_action_getRoom(roomid)var url = "http://x.pps.tv/room/" & roomidvar header //var refere="http://x.pps.tv/"var ret = proxy_get(url, "", cookies, header, "", "", proxy_ip, false)return ret
end
//获得vip列表post ajax
function opration_action_getVipUserList(roomid)var url = "http://x.pps.tv/room/getVipUserList"var send = "page=1&page_size=20&room_id=" & roomidvar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//获得分类列表
function opration_action_roomRankList(roomid)var url = "http://x.pps.tv/room/roomRankList"var send = "room_id=" & roomid & "&week=current"var header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//获取礼物列表
function opration_action_getGiftList(roomid)var url = "http://x.pps.tv/room/getGiftList"var send = "room_id=" & roomidvar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end//获得守护列表
function opration_action_getGuardList(id, roomid)var url = "http://x.pps.tv/room/getGuardList"var send = "anchor_id=" & id & "&room_id=" & roomid & "&is_online_sort=1"var header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//获得比赛结果
function opration_action_getPkResult(roomid)var url = "http://x.pps.tv/anchorpk/getPkResult"var send = "room_id=" & roomidvar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//获得房间状态
function opration_action_getRoomStatus(roomid)var url = "http://x.pps.tv/redpackets/getRoomStatus"var send = "room_id=" & roomidvar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return retend
//获得麦序用户
function opration_action_getUserMICUserRelative(roomid)var url = "http://x.pps.tv/userinfo/getUserMICUserRelative"var send = "room_id=" & roomidvar headervar referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//获得用户状态
function opration_action_getUserStat(roomid)var url = "http://x.pps.tv/userinfo/getUserStat"var header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, "", cookies, header, referer, "", proxy_ip, true)return ret
end
//任务奖励
function opration_action_hasTaskReward(roomid)var url = "http://x.pps.tv/task/hasTaskReward"var send = "model=%7B%7D"var header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//获取个人信息
function opration_action_info(roomid, authcookie)var url = "https://passport.iqiyi.com/apis/user/info.action?ptid=01010041010000000000"var this_authcookie = "&authcookie=" & authcookievar unixtme = "&_=" & js_timeToUnix()url = url & this_authcookie & unixtmevar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_get(url, "", cookies, header, referer, "", proxy_ip, false)traceprint(header)return ret
end
//是否打卡
function opration_action_isCompleted(anchor_id, roomid)var url = "http://x.pps.tv/card/isCompleted"var send = "anchor_id=" & anchor_idvar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//初始化
function opration_action_init(roomid)var url = " http://x.pps.tv/topicplay/init"var send = "room_id=" & roomidvar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end//获取打卡列表
function opration_action_getMonthCardTask(anchor_id, roomid)var url = "http://x.pps.tv/card/getMonthCardTask"var send = "anchor_id=" & anchor_id & "&date=1"var header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end
//打卡
function opration_action_cardIn(roomid, task_id)var url = "http://x.pps.tv/card/cardIn"var send = "task_id=" & task_id & "&room_id=" & roomidvar header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)return ret
end//关注
function opration_follow(id, roomid)var res = opration_action_follow(id, roomid)return res
end
//取消关注
function opration_unfollow(id, roomid)var res = opration_action_unfollow(id, roomid)return res
end
//直播
function opration_action_allLive(roomid)var url = "http://x.pps.tv/room/allLive"var send = "page=8&page_size=12"var header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)
end//获得粉丝列表
function opration_action_getFansUserList(roomid)var url = "http://x.pps.tv/room/getFansUserList"var send = "room_id=" & roomid & "&page=1&page_size=10"var header var referer = "http://x.pps.tv/room/" & roomidvar ret = proxy_post(url, send, cookies, header, referer, "", proxy_ip, true)
end//打卡
function opration_cardIn(anchor_id, roomid, authcookie)//    opration_action_allLive(roomid)//    opration_action_getFansUserList(roomid)//    opration_action_getGiftList(roomid)//    opration_action_getGuardList(anchor_id,roomid)//    opration_action_getPkResult(roomid)//    opration_action_getRoomStatus(roomid)//    opration_action_getUserMICUserRelative(roomid)//    opration_action_getUserStat(roomid)//    opration_action_getVipUserList(roomid)//    opration_action_hasTaskReward(roomid)//    opration_action_roomRankList(roomid)//    opration_action_isCompleted(anchor_id,roomid)//traceprint(res)opration_action_getRoom(roomid)var res = opration_action_getMonthCardTask(anchor_id, roomid)var pJson = jsonparse(res)var pJson1var code = ""var card_calendar = ""var task_id = ""var datavar flg = falsejsongetobjectvalue(pJson, "code", code)if(code == "A00000")jsongetobjectvalue(pJson, "data", data)jsongetobjectvalue(data, "card_calendar", card_calendar)var day = timeday(timenow())var task = ""var task_itemjsongetarrayvalue(card_calendar, day - 1, task_item)jsongetobjectvalue(task_item, "task", task)jsongetobjectvalue(task, "task_id", task_id)traceprint(task_id)if(task_id != "" && task_id != null)res = opration_action_cardIn(roomid, task_id)//traceprint(res)traceprint(cookies)pJson1 = jsonparse(res)var msg = ""jsongetobjectvalue(pJson1, "code", code)jsongetobjectvalue(pJson1, "msg", msg)//traceprint(msg)if(code == "A00000")flg = trueres = opration_action_getMonthCardTask(anchor_id, roomid)elseflg = falseendelseflg = falseendelseflg = falseendjsonfree(pJson)jsonfree(pJson1)return flg
end//进入房间
function opration_getRoom(roomid, authcookie)//获取房间var res = opration_action_getRoom(roomid)//获取个人信息//    res=opration_action_info(roomid,authcookie)//    res=opration_action_init(roomid)//return res
end//===================================================================================================function opration_getAddParam(roomid, user_id, chat_id)//    sign=62ca96381e996d6d529c188d79fa9b22//    userLocation="&userLocation=CNC_FuJian"//   flashVersion="&flashVersion=11.01.18.04"//  s3="&s3=0"//    s1="&s1=access.live.iqiyi.com"//    roomId="&roomId="&roomid//  serverIp="&serverIp=null"// key="&key=show_flash"// clientTime="&clientTime="&js_getT()//   serverPort="&serverPort=0"//    s4="&s4="// userId="&userId="&user_id// errorReason="&errorReason=0"//  subType="&subType=8"//  userIp="&userIp=220.200.63.129"//   eventType="&eventType=1"//  s2="&s2=80"//   chatId="&chatId="&chat_id
end

分析数据后发现,奇秀直播平台维持了两个心跳,先讲讲http心跳,这个心跳做了签名处理,签名是个MD5加了个尾巴,于是就找这个尾巴是什么,最后找到 as中,发现这个签名函数是个 as+C混编得一段代码。然后异想天开得想读汇编,将它读出来,结果那代码简直不忍直视。as+c得混编看着四不像,最后发现as具有反射能力,于是写了个as得壳套在它原生得as客户端上做成一个socketserver,直接反射调用了这个加签函数,将心跳需要的参数进行签名,居然可以。由于脚本语言对socket支持不是很好。就用java弄了个线程池,维持住心跳,http心跳30秒一次,socket心跳1分钟一次。到此整个外挂流程就全通了。由于是朋友工作室再用,不打算商业化,没有做过多得优化。整个工程耗时半个多月,这算是我逆向过最难的一个平台了。卡住的点就是这个as+c混编的签名。那代码比纯汇编难看多了。

对了这里交代下逆向flash的工具是用了jpexs一款免费的flash逆向工具,逆向功能非常强大,我只用了一些皮毛,调试功能还用不上。

爱奇艺奇秀直播人气挂核心原理(写爬虫的都来看看)相关推荐

  1. 从Flash到MP4,爱奇艺奇秀直播礼物特效精进之路

    虚拟礼物是主播和观众互动的重要道具,也是主播很大一部分的收入来源.当刷满足够礼物数量时,直播间就会飞出炫酷的礼物动效,它既能刺激主播更好地直播,也能满足用户在虚拟世界的荣誉感,越有诚意的礼物会触发越精 ...

  2. 爱奇艺奇秀直播的秒播体验优化实践

    在视频直播中,首帧渲染速度会直接影响用户体验.想象一下,你兴致勃勃进入了一个爱豆的直播间,进入直播间后迟迟不见直播画面,而是长时间停留在直播间背景图上,这是大多数用户都无法接受的体验. 为了提高用户在 ...

  3. LiveVideoStack线上交流分享 (十六) —— 爱奇艺剧场直播云端混流方案

    如今网络直播如火如荼,剧场直播是其一个应用分支,主播在观看点播视频时的同时做出评述,观众端同步观看点播和主播评述的混合视频流.今晚 7:30 ,LiveVideoStack线上交流分享第十六期,我们邀 ...

  4. 使用nginx分流虎牙爱奇艺同时直播

    首先需要下载nginx和nginx rtmp模块 nginx: https://github.com/nginx/nginx nginx rtmp: https://github.com/arut/n ...

  5. 爱奇艺直播WebAssembly优化之路

    WebAssembly技术简介 近几年,WebAssembly技术非常火,可以说是成为了JavaScript一个新的转折点.JavaScript自1995年诞生之日起,其性能问题就被大家诟病.直到20 ...

  6. 爱奇艺、优酷、腾讯视频竞品分析报告2016(二)

    接上一篇<爱奇艺.优酷.腾讯视频竞品分析报告2016(一)> http://milkyqueen520.blog.51cto.com/11233158/1760192 2.4 产品设计与交 ...

  7. OCR技术在爱奇艺的应用实践及演进

    随着人工智能的热度上升,图像识别这一细分领域也渐渐被人们所关注.在很多公司的业务中,有很多需要对图片进行识别的需求.为了帮助业务实现对这些图片.文档的识别和结构化,业界进行了一系列的实践和探索,最终确 ...

  8. 爱奇艺广告变游戏——视频流媒体如何加入云游戏战局

    以下内容是由采访爱奇艺直播云团队的陈坤中整理而成,在采访中陈坤中提到,目前爱奇艺云游戏广告试玩已经落地,而且是效果很好的业务.他还分享了他对云游戏广告试玩的技术.商业.未来的面面观. 陈坤中目前负责爱 ...

  9. 爱奇艺体验Serverless极致扩缩容,资源利用率提升40%

    简介:Serverless 应用引擎 SAE 是面向应用的 Serverless PaaS平台,提供了效率更高.成本更优的一站式应用托管方案.零门槛+零改造+零容器基础,即享Serverless+K8 ...

最新文章

  1. java 连接 pgsql
  2. Win7上Git安装及配置过程
  3. php用命令行脚本执行,使用PHP命令行执行PHP脚本的注意事项
  4. tftp ubuntu安装
  5. django的表单系统
  6. 前端防xss攻击(去掉空格等能影响和攻击数据库的字段)
  7. plt导致的_tkinter.TclError: no display name and no $DISPLAY environment variable的问题
  8. java音乐网站源码_Vue + SpringBoot + MyBatis 音乐网站
  9. absolute之后居中宽度自适应
  10. bcdboot(引导修复工具) 命令行工具使用方法
  11. FPGA的基本设计流程
  12. PS技巧---提取线稿
  13. 西门子1200PLC程序远程上下载,远程在线调试原来是使用了巨控GRM530远程模块
  14. java复习二十一天[多线程终]
  15. 英伟达 NVIDIA-Tesla-P40 GPU 直透
  16. 分布式优化算法学习(一)
  17. speedoffice文档中如何绘制流程图
  18. 应用线性代数简介 - 向量,矩阵和最小二乘法 By Stephen Boyd and Lieven Vandenberghe
  19. 如何选择电子招标方案?
  20. 视频碎片拼接m3u8软件的使用

热门文章

  1. 管状合金电阻和片状合金电阻的区别_R007合金电阻 电动滑板车专用电阻 大毅现货供应...
  2. 江苏省2023年普通高等学校“专转本”选拔工作实施办法的通知
  3. LVS技术浅析-配置管理3
  4. 帆软FCP模拟试卷第4题(第6题)
  5. Kotlin 异常处理
  6. 数据库实验二--学生选课数据库(OpenGuess)
  7. MySQL中字符串查询效率大比拼
  8. WIN7无法保存时区为东八区(+08:00)
  9. 转载 spring单例bug
  10. CloudStack的创建