| 135 | } |
| 136 | |
| 137 | async function queryInternet (word, language) { |
| 138 | let url = new URL('https://www.google.com/async/callback:5493'); |
| 139 | |
| 140 | url.searchParams.set('fc', 'ErUBCndBTlVfTnFUN29LdXdNSlQ2VlZoWUIwWE1HaElOclFNU29TOFF4ZGxGbV9zbzA3YmQ2NnJyQXlHNVlrb3l3OXgtREpRbXpNZ0M1NWZPeFo4NjQyVlA3S2ZQOHpYa292MFBMaDQweGRNQjR4eTlld1E4bDlCbXFJMBIWU2JzSllkLVpHc3J5OVFPb3Q2aVlDZxoiQU9NWVJ3QmU2cHRlbjZEZmw5U0lXT1lOR3hsM2xBWGFldw'); |
| 141 | url.searchParams.set('fcv', '3'); |
| 142 | url.searchParams.set('async', `term:${encodeURIComponent(word)},corpus:${language},hhdr:true,hwdgt:true,wfp:true,ttl:,tsl:,ptl:`); |
| 143 | |
| 144 | url = url.toString(); |
| 145 | |
| 146 | let response = await fetch(url, { |
| 147 | agent: httpsAgent, |
| 148 | headers: new fetch.Headers({ |
| 149 | "accept": "*/*", |
| 150 | "accept-encoding": "gzip, deflate, br", |
| 151 | "accept-language": "en-US,en;q=0.9", |
| 152 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36" |
| 153 | }) |
| 154 | }); |
| 155 | |
| 156 | if (response.status === 404) { throw new errors.NoDefinitionsFound({ reason: 'Website returned 404.'}); } |
| 157 | |
| 158 | if (response.status === 429) { throw new errors.RateLimitError(); } |
| 159 | |
| 160 | if (response.status !== 200) { throw new errors.NoDefinitionsFound({ reason: 'Threw non 200 status code.'}); } |
| 161 | |
| 162 | let body = await response.text(), |
| 163 | data = JSON.parse(body.substring(4)), |
| 164 | single_results = _.get(data, 'feature-callback.payload.single_results', []), |
| 165 | error = _.chain(single_results) |
| 166 | .find('widget') |
| 167 | .get('widget.error') |
| 168 | .value() |
| 169 | |
| 170 | if (single_results.length === 0) { throw new errors.NoDefinitionsFound({ word, language }); } |
| 171 | |
| 172 | if (error === 'TERM_NOT_FOUND_ERROR') { throw new errors.NoDefinitionsFound({ word, language }); } |
| 173 | |
| 174 | if (error) { throw new errors.UnexpectedError({ error }); } |
| 175 | |
| 176 | return single_results; |
| 177 | } |
| 178 | |
| 179 | async function fetchFromSource (word, language) { |
| 180 | let dictionaryData = await queryInternet(word, language); |