Register Guidelines E-Books Search Today's Posts Mark Forums Read

Go Back   MobileRead Forums > E-Book Software > Calibre > Recipes

Notices

Reply
 
Thread Tools Search this Thread
Old 10-24-2023, 09:26 PM   #31
mjfriedman
Connoisseur
mjfriedman began at the beginning.
 
Posts: 64
Karma: 10
Join Date: Dec 2010
Device: Kindle Oasis
But with the lead story entirely missing…
mjfriedman is offline   Reply With Quote
Old 10-24-2023, 09:28 PM   #32
mjfriedman
Connoisseur
mjfriedman began at the beginning.
 
Posts: 64
Karma: 10
Join Date: Dec 2010
Device: Kindle Oasis
Sorry. Some stories come through correctly others return an empty item entitled “Too many requests “
mjfriedman is offline   Reply With Quote
Old 11-20-2023, 05:27 AM   #33
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 43,839
Karma: 22666666
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
And just for posterity, this is how far I got with reversing the JS. I can extract the encrypted key and iv and encrypted data, the problem is in get_decryption_key() for some reason the wsj server isnt returning the decrupted key. The same request in a browser works, so I am guessing htere is some cookie missing or the server does some tls sniffing.

Code:
from html5_parser import parse
import json
from calibre import browser
from mechanize import Request
from urllib.parse import urlparse


def extract_json_data(raw_html):
    from pprint import pprint
    pprint
    root = parse(raw_html)
    d = json.loads(root.xpath('//script[@id="__NEXT_DATA__"]')[0].text)
    page_props = d['props']['pageProps']
    ed = page_props['encryptedDataHash']
    encrypted_data = ed['content']
    iv = ed['iv']
    encrypted_key = page_props['encryptedDocumentKey']
    url = root.xpath('//link[@rel="canonical"]')[0].get('href')
    return {'url': url, 'encrypted_data': encrypted_data, 'iv': iv, 'encrypted_key': encrypted_key}


def get_browser_for_wsj(*a, **kw):
    br = browser()
    br.set_cookie('wsjregion', 'na,us', '.wsj.com')
    br.set_cookie('gdprApplies', 'false', '.wsj.com')
    br.set_cookie('ccpaApplies', 'false', '.wsj.com')
    br.set_cookie('vcdpaApplies', 'false', '.wsj.com')
    br.set_cookie('regulationApplies', 'gdpr%3Afalse%2Ccpra%3Afalse%2Cvcdpa%3Afalse', '.wsj.com')
    br.set_handle_gzip(True)
    br.addheaders += [
        ('Accept', '*/*'),
        ('Accept-Language', 'en-GB,en-US;q=0.9,en;q=0.8'),
    ]
    return br


def get_decryption_key(br, data, referer):
    from pprint import pprint
    pprint
    purl = urlparse(referer)
    rq = Request('https://www.wsj.com/client', headers={
        'Cache-Control': 'max-age=0',
        'Referer': referer,
        'X-Encrypted-Document-Key': data['encrypted_key'],
        'X-Original-Host': 'www.wsj.com',
        'X-Original-Referrer': '',
        'X-Original-Url': purl.path,
    })
    br.set_debug_http(True)
    try:
        res = br.open(rq)
    except Exception as err:
        if hasattr(err, 'read'):
            raise Exception('decryption key request failed with error: {} and body: {}'.format(err, err.read().decode('utf-8', 'replace')))
        raise
    if res.code != 200:
        raise ValueError(f'decryption key request returned non OK HTTP result code: {res.code}')
    r = json.loads(res.read())
    key = r['documentKey']
    if not key:
        pprint(r)
        raise ValueError('No document key returned')


def get_wsj_article(url='https://www.wsj.com/world/middle-east/u-n-world-leaders-push-to-get-gaza-aid-flowing-after-biden-pledge-3b59283b'):
    br = get_browser_for_wsj()
    res = br.open(url)
    raw_html = res.read()
    data = extract_json_data(raw_html)
    get_decryption_key(br, data, res.geturl())



