Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ erl_crash.dump
# Ignore package tarball (built via "mix hex.build").
data_for_seo-*.tar

.idea/
27 changes: 27 additions & 0 deletions lib/data_for_seo/api/keywords/google_ads/languages.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
defmodule DataForSeo.API.Keywords.GoogleAds.Languages do
@moduledoc """
Provides API interfaces to Keyword Data API / Google Ads / Languages :
https://docs.dataforseo.com/v3/keywords_data/google_ads/languages/
"""

alias DataForSeo.Client

@doc """
Gets all languages for google ads
## Examples
DataForSeo.API.Keywords.GoogleAds.Languages.get_all_languages()
"""
@spec get_all_languages(Keyword.t()) :: {:ok, map()} | {:error, term()}
def get_all_languages(opts \\ []) do
Client.get("/v3/keywords_data/google_ads/languages")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end
end
27 changes: 27 additions & 0 deletions lib/data_for_seo/api/keywords/google_ads/locations.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
defmodule DataForSeo.API.Keywords.GoogleAds.Locations do
@moduledoc """
Provides API interfaces to Keyword Data API / Google Ads / Locations :
https://docs.dataforseo.com/v3/keywords_data/google_ads/locations/
"""

alias DataForSeo.Client

@doc """
Gets all locations for Google Ads
## Examples
DataForSeo.API.Keywords.GoogleAds.Locations.get_all_locations()
"""
@spec get_all_locations(Keyword.t()) :: {:ok, map()} | {:error, term()}
def get_all_locations(opts \\ []) do
Client.get("/v3/keywords_data/google_ads/locations")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end
end
27 changes: 27 additions & 0 deletions lib/data_for_seo/api/keywords/google_trends/categories.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
defmodule DataForSeo.API.Keywords.GoogleTrends.Categories do
@moduledoc """
Provides API interfaces to Keyword Data API / Google Trends / Categories :
https://docs.dataforseo.com/v3/keywords_data/google_trends/categories/
"""

alias DataForSeo.Client

@doc """
Gets all categories for Google Trends
## Examples
DataForSeo.API.Keywords.GoogleTrends.Categories.get_all_categories()
"""
@spec get_all_categories(Keyword.t()) :: {:ok, map()} | {:error, term()}
def get_all_categories(opts \\ []) do
Client.get("/v3/keywords_data/google_trends/categories")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end
end
27 changes: 27 additions & 0 deletions lib/data_for_seo/api/keywords/google_trends/languages.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
defmodule DataForSeo.API.Keywords.GoogleTrends.Languages do
@moduledoc """
Provides API interfaces to Keyword Data API / Google Trends / Languages :
https://docs.dataforseo.com/v3/keywords_data/google_trends/languages/
"""

alias DataForSeo.Client

@doc """
Gets all languages for google trends
## Examples
DataForSeo.API.Keywords.GoogleTrends.Languages.get_all_languages()
"""
@spec get_all_languages(Keyword.t()) :: {:ok, map()} | {:error, term()}
def get_all_languages(opts \\ []) do
Client.get("/v3/keywords_data/google_trends/languages")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end
end
46 changes: 46 additions & 0 deletions lib/data_for_seo/api/keywords/google_trends/locations.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
defmodule DataForSeo.API.Keywords.GoogleTrends.Locations do
@moduledoc """
Provides API interfaces to Keyword Data API / Google Trends / Locations :
https://docs.dataforseo.com/v3/keywords_data/google_trends/locations/
"""

alias DataForSeo.Client

@doc """
Gets all locations for google trends
## Examples
DataForSeo.API.Keywords.GoogleTrends.Locations.get_all_locations()
"""
@spec get_all_locations(Keyword.t()) :: {:ok, map()} | {:error, term()}
def get_all_locations(opts \\ []) do
Client.get("/v3/keywords_data/google_trends/locations")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end

@doc """
Gets all locations for google trends
## Examples
DataForSeo.API.Keywords.GoogleTrends.Locations.get_all_locations_by_country("ua")
"""
@spec get_all_locations_by_country(String.t(), Keyword.t()) :: {:ok, map()} | {:error, term()}
def get_all_locations_by_country(country_code, opts \\ []) do
Client.get("/v3/keywords_data/google_trends/locations/#{country_code}")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end
end
27 changes: 27 additions & 0 deletions lib/data_for_seo/api/labs/google/categories.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
defmodule DataForSeo.API.Labs.Google.Categories do
@moduledoc """
Provides API interfaces to Labs / Google / Categories API:
https://docs.dataforseo.com/v3/dataforseo_labs/categories_list/
"""

alias DataForSeo.Client

@doc """
Gets all locations by country for specific service: bing, google, youtube etc
## Examples
DataForSeo.API.Labs.Google.Categories.get_all_categories()
"""
@spec get_all_categories(Keyword.t()) :: {:ok, map()} | {:error, term()}
def get_all_categories(opts \\ []) do
Client.get("/v3/dataforseo_labs/categories")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end
end
27 changes: 27 additions & 0 deletions lib/data_for_seo/api/serp/google/location.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
defmodule DataForSeo.API.SERP.Google.Location do
@moduledoc """
Provides SERP Google Location API interfaces.
"""

