大家好,在每个人都对 viewbot 感到兴奋之前,我想说它只是一个有趣的项目,我只是想尝试一下它是否真的可以工作并在此过程中学习一些东西。我对发布此内容或尝试成为合作伙伴或认真的机器人没有兴趣,也许只是对我想要一次又一次地流式传输的朋友恶作剧。既然这么说我可以继续下去了。
我编写了一个基本程序来构建 twitch 查看器令牌,然后开始将它们连接到我认为 twitch 对其进行查看的位置。这是奇怪的事情,当我打 10 个机器人时,它会将观众数量重置为应计的真实观众。我的问题是它到底是怎么弄出来的。我想指出我正在使用代理进行连接,以便 twitch 认为这些观众来自世界各地,而不是来自一个地方。
我尝试过另一种方法,它是构建所有查看器令牌,然后像上面一样,我得到一个查看令牌并立即发送它我基于代理构建它们,然后同时发送它们这通常会超过 10 名观众上限,但不会超过多少,但不会重置回应计观众人数。
这是构建令牌的代码:(有点乱,所以我会回答任何需要回答的问题)
ASIHTTPRequest *request43 = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.twitch.tv/api/channels/%@/access_token?as3=t",_twitchName]]];
[request43 setProxyHost:host];
[request43 setProxyPort:port];
[request43 addRequestHeader:@"Host" value:@"api.twitch.tv"];
[request43 addRequestHeader:@"User-Agent" value:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0"];
[request43 addRequestHeader:@"Accept" value:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"];
[request43 addRequestHeader:@"Accept-Language" value:@"en-US,en;q=0.5"];
[request43 addRequestHeader:@"Accept-Encoding" value:@"gzip, deflate"];
[request43 addRequestHeader:@"Referer" value:@"http://www-cdn.jtvnw.net/swflibs/TwitchPlayer.rc356cd0c16b6941b7f81b61f6c81628e0af555d9.swf"];
[request43 addRequestHeader:@"Cookie" value:@" __qca=P0-1674306474-1405279259134; __utma=165406266.651051162.1405279260.1417284372.1417380722.33; __utmz=165406266.1411832471.26.8.utmcsr=twitch.tv|utmccn=(referral)|utmcmd=referral|utmcct=/nozux; language=en-us; __gads=ID=bc1b6635a26dc0a7:T=1405279267:S=ALNI_MY1rrxM6Qf6aS_lUCRlff0o0gtUaA; unique_id=e8ba8f001f90b6bc293ab6e79ea0b1bb; __utmc=165406266; feature_bucket=88; _twitch_session_id=c06f09efe4c36c8ea46176deabab0cb5; __utmb=165406266.0.10.1417380722; mp_809576468572134f909dffa6bd0dcfcf_mixpanel=%7B%22distinct_id%22%3A%20%22147312bcdb989-0fc383a2c86945-41652d42-13c680-147312bcdba176%22%2C%22%24initial_referrer%22%3A%20%22http%3A%2F%2Fintl.gg%2F%22%2C%22%24initial_referring_domain%22%3A%20%22intl.gg%22%7D"];
[request43 addRequestHeader:@"Connection" value:@"keep-alive"];
[request43 addRequestHeader:@"If-None-Match" value:@"11b92749f327a27cb4ebfb8b57f12b15"];
[request43 addRequestHeader:@"Cache control" value:@"no-cache"];
[request43 setTimeOutSeconds:10];
[request43 setFailedBlock:^{
NSLog(@"failed 1st");
NSLog(@"%@",request43.error);
}];
[request43 setCompletionBlock:^{
NSError *error;
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:request43.responseData options:0 error:&error];
NSString *token = [[jsonDic valueForKey:@"token"] stringByAddingPercentEscapesUsingEncoding:
NSASCIIStringEncoding];
NSString *sig = [jsonDic valueForKey:@"sig"];
NSLog(@"%@",jsonDic);
ASIHTTPRequest *request44 = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://usher.twitch.tv/api/channel/hls/%@.m3u8?token=%@&p=4753325&player=twitchweb&sig=%@&segment_preference=4",_twitchName,token,sig]]];
////http//usher.twitch.tv/api/channel/hls/%@.m3u8?token=%@&p=4753325&player=twitchweb&sig=%@&segment_preference=4
[request44 addRequestHeader:@"Host" value:@"usher.twitch.tv"];
[request44 addRequestHeader:@"User-Agent" value:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0"];
[request44 addRequestHeader:@"Accept" value:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"];
[request44 addRequestHeader:@"Accept-Language" value:@"en-US,en;q=0.5"];
[request44 addRequestHeader:@"Accept-Encoding" value:@"gzip, deflate"];
[request44 addRequestHeader:@"Referer" value:@"http://www-cdn.jtvnw.net/swflibs/TwitchPlayer.rc356cd0c16b6941b7f81b61f6c81628e0af555d9.swf"];
[request44 addRequestHeader:@"Cookie" value:@" __qca=P0-1674306474-1405279259134; __utma=165406266.651051162.1405279260.1417284372.1417380722.33; __utmz=165406266.1411832471.26.8.utmcsr=twitch.tv|utmccn=(referral)|utmcmd=referral|utmcct=/nozux; language=en-us; __gads=ID=bc1b6635a26dc0a7:T=1405279267:S=ALNI_MY1rrxM6Qf6aS_lUCRlff0o0gtUaA; unique_id=e8ba8f001f90b6bc293ab6e79ea0b1bb; __utmc=165406266; feature_bucket=88; _twitch_session_id=c06f09efe4c36c8ea46176deabab0cb5; __utmb=165406266.0.10.1417380722; mp_809576468572134f909dffa6bd0dcfcf_mixpanel=%7B%22distinct_id%22%3A%20%22147312bcdb989-0fc383a2c86945-41652d42-13c680-147312bcdba176%22%2C%22%24initial_referrer%22%3A%20%22http%3A%2F%2Fintl.gg%2F%22%2C%22%24initial_referring_domain%22%3A%20%22intl.gg%22%7D"];
[request44 addRequestHeader:@"Connection" value:@"keep-alive"];
[request44 addRequestHeader:@"Cache control" value:@"no-cache"];
[request44 setProxyHost:host];
[request44 setProxyPort:port];
[request44 setFailedBlock:^{
NSLog(@"failed 2st");
NSLog(@"%@",request44.error);
}];
[request44 setCompletionBlock:^{
// NSLog(@"%@",[[NSString alloc] initWithData:request44.responseData encoding:NSUTF8StringEncoding]);
NSString *urls = [[NSString alloc] initWithData:request44.responseData encoding:NSUTF8StringEncoding];
// NSLog(@"%@",urls);
NSArray *urlArray = [urls componentsSeparatedByString:@"http://"];
NSLog(@"%@",urlArray);
if (urlArray.count < 2) {
return;
}
NSString *url = [NSString stringWithFormat:@"http://%@",[[[urlArray objectAtIndex:1] componentsSeparatedByString:@"\n"] objectAtIndex:0]];
//NSString *url = [[NSString stringWithFormat:@"http://%@",[urlArray lastObject]] stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSLog(@"%@",url);
if ([url rangeOfString:@"video"].location != NSNotFound) {
NSLog(@"%@",url);
ASIHTTPRequest *final = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:url]];
[final setProxyHost:host];
[final setProxyPort:port];
[final addRequestHeader:@"Cache control" value:@"no-cache"];
[final addRequestHeader:@"Host" value:@"video11.iad02.hls.twitch.tv"];
[final addRequestHeader:@"User-Agent" value:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0"];
[final addRequestHeader:@"Accept" value:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"];
[final addRequestHeader:@"Accept-Language" value:@"en-US,en;q=0.5"];
[final addRequestHeader:@"Accept-Encoding" value:@"gzip, deflate"];
[final addRequestHeader:@"Referer" value:@"http://www-cdn.jtvnw.net/swflibs/TwitchPlayer.rc356cd0c16b6941b7f81b61f6c81628e0af555d9.swf"];
[final addRequestHeader:@"Cookie" value:@"__qca=P0-1674306474-1405279259134; __utma=165406266.651051162.1405279260.1417284372.1417380722.33; __utmz=165406266.1411832471.26.8.utmcsr=twitch.tv|utmccn=(referral)|utmcmd=referral|utmcct=/nozux; language=en-us; __gads=ID=bc1b6635a26dc0a7:T=1405279267:S=ALNI_MY1rrxM6Qf6aS_lUCRlff0o0gtUaA; unique_id=e8ba8f001f90b6bc293ab6e79ea0b1bb; __utmc=165406266; feature_bucket=88; _twitch_session_id=c06f09efe4c36c8ea46176deabab0cb5; __utmb=165406266.0.10.1417380722; mp_809576468572134f909dffa6bd0dcfcf_mixpanel=%7B%22distinct_id%22%3A%20%22147312bcdb989-0fc383a2c86945-41652d42-13c680-147312bcdba176%22%2C%22%24initial_referrer%22%3A%20%22http%3A%2F%2Fintl.gg%2F%22%2C%22%24initial_referring_domain%22%3A%20%22intl.gg%22%7D"];
[final addRequestHeader:@"Connection" value:@"keep-alive"];
[final setFailedBlock:^{
NSLog(@"final failed");
}];
[final setCompletionBlock:^{
if ([final.responseString rangeOfString:@"#EXT-X-MEDIA-SEQUENCE"].location != NSNotFound) {
[self.builtRequests addObject:final];
if (proxyDictonary) {
[self.SuccessProxies addObject:proxyDictonary];
}
[self sendRequest:final];
NSLog(@"%lu",_builtRequests.count);
} else {
NSLog(@"%@",final.responseHeaders);
NSLog(@"%@",final.responseString);
}
}];
[final startAsynchronous];
}
}];
[request44 startAsynchronous];
}];
[request43 startAsynchronous];
以下是连接成功时我的代码中的响应标头:
Request43:"Accept-Ranges" = bytes;
Age = 0;
"Cache-Control" = "max-age=0, private, must-revalidate";
Connection = "keep-alive";
"Content-Encoding" = gzip;
"Content-Length" = 231;
"Content-Type" = "application/json; charset=utf-8";
Date = "Wed, 03 Dec 2014 20:51:39 GMT";
Etag = "\"151bb8422eb29f9f33a520ab352f152e\"";
"Front-End-Https" = on;
Server = nginx;
Status = "200 OK";
Vary = "Accept-Encoding";
Via = "1.1 varnish";
"Www-Authenticate" = "OAuth realm='TwitchTV'";
"X-API-Version" = 3;
"X-Frame-Options" = SAMEORIGIN;
"X-MH-Cache" = "appcache2; M";
"X-Request-Id" = 7939f63c1e3130c43a4edfc9a0911629;
"X-Runtime" = "0.030651";
"X-UA-Compatible" = "IE=Edge,chrome=1";
"X-Varnish" = 1041100800;
Request44:Connection = "keep-alive";
"Content-Length" = 2268;
"Content-Type" = "application/vnd.apple.mpegurl";
Date = "Wed, 03 Dec 2014 20:52:44 GMT";
Server = nginx;
Via = "usher25:8933";
"X-Cache" = "MISS from CLONWLPROX1";
"X-Cache-Lookup" = "MISS from CLONWLPROX1:9999";
final:"Accept-Ranges" = bytes;
"Access-Control-Allow-Origin" = "https://secure.twitch.tv";
Age = 1;
"Cache-Control" = "no-cache, no-store, private";
Connection = "keep-alive";
"Content-Length" = 351;
"Content-Type" = "application/vnd.apple.mpegurl; charset=utf-8";
Date = "Wed, 03 Dec 2014 20:57:56 GMT";
Expires = "Wed, 03 Dec 2014 20:57:55 GMT";
"Last-Modified" = "Wed, 03 Dec 2014 20:57:53 GMT";
Server = nginx;
Via = "1.1 CLONWLPROX1 (squid/3.3.8)";
"X-Cache" = "MISS from CLONWLPROX1";
"X-Cache-Lookup" = "MISS from CLONWLPROX1:9999";
这是我通过浏览器转到流时来自 Firefox 的响应标头。
request44:Accept-Ranges:bytes
Age:0 Cache-Control:max-age=0, private, must-revalidate Connection:keep-alive Content-Encoding:gzip Content-Length:230 Content-Type:application/json; charset=utf-8 日期:星期三,2014 年 12 月 3 日 21:07:44 GMT ETag:"74252dca9d2cf4e5da6f91f0d9fcc6c0" Front-End-Https:on Server:nginx Status:200 OK Vary:Accept-Encoding Via:1.1 varnish WWW-Authenticate: OAuth 领域='TwitchTV' X-API-Version:3 X-Frame-Options:SAMEORIGIN X-MH-Cache:appcache2; M X-Request-Id:13c6dbe385ebb778b21596eadb83f4bc X-Runtime:0.060941 X-UA-Compatible:IE=Edge,chrome=1 X-Varnish:1048532873
request44:Connection:keep-alive
内容长度:2252 内容类型:application/vnd.apple.mpegurl 日期:星期三,2014 年 12 月 3 日 21:07:44 GMT 服务器:nginx via:usher16:8947
final:Accept-Ranges:bytes
Access-Control-Allow-Origin: https://secure.twitch.tv Age:0 Cache-Control:no-cache, no-store, private Connection:keep-alive Content-Length:351 Content-Type:application/vnd .apple.mpegurl; charset=utf-8 日期:星期三,2014 年 12 月 3 日 21:07:46 GMT 到期:星期三,2014 年 12 月 3 日 21:07:47 GMT 保持活动:超时 = 50 最后修改:星期三,2014 年 12 月 3 日 21:07 :42 GMT 服务器:nginx