Exemplo n.º 1
0
def add_monitor():
    """Render the index page."""
    form = MonitorForm(request.form)
    if not form.validate():
        errors = ','.join([value[0] for value in form.errors.values()])
        return jsonify({'errors': errors})

    g = mongo.db[app.config['GLOBAL_COLLECTION']]
    gdata = g.find_one(dict(), {'_id': 0})
    ga = GoogleAlerts(gdata['email'], gdata['password'])
    ga.authenticate()
    options = {'delivery': 'RSS', 'exact': form.type.data == 'Exact'}
    response = ga.create(form.term.data, options)
    if len(response) > 0:
        response = response[0]
    monitors = mongo.db[app.config['MONITORS_COLLECTION']]
    to_hash = form.type.data.encode('utf-8') + form.term.data.encode('utf-8')
    item = {
        'term': form.term.data,
        'exact': form.type.data == 'Exact',
        'tags': form.tags.data.split(','),
        'category': form.category.data.lower(),
        'username': current_user.get_id(),
        'created': now_time(),
        'active': True,
        'metadata': response,
        'hits': 0,
        'hashed': hashlib.sha256(to_hash).hexdigest(),
        'checked': now_time()
    }
    _id = monitors.insert(item)
    return redirect(url_for('core.root'))
Exemplo n.º 2
0
def test_account():
    """Update account settings."""
    logger.debug("User account settings test")
    g = mongo.db[app.config['GLOBAL_COLLECTION']]
    gdata = g.find_one(dict(), {'_id': 0})
    ga = GoogleAlerts(gdata['email'], gdata['password'])
    try:
        ga.authenticate()
    except Exception as e:
        return jsonify({'success': False, 'message': str(e)})
    return jsonify({'success': True})
Exemplo n.º 3
0
def remove_monitor(monitor_id):
    """Remove the monitor from our records and google."""
    g = mongo.db[app.config['GLOBAL_COLLECTION']]
    gdata = g.find_one(dict(), {'_id': 0})
    print(monitor_id)
    ga = GoogleAlerts(gdata['email'], gdata['password'])
    ga.authenticate()
    ga.delete(monitor_id)
Exemplo n.º 4
0
def admin_save_settings():
    """Save settings for the admin accounts."""
    form = AdminForm(request.form)
    if not form.validate():
        errors = ','.join([value[0] for value in form.errors.values()])
        return jsonify({'errors': errors})

    c = mongo.db[app.config['GLOBAL_COLLECTION']]
    c.remove(dict())
    item = {'email': form.email.data, 'password': form.password.data}
    c.insert(item)
    #  This will take the new credentials and load them into the config file
    ga = GoogleAlerts(item['email'], item['password'])
    #  Assumed a change to the credentials means killing the old session
    if os.path.exists(SESSION_FILE):
        os.remove(SESSION_FILE)
    return redirect(url_for('core.settings'))
