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