2020年6月21日日曜日

インスタライブ録画

インスタライブの録画ってだいたい画面キャプチャばっかりなのでダウンロードを試してみる。

まずはm3u8なりmpdなりのアドレス探しから。
やっぱり探すにはpcからが一番ラク。
配信URLは https://www.instagram.com/userID/live なので、Chromeの開発者ツールのNetworkタブを眺める。

HLSではなくMPEG-DASHの模様。
mpdのアドレスの取得方法は、お手軽にselenium + pythonでできそうだ。

<instalive-dl.py>
#-*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities.CHROME
caps["goog:loggingPrefs"] = {"performance": "ALL"}
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--headless')
chargs = ["hide_console", ]
###
batファイルの引数なんやかんや
###
driver = webdriver.Chrome(executable_path=str(chromepath), service_args=chargs,options=options, desired_capabilities=caps)
driver.implicitly_wait(5)
#####
なんやかんやログインして
#####
driver.get(https://www.instagram.com/userID/live)
time.sleep(2)
netLog = driver.get_log("performance")
def process_browser_log_entry(entry):
	response = json.loads(entry['message'])['message']
	return response
events = [process_browser_log_entry(entry) for entry in netLog]
events = [event for event in events if 'Network.response' in event['method']]

url = []
for item in events:
	if "response" in item["params"]:
		if "url" in item["params"]["response"]:
			stream = item["params"]["response"]["url"]
			if re.search(r'/live-dash/dash-hd/', stream):
				url.append(stream)
if len(url) == 0:
	log.info('放送されていません')
	driver.close()
	driver.quit()
	sys.exit()
mpd = url[0]

mpdアドレスをffmpegに投げて終わり。


と思ったら、配信終了後のHTTP 410でループする。ctrl + cで強制的に止めるとmoov atom not foundになってしまい再生不可能。他に色々粘って見たけどうまく行かず。

そこで、他にmpdに対応したツールが無いかと考え、ダメ元でyoutube-dlに投げるも失敗。
次にstreamlinkに投げてみたら、あっさり録画が始まってきちんと止まることが判明。
ということで

####続き
outfile = #適当にファイル名#
cmd = 'streamlink "{0}" best -o "{1}"'.format(mpd,outfile)
subprocess.run(cmd)
driver.close()
driver.quit()
sys.exit()

おわり。

もう少し手間を減らしたいのでbatファイルを作る。

<userID.bat>
@echo off
instalive-dl.py %~n0 myaccount pass
以上。

<参考>

0 件のコメント:

コメントを投稿