/plugins/web/duckduckgo.py

https://github.com/gnustomp/ninjabot · Python · 69 lines · 52 code · 6 blank · 11 comment · 8 complexity · c62da5b0f59a94f94837741619372be9 MD5 · raw file

  1. """
  2. Uses DuckDuckGo's instant answer API to find search results.
  3. """
  4. import requests
  5. class Plugin(object):
  6. def load(self, bot, config):
  7. self.bot = bot
  8. self.shorten = self.bot.request_api('web.shorten')
  9. def trigger_ddg(self, msg):
  10. "Usage: ddg <searchterm>. Shows the instant answer for DuckDuckGo query."
  11. if len(msg.args) == 0:
  12. self.bot.notice(msg.nick, "Please specify a search term")
  13. return
  14. url = 'http://api.duckduckgo.com/'
  15. params = {
  16. 'q': ' '.join(msg.args),
  17. 'format': 'json',
  18. 'no_html': '1',
  19. 'no_redirect': '1',
  20. 'skip_disambig': '1'
  21. }
  22. request_json = requests.get(url, params=params).json()
  23. content = ''
  24. url = ''
  25. type_ = request_json['Type']
  26. if type_ == 'A':
  27. content = "[{}] {}".format(request_json['AbstractSource'], request_json['AbstractText'])
  28. # If there is a result with the response, use it's URL instead.
  29. results = request_json['Results']
  30. if len(results):
  31. result = results[0]
  32. url = "{} ({})".format(self.shorten(result['FirstURL']), result['Text'])
  33. else:
  34. url = self.shorten(request_json['AbstractURL'])
  35. elif type_ == 'C':
  36. ...
  37. elif type_ == 'N':
  38. ...
  39. elif type_ == 'E':
  40. # It might be a !bang redirect, or a calculation or similar.
  41. if request_json['Redirect']:
  42. source = 'Redirect'
  43. answer = self.shorten(request_json['Redirect'])
  44. else:
  45. source = request_json['AnswerType']
  46. answer = request_json['Answer']
  47. content = "[{}] {}".format(source, answer)
  48. if url:
  49. url = " \002::\002 " + url
  50. message = u"\002DuckDuck\0033Go\003 ::\002 {}{}".format(content, url)
  51. self.bot.privmsg(msg.channel, message)
  52. def trigger_duckduckgo(self, msg):
  53. "Usage: duckduckgo <searchterm>. Shows the instant answer for DuckDuckGo query."
  54. self.trigger_ddg(msg)