faroo.py 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. ## Faroo (Web, News)
  2. #
  3. # @website http://www.faroo.com
  4. # @provide-api yes (http://www.faroo.com/hp/api/api.html), require API-key
  5. #
  6. # @using-api yes
  7. # @results JSON
  8. # @stable yes
  9. # @parse url, title, content, publishedDate, img_src
  10. from urllib import urlencode
  11. from json import loads
  12. import datetime
  13. from searx.utils import searx_useragent
  14. # engine dependent config
  15. categories = ['general', 'news']
  16. paging = True
  17. language_support = True
  18. number_of_results = 10
  19. api_key = None
  20. # search-url
  21. url = 'http://www.faroo.com/'
  22. search_url = url + 'api?{query}'\
  23. '&start={offset}'\
  24. '&length={number_of_results}'\
  25. '&l={language}'\
  26. '&src={categorie}'\
  27. '&i=false'\
  28. '&f=json'\
  29. '&key={api_key}' # noqa
  30. search_category = {'general': 'web',
  31. 'news': 'news'}
  32. # do search-request
  33. def request(query, params):
  34. offset = (params['pageno'] - 1) * number_of_results + 1
  35. categorie = search_category.get(params['category'], 'web')
  36. if params['language'] == 'all':
  37. language = 'en'
  38. else:
  39. language = params['language'].split('_')[0]
  40. # if language is not supported, put it in english
  41. if language != 'en' and\
  42. language != 'de' and\
  43. language != 'zh':
  44. language = 'en'
  45. params['url'] = search_url.format(offset=offset,
  46. number_of_results=number_of_results,
  47. query=urlencode({'q': query}),
  48. language=language,
  49. categorie=categorie,
  50. api_key=api_key)
  51. # using searx User-Agent
  52. params['headers']['User-Agent'] = searx_useragent()
  53. return params
  54. # get response from search-request
  55. def response(resp):
  56. # HTTP-Code 401: api-key is not valide
  57. if resp.status_code == 401:
  58. raise Exception("API key is not valide")
  59. # HTTP-Code 429: rate limit exceeded
  60. if resp.status_code == 429:
  61. raise Exception("rate limit has been exceeded!")
  62. results = []
  63. search_res = loads(resp.text)
  64. # return empty array if there are no results
  65. if not search_res.get('results', {}):
  66. return []
  67. # parse results
  68. for result in search_res['results']:
  69. if result['news']:
  70. # timestamp (milliseconds since 1970)
  71. publishedDate = datetime.datetime.fromtimestamp(result['date']/1000.0) # noqa
  72. # append news result
  73. results.append({'url': result['url'],
  74. 'title': result['title'],
  75. 'publishedDate': publishedDate,
  76. 'content': result['kwic']})
  77. else:
  78. # append general result
  79. # TODO, publishedDate correct?
  80. results.append({'url': result['url'],
  81. 'title': result['title'],
  82. 'content': result['kwic']})
  83. # append image result if image url is set
  84. # TODO, show results with an image like in faroo
  85. if result['iurl']:
  86. results.append({'template': 'images.html',
  87. 'url': result['url'],
  88. 'title': result['title'],
  89. 'content': result['kwic'],
  90. 'img_src': result['iurl']})
  91. # return results
  92. return results