if __name__ == '__main__':
    get_wsj_article()
kovidgoyal is online now   Reply With Quote
Old 11-20-2023, 01:47 PM   #34
unkn0wn
Evangelist
unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.
 
Posts: 442
Karma: 82686
Join Date: May 2021
Device: kindle
in get_decryption_key (line 43) try 'Referer': 'https://www.drudgereport.com/'

Was able to get documentKey successfully

Last edited by unkn0wn; 11-20-2023 at 01:52 PM.
unkn0wn is offline   Reply With Quote
Old 11-21-2023, 12:24 AM   #35
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 43,839
Karma: 22666666
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
Yeah, that works but now the issue is how to decrypt using the key and iv, the obvious candidate, AES-CTR doesnt seem to work

Code:
import base64
import json
from html5_parser import parse
from mechanize import Request
from urllib.parse import urlparse

from calibre import browser


def extract_json_data(raw_html):
    from pprint import pprint
    pprint
    root = parse(raw_html)
    d = json.loads(root.xpath('//script[@id="__NEXT_DATA__"]')[0].text)
    page_props = d['props']['pageProps']
    ed = page_props['encryptedDataHash']
    encrypted_data = base64.standard_b64decode(ed['content'])
    iv = base64.standard_b64decode(ed['iv'])
    encrypted_key = page_props['encryptedDocumentKey']
    url = root.xpath('//link[@rel="canonical"]')[0].get('href')
    return {'url': url, 'encrypted_data': encrypted_data, 'iv': iv, 'encrypted_key': encrypted_key}


def get_browser_for_wsj(*a, **kw):
    br = browser()
    br.set_cookie('wsjregion', 'na,us', '.wsj.com')
    br.set_cookie('gdprApplies', 'false', '.wsj.com')
    br.set_cookie('ccpaApplies', 'false', '.wsj.com')
    br.set_cookie('vcdpaApplies', 'false', '.wsj.com')
    br.set_cookie('regulationApplies', 'gdpr%3Afalse%2Ccpra%3Afalse%2Cvcdpa%3Afalse', '.wsj.com')
    br.set_handle_gzip(True)
    br.addheaders += [
        ('Accept', '*/*'),
        ('Accept-Language', 'en-GB,en-US;q=0.9,en;q=0.8'),
    ]
    return br


def get_decryption_key(br, data, referer='https://www.drudgereport.com/'):
    from pprint import pprint
    pprint
    purl = urlparse(referer)
    rq = Request('https://www.wsj.com/client', headers={
        'Cache-Control': 'max-age=0',
        'Referer': referer,
        'X-Encrypted-Document-Key': data['encrypted_key'],
        'X-Original-Host': 'www.wsj.com',
        'X-Original-Referrer': '',
        'X-Original-Url': purl.path,
    })
    br.set_debug_http(True)
    try:
        res = br.open(rq)
    except Exception as err:
        if hasattr(err, 'read'):
            raise Exception('decryption key request failed with error: {} and body: {}'.format(err, err.read().decode('utf-8', 'replace')))
        raise
    if res.code != 200:
        raise ValueError(f'decryption key request returned non OK HTTP result code: {res.code}')
    r = json.loads(res.read())
    key = r['documentKey']
    if not key:
        pprint(r)
        raise ValueError('No document key returned')
    return base64.standard_b64decode(key)


def decrypt_article(data):
    from Crypto.Cipher import AES
    from Crypto.Util import Counter
    ciphertext = data['encrypted_data']
    # ciphertext += b'\0' * (16 - len(ciphertext) % 16)
    print(11111111, len(ciphertext), len(data['iv']), int.from_bytes(data['iv']))
    counter = Counter.new(nbits=128, initial_value=int.from_bytes(data['iv']))
    cipher = AES.new(data['key'], AES.MODE_CTR, counter=counter)
    return cipher.decrypt(ciphertext)


