105 lines
4.7 KiB
HTML
105 lines
4.7 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=Mulish:ital,wght@0,200..1000;1,200..1000&family=Open+Sans:ital,wght@0,300..800;1,300..800&family=Oswald:wght@200..700&family=Quicksand:wght@300..700&display=swap" rel="stylesheet">
|
||
<link rel="stylesheet" href="../css/projectStyle.css">
|
||
<link rel="stylesheet" href="./css/project1Style.css">
|
||
<title>Web Scraper / Discord Bot – Lew's Portfolio</title>
|
||
</head>
|
||
<body>
|
||
|
||
<header>
|
||
<div class="nav-bar">
|
||
<a href="../index.html"><img class="nav-logo" src="../images/icons/logo.svg" alt="lew's logo" width="180" height="auto"></a>
|
||
<nav>
|
||
<ul class="nav-links">
|
||
<li><a href="../index.html">Home</a></li>
|
||
<li><a href="../projects.html">Projects</a></li>
|
||
<li><a href="../index.html#contact">Contact</a></li>
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="project-detail">
|
||
|
||
<div class="project-hero">
|
||
<div class="hero-image">
|
||
<img src="../images/project_imgs/ToDoList Project.jpg" alt="Web Scraper / Discord Bot">
|
||
</div>
|
||
<div class="hero-overlay">
|
||
<span class="project-tag">Golang · Web Scraping · Discord API</span>
|
||
<h1>Web Scraper / Discord Bot</h1>
|
||
<p class="hero-sub">Automated SHiFT code delivery straight to your Discord server.</p>
|
||
<a class="btn-primary" href="https://git.lewispricedev.com/Rapturate/SHiFT_Codes_Bot/releases/tag/R1" target="_blank">View Release ↗</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="detail-grid">
|
||
|
||
<section class="detail-section">
|
||
<h2>Overview</h2>
|
||
<p>
|
||
This project combines a web scraper with a Discord bot to automatically surface
|
||
SHiFT codes for Borderlands 4. When a user triggers the bot on Discord, it
|
||
scrapes the latest codes and returns them instantly — no manual hunting required.
|
||
</p>
|
||
</section>
|
||
|
||
<section class="detail-section">
|
||
<h2>Features</h2>
|
||
<ul class="feature-list">
|
||
<li>On-demand scraping triggered by Discord command</li>
|
||
<li>Parses and formats code lists for readability</li>
|
||
<li>Error handling for network / parse failures</li>
|
||
<li>Lightweight — runs on a small VPS or home server</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section class="detail-section">
|
||
<h2>Tech Stack</h2>
|
||
<div class="tech-pills">
|
||
<span>Golang</span>
|
||
<span>Discord Go</span>
|
||
<span>GoColly</span>
|
||
<span>Request/Response</span>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="detail-section">
|
||
<h2>Challenges & Learnings</h2>
|
||
<p>
|
||
Navigating the structure of a dynamically rendered page required careful selector
|
||
targeting. Integrating the scraper output into Discord's message format taught
|
||
clean separation of concerns between data retrieval and presentation layers.
|
||
</p>
|
||
</section>
|
||
|
||
</div>
|
||
|
||
<div class="project-nav">
|
||
<a href="../projects.html" class="btn-secondary">← All Projects</a>
|
||
<a href="./project2.html" class="btn-secondary">Next Project →</a>
|
||
</div>
|
||
|
||
</main>
|
||
|
||
<footer>
|
||
<p>© 2024 LewisPriceDev, All rights reserved.</p>
|
||
<div class="social-links">
|
||
<a href="https://www.linkedin.com/in/lewis-price-a79185195/" target="_blank" aria-label="LinkedIn">
|
||
<img src="../images/icons/linkedin-icon.svg" alt="">
|
||
</a>
|
||
<a class="mail-img" href="mailto:lewis.e.price@outlook.com">
|
||
<img src="../images/icons/mail_icon.svg" alt="lewis.price@outlook.com">
|
||
</a>
|
||
</div>
|
||
</footer>
|
||
|
||
</body>
|
||
</html>
|