protected void Page_Load(object sender, EventArgs e) { if (Context.User.Identity.GetUserId() != "190d22ec-44a8-4bf4-9579-0365a6b5af3e") { Response.Redirect("/Publib"); return; } string CONSOLE; string qs = ""; try { qs = Request.QueryString["c"]; CONSOLE = qs; } catch (Exception) { CONSOLE = "GBC"; return; } HtmlDocument basepage = new HtmlAgilityPack.HtmlDocument(); WebClient cli = new WebClient(); cli.Encoding = System.Text.Encoding.UTF8; // Atenção ao encoding! if (CONSOLE.Equals("NES")) { basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Nintendo_Entertainment_System_games")); // Seleção de consola } else if (CONSOLE.Equals("GB")) { basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Game_Boy_games")); } else if (CONSOLE.Equals("GBC")) { basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Game_Boy_Color_games")); } else if (CONSOLE.Equals("GBA")) { basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Game_Boy_Advance_games")); } else if (CONSOLE.Equals("SMS")) { basepage.LoadHtml(cli.DownloadString("http://segaretro.org/List_of_Master_System_games")); } int count = 0; List <string> gametitles = new List <string>(); if (CONSOLE.Equals("NES") || CONSOLE.Equals("GBC") || CONSOLE.Equals("GB") || CONSOLE.Equals("GBA")) // Se for selecionada uma consola da nintendo, então utilizar a fonte nintendo.wikia.com { foreach (HtmlNode game_table in basepage.DocumentNode.SelectNodes("//table[@class='wikitable sortable']/tr")) // Percorrer todas as linhas das tabelas { HtmlNodeCollection nodes = game_table.ChildNodes; string gametitle = HttpUtility.HtmlDecode(nodes[1].InnerText); System.Diagnostics.Debug.WriteLine(gametitle); string gameurl = ""; int gameurl_len = 0; Boolean updated = false; HtmlAttributeCollection attribs = (nodes[1].ChildNodes)[0].Attributes; foreach (HtmlAttribute attrib in attribs) { if (attrib.Name.Equals("href")) { gameurl = attrib.Value; gameurl_len = gameurl.Length; break; } } if (gameurl_len > 8 && gameurl.Substring(gameurl_len - 9).Equals("redlink=1")) { continue; // Ignorar se se tratar de um redlink (página não existente na wiki) } if (gameurl.Equals("")) { continue; } if (gametitles.Contains(gametitle.Replace('é', 'e'))) { continue; } gametitles.Add(gametitle.Replace('é', 'e')); List <string> genres = new List <string>(); try { genres = fetchGenre(gameurl, "nintendo"); // Obter o género updated = true; } catch (Exception) { } if (!updated) // Caso não tenha sido possível, então iremos alterar ligeiramente o URL { try { if (CONSOLE.Equals("NES")) { genres = fetchGenre(gameurl + "_(NES)", "nintendo"); gameurl = gameurl + "_(NES)"; } else if (CONSOLE.Equals("GBC")) { genres = fetchGenre(gameurl + "_(GBC)", "nintendo"); gameurl = gameurl + "_(GBC)"; } else if (CONSOLE.Equals("GB")) { genres = fetchGenre(gameurl + "_(GB)", "nintendo"); gameurl = gameurl + "_(GB)"; } else if (CONSOLE.Equals("GBA")) { genres = fetchGenre(gameurl + "_(GBA)", "nintendo"); gameurl = gameurl + "_(GBA)"; } updated = true; } catch (Exception) { } } if (!updated) // Caso não tenha sido possível, então iremos alterar novamente o URL { try { if (CONSOLE.Equals("NES")) { genres = fetchGenre(gameurl + "_(Famicom)", "nintendo"); gameurl = gameurl + "_(Famicom)"; } else if (CONSOLE.Equals("GB")) { genres = fetchGenre(gameurl + "_(Game_Boy)", "nintendo"); gameurl = gameurl + "_(Game_Boy)"; } else if (CONSOLE.Equals("GBC")) { genres = fetchGenre(gameurl + "_(Game_Boy_Color)", "nintendo"); gameurl = gameurl + "_(Game_Boy_Color)"; } else if (CONSOLE.Equals("GBA")) { genres = fetchGenre(gameurl + "_(Game_Boy_Advance)", "nintendo"); gameurl = gameurl + "_(Game_Boy_Advance)"; } updated = true; } catch (Exception) { } } if (!updated) // e novamente { try { genres = fetchGenre(gameurl + "_(video_game)", "nintendo"); gameurl = gameurl + "_(video_game)"; updated = true; } catch (Exception) { } } if (!updated) { try { genres = fetchGenre(gameurl + "_(game)", "nintendo"); gameurl = gameurl + "_(game)"; updated = true; } catch (Exception) { } } String genrestring; if (!updated) { continue; // Se não tiver sido encontrada informação, passar para o próximo elemento da tabela. } else if (genres.Count == 1 && genres[0].Equals("") || (genres.Count == 0 && CONSOLE.Equals("GB"))) { genrestring = "unavailable"; } else { genrestring = ""; foreach (string g in genres) { genrestring += (g + " & "); } genrestring = genrestring.Remove(genrestring.Length - 3); } gametitle = fixGameTitle(gametitle); if (CONSOLE.Equals("NES")) // Lista de jogos da NES cujo formato dos metadados não respeita o regular { if (gameurl.Equals("/wiki/Mother") || gameurl.Equals("/wiki/Dark_Lord") || gameurl.Equals("/wiki/Tecmo_Super_Bowl") || gameurl.Equals("/wiki/DuckTales_2") || gameurl.Equals("/wiki/Monster_Party") || gameurl.Equals("/wiki/Bigfoot") || gameurl.Equals("/wiki/Snake%27s_Revenge") || gameurl.Equals("/wiki/The_Simpsons:_Bart_vs._the_Space_Mutants") || gameurl.Equals("/wiki/Blackjack") ) { continue; } } else if (CONSOLE.Equals("GB")) // Lista de jogos de Gameboy cujo formato dos metadados não respeita o regular { if (gameurl.Equals("/wiki/Tetris_(Game_Boy)") || gameurl.Equals("/wiki/Game_Boy_Camera") || gameurl.Equals("/wiki/Who_Framed_Roger_Rabbit") || gameurl.Equals("/wiki/Exodus:_Journey_to_the_Promised_Land") || gameurl.Equals("/wiki/Star_Trek:_25th_Anniversary") || gameurl.Equals("/wiki/Swamp_Thing") || gameurl.Equals("/wiki/Disney%27s_The_Little_Mermaid") || gameurl.Equals("/wiki/Robin_Hood:_Prince_of_Thieves") || gameurl.Equals("/wiki/Top_Rank_Tennis") || gameurl.Equals("/wiki/Earthworm_Jim_(handheld)") || gameurl.Equals("/wiki/NHL_Hockey_%2795") || gameurl.Equals("/wiki/Super_Star_Wars:_Return_of_the_Jedi") || gameurl.Equals("/wiki/NHL_96_(Game_Boy)") || gameurl.Equals("/wiki/Pinocchio") || gameurl.Equals("/wiki/Popeye") || gameurl.Equals("/wiki/Hatris") || gameurl.Equals("/wiki/R-Type") || gameurl.Equals("/wiki/World_Ice_Hockey") || gameurl.Equals("/wiki/Spy_vs._Spy") || gameurl.Equals("/wiki/Alfred_Chicken") || gameurl.Equals("/wiki/Pocket_Bomberman")) { continue; } } else if (CONSOLE.Equals("GBC")) // Lista de jogos de Gameboy Color cujo formato dos metadados não respeita o regular { if (gameurl.Equals("/wiki/Hugo") || gameurl.Equals("/wiki/Scrabble") || gameurl.Equals("/wiki/Checkmate")) { continue; } if (gameurl.Equals("/wiki/Rayman")) { gameurl = "/wiki/Rayman_(video_game)"; } } else if (CONSOLE.Equals("GBA")) // Lista de jogos de Gameboy Advance cujo formato dos metadados não respeita o regular { if (gameurl.Equals("/wiki/Golden_Sun") || gameurl.Equals("/wiki/NFL_Blitz_20-03") || gameurl.Equals("/wiki/Rocky") || gameurl.Equals("/wiki/Wade_Hixton%27s_Counter_Punch") || gameurl.Equals("/wiki/The_Ant_Bully")) { continue; } } addtoDB(gametitle.Trim(), gameurl, genres, CONSOLE); Tuple <string, string, string, string> gamedata = scrapGameData(gameurl, CONSOLE); gamedata = fixExceptions(gamedata, gametitle, gameurl); datacontainer.InnerHtml += "<tr><td>" + gametitle + "</td><td>" + gameurl + "</td><td>" + genrestring + "</td><td>" + gamedata.Item3 + "</td><td>" + gamedata.Item4 + "</td><td>" + gamedata.Item2 + "</td><td><img src=\"" + gamedata.Item1 + "\"/></td></tr>"; count++; } } else if (CONSOLE.Equals("SMS")) // Obter lista de jogos da Sega Master System. Fonte: segaretro.org { foreach (HtmlNode game_table in basepage.DocumentNode.SelectNodes("//table[@class='prettytable sortable'][1]/tr[position()>1]")) { string gameurl = ""; string gametitle = ""; HtmlNodeCollection nodes = game_table.ChildNodes[1].ChildNodes; foreach (HtmlNode node in nodes) { HtmlNodeCollection subnodes = node.ChildNodes; foreach (HtmlNode subnode in subnodes) { foreach (HtmlAttribute attr in subnode.Attributes) { if (attr.Name.Equals("href")) { gameurl = attr.Value; } } gametitle = subnode.InnerText; } } List <string> genres = fetchGenre(gameurl, "sega"); String genrestring; if (genres.Count == 1 && genres[0].Equals("")) { genrestring = "unavailable"; } else { genrestring = ""; foreach (string g in genres) { genrestring += (g + " & "); } genrestring = genrestring.Remove(genrestring.Length - 3); } //addtoDB(gametitle.Trim(), gameurl, genres, CONSOLE); datacontainer.InnerHtml += "<tr><td>" + gametitle + "</td><td>" + gameurl + "</td><td>" + genrestring + "</td></tr>"; } } System.Diagnostics.Debug.WriteLine("Scraped " + count.ToString() + " games."); }