Skip to content

stewartmcgown/grammarly-api

Repository files navigation

Unofficial Grammarly API Client

npm version

Installation

npm i -S @stewartmcgown/grammarly-api

Or download the repo and npm run build.

Usage

Analyse Text

import { Grammarly } from 'grammarly-api';

const text = `When we have shuffled off this mortal coil,
Must give us pause - their's the respect
That makes calamity of so long life.`;

const free = new Grammarly();

const results = await free.analyse(text);

Allows you to get access to the results that Grammarly on the web would provide you with.

This library uses a Promise-based return system, so you will receive all the corrections in a single array, like so:

{
  alerts: [
    {
      point: 'NoCommaWithInterj',
      transforms: [Array],
      title: 'Missing punctuation after interjection',
      ...
      action: 'alert',
    }
  ],
  result: {
    ...
    action: 'finished'
  }
}

There are two more optional arguments for analyze: timeout and dialect.

  • timeout is the number of milliseconds to wait before timing out. Defaults to 5000.
  • dialect is the dialect of English to use: 'american' or 'british'. Defaults to 'british'.

Correct results

import { correct, Grammarly } from 'gramarly-api';

const text = `...`;

const { corrected } = await new Grammarly().analyse(text).then(correct);

Will extract the correct text from the results.

Free Plagiarism Checker

import { plagiarism } from 'grammarly-api';

const text = `...`;

const { hasPlagiarism } = await plagiarism();

Doesn't return any details, just tells you if there was Plagiarism at all. The tests for this module does a 'best of three' run, allowing the test to pass if at least one of three checks raises plagiarism issues.

Authenticate to Premium (coming soon!)

const premium = new Grammarly({
  username: 'billy',
  password: 'billy is great'
});

premium.analyse('hello worlds');

Premium gives you access to plagiarism checking.

API

The Grammarly API communicates over websockets. You can see these connections being made in the devtools panel of your favourite browser. You can use Node to connect to this websocket server by pretending to be a browser extension.

Submitting Text

Text is submitted using the following format:

{
  action: 'submit_ot',

  /**
   * An array of operational transform messages.
   *
   * Messages are prefixed with '+0:0:' and suffixed with ':0'
   *
   * An Example submission:
   * ```js
   * {
   *  ch: ['+0:0:This is the text to submit:0']
   * }
   * ```
   */
  ch: string[],

  ...
}

Alerts

Once you've created a session on the socket, Grammarly will start sending you corrections. The current behaviour is to wait until we receive an action: finished message before resolving the promise with the results.

Here is an example of an alert warning us about some mistakes in the phrase 'hello their!

{
      point: 'NoCommaWithInterj',
      transforms: [Array],
      title: 'Missing punctuation after interjection',
      details: '<p>An interjection is a word (<i>yes, hey, gosh</i>) or short phrase (<i>oh my, my goodness</i>) that expresses some emotion and is not grammatically related to the sentence that follows. The interjection is followed by an exclamation point for strong emotions (<i>Wow! I won the lottery!</i>) and a comma for a weaker emotion (<i>Wow, that is news to me.</i>).\n',
      explanation: '<p>It appears that you are missing a punctuation mark after the interjection <b>hello</b>. Consider adding a comma.\n',
      examples: '<p><span class="red">Incorrect: <b>Well</b> I am not so sure about that.</span><br/><span class="green">Correct: <b>Well,</b> I am not so sure about that.</span><br/><p><span class="red">Incorrect: <b>No</b> I did not take out the trash.</span><br/><span class="green">Correct: <b>No,</b> I did not take out the trash.</span><br/><p><span class="red">Incorrect: <b>Aw</b> that kitten is cute.</span><br/><span class="green">Correct: <b>Aw,</b> that kitten is cute.</span><br/>',
      todo: 'add the punctuation',
      handbookLink: '',
      sentence_no: 0,
      free: true,
      category: 'BasicPunct',
      begin: 5,
      end: 5,
      text: '',
      group: 'Punctuation',
      pname: 'Punctuation/BasicPunct/NoCommaWithInterj/InterjComma',
      rev: 0,
      highlightBegin: 0,
      highlightEnd: 5,
      highlightText: 'hello',
      replacements: [Array],
      transformJson: [Object],
      impact: 'critical',
      extra_properties: [Object],
      cardLayout: [Object],
      categoryHuman: 'Comma Misuse within Clauses',
      cost: 1,
      action: 'alert',
      id: 3
    }

Premium alerts are actually returned over the freews socket. So you can view them along with their transformations just as with free corrections.

Providing your own authentication

You can use your own tokens to connect to the socket. They must adhere to the Auth interface, like so:

const premium = new Grammarly({
  auth: {
    grauth: 'xxxxxxxxx',
    'csrf-token': 'xxxxxxxxxx'
  }
});

Your own personal AuthTokens can be found by inspecting the Firefox extension and looking at the Cookies tab.

Using a custom http Agent

If you need to support your own proxy, you can define your own agent (doc) for the requests. ex:

import ProxyAgent from 'proxy-agent';

new Grammarly({
  agent: new ProxyAgent(process.env.http_proxy)
});

It's going to use it for all the requests made by the lib (websockets + fetch);

About

📚 Unofficial TypeScript client for the Grammarly API

Resources

License

Stars

Watchers

Forks

Packages

No packages published