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 |