def google(query, nresults, retry=None): """ Perform a google search and return the first nresults results. If a result matches a key in retry, the query is replaced with the value of that key. """ page = requests.get(google_api_url, params={"key": key, "cx": engine, "q": query} ).json() data = [] if page["items"]: for keyword in retry or {}: if any(keyword in i["title"].lower() for i in page["items"]): return google(retry[keyword], nresults) for i, result in enumerate(page["items"]): if i >= nresults: break title = unescape(re.sub("</?b>", "", result["htmlTitle"])) description = re.sub(r"(\s|<br>)+", " ", unescape(re.sub("</?b>", "", result["htmlSnippet"]))) data.append({"color" : [12, 5, 8, 3][i % 4], "title" : title, "url" : result["link"], "description": description }) return data
def google(query, nresults, retry=None): """ Perform a google search and return the first nresults results. If a result matches a key in retry, the query is replaced with the value of that key. """ page = requests.get(google_api_url + urllib.quote(query)).json() data = [] if page["responseData"]["results"]: for keyword in retry or {}: if any(keyword in i["title"].lower() for i in page["responseData"]["results"]): return google(retry[keyword], nresults) for i, result in enumerate(page["responseData"]["results"]): if i >= nresults: break data.append({"color" : [12, 5, 8, 3][i % 4], "title": unescape(re.sub("</?b>", "", result["title"])), "url" : result["unescapedUrl"], "description": re.sub(r"\s+", " ", unescape(re.sub("</?b>", "", result["content"])))}) return data
def __init__(self, printer, channel, rounds=None, black=[], white=[], rando=False, numcards=10, minplayers=3, bets=True, firstto=None, ranked=False, democracy=False): self.printer = printer self.lock = threading.Lock() self.questions = self.black[:] + black[:] # Get questions from reddit reddit = requests.get("http://www.reddit.com/r/AskReddit/hot.json", headers={"User-Agent": "Karkat-CardsAgainstHumanity-Scraper"}).json() reddit = reddit["data"]["children"] titles = [i["data"]["title"] for i in reddit if i["data"]["title"].endswith("?")] # 5% of cards max should be reddit cards self.questions.extend(titles) random.shuffle(self.questions) self.answers = self.white[:] + white[:] # Get trends from Know Your Meme memes = requests.get("http://knowyourmeme.com/").text memes = re.findall("<h5 class='left'>Also Trending:</h5>(.+?)</div>", memes) memes = re.findall(">(.+?)</a>", memes[0]) self.answers.extend([unescape(i) + "." for i in memes]) ud = requests.get("http://urbandictionary.com/").text ud = re.findall(r"define\.php.*?>(.+?)<", ud)[1:] ud = [unescape(i) for i in ud] ud = [i[0].upper() + i[1:] + ("." * i[-1].isalpha()) for i in ud] self.answers.extend(ud) random.shuffle(self.answers) self.usedanswers = [] self.state = "signups" self.channel = channel self.rounds = rounds self.maxcards = numcards self.minplayers = minplayers self.bets = not ranked or bets self.firstto = firstto self.ranked = ranked self.democracy = democracy self.players = [] self.allplayers = [] self.round = 0 self.czar = None self.question = None if rando: self.addRando() else: self.rando = None
def image(server, msg, flags, query): """ Image search. Search for the given terms on Google. If a number is given, it will display that result. Code adapted from kochira :v """ params = { "cx": cfg["img"], "key": cfg["key"], "searchType": "image", "safe": "off", "num": deflines[msg.prefix], "q": query } if flags: for i in flags[1:].strip(): if i.isdigit(): params["num"] = min(int(i), maxlines[msg.prefix]) else: params.update({"f": {"imgType": "face"}, "p": {"imgType": "photo"}, "c": {"imgType": "clipart"}, "l": {"imgType": "lineart"}, "g": {"imgType": "animated"}, "s": {"safe": "high"} }[i]) r = requests.get( "https://www.googleapis.com/customsearch/v1", params=params ).json() results = r.get("items", []) for i, result in enumerate(results): server.lasturl = result["link"] yield templates[msg.prefix] % {"color" : [12, 5, 8, 3][i % 4], "url": url.shorten(unquote(result["link"])), "fullurl": result["displayLink"], "width": result["image"]["width"], "height": result["image"]["height"], "content": unescape(re.sub("</?b>", "", result["htmlSnippet"])), "title": unescape(re.sub("</?b>", "", result["htmlTitle"]))} if not results: yield "12Google Images│ No results."
def image(server, msg, flags, query): """ Image search. Search for the given terms on Google. If a number is given, it will display that result. Code adapted from kochira :v """ params = { "safe": "off", "v": "1.0", "rsz": deflines[msg.prefix], "q": query } if flags: for i in flags[1:].strip(): if i.isdigit(): params["rsz"] = min(int(i), maxlines[msg.prefix]) else: params.update({"f": {"imgtype": "face"}, "p": {"imgtype": "photo"}, "c": {"imgtype": "clipart"}, "l": {"imgtype": "lineart"}, "g": {"as_filetype": "gif"}, "s": {"safe": "active"} }[i]) r = requests.get( "https://ajax.googleapis.com/ajax/services/search/images", params=params ).json() results = r.get("responseData", {}).get("results", []) for i, result in enumerate(results): server.lasturl = result["url"] yield templates[msg.prefix] % {"color" : [12, 5, 8, 3][i % 4], "url": url.shorten(result["url"]), "fullurl": result["visibleUrl"], "width": result["width"], "height": result["height"], "content": unescape(re.sub("</?b>", "", result["content"])), "title": unescape(re.sub("</?b>", "", result["title"]))} if not results: yield "12Google Images│ No results."
def button(self, server, msg): nick = msg.address.nick # Check if we need any new buttons if all(i for i in self.wyps.values()): page = requests.get("http://m.willyoupressthebutton.com/").text cond = unescape(re.findall('<div class="rect" id="cond">(.+)</div>', page)[0]) res = unescape(re.findall('<div class="rect" id="res">(.+)</div>', page)[0]) cond = cond[0].upper() + cond[1:].rstrip(" ").rstrip(".") res = res[0].lower() + res[1:] wyp = self.wyps.setdefault("%s but %s" % (cond, res), {}) self.save() # Reduce probability of already-answered buttons buttons = [i for i in self.wyps if (server.lower(nick) not in self.wyps[i] and i != self.active)] self.active[server.lower(msg.context)] = random.choice(buttons) return self.display(server.lower(msg.context))
def defaultdeck(black, white): questions = [ i.strip() for i in open(datadir + "/black.txt").read().split("\n") ] + black answers = [ i.strip() for i in open(datadir + "/white.txt").read().split("\n") ] + white # Get questions from reddit #reddit = requests.get("http://www.reddit.com/r/AskReddit/hot.json", headers={"User-Agent": "Karkat-CardsAgainstHumanity-Scraper"}).json() #reddit = reddit["data"]["children"] #titles = [i["data"]["title"] for i in reddit if i["data"]["title"].endswith("?")] # 5% of cards max should be reddit cards #questions.extend(titles) # Get trends from Know Your Meme #memes = requests.get("http://knowyourmeme.com/").text #memes = re.findall("<h5 class='left'>Also Trending:</h5>(.+?)</div>", memes) #memes = re.findall(">(.+?)</a>", memes[0]) #answers.extend([unescape(i) + "." for i in memes]) ud = requests.get("http://urbandictionary.com/").text ud = re.findall(r"define\.php.*?>(.+?)<", ud)[1:] ud = [unescape(i) for i in ud] ud = [i[0].upper() + i[1:] + ("." * i[-1].isalpha()) for i in ud] answers.extend(ud) return questions, answers
def preview(self, server, message, url): if not url: url = server.lasturl params = {"SM_API_KEY": self.key, "SM_URL": url, "SM_LENGTH": 1} summary = requests.get(self.API_URL, params=params).json() try: return "12│ " + unescape(summary["sm_api_content"]) except: return summary["sm_api_message"]
def button(self, server, msg): nick = msg.address.nick # Check if we need any new buttons if all(i for i in self.wyps.values()): page = requests.get("http://m.willyoupressthebutton.com/").text cond = unescape( re.findall('<div class="rect" id="cond">(.+)</div>', page)[0]) res = unescape( re.findall('<div class="rect" id="res">(.+)</div>', page)[0]) cond = cond[0].upper() + cond[1:].rstrip(" ").rstrip(".") res = res[0].lower() + res[1:] wyp = self.wyps.setdefault("%s but %s" % (cond, res), {}) self.save() # Reduce probability of already-answered buttons buttons = [ i for i in self.wyps if (server.lower(nick) not in self.wyps[i] and i != self.active) ] self.active[server.lower(msg.context)] = random.choice(buttons) return self.display(server.lower(msg.context))
def defaultdeck(black, white): questions = [i.strip() for i in open(datadir + "/black.txt").read().split("\n")] + black answers = [i.strip() for i in open(datadir + "/white.txt").read().split("\n")] + white # Get questions from reddit #reddit = requests.get("http://www.reddit.com/r/AskReddit/hot.json", headers={"User-Agent": "Karkat-CardsAgainstHumanity-Scraper"}).json() #reddit = reddit["data"]["children"] #titles = [i["data"]["title"] for i in reddit if i["data"]["title"].endswith("?")] # 5% of cards max should be reddit cards #questions.extend(titles) # Get trends from Know Your Meme #memes = requests.get("http://knowyourmeme.com/").text #memes = re.findall("<h5 class='left'>Also Trending:</h5>(.+?)</div>", memes) #memes = re.findall(">(.+?)</a>", memes[0]) #answers.extend([unescape(i) + "." for i in memes]) ud = requests.get("http://urbandictionary.com/").text ud = re.findall(r"define\.php.*?>(.+?)<", ud)[1:] ud = [unescape(i) for i in ud] ud = [i[0].upper() + i[1:] + ("." * i[-1].isalpha()) for i in ud] answers.extend(ud) return questions, answers
def image(server, msg, flags, query): """ Image search. Search for the given terms on Google. If a number is given, it will display that result. Code adapted from kochira :v """ params = { "cx": cfg["img"], "key": cfg["key"], "searchType": "image", "safe": "off", "num": deflines[msg.prefix], "q": query } if flags: for i in flags[1:].strip(): if i.isdigit(): params["num"] = min(int(i), maxlines[msg.prefix]) else: params.update({ "f": { "imgType": "face" }, "p": { "imgType": "photo" }, "c": { "imgType": "clipart" }, "l": { "imgType": "lineart" }, "g": { "imgType": "animated" }, "s": { "safe": "high" } }[i]) r = requests.get("https://www.googleapis.com/customsearch/v1", params=params).json() results = r.get("items", []) for i, result in enumerate(results): server.lasturl = result["link"] yield templates[msg.prefix] % { "color": [12, 5, 8, 3][i % 4], "url": url.shorten(unquote(result["link"])), "fullurl": result["displayLink"], "width": result["image"]["width"], "height": result["image"]["height"], "content": unescape(re.sub("</?b>", "", result["htmlSnippet"])), "title": unescape(re.sub("</?b>", "", result["htmlTitle"])) } if not results: yield "12Google Images│ No results."