Menu
Portfolio
Blog
Snippets
Login
Confirm
exit_to_app
Close
Entries
library_add
Utility(Event,Mouse): Log Movement X,Y
delete
Utility(txt): Basic Sentence Generator
delete
Utility(Event,Keyboard): Logger
delete
Utility(txt): Expanded Phrase Generator
delete
Scrape(General|Multi): Paginated Crawler
delete
Scrape(Sunbiz|Multi): Get Biz's By Zip
delete
Utility(Time): Test Load Speed
delete
Scrape(General|Single|NLP): Get Keyword Stats
delete
Scrape(General|Single): Get Text Near Links
delete
Utility(Event|Mouse): Press Down,Up, & Dragend
delete
Utility(Number): Between Range
delete
Utility(Event|Window): On Resize
delete
Scrape(Youtube|Single): Crawl Channel Videos
delete
Scrape(General|Multi): Tiny Link Crawler
delete
Utility(Time): Day of Week Report
delete
Utility(Number): Aspect Ratio Size Pairs
delete
Utility(Data): Sort Object Properties
delete
Scrape(General|Single): RiTa Sentences & Words
delete
Scrape(General|Single): Investigate Element Layers
delete
Scrape(NLP|Single): Using Compromise Plugins
delete
Utility(General): Remote Script Loader
delete
Scrape(General|Single|NLP): Compromise RiTa D3
delete
Scrape(General|Multi|Node): Grouped Node Crawler
delete
Scrape(Amazon|Multi): Crawl Product SERPs
delete
Scrape(Amazon|Multi): Get Paginated Brands
delete
Utility (Data): Download JSON in Browser
delete
Utility (Data): JSON AutoTypes
delete
Scrape(YouTube|Single): Video Page
delete
Utility (Text): Make Page Editable
delete
Utility (Text): Article Editor
delete
Scrape(General|Single|Text): Get Text On Click
delete
Utility (File): DnD File Parser (CSV,JSON,TXT)
delete
Scrape(General|Single): Get Links (Examples)
delete
Scrape(General|Single|Text): Get Sentences by Tag
delete
Utility (File): JSON to CSV via D3.js
delete
Scrape(General|Single): Auto Parse by Content Type
delete
Scrape(General|Single): Get Paragraphs & Sentences
delete
Scrape(Amazon|Multi): Get Reviews by ASIN
delete
Scrape(General|Single): Download Images on Page
delete
Utility(Event,Form): Custom Submit Function
delete
Utility (Fetch): Basic API Post Request
delete
Utility (Event,Form,Fetch): Form Data to API
delete
Utility (Time): Async Delay
delete
Utility (Time): Async Repeat Every N Secs
delete
Scrape(coj): Crawl Property SERPs
delete
Utility (Data): Promise Chain
delete
Utility (Fetch): Examples - JSON,Text,HTML
delete
Scrape(Amazon|Single): Product Review NLP
delete
Utility (Nodejs): Streaming Collections
delete
Scrape(Rate My Professor|Multi): Crawl Prof SERPs
delete
Utility (Time): JS Timer
delete
Utility (Text): Proper Case
delete
Scrape(Thingiverse API): Get Things via Search API
delete
Scrape(General|Single|Node): Get Node Attributes
delete
Scrape(General|Single|Node): Node Attributes + Text
delete
Scrape(Thesaurus): Get Words from SERPs
delete
Scrape(Walmart): Crawl Product SERPs
delete
Scrape(free3d): Crawl 3D Model SERPs
delete
Scrape(Aliexpress|Single): Get Products From SERP
delete
Scrape(simplify3d): Crawl Post SERPs
delete
Scrape(Twitter): Crawl Post Feed (infinite scroll)
delete
Scrape(DDuckGo|Single): Get Links from SERP
delete
Scrape(General|Single): Get Tokens String Distance
delete
Scrape(General|Single): Content Report
delete
Scrape(General|Single|Node): Node Recon (CSV)
delete
Utility (File): D3 JSON to CSV
delete
Scrape(coj|Multi): Crawl Property SERPs
delete
Scrape(coj|Single): sidenote
delete
Scrape(General|Single): Recursive Node Crawler
delete
Utility (Event,Window): Scroll to Root ScrollHeight
delete
Scrape(Indeed|Multi): Crawl Job SERPs
delete
Scrape(Thingiverse API): Get Things By Id
delete
Scrape(Thingiverse): Crawl Things by Category
delete
Scrape(Thingiverse API): Get Thing Batches by Id via DnD
delete
Scrape(YouTube|Single): Get Video Playlist
delete
Utility (Data): Join Thing Metrics & Meta
delete
Utility(Data): Get Nested Array Lengths
delete
Utility (Twitter): Hide Followed Profiles
delete
Utility (Time): YYYY-MM-DD HH:MM:SS
delete
Scrape(Thangs|Multi): Crawl 3D Model SERPs
delete
Scrape(PrusaPrints,Multi): Get Prints
delete
Scrape(Reddit,Single): Get Posts
delete
Userscript(Youtube): Scrape Channel Videos
delete
Userscript(Youtube): Tab Manager
delete
Scrape(Sunbiz|Multi): Biz Details
delete
Utility(Data):DnD View Types
delete
Scrape(General|Single|Node): Select Nodes by Attr
delete
Scrape(Aliexpress|Multi) Get Products via API
delete
Utility(Text): Strip Web Page CSS, Script, Events, Media
delete
Scrape(Youtube|Single) Get Subs
delete
Scrape(General|Single): SelectAll ReduceByProp
delete
Scrape(General|Single): SelectAll ReduceMultiProps
delete
Scrape(General|Multi): Tiny Link Crawler + Delay & Node Reports
delete
Scrape(P5|Multi): Get Examples
delete
Scrape(LinkedIn|Single): Find New Connections
delete
UserScript(linkedIn|Single) Get Jobs
delete
Utility (Time): Date From Days Ago
delete
Utility(General|Single) Keep Scrolling
delete
Scrape(YouTube) Videos From Search
delete
Utility(General|Single): getOffset
delete
Utility(Event,Form): Get Data On Form Input
delete
Utility(Event,Element): ResizeObserver
delete
COCO-SSD Object Categories
delete
Scrape(Wikipedia|Multi): What Links Here?
delete
Scrape(DDuckGo|Single): Download Images
delete
Scrape(General|Single|NLP): Compromise nGram
delete
Save Snippet
View Snippet
// ==UserScript== // @name Tab Drone // @version 0.1 // @include https://www.youtube.com/watch?v=*&tab=1* // @grant GM_openInTab // @grant unsafeWindow // @grant window.close // @grant window.focus // @grant GM_addValueChangeListener // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_listValues // @run-at document-end // ==/UserScript== (() => { var options = { scripts: ["https://d3js.org/d3.v6.min.js"] } var run = async () => { var delay = ms => new Promise(r => setTimeout(r, ms)) function downloadCSV(data) { var csvData = new Blob([d3.csvFormat([data])], { type: 'text/csv;charset=utf-8;' }); var link = document.createElement('a'); link.href = window.URL.createObjectURL(csvData); link.setAttribute('download', channelName + ".csv"); document.body.appendChild(link); link.click(); document.body.removeChild(link); window.close(); }; function treatAsUTC(date) { var result = new Date(date); result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); return result; } function daysBetween(startDate, endDate) { var millisecondsPerDay = 24 * 60 * 60 * 1000; return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay; } await delay(1800); window.scrollTo(0,document.querySelector(":root").scrollHeight*0.12); await delay(1600); window.scrollTo(0,document.querySelector(":root").scrollHeight*0.18); document.querySelector("video").pause(); await delay(2000); window.scrollTo(0,document.querySelector(":root").scrollHeight*0.24); await delay(2500); var toNum = (s) => { return s.indexOf("K") > -1 ? +(s.replace("K",""))*1000 : s.indexOf("M") > -1 ? +(s.replace("M",""))*1000000 : isNaN(+s) ? 0 : +s; } try{ var info = [...document.querySelectorAll("#info yt-formatted-string")].reduce((arr,el) => { el.innerText ? arr.push(el.innerText) : null; return arr; },[]).slice(0,4); document.querySelector("video").pause(); var channelName = document.querySelector("#container.ytd-channel-name a"); channelName = channelName ? channelName.innerText.replace(/[\s\n\t\r]+/gim," ").trim() : ""; var description = document.querySelector("#description"); description = description ? description.innerText : ""; var subscribers = [...document.querySelectorAll("#owner-sub-count")].map(el => el.innerText)[0].split(" ")[0]; var jsData = JSON.parse(ytplayer.config.args.player_response).microformat.playerMicroformatRenderer; var category = jsData.category; var lengthSeconds = +jsData.lengthSeconds; var title = jsData.title.simpleText; var publishDate = jsData.publishDate; var isFamilySafe = jsData.isFamilySafe; var embedURL = jsData.embed.iframeUrl; var height = jsData.embed.height; var width = jsData.embed.width; var channel = "https://www.youtube.com/channel/"+ jsData.externalChannelId; var uploaded = new Date(publishDate); var uploadedFormatted = publishDate; var uploadYear = uploaded.getFullYear(); var uploadMonth = uploaded.getMonth()+1; var uploadDate = uploaded.getDate(); var uploadDay = uploaded.getDay()+1; var obj = { title: info[0], category, lengthSeconds, uploaded:uploadedFormatted, uploadYear, uploadMonth, uploadDate, uploadDay, description, channelName, channelURL:channel, subscribers:toNum(subscribers), category, width, height, embedURL, isFamilySafe } info = document.querySelector("ytd-video-primary-info-renderer"); info = info ? info.__data.data : {error:"Error"}; var data = { published: new Date(info.dateText.simpleText).toISOString().slice(0,10), views:+(info.viewCount.videoViewCountRenderer.viewCount.simpleText.replace(/[, a-z]/gim,"")) || "" }; var sent = info.sentimentBar.sentimentBarRenderer.tooltip; sent = sent ? sent.split(" / ").map(s => s.replace(/,/gim,"")) : {error:"error"}; data.likes = +sent[0] || ""; data.dislikes = +sent[1] || ""; data.url = document.URL; var comments = () => document.querySelector(".count-text.style-scope.ytd-comments-header-renderer"); if(!comments()){ await run(); }else{ data.comments = comments() ? +(comments().innerText.replace(/\D/gim,"")) : comments(); data.snapshotDate = new Date().toISOString().slice(0,10); data.ageDays = daysBetween(data.published,data.snapshotDate); data.ageYears = Math.round(data.ageDays/365*1000)/1000; data.ageMonths = Math.round(data.ageDays/30*1000)/1000; data.viewsPerDay = data.views / data.ageDays; data.viewsPerMonth = data.views / data.ageMonths; data.likeRatio = Math.round(data.likes/ (data.likes + data.dislikes)*1000)/1000; downloadCSV({...data, ...obj}); } }catch(e){window.close();} }; const loadScripts = ({scripts}) => { console.log(`Loading External Scripts`); var scriptCountdown = scripts.length; var loadScript = (url) => { var scriptsLoaded = () => scriptCountdown == 0 ? run() : null; var imported = document.createElement('script'); imported.src = url; imported.addEventListener("load", () => { scriptCountdown--; scriptsLoaded(); }); document.head.appendChild(imported); } scripts.forEach(loadScript) } window.addEventListener('DOMContentLoaded', (event) => { loadScripts(options); }); })();