diff --git a/app.py b/app.py
@@ -1,6 +1,11 @@
import geoip2.database
import socket
import re
+import urllib.parse
+import requests
+import os
+from flask_paginate import Pagination, get_page_args
+from datetime import datetime, timedelta
from flask import Flask, render_template, request
from modules.County_Codes import country_code_to_korean
@@ -64,5 +69,47 @@ def ascii_to_char():
characters += chr(ascii_code)
return render_template('ascii_to_char.html', characters=characters)
+@app.route('/utf8_decoder', methods=['GET', 'POST'])
+def utf8_decoder():
+ decoded_string = ''
+ if request.method == 'POST':
+ encoded_string = request.form.get('encoded_string')
+ decoded_string = urllib.parse.unquote(encoded_string)
+ return render_template('utf8_decoder.html', decoded_string=decoded_string)
+
+@app.route('/news', methods=['GET'])
+def news():
+ # Get page info from request
+ page, per_page, offset = get_page_args(page_parameter='page',
+ per_page_parameter='per_page')
+
+ # Bing Search v7 API endpoint
+ url = "https://api.cognitive.microsoft.com/bing/v7.0/news/search"
+ headers = {"Ocp-Apim-Subscription-Key": os.getenv("ec6fd8d4f6cb4263be9c7062fd398f91")}
+ params = {
+ "q": "해킹 OR 해커 OR 멀웨어 OR 취약점",
+ "count": 50,
+ "freshness": "Day",
+ "textFormat": "Raw",
+ "safeSearch": "Off"
+ }
+
+ response = requests.get(url, headers=headers, params=params)
+ response.raise_for_status()
+ news_data = response.json()["value"]
+
+ # Convert published time to datetime object
+ for news in news_data:
+ news["datePublished"] = datetime.strptime(news["datePublished"], "%Y-%m-%dT%H:%M:%S.%fZ")
+
+ # Paginate news
+ total = len(news_data)
+ pagination_news = news_data[offset: offset + per_page]
+ pagination = Pagination(page=page, per_page=per_page, total=total,
+ css_framework='bootstrap4')
+
+ return render_template('news.html', news=pagination_news, page=page,
+ per_page=per_page, pagination=pagination)
+
if __name__ == '__main__':
app.run()
diff --git a/templates/ascii_to_char.html b/templates/ascii_to_char.html
@@ -35,6 +35,12 @@
<li class="nav-item">
<a class="nav-link" href="/ascii_to_char">ASCII Code Converter</a>
</li>
+ <li class="nav-item">
+ <a class="nav-link" href="/utf8_decoder">UTF-8 Decorder</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/news">News</a>
+ </li>
</ul>
</div>
</nav>
diff --git a/templates/index.html b/templates/index.html
@@ -4,9 +4,9 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>IP to Country</title>
- <!-- 부트스트랩 CSS 추가 -->
+ <!-- Bootstrap CSS -->
<link
- href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
+ href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
rel="stylesheet"
/>
</head>
@@ -32,6 +32,12 @@
<li class="nav-item">
<a class="nav-link" href="/ascii_to_char">ASCII Code Converter</a>
</li>
+ <li class="nav-item">
+ <a class="nav-link" href="/utf8_decoder">UTF-8 Decorder</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/news">News</a>
+ </li>
</ul>
</div>
</nav>
@@ -69,9 +75,9 @@
</table>
{% endif %}
</div>
- <!-- 부트스트랩 및 Popper.js 추가 -->
- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
- <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js"></script>
- <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.min.js"></script>
+ <!-- Optional JavaScript; choose one of the two! -->
+ <!-- Option 1: jQuery and Bootstrap Bundle (includes Popper) -->
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
</body>
</html>
diff --git a/templates/news.html b/templates/news.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <title>UTF-8 Decoder</title>
+ <!-- Bootstrap CSS -->
+ <link
+ href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
+ rel="stylesheet"
+ />
+ </head>
+ <body>
+ <nav class="navbar navbar-expand-lg navbar-light bg-light">
+ <a class="navbar-brand" href="#">Navigation</a>
+ <button
+ class="navbar-toggler"
+ type="button"
+ data-toggle="collapse"
+ data-target="#navbarNav"
+ aria-controls="navbarNav"
+ aria-expanded="false"
+ aria-label="Toggle navigation"
+ >
+ <span class="navbar-toggler-icon"></span>
+ </button>
+ <div class="collapse navbar-collapse" id="navbarNav">
+ <ul class="navbar-nav">
+ <li class="nav-item active">
+ <a class="nav-link" href="/">IP & Domain Country Finder</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/ascii_to_char">ASCII Code Converter</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/utf8_decoder">UTF-8 Decorder</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/news">News</a>
+ </li>
+ </ul>
+ </div>
+ </nav>
+
+ <div class="container">
+ <h1 class="my-4">News</h1>
+
+ <table class="table table-striped">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Date Published</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for news_item in news %}
+ <tr>
+ <td><a href="{{ news_item.url }}">{{ news_item.name }}</a></td>
+ <td>{{ news_item.datePublished }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+
+ {% if pagination.total > 0 %}
+ <div class="d-flex justify-content-center">{{ pagination.links }}</div>
+ {% endif %}
+ </div>
+ <!-- Optional JavaScript; choose one of the two! -->
+ <!-- Option 1: jQuery and Bootstrap Bundle (includes Popper) -->
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
+ </body>
+</html>
diff --git a/templates/utf8_decoder.html b/templates/utf8_decoder.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <title>UTF-8 Decoder</title>
+ <!-- Bootstrap CSS -->
+ <link
+ href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
+ rel="stylesheet"
+ />
+ </head>
+ <body>
+ <nav class="navbar navbar-expand-lg navbar-light bg-light">
+ <a class="navbar-brand" href="#">Navigation</a>
+ <button
+ class="navbar-toggler"
+ type="button"
+ data-toggle="collapse"
+ data-target="#navbarNav"
+ aria-controls="navbarNav"
+ aria-expanded="false"
+ aria-label="Toggle navigation"
+ >
+ <span class="navbar-toggler-icon"></span>
+ </button>
+ <div class="collapse navbar-collapse" id="navbarNav">
+ <ul class="navbar-nav">
+ <li class="nav-item active">
+ <a class="nav-link" href="/">IP & Domain Country Finder</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/ascii_to_char">ASCII Code Converter</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/utf8_decoder">UTF-8 Decorder</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/news">News</a>
+ </li>
+ </ul>
+ </div>
+ </nav>
+
+ <div class="container">
+ <h1 class="my-4">UTF-8 Decoder</h1>
+ <form method="POST">
+ <div class="form-group">
+ <label for="encoded_string">Enter your encoded UTF-8 string:</label>
+ <input
+ type="text"
+ class="form-control"
+ id="encoded_string"
+ name="encoded_string"
+ required
+ />
+ </div>
+ <button type="submit" class="btn btn-primary">Decode</button>
+ </form>
+ {% if decoded_string %}
+ <div class="alert alert-success mt-4" role="alert">
+ Decoded String: {{ decoded_string }}
+ </div>
+ {% endif %}
+ </div>
+ <!-- Optional JavaScript; choose one of the two! -->
+ <!-- Option 1: jQuery and Bootstrap Bundle (includes Popper) -->
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
+ </body>
+</html>
|