相关帖子:
https://bbs.south-plus.org/read.php?tid-1142421-keyword-recurbate.htmlhttps://bbs.south-plus.org/read.php?tid-1189165-keyword-recurbate.htmlrecurbate 好象是最全最新的 chaturbate 录播站了吧, 看样子是毛子开的 (网站会请求 Yandex.Metrica 的广告文件),会员很贵,20刀一个月。
recurbate.com 域名套了 cloudflare CDN, 媒体文件服务器地址在欧洲国家,比如荷兰和德国。
网站对游客的限制是同时基于 ip 和 cookies, 每个 ip 每天只能请求一个视频文件的地址。
注册免费帐号现在每天限制是一个视频都不能看,所以还不如游客状态。
游客状态下,打开一个视频,点击播放按钮。 浏览器会尝试请求这个地址,"/api/get.php?video=" + id + "&token=" + token , 如果服务器判断你是游客而且 ip 今日已经请求过了,会返回 shall_signin, 然后页面会跳转到登录页面 “/signin?url=”。
如果请求成功视频文件地址会在返回的请求数据 data 里,文件地址大概长这样:
复制代码- https://f15.mediafront.xyz/micu_ko/2021-11-16,16-51.mp4?md5=aYserSak4jkon6nsDbgJaw&expires=1638002800&origin=105&mid=9ce06be3-5dec-45f9-946d-b3e1ca2ecaf5&akey=&p=2000
|
expires=1638002800 这个是时间戳,值是请求那一刻的时间, mid 是 recurbate.com 域名的某一个 cookie 键值,这个值应该对应了你的 ip 地址,md5=aYserSak4jkon6nsDbgJaw 应该是某个防止伪造的加密值, 估计只有服务器才知道怎么生成。
上面的文件地址是有时效的,10分钟以后这个地址就会返回 410 gone。 这个地址也只有你的 ip 地址才能够请求, 如果你用别的 ip 去请求 他会返回 403 forbidden。
所以你唯一能做的就是找一台网速快的机器, 每天请求一次, 在 10 分钟之内把这个文件下载完。 或者找一个能保证网速高而且稳定的机场,不停的切换节点清空 cookies, 文件服务器在欧洲,如果你下载的文件有 6g 大小, 那你要保证你的下载速度有 10M/s 才行。 而且机场的流量还必须充足,因为可能遇到下到快要完成但是超时的情况需要重新下载。
我的解决方案是写一个脚本,然后在美国的 vps 上运行,获取文件地址后下载, 如果你的机子还过得去, 那么请求欧洲地区的服务器网速应该还行还行, 10分钟下载一个视频没什么问题,下载好后然后在拉回本地。 因为手里有好几台 vps 放着吃灰,正好可以用上。
下面贴几个最近在看的主播,特别推荐第一个樱花妹,外表清纯可爱,玩跳蛋高潮的时候还会痉挛。
最后贴出下载脚本代码,只需要修改视频 id 号就行了:
复制代码 import requests import re import sys
s = requests.Session()
header_data = """Host: recurbate.com User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Connection: keep-alive Upgrade-Insecure-Requests: 1 Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none""" lst2 = header_data.split("\n")
lst_of_lst2 = [lst.split(": ") for lst in lst2] HEADERS = {lst[0]: lst[1] for lst in lst_of_lst2}
def get_api_token(video_id):
r = s.get( f"https://recurbate.com/play.php?video={video_id}", headers=HEADERS ) r.encoding = r.apparent_encoding token = re.findall(r'data-token="(.*?)"', r.text)[0] print(token) return token
def get_src(token): resp = s.get( f"https://recurbate.com/api/get.php?video={video_id}&token={token}", headers=HEADERS, ) api_resptext = resp.text if "source" in api_resptext: src = re.findall(r'source src="(.*?)" type="video', api_resptext)[0] print("src: ", src) return src else: print("src not got: ", api_resptext) return None
def fetch_file(src):
file_headers_data = """Accept-Encoding: identity;q=1, *;q=0 Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7 Connection: keep-alive DNT: 1 Host: f18.mediafront.xyz Range: bytes=0- sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Linux" Sec-Fetch-Dest: video Sec-Fetch-Mode: no-cors Sec-Fetch-Site: cross-site User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"""
lst3 = file_headers_data.split("\n")
lst_of_lst3 = [lst.split(": ") for lst in lst3] # print(lst_of_lst2) file_headers = {lst[0]: lst[1] for lst in lst_of_lst3}
response = requests.get(src, headers=file_headers, stream=True) print("status code", response.status_code) content_length_h = str(response.headers.get("content-length")) content_length = int(content_length_h) print("file size:", content_length // (1000000), "MB") file_path = "./download.mp4" with open(file_path, "wb") as file: # start downloading dl = 0 for data in response.iter_content(chunk_size=8192): dl += len(data) file.write(data) done = int(50 * dl / content_length) sys.stdout.write( "\r[%s%s] %s" % ("=" * done, " " * (50 - done), str(dl // 1000000) + "MB") ) sys.stdout.flush()
video_id = 10654230
token = get_api_token(video_id) if src := get_src(token): fetch_file(src)
|