Exemplo n.º 5
0
def main():
    """Run the core."""
    parser = ArgumentParser()
    subs = parser.add_subparsers(dest='cmd')
    setup_parser = subs.add_parser('setup')
    setup_parser.add_argument('-e',
                              '--email',
                              dest='email',
                              required=True,
                              help='Email of the Google user.',
                              type=str)
    setup_parser.add_argument('-p',
                              '--password',
                              dest='pwd',
                              required=True,
                              help='Password of the Google user.',
                              type=str)
    setup_parser = subs.add_parser('seed')
    setup_parser.add_argument(
        '-d',
        '--driver',
        dest='driver',
        required=True,
        type=str,
        help=
        'Location of the Chrome driver. This can be downloaded by visiting http://chromedriver.chromium.org/downloads',
    )
    setup_parser.add_argument('-t',
                              '--timeout',
                              dest='timeout',
                              required=False,
                              type=int,
                              default=20)
    setup_parser = subs.add_parser('list')
    setup_parser = subs.add_parser('create')
    setup_parser.add_argument('-t',
                              '--term',
                              dest='term',
                              required=True,
                              help='Term to store.',
                              type=str)
    setup_parser.add_argument('--exact',
                              dest='exact',
                              action='store_true',
                              help='Exact matches only for term.')
    setup_parser.add_argument('-d',
                              '--delivery',
                              dest='delivery',
                              required=True,
                              choices=['rss', 'mail'],
                              help='Delivery method of results.')
    setup_parser.add_argument(
        '-f',
        '--frequency',
        dest='frequency',
        default="realtime",
        choices=['realtime', 'daily', 'weekly'],
        help='Frequency to send results. RSS only allows for realtime alerting.'
    )
    setup_parser = subs.add_parser('delete')
    setup_parser.add_argument('--id',
                              dest='term_id',
                              required=True,
                              help='ID of the term to find for deletion.',
                              type=str)
    args = parser.parse_args()

    if args.cmd == 'setup':
        if not os.path.exists(CONFIG_PATH):
            os.makedirs(CONFIG_PATH)
        if not os.path.exists(CONFIG_FILE):
            json.dump(CONFIG_DEFAULTS,
                      open(CONFIG_FILE, 'w'),
                      indent=4,
                      separators=(',', ': '))
        config = CONFIG_DEFAULTS
        config['email'] = args.email
        config['password'] = str(obfuscate(args.pwd, 'store'))
        json.dump(config,
                  open(CONFIG_FILE, 'w'),
                  indent=4,
                  separators=(',', ': '))

    config = json.load(open(CONFIG_FILE))
    if config.get('py2', PY2) != PY2:
        raise Exception(
            "Python versions have changed. Please run `setup` again to reconfigure the client."
        )
    if config['password'] == '':
        raise Exception("Run setup before any other actions!")

    if args.cmd == 'seed':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_experimental_option("excludeSwitches",
                                               ['enable-automation'])
        caps = webdriver.DesiredCapabilities.CHROME.copy()
        caps['acceptInsecureCerts'] = True
        with contextlib.closing(
                webdriver.Chrome(args.driver,
                                 options=chrome_options)) as driver:
            driver.get(
                'https://stackoverflow.com/users/signup?ssrc=head&returnurl=%2fusers%2fstory%2fcurrent%27'
            )
            time.sleep(3)
            driver.find_element_by_xpath(
                '//*[@id="openid-buttons"]/button[1]').click()
            driver.find_element_by_xpath('//input[@type="email"]').send_keys(
                config['email'])
            driver.find_element_by_xpath('//*[@id="identifierNext"]').click()
            time.sleep(3)
            driver.find_element_by_xpath(
                '//input[@type="password"]').send_keys(config['password'])
            driver.find_element_by_xpath('//*[@id="passwordNext"]').click()
            time.sleep(3)
            driver.get('https://www.google.com/alerts')
            print("[*] Filled in password and submitted.")
            print("[!] Waiting for the authentication cookie or %d seconds" %
                  args.timeout)
            for _ in range(0, args.timeout):
                cookies = driver.get_cookies()
                if [x for x in cookies if x['name'] == AUTH_COOKIE_NAME]:
                    break
                time.sleep(1)
            collected = dict()
            for cookie in cookies:
                collected[str(cookie['name'])] = str(cookie['value'])
            with open(SESSION_FILE, 'wb') as f:
                pickle.dump(collected, f, protocol=2)
        print("[$] Session has been seeded, google-alerts is ready for use.")

    if args.cmd == 'list':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        print(json.dumps(ga.list(), indent=4))

    if args.cmd == 'create':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()

        # 'realtime' is default, force it
        alert_frequency = 'as_it_happens'

        if args.frequency == 'daily':
            alert_frequency = 'at_most_once_a_day'
        if args.frequency == 'weekly':
            alert_frequency = 'at_most_once_a_week'

        monitor = ga.create(
            args.term, {
                'delivery': args.delivery.upper(),
                'alert_frequency': alert_frequency.upper(),
                'exact': args.exact
            })
        print(json.dumps(monitor, indent=4))

    if args.cmd == 'delete':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        result = ga.delete(args.term_id)
        if result:
            print("%s was deleted" % args.term_id)