alias DataForSeo.Client

@doc """
Gets all locations by country for specific service: bing, google, youtube etc
## Examples
DataForSeo.API.SERP.Google.Locations.get_location_by_service_and_country("us")
"""
@spec get_location_by_service_and_country(String.t(), String.t(), Keyword.t()) ::
{:ok, map()} | {:error, term()}
def get_location_by_service_and_country(service, country, opts \\ []) do
Client.get("/v3/serp/#{service}/locations/#{country}")
|> Client.validate_status_code()
|> Client.decode_json_response(opts)
|> case do
{:ok, resp} ->
{:ok, resp}

{:error, error} ->
{:error, error}
end
end
end
10 changes: 10 additions & 0 deletions lib/data_for_seo/api/serp/google/organic.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
defmodule DataForSeo.API.SERP.Google.Organic do
@moduledoc """
Provides SERP Google API interfaces to organic search results
It's a wrapper b/c original lib had no namespaces and implementation is at `DataForSeo.API.Serp`
At the moment it's only import existing module but here is a room to improvements and keeping back compatibilities
at the same time.
"""

import DataForSeo.API.Serp
end
22 changes: 13 additions & 9 deletions lib/data_for_seo/client.ex
Original file line number Diff line number Diff line change
Expand Up @@ -134,19 +134,23 @@ defmodule DataForSeo.Client do

defp execute_request(request, opts) do
timeouts = timeout_options(opts)

Finch.request(request, ApiFinch, timeouts)
config = Config.get_tuples() |> verify_config()
finch_name = opts[:finch_name] || config[:finch_name] || ApiFinch
Finch.request(request, finch_name, timeouts)
end

defp timeout_options(opts) do
config = Config.get_tuples() |> verify_config()

receive_timeout = opts[:receive_timeout] || config[:receive_timeout] |> String.to_integer()
pool_timeout = opts[:pool_timeout] || config[:pool_timeout] |> String.to_integer()

Keyword.new(
pool_timeout: pool_timeout,
receive_timeout: receive_timeout
)
[:receive_timeout, :pool_timeout]
|> Enum.reduce(opts, fn key, acc ->
case opts[key] || config[key] do
nil -> acc
value -> Keyword.put(acc, key, to_integer(value))
end
end)
end

defp to_integer(value) when is_binary(value), do: String.to_integer(value)
defp to_integer(value), do: value
end
48 changes: 48 additions & 0 deletions priv/fixtures/keywords/google_ads/languages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"version": "3.20191128",
"status_code": 20000,
"status_message": "Ok.",
"time": "0.1773 sec.",
"cost": 0,
"tasks_count": 1,
"tasks_error": 0,
"tasks": [
{
"id": "11061103-0696-0119-0000-a74d6a2ce740",
"status_code": 20000,
"status_message": "Ok.",
"time": "0.0000 sec.",
"cost": 0,
"result_count": 43,
"path": [
"v3",
"keywords_data",
"google_ads",
"languages"
],
"data": {
"api": "keywords_data",
"function": "languages",
"se": "google_ads"
},
"result": [
{
"language_name": "Arabic",
"language_code": "ar"
},
{
"language_name": "Bulgarian",
"language_code": "bg"
},
{
"language_name": "Catalan",
"language_code": "ca"
},
{
"language_name": "Croatian",
"language_code": "hr"
}
]
}
]
}
60 changes: 60 additions & 0 deletions priv/fixtures/keywords/google_ads/locations.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"version": "3.20191128",
"status_code": 20000,
"status_message": "Ok.",
"time": "0.4305 sec.",
"cost": 0,
"tasks_count": 1,
"tasks_error": 0,
"tasks": [
{
"id": "11061103-0696-0120-0000-268044305ce6",
"status_code": 20000,
"status_message": "Ok.",
"time": "0.2547 sec.",
"cost": 0,
"result_count": 94933,
"path": [
"v3",
"keywords_data",
"google_ads",
"locations"
],
"data": {
"api": "keywords_data",
"function": "locations",
"se": "google_ads"
},
"result": [
{
"location_code": 2840,
"location_name": "United States",
"location_code_parent": null,
"country_iso_code": "US",
"location_type": "Country"
},
{
"location_code": 21132,
"location_name": "Alaska,United States",
"location_code_parent": 2840,
"country_iso_code": "US",
"location_type": "State"
},
{
"location_code": 21133,
"location_name": "Alabama,United States",
"location_code_parent": 2840,
"country_iso_code": "US",
"location_type": "State"
},
{
"location_code": 21135,
"location_name": "Arkansas,United States",
"location_code_parent": 2840,
"country_iso_code": "US",
"location_type": "State"
}
]
}
]
}
Loading