Twitter: persist the authentication tokens and reuse them on init
This commit is contained in:
parent
2650824dbd
commit
8a7660380b
@ -64,10 +64,29 @@ class Twitter(Module):
|
|||||||
self.consumer = oauth.Consumer(self.consumer_key, self.consumer_secret)
|
self.consumer = oauth.Consumer(self.consumer_key, self.consumer_secret)
|
||||||
self.client = oauth.Client(self.consumer)
|
self.client = oauth.Client(self.consumer)
|
||||||
|
|
||||||
# create a default twitter API account, in case we never auth
|
# settings
|
||||||
self.twit = twitter.Api()
|
|
||||||
|
|
||||||
self.next_timeline_check = 0
|
self.next_timeline_check = 0
|
||||||
|
|
||||||
|
# try getting the stored auth tokens and logging in
|
||||||
|
(oauth_token, oauth_token_secret) = self._retrieve_stored_auth_tokens()
|
||||||
|
if oauth_token is not None and oauth_token_secret is not None:
|
||||||
|
self._log_in_to_twitter(oauth_token, oauth_token_secret)
|
||||||
|
if self._verify_credentials():
|
||||||
|
# self.twit is set
|
||||||
|
|
||||||
|
# ugly, but the best place to track it. store the connection for later use
|
||||||
|
self.connection = irc
|
||||||
|
|
||||||
|
# print timeline stuff. this will set up the appropriate timer
|
||||||
|
self._check_self_timeline()
|
||||||
|
|
||||||
|
print("Logged in to Twitter with saved token.")
|
||||||
|
else:
|
||||||
|
print("Could not log in to Twitter with saved token.")
|
||||||
|
self.twit = twitter.Api()
|
||||||
|
else:
|
||||||
|
# create a default twitter API account, in case we never auth
|
||||||
|
self.twit = twitter.Api()
|
||||||
thread.start_new_thread(self.thread_do, ())
|
thread.start_new_thread(self.thread_do, ())
|
||||||
|
|
||||||
def db_init(self):
|
def db_init(self):
|
||||||
@ -75,19 +94,37 @@ class Twitter(Module):
|
|||||||
|
|
||||||
# init the table if it doesn't exist
|
# init the table if it doesn't exist
|
||||||
version = self.db_module_registered(self.__class__.__name__)
|
version = self.db_module_registered(self.__class__.__name__)
|
||||||
if version == None:
|
if version == None or version < 1:
|
||||||
# create tables
|
# create tables
|
||||||
db = self.get_db()
|
db = self.get_db()
|
||||||
try:
|
try:
|
||||||
|
version = 1
|
||||||
|
|
||||||
db.execute("""
|
db.execute("""
|
||||||
CREATE TABLE twitter_settings (
|
CREATE TABLE twitter_settings (
|
||||||
since_id INTEGER NOT NULL,
|
since_id INTEGER NOT NULL,
|
||||||
output_channel TEXT NOT NULL
|
output_channel TEXT NOT NULL
|
||||||
)""")
|
)""")
|
||||||
db.execute("""INSERT INTO twitter_settings (since_id, output_channel) VALUES (0, '#drbotzo')""")
|
db.execute("""INSERT INTO twitter_settings (since_id, output_channel) VALUES (0, '#drbotzo')""")
|
||||||
db.execute("INSERT INTO drbotzo_modules VALUES (?,?)", (self.__class__.__name__, 1))
|
|
||||||
db.commit()
|
db.commit()
|
||||||
db.close()
|
db.close()
|
||||||
|
self.db_register_module_version(self.__class__.__name__, version)
|
||||||
|
except sqlite3.Error as e:
|
||||||
|
db.rollback()
|
||||||
|
db.close()
|
||||||
|
print("sqlite error: " + str(e))
|
||||||
|
raise
|
||||||
|
if version < 2:
|
||||||
|
db = self.get_db()
|
||||||
|
try:
|
||||||
|
version = 2
|
||||||
|
|
||||||
|
db.execute("""ALTER TABLE twitter_settings ADD COLUMN oauth_token TEXT DEFAULT NULL""")
|
||||||
|
db.execute("""ALTER TABLE twitter_settings ADD COLUMN oauth_token_secret TEXT DEFAULT NULL""")
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
self.db_register_module_version(self.__class__.__name__, version)
|
||||||
except sqlite3.Error as e:
|
except sqlite3.Error as e:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
db.close()
|
db.close()
|
||||||
@ -269,8 +306,9 @@ class Twitter(Module):
|
|||||||
# create the twitter API object
|
# create the twitter API object
|
||||||
self.twit = twitter.Api(self.consumer_key, self.consumer_secret, oauth_token, oauth_token_secret)
|
self.twit = twitter.Api(self.consumer_key, self.consumer_secret, oauth_token, oauth_token_secret)
|
||||||
|
|
||||||
#if self._verify_credentials() is not None:
|
if self._verify_credentials() is not None:
|
||||||
# # save the auth token for later reuse
|
# save the auth token for later reuse
|
||||||
|
self._persist_auth_tokens(oauth_token, oauth_token_secret)
|
||||||
|
|
||||||
def thread_do(self):
|
def thread_do(self):
|
||||||
"""Check the timeline."""
|
"""Check the timeline."""
|
||||||
@ -395,5 +433,37 @@ class Twitter(Module):
|
|||||||
|
|
||||||
return latest
|
return latest
|
||||||
|
|
||||||
|
def _persist_auth_tokens(self, oauth_token, oauth_token_secret):
|
||||||
|
"""Save the auth tokens to the database, with the intent of reusing them."""
|
||||||
|
|
||||||
|
try:
|
||||||
|
db = self.get_db()
|
||||||
|
cur = db.cursor()
|
||||||
|
statement = "UPDATE twitter_settings SET oauth_token = ?, oauth_token_secret = ?"
|
||||||
|
cur.execute(statement, (oauth_token, oauth_token_secret))
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
except sqlite3.Error as e:
|
||||||
|
db.close()
|
||||||
|
print("sqlite error: " + str(e))
|
||||||
|
raise
|
||||||
|
|
||||||
|
def _retrieve_stored_auth_tokens(self):
|
||||||
|
"""Check the database for existing auth tokens, try reusing them."""
|
||||||
|
|
||||||
|
try:
|
||||||
|
db = self.get_db()
|
||||||
|
query = "SELECT oauth_token, oauth_token_secret FROM twitter_settings"
|
||||||
|
cursor = db.execute(query)
|
||||||
|
result = cursor.fetchone()
|
||||||
|
db.close()
|
||||||
|
if result:
|
||||||
|
return (result['oauth_token'], result['oauth_token_secret'])
|
||||||
|
except sqlite3.Error as e:
|
||||||
|
db.close()
|
||||||
|
print("sqlite error: " + str(e))
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
# vi:tabstop=4:expandtab:autoindent
|
# vi:tabstop=4:expandtab:autoindent
|
||||||
# kate: indent-mode python;indent-width 4;replace-tabs on;
|
# kate: indent-mode python;indent-width 4;replace-tabs on;
|
||||||
|
Loading…
Reference in New Issue
Block a user