script/lib/iri_tweet/tweet_twitter_user.py
changeset 98 6e8930a1b8f7
parent 82 210dc265c70f
child 243 9213a63fa34a
equal deleted inserted replaced
97:861cae17abda 98:6e8930a1b8f7
     1 from optparse import OptionParser
     1 from iri_tweet.models import setup_database, Message, UserMessage, User
     2 from utils import *
     2 from iri_tweet.utils import (get_oauth_token, get_user_query, set_logging_options, 
     3 import models
     3     set_logging, parse_date)
     4 from sqlalchemy.orm import sessionmaker, mapper
     4 from optparse import OptionParser #@UnresolvedImport
     5 import logging
     5 from sqlalchemy import BigInteger
       
     6 from sqlalchemy.orm import sessionmaker
       
     7 from sqlalchemy.schema import MetaData, Table, Column
       
     8 from sqlalchemy.sql import and_
       
     9 import datetime
       
    10 import logging #@UnresolvedImport
       
    11 import sys
     6 import time
    12 import time
     7 import twitter
    13 import twitter
     8 import sys
       
     9 
    14 
    10 APPLICATION_NAME = "Tweet recorder user"
    15 APPLICATION_NAME = "Tweet recorder user"
    11 CONSUMER_KEY = "Vdr5ZcsjI1G3esTPI8yDg"
    16 CONSUMER_KEY = "Vdr5ZcsjI1G3esTPI8yDg"
    12 CONSUMER_SECRET = "LMhNrY99R6a7E0YbZZkRFpUZpX5EfB1qATbDk1sIVLs"
    17 CONSUMER_SECRET = "LMhNrY99R6a7E0YbZZkRFpUZpX5EfB1qATbDk1sIVLs"
    13 
    18 
    32                       help="user", metavar="USER")    
    37                       help="user", metavar="USER")    
    33     parser.add_option("-w", "--password", dest="password",
    38     parser.add_option("-w", "--password", dest="password",
    34                       help="password", metavar="PASSWORD")    
    39                       help="password", metavar="PASSWORD")    
    35     parser.add_option("-t", dest="token_filename", metavar="TOKEN_FILENAME", default=".oauth_token",
    40     parser.add_option("-t", dest="token_filename", metavar="TOKEN_FILENAME", default=".oauth_token",
    36                       help="Token file name")
    41                       help="Token file name")
       
    42     parser.add_option("-S", dest="simulate", metavar="SIMULATE", default=False, action="store_true", help="Simulate call to twitter. Do not change the database")
       
    43     parser.add_option("-f", dest="force", metavar="FORCE", default=False, action="store_true", help="force sending message to all user even if it has already been sent")
    37 
    44 
    38 
    45 
    39     set_logging_options(parser)
    46     set_logging_options(parser)
    40     
    47     
    41     return parser.parse_args()
    48     return parser.parse_args()
    45     
    52     
    46     (options, args) = get_options()
    53     (options, args) = get_options()
    47     
    54     
    48     set_logging(options)
    55     set_logging(options)
    49         
    56         
    50     logging.debug("OPTIONS : " + repr(options))
    57     logging.debug("OPTIONS : " + repr(options)) #@UndefinedVariable
    51 
    58 
    52     if not options.message or len(options.message) == 0:
    59     if not options.message or len(options.message) == 0:
    53         sys.exit()
    60         sys.exit()
    54 
    61 
    55     engine, metadata = setup_database('sqlite:///'+options.database, echo=((options.verbose-options.quiet)>0), create_all = False)        
    62     engine, metadata = setup_database('sqlite:///'+options.database, echo=((options.verbose-options.quiet)>0), create_all = True)        
    56     
    63     
    57     Session = sessionmaker()
    64     Session = sessionmaker()
    58     conn = engine.connect()
    65     conn = engine.connect()
    59     try :
    66     try :
    60         session = Session(bind=conn)
    67         session = Session(bind=conn, autoflush=True, autocommit=True)
    61         try:
    68         try:
    62             metadata = MetaData(bind=conn)
    69             metadata = MetaData(bind=conn)
    63             tweet_exclude_table = Table("tweet_exclude", metadata, Column('id', BigInteger, primary_key=True), prefixes=['TEMPORARY'])
    70             tweet_exclude_table = Table("tweet_exclude", metadata, Column('id', BigInteger, primary_key=True), prefixes=['TEMPORARY'])
    64             #mapper(TweetExclude, tweet_exclude_table)
       
    65             metadata.create_all()
    71             metadata.create_all()
    66 
    72 
    67             start_date_str = options.start_date
    73             start_date_str = options.start_date
    68             end_date_str = options.end_date
    74             end_date_str = options.end_date
    69             duration = options.duration
    75             duration = options.duration
    78                 te = time.mktime(end_date.timetuple())
    84                 te = time.mktime(end_date.timetuple())
    79             else:
    85             else:
    80                 te = ts + duration
    86                 te = ts + duration
    81                 end_date = start_date + datetime.timedelta(seconds=duration)
    87                 end_date = start_date + datetime.timedelta(seconds=duration)
    82             
    88             
       
    89             base_message = options.message.decode(sys.getfilesystemencoding())
       
    90             #get or create message
       
    91             message_obj = session.query(Message).filter(Message.text == base_message).first()
       
    92             if not message_obj :
       
    93                 message_obj = Message(text=base_message)
       
    94                 session.add(message_obj) 
       
    95                 session.flush()           
       
    96             
    83             query = get_user_query(session, start_date, end_date, hashtags, tweet_exclude_table)
    97             query = get_user_query(session, start_date, end_date, hashtags, tweet_exclude_table)
    84             #query = query.filter(User.screen_name == "tibo_c")
    98 
       
    99             if not options.force:
       
   100                 query = query.outerjoin(UserMessage, and_(User.id == UserMessage.user_id, UserMessage.message_id == message_obj.id)).filter(UserMessage.message_id == None)
    85                 
   101                 
    86             query_res = query.all()
   102             query_res = query.all()
    87             
   103             
    88             acess_token_key, access_token_secret = get_oauth_token(options.token_filename, application_name=APPLICATION_NAME, consumer_key=CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)
   104             acess_token_key, access_token_secret = get_oauth_token(options.token_filename, application_name=APPLICATION_NAME, consumer_key=CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)
    89             t = twitter.Twitter(auth=twitter.OAuth(acess_token_key, access_token_secret, CONSUMER_KEY, CONSUMER_SECRET))
   105             t = twitter.Twitter(auth=twitter.OAuth(acess_token_key, access_token_secret, CONSUMER_KEY, CONSUMER_SECRET))
    90 
   106 
    91             for user in query_res:
   107             for user in query_res:
    92                 screen_name = user.screen_name
   108                 screen_name = user.screen_name
    93                 
   109                 
    94                 message = u"@%s: %s" % (screen_name, options.message.decode(sys.getfilesystemencoding()))
   110                 message = u"@%s: %s" % (screen_name, base_message)
    95                 logging.debug("new status : " + message)
   111                 logging.debug("new status : " + message) #@UndefinedVariable
    96                 t.statuses.update(status=message)
   112                 if not options.simulate:
    97                 
   113                     t.statuses.update(status=message)
    98 
   114                     user_message = UserMessage(user_id=user.id, message_id=message_obj.id)
       
   115                     session.add(user_message)
       
   116                     session.flush()
    99         finally:
   117         finally:
       
   118             # if message created and simulate, do not  
   100             session.close()
   119             session.close()
   101     finally:
   120     finally:
   102         conn.close()
   121         conn.close()
   103 
   122