Git Product home page Git Product logo

aso's Introduction

App Store Optimization (aso)

This Node.js library provides a set of functions to aid App Store Optimization of applications in iTunes and Google Play.

The functions use either google-play-scraper or app-store-scraper to gather data, so bear in mind a lot of requests are performed under the hood and you may hit throttling limits when making too many calls in a short period of time.

Installation

npm install aso

API Reference

The module exports a function to build a client that will query either iTunes ('itunes') or Google Play ('gplay'):

const gplay = require('aso')('gplay');
const itunes = require('aso')('itunes');

// do stuff with google play
gplay.scores('panda').then(console.log);

// do stuff with itunes
itunes.scores('panda').then(console.log);

The behaviour of the algorithms is the same for both stores, except where noted.

Keyword scores

The scores function gathers several statistics about a keyword and builds difficulty and traffic scores that can be used to evaluate the convenience of targeting that keyword.

The only argument is the keyword itself:

const aso = require('aso')('gplay');

aso.scores('panda').then(console.log)

Returns:

{ difficulty:
   { titleMatches: { exact: 10, broad: 0, partial: 0, none: 0, score: 10 },
     competitors: { count: 33, score: 5.95 },
     installs: { avg: 2470000, score: 10 },
     rating: { avg: 4.04, score: 8.08 },
     age: { avgDaysSinceUpdated: 81.4, score: 8.53 },
     score: 8.84 },
  traffic:
   { suggest: { length: 3, index: 3, score: 8.7 },
     ranked: { count: 5, avgRank: 52.2, score: 5.48 },
     installs: { avg: 2470000, score: 10 },
     length: { length: 5, score: 8.5 },
     score: 8.18 } }

Scores are calculated as linear functions and aggregated with somewhat arbitrary weights. All statistics are included in the response to allow custom scoring functions to be used.

Any suggestions on how to tune or improve the score calculations are welcome :)

Difficulty

The difficulty of a keyword measures how hard it is to rank high on searches for that kewyord. This is usually the most important aspect to consider when picking a keyword (after relevance of the keyword for the given app). The lower this score, the better the candidate keyword.

The properties considered for this score are:

  • titleMatches: classifies the titles of the top 10 apps for the keyword according to how well they match the words that make it: exact (contains all the words, in the same order), broad (contains all the words in a different order), partial (contains some of the words), none (does not contain any of the words).
  • competitors: counts how many of the top 100 apps for the keyword actually target that keyword in their title and description.
  • installs: measures the average amount of installs of the top 10 apps. Since iTunes does not expose the amount of installs, the reviews count is used instead.
  • rating: measures the average rating of the top 10 apps.
  • age: measures the average time since the apps in the top 10 have been updated.

Traffic

The traffic score estimates how much traffic that keyword gets. Note this factor is better considered after picking keywords with high relevance and low difficulty. A high score means high traffic and therefore a better keyword candidate.

The properties considered for this score are:

  • suggest: For Google Play the amount of characters needed for the keyword to come up as a suggestion in the search box, and the position in the suggestions list. iTunes already scores their suggest results, so that number is used instead.
  • ranked: the amount of apps in the top 10 of the keyword that appear in their category rankings, and the average ranking of those that do.
  • installs: same metric as in difficulty, but with a lower weight in the overall score.
  • length: length of the keyword (less traffic is assumed for longer keywords).

Keyword suggestions

The suggest function returns a list of suggestions consisting of the most commonly used keywords among a given set of apps. There are several strategies to select that set of apps.

This function takes an options object with the following properties:

  • strategy: the strategy used to get suggestions. Defaults to CATEGORY.
  • num: the amount of suggestions to get in the results. Defaults to 30.
  • appId: store app ID (for iTunes both numerical and bundle IDs are supported). Required for the CATEGORY, SIMILAR and COMPETITION strategies.
  • apps: array of store app IDs. Required for the ARBITRARY strategy.
  • keywords: array of seed keywords. Required for the KEYWORDS and SEARCH strategies.

A common flow of work would be to try all the strategies for a given app, hand pick the most interesting keywords and then run the scores function on them to analize their quality.

Suggestions by category

Looks at apps in the same category as the one given.

const aso = require('aso')('gplay');

aso.suggest({
  strategy: aso.CATEGORY,
  appId: 'com.dxco.pandavszombies',
  num: 5})
.then(console.log);

Returns:

[ 'game', 'world', 'features', 'weapons', 'action' ]

Suggestions by similarity

Looks at apps marked by Google Play as "similar". For iTunes the "customers also bought" apps are used instead (which may not necessarily be similar to the given app).

