2019-02-25 11:35:52 +00:00
#!/usr/bin/env python3
2019-02-26 03:43:13 +00:00
from mastodon import Mastodon
import twitter
2019-02-27 03:38:10 +00:00
import sqlite3 , json , re
2019-02-26 03:43:13 +00:00
cfg = {
" cw " : None ,
2019-02-26 04:38:21 +00:00
" mark_sensitive " : True ,
" site " : " https://botsin.space "
2019-02-26 03:43:13 +00:00
}
try :
j = json . load ( open ( " config.json " ) )
for key , value in j . items ( ) :
cfg [ key ] = value
except :
print ( " No config.json, using default configuration " )
scopes = [ " read:accounts " , " write:statuses " ]
if " client " not in cfg :
print ( " No application info -- registering application with {} " . format ( cfg [ ' site ' ] ) )
client_id , client_secret = Mastodon . create_app ( " Twitter Image Poster " ,
api_base_url = cfg [ ' site ' ] ,
scopes = scopes ,
website = " https://git.lynnesbian.space/lynnesbian/Twitter_Image_Poster " )
cfg [ ' client ' ] = {
" id " : client_id ,
" secret " : client_secret
}
if " secret " not in cfg :
print ( " No user credentials -- logging in to {} " . format ( cfg [ ' site ' ] ) )
client = Mastodon ( client_id = cfg [ ' client ' ] [ ' id ' ] ,
client_secret = cfg [ ' client ' ] [ ' secret ' ] ,
api_base_url = cfg [ ' site ' ] )
print ( " Open this URL and authenticate to give Twitter Image Poster access to your bot ' s account: {} " . format ( client . auth_request_url ( scopes = scopes ) ) )
cfg [ ' secret ' ] = client . log_in ( code = input ( " Secret: " ) , scopes = scopes )
if " twitter " not in cfg :
print ( " No Twitter credentials " )
print ( " Please create a Twitter app by using this page: https://developer.twitter.com/en/apps/create " )
cfg [ ' twitter ' ] = {
" consumer_key " : None ,
" consumer_secret " : None ,
" access_token_key " : None ,
" access_token_secret " : None
}
for i in cfg [ ' twitter ' ] . keys ( ) :
cfg [ ' twitter ' ] [ i ] = input ( " {} : " . format ( i ) )
json . dump ( cfg , open ( " config.json " , " w+ " ) )
2019-02-27 03:38:10 +00:00
# log in to twitter
api = twitter . Api ( * * cfg [ ' twitter ' ] )
if " accounts " not in cfg :
print ( " Please specify the accounts you ' d like Twitter Image Poster to learn from. Enter one account at a time formatted as ' @user ' , followed by a blank line. " )
i = None
accounts = [ ]
while i != " " :
i = input ( " User: " )
2019-05-07 19:27:42 +00:00
if not re . match ( " @( \ w) { 1,16}$ " , i ) :
if i == " " :
print ( " Accounts to learn from: {} " . format ( " , " . join ( accounts ) ) )
break
2019-02-27 03:38:10 +00:00
print ( " Invalid username " )
continue
if i == " " and len ( accounts ) == 0 :
print ( " You must enter at least one account " )
continue
print ( " Checking account... " )
2019-05-07 19:27:42 +00:00
try :
user = api . GetUser ( screen_name = i )
accounts . append ( i )
except :
print ( " Invalid username. " )
2019-02-27 03:38:10 +00:00
# connect to database
db = sqlite3 . connect ( " tip.db " )
db . text_factory = str
c = db . cursor ( )
2019-05-07 19:27:42 +00:00
c . execute ( " CREATE TABLE IF NOT EXISTS `images` (post_id INT NOT NULL UNIQUE PRIMARY KEY, screen_name VARCHAR NOT NULL, image_url VARCHAR) WITHOUT ROWID " )
2019-02-27 03:38:10 +00:00
db . commit ( )
2019-05-07 19:27:42 +00:00
for acct in accounts :
last_tweet = c . execute ( " SELECT post_id FROM `images` WHERE user_id LIKE ? ORDER BY post_id DESC LIMIT 1 " , ( acct , ) ) . fetchone ( )
if last_tweet != None :
last_tweet = last_tweet [ 0 ]
else :
last_tweet = 0 # start from the first one
print ( " Downloading tweets from account {} , starting from {} " . format ( acct , last_tweet ) )
tl = api . GetUserTimeline ( screen_name = acct , since_id = last_tweet , exclude_replies = True )
2019-02-27 03:38:10 +00:00
2019-02-26 03:43:13 +00:00
client = Mastodon (
client_id = cfg [ ' client ' ] [ ' id ' ] ,
client_secret = cfg [ ' client ' ] [ ' secret ' ] ,
access_token = cfg [ ' secret ' ] ,
api_base_url = cfg [ ' site ' ] )
2019-02-27 03:38:10 +00:00