Exemplo n.º 6
0
from google_alerts import GoogleAlerts

# Create an instance
ga = GoogleAlerts('*****@*****.**', '$pVm9RDn_-DNtq$W')
ga.set_log_level('debug')

# Authenticate your user
ga.authenticate()

# List configured monitors
print(len(ga.list()))

ga.create('Google', {'delivery': 'mail'})
Exemplo n.º 7
0
def main():
    """Run the core."""
    parser = ArgumentParser()
    subs = parser.add_subparsers(dest='cmd')
    setup_parser = subs.add_parser('setup')
    setup_parser.add_argument('-e',
                              '--email',
                              dest='email',
                              required=True,
                              help='Email of the Google user.',
                              type=str)
    setup_parser.add_argument('-p',
                              '--password',
                              dest='pwd',
                              required=True,
                              help='Password of the Google user.',
                              type=str)
    setup_parser = subs.add_parser('list')
    setup_parser = subs.add_parser('create')
    setup_parser.add_argument('-t',
                              '--term',
                              dest='term',
                              required=True,
                              help='Term to store.',
                              type=str)
    setup_parser.add_argument('--exact',
                              dest='exact',
                              action='store_true',
                              help='Exact matches only for term.')
    setup_parser.add_argument('-d',
                              '--delivery',
                              dest='delivery',
                              required=True,
                              choices=['rss', 'mail'],
                              help='Delivery method of results.')
    setup_parser.add_argument(
        '-f',
        '--frequency',
        dest='frequency',
        default="realtime",
        choices=['realtime', 'daily', 'weekly'],
        help='Frequency to send results. RSS only allows for realtime alerting'
    )
    setup_parser = subs.add_parser('delete')
    setup_parser.add_argument('--id',
                              dest='term_id',
                              required=True,
                              help='ID of the term to find for deletion.',
                              type=str)
    args = parser.parse_args()

    if args.cmd == 'setup':
        if not os.path.exists(CONFIG_PATH):
            os.makedirs(CONFIG_PATH)
        if not os.path.exists(CONFIG_FILE):
            json.dump(CONFIG_DEFAULTS,
                      open(CONFIG_FILE, 'w'),
                      indent=4,
                      separators=(',', ': '))
        config = CONFIG_DEFAULTS
        config['email'] = args.email
        config['password'] = str(obfuscate(args.pwd, 'store'))
        json.dump(config,
                  open(CONFIG_FILE, 'w'),
                  indent=4,
                  separators=(',', ': '))

    config = json.load(open(CONFIG_FILE))
    if config['password'] == '':
        raise Exception("Run setup before any other actions!")

    if args.cmd == 'list':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        print(json.dumps(ga.list(), indent=4))

    if args.cmd == 'create':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        alert_frequency = 'as_it_happens'
        if args.frequency == 'realtime':
            alert_frequency = 'as_it_happens'
        elif args.frequency == 'daily':
            alert_frequency = 'at_most_once_a_day'
        else:
            alert_frequency = 'at_most_once_a_week'

        monitor = ga.create(
            args.term, {
                'delivery': args.delivery.upper(),
                'alert_frequency': alert_frequency.upper(),
                'exact': args.exact
            })
        print(json.dumps(monitor, indent=4))

    if args.cmd == 'delete':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        result = ga.delete(args.term_id)
        if result:
            print("%s was deleted" % args.term_id)