const aso = require('aso')('gplay');

aso.suggest({
  strategy: aso.SIMILAR,
  appId: 'com.dxco.pandavszombies',
  num: 5})
.then(console.log);

Returns:

[ 'game', 'zombies', 'zombie', 'weapons', 'action' ]

Suggestions by competition

Looks at apps that target the same keywords as the one given.

const aso = require('aso')('gplay');

aso.suggest({
  strategy: aso.COMPETITION,
  appId: 'com.dxco.pandavszombies',
  num: 5})
.then(console.log);

Returns:

[ 'game', 'zombies', 'features', 'app', 'zombie' ]

Suggestions by an arbitrary list of apps

const aso = require('aso')('gplay');

aso.suggest({
  strategy: aso.ARBITRARY,
  apps: ['com.dxco.pandavszombies'],
  num: 5})
.then(console.log);

Returns:

[ 'game', 'zombies', 'features', 'app', 'zombie' ]

Suggestions based on seed keywords

Look at apps that target one of the given seed keywords.

const aso = require('aso')('gplay');

aso.suggest({
  strategy: aso.KEYWORDS,
  keywords: ['panda', 'zombies', 'hordes'],
  num: 5})
.then(console.log);

Returns:

[ 'features', 'game', 'zombies', 'panda', 'zombie' ]

Suggestions based on search hints

Given a set of seed keywords, infer a new set from the search completion suggestions of each one. Then look at apps that target the resulting keywords. This is expected to work better for iTunes, where the search completion yields more results.

const aso = require('aso')('gplay');

aso.suggest({
  strategy: aso.SEARCH,
  keywords: ['panda', 'zombies', 'hordes'],
  num: 5})
.then(console.log);

Returns:

[ 'game', 'features', 'zombie', 'zombies', 'way' ]

App visibility score

The visibility function gives an estimation of the app's discoverability within the store. The scores are built aggregating how well the app ranks for its target keywords, the traffic score for those keywords and how the app ranks in the top global and category rankings.

The only argument to the function is the App ID (package id for Google Play and either numerical or bundle ID for iTunes).

Google Play example:

const aso = require('aso')('gplay');

aso.visibility('com.dxco.pandavszombies').then(console.log);

Returns:

{ keywords:
   { 'panda vs zombies': { traffic: 2.94, rank: 1, score: 29.4 },
     rocky: { traffic: 7.81, rank: 74, score: 57.48 },
     'panda vs zombie': { traffic: 3.49, rank: 8, score: 34.03 },
     'panda warrior': { traffic: 1.47, rank: 5, score: 14.49 },
     'zombie elvis': { traffic: 3.3, rank: 1, score: 33 },
     meatloaf: { traffic: 5.79, rank: 16, score: 54.77 },
     ftw: { traffic: 2.88, rank: 58, score: 22.87 } },
  collections:
   { global: { rank: undefined, score: 0 },
     category: { rank: undefined, score: 0 } },
  score: 246.04 }

iTunes example:

const aso = require('aso')('gplay');

aso.visibility(284882215) // ID for the facebook app
  .then(console.log);

Returns:

{ keywords:
   { facebook: { traffic: 9.55, rank: 1, score: 95.5 },
     friends: { traffic: 7.21, rank: 2, score: 71.74 } },
  collections:
   { global: { rank: 3, score: 991 },
     category: { rank: 2, score: 99.5 } },
  score: 1257.74 }

App keywords

The app function returns an array of keywords extracted from title and description of the app. The only argument is the Google Play ID of the application (the ?id= parameter on the url).

const aso = require('aso')('gplay');

aso.app('com.dxco.pandavszombies').then(console.log)

Returns:

[
  'panda',
  'rocky',
  'zombie',
  'panda vs zombie',
  'elvis',
  'undead',
  'time',
  'game',
  'vs',
  (...)
]

retext-keywords is used to extract the keywords from the app title and description.

A note on keyword relevancy for iTunes

As said, the algorithm used by the app function extracts the keywords from title and description. This algorithm is also used internally by the scores and suggest functions.

While in all cases the most important place to look at for keywords is the title, the app description is usually less relevant in the iTunes app store, since there's a specific keywords list field when submitting the app. Unfortunately the contents of that field are not (that I know of) reachable from any public page or API. So keywords based on description may not have a big weight on iTunes searches.

Google Play, on the other hand, doesn't have a keywords field and so the description is expected to contain most of the app's targeted keywords.

Store backend configuration

An object can be passed as a second argument to the client builder function, with options to override the behavior of google-play-scraper and app-store-scraper. The given options will be included in every method call to the stores. This can be used, for example, to target a differnt country than the default 'us':

