pop-shell-ddg/duckduckgo_search.py

76 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python3
import json
import sys
import webbrowser
from urllib.parse import urlencode, quote_plus
DDG_URL="https://duckduckgo.com/"
def lookup(query):
resp = requests.get(DDG_URL, params={"q":query, "format": "json", "no_html": "1"})
print(resp.text)
def send(event, obj=None):
if obj is None:
obj = {}
obj["event"] = event
json.dump(obj, sys.stdout)
sys.stdout.write("\n")
sys.stdout.flush()
def recv():
for line in sys.stdin:
if len(line.strip()) == 0:
continue
req = json.loads(line)
if not isinstance(req, dict):
send("noop", {"error": "invalid json"})
continue
event = req.get("event", None)
if not isinstance(event, str):
send("noop", {"error": "invalid event type"})
continue
yield event, req
query = ""
go_url = ""
for event, req in recv():
if event == "complete":
send("noop")
elif event == "query":
query = req.get("value", "")
if query.startswith("ddg "):
query = query[4:]
elif query.startswith("ddg"):
query = query[3:]
if len(query) > 0 and query != "!":
go_url = DDG_URL + "?" + urlencode({"q": query}, quote_via=quote_plus)
send("queried", {
"selections": [
{
"id": 0,
"name": f"search {query} on duckduckgo",
"description": go_url,
# "icon": "meow",
# "content_type": "meow"
}
]
})
else:
go_url = ""
send("queried", {"selections": []})
elif event == "submit":
send("close")
if len(go_url) > 0:
webbrowser.open(go_url)
elif event == "quit":
sys.exit(0)
else:
send("noop", {"error": "invalid event"})