def get_wsj_article(url='https://www.wsj.com/world/middle-east/u-n-world-leaders-push-to-get-gaza-aid-flowing-after-biden-pledge-3b59283b'):
    br = get_browser_for_wsj()
    res = br.open(url)
    raw_html = res.read()
    data = extract_json_data(raw_html)
    data['key'] = get_decryption_key(br, data)
    return decrypt_article(data)



if __name__ == '__main__':
    data = get_wsj_article()
    print(data)
    print( b'content' in data)
kovidgoyal is online now   Reply With Quote
Old 11-21-2023, 03:32 AM   #36
unkn0wn
Evangelist
unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.
 
Posts: 442
Karma: 82686
Join Date: May 2021
Device: kindle
In get_decryption_key the 'X-Encrypted-Document-Key' : data[' encrypted_key'] should not be base 64 decoded. We will not get the documentKey.

I tried but the decoded output is unreadable, maybe cause it's still 64decoded.

At this point I'm mostly unaware of how decryption works here.

Last edited by unkn0wn; 11-21-2023 at 03:55 AM.
unkn0wn is offline   Reply With Quote
Old 11-21-2023, 05:50 AM   #37
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 43,839
Karma: 22666666
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
yeah it's not base64 decoded, as it has to be sent in a header. As I said, it remains to figure out what decryption algorithm is used, either by stepping through the JS in a debugger or reversing it. From a quick read of the JS it looks like some variant of AES with a 16 byte "iv". I tried a few of the more obvious ones like AES-256-CTR but no luck.
kovidgoyal is online now   Reply With Quote
Old 11-24-2023, 03:56 AM   #38
unkn0wn
Evangelist
unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.unkn0wn can do the Funky Gibbon.
 
Posts: 442
Karma: 82686
Join Date: May 2021
Device: kindle
if anyones interested, try to figure out the decryption method used here
Code:
{
    'url': 'https://www.wsj.com/tech/ai/openai-leadership-hangs-in-balance-as-sam-altmans-counte-rebellion-gains-steam-47276fa8',
    'encrypted_data': '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',
    'iv': 'J0mre5ohZnHgK/RgHOTYhQ==',
    'encrypted_key': 'TY4XXz7TLdVFkd7pXhRZfqaRLYYdtpyCFrKnKe9EXfvaCfMOPo2dP/kC6TBmdCL7/IT7leMxY05OBv9gQkGVZgqCcI7lTLscMfvhhnmCjieb/NH3qbOkwwD+c0QXYosmf2aKYhUafSozz8ngBg6Q385j9pS36+sEfW6X3vFc/X+khJ7tChceWPIcM1JU8zs99bMomN451Vbhz6vUc+1W0bCk6hJ4yX1WGRlWRbM1vd88pEBmterZN+icij1+2g==',
    'key': 'bnQbZ9urHPWcAMC/RmPO/JyAXfKAGC6Jl7oqEjc1O+k='
}
encrypted_key is encryptedDocumentKey as per the code in wsj
key is documentKey
try to decrypt the encrypted_data to readable text/html.
unkn0wn is offline   Reply With Quote
Reply

Tags
calibre, wsj, wsj.com

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Saving articles from news downloads sparks56 Calibre 1 02-17-2017 09:46 PM
How to insert links between articles? oecherprinte Recipes 3 11-27-2013 04:37 AM
ReadItLater recipe only downloads 10 saved articles? usuario74 Recipes 1 02-20-2011 04:24 PM
calibre only downloads some articles from FT St28 Recipes 0 01-21-2011 09:25 AM
Sharing/saving articles in news downloads for Kindle f1nkster Calibre 4 07-28-2010 01:53 PM


All times are GMT -4. The time now is 11:49 AM.


MobileRead.com is a privately owned, operated and funded community.