Skip to content
This repository has been archived by the owner on Nov 15, 2022. It is now read-only.

Commit

Permalink
Adding more support for external publisher articles with a google search
Browse files Browse the repository at this point in the history
  • Loading branch information
manojVivek committed Jan 29, 2019
1 parent 8a060a6 commit 813ed6b
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 24 deletions.
Binary file added dist.zip
Binary file not shown.
3 changes: 2 additions & 1 deletion manifest.json
Expand Up @@ -2,7 +2,7 @@
"name": "Medium Unlimited: Read paid content for free!",
"description": "Unlocks medium.com for unlimited reads, no membership required",
"short_name": "Medium Unlimited",
"version": "1.3.7",
"version": "1.4.0",
"manifest_version": 2,
"background": {
"scripts": ["background.bundle.js"]
Expand Down Expand Up @@ -34,6 +34,7 @@
"webRequest",
"webRequestBlocking",
"https://medium.com/*",
"https://www.google.com/*",
"https://towardsdatascience.com/*",
"https://hackernoon.com/*",
"https://medium.freecodecamp.org/*",
Expand Down
111 changes: 106 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Expand Up @@ -18,8 +18,10 @@
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.4",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
"babel-preset-stage-0": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^1.0.0",
Expand Down
61 changes: 53 additions & 8 deletions src/background.js
Expand Up @@ -26,36 +26,76 @@ function _processUserIdRequest(sendResponse) {

function _processContentRequest(request, sendResponse) {
log('Fetching content for', request.url);
inProgressUrls[request.url] = true;
track('REQUESTED');
_fetch(request.url)
.then(responseData => {
.then(async responseData => {
const doc = document.createElement('html');
doc.innerHTML = responseData.body;
const hadMembershipPrompt = hasMembershipPrompt(doc);
const content = extractArticleContent(doc);
const counter = incrementReadCountAndGet();
const externalUrl = extractExternalUrlInContent(doc);
let externalUrl = extractExternalUrlInContent(doc);
let isGoogleResult = false;
if (hadMembershipPrompt && !externalUrl) {
externalUrl = await getUrlFromGoogleSearch(request.url)
.catch(err => log('Error while searching', err));
isGoogleResult = true;
}
sendResponse({ status: 'SUCCESS', content, counter, hadMembershipPrompt, externalUrl });
let trackStatus = 'SUCCESS';
if (hadMembershipPrompt) {
if (externalUrl) {
if (externalUrl && !isGoogleResult) {
trackStatus = 'PARTIAL-SUCCESS';
} else if (externalUrl && isGoogleResult) {
trackStatus = 'SERP-SUCCESS';
} else {
trackStatus = 'PARTIAL-FAILED';
}
}
track(trackStatus);
delete inProgressUrls[request.url];
})
.catch(error => {
sendResponse({status: 'ERROR', error: JSON.stringify(error)});
track('FAILED');
delete inProgressUrls[request.url];
});
return true;
}

async function getUrlFromGoogleSearch(url) {
const slugs = url.split('/');
const lastSlug = slugs[slugs.length - 1];
const words = lastSlug.split('-');
const requiredSlug = words.splice(0, words.length - 1).join('-');
const response = await _fetch(`https://www.google.com/search?q=${requiredSlug}`);
const doc = document.createElement('html');
doc.innerHTML = response.body;
const searchElement = doc.querySelector('#search');
if (!searchElement) {
return;
}
const links = searchElement.getElementsByTagName('a');
let requiredLink = null;
for (const link of links) {
if (isValidArticleUrl(link.href)) {
requiredLink = link;
break;
}
}
if (!requiredLink) {
return;
}
return requiredLink.href;
}

function isValidArticleUrl(url) {
return (
url &&
url.indexOf('medium.com') === -1 &&
url.indexOf('webcache.googleusercontent.com') === -1 &&
url.indexOf('chrome-extension://') === -1
);
}

function extractArticleContent(doc) {
const content = Array.from(
doc.getElementsByClassName('postArticle-content')
Expand All @@ -79,9 +119,14 @@ function extractExternalUrlInContent(doc) {
}

function _fetch(url) {
return fetch(url, {credentials: 'include'}).then(response => {
inProgressUrls[url] = true;
return fetch(url, { credentials: 'include' }).then(response => {
return response.text().then(body => {
return {status: response.status, body};
delete inProgressUrls[url];
return { status: response.status, body };
});
}).catch(err => {
delete inProgressUrls[url];
throw err;
});
}
14 changes: 5 additions & 9 deletions src/cookie_interceptors.js
Expand Up @@ -2,6 +2,7 @@ import {urlWithoutQueryParams} from './utils';

const urlsList = [
'https://medium.com/*',
'https://www.google.com/*',
'https://towardsdatascience.com/*',
'https://hackernoon.com/*',
'https://medium.freecodecamp.org/*',
Expand All @@ -12,7 +13,9 @@ const urlsList = [
export default function intercept(inProgressUrls) {
function onBeforeSendHeaders(details) {
if (details.requestHeaders && shouldIntercept(details)) {
const newHeaders = removeHeader(details.requestHeaders, 'cookie');
let newHeaders = removeHeader(details.requestHeaders, 'cookie');
newHeaders = removeHeader(newHeaders, 'origin');

return {requestHeaders: newHeaders};
}
return {requestHeaders: details.requestHeaders};
Expand Down Expand Up @@ -43,14 +46,7 @@ export default function intercept(inProgressUrls) {
);

function removeHeader(headers, headerToRemove) {
const newHeaders = [];
headers.forEach(({name, value}) => {
if (name.toLowerCase() === headerToRemove) {
return;
}
return newHeaders.push({name, value});
});
return newHeaders;
return headers.filter(({name}) => name.toLowerCase() != headerToRemove);
}

function shouldIntercept(details) {
Expand Down
2 changes: 1 addition & 1 deletion webpack.config.js
Expand Up @@ -2,7 +2,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
entry: {
background: './src/background.js',
background: ['babel-polyfill', './src/background.js'],
main: './src/medium-unlocker.js',
},
output: {
Expand Down

0 comments on commit 813ed6b

Please sign in to comment.