index.cgi - mediawiki-gopher - mediawiki gopher frontend
 (HTM) git clone git://bitreich.org/mediawiki-gopher git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/mediawiki-gopher
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
       index.cgi (2488B)
       ---
            1 #!/usr/bin/env python
            2 # coding=utf-8
            3 #
            4 # © 2025-2026 Christoph Lohmann <20h@r-36.net>
            5 #
            6 # This file is published under the terms of the GPLv3.
            7 #
            8 
            9 import os
           10 import sys
           11 import getopt
           12 import requests
           13 
           14 from selenium import webdriver
           15 from selenium.webdriver.chrome.options import Options as chromeoptions
           16 from selenium.webdriver.chrome.service import Service as chromeservice
           17 from selenium.webdriver.common.print_page_options import PrintOptions
           18 import base64
           19 
           20 def uri2pdf(uri):
           21         options = chromeoptions()
           22         chromearguments = [
           23                 "headless",
           24                 "no-sandbox",
           25                 "disable-extensions",
           26                 "disable-dev-shm-usage",
           27                 "start-maximized",
           28                 "window-size=1900,1080",
           29                 "disable-gpu"
           30         ]
           31         for carg in chromearguments:
           32                 options.add_argument(carg)
           33 
           34         service = chromeservice(executable_path="/usr/bin/chromedriver")
           35         driver = webdriver.Chrome(service=service, options=options)
           36         driver.implicitly_wait(2)
           37         driver.get(uri)
           38 
           39         print_options = PrintOptions()
           40         pdf = driver.print_page(print_options)
           41         driver.quit()
           42         return base64.b64decode(pdf)
           43 
           44 def main(args):
           45         if len(args) != 7:
           46                 sys.stderr.write("Must be run as geomyidae dcgi.\n")
           47                 return 1
           48         g_search = args[1]
           49         g_arguments = args[2]
           50         g_host = args[3]
           51         g_port = args[4]
           52         g_traversal = args[5]
           53         g_base = g_selector = args[6]
           54         if len(g_traversal) > 0:
           55                 g_base = g_selector[:-len(g_traversal)]
           56         g_usetls = os.getenv("GOPHERS", "off")
           57         if g_usetls == "on":
           58                 g_uri = "gophers://"
           59         else:
           60                 g_uri = "gopher://"
           61         g_uri += g_host
           62         if g_port != "70":
           63                 g_uri += ":" + g_port
           64         g_uri += g_base
           65 
           66         mw_base = os.getenv("MEDIAWIKI_BASE", "https://en.wikipedia.org")
           67         mw_pdf = os.getenv("MEDIAWIKI_PDF", "https://en.wikipedia.org/api/rest_v1/page/pdf")
           68         mw_page_base = "%s/wiki" % (mw_base)
           69 
           70         # Mandatory for wikipedia.
           71         headers = { "User-Agent": "gopher mediawiki frontend/0.1" }
           72 
           73         cmds = g_traversal.split("/")
           74         if len(cmds) == 0:
           75                 gph = "3Not found.\t\t\n"
           76         elif len(cmds) == 1:
           77                 gph = "3Not found.\t\t\n"
           78         elif cmds[1] == "":
           79                 gph = "3Not found.\t\t\n"
           80         else:
           81                 page = cmds[1]
           82                 if page.endswith(".pdf"):
           83                         page = page[:-4]
           84                 try:
           85                         pdf = requests.get("%s/%s" % (mw_pdf, \
           86                                         page), headers=headers)
           87                 except:
           88                         pdf = uri2pdf("%s/%s" % (mw_page_base, page))
           89 
           90                 mw_replace = mw_page_base
           91                 g_content = pdf.content.replace(mw_replace.encode("utf-8"),\
           92                       g_uri.encode("utf-8"))
           93                 sys.stdout.buffer.write(g_content)
           94                 sys.stdout.flush()
           95                 return 0
           96 
           97         sys.stdout.write(gph)
           98         sys.stdout.flush()
           99         return 0
          100 
          101 if __name__ == "__main__":
          102         sys.exit(main(sys.argv))
          103