import urllib.request, urllib.parse, urllib.error import twurl import json import sqlite3 import ssl TWITTER_URL = 'https://api.twitter.com/1.1/friends/list.json' conn = sqlite3.connect('friends.sqlite') cur = conn.cursor() cur.execute('''CREATE TABLE IF NOT EXISTS People (id INTEGER PRIMARY KEY, name TEXT UNIQUE, retrieved INTEGER)''') cur.execute('''CREATE TABLE IF NOT EXISTS Follows (from_id INTEGER, to_id INTEGER, UNIQUE(from_id, to_id))''') # Ignore SSL certificate errors ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE while True: acct = input('Εισαγάγετε έναν λογαριασμό Twitter ή τερματίστε την εκτέλεση με quit: ') if (acct == 'quit'): break if (len(acct) < 1): cur.execute('SELECT id, name FROM People WHERE retrieved=0 LIMIT 1') try: (id, acct) = cur.fetchone() except: print('Δεν βρέθηκαν λογαριασμοί Twitter που δεν έχουν ήδη ανακτηθεί') continue else: cur.execute('SELECT id FROM People WHERE name = ? LIMIT 1', (acct, )) try: id = cur.fetchone()[0] except: cur.execute('''INSERT OR IGNORE INTO People (name, retrieved) VALUES (?, 0)''', (acct, )) conn.commit() if cur.rowcount != 1: print('Σφάλμα κατά την εισαγωγή του λογαριασμού:', acct) continue id = cur.lastrowid url = twurl.augment(TWITTER_URL, {'screen_name': acct, 'count': '100'}) print('Ανάκτηση του', acct) try: connection = urllib.request.urlopen(url, context=ctx) except Exception as err: print('Η ανάκτηση απέτυχε ', err) break data = connection.read().decode() headers = dict(connection.getheaders()) print('Απομένουν', headers['x-rate-limit-remaining']) try: js = json.loads(data) except: print('Δεν είναι δυνατή η ανάλυση του json') print(data) break # Εκσφαλμάτωση # print(json.dumps(js, indent=4)) if 'users' not in js: print('Λήφθηκε λάθος JSON') print(json.dumps(js, indent=4)) continue cur.execute('UPDATE People SET retrieved=1 WHERE name = ?', (acct, )) countnew = 0 countold = 0 for u in js['users']: friend = u['screen_name'] print(friend) cur.execute('SELECT id FROM People WHERE name = ? LIMIT 1', (friend, )) try: friend_id = cur.fetchone()[0] countold = countold + 1 except: cur.execute('''INSERT OR IGNORE INTO People (name, retrieved) VALUES (?, 0)''', (friend, )) conn.commit() if cur.rowcount != 1: print('Σφάλμα κατά την εισαγωγή λογαριασμού', friend) continue friend_id = cur.lastrowid countnew = countnew + 1 cur.execute('''INSERT OR IGNORE INTO Follows (from_id, to_id) VALUES (?, ?)''', (id, friend_id)) print('Νέοι λογαριασμοί =', countnew, ' Επισκέφθηκαν εκ νέου =', countold) print('Απομένουν', headers['x-rate-limit-remaining']) conn.commit() cur.close()