const itunesRussia = require('aso')('itunes', { country: 'ru' });

// do stuff with itunes
itunesRussia.scores('panda').then(console.log);

Other options that may be useful are cache and throttle. See the reference of each scraper for all the available options.

Note about Google Play performance

While iTunes provides an API to search apps with all their details, getting data from Google Play usually requires making a request for the search and then additional requests to get the details for each resulting app, then parsing the HTML. This means that most of the functions of this module (specially scores) will be muchs slower for Google Play than for iTunes (taking even minutes). This is expected given that data is scraped from Google Play in real time on every call. This can be partially mitigated using memoization, at the expense of memory usage, but a better approach (outside the scope of this project) to get faster results would be to periodically scan Google Play, save the data to a database and query that for score calculations.

aso's People

Contributors

benfontan avatar dependabot[bot] avatar facundoolano avatar ftcvlad avatar kafaichoi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aso's Issues

easily add new stores

Define a specific interface for the store object. Any object that implements that interface should be able to be used as a store backend for the ASO methods.

This would be convenient to, for example, have stores that go to a database, or that cache results in something like ElasticSearch before attempting to scrape Google Play or iTunes.

unit tests

Unit tests should verify the logic of every method, using mocks or stub store objects, so we control input values and know what to expect.

Store integration should be tested separately.

Process Killed

Hello,

I am using the base "google-play-scraper" library very successfully. However, any function in the aso library results in a "Killed" status. No matter what the input or call is.

Just to add, have tested this on three ubuntu VMs with varied RAM configs of 2 GB, 4 GB and 6 GB, all with the same result.

'nlcst-to-string' dependency is missing after npm installation

First of all, my knowledge about node.js and npm is really basic, but I think that npm handles providing missing dependencies of package which I try to install.

Anyway, I installed google-play-keywords using npm and I started node console. When I tried to define constant 'keywords', following error was thrown:

Error: Cannot find module 'nlcst-to-string'
at Function.Module._resolveFilename (module.js:325:15)
at Function.Module._load (module.js:276:25)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object. (/Users/kskrzynecki/node_modules/google-play-keywords/lib/app.js:5:23)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object. (/Users/kskrzynecki/node_modules/google-play-keywords/index.js:3:22)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)

It was easy to resolve by installing extra dependency, but I just wonder shouldn't be handled by npm in the first place? Maybe google-play-keywords dependencies aren't defined properly?

Big Bug - Memory leak when use aso lib

Hi facundoolano, thank you very much for very useful lib.
I use you lib to aso on google play without any problem. But when i try to get score from over 14 keywords sequentially. It came out with error:

<--- Last few GCs --->

692423 ms: Mark-sweep 1256.1 (1434.6) -> 1244.3 (1434.6) MB, 83.0 / 0.0 ms [al
location failure] [GC in old space requested].
692501 ms: Mark-sweep 1244.3 (1434.6) -> 1244.2 (1434.6) MB, 77.8 / 0.0 ms [al
location failure] [GC in old space requested].
692585 ms: Mark-sweep 1244.2 (1434.6) -> 1253.3 (1403.6) MB, 84.1 / 0.0 ms [la
st resort gc].
692663 ms: Mark-sweep 1253.3 (1403.6) -> 1262.2 (1403.6) MB, 78.3 / 0.0 ms [la
st resort gc].

