NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name YouTube Auto-Like Videos
// @namespace http://userscripts.org/users/23652
// @description Automatically clicks the 'Like' button
// @include http://*.youtube.com/watch*v=*
// @include http://youtube.com/watch*v=*
// @include https://*.youtube.com/watch*v=*
// @include https://youtube.com/watch*v=*
// @copyright JoeSimmons
// @version 1.0.36
// @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html
// @require http://userscripts.org/scripts/source/49700.user.js?name=GM_config
// @require https://raw.github.com/joesimmons/jsl/master/versions/jsl-1.3.0.js
// @require http://userscripts.org/scripts/source/186053.user.js?name=YouTube_Button_Container
//@require http://usocheckup.dune.net/58010.js
// @grant GM_getValue
// @grant GM_log
// @grant GM_openInTab
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// ==/UserScript==
/* CHANGELOG
1.0.36 (12/17/2013)
- added a user-script command for the options
1.0.35 (12/14/2013)
- started using YouTube Button Container
- made code more readable by using JSL and @requires
1.0.34
- added compatibility for Opera & Chrome
*/
(function () {
'use strict';
var t = 0, tMax = 20,
spaceRegex = /([ \t]+)|(\n[ \r\n\r]+\n)/g,
newlineRegex = /\n/g,
uRegex = /\/user\/(\w+)/i,
uRegexS = /[\w ]+/i,
spaces = /\s+/g,
intv, pass, auto_like_list;
function GMCOpen() {
GM_config.open();
}
// click by JoeSimmons
function click(element, type) {
var eventObject = document.createEvent('MouseEvents');
element = typeof element === 'string' ? document.getElementById(element) : element;
type = typeof type === 'string' ? type : 'click';
if (element.isJSL === true) {
element = element[0];
}
if (element) {
eventObject.initMouseEvent(type, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
element.dispatchEvent(eventObject);
}
}
function waitForShare() {
var aboutTab = JSL('//div[@id="watch7-secondary-actions"]//button[@data-trigger-for="action-panel-details"]'),
shareTab = JSL('//div[@id="watch7-secondary-actions"]//button[@data-trigger-for="action-panel-share"]');
// switch back to the 'About' tab after the 'Like' button is pressed
if (shareTab.attribute('class').indexOf('yt-uix-button-toggled') !== -1) {
window.setTimeout(click, 1000, aboutTab);
shareTab.removeEvent('DOMAttrModified', waitForShare);
}
}
function isPressed(e) {
return e.attribute('class').indexOf('yt-uix-button-toggled') !== -1;
}
function doLike() {
var author = JSL('#watch7-user-header a.yt-user-name'),
like = JSL('#watch-like'),
dislike = JSL('#watch-dislike'),
shareTab = JSL('//div[@id="watch7-secondary-actions"]//button[@data-trigger-for="action-panel-share"]'),
likeClass = like.attribute('class'),
authorHref = '',
authorText = '',
usernameHref = '',
usernameText = '';
// check if the author section or like button are present
if (t > tMax) {
return JSL.clearInterval(intv);
} else if (author.exists && like.exists && shareTab.exists) {
authorText = author.text();
authorHref = author.prop('href');
} else {
return;
}
// Figure out the username of the video author
if ( authorHref.match(uRegex) ) {
usernameHref = authorHref.match(uRegex)[1];
}
if ( authorText.match(uRegexS) ) {
usernameText = authorText.match(uRegexS)[0].replace(spaces, '');
}
// try to click "Like"
if ( GM_config.get('auto') === true || usernameHref.match(pass) || usernameText.match(pass) ) {
if ( !isPressed(like) && !isPressed(dislike) ) {
shareTab.addEvent('DOMAttrModified', waitForShare);
window.setTimeout(click, 200, like);
JSL.clearInterval(intv);
}
}
t += 1;
}
// make sure the page is not in a frame
if (window !== window.top) { return; }
if (typeof GM_registerMenuCommand === 'function') {
GM_registerMenuCommand('YouTube Auto-Like Options', GMCOpen);
}
GM_config.init('YouTube Auto-Like Options', {
auto : {
section : ['Main Options'],
label : 'Auto-like ALL videos?',
type : 'checkbox',
'default' : true,
title : 'Enabling this will make you "Like" all videos.'
},
list : {
section : ['Specific Usernames'],
label : 'List the usernames of the users\' videos you want to auto-like.',
type : 'textarea',
cols : 80,
rows : 20,
'default' : 'Write usernames here separated by lines',
title : 'This feature will be enabled if the previous feature is disabled.'
}
});
auto_like_list = GM_config.get('list');
pass = new RegExp('(' + auto_like_list.trim().replace(spaceRegex, '').replace(newlineRegex, '|') + ')', 'i');
// Run a function when the page is fully loaded
JSL.runAt('end', function() {
addButtonToContainer('Auto-Like Options', GMCOpen);
// Try to 'like' each half second for 15 seconds max
intv = JSL.setInterval(doLike, 750);
});
}());