pull/42/head
MillenniumEarl 2020-10-28 11:51:31 +01:00
commit 525e1d6417
6 changed files with 172 additions and 187 deletions

View File

@ -13,7 +13,8 @@ module.exports = Object.freeze({
ONLY_GAMES_THREAD_OPTION: 'select[name="nodes[]"] > option[value="2"]', ONLY_GAMES_THREAD_OPTION: 'select[name="nodes[]"] > option[value="2"]',
PASSWORD_INPUT: 'input[name="password"]', PASSWORD_INPUT: 'input[name="password"]',
SEARCH_BUTTON: "form.block > * button.button--icon--search", SEARCH_BUTTON: "form.block > * button.button--icon--search",
SEARCH_FORM_TEXTBOX: 'input[name="keywords"]', SEARCH_FORM_TEXTBOX: 'input[name="keywords"][type="search"]',
SEARCH_ONLY_GAMES_OPTION: 'select[name="c[nodes][]"] > option[value="1"]',
STATUS_ID_SELECTOR: 'div[id^="btn-prefix_4_"]>span', STATUS_ID_SELECTOR: 'div[id^="btn-prefix_4_"]>span',
THREAD_POSTS: THREAD_POSTS:
"article.message-body:first-child > div.bbWrapper:first-of-type", "article.message-body:first-child > div.bbWrapper:first-of-type",

View File

@ -1,6 +1,6 @@
module.exports = Object.freeze({ module.exports = Object.freeze({
F95_BASE_URL: "https://f95zone.to", F95_BASE_URL: "https://f95zone.to",
F95_SEARCH_URL: "https://f95zone.to/search", F95_SEARCH_URL: "https://f95zone.to/search/?type=post",
F95_LATEST_UPDATES: "https://f95zone.to/latest", F95_LATEST_UPDATES: "https://f95zone.to/latest",
F95_LOGIN_URL: "https://f95zone.to/login", F95_LOGIN_URL: "https://f95zone.to/login",
F95_WATCHED_THREADS: "https://f95zone.to/watched/threads", F95_WATCHED_THREADS: "https://f95zone.to/watched/threads",

View File

@ -25,9 +25,9 @@ module.exports.getGameInfo = async function (browser, url) {
// Verify the correctness of the URL // Verify the correctness of the URL
const exists = await urlHelper.urlExists(url); const exists = await urlHelper.urlExists(url);
if (!exists) throw new URIError(url + " is not a valid URL"); if (!exists) throw new URIError(`${url} is not a valid URL`);
if (!urlHelper.isF95URL(url)) if (!urlHelper.isF95URL(url))
throw new Error(url + " is not a valid F95Zone URL"); throw new Error(`${url} is not a valid F95Zone URL`);
const page = await preparePage(browser); // Set new isolated page const page = await preparePage(browser); // Set new isolated page
await page.setCookie(...shared.cookies); // Set cookies to avoid login await page.setCookie(...shared.cookies); // Set cookies to avoid login
@ -45,7 +45,6 @@ module.exports.getGameInfo = async function (browser, url) {
info = await parsePrefixes(page, info); // Fill status/engines/isMod info = await parsePrefixes(page, info); // Fill status/engines/isMod
const structuredText = await getMainPostStructuredText(page); const structuredText = await getMainPostStructuredText(page);
const overview = getOverview(structuredText, info.isMod); const overview = getOverview(structuredText, info.isMod);
const parsedInfos = parseConversationPage(structuredText); const parsedInfos = parseConversationPage(structuredText);
const previewSource = getGamePreviewSource(page); const previewSource = getGamePreviewSource(page);
const changelog = getLastChangelog(page); const changelog = getLastChangelog(page);
@ -283,10 +282,8 @@ async function getGameTags(page) {
* @returns {Promise<GameInfo>} GameInfo object passed in to which the identified information has been added * @returns {Promise<GameInfo>} GameInfo object passed in to which the identified information has been added
*/ */
async function parsePrefixes(page, info) { async function parsePrefixes(page, info) {
const MOD_PREFIX = "MOD";
// The 'Ongoing' status is not specified, only 'Abandoned'/'OnHold'/'Complete' // The 'Ongoing' status is not specified, only 'Abandoned'/'OnHold'/'Complete'
info.status = "Ongoing"; info.status = "ONGOING";
for (const handle of await page.$$(selectorK.GAME_TITLE_PREFIXES)) { for (const handle of await page.$$(selectorK.GAME_TITLE_PREFIXES)) {
const value = await page.evaluate( const value = await page.evaluate(
/* istanbul ignore next */ /* istanbul ignore next */
@ -298,10 +295,10 @@ async function parsePrefixes(page, info) {
const prefix = value.toUpperCase().replace("[", "").replace("]", "").trim(); const prefix = value.toUpperCase().replace("[", "").replace("]", "").trim();
// Getting infos... // Getting infos...
if (shared.statuses.includes(prefix)) info.status = capitalize(prefix); if (shared.statuses.includes(prefix)) info.status = prefix;
else if (shared.engines.includes(prefix)) info.engine = capitalize(prefix); else if (shared.engines.includes(prefix)) info.engine = prefix;
// This is not a game but a mod // This is not a game but a mod
else if (prefix === MOD_PREFIX) info.isMod = true; else if (prefix === "MOD" || prefix === "CHEAT MOD") info.isMod = true;
} }
return info; return info;
} }
@ -467,11 +464,4 @@ function extractGameHostingData(platform, text) {
return downloadData; return downloadData;
} }
/**
* Capitalize a string
* @param {String} string
*/
function capitalize(string) {
return string.toLowerCase().charAt(0).toUpperCase() + string.slice(1);
}
//#endregion Private methods //#endregion Private methods

View File

@ -18,7 +18,7 @@ const { isF95URL } = require("./url-helper.js");
* @returns {Promise<String[]>} List of URL of possible games obtained from the preliminary research on the F95 portal * @returns {Promise<String[]>} List of URL of possible games obtained from the preliminary research on the F95 portal
*/ */
module.exports.getSearchGameResults = async function (browser, gamename) { module.exports.getSearchGameResults = async function (browser, gamename) {
shared.logger.info("Searching " + gamename + " on F95Zone"); shared.logger.info(`Searching ${gamename} on F95Zone`);
const page = await preparePage(browser); // Set new isolated page const page = await preparePage(browser); // Set new isolated page
await page.setCookie(...shared.cookies); // Set cookies to avoid login await page.setCookie(...shared.cookies); // Set cookies to avoid login
@ -30,11 +30,13 @@ module.exports.getSearchGameResults = async function (browser, gamename) {
await Promise.all([ await Promise.all([
page.waitForSelector(selectorK.SEARCH_FORM_TEXTBOX), page.waitForSelector(selectorK.SEARCH_FORM_TEXTBOX),
page.waitForSelector(selectorK.TITLE_ONLY_CHECKBOX), page.waitForSelector(selectorK.TITLE_ONLY_CHECKBOX),
page.waitForSelector(selectorK.SEARCH_ONLY_GAMES_OPTION),
page.waitForSelector(selectorK.SEARCH_BUTTON), page.waitForSelector(selectorK.SEARCH_BUTTON),
]); ]);
await page.type(selectorK.SEARCH_FORM_TEXTBOX, gamename); // Type the game we desire await page.type(selectorK.SEARCH_FORM_TEXTBOX, gamename); // Type the game we desire
await page.click(selectorK.TITLE_ONLY_CHECKBOX); // Select only the thread with the game in the titles await page.click(selectorK.TITLE_ONLY_CHECKBOX); // Select only the thread with the game in the titles
await page.click(selectorK.SEARCH_ONLY_GAMES_OPTION); // Search only games and mod
await Promise.all([ await Promise.all([
page.click(selectorK.SEARCH_BUTTON), // Execute search page.click(selectorK.SEARCH_BUTTON), // Execute search
page.waitForNavigation({ page.waitForNavigation({
@ -52,7 +54,7 @@ module.exports.getSearchGameResults = async function (browser, gamename) {
const gameUrl = await getOnlyGameThreads(page, element); const gameUrl = await getOnlyGameThreads(page, element);
if (gameUrl !== null) results.push(gameUrl); if (gameUrl !== null) results.push(gameUrl);
} }
shared.logger.info("Find " + results.length + " conversations"); shared.logger.info(`Find ${results.length} conversations`);
await page.close(); // Close the page await page.close(); // Close the page
return results; return results;

View File

@ -382,20 +382,21 @@ TN:
SF:app\scripts\game-scraper.js SF:app\scripts\game-scraper.js
FN:23,(anonymous_0) FN:23,(anonymous_0)
FN:83,(anonymous_1) FN:83,(anonymous_1)
FN:115,getOverview FN:113,cleanFSString
FN:130,getMainPostStructuredText FN:126,getOverview
FN:149,getGameAuthor FN:141,getMainPostStructuredText
FN:173,parseConversationPage FN:160,getGameAuthor
FN:199,getGamePreviewSource FN:184,parseConversationPage
FN:229,getGameTitle FN:210,getGamePreviewSource
FN:250,getGameTags FN:240,getGameTitle
FN:273,parsePrefixes FN:261,getGameTags
FN:303,getLastChangelog FN:284,parsePrefixes
FN:462,capitalize FN:312,getLastChangelog
FNF:12 FNF:12
FNH:12 FNH:12
FNDA:5,(anonymous_0) FNDA:5,(anonymous_0)
FNDA:2,(anonymous_1) FNDA:7,(anonymous_1)
FNDA:7,cleanFSString
FNDA:5,getOverview FNDA:5,getOverview
FNDA:5,getMainPostStructuredText FNDA:5,getMainPostStructuredText
FNDA:5,getGameAuthor FNDA:5,getGameAuthor
@ -405,7 +406,6 @@ FNDA:5,getGameTitle
FNDA:5,getGameTags FNDA:5,getGameTags
FNDA:5,parsePrefixes FNDA:5,parsePrefixes
FNDA:5,getLastChangelog FNDA:5,getLastChangelog
FNDA:5,capitalize
DA:4,1 DA:4,1
DA:5,1 DA:5,1
DA:8,1 DA:8,1
@ -440,123 +440,124 @@ DA:55,5
DA:56,5 DA:56,5
DA:57,5 DA:57,5
DA:58,5 DA:58,5
DA:59,5 DA:61,5
DA:62,5 DA:62,5
DA:63,5 DA:63,5
DA:72,5 DA:72,5
DA:73,5 DA:73,5
DA:74,5 DA:74,5
DA:83,1 DA:83,1
DA:84,2 DA:84,7
DA:85,2 DA:85,7
DA:86,2 DA:86,7
DA:91,2 DA:91,7
DA:96,2 DA:96,7
DA:99,2 DA:99,7
DA:100,2 DA:100,7
DA:101,2 DA:101,7
DA:102,2 DA:102,7
DA:103,2 DA:103,7
DA:118,5 DA:104,7
DA:119,3 DA:114,7
DA:120,5 DA:115,7
DA:132,5 DA:129,5
DA:135,5 DA:130,3
DA:140,5 DA:131,5
DA:143,5
DA:146,5
DA:151,5 DA:151,5
DA:156,5
DA:159,5
DA:162,5 DA:162,5
DA:163,5 DA:167,5
DA:170,5
DA:173,5
DA:174,5 DA:174,5
DA:177,5 DA:185,5
DA:178,5 DA:188,5
DA:179,1161 DA:189,5
DA:182,310 DA:190,1161
DA:183,310 DA:193,310
DA:184,310 DA:194,310
DA:187,310 DA:195,310
DA:190,5 DA:198,310
DA:201,5 DA:201,5
DA:202,5 DA:212,5
DA:204,0 DA:213,5
DA:207,5 DA:215,0
DA:220,5 DA:218,5
DA:231,5 DA:231,5
DA:236,5 DA:242,5
DA:239,5 DA:247,5
DA:240,5 DA:250,5
DA:241,5
DA:251,5 DA:251,5
DA:254,5 DA:252,5
DA:255,46
DA:260,46
DA:262,5 DA:262,5
DA:274,5 DA:265,5
DA:277,5 DA:266,46
DA:278,5 DA:271,46
DA:279,9 DA:273,5
DA:286,9 DA:286,5
DA:289,9 DA:287,5
DA:290,9 DA:288,9
DA:292,4 DA:295,9
DA:294,5 DA:298,9
DA:305,5 DA:299,9
DA:307,5 DA:301,4
DA:308,5 DA:303,5
DA:310,5 DA:314,5
DA:315,5 DA:316,5
DA:318,5 DA:317,5
DA:319,3 DA:319,5
DA:320,5 DA:324,5
DA:321,5 DA:327,5
DA:463,5 DA:328,3
LF:105 DA:329,5
LH:103 DA:330,5
LF:106
LH:104
BRDA:28,0,0,0 BRDA:28,0,0,0
BRDA:28,0,1,5 BRDA:28,0,1,5
BRDA:29,1,0,0 BRDA:29,1,0,0
BRDA:29,1,1,5 BRDA:29,1,1,5
BRDA:58,2,0,2 BRDA:58,2,0,2
BRDA:58,2,1,3 BRDA:58,2,1,3
BRDA:59,3,0,2 BRDA:102,3,0,5
BRDA:59,3,1,3 BRDA:102,3,1,2
BRDA:102,4,0,2 BRDA:129,4,0,2
BRDA:102,4,1,0 BRDA:129,4,1,3
BRDA:118,5,0,2 BRDA:190,5,0,851
BRDA:118,5,1,3 BRDA:190,5,1,310
BRDA:179,6,0,851 BRDA:198,6,0,151
BRDA:179,6,1,310 BRDA:198,6,1,159
BRDA:187,7,0,151 BRDA:231,7,0,5
BRDA:187,7,1,159 BRDA:231,7,1,0
BRDA:220,8,0,5 BRDA:298,8,0,0
BRDA:220,8,1,0 BRDA:298,8,1,9
BRDA:289,9,0,0 BRDA:299,9,0,5
BRDA:289,9,1,9 BRDA:299,9,1,4
BRDA:290,10,0,5 BRDA:301,10,0,2
BRDA:290,10,1,4 BRDA:301,10,1,2
BRDA:292,11,0,2 BRDA:301,11,0,4
BRDA:292,11,1,2 BRDA:301,11,1,2
BRDA:308,12,0,0 BRDA:317,12,0,0
BRDA:308,12,1,5 BRDA:317,12,1,5
BRDA:318,13,0,3 BRDA:327,13,0,3
BRDA:318,13,1,2 BRDA:327,13,1,2
BRDA:320,14,0,1 BRDA:329,14,0,1
BRDA:320,14,1,4 BRDA:329,14,1,4
BRF:30 BRF:30
BRH:24 BRH:25
end_of_record end_of_record
TN: TN:
SF:app\scripts\game-searcher.js SF:app\scripts\game-searcher.js
FN:20,(anonymous_0) FN:20,(anonymous_0)
FN:69,getOnlyGameThreads FN:71,getOnlyGameThreads
FN:89,getMembershipForum FN:91,getMembershipForum
FN:116,getThreadURL FN:118,getThreadURL
FNF:4 FNF:4
FNH:4 FNH:4
FNDA:2,(anonymous_0) FNDA:2,(anonymous_0)
FNDA:12,getOnlyGameThreads FNDA:4,getOnlyGameThreads
FNDA:12,getMembershipForum FNDA:4,getMembershipForum
FNDA:4,getThreadURL FNDA:4,getThreadURL
DA:4,1 DA:4,1
DA:7,1 DA:7,1
@ -570,44 +571,45 @@ DA:23,2
DA:24,2 DA:24,2
DA:25,2 DA:25,2
DA:30,2 DA:30,2
DA:36,2
DA:37,2 DA:37,2
DA:38,2 DA:38,2
DA:46,2 DA:39,2
DA:49,2 DA:40,2
DA:50,2 DA:48,2
DA:51,2 DA:51,2
DA:52,12 DA:52,2
DA:53,12 DA:53,2
DA:55,2 DA:54,4
DA:56,2 DA:55,4
DA:57,2
DA:58,2 DA:58,2
DA:71,12 DA:60,2
DA:72,12 DA:73,4
DA:75,12 DA:74,4
DA:76,12 DA:77,4
DA:79,4 DA:78,4
DA:95,12 DA:81,4
DA:102,12 DA:97,4
DA:103,12 DA:104,4
DA:104,12 DA:105,4
DA:106,12 DA:106,4
DA:117,4 DA:108,4
DA:124,4 DA:119,4
DA:127,0 DA:126,4
DA:128,0 DA:129,0
LF:38 DA:130,0
LH:36 LF:39
BRDA:53,0,0,4 LH:37
BRDA:53,0,1,8 BRDA:55,0,0,4
BRDA:76,1,0,8 BRDA:55,0,1,0
BRDA:76,1,1,4 BRDA:78,1,0,0
BRDA:76,2,0,12 BRDA:78,1,1,4
BRDA:76,2,1,10 BRDA:78,2,0,4
BRDA:124,3,0,4 BRDA:78,2,1,2
BRDA:124,3,1,0 BRDA:126,3,0,4
BRDA:126,3,1,0
BRF:8 BRF:8
BRH:7 BRH:5
end_of_record end_of_record
TN: TN:
SF:app\scripts\puppeteer-helper.js SF:app\scripts\puppeteer-helper.js
@ -617,8 +619,8 @@ FN:45,(anonymous_2)
FNF:3 FNF:3
FNH:3 FNH:3
FNDA:14,(anonymous_0) FNDA:14,(anonymous_0)
FNDA:19,(anonymous_1) FNDA:24,(anonymous_1)
FNDA:2266,(anonymous_2) FNDA:2770,(anonymous_2)
DA:4,1 DA:4,1
DA:7,1 DA:7,1
DA:15,1 DA:15,1
@ -628,23 +630,23 @@ DA:19,0
DA:24,14 DA:24,14
DA:29,14 DA:29,14
DA:39,1 DA:39,1
DA:41,19 DA:41,24
DA:44,19 DA:44,24
DA:45,19 DA:45,24
DA:46,2266 DA:46,2770
DA:47,1391 DA:47,1657
DA:50,1391 DA:50,1657
DA:55,19 DA:55,24
DA:57,19 DA:57,24
DA:59,19 DA:59,24
LF:18 LF:18
LH:17 LH:17
BRDA:18,0,0,0 BRDA:18,0,0,0
BRDA:18,0,1,14 BRDA:18,0,1,14
BRDA:46,1,0,875 BRDA:46,1,0,1113
BRDA:46,1,1,1391 BRDA:46,1,1,1657
BRDA:47,2,0,0 BRDA:47,2,0,0
BRDA:47,2,1,1391 BRDA:47,2,1,1657
BRF:6 BRF:6
BRH:4 BRH:4
end_of_record end_of_record
@ -672,7 +674,7 @@ FNF:18
FNH:15 FNH:15
FNDA:14,(anonymous_0) FNDA:14,(anonymous_0)
FNDA:38,(anonymous_1) FNDA:38,(anonymous_1)
FNDA:36,(anonymous_2) FNDA:41,(anonymous_2)
FNDA:9,(anonymous_3) FNDA:9,(anonymous_3)
FNDA:9,(anonymous_4) FNDA:9,(anonymous_4)
FNDA:0,(anonymous_5) FNDA:0,(anonymous_5)
@ -701,7 +703,7 @@ DA:53,1
DA:58,1 DA:58,1
DA:67,14 DA:67,14
DA:74,38 DA:74,38
DA:81,36 DA:81,41
DA:88,9 DA:88,9
DA:95,9 DA:95,9
DA:102,0 DA:102,0

View File

@ -1,25 +1,15 @@
const { const F95API = require("../app/index.js");
debug,
login,
getGameData,
loadF95BaseData,
getUserData,
logout,
} = require("../app/index.js");
debug(true); F95API.debug(true);
main(); main();
async function main() { async function main() {
const loginResult = await login("MillenniumEarl", "f9vTcRNuvxj4YpK"); const loginResult = await F95API.login("MillenniumEarl", "f9vTcRNuvxj4YpK");
if (loginResult.success) { if (loginResult.success) {
await loadF95BaseData(); await F95API.loadF95BaseData();
const gameData = await getGameData("kingdom of deception", false); const gameData = await F95API.getGameData("a struggle with sin", false);
console.log(gameData); console.log(gameData);
// let userData = await getUserData();
// console.log(userData);
} }
logout(); F95API.logout();
} }