#!/usr/bin/python3 import urllib from bs4 import BeautifulSoup import random import string dict = "/usr/share/dict/american-english" (userId, token) = open("/home/krowbar/.secret/s4token").readline().rstrip().split(",") def get_acros(word, silly, short): acros = [] url = "http://www.stands4.com/services/v2/abbr.php?uid={}&tokenid={}&term={}".format( userId, token, word ) soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html5lib") results = soup.find_all("result") # there are lots of cases where the same definition is repeated multiple times under different categories. this is dumb so we should do a little more work defs = [] for r in results: rdef = r.find("definition").text match = next((x for x in defs if x["definition"].lower() == rdef.lower()), None) if match is not None: # if we find a match, add the category to the existing categories and increase the score match["categories"].append( ( (r.find("parentcategoryname").text + "\\") if r.find("parentcategoryname") else "" ) + r.find("categoryname").text ) match["score"] = str(float(match["score"]) + float(r.find("score").text)) else: # add a new item defs.append( { "term": r.find("term").text, "definition": r.find("definition").text, "categories": [ ( (r.find("parentcategoryname").text + "\\") if r.find("parentcategoryname") else "" ) + r.find("categoryname").text ], "score": r.find("score").text, } ) for d in sorted(defs, key=lambda x: float(x["score"]), reverse=True): # print d; if short is True: acros.append('"%s"' % d["definition"]) else: acros.append( ( '{}: "{}" ({}, score: {})'.format( d["term"], d["definition"], ", ".join(d["categories"]), d["score"], ) ) ) if silly is True: newDef = [] words = open(dict, "r").readlines() try: for idx, letter in enumerate(word): newWord = random.choice( list(filter( lambda w: (idx is 0 or not w.strip().lower().endswith("'s")) and w.lower().startswith(letter.lower()), words, )) ).strip() print(str(idx) + " -> " + newWord) newDef.append(newWord) newWord = string.capwords(" ".join(newDef)) if short is True: acros.append('"%s"' % newWord) else: acros.append( ( '{}: "{}" ({}, score: {})'.format( word.upper(), newWord, "Tilde.town Original", "0" ) ) ) except IndexError: acros.append("Future hazy, try again later: Tilde.town Error") if short is True: shortList = acros[0:5] if len(acros) > 5: shortList.append(acros[-1]) return [word.upper() + ": " + ", ".join(shortList)] else: return acros