Example #1
0
def get_row(conn, cacheid):
    """ get a geocache from the database """

    cacheid = cacheid.upper()
    ret = mysqlite.get_row(conn, cacheid)

    if ret is not None and ret[0] != "":
        g_arr = geocache.GeoCache()
        g_arr.cacheid = ret[0]
        g_arr.dltime = ret[1]
        g_arr.cachename = ret[2]
        g_arr.cacheowner = ret[3]
        g_arr.cacheurl = ret[4]
        g_arr.cachesize = ret[5]
        g_arr.cachetype = ret[6]
        g_arr.lat = ret[7]
        g_arr.lon = ret[8]
        g_arr.diff = ret[9]
        g_arr.terr = ret[10]
        g_arr.hidden = ret[11]
        g_arr.lastfound = ret[12]
        g_arr.short = ret[13]
        g_arr.body = htmlcode.cache_images(ret[14], SESSION)
        g_arr.hint = ret[15].replace("<br>", "\n")
        g_arr.found = ret[16]
        row = g_arr

    else:
        row = None

    return row
Example #2
0
def get_markers():
    """ Get all marker locations from the sqlite db """
    conn = mysqlite.check_db()
    cursor = conn.cursor()

    cursor.execute("SELECT * FROM geocaches")

    startcol = -1

    g_arr = "["
    for row in cursor:
        html = HTMLParser()
        g_c = geocache.GeoCache()
        # print(row[startcol + 1])
        g_c.cacheid = row[startcol + 1]
        g_c.dltime = int(time.time()) - int(row[startcol + 2])
        try:
            g_c.cachename = unescape(row[startcol + 3])
        except AttributeError as ae:
            g_c.cachename = row[startcol + 3]
        g_c.cacheowner = row[startcol + 4]
        g_c.cacheurl = row[startcol + 5]
        g_c.cachesize = row[startcol + 6]
        g_c.cachetype = row[startcol + 7]
        g_c.lat = row[startcol + 8]
        g_c.lon = row[startcol + 9]
        g_c.diff = row[startcol + 10]
        g_c.terr = row[startcol + 11]
        g_c.hidden = row[startcol + 12]
        g_c.lastfound = row[startcol + 13]
        g_c.short = "" #row[startcol + 14]
        g_c.body = "" #row[startcol + 15]
        g_c.hint = "" #row[startcol + 16]
        g_c.found = row[startcol + 17]
        g_arr += str(g_c) + ","

    cursor.close()
    close_db(conn)

    if g_arr[-1:] == ",":
        g_arr = g_arr[:-1]
    g_arr += "]"

    return g_arr
Example #3
0
def get_cache_list(lat, lon):
    """ Search for the nearest 50 unfound caches not owned by the app """

    loc = htmlcode.decdeg2dm(lat, lon)
    url = "https://www.geocaching.com/play/search?lat=" + str(lat) + "&lng=" + str(lon) + \
          "&origin=" + loc + "&radius=100km&o=2&sort=Distance&asc=True"

    print(url)
    conn = mysqlite.check_db()

    try:
        html = SESSION.get(url)
        data = html.text
    except Exception as error:
        print("606 - bombed out, are we still logged in?")
        print(error)
        return None

    if "li-user-info" not in data:
        print("bombed out, are we still logged in?")
        return None

    data = data.split('<tbody id="geocaches">', 1)[1].split("</tbody>",
                                                            1)[0].strip()
    rows = data.split('<tr  data-rownumber="')
    for row in rows:
        try:
            row = row.strip()
            if row == "":
                continue

            lat = 0.0
            lon = 0.0
            short = ""
            body = ""
            hint = ""
            dltime = 0
            found = 0

            if row.find("cache-types.svg#icon-found") != -1:
                found = 1

            cacheid = row.split('data-id="', 1)[1].split('"', 1)[0].strip()
            print("Found cacheid: " + cacheid)
            cachename = row.split('data-name="', 1)[1].split('"', 1)[0].strip()
            cachesize = row.split('data-column="ContainerSize">',
                                  1)[1].split('</td>', 1)[0].strip()

            cacheowner = row.split('<span class="owner">',
                                   1)[1].split('</span>', 1)[0].strip()
            cachetype = row.split('<span class="cache-details">',
                                  1)[1].split('|', 1)[0].strip()

            diff = row.split('data-column="Difficulty">',
                             1)[1].split('</td>', 1)[0].strip()
            diff = float(diff)
            terr = row.split('data-column="Terrain">',
                             1)[1].split('</td>', 1)[0].strip()
            terr = float(terr)
            hidden = row.split('data-column="PlaceDate">',
                               1)[1].split('</td>', 1)[0].strip()
            hidden = clean_up(hidden)
            lastfound = row.split('data-column="DateLastVisited">',
                                  1)[1].split('</td>', 1)[0].strip()
            lastfound = clean_up(lastfound)
            cacheurl = "https://www.geocaching.com" + row.split(
                '<a href="', 1)[1]
            cacheurl = cacheurl.split('"', 1)[0].strip()

            cache = get_row(conn, cacheid)
            if cache is None or (cache.lat == 0.0 and cache.lon == 0.0):
                ret = get_cache_page(conn, cacheid, cacheurl)
                if ret is None:
                    print("Failed to update cache details, are we logged in?")
                    return

                lat, lon, short, body, hint, attributes, found = ret
            else:
                print(cacheid + ": Already exists in the db, skipping...")
                lat = cache.lat
                lon = cache.lon
                short = cache.short
                body = cache.body
                hint = cache.hint
                attributes = mysqlite.get_attributes(conn, cacheid)

            g_arr = geocache.GeoCache()
            g_arr.cacheid = cacheid
            g_arr.dltime = int(time.time())
            g_arr.cachename = cachename
            g_arr.cacheowner = cacheowner
            g_arr.cachesize = cachesize
            g_arr.cacheurl = cacheurl
            g_arr.cachetype = cachetype
            g_arr.lat = float(lat)
            g_arr.lon = float(lon)
            g_arr.diff = diff
            g_arr.terr = terr
            g_arr.hidden = hidden
            g_arr.lastfound = lastfound
            g_arr.short = short
            g_arr.body = body
            g_arr.hint = hint
            g_arr.found = found

            mysqlite.add_to_db(conn, g_arr, attributes)
        except Exception as error:
            print("459 - Failed to parse cache info.")
            print(error)

    close_db(conn)