<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 000000E62C0CFB49
1: slowToString [buffer.js:459] [pc=000002CB180F33F5] (this=0000010137FA80C1
<an Uint8Array with map 000001A00EA067D1>,encoding=000000E62C0DBC31 <String[4]:
utf8>,start=0,end=316600)
2: arguments adaptor frame: 1->3
3: toString [buffer.js:~487] [pc=000002CB17FD6C21] (this=0000010137FA80C1 <a
n Uint8Array with map 000001A00EA067D1>)
4: arguments adaptor frame: 1->0
5: /* ano...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memo
ry`

Then i try to debug this, and find out, when use aso lib, it will take very large memory, and nodejs don't gc this. I try with simple code like this:

var aso = require('aso')('gplay');

// Get memory usage
var heapUsed = process.memoryUsage().heapUsed;
console.log("Program is using " + heapUsed + " bytes of Heap.")

aso.scores("coin").then(function(data)
{
      // Get memory usage
      var heapUsed = process.memoryUsage().heapUsed;
      console.log("Program is using " + heapUsed + " bytes of Heap.")

      aso.scores("fun").then(function(a)
      {
            // Get memory usage
            var heapUsed = process.memoryUsage().heapUsed;
            console.log("Program is using " + heapUsed + " bytes of Heap.")

            aso.scores("game").then(function(b)
            {
                  // Get memory usage
                  var heapUsed = process.memoryUsage().heapUsed;
                  console.log("Program is using " + heapUsed + " bytes of Heap.")

                  aso.scores("coin").then(function(c)
                  {
                        // Get memory usage
                        var heapUsed = process.memoryUsage().heapUsed;
                        console.log("Program is using " + heapUsed + " bytes of Heap.")
                  });
            });
      });
});

Result very bad:

Program is using 80766688 bytes of Heap.
Program is using 213251752 bytes of Heap.
Program is using 390810216 bytes of Heap.
Program is using 756238712 bytes of Heap.
Program is using 796911968 bytes of Heap.

I think many object of aso lib can't destroy when gc working. Hope you will find out what is the issue and fix it. Thank you very much!

npm install

On the README section you putted "npm install aso", I think you meant "npm install ." tried doing the aso and it seems it's not in npm.

image

support keyword phrases

I absolutely love this tool, but it seems there isn't a way to get the difficulty for a keyword phrase. For example:

Code

const itunes = require('aso')('itunes');
itunes.scores('cool panda').then(console.log);

Error

(node:30234) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'split' of undefined
at /Users/lion/code/aso/node_modules/app-store-scraper/lib/list.js:12:69
at Array.map ()
at cleanList (/Users/lion/code/aso/node_modules/app-store-scraper/lib/list.js:8:29)
at
at process._tickCallback (internal/process/next_tick.js:188:7)

TypeError: Cannot read properties of undefined (reading 'map')

I try gplay.scores but is not working
"
TypeError: Cannot read properties of undefined (reading 'map')
at C:\Users\Administrator\Desktop\aso\node_modules\ramda\dist\ramda.js:578:31
at Object.f2 [as map] (C:\Users\Administrator\Desktop\aso\node_modules\ramda\dist\ramda.js:473:22)
at Object.extract (C:\Users\Administrator\Desktop\aso\node_modules\aso\node_modules\google-play-scraper\lib\utils\appList.js:44:12)
at processAndRecur (C:\Users\Administrator\Desktop\aso\node_modules\aso\node_modules\google-play-scraper\lib\search.js:19:24)
at C:\Users\Administrator\Desktop\aso\node_modules\aso\node_modules\google-play-scraper\lib\search.js:74:21
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Node.js v18.17.0
"

Error [ERR_REQUIRE_ESM]:

Am using ASO and google-play-scraper 10.0.0, but I kept getting the error below. I need help fixing it.

Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/choxxy/development/aso-dev/node_modules/google-play-scraper/index.js from /Users/choxxy/development/aso-dev/node_modules/aso/lib/stores/gplay.js not supported.
Instead change the require of index.js in /Users/choxxy/development/aso-dev/node_modules/aso/lib/stores/gplay.js to a dynamic import() which is available in all CommonJS modules.
at Object. (/Users/choxxy/development/aso-dev/node_modules/aso/lib/stores/gplay.js:4:15)
at Object. (/Users/choxxy/development/aso-dev/node_modules/aso/index.js:7:12)
at Object. (/Users/choxxy/development/aso-dev/index.js:1:13) {
code: 'ERR_REQUIRE_ESM'
}

UnhandledPromiseRejectionWarning

Hello,
a while ago I made a script following the README of this repo and it has been working fine for months...now I get a bunch of UnhandledPromiseRejectionWarning and the script does not complete its execution.

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'replace' of undefined

The script only contains instructions as explained in the README file:

aso.visibility(packageName).then(console.log);

I'm on the latest 1.1.1 version, Node v.11..8.0

Any ideas?

[App Store] Search suggestion always returns empty array

Hi, First, thanks for awesome library! I tested search suggestion with your sample code but it always returns an empty array.

const itunes = require("aso")("itunes", { country: "us" });
itunes
  .suggest({
    strategy: itunes.SEARCH,
    keywords: ["panda"],
    num: 10
  })
  .then(console.log);

Score command not working correctly

Score comamnd was working correctly but suddenly it started to fail, but not always :). I have been checking it with simple requests and sometimes it returns the correct data for difficulty and traffic and others doesn't. Competitors fields appears to be 0 when retrieving of data fails. Leading to a lot of NAN values because of zero division.

Is there something we could do?

Cheers.

integration tests

Since the part most likely to break in this library is the integration with the underlying scrapers (either because the version changed and we need to adapt or because the scrapers themselves break), we should have automated tests that make non-mocked scraper requests.

The problem with this is that most aso methods will take an unacceptable amount of time to finish. An approach that work: have stub stores that fallback to the actual scraper the first time each method (e.g. .app(), .list(), .search) is called, cache that single result and reuse it on every subsequent request. This way we could verify the input and output values work as expected with the minimal amount of requests.

Stopped working last week ("Invalid Category 6025")

This started giving me an error last week - I don't know if Apple changed something?

Error: Error: Invalid category 6025
    at validate (/Users/mf/code/coda/weekly-report/node_modules/app-store-scraper/lib/list.js:63:11)
    at /Users/mf/code/coda/weekly-report/node_modules/app-store-scraper/lib/list.js:82:5
    at new Promise (<anonymous>)
    at Object.list (/Users/mf/code/coda/weekly-report/node_modules/app-store-scraper/lib/list.js:80:10)
    at Object.list (/Users/mf/code/coda/weekly-report/node_modules/memoizee/lib/configure-map.js:42:41)
    at /Users/mf/code/coda/weekly-report/node_modules/aso/lib/stores/itunes.js:28:26
    at Array.map (<anonymous>)
    at getRankedApps (/Users/mf/code/coda/weekly-report/node_modules/aso/lib/scores/traffic.js:35:32)
    at /Users/mf/code/coda/weekly-report/node_modules/aso/lib/scores/traffic.js:80:7
    at runMicrotasks (<anonymous>)
error Command failed with exit code 1.

I'll also post this on app-store-scraper in case it's on their end.
Edit: Oh, that's also you. I'll keep it here :)

memoization should be optional

In the most recent update, the stores default to their memoized versions, and customizing this requires duplication most of the store code. Instead, pass the store by parameter and easily allow to replace it with the memoized counterpart (also consider adding a store string shortcut like 'gplay-memoized'

Speed up

Very nice tool, but some features(for example visibility for Google play) takes too much time:(

Have any ideas how to speed up?

If I'll add pool of proxies and will make each request to Google Play use one off them, maybe it wouldn't hit server limits and it will work faster?

iTunes Visibility Doesn't seems to work?

Thanks for the library, I have tried the following:
itunes.visibility(284882215).then(console.log);

But getting:
UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'split' of undefined

Google Plasy Scrape Not Work check competitors

(node:14652) UnhandledPromiseRejectionWarning: Error: App not found (404)
at C:\Users\user\Desktop\aso-master_2\node_modules\google-play-scraper\lib\utils\request.js:42:19
at process._tickCallback (internal/process/next_tick.js:68:7)
(node:14652) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:14652) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Unhandled promise rejection.

This is My code

I didn't make any changes into code. I follow steps as given in README.md File

//npm install aso

const gplay = require('aso')('gplay');
const itunes = require('aso')('itunes');

gplay.scores('panda').then(console.log);

itunes.scores('panda').then(console.log);

It gives me error

UnhandledPromiseRejectionWarning: #<Object>

AND

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'map' of undefined

TypeError: Cannot read property 'split' of undefined

TypeError: Cannot read property 'split' of undefined
I am getting this error while making request for aso.visibility and aso.app

Error stack trace
Node\aso\node_modules\google-play-scraper\lib\app.js:49:64)
image

Is this project still maintained?

Hello,

given the last few posted issues and no response from the creator, I am curious if they project is still being maintained? It would be very sad to see it go. As of now, it seems that something with scraping is broken. I always get a 503 return. I am especially curious since the app-store-scraper library works perfectly fine.

Thanks!

No problem in iTunes but there is a problem for Google Play

My Code:

const gplay = require('aso')('gplay');
const itunes = require('aso')('itunes');

console.log("play store: ");

// do stuff with google play
gplay.scores('panda').then(console.log);

console.log("iTunes: ")
// do stuff with itunes
itunes.scores('panda').then(console.log);

Output:

github

404 App not found

  • Operating System: Windows 10 build 18363
  • Node version: 13.10.1
  • google-play-scraper version: 7.1.2

Description:
I am working with aso module and i am getting 404 App not found error. I am sending a very simple request with just 1 keyword and that is used in example.

Example code:

const router = require("express").Router();
const gplay = require("aso")("gplay");

//keyword score
router.get("/score/:keyword", (req, res, next) => {
  console.log(req.params.keyword);
  const keyword = req.params.keyword;
  gplay
    .scores(`${keyword}`)
    .then(console.log)
    .catch(err => {
      res.send(err);
    });
});

module.exports = router;

Error message:

Error: App not found (404)
    at E:\Workspaces\React_Native\ASO_Tool\backend\node_modules\aso\node_modules\google-play-scraper\lib\utils\request.js:44:19

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.