WorkTools.git

WorkTools

~
git clone https://github.com/debuman/WorkTools.git
commit 328ed05c20a114284f136a3db8dd9d8f39c9fa30
parent 92b8e1fe3b247fab6ae048a8ce0453eb2093c928
Author: saladball <38815353+saladball@users.noreply.github.com>
Date: Sun, 14 May 2023 00:48:51 +0900

news app add

Diffstat:
Mapp.py | 47+++++++++++++++++++++++++++++++++++++++++++++++
Mtemplates/ascii_to_char.html | 6++++++
Mtemplates/index.html | 18++++++++++++------
Atemplates/news.html | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atemplates/utf8_decoder.html | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 210 insertion(+), 6 deletion(-)

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>