Exemplo n.º 8
0
def main():
    """Run the core."""
    parser = ArgumentParser()
    subs = parser.add_subparsers(dest='cmd')
    setup_parser = subs.add_parser('setup')
    setup_parser.add_argument('-e',
                              '--email',
                              dest='email',
                              required=True,
                              help='Email of the Google user.',
                              type=str)
    setup_parser.add_argument('-p',
                              '--password',
                              dest='pwd',
                              required=True,
                              help='Password of the Google user.',
                              type=str)
    setup_parser = subs.add_parser('seed')
    setup_parser.add_argument(
        '-d',
        '--driver',
        dest='driver',
        required=True,
        type=str,
        help=
        'Location of the Chrome driver. This can be downloaded by visiting http://chromedriver.chromium.org/downloads',
    )
    setup_parser = subs.add_parser('list')
    setup_parser = subs.add_parser('create')
    setup_parser.add_argument('-t',
                              '--term',
                              dest='term',
                              required=True,
                              help='Term to store.',
                              type=str)
    setup_parser.add_argument('--exact',
                              dest='exact',
                              action='store_true',
                              help='Exact matches only for term.')
    setup_parser.add_argument('-d',
                              '--delivery',
                              dest='delivery',
                              required=True,
                              choices=['rss', 'mail'],
                              help='Delivery method of results.')
    setup_parser.add_argument(
        '-f',
        '--frequency',
        dest='frequency',
        default="realtime",
        choices=['realtime', 'daily', 'weekly'],
        help='Frequency to send results. RSS only allows for realtime alerting.'
    )
    setup_parser = subs.add_parser('delete')
    setup_parser.add_argument('--id',
                              dest='term_id',
                              required=True,
                              help='ID of the term to find for deletion.',
                              type=str)
    args = parser.parse_args()

    if args.cmd == 'setup':
        if not os.path.exists(CONFIG_PATH):
            os.makedirs(CONFIG_PATH)
        if not os.path.exists(CONFIG_FILE):
            json.dump(CONFIG_DEFAULTS,
                      open(CONFIG_FILE, 'w'),
                      indent=4,
                      separators=(',', ': '))
        config = CONFIG_DEFAULTS
        config['email'] = args.email
        config['password'] = str(obfuscate(args.pwd, 'store'))
        json.dump(config,
                  open(CONFIG_FILE, 'w'),
                  indent=4,
                  separators=(',', ': '))

    config = json.load(open(CONFIG_FILE))
    if config.get('py2', PY2) != PY2:
        raise Exception(
            "Python versions have changed. Please run `setup` again to reconfigure the client."
        )
    if config['password'] == '':
        raise Exception("Run setup before any other actions!")

    if args.cmd == 'seed':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        with contextlib.closing(webdriver.Chrome(args.driver)) as driver:
            driver.get(ga.LOGIN_URL)
            wait = ui.WebDriverWait(driver, 10)  # timeout after 10 seconds
            inputElement = driver.find_element_by_name('Email')
            inputElement.send_keys(config['email'])
            inputElement.submit()
            time.sleep(3)
            inputElement = driver.find_element_by_id('Passwd')
            inputElement.send_keys(config['password'])
            inputElement.submit()
            print("[!] Waiting 15 seconds for authentication to complete")
            time.sleep(15)
            cookies = driver.get_cookies()
            collected = dict()
            for cookie in cookies:
                collected[str(cookie['name'])] = str(cookie['value'])
            with open(SESSION_FILE, 'wb') as f:
                pickle.dump(collected, f, protocol=2)
        print("Session has been seeded.")

    if args.cmd == 'list':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        print(json.dumps(ga.list(), indent=4))

    if args.cmd == 'create':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        alert_frequency = 'as_it_happens'
        if args.frequency == 'realtime':
            alert_frequency = 'as_it_happens'
        elif args.frequency == 'daily':
            alert_frequency = 'at_most_once_a_day'
        else:
            alert_frequency = 'at_most_once_a_week'

        monitor = ga.create(
            args.term, {
                'delivery': args.delivery.upper(),
                'alert_frequency': alert_frequency.upper(),
                'exact': args.exact
            })
        print(json.dumps(monitor, indent=4))

    if args.cmd == 'delete':
        config['password'] = obfuscate(str(config['password']), 'fetch')
        ga = GoogleAlerts(config['email'], config['password'])
        ga.authenticate()
        result = ga.delete(args.term_id)
        if result:
            print("%s was deleted" % args.term_id)