searchapi-ruby 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +48 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +1064 -0
  5. data/lib/searchapi/client.rb +45 -0
  6. data/lib/searchapi/configuration.rb +15 -0
  7. data/lib/searchapi/error.rb +11 -0
  8. data/lib/searchapi/resource.rb +20 -0
  9. data/lib/searchapi/resources/airbnb.rb +17 -0
  10. data/lib/searchapi/resources/amazon_search.rb +17 -0
  11. data/lib/searchapi/resources/apple_app_store.rb +17 -0
  12. data/lib/searchapi/resources/baidu.rb +17 -0
  13. data/lib/searchapi/resources/bing.rb +17 -0
  14. data/lib/searchapi/resources/bing_images.rb +17 -0
  15. data/lib/searchapi/resources/bing_videos.rb +17 -0
  16. data/lib/searchapi/resources/duckduckgo.rb +17 -0
  17. data/lib/searchapi/resources/ebay_search.rb +18 -0
  18. data/lib/searchapi/resources/facebook_business_page.rb +25 -0
  19. data/lib/searchapi/resources/google.rb +17 -0
  20. data/lib/searchapi/resources/google_about_this_domain.rb +17 -0
  21. data/lib/searchapi/resources/google_ads_transparency_center.rb +25 -0
  22. data/lib/searchapi/resources/google_ai_mode.rb +17 -0
  23. data/lib/searchapi/resources/google_ai_overview.rb +17 -0
  24. data/lib/searchapi/resources/google_autocomplete.rb +17 -0
  25. data/lib/searchapi/resources/google_events.rb +17 -0
  26. data/lib/searchapi/resources/google_finance.rb +17 -0
  27. data/lib/searchapi/resources/google_flights.rb +23 -0
  28. data/lib/searchapi/resources/google_forums.rb +17 -0
  29. data/lib/searchapi/resources/google_hotels.rb +17 -0
  30. data/lib/searchapi/resources/google_images.rb +17 -0
  31. data/lib/searchapi/resources/google_jobs.rb +17 -0
  32. data/lib/searchapi/resources/google_lens.rb +17 -0
  33. data/lib/searchapi/resources/google_local.rb +17 -0
  34. data/lib/searchapi/resources/google_maps.rb +30 -0
  35. data/lib/searchapi/resources/google_news.rb +17 -0
  36. data/lib/searchapi/resources/google_patents.rb +17 -0
  37. data/lib/searchapi/resources/google_play_store.rb +33 -0
  38. data/lib/searchapi/resources/google_rank_tracking.rb +17 -0
  39. data/lib/searchapi/resources/google_scholar.rb +21 -0
  40. data/lib/searchapi/resources/google_shopping.rb +17 -0
  41. data/lib/searchapi/resources/google_shorts.rb +17 -0
  42. data/lib/searchapi/resources/google_trends.rb +33 -0
  43. data/lib/searchapi/resources/google_videos.rb +17 -0
  44. data/lib/searchapi/resources/instagram_profile.rb +17 -0
  45. data/lib/searchapi/resources/linkedin_ad_library.rb +17 -0
  46. data/lib/searchapi/resources/meta_ad_library.rb +17 -0
  47. data/lib/searchapi/resources/naver.rb +17 -0
  48. data/lib/searchapi/resources/reddit_ad_library.rb +17 -0
  49. data/lib/searchapi/resources/shein_search.rb +17 -0
  50. data/lib/searchapi/resources/tiktok_ads_library.rb +17 -0
  51. data/lib/searchapi/resources/tiktok_profile.rb +17 -0
  52. data/lib/searchapi/resources/tripadvisor.rb +17 -0
  53. data/lib/searchapi/resources/walmart_search.rb +17 -0
  54. data/lib/searchapi/resources/yahoo.rb +17 -0
  55. data/lib/searchapi/resources/yandex.rb +17 -0
  56. data/lib/searchapi/resources/yandex_reverse_image.rb +17 -0
  57. data/lib/searchapi/resources/youtube.rb +17 -0
  58. data/lib/searchapi/response.rb +25 -0
  59. data/lib/searchapi/version.rb +5 -0
  60. data/lib/searchapi.rb +177 -0
  61. metadata +138 -0
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class GoogleRankTracking < Resource
6
+ def search(query, num: 100, **params)
7
+ get(q: query, num: num, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "google_rank_tracking"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class GoogleScholar < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ def cite(article_id, **params)
11
+ get(cites: article_id, **params)
12
+ end
13
+
14
+ private
15
+
16
+ def engine_name
17
+ "google_scholar"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class GoogleShopping < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "google_shopping"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class GoogleShorts < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "google_shorts"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class GoogleTrends < Resource
6
+ def search(query, data_type:, **params)
7
+ get(q: query, data_type: data_type, **params)
8
+ end
9
+
10
+ def interest_over_time(query, **params)
11
+ search(query, data_type: "TIMESERIES", **params)
12
+ end
13
+
14
+ def interest_by_region(query, **params)
15
+ search(query, data_type: "GEO_MAP", **params)
16
+ end
17
+
18
+ def related_queries(query, **params)
19
+ search(query, data_type: "RELATED_QUERIES", **params)
20
+ end
21
+
22
+ def related_topics(query, **params)
23
+ search(query, data_type: "RELATED_TOPICS", **params)
24
+ end
25
+
26
+ private
27
+
28
+ def engine_name
29
+ "google_trends"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class GoogleVideos < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "google_videos"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class InstagramProfile < Resource
6
+ def search(username:, **params)
7
+ get(username: username, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "instagram_profile"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class LinkedinAdLibrary < Resource
6
+ def search(**params)
7
+ get(**params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "linkedin_ad_library"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class MetaAdLibrary < Resource
6
+ def search(**params)
7
+ get(**params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "meta_ad_library"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class Naver < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "naver"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class RedditAdLibrary < Resource
6
+ def search(**params)
7
+ get(**params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "reddit_ad_library"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class SheinSearch < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "shein_search"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class TiktokAdsLibrary < Resource
6
+ def search(**params)
7
+ get(**params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "tiktok_ads_library"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class TiktokProfile < Resource
6
+ def search(username:, **params)
7
+ get(username: username, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "tiktok_profile"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class TripAdvisor < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "tripadvisor"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class WalmartSearch < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "walmart_search"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class Yahoo < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "yahoo"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class Yandex < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "yandex"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class YandexReverseImage < Resource
6
+ def search(url:, **params)
7
+ get(url: url, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "yandex_reverse_image"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ module Resources
5
+ class YouTube < Resource
6
+ def search(query, **params)
7
+ get(q: query, **params)
8
+ end
9
+
10
+ private
11
+
12
+ def engine_name
13
+ "youtube"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ class Response
5
+ attr_reader :data, :status, :headers
6
+
7
+ def initialize(faraday_response)
8
+ @data = faraday_response.body
9
+ @status = faraday_response.status
10
+ @headers = faraday_response.headers
11
+ end
12
+
13
+ def success?
14
+ status == 200
15
+ end
16
+
17
+ def results
18
+ data.is_a?(Hash) ? data : {}
19
+ end
20
+
21
+ def credits_remaining
22
+ headers["x-remaining-credits"]&.to_i
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SearchApi
4
+ VERSION = "0.1.0"
5
+ end
data/lib/searchapi.rb ADDED
@@ -0,0 +1,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "searchapi/version"
4
+ require_relative "searchapi/configuration"
5
+ require_relative "searchapi/error"
6
+ require_relative "searchapi/response"
7
+ require_relative "searchapi/client"
8
+ require_relative "searchapi/resource"
9
+
10
+ # Google engines
11
+ require_relative "searchapi/resources/google"
12
+ require_relative "searchapi/resources/google_rank_tracking"
13
+ require_relative "searchapi/resources/google_events"
14
+ require_relative "searchapi/resources/google_maps"
15
+ require_relative "searchapi/resources/google_scholar"
16
+ require_relative "searchapi/resources/google_news"
17
+ require_relative "searchapi/resources/google_jobs"
18
+ require_relative "searchapi/resources/google_shopping"
19
+ require_relative "searchapi/resources/google_flights"
20
+ require_relative "searchapi/resources/google_images"
21
+ require_relative "searchapi/resources/google_videos"
22
+ require_relative "searchapi/resources/google_trends"
23
+ require_relative "searchapi/resources/google_autocomplete"
24
+ require_relative "searchapi/resources/google_finance"
25
+ require_relative "searchapi/resources/google_hotels"
26
+ require_relative "searchapi/resources/google_about_this_domain"
27
+ require_relative "searchapi/resources/google_ai_mode"
28
+ require_relative "searchapi/resources/google_ads_transparency_center"
29
+ require_relative "searchapi/resources/google_local"
30
+ require_relative "searchapi/resources/google_shorts"
31
+ require_relative "searchapi/resources/google_lens"
32
+ require_relative "searchapi/resources/google_forums"
33
+ require_relative "searchapi/resources/google_patents"
34
+ require_relative "searchapi/resources/google_ai_overview"
35
+ require_relative "searchapi/resources/google_play_store"
36
+
37
+ # Other search engines
38
+ require_relative "searchapi/resources/amazon_search"
39
+ require_relative "searchapi/resources/bing"
40
+ require_relative "searchapi/resources/bing_images"
41
+ require_relative "searchapi/resources/bing_videos"
42
+ require_relative "searchapi/resources/baidu"
43
+ require_relative "searchapi/resources/yandex"
44
+ require_relative "searchapi/resources/yandex_reverse_image"
45
+ require_relative "searchapi/resources/duckduckgo"
46
+ require_relative "searchapi/resources/yahoo"
47
+ require_relative "searchapi/resources/naver"
48
+ require_relative "searchapi/resources/youtube"
49
+
50
+ # App stores
51
+ require_relative "searchapi/resources/apple_app_store"
52
+
53
+ # E-commerce
54
+ require_relative "searchapi/resources/walmart_search"
55
+ require_relative "searchapi/resources/shein_search"
56
+ require_relative "searchapi/resources/ebay_search"
57
+
58
+ # Travel & hospitality
59
+ require_relative "searchapi/resources/airbnb"
60
+ require_relative "searchapi/resources/tripadvisor"
61
+
62
+ # Social media profiles
63
+ require_relative "searchapi/resources/instagram_profile"
64
+ require_relative "searchapi/resources/tiktok_profile"
65
+ require_relative "searchapi/resources/facebook_business_page"
66
+
67
+ # Ad libraries
68
+ require_relative "searchapi/resources/linkedin_ad_library"
69
+ require_relative "searchapi/resources/reddit_ad_library"
70
+ require_relative "searchapi/resources/meta_ad_library"
71
+ require_relative "searchapi/resources/tiktok_ads_library"
72
+
73
+ module SearchApi
74
+ # Registry mapping accessor names to resource classes.
75
+ RESOURCES = {
76
+ # Google engines
77
+ google: Resources::Google,
78
+ google_rank_tracking: Resources::GoogleRankTracking,
79
+ google_events: Resources::GoogleEvents,
80
+ google_maps: Resources::GoogleMaps,
81
+ google_scholar: Resources::GoogleScholar,
82
+ google_news: Resources::GoogleNews,
83
+ google_jobs: Resources::GoogleJobs,
84
+ google_shopping: Resources::GoogleShopping,
85
+ google_flights: Resources::GoogleFlights,
86
+ google_images: Resources::GoogleImages,
87
+ google_videos: Resources::GoogleVideos,
88
+ google_trends: Resources::GoogleTrends,
89
+ google_autocomplete: Resources::GoogleAutocomplete,
90
+ google_finance: Resources::GoogleFinance,
91
+ google_hotels: Resources::GoogleHotels,
92
+ google_about_this_domain: Resources::GoogleAboutThisDomain,
93
+ google_ai_mode: Resources::GoogleAiMode,
94
+ google_ads_transparency_center: Resources::GoogleAdsTransparencyCenter,
95
+ google_local: Resources::GoogleLocal,
96
+ google_shorts: Resources::GoogleShorts,
97
+ google_lens: Resources::GoogleLens,
98
+ google_forums: Resources::GoogleForums,
99
+ google_patents: Resources::GooglePatents,
100
+ google_ai_overview: Resources::GoogleAiOverview,
101
+ google_play_store: Resources::GooglePlayStore,
102
+
103
+ # Other search engines
104
+ amazon_search: Resources::AmazonSearch,
105
+ bing: Resources::Bing,
106
+ bing_images: Resources::BingImages,
107
+ bing_videos: Resources::BingVideos,
108
+ baidu: Resources::Baidu,
109
+ yandex: Resources::Yandex,
110
+ yandex_reverse_image: Resources::YandexReverseImage,
111
+ duckduckgo: Resources::DuckDuckGo,
112
+ yahoo: Resources::Yahoo,
113
+ naver: Resources::Naver,
114
+ youtube: Resources::YouTube,
115
+
116
+ # App stores
117
+ apple_app_store: Resources::AppleAppStore,
118
+
119
+ # E-commerce
120
+ walmart_search: Resources::WalmartSearch,
121
+ shein_search: Resources::SheinSearch,
122
+ ebay_search: Resources::EbaySearch,
123
+
124
+ # Travel & hospitality
125
+ airbnb: Resources::Airbnb,
126
+ tripadvisor: Resources::TripAdvisor,
127
+
128
+ # Social media profiles
129
+ instagram_profile: Resources::InstagramProfile,
130
+ tiktok_profile: Resources::TiktokProfile,
131
+ facebook_business_page: Resources::FacebookBusinessPage,
132
+
133
+ # Ad libraries
134
+ linkedin_ad_library: Resources::LinkedinAdLibrary,
135
+ reddit_ad_library: Resources::RedditAdLibrary,
136
+ meta_ad_library: Resources::MetaAdLibrary,
137
+ tiktok_ads_library: Resources::TiktokAdsLibrary
138
+ }.freeze
139
+
140
+ class << self
141
+ attr_writer :configuration
142
+
143
+ def configuration
144
+ @configuration ||= Configuration.new
145
+ end
146
+
147
+ def configure
148
+ yield(configuration)
149
+ end
150
+
151
+ def client
152
+ @client ||= Client.new(configuration)
153
+ end
154
+
155
+ def reset!
156
+ @configuration = nil
157
+ @client = nil
158
+ @resources = nil
159
+ end
160
+
161
+ def resources
162
+ @resources ||= {}
163
+ end
164
+
165
+ def method_missing(name, *args, &block)
166
+ if RESOURCES.key?(name)
167
+ resources[name] ||= RESOURCES[name].new(client)
168
+ else
169
+ super
170
+ end
171
+ end
172
+
173
+ def respond_to_missing?(name, include_private = false)
174
+ RESOURCES.key?(name) || super
175
+ end
176
+ end
177
+ end