Skip to content

Commit

Permalink
v2.0
Browse files Browse the repository at this point in the history
- resolve #1
- resolve #2
  • Loading branch information
gaerae committed Oct 18, 2020
1 parent d398b63 commit 17b0bfc
Show file tree
Hide file tree
Showing 3 changed files with 178 additions and 228 deletions.
318 changes: 154 additions & 164 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,170 +1,160 @@
FacebookContestWinner = {
autoWinner: [],
// List all commented users
comment(number = 5, pickUsers = [], type = null) {
let users = {};
let pickWinners = {};
document.querySelectorAll("ul[class=_7791] > li")
.forEach((element, index) => {
let user = element.querySelector("div[class=_72vr] a");
let userId = this.parseURL(user.dataset.hovercard);
let tempUrl = user.href.split("?")[0];
users[index] = {
name: user.textContent,
id: userId,
url: (tempUrl.indexOf("profile.php") === -1) ? tempUrl : `${tempUrl}?id=${userId}`,
pic: element.querySelector("img").src,
content: element.querySelector("._3l3x").textContent,
};

if (pickUsers.indexOf(`${users[index].id}`) !== -1) {
pickWinners[`${users[index].id}`] = users[index];
}
// console.log(`%c ${users[index].name}(${users[index].id}): ${users[index].url}`, "color: #ffffff; background: #db178a; border: 1px solid #ae0c6b; border-radius: 3px;");
});
this.pick(users, number, pickWinners, type);
},

// List all shared users
share(number = 5, pickUsers = [], type = null) {
let users = {};
let pickWinners = {};
document.querySelectorAll("div[id=repost_view_dialog] div[role=article] > div[id^=u_]")
.forEach((element, index) => {
let userProfile = element.querySelector("span[class^=fwb] > a[data-hovercard]");
let userContent = element.querySelector("div > .userContent > p");
let userId = this.parseURL(userProfile.dataset.hovercard);
let tempUrl = userProfile.href.split("?")[0];
users[index] = {
name: userProfile.textContent,
id: userId,
url: (tempUrl.indexOf("profile.php") === -1) ? tempUrl : `${tempUrl}?id=${userId}`,
pic: '', //element.querySelector("img[role=img]").src,
content: (userContent) ? userContent.textContent : "",
};

if (pickUsers.indexOf(`${users[index].id}`) !== -1) {
pickWinners[`${users[index].id}`] = users[index];
}
// console.log(`%c ${users[index].name}(${users[index].id}): ${users[index].url}`, "color: #ffffff; background: #db178a; border: 1px solid #ae0c6b; border-radius: 3px;");
});
this.pick(users, number, pickWinners, type);
},

// Pick one or multiple winners
pick(users, number = 5, pickWinners = {}, type = null) {
const userLength = Object.keys(users).length;
const pickWinnerLength = Object.keys(pickWinners).length;
let winners = {};
let winnerIndex = 0;
let winnerIDs = [];
if (type == 'auto') {
// clear();
console.log("%c 📑 Final Candidate List!", "font-weight: bold; font-size: 20px; color: #db178a;");
} else {
console.log("%c 🎉 Winners!", "font-weight: bold; font-size: 50px; color: red; text-shadow: 3px 3px 0 rgb(217,31,38) , 6px 6px 0 rgb(226,91,14) , 9px 9px 0 rgb(245,221,8) , 12px 12px 0 rgb(5,148,68) , 15px 15px 0 rgb(2,135,206) , 18px 18px 0 rgb(4,77,145) , 21px 21px 0 rgb(42,21,113)");
}
if (pickWinnerLength > 0) {
for (let pickKey in pickWinners) {
if (winnerIndex == number) {
continue;
}
console.log(`%c ${pickWinners[pickKey].name} ${pickWinners[pickKey].url}`, "font-weight: bold; font-size: 15px; color: #ffffff; background: #1d69db; border: 1px solid #0f4ba6; border-radius: 3px;");
winners[pickWinners[pickKey].id] = pickWinners[pickKey];
winnerIDs.push(pickWinners[pickKey].id);
winnerIndex++;
(function (){
/**
* Random winner picker
*/
function winner(users, numberOfWinners) {
// Quick pick winning user numbers array
let userWinning = [];
let randomIndex = 0;
for (let i = 0; i < numberOfWinners; i++) {
randomIndex = Math.floor(Math.random() * users.length);

if (users[randomIndex].name != "" && users[randomIndex].name != null) {
userWinning[i] = users[randomIndex];
}
} else {
do {
if (userLength < number) {
number = userLength;
}
// Gets random numbers and removes them after use
users.splice(randomIndex, 1);
}

let winUser = users[this.getRandomIntInclusive(0, userLength - 1)];
if (winners[winUser.id] === undefined) {
console.log(`%c ${winUser.name} ${winUser.url}`, "font-weight: bold; font-size: 15px; color: #ffffff; background: #1d69db; border: 1px solid #0f4ba6; border-radius: 3px;");
winners[winUser.id] = winUser;
winnerIDs.push(winUser.id);
winnerIndex++;
}
} while (winnerIndex < number);
// Header Title
console.info("%c🎉 Winner!", "font-weight: bold; font-size: 50px; padding: 20px; color: red; text-shadow: 3px 3px 0 rgb(217,31,38) , 6px 6px 0 rgb(226,91,14) , 9px 9px 0 rgb(245,221,8) , 12px 12px 0 rgb(5,148,68) , 15px 15px 0 rgb(2,135,206) , 18px 18px 0 rgb(4,77,145) , 21px 21px 0 rgb(42,21,113)");


// Summary Information
let textUserWinning = "";
userWinning.forEach((element) => {
console.info(`%c %c ${element.name} %c ${element.id} `, `background:url(${element.pic}) no-repeat; backdround-size: contain; padding: 15px; font-size: 20px; `, "padding: 15px; font-weight: bold; font-size: 20px; color: #ffffff; background: #1d69db", "padding: 15px; font-size: 20px; color: #1d69db; background: #ffffff;");
textUserWinning += `● ${element.name} (${element.id})\n`;
});

// Detail Information
console.info("%c", "padding: 10px;");
console.groupCollapsed(`%c ⭐ ${Object.keys(userWinning).length} Winners and Results ⭐ `, "font-weight: bold; font-size: 15px; color: #FFC83D; background: #000000;padding: 10px;");
console.info("Help 🙋 https://github.com/gaerae/facebook-contest-winner");

console.group("%c Winners ", "color: #ffffff; background: #db178a; border: 1px solid #ae0c6b; border-radius: 3px;");
console.table(userWinning);
console.info(textUserWinning);
console.groupEnd();

console.group("%c excluding winners ", "color: #ffffff; background: #db178a; border: 1px solid #ae0c6b; border-radius: 3px;");
console.info(users);
console.groupEnd();
console.groupEnd();
}

/**
* List Analysis
*/
function listAnalysis(type, numberOfWinners) {
let listElement = {
comment : "div[data-visualcompletion=ignore-dynamic] div[role=article]",
share : "div[role=dialog] div.sjgh65i0:not([role=progressbar])",
like : "div[data-visualcompletion=ignore-dynamic] div.ue3kfks5.pw54ja7n.uo3d90p7.l82x9zwi.a8c37x1j",
}

if (type == 'auto') {
this.autoWinner = winnerIDs;
} else {
console.groupCollapsed(`%c ⭐ ${Object.keys(winners).length} Winners and Results ⭐ `, "color: #ffffff; background: #000000; border: 1px solid #000000;");
console.log("Help 🙋 https://github.com/gaerae/facebook-contest-winner");
console.group("%c Winner Details ", "color: #ffffff; background: #db178a; border: 1px solid #ae0c6b; border-radius: 3px;");
console.table(winners);
console.groupEnd();
console.group("%c Optional Parameter ", "color: #ffffff; background: #db178a; border: 1px solid #ae0c6b; border-radius: 3px;");
console.log(winnerIDs);
console.groupEnd();
console.groupEnd();
let tempTypes = type.split("_");
let tempUsers = [];
let tempUserKeys = [];
let users = [];

// Type
tempTypes.forEach((typeKey, typeIndex) => {
tempUsers[typeIndex] = [];
tempUserKeys[typeIndex] = [];

// DOM Selector
document.querySelectorAll(listElement[typeKey]).forEach((element, index) => {
let user = userAnalysis(typeKey, element);
tempUsers[typeIndex][index] = user;
tempUserKeys[typeIndex][index] = user.id;

// Duplicate User
if (typeIndex === 1 && tempUserKeys[typeIndex-1].indexOf(user.id) !== -1) {
users.push(user);
}
});
});

// winner picker
users = (users.length > 0) ? users : tempUsers[0];

// Debug Information
clear();
console.groupCollapsed("%c⭐ Facebook Contest Winner ⭐ ", "font-weight: bold; font-size: 15px; color: #FFC83D; background: #000000;padding: 10px;");
console.info("tempUsers", tempUsers);
console.info("users", users);
console.groupEnd();

winner(users, numberOfWinners)
}

/**
* User Analysis
*/
function userAnalysis(type, element) {
let user = {};
let tempElement = {};
// user.id
tempElement = element.querySelector("a[role=link]");
tempElement = tempElement ? tempElement.href : "";
user.id = tempElement
.split("comment_id")[0]
.split("__cft__")[0]
.replace(/https:\/\/www\.facebook\.com\//, "")
.replace(/profile.php\?id=/, "")
.replace(/[?&]/g, "")
.replace(/\/$/, "");

// user.name
tempElement = {};
switch (type) {
case "comment":
case "share":
tempElement = element.querySelector("a[role=link] span");
user.name = tempElement ? tempElement.textContent : "";
break;
case "like":
tempElement = element.querySelector("a[role=link]");
user.name = tempElement ? tempElement.getAttribute("aria-label") : "";
break;
default:
user.name = "";
break;
}
},

// parse a url
parseURL(url = "") {
let tempParsing = [],
tempSplit, tempUrls = url.slice(url.indexOf("?") + 1).split("&");
for (let i = 0; i < tempUrls.length; i++) {
tempSplit = tempUrls[i].split("=");
tempParsing[tempSplit[0]] = tempSplit[1];

// user.text
tempElement = {};
switch (type) {
case "comment":
tempElement = element.querySelector("div.ecm0bbzt.e5nlhep0.a8c37x1j");
user.text = tempElement ? tempElement.textContent : "";
break;
case "share":
tempElement = element.querySelector("div[id=jsc_c_v]");
user.text = tempElement ? tempElement.textContent : "";
break;
default:
user.text = "";
break;
}
return (tempParsing["id"]) ? tempParsing["id"] : "";
},

// Getting a random integer between two values, inclusive
getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
},

// Automatically view all comments
viewAllComments() {
let pager = 0;
let scroll = setInterval(() => {
let tempPager = document.querySelector('a[class=UFIPagerLink]');
if (tempPager) {
tempPager.click();
pager++;
console.log(`a ${pager} pager.`);
} else {
clearInterval(scroll);
console.log("Execution finished.");
}
}, 2000);
},

// Automatically view all shares
viewAllShares() {
let pageY = 0;
let scroll = setInterval(() => {
window.scrollBy(0, 1000);
let currentPageY = window.pageYOffset;
if (pageY !== currentPageY) {
pageY = currentPageY;
console.log(`pageYOffset: ${pageY}`);
} else {
clearInterval(scroll);
console.log("Execution finished.");
}
}, 2000);
},

// Automatically winners
auto(number = 5) {
this.share(number + 5, [], 'auto');
this.comment(number, this.autoWinner, null);
},
};

// Usage
// FacebookContestWinner.auto(5);
// FacebookContestWinner.comment(5);
// FacebookContestWinner.share(5);
// FacebookContestWinner.viewAllComments();
// FacebookContestWinner.viewAllShares();

// user.pic
tempElement = {};
tempElement = element.querySelector("image");
user.pic = tempElement ? tempElement.getAttributeNS('http://www.w3.org/1999/xlink', 'href') : "";

return user;
}

/**
* FacebookContestWinner
*/
fcw = {
comment : (numberOfWinners) => {listAnalysis("comment", numberOfWinners)},
share : (numberOfWinners) => {listAnalysis("share", numberOfWinners)},
like : (numberOfWinners) => {listAnalysis("like", numberOfWinners)},
share_comment : (numberOfWinners) => {listAnalysis("share_comment", numberOfWinners)},
like_comment : (numberOfWinners) => {listAnalysis("like_comment", numberOfWinners)},
}
})();
44 changes: 12 additions & 32 deletions readme-en.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,46 +17,26 @@ A easily and quickly way to pick a winner for Facebook timeline promotion.

## Usage

#### 🎉 Pick a Winner from Comment
#### 🎉 Pick a Winner
An example is the number of 3 winners

Example: [Facebook Comment](https://www.facebook.com/zuck/posts/10105044271137001)

```javascript
// Number of winners
FacebookContestWinner.comment(3);
// winners in the comment
fcw.comment(3);

// Designated winners is Optional Parameter
FacebookContestWinner.comment(3, [123, 456, 789]);
```

#### 🎉 Pick a Winner from Share

Example: [Facebook Share](https://www.facebook.com/shares/view?id=10105044271137001)

```javascript
// Number of winners
FacebookContestWinner.share(3);

// Designated winners is Optional Parameter
FacebookContestWinner.share(3, [123, 456, 789]);
```
// winners in the share
fcw.share(3);

#### 📜 Automatically view all comments (Optional)
Please use it on the comment page.
// winners in the like
fcw.like(3);

Example: [Facebook Comment](https://www.facebook.com/zuck/posts/10105044271137001)

```javascript
FacebookContestWinner.viewAllComments();
```
// winners who both shared and commented
fcw.share_comment(3);

#### 📜 Automatically view all shares (Optional)
Please use it on the share page.

Example: [Facebook Share](https://www.facebook.com/shares/view?id=10105044271137001)

```javascript
FacebookContestWinner.viewAllShares();
// winners who both liked and commented
fcw.like_comment(3);
```

## Screen
Expand Down
Loading

0 comments on commit 17b0bfc

Please sign in to comment.