Example #4
0
def dl_cache(cacheid):
    """ Download and parse a cache page """

    cacheid = cacheid.upper()
    conn = mysqlite.check_db()
    cache_url = "https://www.geocaching.com/geocache/" + cacheid
    print(cache_url)

    try:
        html = SESSION.get(cache_url)
        data = html.text
    except Exception as error:
        print("494 - bombed out, are we still logged in?")
        print(error)
        return "bombed out, are we still logged in?"

    # TODO: check if cache is not found, 404 page doesnt show logged in user menu
    if "li-user-info" not in data:
        print("bombed out, are we still logged in?")
        return "bombed out, are we still logged in?"

    if data.find(
            "<strong id=\"ctl00_ContentBody_GeoNav_logText\">Found It!</strong>"
    ) != -1:
        found = 1
    else:
        found = 0

    print("Found cacheid: " + cacheid)
    cachename = data.split('<span id="ctl00_ContentBody_CacheName">', 1)[1]
    cachename = cachename.split('</span>', 1)[0].strip()
    cachesize = data.split('" title="Size: ', 1)[1].split(' ', 1)[0].strip()

    cacheowner = data.split('<div id="ctl00_ContentBody_mcd1">', 1)[1]
    cacheowner = cacheowner.split('">', 1)[1].split('</a>', 1)[0].strip()
    cachetype = data.split(
        '<a href="/about/cache_types.aspx" target="_blank" title="', 1)[1]
    cachetype = cachetype.split('"', 1)[0].strip()

    diff = data.split('<span id="ctl00_ContentBody_uxLegendScale" title="',
                      1)[1]
    diff = diff.split('alt="', 1)[1].split(' ', 1)[0].strip()
    diff = float(diff)
    terr = data.split('<span id="ctl00_ContentBody_Localize12" title="', 1)[1]
    terr = terr.split('alt="', 1)[1].split(' ', 1)[0].strip()
    terr = float(terr)

    hidden = data.split('<div id="ctl00_ContentBody_mcd2">', 1)[1]
    hidden = hidden.split('</div>', 1)[0].split(':', 1)[1].strip()
    hidden = hidden.split('\n', 1)[0].strip()
    hidden = clean_up(hidden)

    bits = data.split("var lat=", 1)[1].split(", guid='")[0].strip()
    lat = bits.split(", lng=", 1)[0].strip()
    lon = bits.split(", lng=", 1)[1].strip()

    short = data.split('<span id="ctl00_ContentBody_ShortDescription">', 1)[1]
    short = short.split("</span>", 1)[0].strip()

    body = data.split('<span id="ctl00_ContentBody_LongDescription">', 1)[1]
    body = body.split('<p id="ctl00_ContentBody_hints">', 1)[0].strip()
    body = '<span id="ctl00_ContentBody_LongDescription">' + body

    hint = data.split('<div id="div_hint" class="span-8 WrapFix">', 1)[1]
    hint = hint.split('</div>', 1)[0].strip()

    attributes = []

    tmpstr = data.split('<div class="WidgetBody">', 1)[1]
    tmpstr = tmpstr.split('<p class="NoBottomSpacing">', 1)[0]
    for line in tmpstr.split('<img src="/images/attributes/'):
        line = line.strip()
        if line == "":
            continue

        line = line.split('.png"', 1)[0]
        if line == "attribute-blank":
            continue

        attributes.append(line)
        print("attribute == " + line)

    tmpstr = "{" + data.split('initialLogs = {', 1)[1]
    tmpstr = tmpstr.split('};', 1)[0] + "}"
    user_token = data.split("userToken = '", 1)[1].split("';", 1)[0].strip()
    save_logs(conn, cacheid, tmpstr, user_token)

    cursor = conn.cursor()
    cursor.execute("SELECT visited FROM logbook WHERE cacheid=? and logtype='Found it' " + \
                    "ORDER BY logid DESC LIMIT 1", (cacheid,))
    ret = cursor.fetchone()
    cursor.close()
    if ret is not None:
        lastfound = ret[0]
    else:
        lastfound = -1

    g_arr = geocache.GeoCache()
    g_arr.cacheid = cacheid
    g_arr.dltime = int(time.time())
    g_arr.cachename = cachename
    g_arr.cacheowner = cacheowner
    g_arr.cachesize = cachesize
    g_arr.cacheurl = cache_url
    g_arr.cachetype = cachetype
    g_arr.lat = float(lat)
    g_arr.lon = float(lon)
    g_arr.diff = diff
    g_arr.terr = terr
    g_arr.hidden = hidden
    g_arr.lastfound = lastfound
    g_arr.short = short
    g_arr.body = body
    g_arr.hint = hint
    g_arr.found = found

    mysqlite.add_to_db(conn, g_arr, attributes)

    close_db(conn)

    return True