from selenium.webdriver.common.by import By import undetected_chromedriver as uc import requests import base64 import re import os def format_url(url): clean_url = re.sub(r'%[0-9A-F]{2}', '', url) return clean_url def encode_offset(offset_num): offset_base64 = str(offset_num).encode('utf-8') offset_base64 = base64.b64encode(offset_base64).decode('utf-8') return offset_base64 def get_clips(username): url = 'https://gql.twitch.tv/gql' offset_num = 20 offset_base64 = encode_offset(offset_num) user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' headers = { 'client-id': 'kimne78kx3ncx6brgo4mv6wki5h1ko', 'Content-Type': 'text/plain;charset=UTF-8', 'User-Agent': user_agent } data = { "operationName":"ClipsCards__User", "variables":{"login":username,"limit":100,}, "extensions":{"persistedQuery":{"version":1,"sha256Hash":"4eb8f85fc41a36c481d809e8e99b2a32127fdb7647c336d27743ec4a88c4ea44"}} } response = requests.post(url, headers=headers, json=data) clips = response.json() clips = clips['data']['user']['clips']['edges'] cleaned_clips = parse_clips(clips) return cleaned_clips def parse_clips(clips): """ clips is a list of dictionaries """ cleaned_clips = [] for clip in clips: clip = clip['node'] clip_id = clip['id'] clip_url = clip['url'] clip_title = clip['title'] clip_view_count = clip['viewCount'] clip_duration = clip['durationSeconds'] cleaned_clip = { 'id': clip_id, 'url': clip_url, 'title': clip_title, 'views': clip_view_count, 'duration': clip_duration } cleaned_clips.append(cleaned_clip) return cleaned_clips def get_video_url(video_url, driver): driver.get(video_url) # Get the video element video = driver.find_element(By.TAG_NAME, 'video') # Get the video source video_src = video.get_attribute('src') return video_src def download_video(video_url, filepath): if os.path.exists(filepath): return filepath video = requests.get(video_url) # Download in chunks with open(filepath, 'wb') as f: for chunk in video.iter_content(chunk_size=1024): f.write(chunk) return filepath # Set up an undetected Chrome driver in headless mode opts = uc.ChromeOptions() opts.add_argument("--headless") opts.add_argument("--window-size=1920,1080") driver = uc.Chrome(use_subprocess=True, options=opts) username = 'didicandy666' clips = get_clips(username) for clip in clips: clip_url = clip['clip_url'] filename = f"{clip['id']}.mp4" filepath = os.path.join('clips', filename) if os.path.exists(filepath): print(f"Already downloaded {filename}") continue video_url = get_video_url(clip_url, driver) download_video(video_url, filepath) print(f"Downloaded {filename}")